From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4A6063002A8 for ; Tue, 9 Dec 2025 17:06:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765300009; cv=none; b=rjPUwIPKtYWqknsqdB9z0HXfqz18e3S+Kzy/qvHZXACCzwRG2ze4tevM6JtKY5Gb6VNnc3t1ZzB6tE1oaa0MMPDF0UK+jSWcxXpatAsoH7CPa5DvHKlwSFXvZrc5ZH857nJZMNM9y+8to72VrR1/cunmcqNI692x3BgT3lYYz3U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765300009; c=relaxed/simple; bh=2n8LkNYNBFFoKieIf6OPT+mU/S6/pRLpAiuigkltgHk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=gGxXtAmIqoFal2bQ2roeCMioBTgbDWK1bHXlLHaqsWMXvpjk7hW9a32+m5F8HbKNkcDR03JBU1aWZi3P8E4HGbNo54b7pZ8E+pB4HT4NLAG3iC6rae65Kw9L6v3iPG3UdTlgvIo2eYYiOy2dJTXNIXqQHTMhXjqIadxfQMPvz4w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3466C175D; Tue, 9 Dec 2025 09:06:39 -0800 (PST) Received: from [10.1.196.46] (e134344.arm.com [10.1.196.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0FBB93F762; Tue, 9 Dec 2025 09:06:42 -0800 (PST) Message-ID: <1562cbdd-f50c-4890-8b41-2987490ea384@arm.com> Date: Tue, 9 Dec 2025 17:06:41 +0000 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH 37/38] arm_mpam: Add workaround for T241-MPAM-6 To: James Morse , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: D Scott Phillips OS , carl@os.amperecomputing.com, lcherian@marvell.com, bobo.shaobowang@huawei.com, tan.shaopeng@fujitsu.com, baolin.wang@linux.alibaba.com, Jamie Iles , Xin Hao , peternewman@google.com, dfustini@baylibre.com, amitsinght@marvell.com, David Hildenbrand , Dave Martin , Koba Ko , Shanker Donthineni , fenghuay@nvidia.com, baisheng.gao@unisoc.com, Jonathan Cameron , Gavin Shan , rohit.mathew@arm.com, reinette.chatre@intel.com, Punit Agrawal References: <20251205215901.17772-1-james.morse@arm.com> <20251205215901.17772-38-james.morse@arm.com> From: Ben Horgan Content-Language: en-US In-Reply-To: <20251205215901.17772-38-james.morse@arm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi James, Shanker, On 12/5/25 21:59, James Morse wrote: > From: Shanker Donthineni > > The registers MSMON_MBWU_L and MSMON_MBWU return the number of > requests rather than the number of bytes transferred. > > Bandwidth resource monitoring is performed at the last level cache, > where each request arrive in 64Byte granularity. The current > implementation returns the number of transactions received at the > last level cache but does not provide the value in bytes. Scaling > by 64 gives an accurate byte count to match the MPAM specification > for the MSMON_MBWU and MSMON_MBWU_L registers. This patch fixes > the issue by reporting the actual number of bytes instead of the > number of transactions from __ris_msmon_read(). > > Signed-off-by: Shanker Donthineni > Signed-off-by: James Morse > --- > Documentation/arch/arm64/silicon-errata.rst | 2 ++ > drivers/resctrl/mpam_devices.c | 24 +++++++++++++++++++-- > drivers/resctrl/mpam_internal.h | 1 + > 3 files changed, 25 insertions(+), 2 deletions(-) > > diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst > index b18bc704d4a1..e810b2a8f40e 100644 > --- a/Documentation/arch/arm64/silicon-errata.rst > +++ b/Documentation/arch/arm64/silicon-errata.rst > @@ -250,6 +250,8 @@ stable kernels. > +----------------+-----------------+-----------------+-----------------------------+ > | NVIDIA | T241 MPAM | T241-MPAM-4 | N/A | > +----------------+-----------------+-----------------+-----------------------------+ > +| NVIDIA | T241 MPAM | T241-MPAM-6 | 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 5ba0aa703807..c17a6fdea982 100644 > --- a/drivers/resctrl/mpam_devices.c > +++ b/drivers/resctrl/mpam_devices.c > @@ -684,6 +684,12 @@ static const struct mpam_quirk mpam_quirks[] = { > .iidr_mask = MPAM_IIDR_MATCH_ONE, > .workaround = T241_FORCE_MBW_MIN_TO_ONE, > }, > + { > + /* NVIDIA t241 erratum T241-MPAM-6 */ > + .iidr = MPAM_IIDR_NVIDIA_T421, > + .iidr_mask = MPAM_IIDR_MATCH_ONE, > + .workaround = T241_MBW_COUNTER_SCALE_64, > + }, > { NULL }, /* Sentinel */ > }; > > @@ -1140,7 +1146,7 @@ static void write_msmon_ctl_flt_vals(struct mon_read *m, u32 ctl_val, > } > } > > -static u64 mpam_msmon_overflow_val(enum mpam_device_features type) > +static u64 __mpam_msmon_overflow_val(enum mpam_device_features type) > { > /* TODO: implement scaling counters */ > switch (type) { > @@ -1155,6 +1161,17 @@ static u64 mpam_msmon_overflow_val(enum mpam_device_features type) > } > } > > +static u64 mpam_msmon_overflow_val(enum mpam_device_features type, > + struct mpam_msc *msc) > +{ > + u64 overflow_val = __mpam_msmon_overflow_val(type); > + > + if (mpam_has_quirk(T241_MBW_COUNTER_SCALE_64, msc)) > + overflow_val *= 64; > + > + return overflow_val; overflow_val wraps around for 63 bit counters. Do those need to be considered for this errata? > +} > + > static void __ris_msmon_read(void *arg) > { > u64 now; > @@ -1245,13 +1262,16 @@ static void __ris_msmon_read(void *arg) > now = FIELD_GET(MSMON___VALUE, now); > } > > + if (mpam_has_quirk(T241_MBW_COUNTER_SCALE_64, msc)) > + now *= 64; > + > if (nrdy) > break; > > mbwu_state = &ris->mbwu_state[ctx->mon]; > > if (overflow) > - mbwu_state->correction += mpam_msmon_overflow_val(m->type); > + mbwu_state->correction += mpam_msmon_overflow_val(m->type, msc); > > /* > * Include bandwidth consumed before the last hardware reset and > diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h > index 01882f0acee2..108a8373901c 100644 > --- a/drivers/resctrl/mpam_internal.h > +++ b/drivers/resctrl/mpam_internal.h > @@ -224,6 +224,7 @@ struct mpam_props { > enum mpam_device_quirks { > T241_SCRUB_SHADOW_REGS, > T241_FORCE_MBW_MIN_TO_ONE, > + T241_MBW_COUNTER_SCALE_64, > MPAM_QUIRK_LAST, > }; > Thanks, Ben