Re: [PATCH v3 06/29] ACPI / MPAM: Parse the MPAM table
From: Ben Horgan <ben.horgan@arm.com>
Date: 2025-10-20 12:29:16
Also in:
linux-acpi, lkml
Hi James, On 10/17/25 19:56, James Morse wrote:
Add code to parse the arm64 specific MPAM table, looking up the cache level from the PPTT and feeding the end result into the MPAM driver. This happens in two stages. Platform devices are created first for the MSC devices. Once the driver probes it calls acpi_mpam_parse_resources() to discover the RIS entries the MSC contains. For now the MPAM hook mpam_ris_create() is stubbed out, but will update the MPAM driver with optional discovered data about the RIS entries. CC: Carl Worth <redacted> Link: https://developer.arm.com/documentation/den0065/3-0bet/?lang=en Reviewed-by: Lorenzo Pieralisi <lpieralisi@kernel.org> Tested-by: Fenghua Yu <fenghuay@nvidia.com> Signed-off-by: James Morse <james.morse@arm.com> --- Changes since v2: * Expanded commit message. * Moved explicit memset() to array initialisation. * Added comments on the sizing of arrays. * Moved MSC table entry parsing to a helper to allow use of a platform-device cleanup rune, result int more returns and fewer breaks. * Changed pre-processor macros for table bits. * Discover unsupported PPI partitions purely from the table to make gicv5 easier, which also simplifies acpi_mpam_parse_irqs() * Gave interface type numbers pre-processor names. * Clarified some comments. * Fixed the WARN_ON comparison in acpi_mpam_parse_msc(). * Made buffer over-run noisier. * Print an error condition as %d not %u. * Print a debug message when bad NUMA nodes are found.
[...]
quoted hunk ↗ jump to hunk
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index a9dbacabdf89..9d66421f68ff 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h@@ -8,6 +8,7 @@ #ifndef _LINUX_ACPI_H #define _LINUX_ACPI_H +#include <linux/cleanup.h> #include <linux/errno.h> #include <linux/ioport.h> /* for struct resource */ #include <linux/resource_ext.h>@@ -221,6 +222,17 @@ void acpi_reserve_initial_tables (void); void acpi_table_init_complete (void); int acpi_table_init (void); +static inline struct acpi_table_header *acpi_get_table_ret(char *signature, u32 instance) +{ + struct acpi_table_header *table; + int status = acpi_get_table(signature, instance, &table); + + if (ACPI_FAILURE(status)) + return ERR_PTR(-ENOENT); + return table; +} +DEFINE_FREE(acpi_table, struct acpi_table_header *, if (!IS_ERR(_T)) acpi_put_table(_T))
Any reason to not change this to !IS_ERR_OR_NULL(_T) as Jonathan suggested in his v2 review.
quoted hunk ↗ jump to hunk
+ int acpi_table_parse(char *id, acpi_tbl_table_handler handler); int __init_or_acpilib acpi_table_parse_entries(char *id, unsigned long table_size, int entry_id,diff --git a/include/linux/arm_mpam.h b/include/linux/arm_mpam.h new file mode 100644 index 000000000000..3d6c39c667c3 --- /dev/null +++ b/include/linux/arm_mpam.h@@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) 2025 Arm Ltd. */ + +#ifndef __LINUX_ARM_MPAM_H +#define __LINUX_ARM_MPAM_H + +#include <linux/acpi.h> +#include <linux/types.h> + +#define GLOBAL_AFFINITY ~0 + +struct mpam_msc; + +enum mpam_msc_iface { + MPAM_IFACE_MMIO, /* a real MPAM MSC */ + MPAM_IFACE_PCC, /* a fake MPAM MSC */ +}; + +enum mpam_class_types { + MPAM_CLASS_CACHE, /* Well known caches, e.g. L2 */ + MPAM_CLASS_MEMORY, /* Main memory */ + MPAM_CLASS_UNKNOWN, /* Everything else, e.g. SMMU */ +}; + +#ifdef CONFIG_ACPI_MPAM +/* Parse the ACPI description of resources entries for this MSC. */ +int acpi_mpam_parse_resources(struct mpam_msc *msc, + struct acpi_mpam_msc_node *tbl_msc); + +int acpi_mpam_count_msc(void); +#else +static inline int acpi_mpam_parse_resources(struct mpam_msc *msc, + struct acpi_mpam_msc_node *tbl_msc) +{ + return -EINVAL; +} + +static inline int acpi_mpam_count_msc(void) { return -EINVAL; } +#endif + +static inline int mpam_ris_create(struct mpam_msc *msc, u8 ris_idx, + enum mpam_class_types type, u8 class_id, + int component_id) +{ + return -EINVAL; +} + +#endif /* __LINUX_ARM_MPAM_H */diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 074754c23d33..23a30ada2d4c 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h@@ -232,6 +232,7 @@ extern int platform_device_add_data(struct platform_device *pdev, extern int platform_device_add(struct platform_device *pdev); extern void platform_device_del(struct platform_device *pdev); extern void platform_device_put(struct platform_device *pdev); +DEFINE_FREE(platform_device_put, struct platform_device *, if (_T) platform_device_put(_T))
Significant enough to be mentioned in the commit message? This DEFINE_FREE is named after the free-ing function, platform_device_put, whereas the previous DEFINE_FREE in this patch is named after the struct, acpi_table. On grepping I see both naming schemes - not sure if there is a recommendation for new code.
struct platform_driver {
int (*probe)(struct platform_device *);Thanks, Ben