From: Gavin Shan <gshan@redhat.com>
To: Ben Horgan <ben.horgan@arm.com>
Cc: amitsinght@marvell.com, baisheng.gao@unisoc.com,
baolin.wang@linux.alibaba.com, carl@os.amperecomputing.com,
dave.martin@arm.com, david@kernel.org, dfustini@baylibre.com,
fenghuay@nvidia.com, james.morse@arm.com,
jonathan.cameron@huawei.com, kobak@nvidia.com,
lcherian@marvell.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, peternewman@google.com,
punit.agrawal@oss.qualcomm.com, quic_jiles@quicinc.com,
reinette.chatre@intel.com, rohit.mathew@arm.com,
scott@os.amperecomputing.com, sdonthineni@nvidia.com,
tan.shaopeng@fujitsu.com, xhao@linux.alibaba.com,
catalin.marinas@arm.com, will@kernel.org, corbet@lwn.net,
maz@kernel.org, oupton@kernel.org, joey.gouly@arm.com,
suzuki.poulose@arm.com, kvmarm@lists.linux.dev,
zengheng4@huawei.com, linux-doc@vger.kernel.org,
Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Subject: Re: [PATCH v6 35/40] arm_mpam: Add quirk framework
Date: Tue, 24 Mar 2026 13:56:57 +1000 [thread overview]
Message-ID: <b200eaf9-462e-4844-aaf6-2912b956af6c@redhat.com> (raw)
In-Reply-To: <20260313144617.3420416-36-ben.horgan@arm.com>
Hi Ben,
On 3/14/26 12:46 AM, Ben Horgan wrote:
> From: Shanker Donthineni <sdonthineni@nvidia.com>
>
> The MPAM specification includes the MPAMF_IIDR, which serves to uniquely
> identify the MSC implementation through a combination of implementer
> details, product ID, variant, and revision. Certain hardware issues/errata
> can be resolved using software workarounds.
>
> Introduce a quirk framework to allow workarounds to be enabled based on the
> MPAMF_IIDR value.
>
> Tested-by: Gavin Shan <gshan@redhat.com>
> Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
> Tested-by: Zeng Heng <zengheng4@huawei.com>
> Tested-by: Punit Agrawal <punit.agrawal@oss.qualcomm.com>
> Reviewed-by: Zeng Heng <zengheng4@huawei.com>
> Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
> Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
> Co-developed-by: James Morse <james.morse@arm.com>
> Signed-off-by: James Morse <james.morse@arm.com>
> Signed-off-by: Ben Horgan <ben.horgan@arm.com>
> ---
> Changes by James:
> Stash the IIDR so this doesn't need an IPI, enable quirks only
> once, move the description to the callback so it can be pr_once()d, add an
> enum of workarounds for popular errata. Add macros for making lists of
> product/revision/vendor half readable
>
> Changes since rfc:
> remove trailing commas in last element of enums
> Make mpam_enable_quirks() in charge of mpam_set_quirk() even if there
> is an enable.
>
> Changes since v3:
> Brackets in macro
> ---
> drivers/resctrl/mpam_devices.c | 32 ++++++++++++++++++++++++++++++++
> drivers/resctrl/mpam_internal.h | 25 +++++++++++++++++++++++++
> 2 files changed, 57 insertions(+)
>
With the following nitpicks addressed if another respin is needed. This
looks good to me in either way.
Reviewed-by: Gavin Shan <gshan@redhat.com>
> diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
> index 37b31a1cf376..e66631f3f732 100644
> --- a/drivers/resctrl/mpam_devices.c
> +++ b/drivers/resctrl/mpam_devices.c
> @@ -630,6 +630,30 @@ static struct mpam_msc_ris *mpam_get_or_create_ris(struct mpam_msc *msc,
> return ERR_PTR(-ENOENT);
> }
>
> +static const struct mpam_quirk mpam_quirks[] = {
> + { NULL } /* Sentinel */
> +};
> +
> +static void mpam_enable_quirks(struct mpam_msc *msc)
> +{
> + const struct mpam_quirk *quirk;
> +
> + for (quirk = &mpam_quirks[0]; quirk->iidr_mask; quirk++) {
> + int err = 0;
The initialization on @err is unnecessary if it's checked only when it's
updated (see below). The variable can be avoided.
> +
> + if (quirk->iidr != (msc->iidr & quirk->iidr_mask))
> + continue;
> +
> + if (quirk->init)
> + err = quirk->init(msc, quirk);
> +
> + if (err)
> + continue;
Since @err is only updated by quirk->init(), the following check would be done
only when it's updated. Something like below, @err isn't needed.
if (quirk->init && quirk->init(msc, quirk)
continue;
> +
> + mpam_set_quirk(quirk->workaround, msc);
> + }
> +}
> +
> /*
> * IHI009A.a has this nugget: "If a monitor does not support automatic behaviour
> * of NRDY, software can use this bit for any purpose" - so hardware might not
> @@ -864,8 +888,11 @@ static int mpam_msc_hw_probe(struct mpam_msc *msc)
> /* Grab an IDR value to find out how many RIS there are */
> mutex_lock(&msc->part_sel_lock);
> idr = mpam_msc_read_idr(msc);
> + msc->iidr = mpam_read_partsel_reg(msc, IIDR);
> mutex_unlock(&msc->part_sel_lock);
>
> + mpam_enable_quirks(msc);
> +
> msc->ris_max = FIELD_GET(MPAMF_IDR_RIS_MAX, idr);
>
> /* Use these values so partid/pmg always starts with a valid value */
> @@ -1972,6 +1999,7 @@ static bool mpam_has_cmax_wd_feature(struct mpam_props *props)
> * resulting safe value must be compatible with both. When merging values in
> * the tree, all the aliasing resources must be handled first.
> * On mismatch, parent is modified.
> + * Quirks on an MSC will apply to all MSC in that class.
> */
> static void __props_mismatch(struct mpam_props *parent,
> struct mpam_props *child, bool alias)
> @@ -2091,6 +2119,7 @@ static void __props_mismatch(struct mpam_props *parent,
> * nobble the class feature, as we can't configure all the resources.
> * e.g. The L3 cache is composed of two resources with 13 and 17 portion
> * bitmaps respectively.
> + * Quirks on an MSC will apply to all MSC in that class.
> */
> static void
> __class_props_mismatch(struct mpam_class *class, struct mpam_vmsc *vmsc)
> @@ -2104,6 +2133,9 @@ __class_props_mismatch(struct mpam_class *class, struct mpam_vmsc *vmsc)
> dev_dbg(dev, "Merging features for class:0x%lx &= vmsc:0x%lx\n",
> (long)cprops->features, (long)vprops->features);
>
> + /* Merge quirks */
> + class->quirks |= vmsc->msc->quirks;
> +
> /* Take the safe value for any common features */
> __props_mismatch(cprops, vprops, false);
> }
> diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h
> index ce9e0e0483fb..e28a168419d4 100644
> --- a/drivers/resctrl/mpam_internal.h
> +++ b/drivers/resctrl/mpam_internal.h
> @@ -85,6 +85,8 @@ struct mpam_msc {
> u8 pmg_max;
> unsigned long ris_idxs;
> u32 ris_max;
> + u32 iidr;
> + u16 quirks;
>
It maybe reasonable to have 'u32 quirks' so that 32 instead of 16 quirks can be
supported to the maximal degree. It's known 16 quirks are enough at the moment,
but it's likely to be extended for more space.
> /*
> * error_irq_lock is taken when registering/unregistering the error
> @@ -216,6 +218,28 @@ struct mpam_props {
> #define mpam_set_feature(_feat, x) __set_bit(_feat, (x)->features)
> #define mpam_clear_feature(_feat, x) __clear_bit(_feat, (x)->features)
>
> +/* Workaround bits for msc->quirks */
> +enum mpam_device_quirks {
> + MPAM_QUIRK_LAST
> +};
> +
> +#define mpam_has_quirk(_quirk, x) ((1 << (_quirk) & (x)->quirks))
> +#define mpam_set_quirk(_quirk, x) ((x)->quirks |= (1 << (_quirk)))
> +
> +struct mpam_quirk {
> + int (*init)(struct mpam_msc *msc, const struct mpam_quirk *quirk);
> +
> + u32 iidr;
> + u32 iidr_mask;
> +
> + enum mpam_device_quirks workaround;
> +};
> +
> +#define MPAM_IIDR_MATCH_ONE (FIELD_PREP_CONST(MPAMF_IIDR_PRODUCTID, 0xfff) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_VARIANT, 0xf) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_REVISION, 0xf) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_IMPLEMENTER, 0xfff))
> +
> /* The values for MSMON_CFG_MBWU_FLT.RWBW */
> enum mon_filter_options {
> COUNT_BOTH = 0,
> @@ -259,6 +283,7 @@ struct mpam_class {
>
> struct mpam_props props;
> u32 nrdy_usec;
> + u16 quirks;
As above, it would be "u32 quirks".
> u8 level;
> enum mpam_class_types type;
>
Thanks,
Gavin
next prev parent reply other threads:[~2026-03-24 3:57 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-13 14:45 [PATCH v6 00/40] arm_mpam: Add KVM/arm64 and resctrl glue code Ben Horgan
2026-03-13 14:45 ` [PATCH v6 01/40] arm_mpam: Ensure in_reset_state is false after applying configuration Ben Horgan
2026-03-17 17:22 ` Jonathan Cameron
2026-03-23 4:37 ` Gavin Shan
2026-03-27 15:42 ` James Morse
2026-03-13 14:45 ` [PATCH v6 02/40] arm_mpam: Reset when feature configuration bit unset Ben Horgan
2026-03-23 4:44 ` Gavin Shan
2026-03-27 16:21 ` James Morse
2026-03-13 14:45 ` [PATCH v6 03/40] arm64/sysreg: Add MPAMSM_EL1 register Ben Horgan
2026-03-13 14:45 ` [PATCH v6 04/40] KVM: arm64: Preserve host MPAM configuration when changing traps Ben Horgan
2026-03-13 14:45 ` [PATCH v6 05/40] KVM: arm64: Make MPAMSM_EL1 accesses UNDEF Ben Horgan
2026-03-13 14:45 ` [PATCH v6 06/40] arm64: mpam: Context switch the MPAM registers Ben Horgan
2026-03-13 14:45 ` [PATCH v6 07/40] arm64: mpam: Re-initialise MPAM regs when CPU comes online Ben Horgan
2026-03-13 14:45 ` [PATCH v6 08/40] arm64: mpam: Drop the CONFIG_EXPERT restriction Ben Horgan
2026-03-27 15:43 ` James Morse
2026-03-13 14:45 ` [PATCH v6 09/40] arm64: mpam: Advertise the CPUs MPAM limits to the driver Ben Horgan
2026-03-13 14:45 ` [PATCH v6 10/40] arm64: mpam: Add cpu_pm notifier to restore MPAM sysregs Ben Horgan
2026-03-13 14:45 ` [PATCH v6 11/40] arm64: mpam: Initialise and context switch the MPAMSM_EL1 register Ben Horgan
2026-03-27 15:44 ` James Morse
2026-03-13 14:45 ` [PATCH v6 12/40] arm64: mpam: Add helpers to change a task or cpu's MPAM PARTID/PMG values Ben Horgan
2026-03-13 14:45 ` [PATCH v6 13/40] KVM: arm64: Force guest EL1 to use user-space's partid configuration Ben Horgan
2026-03-13 14:45 ` [PATCH v6 14/40] arm_mpam: resctrl: Add boilerplate cpuhp and domain allocation Ben Horgan
2026-03-23 6:31 ` Gavin Shan
2026-03-23 10:13 ` Ben Horgan
2026-03-26 12:20 ` James Morse
2026-03-13 14:45 ` [PATCH v6 15/40] arm_mpam: resctrl: Pick the caches we will use as resctrl resources Ben Horgan
2026-03-23 6:37 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 16/40] arm_mpam: resctrl: Implement resctrl_arch_reset_all_ctrls() Ben Horgan
2026-03-23 6:41 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 17/40] arm_mpam: resctrl: Add resctrl_arch_get_config() Ben Horgan
2026-03-23 6:47 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 18/40] arm_mpam: resctrl: Implement helpers to update configuration Ben Horgan
2026-03-23 6:51 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 19/40] arm_mpam: resctrl: Add plumbing against arm64 task and cpu hooks Ben Horgan
2026-03-23 6:55 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 20/40] arm_mpam: resctrl: Add CDP emulation Ben Horgan
2026-03-23 22:35 ` Gavin Shan
2026-03-13 14:45 ` [PATCH v6 21/40] arm_mpam: resctrl: Hide CDP emulation behind CONFIG_EXPERT Ben Horgan
2026-03-18 11:04 ` Zeng Heng
2026-03-23 22:36 ` Gavin Shan
2026-03-27 15:44 ` James Morse
2026-03-13 14:45 ` [PATCH v6 22/40] arm_mpam: resctrl: Convert to/from MPAMs fixed-point formats Ben Horgan
2026-03-23 22:49 ` Gavin Shan
2026-03-27 15:47 ` James Morse
2026-03-13 14:46 ` [PATCH v6 23/40] arm_mpam: resctrl: Add rmid index helpers Ben Horgan
2026-03-23 22:50 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 24/40] arm_mpam: resctrl: Wait for cacheinfo to be ready Ben Horgan
2026-03-23 22:53 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 25/40] arm_mpam: resctrl: Add support for 'MB' resource Ben Horgan
2026-03-23 23:09 ` Gavin Shan
2026-03-27 15:47 ` James Morse
2026-03-13 14:46 ` [PATCH v6 26/40] arm_mpam: resctrl: Add kunit test for control format conversions Ben Horgan
2026-03-23 23:10 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 27/40] arm_mpam: resctrl: Add monitor initialisation and domain boilerplate Ben Horgan
2026-03-24 3:40 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 28/40] arm_mpam: resctrl: Add support for csu counters Ben Horgan
2026-03-24 3:40 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 29/40] arm_mpam: resctrl: Allow resctrl to allocate monitors Ben Horgan
2026-03-24 3:41 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 30/40] arm_mpam: resctrl: Add resctrl_arch_rmid_read() Ben Horgan
2026-03-24 3:41 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 31/40] arm_mpam: resctrl: Update the rmid reallocation limit Ben Horgan
2026-03-24 3:42 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 32/40] arm_mpam: resctrl: Add empty definitions for assorted resctrl functions Ben Horgan
2026-03-24 3:42 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 33/40] arm64: mpam: Select ARCH_HAS_CPU_RESCTRL Ben Horgan
2026-03-24 3:42 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 34/40] arm_mpam: resctrl: Call resctrl_init() on platforms that can support resctrl Ben Horgan
2026-03-24 3:43 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 35/40] arm_mpam: Add quirk framework Ben Horgan
2026-03-24 3:56 ` Gavin Shan [this message]
2026-03-13 14:46 ` [PATCH v6 36/40] arm_mpam: Add workaround for T241-MPAM-1 Ben Horgan
2026-03-24 4:16 ` Gavin Shan
2026-03-27 15:48 ` James Morse
2026-03-13 14:46 ` [PATCH v6 37/40] arm_mpam: Add workaround for T241-MPAM-4 Ben Horgan
2026-03-24 4:19 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 38/40] arm_mpam: Add workaround for T241-MPAM-6 Ben Horgan
2026-03-24 4:20 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 39/40] arm_mpam: Quirk CMN-650's CSU NRDY behaviour Ben Horgan
2026-03-24 4:21 ` Gavin Shan
2026-03-13 14:46 ` [PATCH v6 40/40] arm64: mpam: Add initial MPAM documentation Ben Horgan
2026-03-24 6:04 ` Gavin Shan
2026-03-17 0:25 ` [PATCH v6 00/40] arm_mpam: Add KVM/arm64 and resctrl glue code Jesse Chick
2026-03-18 10:22 ` Ben Horgan
2026-03-18 8:09 ` Shaopeng Tan (Fujitsu)
2026-03-18 10:23 ` Ben Horgan
2026-03-23 4:41 ` Gavin Shan
2026-03-24 10:09 ` Ben Horgan
2026-04-01 23:56 ` Fenghua Yu
2026-04-13 14:31 ` Ben Horgan
2026-04-02 23:38 ` Rose, Charles
2026-04-13 14:32 ` Ben Horgan
2026-04-13 14:41 ` Ben Horgan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b200eaf9-462e-4844-aaf6-2912b956af6c@redhat.com \
--to=gshan@redhat.com \
--cc=amitsinght@marvell.com \
--cc=baisheng.gao@unisoc.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=ben.horgan@arm.com \
--cc=carl@os.amperecomputing.com \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=dave.martin@arm.com \
--cc=david@kernel.org \
--cc=dfustini@baylibre.com \
--cc=fenghuay@nvidia.com \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=jonathan.cameron@huawei.com \
--cc=kobak@nvidia.com \
--cc=kvmarm@lists.linux.dev \
--cc=lcherian@marvell.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=peternewman@google.com \
--cc=punit.agrawal@oss.qualcomm.com \
--cc=quic_jiles@quicinc.com \
--cc=reinette.chatre@intel.com \
--cc=rohit.mathew@arm.com \
--cc=scott@os.amperecomputing.com \
--cc=sdonthineni@nvidia.com \
--cc=suzuki.poulose@arm.com \
--cc=tan.shaopeng@fujitsu.com \
--cc=tan.shaopeng@jp.fujitsu.com \
--cc=will@kernel.org \
--cc=xhao@linux.alibaba.com \
--cc=zengheng4@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.