From: Ilkka Koskinen <ilkka@os.amperecomputing.com>
To: Besar Wicaksono <bwicaksono@nvidia.com>
Cc: will@kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
suzuki.poulose@arm.com, robin.murphy@arm.com,
ilkka@os.amperecomputing.com, mark.rutland@arm.com,
treding@nvidia.com, jonathanh@nvidia.com, vsethi@nvidia.com,
rwiley@nvidia.com, sdonthineni@nvidia.com
Subject: Re: [PATCH 3/5] perf/arm_cspmu: Add pmpidr support
Date: Tue, 19 Aug 2025 14:26:08 -0700 (PDT) [thread overview]
Message-ID: <44873beb-f296-5ea8-c349-ca2d5f8eab94@os.amperecomputing.com> (raw)
In-Reply-To: <20250812233411.1694012-4-bwicaksono@nvidia.com>
On Tue, 12 Aug 2025, Besar Wicaksono wrote:
> The PMIIDR value is composed by the values in PMPIDR registers.
> We can use PMPIDR registers as alternative for device
> identification for systems that do not implement PMIIDR.
>
> Signed-off-by: Besar Wicaksono <bwicaksono@nvidia.com>
Looks good to me
Reviewed-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
> ---
> drivers/perf/arm_cspmu/arm_cspmu.c | 44 +++++++++++++++++++++++++--
> drivers/perf/arm_cspmu/arm_cspmu.h | 35 +++++++++++++++++++--
> drivers/perf/arm_cspmu/nvidia_cspmu.c | 2 +-
> 3 files changed, 75 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c b/drivers/perf/arm_cspmu/arm_cspmu.c
> index 595e4bdd0b4b..347aefbd1704 100644
> --- a/drivers/perf/arm_cspmu/arm_cspmu.c
> +++ b/drivers/perf/arm_cspmu/arm_cspmu.c
> @@ -323,14 +323,14 @@ static struct arm_cspmu_impl_match impl_match[] = {
> {
> .module_name = "nvidia_cspmu",
> .pmiidr_val = ARM_CSPMU_IMPL_ID_NVIDIA,
> - .pmiidr_mask = ARM_CSPMU_PMIIDR_IMPLEMENTER,
> + .pmiidr_mask = PMIIDR_IMPLEMENTER,
> .module = NULL,
> .impl_init_ops = NULL,
> },
> {
> .module_name = "ampere_cspmu",
> .pmiidr_val = ARM_CSPMU_IMPL_ID_AMPERE,
> - .pmiidr_mask = ARM_CSPMU_PMIIDR_IMPLEMENTER,
> + .pmiidr_mask = PMIIDR_IMPLEMENTER,
> .module = NULL,
> .impl_init_ops = NULL,
> },
> @@ -352,6 +352,44 @@ static struct arm_cspmu_impl_match *arm_cspmu_impl_match_get(u32 pmiidr)
> return NULL;
> }
>
> +static u32 arm_cspmu_get_pmiidr(struct arm_cspmu *cspmu)
> +{
> + u32 pmiidr, pmpidr;
> +
> + pmiidr = readl(cspmu->base0 + PMIIDR);
> +
> + if (pmiidr != 0)
> + return pmiidr;
> +
> + /* Construct PMIIDR value from PMPIDRs. */
> +
> + pmpidr = readl(cspmu->base0 + PMPIDR0);
> + pmiidr |= FIELD_PREP(PMIIDR_PRODUCTID_PART_0,
> + FIELD_GET(PMPIDR0_PART_0, pmpidr));
> +
> + pmpidr = readl(cspmu->base0 + PMPIDR1);
> + pmiidr |= FIELD_PREP(PMIIDR_PRODUCTID_PART_1,
> + FIELD_GET(PMPIDR1_PART_1, pmpidr));
> + pmiidr |= FIELD_PREP(PMIIDR_IMPLEMENTER_DES_0,
> + FIELD_GET(PMPIDR1_DES_0, pmpidr));
> +
> + pmpidr = readl(cspmu->base0 + PMPIDR2);
> + pmiidr |= FIELD_PREP(PMIIDR_VARIANT,
> + FIELD_GET(PMPIDR2_REVISION, pmpidr));
> + pmiidr |= FIELD_PREP(PMIIDR_IMPLEMENTER_DES_1,
> + FIELD_GET(PMPIDR2_DES_1, pmpidr));
> +
> + pmpidr = readl(cspmu->base0 + PMPIDR3);
> + pmiidr |= FIELD_PREP(PMIIDR_REVISION,
> + FIELD_GET(PMPIDR3_REVAND, pmpidr));
> +
> + pmpidr = readl(cspmu->base0 + PMPIDR4);
> + pmiidr |= FIELD_PREP(PMIIDR_IMPLEMENTER_DES_2,
> + FIELD_GET(PMPIDR4_DES_2, pmpidr));
> +
> + return pmiidr;
> +}
> +
> #define DEFAULT_IMPL_OP(name) .name = arm_cspmu_##name
>
> static int arm_cspmu_init_impl_ops(struct arm_cspmu *cspmu)
> @@ -362,7 +400,7 @@ static int arm_cspmu_init_impl_ops(struct arm_cspmu *cspmu)
>
> /* Start with a default PMU implementation */
> cspmu->impl.module = THIS_MODULE;
> - cspmu->impl.pmiidr = readl(cspmu->base0 + PMIIDR);
> + cspmu->impl.pmiidr = arm_cspmu_get_pmiidr(cspmu);
> cspmu->impl.ops = (struct arm_cspmu_impl_ops) {
> DEFAULT_IMPL_OP(get_event_attrs),
> DEFAULT_IMPL_OP(get_format_attrs),
> diff --git a/drivers/perf/arm_cspmu/arm_cspmu.h b/drivers/perf/arm_cspmu/arm_cspmu.h
> index e3a4dd068805..7eb150abc3b7 100644
> --- a/drivers/perf/arm_cspmu/arm_cspmu.h
> +++ b/drivers/perf/arm_cspmu/arm_cspmu.h
> @@ -87,6 +87,11 @@
> #define PMCFGR 0xE00
> #define PMCR 0xE04
> #define PMIIDR 0xE08
> +#define PMPIDR0 0xFE0
> +#define PMPIDR1 0xFE4
> +#define PMPIDR2 0xFE8
> +#define PMPIDR3 0xFEC
> +#define PMPIDR4 0xFD0
>
> /* PMCFGR register field */
> #define PMCFGR_NCG GENMASK(31, 28)
> @@ -116,8 +121,34 @@
> #define PMCR_E BIT(0)
>
> /* PMIIDR register field */
> -#define ARM_CSPMU_PMIIDR_IMPLEMENTER GENMASK(11, 0)
> -#define ARM_CSPMU_PMIIDR_PRODUCTID GENMASK(31, 20)
> +#define PMIIDR_IMPLEMENTER GENMASK(11, 0)
> +#define PMIIDR_IMPLEMENTER_DES_0 GENMASK(3, 0)
> +#define PMIIDR_IMPLEMENTER_DES_1 GENMASK(6, 4)
> +#define PMIIDR_IMPLEMENTER_DES_2 GENMASK(11, 8)
> +#define PMIIDR_REVISION GENMASK(15, 12)
> +#define PMIIDR_VARIANT GENMASK(19, 16)
> +#define PMIIDR_PRODUCTID GENMASK(31, 20)
> +#define PMIIDR_PRODUCTID_PART_0 GENMASK(27, 20)
> +#define PMIIDR_PRODUCTID_PART_1 GENMASK(31, 28)
> +
> +/* PMPIDR0 register field */
> +#define PMPIDR0_PART_0 GENMASK(7, 0)
> +
> +/* PMPIDR1 register field */
> +#define PMPIDR1_DES_0 GENMASK(7, 4)
> +#define PMPIDR1_PART_1 GENMASK(3, 0)
> +
> +/* PMPIDR2 register field */
> +#define PMPIDR2_REVISION GENMASK(7, 4)
> +#define PMPIDR2_DES_1 GENMASK(2, 0)
> +
> +/* PMPIDR3 register field */
> +#define PMPIDR3_REVAND GENMASK(7, 4)
> +#define PMPIDR3_CMOD GENMASK(3, 0)
> +
> +/* PMPIDR4 register field */
> +#define PMPIDR4_SIZE GENMASK(7, 4)
> +#define PMPIDR4_DES_2 GENMASK(3, 0)
>
> /* JEDEC-assigned JEP106 identification code */
> #define ARM_CSPMU_IMPL_ID_NVIDIA 0x36B
> diff --git a/drivers/perf/arm_cspmu/nvidia_cspmu.c b/drivers/perf/arm_cspmu/nvidia_cspmu.c
> index dc6d4e3e2a1b..b6cec351a142 100644
> --- a/drivers/perf/arm_cspmu/nvidia_cspmu.c
> +++ b/drivers/perf/arm_cspmu/nvidia_cspmu.c
> @@ -322,7 +322,7 @@ static int nv_cspmu_init_ops(struct arm_cspmu *cspmu)
> if (!ctx)
> return -ENOMEM;
>
> - prodid = FIELD_GET(ARM_CSPMU_PMIIDR_PRODUCTID, cspmu->impl.pmiidr);
> + prodid = FIELD_GET(PMIIDR_PRODUCTID, cspmu->impl.pmiidr);
>
> /* Find matching PMU. */
> for (; match->prodid; match++) {
> --
> 2.47.0
>
>
next prev parent reply other threads:[~2025-08-19 21:26 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-12 23:34 [PATCH 0/5] perf/arm_cspmu: Preparatory patches for NVIDIA T410 PMU Besar Wicaksono
2025-08-12 23:34 ` [PATCH 1/5] perf/arm_cspmu: Export arm_cspmu_apmt_node Besar Wicaksono
2025-08-19 20:16 ` Ilkka Koskinen
2025-08-20 19:07 ` Besar Wicaksono
2025-08-21 16:04 ` Robin Murphy
2025-08-22 1:28 ` Besar Wicaksono
2025-08-12 23:34 ` [PATCH 2/5] perf/arm_cspmu: Add callback to reset filter config Besar Wicaksono
2025-08-12 23:34 ` [PATCH 3/5] perf/arm_cspmu: Add pmpidr support Besar Wicaksono
2025-08-19 21:26 ` Ilkka Koskinen [this message]
2025-08-12 23:34 ` [PATCH 4/5] perf/arm_cspmu: nvidia: Add revision id matching Besar Wicaksono
2025-08-19 21:28 ` Ilkka Koskinen
2025-08-12 23:34 ` [PATCH 5/5] perf/arm_cspmu: nvidia: Add pmevfiltr2 support Besar Wicaksono
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=44873beb-f296-5ea8-c349-ca2d5f8eab94@os.amperecomputing.com \
--to=ilkka@os.amperecomputing.com \
--cc=bwicaksono@nvidia.com \
--cc=jonathanh@nvidia.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=robin.murphy@arm.com \
--cc=rwiley@nvidia.com \
--cc=sdonthineni@nvidia.com \
--cc=suzuki.poulose@arm.com \
--cc=treding@nvidia.com \
--cc=vsethi@nvidia.com \
--cc=will@kernel.org \
/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