+++ /dev/null
-From 286f8d8d5b6adefccbaa091d1f8558ffc7b0b202 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 17 Aug 2023 11:24:03 +0530
-Subject: arm_pmu: acpi: Add a representative platform device for TRBE
-
-From: Anshuman Khandual <anshuman.khandual@arm.com>
-
-[ Upstream commit 1aa3d0274a4aac338ee45a3dfc3b17c944bcc2bc ]
-
-ACPI TRBE does not have a HID for identification which could create and add
-a platform device into the platform bus. Also without a platform device, it
-cannot be probed and bound to a platform driver.
-
-This creates a dummy platform device for TRBE after ascertaining that ACPI
-provides required interrupts uniformly across all cpus on the system. This
-device gets created inside drivers/perf/arm_pmu_acpi.c to accommodate TRBE
-being built as a module.
-
-Cc: Catalin Marinas <catalin.marinas@arm.com>
-Cc: Will Deacon <will@kernel.org>
-Cc: Mark Rutland <mark.rutland@arm.com>
-Cc: linux-arm-kernel@lists.infradead.org
-Cc: linux-kernel@vger.kernel.org
-Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
-Link: https://lore.kernel.org/r/20230817055405.249630-3-anshuman.khandual@arm.com
-Signed-off-by: Will Deacon <will@kernel.org>
-Stable-dep-of: 4785aa802853 ("cpuidle, ACPI: Evaluate LPI arch_flags for broadcast timer")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/arm64/include/asm/acpi.h | 3 +++
- drivers/perf/arm_pmu_acpi.c | 35 +++++++++++++++++++++++++++++++++++
- include/linux/perf/arm_pmu.h | 1 +
- 3 files changed, 39 insertions(+)
-
-diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
-index bd68e1b7f29f3..4d537d56eb847 100644
---- a/arch/arm64/include/asm/acpi.h
-+++ b/arch/arm64/include/asm/acpi.h
-@@ -42,6 +42,9 @@
- #define ACPI_MADT_GICC_SPE (offsetof(struct acpi_madt_generic_interrupt, \
- spe_interrupt) + sizeof(u16))
-
-+#define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
-+ trbe_interrupt) + sizeof(u16))
-+
- /* Basic configuration for ACPI */
- #ifdef CONFIG_ACPI
- pgprot_t __acpi_get_mem_attribute(phys_addr_t addr);
-diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
-index 90815ad762ebc..8baeeb369118e 100644
---- a/drivers/perf/arm_pmu_acpi.c
-+++ b/drivers/perf/arm_pmu_acpi.c
-@@ -139,6 +139,40 @@ static inline void arm_spe_acpi_register_device(void)
- }
- #endif /* CONFIG_ARM_SPE_PMU */
-
-+#if IS_ENABLED(CONFIG_CORESIGHT_TRBE)
-+static struct resource trbe_resources[] = {
-+ {
-+ /* irq */
-+ .flags = IORESOURCE_IRQ,
-+ }
-+};
-+
-+static struct platform_device trbe_dev = {
-+ .name = ARMV8_TRBE_PDEV_NAME,
-+ .id = -1,
-+ .resource = trbe_resources,
-+ .num_resources = ARRAY_SIZE(trbe_resources)
-+};
-+
-+static u16 arm_trbe_parse_gsi(struct acpi_madt_generic_interrupt *gicc)
-+{
-+ return gicc->trbe_interrupt;
-+}
-+
-+static void arm_trbe_acpi_register_device(void)
-+{
-+ int ret = arm_acpi_register_pmu_device(&trbe_dev, ACPI_MADT_GICC_TRBE,
-+ arm_trbe_parse_gsi);
-+ if (ret)
-+ pr_warn("ACPI: TRBE: Unable to register device\n");
-+}
-+#else
-+static inline void arm_trbe_acpi_register_device(void)
-+{
-+
-+}
-+#endif /* CONFIG_CORESIGHT_TRBE */
-+
- static int arm_pmu_acpi_parse_irqs(void)
- {
- int irq, cpu, irq_cpu, err;
-@@ -374,6 +408,7 @@ static int arm_pmu_acpi_init(void)
- return 0;
-
- arm_spe_acpi_register_device();
-+ arm_trbe_acpi_register_device();
-
- return 0;
- }
-diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
-index a0801f68762bf..143fbc10ecfe0 100644
---- a/include/linux/perf/arm_pmu.h
-+++ b/include/linux/perf/arm_pmu.h
-@@ -187,5 +187,6 @@ void armpmu_free_irq(int irq, int cpu);
- #endif /* CONFIG_ARM_PMU */
-
- #define ARMV8_SPE_PDEV_NAME "arm,spe-v1"
-+#define ARMV8_TRBE_PDEV_NAME "arm,trbe"
-
- #endif /* __ARM_PMU_H__ */
---
-2.40.1
-
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- arch/arm64/include/asm/acpi.h | 19 +++++++++++++++++++
- drivers/acpi/processor_idle.c | 3 +--
- include/linux/acpi.h | 9 +++++++++
- 3 files changed, 29 insertions(+), 2 deletions(-)
+ arch/arm64/include/asm/acpi.h | 20 ++++++++++++++++++++
+ drivers/acpi/processor_idle.c | 3 +--
+ include/linux/acpi.h | 9 +++++++++
+ 3 files changed, 30 insertions(+), 2 deletions(-)
-diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
-index 4d537d56eb847..6792a1f83f2ad 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -9,6 +9,7 @@
#include <linux/efi.h>
#include <linux/memblock.h>
#include <linux/psci.h>
-@@ -44,6 +45,24 @@
+@@ -42,6 +43,25 @@
+ #define ACPI_MADT_GICC_SPE (offsetof(struct acpi_madt_generic_interrupt, \
+ spe_interrupt) + sizeof(u16))
- #define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
- trbe_interrupt) + sizeof(u16))
+/*
+ * ArmĀ® Functional Fixed Hardware Specification Version 1.2.
+ * Table 2: Arm Architecture context loss flags
+#define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */
+#define CPUIDLE_GICR_CTXT BIT(2) /* GICR */
+#define CPUIDLE_GICD_CTXT BIT(3) /* GICD */
-
++
/* Basic configuration for ACPI */
#ifdef CONFIG_ACPI
-diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
-index dc615ef6550a1..3a34a8c425fe4 100644
+ pgprot_t __acpi_get_mem_attribute(phys_addr_t addr);
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
-@@ -1217,8 +1217,7 @@ static int acpi_processor_setup_lpi_states(struct acpi_processor *pr)
+@@ -1217,8 +1217,7 @@ static int acpi_processor_setup_lpi_stat
strscpy(state->desc, lpi->desc, CPUIDLE_DESC_LEN);
state->exit_latency = lpi->wake_latency;
state->target_residency = lpi->min_residency;
if (i != 0 && lpi->entry_method == ACPI_CSTATE_FFH)
state->flags |= CPUIDLE_FLAG_RCU_IDLE;
state->enter = acpi_idle_lpi_enter;
-diff --git a/include/linux/acpi.h b/include/linux/acpi.h
-index 641dc48439873..42c22a6ff48d0 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
-@@ -1476,6 +1476,15 @@ static inline int lpit_read_residency_count_address(u64 *address)
+@@ -1476,6 +1476,15 @@ static inline int lpit_read_residency_co
}
#endif
#ifdef CONFIG_ACPI_PPTT
int acpi_pptt_cpu_is_thread(unsigned int cpu);
int find_acpi_cpu_topology(unsigned int cpu, int level);
---
-2.40.1
-