arm64, irqchip/gic-v3, ACPI: Move MADT GICC enabled check into a helper
authorJames Morse <james.morse@arm.com>
Mon, 23 Oct 2023 13:35:03 +0000 (14:35 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 24 Oct 2023 14:12:09 +0000 (15:12 +0100)
ACPI, irqchip and the architecture code all inspect the MADT
enabled bit for a GICC entry in the MADT.

The addition of an 'online capable' bit means all these sites need
updating.

Move the current checks behind a helper to make future updates easier.

Signed-off-by: James Morse <james.morse@arm.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Signed-off-by: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
Acked-by: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Link: https://lore.kernel.org/r/E1quv5D-00AeNJ-U8@rmk-PC.armlinux.org.uk
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/smp.c
drivers/acpi/processor_core.c
drivers/irqchip/irq-gic-v3.c
include/linux/acpi.h

index 960b98b43506dd2246aac628e2a92ab455f44043..8c8f55721786e63bd065769f2d482821807a86e8 100644 (file)
@@ -520,7 +520,7 @@ acpi_map_gic_cpu_interface(struct acpi_madt_generic_interrupt *processor)
 {
        u64 hwid = processor->arm_mpidr;
 
-       if (!(processor->flags & ACPI_MADT_ENABLED)) {
+       if (!acpi_gicc_is_usable(processor)) {
                pr_debug("skipping disabled CPU entry with 0x%llx MPIDR\n", hwid);
                return;
        }
index 7dd6dbaa98c34a171909452f8de1edfbcb0c70fc..b203cfe2855023eb1a664874d55fabcd932a1a06 100644 (file)
@@ -90,7 +90,7 @@ static int map_gicc_mpidr(struct acpi_subtable_header *entry,
        struct acpi_madt_generic_interrupt *gicc =
            container_of(entry, struct acpi_madt_generic_interrupt, header);
 
-       if (!(gicc->flags & ACPI_MADT_ENABLED))
+       if (!acpi_gicc_is_usable(gicc))
                return -ENODEV;
 
        /* device_declaration means Device object in DSDT, in the
index eedfa8e9f0772c6f55e44520a4be443b689ca7f1..72d3cdebdad1ddc447c06d0d402d32fc5020638e 100644 (file)
@@ -2367,8 +2367,7 @@ gic_acpi_parse_madt_gicc(union acpi_subtable_headers *header,
        u32 size = reg == GIC_PIDR2_ARCH_GICv4 ? SZ_64K * 4 : SZ_64K * 2;
        void __iomem *redist_base;
 
-       /* GICC entry which has !ACPI_MADT_ENABLED is not unusable so skip */
-       if (!(gicc->flags & ACPI_MADT_ENABLED))
+       if (!acpi_gicc_is_usable(gicc))
                return 0;
 
        redist_base = ioremap(gicc->gicr_base_address, size);
@@ -2418,7 +2417,7 @@ static int __init gic_acpi_match_gicc(union acpi_subtable_headers *header,
         * If GICC is enabled and has valid gicr base address, then it means
         * GICR base is presented via GICC
         */
-       if ((gicc->flags & ACPI_MADT_ENABLED) && gicc->gicr_base_address) {
+       if (acpi_gicc_is_usable(gicc) && gicc->gicr_base_address) {
                acpi_data.enabled_rdists++;
                return 0;
        }
@@ -2427,7 +2426,7 @@ static int __init gic_acpi_match_gicc(union acpi_subtable_headers *header,
         * It's perfectly valid firmware can pass disabled GICC entry, driver
         * should not treat as errors, skip the entry instead of probe fail.
         */
-       if (!(gicc->flags & ACPI_MADT_ENABLED))
+       if (!acpi_gicc_is_usable(gicc))
                return 0;
 
        return -ENODEV;
@@ -2486,8 +2485,7 @@ static int __init gic_acpi_parse_virt_madt_gicc(union acpi_subtable_headers *hea
        int maint_irq_mode;
        static int first_madt = true;
 
-       /* Skip unusable CPUs */
-       if (!(gicc->flags & ACPI_MADT_ENABLED))
+       if (!acpi_gicc_is_usable(gicc))
                return 0;
 
        maint_irq_mode = (gicc->flags & ACPI_MADT_VGIC_IRQ_MODE) ?
index a73246c3c35e083541b2e33638c575b6910497ba..fae2aa0b5e8b8f30156429764c438294aef8f0cb 100644 (file)
@@ -256,6 +256,11 @@ acpi_table_parse_cedt(enum acpi_cedt_type id,
 int acpi_parse_mcfg (struct acpi_table_header *header);
 void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
 
+static inline bool acpi_gicc_is_usable(struct acpi_madt_generic_interrupt *gicc)
+{
+       return gicc->flags & ACPI_MADT_ENABLED;
+}
+
 /* the following numa functions are architecture-dependent */
 void acpi_numa_slit_init (struct acpi_table_slit *slit);