Skip to content

Commit 0c82319

Browse files
fengchengwenrafaeljw
authored andcommitted
RISC-V: ACPI: Add acpi_get_cpu_uid() for unified ACPI CPU UID retrieval
As a step towards unifying the interface for retrieving ACPI CPU UID across architectures, introduce a new function acpi_get_cpu_uid() for riscv. While at it, add input validation to make the code more robust. And also update acpi_numa.c and rhct.c to use the new interface instead of the legacy get_acpi_id_for_cpu(). Signed-off-by: Chengwen Feng <fengchengwen@huawei.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/20260401081640.26875-4-fengchengwen@huawei.com Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent d78ef9d commit 0c82319

4 files changed

Lines changed: 29 additions & 4 deletions

File tree

arch/riscv/include/asm/acpi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ static inline u32 get_acpi_id_for_cpu(int cpu)
6565
{
6666
return acpi_cpu_get_madt_rintc(cpu)->uid;
6767
}
68+
int acpi_get_cpu_uid(unsigned int cpu, u32 *uid);
6869

6970
int acpi_get_riscv_isa(struct acpi_table_header *table,
7071
unsigned int cpu, const char **isa);

arch/riscv/kernel/acpi.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,19 @@ int raw_pci_write(unsigned int domain, unsigned int bus,
337337
}
338338

339339
#endif /* CONFIG_PCI */
340+
341+
int acpi_get_cpu_uid(unsigned int cpu, u32 *uid)
342+
{
343+
struct acpi_madt_rintc *rintc;
344+
345+
if (cpu >= nr_cpu_ids)
346+
return -EINVAL;
347+
348+
rintc = acpi_cpu_get_madt_rintc(cpu);
349+
if (!rintc)
350+
return -ENODEV;
351+
352+
*uid = rintc->uid;
353+
return 0;
354+
}
355+
EXPORT_SYMBOL_GPL(acpi_get_cpu_uid);

arch/riscv/kernel/acpi_numa.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,14 @@ static int __init acpi_numa_get_nid(unsigned int cpu)
3737

3838
static inline int get_cpu_for_acpi_id(u32 uid)
3939
{
40-
int cpu;
40+
u32 cpu_uid;
41+
int ret;
4142

42-
for (cpu = 0; cpu < nr_cpu_ids; cpu++)
43-
if (uid == get_acpi_id_for_cpu(cpu))
43+
for (int cpu = 0; cpu < nr_cpu_ids; cpu++) {
44+
ret = acpi_get_cpu_uid(cpu, &cpu_uid);
45+
if (ret == 0 && uid == cpu_uid)
4446
return cpu;
47+
}
4548

4649
return -EINVAL;
4750
}

drivers/acpi/riscv/rhct.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,15 @@ int acpi_get_riscv_isa(struct acpi_table_header *table, unsigned int cpu, const
4444
struct acpi_rhct_isa_string *isa_node;
4545
struct acpi_table_rhct *rhct;
4646
u32 *hart_info_node_offset;
47-
u32 acpi_cpu_id = get_acpi_id_for_cpu(cpu);
47+
u32 acpi_cpu_id;
48+
int ret;
4849

4950
BUG_ON(acpi_disabled);
5051

52+
ret = acpi_get_cpu_uid(cpu, &acpi_cpu_id);
53+
if (ret != 0)
54+
return ret;
55+
5156
if (!table) {
5257
rhct = acpi_get_rhct();
5358
if (!rhct)

0 commit comments

Comments
 (0)