[RFC PATCH 03/10] arm_mpam: Carry cmax and cmin in mpam_config

From: Jinjie Ruan

Date: Thu Oct 22 2026 - 22:55:47 EST


Add cmax and cmin to mpam_config so the capacity hard and soft limits
can be programmed per PARTID through resctrl.

mpam_reprogram_ris_partid() writes the config's cmax/cmin when their
feature bits are set, and falls back to the reset values otherwise. The
local cmax reset value is no longer needed.

Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
---
drivers/resctrl/mpam_devices.c | 19 ++++++++++++++-----
drivers/resctrl/mpam_internal.h | 2 ++
2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
index 806bf61b6dbe..f5ac427a0100 100644
--- a/drivers/resctrl/mpam_devices.c
+++ b/drivers/resctrl/mpam_devices.c
@@ -1553,7 +1553,6 @@ static u16 mpam_wa_t241_calc_min_from_max(struct mpam_props *props,
static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid,
struct mpam_config *cfg)
{
- u16 cmax = MPAMCFG_CMAX_CMAX;
struct mpam_msc *msc = ris->vmsc->msc;
struct mpam_props *rprops = &ris->props;

@@ -1621,11 +1620,19 @@ static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid,
if (mpam_has_feature(mpam_feat_mbw_prop, rprops))
mpam_write_partsel_reg(msc, MBW_PROP, 0);

- if (mpam_has_feature(mpam_feat_cmax_cmax, rprops))
- mpam_write_partsel_reg(msc, CMAX, cmax);
+ if (mpam_has_feature(mpam_feat_cmax_cmax, rprops)) {
+ if (mpam_has_feature(mpam_feat_cmax_cmax, cfg))
+ mpam_write_partsel_reg(msc, CMAX, cfg->cmax);
+ else
+ mpam_write_partsel_reg(msc, CMAX, MPAMCFG_CMAX_CMAX);
+ }

- if (mpam_has_feature(mpam_feat_cmax_cmin, rprops))
- mpam_write_partsel_reg(msc, CMIN, 0);
+ if (mpam_has_feature(mpam_feat_cmax_cmin, rprops)) {
+ if (mpam_has_feature(mpam_feat_cmax_cmin, cfg))
+ mpam_write_partsel_reg(msc, CMIN, cfg->cmin);
+ else
+ mpam_write_partsel_reg(msc, CMIN, 0);
+ }

if (mpam_has_feature(mpam_feat_cmax_cassoc, rprops))
mpam_write_partsel_reg(msc, CASSOC, MPAMCFG_CASSOC_CASSOC);
@@ -2939,6 +2946,8 @@ static bool mpam_update_config(struct mpam_config *cfg,
maybe_update_config(cfg, mpam_feat_mbw_max, newcfg, mbw_max, has_changes);
maybe_update_config(cfg, mpam_feat_mbw_min, newcfg, mbw_min, has_changes);
maybe_update_config(cfg, mpam_feat_max_limit, newcfg, max_limit, has_changes);
+ maybe_update_config(cfg, mpam_feat_cmax_cmax, newcfg, cmax, has_changes);
+ maybe_update_config(cfg, mpam_feat_cmax_cmin, newcfg, cmin, has_changes);

return has_changes;
}
diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h
index f5efebde3c2c..77f643cef28d 100644
--- a/drivers/resctrl/mpam_internal.h
+++ b/drivers/resctrl/mpam_internal.h
@@ -321,6 +321,8 @@ struct mpam_config {
u16 mbw_max;
u16 mbw_min;
bool max_limit;
+ u16 cmax;
+ u16 cmin;

struct mpam_garbage garbage;
};
--
2.34.1