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 36/40] arm_mpam: Add workaround for T241-MPAM-1
Date: Tue, 24 Mar 2026 14:16:58 +1000 [thread overview]
Message-ID: <7b73d10e-4bfd-434f-b05f-25c4859a7abd@redhat.com> (raw)
In-Reply-To: <20260313144617.3420416-37-ben.horgan@arm.com>
Hi Ben,
On 3/14/26 12:46 AM, Ben Horgan wrote:
> From: Shanker Donthineni <sdonthineni@nvidia.com>
>
> The MPAM bandwidth partitioning controls will not be correctly configured,
> and hardware will retain default configuration register values, meaning
> generally that bandwidth will remain unprovisioned.
>
> To address the issue, follow the below steps after updating the MBW_MIN
> and/or MBW_MAX registers.
>
> - Perform 64b reads from all 12 bridge MPAM shadow registers at offsets
> (0x360048 + slice*0x10000 + partid*8). These registers are read-only.
> - Continue iterating until all 12 shadow register values match in a loop.
> pr_warn_once if the values fail to match within the loop count 1000.
> - Perform 64b writes with the value 0x0 to the two spare registers at
> offsets 0x1b0000 and 0x1c0000.
>
> In the hardware, writes to the MPAMCFG_MBW_MAX MPAMCFG_MBW_MIN registers
> are transformed into broadcast writes to the 12 shadow registers. The
> final two writes to the spare registers cause a final rank of downstream
> micro-architectural MPAM registers to be updated from the shadow copies.
> The intervening loop to read the 12 shadow registers helps avoid a race
> condition where writes to the spare registers occur before all shadow
> registers have been updated.
>
> Tested-by: Gavin Shan <gshan@redhat.com>
> Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
> Reviewed-by: Zeng Heng <zengheng4@huawei.com>
> Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
> Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
> Signed-off-by: James Morse <james.morse@arm.com>
> Signed-off-by: Ben Horgan <ben.horgan@arm.com>
> ---
>
> Changes from James:
> Merged the min/max update into a single
> mpam_quirk_post_config_change() helper. Stashed the t241_id in the msc
> instead of carrying the physical address around. Test the msc quirk bit
> instead of a static key.
>
> Changes since rfc:
> MPAM_IIDR_NVIDIA_T421 -> MPAM_IIDR_NVIDIA_T241
> return err from init
> Be specific about the errata in the init name,
> mpam_enable_quirk_nvidia_t241 -> mpam_enable_quirk_nvidia_t241_1
>
> Changes since v3:
> parentheses
> ---
> Documentation/arch/arm64/silicon-errata.rst | 2 +
> drivers/resctrl/mpam_devices.c | 88 +++++++++++++++++++++
> drivers/resctrl/mpam_internal.h | 9 +++
> 3 files changed, 99 insertions(+)
>
One question below.
Reviewed-by: Gavin Shan <gshan@redhat.com>
> diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
> index 4c300caad901..a65620f98e3a 100644
> --- a/Documentation/arch/arm64/silicon-errata.rst
> +++ b/Documentation/arch/arm64/silicon-errata.rst
> @@ -247,6 +247,8 @@ stable kernels.
> +----------------+-----------------+-----------------+-----------------------------+
> | NVIDIA | T241 GICv3/4.x | T241-FABRIC-4 | N/A |
> +----------------+-----------------+-----------------+-----------------------------+
> +| NVIDIA | T241 MPAM | T241-MPAM-1 | N/A |
> ++----------------+-----------------+-----------------+-----------------------------+
> +----------------+-----------------+-----------------+-----------------------------+
> | Freescale/NXP | LS2080A/LS1043A | A-008585 | FSL_ERRATUM_A008585 |
> +----------------+-----------------+-----------------+-----------------------------+
> diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
> index e66631f3f732..b1753498f07f 100644
> --- a/drivers/resctrl/mpam_devices.c
> +++ b/drivers/resctrl/mpam_devices.c
> @@ -29,6 +29,16 @@
>
> #include "mpam_internal.h"
>
> +/* Values for the T241 errata workaround */
> +#define T241_CHIPS_MAX 4
> +#define T241_CHIP_NSLICES 12
> +#define T241_SPARE_REG0_OFF 0x1b0000
> +#define T241_SPARE_REG1_OFF 0x1c0000
> +#define T241_CHIP_ID(phys) FIELD_GET(GENMASK_ULL(44, 43), phys)
> +#define T241_SHADOW_REG_OFF(sidx, pid) (0x360048 + (sidx) * 0x10000 + (pid) * 8)
> +#define SMCCC_SOC_ID_T241 0x036b0241
> +static void __iomem *t241_scratch_regs[T241_CHIPS_MAX];
> +
> /*
> * mpam_list_lock protects the SRCU lists when writing. Once the
> * mpam_enabled key is enabled these lists are read-only,
> @@ -630,7 +640,45 @@ static struct mpam_msc_ris *mpam_get_or_create_ris(struct mpam_msc *msc,
> return ERR_PTR(-ENOENT);
> }
>
> +static int mpam_enable_quirk_nvidia_t241_1(struct mpam_msc *msc,
> + const struct mpam_quirk *quirk)
> +{
> + s32 soc_id = arm_smccc_get_soc_id_version();
> + struct resource *r;
> + phys_addr_t phys;
> +
> + /*
> + * A mapping to a device other than the MSC is needed, check
> + * SOC_ID is NVIDIA T241 chip (036b:0241)
> + */
> + if (soc_id < 0 || soc_id != SMCCC_SOC_ID_T241)
> + return -EINVAL;
> +
> + r = platform_get_resource(msc->pdev, IORESOURCE_MEM, 0);
> + if (!r)
> + return -EINVAL;
> +
> + /* Find the internal registers base addr from the CHIP ID */
> + msc->t241_id = T241_CHIP_ID(r->start);
> + phys = FIELD_PREP(GENMASK_ULL(45, 44), msc->t241_id) | 0x19000000ULL;
> +
> + t241_scratch_regs[msc->t241_id] = ioremap(phys, SZ_8M);
> + if (WARN_ON_ONCE(!t241_scratch_regs[msc->t241_id]))
> + return -EINVAL;
Those IO regions aren't unmapped when the MSCs are removed. I guess it would be
something to be improved? :-)
> +
> + pr_info_once("Enabled workaround for NVIDIA T241 erratum T241-MPAM-1\n");
> +
> + return 0;
> +}
> +
> static const struct mpam_quirk mpam_quirks[] = {
> + {
> + /* NVIDIA t241 erratum T241-MPAM-1 */
> + .init = mpam_enable_quirk_nvidia_t241_1,
> + .iidr = MPAM_IIDR_NVIDIA_T241,
> + .iidr_mask = MPAM_IIDR_MATCH_ONE,
> + .workaround = T241_SCRUB_SHADOW_REGS,
Perhaps we need a more leading space for every line in the above block.
> + },
> { NULL } /* Sentinel */
> };
>
> @@ -1378,6 +1426,44 @@ static void mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd)
> __mpam_write_reg(msc, reg, bm);
> }
>
> +static void mpam_apply_t241_erratum(struct mpam_msc_ris *ris, u16 partid)
> +{
> + int sidx, i, lcount = 1000;
> + void __iomem *regs;
> + u64 val0, val;
> +
> + regs = t241_scratch_regs[ris->vmsc->msc->t241_id];
> +
> + for (i = 0; i < lcount; i++) {
> + /* Read the shadow register at index 0 */
> + val0 = readq_relaxed(regs + T241_SHADOW_REG_OFF(0, partid));
> +
> + /* Check if all the shadow registers have the same value */
> + for (sidx = 1; sidx < T241_CHIP_NSLICES; sidx++) {
> + val = readq_relaxed(regs +
> + T241_SHADOW_REG_OFF(sidx, partid));
> + if (val != val0)
> + break;
> + }
> + if (sidx == T241_CHIP_NSLICES)
> + break;
> + }
> +
> + if (i == lcount)
> + pr_warn_once("t241: inconsistent values in shadow regs");
> +
> + /* Write a value zero to spare registers to take effect of MBW conf */
> + writeq_relaxed(0, regs + T241_SPARE_REG0_OFF);
> + writeq_relaxed(0, regs + T241_SPARE_REG1_OFF);
> +}
> +
> +static void mpam_quirk_post_config_change(struct mpam_msc_ris *ris, u16 partid,
> + struct mpam_config *cfg)
> +{
> + if (mpam_has_quirk(T241_SCRUB_SHADOW_REGS, ris->vmsc->msc))
> + mpam_apply_t241_erratum(ris, partid);
> +}
> +
> /* Called via IPI. Call while holding an SRCU reference */
> static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid,
> struct mpam_config *cfg)
> @@ -1457,6 +1543,8 @@ static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid,
> mpam_write_partsel_reg(msc, PRI, pri_val);
> }
>
> + mpam_quirk_post_config_change(ris, partid, cfg);
> +
> mutex_unlock(&msc->part_sel_lock);
> }
>
> diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h
> index e28a168419d4..e38954a735d8 100644
> --- a/drivers/resctrl/mpam_internal.h
> +++ b/drivers/resctrl/mpam_internal.h
> @@ -130,6 +130,9 @@ struct mpam_msc {
> void __iomem *mapped_hwpage;
> size_t mapped_hwpage_sz;
>
> + /* Values only used on some platforms for quirks */
> + u32 t241_id;
> +
> struct mpam_garbage garbage;
> };
>
> @@ -220,6 +223,7 @@ struct mpam_props {
>
> /* Workaround bits for msc->quirks */
> enum mpam_device_quirks {
> + T241_SCRUB_SHADOW_REGS,
> MPAM_QUIRK_LAST
> };
>
> @@ -240,6 +244,11 @@ struct mpam_quirk {
> FIELD_PREP_CONST(MPAMF_IIDR_REVISION, 0xf) | \
> FIELD_PREP_CONST(MPAMF_IIDR_IMPLEMENTER, 0xfff))
>
> +#define MPAM_IIDR_NVIDIA_T241 (FIELD_PREP_CONST(MPAMF_IIDR_PRODUCTID, 0x241) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_VARIANT, 0) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_REVISION, 0) | \
> + FIELD_PREP_CONST(MPAMF_IIDR_IMPLEMENTER, 0x36b))
> +
> /* The values for MSMON_CFG_MBWU_FLT.RWBW */
> enum mon_filter_options {
> COUNT_BOTH = 0,
Thanks,
Gavin
next prev parent reply other threads:[~2026-03-24 4:17 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
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 [this message]
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=7b73d10e-4bfd-434f-b05f-25c4859a7abd@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.