1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2022-2024 Arm Limited
3 // NI-700 Network-on-Chip PMU driver
5 #include <linux/acpi.h>
6 #include <linux/bitfield.h>
7 #include <linux/interrupt.h>
9 #include <linux/io-64-nonatomic-lo-hi.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
13 #include <linux/perf_event.h>
14 #include <linux/platform_device.h>
15 #include <linux/slab.h>
17 /* Common registers */
18 #define NI_NODE_TYPE 0x000
19 #define NI_NODE_TYPE_NODE_ID GENMASK(31, 16)
20 #define NI_NODE_TYPE_NODE_TYPE GENMASK(15, 0)
22 #define NI_CHILD_NODE_INFO 0x004
23 #define NI_CHILD_PTR(n) (0x008 + (n) * 4)
25 #define NI700_PMUSELA 0x00c
28 #define NI_PERIPHERAL_ID0 0xfe0
29 #define NI_PIDR0_PART_7_0 GENMASK(7, 0)
30 #define NI_PERIPHERAL_ID1 0xfe4
31 #define NI_PIDR1_PART_11_8 GENMASK(3, 0)
32 #define NI_PERIPHERAL_ID2 0xfe8
33 #define NI_PIDR2_VERSION GENMASK(7, 4)
36 #define NI_PMEVCNTR(n) (0x008 + (n) * 8)
37 #define NI_PMCCNTR_L 0x0f8
38 #define NI_PMCCNTR_U 0x0fc
39 #define NI_PMEVTYPER(n) (0x400 + (n) * 4)
40 #define NI_PMEVTYPER_NODE_TYPE GENMASK(12, 9)
41 #define NI_PMEVTYPER_NODE_ID GENMASK(8, 0)
42 #define NI_PMCNTENSET 0xc00
43 #define NI_PMCNTENCLR 0xc20
44 #define NI_PMINTENSET 0xc40
45 #define NI_PMINTENCLR 0xc60
46 #define NI_PMOVSCLR 0xc80
47 #define NI_PMOVSSET 0xcc0
48 #define NI_PMCFGR 0xe00
50 #define NI_PMCR_RESET_CCNT BIT(2)
51 #define NI_PMCR_RESET_EVCNT BIT(1)
52 #define NI_PMCR_ENABLE BIT(0)
54 #define NI_NUM_COUNTERS 8
55 #define NI_CCNT_IDX 31
57 /* Event attributes */
58 #define NI_CONFIG_TYPE GENMASK_ULL(15, 0)
59 #define NI_CONFIG_NODEID GENMASK_ULL(31, 16)
60 #define NI_CONFIG_EVENTID GENMASK_ULL(47, 32)
62 #define NI_EVENT_TYPE(event) FIELD_GET(NI_CONFIG_TYPE, (event)->attr.config)
63 #define NI_EVENT_NODEID(event) FIELD_GET(NI_CONFIG_NODEID, (event)->attr.config)
64 #define NI_EVENT_EVENTID(event) FIELD_GET(NI_CONFIG_EVENTID, (event)->attr.config)
68 PART_NI_710AE
= 0x43d,
86 enum ni_node_type type
;
92 void __iomem
*pmusela
;
93 enum ni_node_type type
;
103 void __iomem
*pmu_base
;
108 struct hlist_node cpuhp_node
;
110 struct arm_ni_unit
*units
;
111 struct perf_event
*evcnt
[NI_NUM_COUNTERS
];
112 struct perf_event
*ccnt
;
121 struct arm_ni_cd cds
[] __counted_by(num_cds
);
124 #define cd_to_ni(cd) container_of((cd), struct arm_ni, cds[(cd)->id])
125 #define pmu_to_cd(p) container_of((p), struct arm_ni_cd, pmu)
127 #define cd_for_each_unit(cd, u) \
128 for (struct arm_ni_unit *u = cd->units; u < cd->units + cd->num_units; u++)
130 static int arm_ni_hp_state
;
132 struct arm_ni_event_attr
{
133 struct device_attribute attr
;
134 enum ni_node_type type
;
137 #define NI_EVENT_ATTR(_name, _type) \
138 (&((struct arm_ni_event_attr[]) {{ \
139 .attr = __ATTR(_name, 0444, arm_ni_event_show, NULL), \
143 static ssize_t
arm_ni_event_show(struct device
*dev
,
144 struct device_attribute
*attr
, char *buf
)
146 struct arm_ni_event_attr
*eattr
= container_of(attr
, typeof(*eattr
), attr
);
148 if (eattr
->type
== NI_PMU
)
149 return sysfs_emit(buf
, "type=0x%x\n", eattr
->type
);
151 return sysfs_emit(buf
, "type=0x%x,eventid=?,nodeid=?\n", eattr
->type
);
154 static umode_t
arm_ni_event_attr_is_visible(struct kobject
*kobj
,
155 struct attribute
*attr
, int unused
)
157 struct device
*dev
= kobj_to_dev(kobj
);
158 struct arm_ni_cd
*cd
= pmu_to_cd(dev_get_drvdata(dev
));
159 struct arm_ni_event_attr
*eattr
;
161 eattr
= container_of(attr
, typeof(*eattr
), attr
.attr
);
163 cd_for_each_unit(cd
, unit
) {
164 if (unit
->type
== eattr
->type
&& unit
->ns
)
171 static struct attribute
*arm_ni_event_attrs
[] = {
172 NI_EVENT_ATTR(asni
, NI_ASNI
),
173 NI_EVENT_ATTR(amni
, NI_AMNI
),
174 NI_EVENT_ATTR(cycles
, NI_PMU
),
175 NI_EVENT_ATTR(hsni
, NI_HSNI
),
176 NI_EVENT_ATTR(hmni
, NI_HMNI
),
177 NI_EVENT_ATTR(pmni
, NI_PMNI
),
181 static const struct attribute_group arm_ni_event_attrs_group
= {
183 .attrs
= arm_ni_event_attrs
,
184 .is_visible
= arm_ni_event_attr_is_visible
,
187 struct arm_ni_format_attr
{
188 struct device_attribute attr
;
192 #define NI_FORMAT_ATTR(_name, _fld) \
193 (&((struct arm_ni_format_attr[]) {{ \
194 .attr = __ATTR(_name, 0444, arm_ni_format_show, NULL), \
198 static ssize_t
arm_ni_format_show(struct device
*dev
,
199 struct device_attribute
*attr
, char *buf
)
201 struct arm_ni_format_attr
*fmt
= container_of(attr
, typeof(*fmt
), attr
);
203 return sysfs_emit(buf
, "config:%*pbl\n", 64, &fmt
->field
);
206 static struct attribute
*arm_ni_format_attrs
[] = {
207 NI_FORMAT_ATTR(type
, NI_CONFIG_TYPE
),
208 NI_FORMAT_ATTR(nodeid
, NI_CONFIG_NODEID
),
209 NI_FORMAT_ATTR(eventid
, NI_CONFIG_EVENTID
),
213 static const struct attribute_group arm_ni_format_attrs_group
= {
215 .attrs
= arm_ni_format_attrs
,
218 static ssize_t
arm_ni_cpumask_show(struct device
*dev
,
219 struct device_attribute
*attr
, char *buf
)
221 struct arm_ni_cd
*cd
= pmu_to_cd(dev_get_drvdata(dev
));
223 return cpumap_print_to_pagebuf(true, buf
, cpumask_of(cd
->cpu
));
226 static struct device_attribute arm_ni_cpumask_attr
=
227 __ATTR(cpumask
, 0444, arm_ni_cpumask_show
, NULL
);
229 static ssize_t
arm_ni_identifier_show(struct device
*dev
,
230 struct device_attribute
*attr
, char *buf
)
232 struct arm_ni
*ni
= cd_to_ni(pmu_to_cd(dev_get_drvdata(dev
)));
233 u32 reg
= readl_relaxed(ni
->base
+ NI_PERIPHERAL_ID2
);
234 int version
= FIELD_GET(NI_PIDR2_VERSION
, reg
);
236 return sysfs_emit(buf
, "%03x%02x\n", ni
->part
, version
);
239 static struct device_attribute arm_ni_identifier_attr
=
240 __ATTR(identifier
, 0444, arm_ni_identifier_show
, NULL
);
242 static struct attribute
*arm_ni_other_attrs
[] = {
243 &arm_ni_cpumask_attr
.attr
,
244 &arm_ni_identifier_attr
.attr
,
248 static const struct attribute_group arm_ni_other_attr_group
= {
249 .attrs
= arm_ni_other_attrs
,
253 static const struct attribute_group
*arm_ni_attr_groups
[] = {
254 &arm_ni_event_attrs_group
,
255 &arm_ni_format_attrs_group
,
256 &arm_ni_other_attr_group
,
260 static void arm_ni_pmu_enable(struct pmu
*pmu
)
262 writel_relaxed(NI_PMCR_ENABLE
, pmu_to_cd(pmu
)->pmu_base
+ NI_PMCR
);
265 static void arm_ni_pmu_disable(struct pmu
*pmu
)
267 writel_relaxed(0, pmu_to_cd(pmu
)->pmu_base
+ NI_PMCR
);
275 static bool arm_ni_val_count_event(struct perf_event
*evt
, struct arm_ni_val
*val
)
277 if (is_software_event(evt
))
280 if (NI_EVENT_TYPE(evt
) == NI_PMU
) {
282 return val
->ccnt
<= 1;
286 return val
->evcnt
<= NI_NUM_COUNTERS
;
289 static int arm_ni_validate_group(struct perf_event
*event
)
291 struct perf_event
*sibling
, *leader
= event
->group_leader
;
292 struct arm_ni_val val
= { 0 };
297 arm_ni_val_count_event(event
, &val
);
298 if (!arm_ni_val_count_event(leader
, &val
))
301 for_each_sibling_event(sibling
, leader
) {
302 if (!arm_ni_val_count_event(sibling
, &val
))
308 static int arm_ni_event_init(struct perf_event
*event
)
310 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
312 if (event
->attr
.type
!= event
->pmu
->type
)
315 if (is_sampling_event(event
))
318 event
->cpu
= cd
->cpu
;
319 if (NI_EVENT_TYPE(event
) == NI_PMU
)
320 return arm_ni_validate_group(event
);
322 cd_for_each_unit(cd
, unit
) {
323 if (unit
->type
== NI_EVENT_TYPE(event
) &&
324 unit
->id
== NI_EVENT_NODEID(event
) && unit
->ns
) {
325 event
->hw
.config_base
= (unsigned long)unit
;
326 return arm_ni_validate_group(event
);
332 static u64
arm_ni_read_ccnt(struct arm_ni_cd
*cd
)
335 int retries
= 3; /* 1st time unlucky, 2nd improbable, 3rd just broken */
337 u_new
= readl_relaxed(cd
->pmu_base
+ NI_PMCCNTR_U
);
340 l
= readl_relaxed(cd
->pmu_base
+ NI_PMCCNTR_L
);
341 u_new
= readl_relaxed(cd
->pmu_base
+ NI_PMCCNTR_U
);
342 } while (u_new
!= u_old
&& --retries
);
345 return (u_new
<< 32) | l
;
348 static void arm_ni_event_read(struct perf_event
*event
)
350 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
351 struct hw_perf_event
*hw
= &event
->hw
;
353 bool ccnt
= hw
->idx
== NI_CCNT_IDX
;
356 prev
= local64_read(&hw
->prev_count
);
358 count
= arm_ni_read_ccnt(cd
);
360 count
= readl_relaxed(cd
->pmu_base
+ NI_PMEVCNTR(hw
->idx
));
361 } while (local64_cmpxchg(&hw
->prev_count
, prev
, count
) != prev
);
366 local64_add(count
, &event
->count
);
369 static void arm_ni_event_start(struct perf_event
*event
, int flags
)
371 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
373 writel_relaxed(1U << event
->hw
.idx
, cd
->pmu_base
+ NI_PMCNTENSET
);
376 static void arm_ni_event_stop(struct perf_event
*event
, int flags
)
378 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
380 writel_relaxed(1U << event
->hw
.idx
, cd
->pmu_base
+ NI_PMCNTENCLR
);
381 if (flags
& PERF_EF_UPDATE
)
382 arm_ni_event_read(event
);
385 static void arm_ni_init_ccnt(struct arm_ni_cd
*cd
)
387 local64_set(&cd
->ccnt
->hw
.prev_count
, S64_MIN
);
388 lo_hi_writeq_relaxed(S64_MIN
, cd
->pmu_base
+ NI_PMCCNTR_L
);
391 static void arm_ni_init_evcnt(struct arm_ni_cd
*cd
, int idx
)
393 local64_set(&cd
->evcnt
[idx
]->hw
.prev_count
, S32_MIN
);
394 writel_relaxed(S32_MIN
, cd
->pmu_base
+ NI_PMEVCNTR(idx
));
397 static int arm_ni_event_add(struct perf_event
*event
, int flags
)
399 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
400 struct hw_perf_event
*hw
= &event
->hw
;
401 struct arm_ni_unit
*unit
;
402 enum ni_node_type type
= NI_EVENT_TYPE(event
);
405 if (type
== NI_PMU
) {
408 hw
->idx
= NI_CCNT_IDX
;
410 arm_ni_init_ccnt(cd
);
413 while (cd
->evcnt
[hw
->idx
]) {
414 if (++hw
->idx
== NI_NUM_COUNTERS
)
417 cd
->evcnt
[hw
->idx
] = event
;
418 unit
= (void *)hw
->config_base
;
419 unit
->event
[hw
->idx
] = NI_EVENT_EVENTID(event
);
420 arm_ni_init_evcnt(cd
, hw
->idx
);
421 lo_hi_writeq_relaxed(le64_to_cpu(unit
->pmusel
), unit
->pmusela
);
423 reg
= FIELD_PREP(NI_PMEVTYPER_NODE_TYPE
, type
) |
424 FIELD_PREP(NI_PMEVTYPER_NODE_ID
, NI_EVENT_NODEID(event
));
425 writel_relaxed(reg
, cd
->pmu_base
+ NI_PMEVTYPER(hw
->idx
));
427 if (flags
& PERF_EF_START
)
428 arm_ni_event_start(event
, 0);
432 static void arm_ni_event_del(struct perf_event
*event
, int flags
)
434 struct arm_ni_cd
*cd
= pmu_to_cd(event
->pmu
);
435 struct hw_perf_event
*hw
= &event
->hw
;
437 arm_ni_event_stop(event
, PERF_EF_UPDATE
);
439 if (hw
->idx
== NI_CCNT_IDX
)
442 cd
->evcnt
[hw
->idx
] = NULL
;
445 static irqreturn_t
arm_ni_handle_irq(int irq
, void *dev_id
)
447 struct arm_ni_cd
*cd
= dev_id
;
448 irqreturn_t ret
= IRQ_NONE
;
449 u32 reg
= readl_relaxed(cd
->pmu_base
+ NI_PMOVSCLR
);
451 if (reg
& (1U << NI_CCNT_IDX
)) {
453 if (!(WARN_ON(!cd
->ccnt
))) {
454 arm_ni_event_read(cd
->ccnt
);
455 arm_ni_init_ccnt(cd
);
458 for (int i
= 0; i
< NI_NUM_COUNTERS
; i
++) {
459 if (!(reg
& (1U << i
)))
462 if (!(WARN_ON(!cd
->evcnt
[i
]))) {
463 arm_ni_event_read(cd
->evcnt
[i
]);
464 arm_ni_init_evcnt(cd
, i
);
467 writel_relaxed(reg
, cd
->pmu_base
+ NI_PMOVSCLR
);
471 static int arm_ni_init_cd(struct arm_ni
*ni
, struct arm_ni_node
*node
, u64 res_start
)
473 struct arm_ni_cd
*cd
= ni
->cds
+ node
->id
;
478 cd
->num_units
= node
->num_components
;
479 cd
->units
= devm_kcalloc(ni
->dev
, cd
->num_units
, sizeof(*(cd
->units
)), GFP_KERNEL
);
483 for (int i
= 0; i
< cd
->num_units
; i
++) {
484 u32 reg
= readl_relaxed(node
->base
+ NI_CHILD_PTR(i
));
485 void __iomem
*unit_base
= ni
->base
+ reg
;
486 struct arm_ni_unit
*unit
= cd
->units
+ i
;
488 reg
= readl_relaxed(unit_base
+ NI_NODE_TYPE
);
489 unit
->type
= FIELD_GET(NI_NODE_TYPE_NODE_TYPE
, reg
);
490 unit
->id
= FIELD_GET(NI_NODE_TYPE_NODE_ID
, reg
);
492 switch (unit
->type
) {
494 reg
= readl_relaxed(unit_base
+ NI_PMCFGR
);
496 dev_info(ni
->dev
, "No access to PMU %d\n", cd
->id
);
497 devm_kfree(ni
->dev
, cd
->units
);
501 cd
->pmu_base
= unit_base
;
508 unit
->pmusela
= unit_base
+ NI700_PMUSELA
;
509 writel_relaxed(1, unit
->pmusela
);
510 if (readl_relaxed(unit
->pmusela
) != 1)
511 dev_info(ni
->dev
, "No access to node 0x%04x%04x\n", unit
->id
, unit
->type
);
517 * e.g. FMU - thankfully bits 3:2 of FMU_ERR_FR0 are RES0 so
518 * can't alias any of the leaf node types we're looking for.
520 dev_dbg(ni
->dev
, "Mystery node 0x%04x%04x\n", unit
->id
, unit
->type
);
525 res_start
+= cd
->pmu_base
- ni
->base
;
526 if (!devm_request_mem_region(ni
->dev
, res_start
, SZ_4K
, dev_name(ni
->dev
))) {
527 dev_err(ni
->dev
, "Failed to request PMU region 0x%llx\n", res_start
);
531 writel_relaxed(NI_PMCR_RESET_CCNT
| NI_PMCR_RESET_EVCNT
,
532 cd
->pmu_base
+ NI_PMCR
);
533 writel_relaxed(U32_MAX
, cd
->pmu_base
+ NI_PMCNTENCLR
);
534 writel_relaxed(U32_MAX
, cd
->pmu_base
+ NI_PMOVSCLR
);
535 writel_relaxed(U32_MAX
, cd
->pmu_base
+ NI_PMINTENSET
);
537 cd
->irq
= platform_get_irq(to_platform_device(ni
->dev
), cd
->id
);
541 err
= devm_request_irq(ni
->dev
, cd
->irq
, arm_ni_handle_irq
,
542 IRQF_NOBALANCING
| IRQF_NO_THREAD
,
543 dev_name(ni
->dev
), cd
);
547 cd
->cpu
= cpumask_local_spread(0, dev_to_node(ni
->dev
));
548 cd
->pmu
= (struct pmu
) {
549 .module
= THIS_MODULE
,
551 .attr_groups
= arm_ni_attr_groups
,
552 .capabilities
= PERF_PMU_CAP_NO_EXCLUDE
,
553 .task_ctx_nr
= perf_invalid_context
,
554 .pmu_enable
= arm_ni_pmu_enable
,
555 .pmu_disable
= arm_ni_pmu_disable
,
556 .event_init
= arm_ni_event_init
,
557 .add
= arm_ni_event_add
,
558 .del
= arm_ni_event_del
,
559 .start
= arm_ni_event_start
,
560 .stop
= arm_ni_event_stop
,
561 .read
= arm_ni_event_read
,
564 name
= devm_kasprintf(ni
->dev
, GFP_KERNEL
, "arm_ni_%d_cd_%d", ni
->id
, cd
->id
);
568 err
= cpuhp_state_add_instance_nocalls(arm_ni_hp_state
, &cd
->cpuhp_node
);
572 err
= perf_pmu_register(&cd
->pmu
, name
, -1);
574 cpuhp_state_remove_instance_nocalls(arm_ni_hp_state
, &cd
->cpuhp_node
);
579 static void arm_ni_probe_domain(void __iomem
*base
, struct arm_ni_node
*node
)
581 u32 reg
= readl_relaxed(base
+ NI_NODE_TYPE
);
584 node
->type
= FIELD_GET(NI_NODE_TYPE_NODE_TYPE
, reg
);
585 node
->id
= FIELD_GET(NI_NODE_TYPE_NODE_ID
, reg
);
586 node
->num_components
= readl_relaxed(base
+ NI_CHILD_NODE_INFO
);
589 static int arm_ni_probe(struct platform_device
*pdev
)
591 struct arm_ni_node cfg
, vd
, pd
, cd
;
593 struct resource
*res
;
600 * We want to map the whole configuration space for ease of discovery,
601 * but the PMU pages are the only ones for which we can honestly claim
602 * exclusive ownership, so we'll request them explicitly once found.
604 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
605 base
= devm_ioremap(&pdev
->dev
, res
->start
, resource_size(res
));
609 arm_ni_probe_domain(base
, &cfg
);
610 if (cfg
.type
!= NI_GLOBAL
)
613 reg
= readl_relaxed(cfg
.base
+ NI_PERIPHERAL_ID0
);
614 part
= FIELD_GET(NI_PIDR0_PART_7_0
, reg
);
615 reg
= readl_relaxed(cfg
.base
+ NI_PERIPHERAL_ID1
);
616 part
|= FIELD_GET(NI_PIDR1_PART_11_8
, reg
) << 8;
623 dev_WARN(&pdev
->dev
, "Unknown part number: 0x%03x, this may go badly\n", part
);
628 for (int v
= 0; v
< cfg
.num_components
; v
++) {
629 reg
= readl_relaxed(cfg
.base
+ NI_CHILD_PTR(v
));
630 arm_ni_probe_domain(base
+ reg
, &vd
);
631 for (int p
= 0; p
< vd
.num_components
; p
++) {
632 reg
= readl_relaxed(vd
.base
+ NI_CHILD_PTR(p
));
633 arm_ni_probe_domain(base
+ reg
, &pd
);
634 num_cds
+= pd
.num_components
;
638 ni
= devm_kzalloc(&pdev
->dev
, struct_size(ni
, cds
, num_cds
), GFP_KERNEL
);
642 ni
->dev
= &pdev
->dev
;
644 ni
->num_cds
= num_cds
;
646 ni
->id
= atomic_fetch_inc(&id
);
648 for (int v
= 0; v
< cfg
.num_components
; v
++) {
649 reg
= readl_relaxed(cfg
.base
+ NI_CHILD_PTR(v
));
650 arm_ni_probe_domain(base
+ reg
, &vd
);
651 for (int p
= 0; p
< vd
.num_components
; p
++) {
652 reg
= readl_relaxed(vd
.base
+ NI_CHILD_PTR(p
));
653 arm_ni_probe_domain(base
+ reg
, &pd
);
654 for (int c
= 0; c
< pd
.num_components
; c
++) {
657 reg
= readl_relaxed(pd
.base
+ NI_CHILD_PTR(c
));
658 arm_ni_probe_domain(base
+ reg
, &cd
);
659 ret
= arm_ni_init_cd(ni
, &cd
, res
->start
);
669 static void arm_ni_remove(struct platform_device
*pdev
)
671 struct arm_ni
*ni
= platform_get_drvdata(pdev
);
673 for (int i
= 0; i
< ni
->num_cds
; i
++) {
674 struct arm_ni_cd
*cd
= ni
->cds
+ i
;
679 writel_relaxed(0, cd
->pmu_base
+ NI_PMCR
);
680 writel_relaxed(U32_MAX
, cd
->pmu_base
+ NI_PMINTENCLR
);
681 perf_pmu_unregister(&cd
->pmu
);
682 cpuhp_state_remove_instance_nocalls(arm_ni_hp_state
, &cd
->cpuhp_node
);
687 static const struct of_device_id arm_ni_of_match
[] = {
688 { .compatible
= "arm,ni-700" },
691 MODULE_DEVICE_TABLE(of
, arm_ni_of_match
);
695 static const struct acpi_device_id arm_ni_acpi_match
[] = {
699 MODULE_DEVICE_TABLE(acpi
, arm_ni_acpi_match
);
702 static struct platform_driver arm_ni_driver
= {
705 .of_match_table
= of_match_ptr(arm_ni_of_match
),
706 .acpi_match_table
= ACPI_PTR(arm_ni_acpi_match
),
708 .probe
= arm_ni_probe
,
709 .remove
= arm_ni_remove
,
712 static void arm_ni_pmu_migrate(struct arm_ni_cd
*cd
, unsigned int cpu
)
714 perf_pmu_migrate_context(&cd
->pmu
, cd
->cpu
, cpu
);
715 irq_set_affinity(cd
->irq
, cpumask_of(cpu
));
719 static int arm_ni_pmu_online_cpu(unsigned int cpu
, struct hlist_node
*cpuhp_node
)
721 struct arm_ni_cd
*cd
;
724 cd
= hlist_entry_safe(cpuhp_node
, struct arm_ni_cd
, cpuhp_node
);
725 node
= dev_to_node(cd_to_ni(cd
)->dev
);
726 if (cpu_to_node(cd
->cpu
) != node
&& cpu_to_node(cpu
) == node
)
727 arm_ni_pmu_migrate(cd
, cpu
);
731 static int arm_ni_pmu_offline_cpu(unsigned int cpu
, struct hlist_node
*cpuhp_node
)
733 struct arm_ni_cd
*cd
;
737 cd
= hlist_entry_safe(cpuhp_node
, struct arm_ni_cd
, cpuhp_node
);
741 node
= dev_to_node(cd_to_ni(cd
)->dev
);
742 target
= cpumask_any_and_but(cpumask_of_node(node
), cpu_online_mask
, cpu
);
743 if (target
>= nr_cpu_ids
)
744 target
= cpumask_any_but(cpu_online_mask
, cpu
);
746 if (target
< nr_cpu_ids
)
747 arm_ni_pmu_migrate(cd
, target
);
751 static int __init
arm_ni_init(void)
755 ret
= cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN
,
756 "perf/arm/ni:online",
757 arm_ni_pmu_online_cpu
,
758 arm_ni_pmu_offline_cpu
);
762 arm_ni_hp_state
= ret
;
764 ret
= platform_driver_register(&arm_ni_driver
);
766 cpuhp_remove_multi_state(arm_ni_hp_state
);
770 static void __exit
arm_ni_exit(void)
772 platform_driver_unregister(&arm_ni_driver
);
773 cpuhp_remove_multi_state(arm_ni_hp_state
);
776 module_init(arm_ni_init
);
777 module_exit(arm_ni_exit
);
779 MODULE_AUTHOR("Robin Murphy <robin.murphy@arm.com>");
780 MODULE_DESCRIPTION("Arm NI-700 PMU driver");
781 MODULE_LICENSE("GPL v2");