mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
arm_pmu: acpi: Add a representative platform device for TRBE
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>
This commit is contained in:
parent
81e5ee4716
commit
1aa3d0274a
@ -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);
|
||||
|
@ -163,6 +163,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;
|
||||
@ -398,6 +432,7 @@ static int arm_pmu_acpi_init(void)
|
||||
return 0;
|
||||
|
||||
arm_spe_acpi_register_device();
|
||||
arm_trbe_acpi_register_device();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user