ACPI: MRRM: Minimal parse of ACPI MRRM table

The resctrl file system code needs to know how many region tags
are supported. Parse the ACPI MRRM table and save the max_mem_region
value.

Provide a function for resctrl to collect that value.

Signed-off-by: Tony Luck <tony.luck@intel.com>
Link: https://patch.msgid.link/20250505173819.419271-2-tony.luck@intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Tony Luck 2025-05-05 10:38:17 -07:00 committed by Rafael J. Wysocki
parent fec2686d4d
commit b9020bdb9f
5 changed files with 56 additions and 0 deletions

View file

@ -38,6 +38,7 @@ config X86_64
select ARCH_HAS_ELFCORE_COMPAT
select ZONE_DMA32
select EXECMEM if DYNAMIC_FTRACE
select ACPI_MRRM if ACPI
config FORCE_DYNAMIC_FTRACE
def_bool y

View file

@ -576,6 +576,9 @@ config ACPI_FFH
Enable this feature if you want to set up and install the FFH Address
Space handler to handle FFH OpRegion in the firmware.
config ACPI_MRRM
bool
source "drivers/acpi/pmic/Kconfig"
config ACPI_VIOT

View file

@ -66,6 +66,7 @@ acpi-$(CONFIG_ACPI_WATCHDOG) += acpi_watchdog.o
acpi-$(CONFIG_ACPI_PRMT) += prmt.o
acpi-$(CONFIG_ACPI_PCC) += acpi_pcc.o
acpi-$(CONFIG_ACPI_FFH) += acpi_ffh.o
acpi-$(CONFIG_ACPI_MRRM) += acpi_mrrm.o
# Address translation
acpi-$(CONFIG_ACPI_ADXL) += acpi_adxl.o

42
drivers/acpi/acpi_mrrm.c Normal file
View file

@ -0,0 +1,42 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2025, Intel Corporation.
*
* Memory Range and Region Mapping (MRRM) structure
*/
#define pr_fmt(fmt) "acpi/mrrm: " fmt
#include <linux/acpi.h>
#include <linux/init.h>
static int max_mem_region = -ENOENT;
/* Access for use by resctrl file system */
int acpi_mrrm_max_mem_region(void)
{
return max_mem_region;
}
static __init int acpi_parse_mrrm(struct acpi_table_header *table)
{
struct acpi_table_mrrm *mrrm;
mrrm = (struct acpi_table_mrrm *)table;
if (!mrrm)
return -ENODEV;
max_mem_region = mrrm->max_mem_region;
return 0;
}
static __init int mrrm_init(void)
{
int ret;
ret = acpi_table_parse(ACPI_SIG_MRRM, acpi_parse_mrrm);
return ret;
}
device_initcall(mrrm_init);

View file

@ -772,6 +772,10 @@ int acpi_get_local_u64_address(acpi_handle handle, u64 *addr);
int acpi_get_local_address(acpi_handle handle, u32 *addr);
const char *acpi_get_subsystem_id(acpi_handle handle);
#ifdef CONFIG_ACPI_MRRM
int acpi_mrrm_max_mem_region(void);
#endif
#else /* !CONFIG_ACPI */
#define acpi_disabled 1
@ -1092,6 +1096,11 @@ static inline acpi_handle acpi_get_processor_handle(int cpu)
return NULL;
}
static inline int acpi_mrrm_max_mem_region(void)
{
return -ENOENT;
}
#endif /* !CONFIG_ACPI */
#ifdef CONFIG_ACPI_HMAT