ACPI: processor_core: RISC-V: Enable mapping processor to the hartid
processor_core needs arch-specific functions to map the ACPI ID to the physical ID. In RISC-V platforms, hartid is the physical id and RINTC structure in MADT provides this mapping. Add arch-specific function to get this mapping from RINTC. Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Link: https://lore.kernel.org/r/20230515054928.2079268-8-sunilvl@ventanamicro.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
a91a9ffbd3
commit
8b7809e289
@ -15,6 +15,9 @@
|
||||
/* Basic configuration for ACPI */
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
typedef u64 phys_cpuid_t;
|
||||
#define PHYS_CPUID_INVALID INVALID_HARTID
|
||||
|
||||
/* ACPI table mapping after acpi_permanent_mmap is set */
|
||||
void *acpi_os_ioremap(acpi_physical_address phys, acpi_size size);
|
||||
#define acpi_os_ioremap acpi_os_ioremap
|
||||
|
@ -106,6 +106,32 @@ static int map_gicc_mpidr(struct acpi_subtable_header *entry,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve the RISC-V hartid for the processor
|
||||
*/
|
||||
static int map_rintc_hartid(struct acpi_subtable_header *entry,
|
||||
int device_declaration, u32 acpi_id,
|
||||
phys_cpuid_t *hartid)
|
||||
{
|
||||
struct acpi_madt_rintc *rintc =
|
||||
container_of(entry, struct acpi_madt_rintc, header);
|
||||
|
||||
if (!(rintc->flags & ACPI_MADT_ENABLED))
|
||||
return -ENODEV;
|
||||
|
||||
/* device_declaration means Device object in DSDT, in the
|
||||
* RISC-V, logical processors are required to
|
||||
* have a Processor Device object in the DSDT, so we should
|
||||
* check device_declaration here
|
||||
*/
|
||||
if (device_declaration && rintc->uid == acpi_id) {
|
||||
*hartid = rintc->hart_id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static phys_cpuid_t map_madt_entry(struct acpi_table_madt *madt,
|
||||
int type, u32 acpi_id)
|
||||
{
|
||||
@ -136,6 +162,9 @@ static phys_cpuid_t map_madt_entry(struct acpi_table_madt *madt,
|
||||
} else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) {
|
||||
if (!map_gicc_mpidr(header, type, acpi_id, &phys_id))
|
||||
break;
|
||||
} else if (header->type == ACPI_MADT_TYPE_RINTC) {
|
||||
if (!map_rintc_hartid(header, type, acpi_id, &phys_id))
|
||||
break;
|
||||
}
|
||||
entry += header->length;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user