MPAM: support ACPI for MPAM 2.0
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
This commit is contained in:
parent
389a52fdae
commit
501b1ff8df
@ -32,7 +32,7 @@
|
||||
|
||||
Name: kernel
|
||||
Version: 4.19.90
|
||||
Release: %{hulkrelease}.0239
|
||||
Release: %{hulkrelease}.0240
|
||||
Summary: Linux Kernel
|
||||
License: GPLv2
|
||||
URL: http://www.kernel.org/
|
||||
@ -837,6 +837,9 @@ fi
|
||||
|
||||
%changelog
|
||||
|
||||
* Mon Nov 13 2023 Yu Liao <liaoyu15@huawei.com> - 4.19.90-2311.1.0.0240
|
||||
- mpam: support ACPI for MPAM 2.0
|
||||
|
||||
* Fri Nov 10 2023 hongrongxuan <hongrongxuan@huawei.com> - 4.19.90-2311.1.0.0239
|
||||
- perf metricgroup: Fix find_evsel_group() event selector
|
||||
- perf metricgroup: Fix for metrics containing duration_time
|
||||
|
||||
@ -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/?id=47920aae34e295f4ffbeac0b10698ceda52eec99
|
||||
|
||||
--------------------------------
|
||||
|
||||
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
|
||||
|
||||
@ -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/?id=5e2e86c0b9970e6f70869e76a1c6417036fd3a7e
|
||||
|
||||
--------------------------------
|
||||
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -319,3 +319,7 @@ patches/0315-perf-metricgroup-Return-error-code-from-metricgroup_.patch
|
||||
patches/0316-perf-metricgroup-Fix-system-PMU-metrics.patch
|
||||
patches/0317-perf-metricgroup-Fix-for-metrics-containing-duration.patch
|
||||
patches/0318-perf-metricgroup-Fix-find_evsel_group-event-selector.patch
|
||||
patches/0319-ACPICA-Add-support-for-Arm-s-MPAM-ACPI-table-version.patch
|
||||
patches/0320-ACPICA-ACPI-6.4-PPTT-add-new-version-of-subtable-typ.patch
|
||||
patches/0321-ACPI-PPTT-Find-PPTT-processor-node-by-cache-id.patch
|
||||
patches/0322-ACPI-MPAM-Adapt-to-Arm-s-MPAM-ACPI-table-version-2.patch
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user