Containing the following patches: ACPI/MPAM: Adapt to Arm's MPAM ACPI table version 2 ACPI / PPTT: Find PPTT processor node by cache id ACPICA: ACPI 6.4: PPTT: add new version of subtable type 1 ACPICA: Add support for Arm's MPAM ACPI table version 2 --- kernel.spec | 6 +- ...rt-for-Arm-s-MPAM-ACPI-table-version.patch | 166 ++++++++++ ...PPTT-add-new-version-of-subtable-typ.patch | 65 ++++ ...Find-PPTT-processor-node-by-cache-id.patch | 114 +++++++ ...t-to-Arm-s-MPAM-ACPI-table-version-2.patch | 302 ++++++++++++++++++ series.conf | 4 + 6 files changed, 656 insertions(+), 1 deletion(-) create mode 100644 patches/0118-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch create mode 100644 patches/0119-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch create mode 100644 patches/0120-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch create mode 100644 patches/0121-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch
diff --git a/kernel.spec b/kernel.spec index c359e305adcb..31c70083ef82 100644 --- a/kernel.spec +++ b/kernel.spec @@ -32,7 +32,7 @@
Name: kernel Version: 4.19.90 -Release: %{hulkrelease}.0238 +Release: %{hulkrelease}.0239 Summary: Linux Kernel License: GPLv2 URL: http://www.kernel.org/ @@ -836,6 +836,10 @@ fi %endif
%changelog + +* Fri Nov 10 2023 Yu Liao liaoyu15@huawei.com - 4.19.90-2311.1.0.0239 +- mpam: support ACPI for MPAM 2.0 + * Thu Nov 9 2023 Kunkun Jiang jiangkunkun@huawei.com - 4.19.90-2311.1.0.0238 - scsi: virtio_scsi: limit number of hw queues by nr_cpu_ids
diff --git a/patches/0118-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch b/patches/0118-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch new file mode 100644 index 000000000000..9986d73ca082 --- /dev/null +++ b/patches/0118-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch @@ -0,0 +1,166 @@ +From fbd9895d29825eeea4d958e41a9974534baa8a6c Mon Sep 17 00:00:00 2001 +From: Hesham Almatary hesham.almatary@huawei.com +Date: Fri, 9 Jun 2023 13:06:49 +0800 +Subject: [PATCH openEuler-20.03-LTS-SP4 1/4] ACPICA: Add support for Arm's MPAM ACPI + table version 2 + +mainline inclusion +from mainline-v6.4-rc1 +commit 47920aae34e295f4ffbeac0b10698ceda52eec99 +category: feature +bugzilla: https://gitee.com/openeuler/kernel/issues/I77UDW +CVE: NA + +Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... + +-------------------------------- + +ACPICA commit 005e24bcaa6e4c7db327b4f81fb63b2715aac7e6 + +Complies with ACPI for Memory System Resource Partitioning and +Monitoring 2.0 [1]. Document number: DEN0065, as of December 2022. + +Support for all types of MPAM resources. No support yet for: +1) MPAM PCC Interface Type +2) The optional Resource-specific data per MSC node, introduced in v2 of the +MPAM ACPI spec. + +[1] https://developer.arm.com/documentation/den0065/latest + +Link: https://github.com/acpica/acpica/commit/005e24bc +Signed-off-by: Hesham Almatary hesham.almatary@huawei.com +Signed-off-by: Bob Moore robert.moore@intel.com +Signed-off-by: Rafael J. Wysocki rafael.j.wysocki@intel.com + +Conflicts: + include/acpi/actbl2.h +Signed-off-by: Yu Liao liaoyu15@huawei.com +--- + include/acpi/actbl2.h | 111 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 111 insertions(+) + +diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h +index 476d0f6188c6..38325bd24231 100644 +--- a/include/acpi/actbl2.h ++++ b/include/acpi/actbl2.h +@@ -964,6 +964,117 @@ struct acpi_mpam_node_memory { + u8 reserved1[3]; + }; + ++/******************************************************************************* ++ * ++ * MPAM - Memory System Resource Partitioning and Monitoring ++ * ++ * Conforms to "ACPI for Memory System Resource Partitioning and Monitoring 2.0" ++ * Document number: ARM DEN 0065, December, 2022. ++ * ++ ******************************************************************************/ ++ ++/* MPAM RIS locator types. Table 11, Location types */ ++enum acpi_mpam_locator_type { ++ ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE = 0, ++ ACPI_MPAM_LOCATION_TYPE_MEMORY = 1, ++ ACPI_MPAM_LOCATION_TYPE_SMMU = 2, ++ ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE = 3, ++ ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE = 4, ++ ACPI_MPAM_LOCATION_TYPE_INTERCONNECT = 5, ++ ACPI_MPAM_LOCATION_TYPE_UNKNOWN = 0xFF ++}; ++ ++/* MPAM Functional dependency descriptor. Table 10 */ ++struct acpi_mpam_func_deps { ++ u32 producer; ++ u32 reserved; ++}; ++ ++/* MPAM Processor cache locator descriptor. Table 13 */ ++struct acpi_mpam_resource_cache_locator { ++ u64 cache_reference; ++ u32 reserved; ++}; ++ ++/* MPAM Memory locator descriptor. Table 14 */ ++struct acpi_mpam_resource_memory_locator { ++ u64 proximity_domain; ++ u32 reserved; ++}; ++ ++/* MPAM SMMU locator descriptor. Table 15 */ ++struct acpi_mpam_resource_smmu_locator { ++ u64 smmu_interface; ++ u32 reserved; ++}; ++ ++/* MPAM Memory-side cache locator descriptor. Table 16 */ ++struct acpi_mpam_resource_memcache_locator { ++ u8 reserved[7]; ++ u8 level; ++ u32 reference; ++}; ++ ++/* MPAM ACPI device locator descriptor. Table 17 */ ++struct acpi_mpam_resource_acpi_locator { ++ u64 acpi_hw_id; ++ u32 acpi_unique_id; ++}; ++ ++/* MPAM Interconnect locator descriptor. Table 18 */ ++struct acpi_mpam_resource_interconnect_locator { ++ u64 inter_connect_desc_tbl_off; ++ u32 reserved; ++}; ++ ++/* MPAM Locator structure. Table 12 */ ++struct acpi_mpam_resource_generic_locator { ++ u64 descriptor1; ++ u32 descriptor2; ++}; ++ ++union acpi_mpam_resource_locator { ++ struct acpi_mpam_resource_cache_locator cache_locator; ++ struct acpi_mpam_resource_memory_locator memory_locator; ++ struct acpi_mpam_resource_smmu_locator smmu_locator; ++ struct acpi_mpam_resource_memcache_locator mem_cache_locator; ++ struct acpi_mpam_resource_acpi_locator acpi_locator; ++ struct acpi_mpam_resource_interconnect_locator interconnect_ifc_locator; ++ struct acpi_mpam_resource_generic_locator generic_locator; ++}; ++ ++/* Memory System Component Resource Node Structure Table 9 */ ++struct acpi_mpam_resource_node { ++ u32 identifier; ++ u8 ris_index; ++ u16 reserved1; ++ u8 locator_type; ++ union acpi_mpam_resource_locator locator; ++ u32 num_functional_deps; ++}; ++ ++/* Memory System Component (MSC) Node Structure. Table 4 */ ++struct acpi_mpam_msc_node { ++ u16 length; ++ u8 interface_type; ++ u8 reserved; ++ u32 identifier; ++ u64 base_address; ++ u32 mmio_size; ++ u32 overflow_interrupt; ++ u32 overflow_interrupt_flags; ++ u32 reserved1; ++ u32 overflow_interrupt_affinity; ++ u32 error_interrupt; ++ u32 error_interrupt_flags; ++ u32 reserved2; ++ u32 error_interrupt_affinity; ++ u32 max_nrdy_usec; ++ u64 hardware_id_linked_device; ++ u32 instance_id_linked_device; ++ u32 num_resouce_nodes; ++}; ++ + /******************************************************************************* + * + * MSDM - Microsoft Data Management table +-- +2.25.1 + diff --git a/patches/0119-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch b/patches/0119-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch new file mode 100644 index 000000000000..e5b6f51c5892 --- /dev/null +++ b/patches/0119-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch @@ -0,0 +1,65 @@ +From 3cab8977d9a1456204cc629bbae1572c583a91fb Mon Sep 17 00:00:00 2001 +From: Erik Kaneda erik.kaneda@intel.com +Date: Fri, 9 Jun 2023 13:06:50 +0800 +Subject: [PATCH openEuler-20.03-LTS-SP4 2/4] ACPICA: ACPI 6.4: PPTT: add new version + of subtable type 1 + +mainline inclusion +from mainline-v5.13-rc1 +commit 5e2e86c0b9970e6f70869e76a1c6417036fd3a7e +category: feature +bugzilla: https://gitee.com/openeuler/kernel/issues/I77UDW +CVE: NA + +Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... + +-------------------------------- + +This commit squashes the following: + +ACPICA commit 475c5e89f8f701ccdfee6ca567e33c854ecd6c9e +ACPICA commit 82cf78ac175a4b7d8842c5b786be24031c817cfd + +This new subtable is only valid for PPTT version 3. + +Elyes fixed a misspelled identifier in this commit. + +Link: https://github.com/acpica/acpica/commit/475c5e89 +Link: https://github.com/acpica/acpica/commit/82cf78ac +Signed-off-by: Elyes HAOUAS ehaouas@noos.fr +Signed-off-by: Erik Kaneda erik.kaneda@intel.com +Signed-off-by: Bob Moore robert.moore@intel.com +Signed-off-by: Rafael J. Wysocki rafael.j.wysocki@intel.com +Signed-off-by: Yu Liao liaoyu15@huawei.com +--- + include/acpi/actbl2.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h +index 38325bd24231..d95852c1708f 100644 +--- a/include/acpi/actbl2.h ++++ b/include/acpi/actbl2.h +@@ -1664,6 +1664,12 @@ struct acpi_pptt_cache { + u16 line_size; + }; + ++/* 1: Cache Type Structure for PPTT version 3 */ ++ ++struct acpi_pptt_cache_v1 { ++ u32 cache_id; ++}; ++ + /* Flags */ + + #define ACPI_PPTT_SIZE_PROPERTY_VALID (1) /* Physical property valid */ +@@ -1673,6 +1679,7 @@ struct acpi_pptt_cache { + #define ACPI_PPTT_CACHE_TYPE_VALID (1<<4) /* Cache type valid */ + #define ACPI_PPTT_WRITE_POLICY_VALID (1<<5) /* Write policy valid */ + #define ACPI_PPTT_LINE_SIZE_VALID (1<<6) /* Line size valid */ ++#define ACPI_PPTT_CACHE_ID_VALID (1<<7) /* Cache ID valid */ + + /* Masks for Attributes */ + +-- +2.25.1 + diff --git a/patches/0120-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch b/patches/0120-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch new file mode 100644 index 000000000000..7c8b81358dd8 --- /dev/null +++ b/patches/0120-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch @@ -0,0 +1,114 @@ +From c76f178feff20fcbda0dba4a72418f310d65f61b Mon Sep 17 00:00:00 2001 +From: Yu Liao liaoyu15@huawei.com +Date: Fri, 9 Jun 2023 13:06:51 +0800 +Subject: [PATCH openEuler-20.03-LTS-SP4 3/4] ACPI / PPTT: Find PPTT processor node + by cache id + +openeuler inclusion +category: feature +bugzilla: https://gitee.com/openeuler/kernel/issues/I77UDW +CVE: NA + +-------------------------------- + +The MPAM table identifies caches by id, but the driver also wants to know +the processor node. + +Add a helper that walks every possible cache, until it finds the one +identified by id, then return processor node. + +Signed-off-by: Yu Liao liaoyu15@huawei.com +--- + drivers/acpi/pptt.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ + include/linux/acpi.h | 5 ++++ + 2 files changed, 60 insertions(+) + +diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c +index 879b9155b7b4..74ce9fcee830 100644 +--- a/drivers/acpi/pptt.c ++++ b/drivers/acpi/pptt.c +@@ -896,3 +896,58 @@ int find_acpi_cpu_topology_hetero_id(unsigned int cpu) + return find_acpi_cpu_topology_tag(cpu, PPTT_ABORT_PACKAGE, + ACPI_PPTT_ACPI_IDENTICAL); + } ++ ++struct acpi_pptt_processor *find_acpi_processor_node_from_cache_id(u32 cache_id) ++{ ++ u32 acpi_cpu_id; ++ acpi_status status; ++ int level, cpu, num_levels; ++ struct acpi_pptt_cache *cache; ++ struct acpi_table_header *table; ++ struct acpi_pptt_cache_v1 *cache_v1; ++ struct acpi_pptt_processor *cpu_node; ++ ++ status = acpi_get_table(ACPI_SIG_PPTT, 0, &table); ++ if (ACPI_FAILURE(status)) { ++ pr_warn_once("No PPTT table found, cache topology may be inaccurate\n"); ++ return NULL; ++ } ++ ++ if (table->revision < 3) { ++ acpi_put_table(table); ++ return NULL; ++ } ++ ++ /* ++ * If we found the cache first, we'd still need to walk from each CPU ++ * to find the level... ++ */ ++ for_each_possible_cpu(cpu) { ++ acpi_cpu_id = get_acpi_id_for_cpu(cpu); ++ cpu_node = acpi_find_processor_node(table, acpi_cpu_id); ++ if (!cpu_node) ++ break; ++ num_levels = acpi_count_levels(table, cpu_node); ++ ++ for (level = 0; level <= num_levels; level++) { ++ cache = acpi_find_cache_node(table, acpi_cpu_id, ++ ACPI_PPTT_CACHE_TYPE_UNIFIED, ++ level, &cpu_node); ++ if (!cache) ++ continue; ++ ++ cache_v1 = ACPI_ADD_PTR(struct acpi_pptt_cache_v1, ++ cache, ++ sizeof(struct acpi_pptt_cache)); ++ ++ if (cache->flags & ACPI_PPTT_CACHE_ID_VALID && ++ cache_v1->cache_id == cache_id) { ++ acpi_put_table(table); ++ return cpu_node; ++ } ++ } ++ } ++ ++ acpi_put_table(table); ++ return NULL; ++} +diff --git a/include/linux/acpi.h b/include/linux/acpi.h +index 4a0142276cb8..3669c2ff26ed 100644 +--- a/include/linux/acpi.h ++++ b/include/linux/acpi.h +@@ -1331,6 +1331,7 @@ int find_acpi_cpu_topology(unsigned int cpu, int level); + int find_acpi_cpu_topology_package(unsigned int cpu); + int find_acpi_cpu_topology_hetero_id(unsigned int cpu); + int find_acpi_cpu_cache_topology(unsigned int cpu, int level); ++struct acpi_pptt_processor *find_acpi_processor_node_from_cache_id(u32 cache_id); + #else + static inline int acpi_pptt_cpu_is_thread(unsigned int cpu) + { +@@ -1352,6 +1353,10 @@ static inline int find_acpi_cpu_cache_topology(unsigned int cpu, int level) + { + return -EINVAL; + } ++static inline struct acpi_pptt_processor *find_acpi_processor_node_from_cache_id(u32 cache_id) ++{ ++ return NULL; ++} + #endif + + struct acpi_pptt_processor * +-- +2.25.1 + diff --git a/patches/0121-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch b/patches/0121-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch new file mode 100644 index 000000000000..ff649474e1f0 --- /dev/null +++ b/patches/0121-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch @@ -0,0 +1,302 @@ +From c366e5ecb88cf89495a82a26274e682fb45631ab Mon Sep 17 00:00:00 2001 +From: Yu Liao liaoyu15@huawei.com +Date: Fri, 9 Jun 2023 13:06:52 +0800 +Subject: [PATCH openEuler-20.03-LTS-SP4 4/4] ACPI/MPAM: Adapt to Arm's MPAM ACPI + table version 2 + +openeuler inclusion +category: feature +bugzilla: https://gitee.com/openeuler/kernel/issues/I77UDW +CVE: NA + +-------------------------------- + +Support ACPI for MPAM 2.0 [1]. Compatible with MPAM ACPI 1.0 by reading +ACPI revision. + +[1] https://developer.arm.com/documentation/den0065/latest + +Signed-off-by: Yu Liao liaoyu15@huawei.com +--- + arch/arm64/kernel/mpam/mpam_device.c | 2 +- + drivers/acpi/arm64/Makefile | 2 +- + drivers/acpi/arm64/mpam.c | 21 +++- + drivers/acpi/arm64/mpam_v2.c | 175 +++++++++++++++++++++++++++ + include/linux/arm_mpam.h | 2 +- + 5 files changed, 195 insertions(+), 7 deletions(-) + create mode 100644 drivers/acpi/arm64/mpam_v2.c + +diff --git a/arch/arm64/kernel/mpam/mpam_device.c b/arch/arm64/kernel/mpam/mpam_device.c +index b77cea2673c0..1003716efc09 100644 +--- a/arch/arm64/kernel/mpam/mpam_device.c ++++ b/arch/arm64/kernel/mpam/mpam_device.c +@@ -1873,7 +1873,7 @@ static int __init arm_mpam_driver_init(void) + if (acpi_disabled) + return platform_driver_register(&arm_mpam_driver); + else +- return acpi_mpam_parse(); ++ return acpi_mpam_parse_version(); + } + + /* +diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile +index 81408ce40506..4ba0486dac6b 100644 +--- a/drivers/acpi/arm64/Makefile ++++ b/drivers/acpi/arm64/Makefile +@@ -1,3 +1,3 @@ + obj-$(CONFIG_ACPI_IORT) += iort.o + obj-$(CONFIG_ACPI_GTDT) += gtdt.o +-obj-$(CONFIG_ACPI_MPAM) += mpam.o ++obj-$(CONFIG_ACPI_MPAM) += mpam.o mpam_v2.o +diff --git a/drivers/acpi/arm64/mpam.c b/drivers/acpi/arm64/mpam.c +index 6f4572193eb2..7b92cab79cf1 100644 +--- a/drivers/acpi/arm64/mpam.c ++++ b/drivers/acpi/arm64/mpam.c +@@ -32,6 +32,8 @@ + #include <linux/nodemask.h> + #include <linux/arm_mpam.h> + ++extern int __init acpi_mpam_parse_table_v2(struct acpi_table_header *table, ++ struct acpi_table_header *pptt); + /** + * acpi_mpam_label_cache_component_id() - Recursivly find @min_physid + * for all leaf CPUs below @cpu_node, use numa node id of @min_cpu_node +@@ -40,7 +42,7 @@ + * @cpu_node: The point in the toplogy to start the walk + * @component_id: The id labels the structure mpam_node cache + */ +-static int ++int + acpi_mpam_label_cache_component_id(struct acpi_table_header *table_hdr, + struct acpi_pptt_processor *cpu_node, + u32 *component_id) +@@ -213,11 +215,11 @@ static int __init acpi_mpam_parse_table(struct acpi_table_header *table, + return ret; + } + +-int __init acpi_mpam_parse(void) ++int __init acpi_mpam_parse_version(void) + { + struct acpi_table_header *mpam, *pptt; + acpi_status status; +- int ret; ++ int ret = -EINVAL; + + if (!cpus_have_const_cap(ARM64_HAS_MPAM)) + return 0; +@@ -234,7 +236,18 @@ int __init acpi_mpam_parse(void) + if (ACPI_FAILURE(status)) + pptt = NULL; + +- ret = acpi_mpam_parse_table(mpam, pptt); ++ /* ++ * The BIOS of Kunpeng 920 supports MPAM ACPI 1.0, but the ACPI ++ * revision is wrongly written as 1, so distinguished by ++ * oem_table_id here. ++ */ ++ if (mpam->revision == 0 || strncmp(mpam->oem_table_id, "HIP08", 5) == 0) ++ ret = acpi_mpam_parse_table(mpam, pptt); ++ else if (mpam->revision == 1) ++ ret = acpi_mpam_parse_table_v2(mpam, pptt); ++ else ++ pr_err("unsupported MPAM ACPI version: %u\n", mpam->revision); ++ + acpi_put_table(pptt); + acpi_put_table(mpam); + +diff --git a/drivers/acpi/arm64/mpam_v2.c b/drivers/acpi/arm64/mpam_v2.c +new file mode 100644 +index 000000000000..a3888a5da695 +--- /dev/null ++++ b/drivers/acpi/arm64/mpam_v2.c +@@ -0,0 +1,175 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Common code for ARM v8 MPAM ACPI 2.0 ++ * ++ * Copyright (C) 2019-2022 Huawei Technologies Co., Ltd ++ * ++ * Author: Yu Liao liaoyu15@huawei.com ++ * ++ * Code was partially borrowed from http://www.linux-arm.org/git?p= ++ * linux-jm.git;a=commit;h=10fe7d6363ae96b25f584d4a91f9d0f2fd5faf3b. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ */ ++ ++/* Parse the MPAM ACPI table feeding the discovered nodes into the driver */ ++#define pr_fmt(fmt) "ACPI MPAM: " fmt ++ ++#include <linux/acpi.h> ++#include <acpi/processor.h> ++#include <linux/cpu.h> ++#include <linux/cpumask.h> ++#include <linux/cacheinfo.h> ++#include <linux/string.h> ++#include <linux/nodemask.h> ++#include <linux/arm_mpam.h> ++ ++extern int ++acpi_mpam_label_cache_component_id(struct acpi_table_header *table_hdr, ++ struct acpi_pptt_processor *cpu_node, ++ u32 *component_id); ++ ++static int __init acpi_mpam_parse_cache_v2(struct acpi_mpam_msc_node *msc, ++ struct acpi_table_header *pptt) ++{ ++ int ret = 0; ++ int level; ++ u32 component_id; ++ struct mpam_device *dev; ++ struct cacheinfo *ci; ++ struct acpi_pptt_processor *pptt_cpu_node; ++ struct acpi_mpam_resource_node *resources; ++ ++ resources = (struct acpi_mpam_resource_node *)(msc + 1); ++ ++ pptt_cpu_node = find_acpi_processor_node_from_cache_id(resources->locator.cache_locator.cache_reference); ++ if (!pptt_cpu_node) { ++ pr_err("Failed to find processor cpu node\n"); ++ return -EINVAL; ++ } ++ ++ ret = acpi_mpam_label_cache_component_id(pptt, pptt_cpu_node, ++ &component_id); ++ if (ret) { ++ pr_err("Failed to label cache component id\n"); ++ return -EINVAL; ++ } ++ ++ cpus_read_lock(); ++ ci = cacheinfo_shared_cpu_map_search(pptt_cpu_node); ++ if (!ci) { ++ pr_err_once("No CPU has cache with PPTT reference %#llx", ++ resources->locator.cache_locator.cache_reference); ++ pr_err_once("All CPUs must be online to probe mpam.\n"); ++ cpus_read_unlock(); ++ return -ENODEV; ++ } ++ ++ level = ci->level; ++ ci = NULL; ++ cpus_read_unlock(); ++ ++ /* ++ * Possible we can get cpu-affinity in next MPAM ACPI version, ++ * now we have to set it to NULL and use default possible_aff- ++ * inity. ++ */ ++ dev = mpam_device_create_cache(level, component_id, NULL, ++ msc->base_address); ++ if (IS_ERR(dev)) { ++ pr_err("Failed to create cache node\n"); ++ return -EINVAL; ++ } ++ ++ return mpam_register_device_irq(dev, ++ msc->overflow_interrupt, msc->overflow_interrupt_flags, ++ msc->error_interrupt, msc->error_interrupt_flags); ++} ++ ++static int __init acpi_mpam_parse_memory_v2(struct acpi_mpam_msc_node *msc) ++{ ++ u32 component_id; ++ struct mpam_device *dev; ++ struct acpi_mpam_resource_node *resources; ++ ++ resources = (struct acpi_mpam_resource_node *)(msc + 1); ++ ++ component_id = acpi_map_pxm_to_node(resources->locator.memory_locator.proximity_domain); ++ if (component_id == NUMA_NO_NODE) ++ component_id = 0; ++ ++ dev = mpam_device_create_memory(component_id, msc->base_address); ++ if (IS_ERR(dev)) { ++ pr_err("Failed to create memory node\n"); ++ return -EINVAL; ++ } ++ ++ return mpam_register_device_irq(dev, ++ msc->overflow_interrupt, msc->overflow_interrupt_flags, ++ msc->error_interrupt, msc->error_interrupt_flags); ++} ++ ++int __init acpi_mpam_parse_table_v2(struct acpi_table_header *table, ++ struct acpi_table_header *pptt) ++{ ++ char *table_offset = (char *)(table + 1); ++ char *table_end = (char *)table + table->length; ++ struct acpi_mpam_msc_node *node_hdr; ++ struct acpi_mpam_resource_node *resources; ++ int ret = 0; ++ ++ ret = mpam_discovery_start(); ++ ++ if (ret) ++ return ret; ++ ++ node_hdr = (struct acpi_mpam_msc_node *)table_offset; ++ resources = (struct acpi_mpam_resource_node *)(node_hdr + 1); ++ ++ while (table_offset < table_end) { ++ switch (resources->locator_type) { ++ ++ case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE: ++ ret = acpi_mpam_parse_cache_v2(node_hdr, pptt); ++ break; ++ case ACPI_MPAM_LOCATION_TYPE_MEMORY: ++ ret = acpi_mpam_parse_memory_v2(node_hdr); ++ break; ++ default: ++ pr_warn_once("Unknown node type %u offset %ld.", ++ (resources->locator_type), ++ (table_offset-(char *)table)); ++ /* fall through */ ++ case ACPI_MPAM_LOCATION_TYPE_SMMU: ++ /* not yet supported */ ++ /* fall through */ ++ case ACPI_MPAM_TYPE_UNKNOWN: ++ break; ++ } ++ if (ret) ++ break; ++ ++ table_offset += node_hdr->length; ++ node_hdr = (struct acpi_mpam_msc_node *)table_offset; ++ resources = (struct acpi_mpam_resource_node *)(node_hdr + 1); ++ } ++ ++ if (ret) { ++ pr_err("discovery failed: %d\n", ret); ++ mpam_discovery_failed(); ++ } else { ++ ret = mpam_discovery_complete(); ++ if (!ret) ++ pr_info("Successfully init mpam by ACPI.\n"); ++ } ++ ++ return ret; ++} +diff --git a/include/linux/arm_mpam.h b/include/linux/arm_mpam.h +index eed95ba06a5d..9bdca6cd3cc9 100644 +--- a/include/linux/arm_mpam.h ++++ b/include/linux/arm_mpam.h +@@ -116,6 +116,6 @@ static inline int mpam_register_device_irq(struct mpam_device *dev, + return ret; + } + +-int __init acpi_mpam_parse(void); ++int __init acpi_mpam_parse_version(void); + + #endif +-- +2.25.1 + diff --git a/series.conf b/series.conf index 44b2f1866829..244389e3d2da 100644 --- a/series.conf +++ b/series.conf @@ -118,3 +118,7 @@ patches/0114-perf-auxtrace-arm64-Add-support-for-HiSilicon-PCIe-T.patch patches/0115-perf-auxtrace-arm64-Add-support-for-parsing-HiSilico.patch patches/0116-Fix-the-header-file-location-error-and-adjust-the-fu.patch patches/0117-scsi-virtio_scsi-limit-number-of-hw-queues-by-nr_cpu.patch +patches/0118-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch +patches/0119-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch +patches/0120-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch +patches/0121-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch