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>
pull/1250/head
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 ARCH_HAS_ELFCORE_COMPAT
select ZONE_DMA32 select ZONE_DMA32
select EXECMEM if DYNAMIC_FTRACE select EXECMEM if DYNAMIC_FTRACE
select ACPI_MRRM if ACPI
config FORCE_DYNAMIC_FTRACE config FORCE_DYNAMIC_FTRACE
def_bool y 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 Enable this feature if you want to set up and install the FFH Address
Space handler to handle FFH OpRegion in the firmware. Space handler to handle FFH OpRegion in the firmware.
config ACPI_MRRM
bool
source "drivers/acpi/pmic/Kconfig" source "drivers/acpi/pmic/Kconfig"
config ACPI_VIOT 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_PRMT) += prmt.o
acpi-$(CONFIG_ACPI_PCC) += acpi_pcc.o acpi-$(CONFIG_ACPI_PCC) += acpi_pcc.o
acpi-$(CONFIG_ACPI_FFH) += acpi_ffh.o acpi-$(CONFIG_ACPI_FFH) += acpi_ffh.o
acpi-$(CONFIG_ACPI_MRRM) += acpi_mrrm.o
# Address translation # Address translation
acpi-$(CONFIG_ACPI_ADXL) += acpi_adxl.o 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); int acpi_get_local_address(acpi_handle handle, u32 *addr);
const char *acpi_get_subsystem_id(acpi_handle handle); const char *acpi_get_subsystem_id(acpi_handle handle);
#ifdef CONFIG_ACPI_MRRM
int acpi_mrrm_max_mem_region(void);
#endif
#else /* !CONFIG_ACPI */ #else /* !CONFIG_ACPI */
#define acpi_disabled 1 #define acpi_disabled 1
@ -1092,6 +1096,11 @@ static inline acpi_handle acpi_get_processor_handle(int cpu)
return NULL; return NULL;
} }
static inline int acpi_mrrm_max_mem_region(void)
{
return -ENOENT;
}
#endif /* !CONFIG_ACPI */ #endif /* !CONFIG_ACPI */
#ifdef CONFIG_ACPI_HMAT #ifdef CONFIG_ACPI_HMAT