From ef5e3cfd0c6a0f88c722a8ac6fcea6872c5542cb Mon Sep 17 00:00:00 2001 From: Zeng Heng Date: Fri, 8 Aug 2025 11:11:56 +0800 Subject: [PATCH] arm64/mpam: Support partial-core boot for MPAM hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ICRZPF -------------------------------- L2 shares the same power domain with its associated CPUs. Therefore, in scenarios where only partial cores power up, the L2 MSCs belonging to the un-powered cores should not access, otherwise bus-access fault would occur. During initialization of class->props, skip any L2 MSC that is not powered, so that ensure the class->props member unaffected from uninitialized ris->props in mpam_enable_merge_features(). Signed-off-by: Zeng Heng --- drivers/platform/mpam/mpam_devices.c | 22 ++++++++++++++-------- drivers/platform/mpam/mpam_internal.h | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/platform/mpam/mpam_devices.c b/drivers/platform/mpam/mpam_devices.c index 19e2153652eb..7f8fa47a9ac3 100644 --- a/drivers/platform/mpam/mpam_devices.c +++ b/drivers/platform/mpam/mpam_devices.c @@ -1529,8 +1529,11 @@ static int mpam_discovery_cpu_online(unsigned int cpu) mutex_lock(&mpam_list_lock); list_for_each_entry(msc, &mpam_all_msc, glbl_list) { - if (!cpumask_test_cpu(cpu, &msc->accessibility)) + if (!cpumask_test_cpu(cpu, &msc->accessibility)) { + msc->probed = true; + msc->skipped = true; continue; + } mutex_lock(&msc->lock); if (!msc->probed) @@ -1946,14 +1949,14 @@ static void mpam_enable_init_class_features(struct mpam_class *class) struct mpam_msc_ris *ris; struct mpam_component *comp; - comp = list_first_entry_or_null(&class->components, - struct mpam_component, class_list); - if (WARN_ON(!comp)) - return; + list_for_each_entry(comp, &class->components, class_list) { + list_for_each_entry(ris, &comp->ris, comp_list) { + if (!ris->msc->skipped) + break; + } + } - ris = list_first_entry_or_null(&comp->ris, - struct mpam_msc_ris, comp_list); - if (WARN_ON(!ris)) + if (WARN_ON(!comp) || WARN_ON(!ris)) return; class->props = ris->props; @@ -1973,6 +1976,9 @@ static void mpam_enable_merge_features(void) list_for_each_entry(comp, &class->components, class_list) { list_for_each_entry(ris, &comp->ris, comp_list) { + if (ris->msc->skipped) + continue; + __resource_props_mismatch(ris, class); class->nrdy_usec = max(class->nrdy_usec, diff --git a/drivers/platform/mpam/mpam_internal.h b/drivers/platform/mpam/mpam_internal.h index ff1890b3a78e..94872c0930a6 100644 --- a/drivers/platform/mpam/mpam_internal.h +++ b/drivers/platform/mpam/mpam_internal.h @@ -55,6 +55,7 @@ struct mpam_msc struct mutex lock; bool probed; + bool skipped; bool error_irq_requested; bool error_irq_hw_enabled; u16 partid_max; -- Gitee