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: 99+ 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-09-09 8:51 ` Jinjie Ruan
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-09-11 6:44 ` Jinjie Ruan
2026-09-11 8:16 ` Ben Horgan
2026-03-13 14:45 ` [PATCH v6 03/40] arm64/sysreg: Add MPAMSM_EL1 register Ben Horgan
2026-09-09 8:37 ` Jinjie Ruan
2026-03-13 14:45 ` [PATCH v6 04/40] KVM: arm64: Preserve host MPAM configuration when changing traps Ben Horgan
2026-09-11 8:19 ` Jinjie Ruan
2026-03-13 14:45 ` [PATCH v6 05/40] KVM: arm64: Make MPAMSM_EL1 accesses UNDEF Ben Horgan
2026-09-11 8:20 ` Jinjie Ruan
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®