cmem_lat_pmu
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
dev_dbg(cmem_lat_pmu->pmu.dev,
dev_dbg(cmem_lat_pmu->pmu.dev, "Can't support per-task counters\n");
if (!cpumask_test_cpu(event->cpu, &cmem_lat_pmu->associated_cpus)) {
dev_dbg(cmem_lat_pmu->pmu.dev,
event->cpu = cpumask_first(&cmem_lat_pmu->active_cpu);
static u64 cmem_lat_pmu_read_status(struct cmem_lat_pmu *cmem_lat_pmu,
return readq(cmem_lat_pmu->base[inst] + CMEM_LAT_STATUS);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
struct device *dev = cmem_lat_pmu->dev;
status = cmem_lat_pmu_read_status(cmem_lat_pmu, instance);
return readq(cmem_lat_pmu->base[instance] + CMEM_LAT_CYCLE_CNTR);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
struct device *dev = cmem_lat_pmu->dev;
status = cmem_lat_pmu_read_status(cmem_lat_pmu, i);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC0_REQ_CNTR);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC1_REQ_CNTR);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC2_REQ_CNTR);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
struct device *dev = cmem_lat_pmu->dev;
status = cmem_lat_pmu_read_status(cmem_lat_pmu, i);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC0_AOR_CNTR);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC1_AOR_CNTR);
val += readq(cmem_lat_pmu->base[i] + CMEM_LAT_MC2_AOR_CNTR);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
struct cmem_lat_pmu_hw_events *hw_events = &cmem_lat_pmu->hw_events;
&cmem_lat_pmu->associated_cpus)))
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(event->pmu);
struct cmem_lat_pmu_hw_events *hw_events = &cmem_lat_pmu->hw_events;
static inline void cmem_lat_pmu_cg_ctrl(struct cmem_lat_pmu *cmem_lat_pmu,
writeq(val, cmem_lat_pmu->base_broadcast + CMEM_LAT_CG_CTRL);
static inline void cmem_lat_pmu_ctrl(struct cmem_lat_pmu *cmem_lat_pmu, u64 val)
writeq(val, cmem_lat_pmu->base_broadcast + CMEM_LAT_CTRL);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(pmu);
disabled = bitmap_empty(cmem_lat_pmu->hw_events.used_ctrs,
cmem_lat_pmu_cg_ctrl(cmem_lat_pmu, CMEM_LAT_CG_CTRL_ENABLE);
cmem_lat_pmu_ctrl(cmem_lat_pmu, CMEM_LAT_CTRL_ENABLE);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(pmu);
cmem_lat_pmu_ctrl(cmem_lat_pmu, CMEM_LAT_CTRL_DISABLE);
for_each_set_bit(idx, cmem_lat_pmu->hw_events.used_ctrs,
struct perf_event *event = cmem_lat_pmu->hw_events.events[idx];
cmem_lat_pmu_ctrl(cmem_lat_pmu, CMEM_LAT_CTRL_CLR);
cmem_lat_pmu_cg_ctrl(cmem_lat_pmu, CMEM_LAT_CG_CTRL_DISABLE);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(dev_get_drvdata(dev));
return sysfs_emit(page, "%s\n", cmem_lat_pmu->identifier);
struct cmem_lat_pmu *cmem_lat_pmu = to_cmem_lat_pmu(pmu);
cpumask = &cmem_lat_pmu->active_cpu;
cpumask = &cmem_lat_pmu->associated_cpus;
struct cmem_lat_pmu *cmem_lat_pmu =
hlist_entry_safe(node, struct cmem_lat_pmu, node);
if (!cpumask_test_cpu(cpu, &cmem_lat_pmu->associated_cpus))
if (!cpumask_empty(&cmem_lat_pmu->active_cpu))
cpumask_set_cpu(cpu, &cmem_lat_pmu->active_cpu);
struct cmem_lat_pmu *cmem_lat_pmu =
hlist_entry_safe(node, struct cmem_lat_pmu, node);
if (!cpumask_test_and_clear_cpu(cpu, &cmem_lat_pmu->active_cpu))
dst = cpumask_any_and_but(&cmem_lat_pmu->associated_cpus,
perf_pmu_migrate_context(&cmem_lat_pmu->pmu, cpu, dst);
cpumask_set_cpu(dst, &cmem_lat_pmu->active_cpu);
static int cmem_lat_pmu_get_cpus(struct cmem_lat_pmu *cmem_lat_pmu,
cpumask_set_cpu(cpu, &cmem_lat_pmu->associated_cpus);
if (cpumask_empty(&cmem_lat_pmu->associated_cpus)) {
dev_dbg(cmem_lat_pmu->dev,
struct cmem_lat_pmu *cmem_lat_pmu;
cmem_lat_pmu = devm_kzalloc(dev, sizeof(*cmem_lat_pmu), GFP_KERNEL);
if (!cmem_lat_pmu || !name)
cmem_lat_pmu->dev = dev;
cmem_lat_pmu->name = name;
cmem_lat_pmu->identifier = acpi_device_hid(acpi_dev);
platform_set_drvdata(pdev, cmem_lat_pmu);
cmem_lat_pmu->pmu = (struct pmu) {
cmem_lat_pmu->base[i] = devm_platform_ioremap_resource(pdev, i);
if (IS_ERR(cmem_lat_pmu->base[i])) {
return PTR_ERR(cmem_lat_pmu->base[i]);
cmem_lat_pmu->base_broadcast = devm_platform_ioremap_resource(pdev,
if (IS_ERR(cmem_lat_pmu->base_broadcast)) {
return PTR_ERR(cmem_lat_pmu->base_broadcast);
ret = cmem_lat_pmu_get_cpus(cmem_lat_pmu, socket);
&cmem_lat_pmu->node);
cmem_lat_pmu_cg_ctrl(cmem_lat_pmu, CMEM_LAT_CG_CTRL_ENABLE);
cmem_lat_pmu_ctrl(cmem_lat_pmu, CMEM_LAT_CTRL_CLR);
cmem_lat_pmu_cg_ctrl(cmem_lat_pmu, CMEM_LAT_CG_CTRL_DISABLE);
ret = perf_pmu_register(&cmem_lat_pmu->pmu, name, -1);
&cmem_lat_pmu->node);
struct cmem_lat_pmu *cmem_lat_pmu = platform_get_drvdata(pdev);
perf_pmu_unregister(&cmem_lat_pmu->pmu);
&cmem_lat_pmu->node);
container_of(p, struct cmem_lat_pmu, pmu)