perf:arm64: fix lockdep warning when handling CPU_STARTING.

When hanlding CPU_STARTING event, cpu_pmu_notify() calls
platform_get_irq()->of_irq_get()->irq_find_matching_host()
->mutex_lock(). To avoid sleeping when handling CPU_STARTING
event, cache percpu_irq number in struct arm_pmu.

Bug: 32646661
Change-Id: I2c40013ab5cc7549e8ec1ab38eea493845a45c09
(cherry picked from commit 9b216b0e5a41419472a7fa8d39c0877ffe265c9a)
diff --git a/arch/arm64/include/asm/pmu.h b/arch/arm64/include/asm/pmu.h
index 497b52e..53d992a 100644
--- a/arch/arm64/include/asm/pmu.h
+++ b/arch/arm64/include/asm/pmu.h
@@ -44,6 +44,7 @@
 struct arm_pmu {
 	struct pmu		pmu;
 	bool			percpu_irq_requested;
+	int			percpu_irq;
 	cpumask_t		active_irqs;
 	const char		*name;
 	irqreturn_t		(*handle_irq)(int irq_num, void *dev);
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 9a54f6a..a07d1f4 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1045,6 +1045,7 @@
 
 		on_each_cpu(armpmu_enable_percpu_irq, &irq, 1);
 		cpu_pmu->percpu_irq_requested = true;
+		cpu_pmu->percpu_irq = irq;
 	} else {
 		for (i = 0; i < irqs; ++i) {
 			err = 0;
@@ -1342,7 +1343,7 @@
 	switch (action & ~CPU_TASKS_FROZEN) {
 	case CPU_DOWN_PREPARE:
 		if (pmu->percpu_irq_requested) {
-			int irq = platform_get_irq(pmu->plat_device, 0);
+			int irq = pmu->percpu_irq;
 			smp_call_function_single(cpu,
 				armpmu_disable_percpu_irq, &irq, 1);
 		}
@@ -1353,7 +1354,7 @@
 		if (pmu->reset)
 			pmu->reset(pmu);
 		if (pmu->percpu_irq_requested) {
-			int irq = platform_get_irq(pmu->plat_device, 0);
+			int irq = pmu->percpu_irq;
 			smp_call_function_single(cpu,
 				armpmu_enable_percpu_irq, &irq, 1);
 		}