Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm64: add function to get a cpu's MADT GICC table

Currently the ACPI parking protocol code needs to parse each CPU's MADT
GICC table to extract the mailbox address and so on. Each time we parse
a GICC table, we call back to the parking protocol code to parse it.

This has been fine so far, but we're about to have more code that needs
to extract data from the GICC tables, and adding a callback for each
user is going to get unwieldy.

Instead, this patch ensures that we stash a copy of each CPU's GICC
table at boot time, such that anything needing to parse it can later
request it. This will allow for other parsers of GICC, and for
simplification to the ACPI parking protocol code. Note that we must
store a copy, rather than a pointer, since the core ACPI code
temporarily maps/unmaps tables while iterating over them.

Since we parse the MADT before we know how many CPUs we have (and hence
before we setup the percpu areas), we must use an NR_CPUS sized array.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tested-by: Jeremy Linton <jeremy.linton@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>

authored by

Mark Rutland and committed by
Will Deacon
e0013aed 18bfcfe5

+12
+2
arch/arm64/include/asm/acpi.h
··· 85 85 return true; 86 86 } 87 87 88 + struct acpi_madt_generic_interrupt *acpi_cpu_get_madt_gicc(int cpu); 89 + 88 90 static inline void arch_fix_phys_package_id(int num, u32 slot) { } 89 91 void __init acpi_init_cpus(void); 90 92
+10
arch/arm64/kernel/smp.c
··· 518 518 static unsigned int cpu_count = 1; 519 519 520 520 #ifdef CONFIG_ACPI 521 + static struct acpi_madt_generic_interrupt cpu_madt_gicc[NR_CPUS]; 522 + 523 + struct acpi_madt_generic_interrupt *acpi_cpu_get_madt_gicc(int cpu) 524 + { 525 + return &cpu_madt_gicc[cpu]; 526 + } 527 + 521 528 /* 522 529 * acpi_map_gic_cpu_interface - parse processor MADT entry 523 530 * ··· 559 552 return; 560 553 } 561 554 bootcpu_valid = true; 555 + cpu_madt_gicc[0] = *processor; 562 556 early_map_cpu_to_node(0, acpi_numa_get_nid(0, hwid)); 563 557 return; 564 558 } ··· 569 561 570 562 /* map the logical cpu id to cpu MPIDR */ 571 563 cpu_logical_map(cpu_count) = hwid; 564 + 565 + cpu_madt_gicc[cpu_count] = *processor; 572 566 573 567 /* 574 568 * Set-up the ACPI parking protocol cpu entries