diff --git a/Documentation/PCI/tph.rst b/Documentation/PCI/tph.rst index e8993be64fd64d..b6cf22b9bd90a5 100644 --- a/Documentation/PCI/tph.rst +++ b/Documentation/PCI/tph.rst @@ -79,10 +79,10 @@ To retrieve a Steering Tag for a target memory associated with a specific CPU, use the following function:: int pcie_tph_get_cpu_st(struct pci_dev *pdev, enum tph_mem_type type, - unsigned int cpu_uid, u16 *tag); + unsigned int cpu, u16 *tag); The `type` argument is used to specify the memory type, either volatile -or persistent, of the target memory. The `cpu_uid` argument specifies the +or persistent, of the target memory. The `cpu` argument specifies the CPU where the memory is associated to. After the ST value is retrieved, the device driver can use the following diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c index af90128cfed56d..e7d4d9bd30365c 100644 --- a/arch/arm64/kernel/acpi.c +++ b/arch/arm64/kernel/acpi.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -458,3 +459,11 @@ int acpi_unmap_cpu(int cpu) } EXPORT_SYMBOL(acpi_unmap_cpu); #endif /* CONFIG_ACPI_HOTPLUG_CPU */ + +int acpi_get_cpu_acpi_id(unsigned int cpu) +{ + if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return -EINVAL; + return get_acpi_id_for_cpu(cpu); +} +EXPORT_SYMBOL_GPL(acpi_get_cpu_acpi_id); diff --git a/arch/loongarch/kernel/acpi.c b/arch/loongarch/kernel/acpi.c index 1367ca759468f9..db28747a18e84a 100644 --- a/arch/loongarch/kernel/acpi.c +++ b/arch/loongarch/kernel/acpi.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -385,3 +386,11 @@ int acpi_unmap_cpu(int cpu) EXPORT_SYMBOL(acpi_unmap_cpu); #endif /* CONFIG_ACPI_HOTPLUG_CPU */ + +int acpi_get_cpu_acpi_id(unsigned int cpu) +{ + if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return -EINVAL; + return get_acpi_id_for_cpu(cpu); +} +EXPORT_SYMBOL_GPL(acpi_get_cpu_acpi_id); diff --git a/arch/riscv/kernel/acpi.c b/arch/riscv/kernel/acpi.c index 26c018ebce03c5..343d0403010a15 100644 --- a/arch/riscv/kernel/acpi.c +++ b/arch/riscv/kernel/acpi.c @@ -22,6 +22,8 @@ #include #include +#include + int acpi_noirq = 1; /* skip ACPI IRQ initialization */ int acpi_disabled = 1; EXPORT_SYMBOL(acpi_disabled); @@ -337,3 +339,11 @@ int raw_pci_write(unsigned int domain, unsigned int bus, } #endif /* CONFIG_PCI */ + +int acpi_get_cpu_acpi_id(unsigned int cpu) +{ + if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return -EINVAL; + return get_acpi_id_for_cpu(cpu); +} +EXPORT_SYMBOL_GPL(acpi_get_cpu_acpi_id); diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 1c3261cae40c9f..9b06c76d5c0c2f 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -2643,3 +2645,18 @@ void __init arch_cpu_finalize_init(void) */ mem_encrypt_init(); } + +int acpi_get_cpu_acpi_id(unsigned int cpu) +{ + u32 acpi_id; + + if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return -EINVAL; + + acpi_id = cpu_acpi_id(cpu); + if (acpi_id == CPU_ACPIID_INVALID) + return -ENODEV; + + return (int)acpi_id; +} +EXPORT_SYMBOL_GPL(acpi_get_cpu_acpi_id); diff --git a/drivers/pci/tph.c b/drivers/pci/tph.c index ca4f97be75389d..3cd38972fcb1c7 100644 --- a/drivers/pci/tph.c +++ b/drivers/pci/tph.c @@ -236,21 +236,28 @@ static int write_tag_to_st_table(struct pci_dev *pdev, int index, u16 tag) * with a specific CPU * @pdev: PCI device * @mem_type: target memory type (volatile or persistent RAM) - * @cpu_uid: associated CPU id + * @cpu: associated CPU id * @tag: Steering Tag to be returned * * Return the Steering Tag for a target memory that is associated with a - * specific CPU as indicated by cpu_uid. + * specific CPU as indicated by cpu. * * Return: 0 if success, otherwise negative value (-errno) */ int pcie_tph_get_cpu_st(struct pci_dev *pdev, enum tph_mem_type mem_type, - unsigned int cpu_uid, u16 *tag) + unsigned int cpu, u16 *tag) { #ifdef CONFIG_ACPI + unsigned int cpu_uid; struct pci_dev *rp; acpi_handle rp_acpi_handle; union st_info info; + int ret; + + ret = acpi_get_cpu_acpi_id(cpu); + if (ret < 0) + return ret; + cpu_uid = (unsigned int)ret; rp = pcie_find_root_port(pdev); if (!rp || !rp->bus || !rp->bus->bridge) @@ -265,9 +272,9 @@ int pcie_tph_get_cpu_st(struct pci_dev *pdev, enum tph_mem_type mem_type, *tag = tph_extract_tag(mem_type, pdev->tph_req_type, &info); - pci_dbg(pdev, "get steering tag: mem_type=%s, cpu_uid=%d, tag=%#04x\n", + pci_dbg(pdev, "get steering tag: mem_type=%s, cpu=%d, tag=%#04x\n", (mem_type == TPH_MEM_TYPE_VM) ? "volatile" : "persistent", - cpu_uid, *tag); + cpu, *tag); return 0; #else diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 3a412dcebc296d..eca76f21d2e8f4 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -324,6 +324,16 @@ int acpi_unmap_cpu(int cpu); acpi_handle acpi_get_processor_handle(int cpu); +/* + * acpi_get_cpu_acpi_id() - Get ACPI Processor UID of a specified CPU from MADT table + * @cpu: Logical CPU number (0-based) + * + * Return: ACPI Processor ID of the CPU on success (non-negative); + * -EINVAL if the CPU number is invalid or not possible; + * -ENODEV if the ACPI ID of the CPU is invalid. + */ +int acpi_get_cpu_acpi_id(unsigned int cpu); + #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr); #endif diff --git a/include/linux/pci-tph.h b/include/linux/pci-tph.h index ba28140ce67076..be68cd17f2f833 100644 --- a/include/linux/pci-tph.h +++ b/include/linux/pci-tph.h @@ -25,7 +25,7 @@ int pcie_tph_set_st_entry(struct pci_dev *pdev, unsigned int index, u16 tag); int pcie_tph_get_cpu_st(struct pci_dev *dev, enum tph_mem_type mem_type, - unsigned int cpu_uid, u16 *tag); + unsigned int cpu, u16 *tag); void pcie_disable_tph(struct pci_dev *pdev); int pcie_enable_tph(struct pci_dev *pdev, int mode); u16 pcie_tph_get_st_table_size(struct pci_dev *pdev); @@ -36,7 +36,7 @@ static inline int pcie_tph_set_st_entry(struct pci_dev *pdev, { return -EINVAL; } static inline int pcie_tph_get_cpu_st(struct pci_dev *dev, enum tph_mem_type mem_type, - unsigned int cpu_uid, u16 *tag) + unsigned int cpu, u16 *tag) { return -EINVAL; } static inline void pcie_disable_tph(struct pci_dev *pdev) { } static inline int pcie_enable_tph(struct pci_dev *pdev, int mode)