Commit 3cfe889f authored by Chengwen Feng's avatar Chengwen Feng Committed by Rafael J. Wysocki
Browse files

x86/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
x86. While at it, add input validation to make the code more robust.

Update Xen-related code to use acpi_get_cpu_uid() instead of the legacy
cpu_acpi_id() function, and remove the now-unused cpu_acpi_id() to clean
up redundant code.

Signed-off-by: default avatarChengwen Feng <fengchengwen@huawei.com>
Reviewed-by: default avatarJonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
Link: https://patch.msgid.link/20260401081640.26875-5-fengchengwen@huawei.com


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 0c823199
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -157,6 +157,8 @@ static inline bool acpi_has_cpu_in_madt(void)
	return !!acpi_lapic;
}

int acpi_get_cpu_uid(unsigned int cpu, u32 *uid);

#define ACPI_HAVE_ARCH_SET_ROOT_POINTER
static __always_inline void acpi_arch_set_root_pointer(u64 addr)
{
+0 −1
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@

#ifndef CONFIG_SMP
#define cpu_physical_id(cpu)			boot_cpu_physical_apicid
#define cpu_acpi_id(cpu)			0
#endif /* CONFIG_SMP */

#ifdef CONFIG_HOTPLUG_CPU
+0 −1
Original line number Diff line number Diff line
@@ -130,7 +130,6 @@ __visible void smp_call_function_interrupt(struct pt_regs *regs);
__visible void smp_call_function_single_interrupt(struct pt_regs *r);

#define cpu_physical_id(cpu)	per_cpu(x86_cpu_to_apicid, cpu)
#define cpu_acpi_id(cpu)	per_cpu(x86_cpu_to_acpiid, cpu)

/*
 * This function is needed by all SMP systems. It must _always_ be valid
+20 −0
Original line number Diff line number Diff line
@@ -1848,3 +1848,23 @@ void __iomem * (*acpi_os_ioremap)(acpi_physical_address phys, acpi_size size) =
	x86_acpi_os_ioremap;
EXPORT_SYMBOL_GPL(acpi_os_ioremap);
#endif

int acpi_get_cpu_uid(unsigned int cpu, u32 *uid)
{
	u32 acpi_id;

	if (cpu >= nr_cpu_ids)
		return -EINVAL;

#ifdef CONFIG_SMP
	acpi_id = per_cpu(x86_cpu_to_acpiid, cpu);
	if (acpi_id == CPU_ACPIID_INVALID)
		return -ENODEV;
#else
	acpi_id = 0;
#endif

	*uid = acpi_id;
	return 0;
}
EXPORT_SYMBOL_GPL(acpi_get_cpu_uid);
+3 −2
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ static void xen_hvm_crash_shutdown(struct pt_regs *regs)

static int xen_cpu_up_prepare_hvm(unsigned int cpu)
{
	u32 cpu_uid;
	int rc = 0;

	/*
@@ -161,8 +162,8 @@ static int xen_cpu_up_prepare_hvm(unsigned int cpu)
	 */
	xen_uninit_lock_cpu(cpu);

	if (cpu_acpi_id(cpu) != CPU_ACPIID_INVALID)
		per_cpu(xen_vcpu_id, cpu) = cpu_acpi_id(cpu);
	if (acpi_get_cpu_uid(cpu, &cpu_uid) == 0)
		per_cpu(xen_vcpu_id, cpu) = cpu_uid;
	else
		per_cpu(xen_vcpu_id, cpu) = cpu;
	xen_vcpu_setup(cpu);