From nobody Mon Jun 8 06:36:25 2026 Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D820B32B10A; Mon, 1 Jun 2026 07:33:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.156.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299217; cv=none; b=EyOdIlaFFBuVC1grg4oj2F8PHzha2x8Ahe0ftF9D5CdG4r5rL3ccNfWZ0w1I+3JuL38btA6uHt6FNgxtOBetCyh5Lfp9o0jpjAgwNsp6gf7SkWNHHKS4+z+/nnc8NoHalJqT1MFIZBARw2NcLnMal/OeBFfCW3UiElY7ym17UT4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299217; c=relaxed/simple; bh=ETRziDHzOJdPeTHFNSqahodF2zXh01k2bba+hKgWGQI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Dd7eg1vKpAQTaSIPKxNV1G6Sf8XVImUIL9vVhZ9ij52j0Nt6yEvJDG/rMlpXbTESkhmL9okZLLVXaNhN/GKwVG7xWoylq4nfca8lGjoMcea1OZ8YGFK+MpDPewQx2egNCEGOJ5HO6oipGWcyIAp6blBa80zIAwhwyRB/AFaDr4s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com; spf=pass smtp.mailfrom=marvell.com; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b=K98d+YzK; arc=none smtp.client-ip=67.231.156.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marvell.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b="K98d+YzK" Received: from pps.filterd (m0431383.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6511JVLY3684155; Mon, 1 Jun 2026 00:33:26 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h= cc:content-type:date:from:in-reply-to:message-id:mime-version :references:subject:to; s=pfpt0220; bh=5D86mAe9tSQpu4IKDYiGm3Glb c2HX616Avlpwus9lwA=; b=K98d+YzK415Bo5VKUCrK9TqGEvMdLLOp4qIlPPGTt wgTjzoHa5HQKap/UrO3uBlVJOKPfxvdK1cOL1k+wLIxVj86Te8mRz6slRCO5sXWc T5IbGv8UjSzgSH4IMn6aJqT4VgpEl7X/LKAeKHA7EQ98xXAHuCV6ETOSQaYSQVLN TRL/Aln33JTea+8N3dktHyX956gv8hgYwp946l+krn80P/9wFQcjy08wkoGZj/XM loKXVm/io+FtjzkrfkqqPr0eAebBRNOSSJ0ZrFANTZefzUsuwyZg/i6Rekui4/NP qSU1fpEgni5ne8i33NP0n1+Tx3KjK4rePTNRHy91gumKw== Received: from dc6wp-exch02.marvell.com ([4.21.29.225]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 4eggn8atcw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 01 Jun 2026 00:33:25 -0700 (PDT) Received: from DC6WP-EXCH02.marvell.com (10.76.176.209) by DC6WP-EXCH02.marvell.com (10.76.176.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Mon, 1 Jun 2026 00:33:25 -0700 Received: from maili.marvell.com (10.69.176.80) by DC6WP-EXCH02.marvell.com (10.76.176.209) with Microsoft SMTP Server id 15.2.1544.25 via Frontend Transport; Mon, 1 Jun 2026 00:33:25 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id 9C0533F7082; Mon, 1 Jun 2026 00:33:22 -0700 (PDT) From: Geetha sowjanya To: , , , CC: , , Subject: [PATCH v8 1/3] dt-bindings: perf: marvell: Add CN20K DDR PMU binding Date: Mon, 1 Jun 2026 13:03:16 +0530 Message-ID: <20260601073318.7098-2-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260601073318.7098-1-gakula@marvell.com> References: <20260601073318.7098-1-gakula@marvell.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: 9BlceYkm59T64dSh0wUrpjjBh0EGlP_b X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjAxMDA3NSBTYWx0ZWRfX0V3GqUKlrVXS jwJ0QJ5H+HcZVHUiRFqaLDv1yMjADpesMvW5Y3KQNF5826xVHivdQLVjWjirlEYSVmj9s/mEROi Jxra8Q21Xi9BGfBmVBKxYIGw/5H1jT/EbWPXKVsIkVpUO1xWT9799A8qnP8/9XJk8rMJMDFTRvi +Bjf6vgIMDLJ/d7GVXrqOcTsykXGuaPQVu+Hk8rrzUxhGTxFE24bB2jbLZk4zG2Qb4uuOQBvLmO Qzghhxvrbchc+UuJ+NF4wpEuyR9SSDzjV6A3EUdwd9Z/YPG0EHwMzFk8DVVnC2peVGbTD/8aPUM UzDGdJFjYI94UfQITm7R7oOUNIrg7K9L7FFx4WfZzlhPAay9FuyXS84xILWEMD223cihfPvzCq4 rGea7KesumPzmsjtJX8R6P86d9kwfpKsKcJ5/Eab2EIyVtqQqz4AUld6Xl4xSH57RT4mY2z6HQZ mQOitvoSf2pyOq3suxA== X-Proofpoint-GUID: 9BlceYkm59T64dSh0wUrpjjBh0EGlP_b X-Authority-Analysis: v=2.4 cv=ON0XGyaB c=1 sm=1 tr=0 ts=6a1d35c6 cx=c_pps a=gIfcoYsirJbf48DBMSPrZA==:117 a=gIfcoYsirJbf48DBMSPrZA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=qit2iCtTFQkLgVSMPQTB:22 a=gEfo2CItAAAA:8 a=M5GUcnROAAAA:8 a=EUspDBNiAAAA:8 a=cPq5-T7l7yds4WLDPVIA:9 a=sptkURWiP4Gy88Gu7hUp:22 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-01_02,2026-05-28_03,2025-10-01_01 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Marvell CN20K SoCs integrate a DDR Performance Monitoring Unit (PMU) associated with the DDR controller. The block provides hardware counters to monitor DDR traffic and performance events and is accessed via a dedicated MMIO region. The CN20K DDR PMU is functionally equivalent to the CN10K DDR PMU, with minor register offset differences. Signed-off-by: Geetha sowjanya Reviewed-by: Krzysztof Kozlowski --- Changes in v7: - Dropped the CN20K DeviceTree example. Changes in v6: - dt-bindings: Document CN20K in the existing marvell-cn10k-ddr.yaml; add maintainer, description, compatible enum entry, and a CN20K example with unit-address aligned to reg. .../devicetree/bindings/perf/marvell-cn10k-ddr.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/perf/marvell-cn10k-ddr.yaml = b/Documentation/devicetree/bindings/perf/marvell-cn10k-ddr.yaml index a18dd0a8c43a..f2f0d6b61eac 100644 --- a/Documentation/devicetree/bindings/perf/marvell-cn10k-ddr.yaml +++ b/Documentation/devicetree/bindings/perf/marvell-cn10k-ddr.yaml @@ -4,16 +4,22 @@ $id: http://devicetree.org/schemas/perf/marvell-cn10k-ddr.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: Marvell CN10K DDR performance monitor +title: Marvell CN10K / CN20K DDR performance monitor + +description: + Performance Monitoring Unit (PMU) for the DDR controller on Marvell + CN10K and CN20K SoCs. The block is accessed via a dedicated MMIO region. =20 maintainers: - Bharat Bhushan + - Geetha sowjanya =20 properties: compatible: items: - enum: - marvell,cn10k-ddr-pmu + - marvell,cn20k-ddr-pmu =20 reg: maxItems: 1 --=20 2.25.1 From nobody Mon Jun 8 06:36:25 2026 Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 007CF386425; Mon, 1 Jun 2026 07:33:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.148.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299219; cv=none; b=MxR8Bj6E39qANOE1+EvPH4s/fnxsfN1Ihbs+Rq39AjtPS/XUWd4uRP3NzFzOp3NmfRteG6QFhQeHUDEVUhibw6X9NHsoAmq0U/Y68fqiRn9dGTmxlG5/utzYJWB5kW8I3OrmiJzjKuPfzm3KiOgpe9NnYxmF4PrIXRCVC4tvgro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299219; c=relaxed/simple; bh=Bv2JXIh1jpyXYBZJI0VduBr6R4E5RegN7P6SIwz3lA4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sRP2oZIhQHs5zfDPowDcafU4/rH0xgoaY4T41J7QTDo4WAAAoBytZIczviPuxcEhiLI7FLB9SyeDlf3WMCw1WnXBjzapF1xOqBR4+btkmmU2+OpBwFt4OMYrV9lHTH/r5aPPxyRY3X8HYNWTQsfTFcS+ojUBm6rfrjsyKfRrjzc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com; spf=pass smtp.mailfrom=marvell.com; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b=acOzofud; arc=none smtp.client-ip=67.231.148.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marvell.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b="acOzofud" Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64VKPZO3857198; Mon, 1 Jun 2026 00:33:30 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h= cc:content-type:date:from:in-reply-to:message-id:mime-version :references:subject:to; s=pfpt0220; bh=tVfcv9pmJ2XYcQ33bLkDgO5t9 6BPNldPT0cgWOVUZJM=; b=acOzofudfhzIITOqQggNaWCr7YMbPKQ5GkleEVqNJ yekaUp+yI4zMYZfb43i0mQNuKeDl5CNEAUqxmSrDXtbHEOmFNZmAIuvOT/hqx5rv 04P4oZKMaPWra6dRnTR8IH81xovW/cBsHGdmz6QQSTf/EfYolEWsb6GYsp3jQq+j DDrBE4qX7lIkU2mJR6+4nXTjppWjzzTdFR7eaJjc/CwyrF29w/Cye/9CrvNsZtHu WloWwbwsqt4GAooV9NJf/5JWqm0Qf6CyaaaEpsH1PekDxjxLGssAVotuQV0EsV9o m4QSAXWrWHZAtx+0qjo9gS6+EAh/tQPOAJZnVZ9aYmPmA== Received: from dc6wp-exch02.marvell.com ([4.21.29.225]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 4efw8hw769-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 01 Jun 2026 00:33:29 -0700 (PDT) Received: from DC6WP-EXCH02.marvell.com (10.76.176.209) by DC6WP-EXCH02.marvell.com (10.76.176.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Mon, 1 Jun 2026 00:33:28 -0700 Received: from maili.marvell.com (10.69.176.80) by DC6WP-EXCH02.marvell.com (10.76.176.209) with Microsoft SMTP Server id 15.2.1544.25 via Frontend Transport; Mon, 1 Jun 2026 00:33:28 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id 925323F7082; Mon, 1 Jun 2026 00:33:25 -0700 (PDT) From: Geetha sowjanya To: , , , CC: , , Subject: [PATCH v8 2/3] perf: marvell: Add CN20K DDR PMU support Date: Mon, 1 Jun 2026 13:03:17 +0530 Message-ID: <20260601073318.7098-3-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260601073318.7098-1-gakula@marvell.com> References: <20260601073318.7098-1-gakula@marvell.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjAxMDA3NSBTYWx0ZWRfX6U3Lyvwbc8q0 a6BHdq3TglYQ1nDsjHGE+RZaDVmLhvZfJJmum8c3bHJO5ec7Xq9ytYJPoDiy7ci92Nm/1VE5gsK wrtTHi+HPNmcVGFiwtyRjHjrwHJ8pdo+O4gXf+H8NIioowXUtd8YckbCO6I2zKiVA/j0WmFXxjv uqftMKHxVMEE2uH+o1hUdHo3uXuxGbiGo3qGrge0g03CMIXAIdrS2JBcxR7A70sxl0Vy25nwLf2 1A5rG9cdptUGibcSUKHFZ5n3ivMsfltrv2CyHrXZCkak6cZqb5TjuznGgQSsb8gwQ9l0zNSI/yx A7noLNlBBGT+zwmC/iV3GRTzTRUcZEYbTiB/9DTrOd7WjxQ6in6wvCsF5Wz0jX2rgNLQRBXWkVe VJ3RcoRy8mnqkbR9l+Lo40T1yoSfWf7FSuRr+p56Y/OybMadkqHp5ViH+VEvMspTV81PogAncGe QVaFwdBAtJwDhL5UZEg== X-Proofpoint-GUID: I13zpvqjcMZpfEjGnkb5VuWXvYXExHXs X-Proofpoint-ORIG-GUID: I13zpvqjcMZpfEjGnkb5VuWXvYXExHXs X-Authority-Analysis: v=2.4 cv=F99nsKhN c=1 sm=1 tr=0 ts=6a1d35c9 cx=c_pps a=gIfcoYsirJbf48DBMSPrZA==:117 a=gIfcoYsirJbf48DBMSPrZA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=EAYMVhzMl8SCOHhVQcBL:22 a=M5GUcnROAAAA:8 a=BJRxBllVUPrzxzeLE8QA:9 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-01_02,2026-05-28_03,2025-10-01_01 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The CN20K DRAM Subsystem exposes eight programmable performance counters and two fixed counters for DDR read and write traffic. Software selects events for the programmable counters from traffic at the DDR PHY interface, the CHI interconnect, or inside the DDR controller. Add CN20K register offsets, event maps, and sysfs attributes; match the device via OF (marvell,cn20k-ddr-pmu) and ACPI (MRVL000B). Represent the SoC variant in platform data with bit flags so CN20K can reuse the CN10K PMU code path where appropriate. Signed-off-by: Geetha sowjanya --- Changes in v7: - perf: Add ZQ case (62/63) before the DFI switch range; handle shared IDs 58-61 only inside the DFI branch (fixes overlapping cases and Odyssey EINVAL for perf-width events). - perf: Widen programmable-event case to EVENT_OP_IS_CAS_WS through EVENT_OP_IS_ZQLATCH so CAS sysfs events (36-38) map in ddr_perf_get_event_bitmap. - perf: On event_add failure from ddr_perf_get_event_bitmap, cancel timer if needed and free the counter slot instead of returning with partial setup. - perf: For CN20K, zero CFG0 before writing ZQ to CFG1 and zero CFG1 before non-ZQ CFG0 so stale masks do not combine across banks. drivers/perf/marvell_cn10k_ddr_pmu.c | 230 +++++++++++++++++++++++++-- 1 file changed, 214 insertions(+), 16 deletions(-) diff --git a/drivers/perf/marvell_cn10k_ddr_pmu.c b/drivers/perf/marvell_cn= 10k_ddr_pmu.c index 72ac17efd846..6f638dfe829b 100644 --- a/drivers/perf/marvell_cn10k_ddr_pmu.c +++ b/drivers/perf/marvell_cn10k_ddr_pmu.c @@ -13,31 +13,43 @@ #include #include #include +#include + +/* SoC variant flags for struct ddr_pmu_platform_data (mutually exclusive = in pdata) */ +#define IS_CN10K BIT(0) +#define IS_ODY BIT(1) +#define IS_CN20K BIT(2) =20 /* Performance Counters Operating Mode Control Registers */ #define CN10K_DDRC_PERF_CNT_OP_MODE_CTRL 0x8020 #define ODY_DDRC_PERF_CNT_OP_MODE_CTRL 0x20020 +#define CN20K_DDRC_PERF_CNT_OP_MODE_CTRL 0x20000 #define OP_MODE_CTRL_VAL_MANUAL 0x1 =20 /* Performance Counters Start Operation Control Registers */ #define CN10K_DDRC_PERF_CNT_START_OP_CTRL 0x8028 #define ODY_DDRC_PERF_CNT_START_OP_CTRL 0x200A0 +#define CN20K_DDRC_PERF_CNT_START_OP_CTRL 0x20080 #define START_OP_CTRL_VAL_START 0x1ULL #define START_OP_CTRL_VAL_ACTIVE 0x2 =20 /* Performance Counters End Operation Control Registers */ #define CN10K_DDRC_PERF_CNT_END_OP_CTRL 0x8030 #define ODY_DDRC_PERF_CNT_END_OP_CTRL 0x200E0 +#define CN20K_DDRC_PERF_CNT_END_OP_CTRL 0x200C0 #define END_OP_CTRL_VAL_END 0x1ULL =20 /* Performance Counters End Status Registers */ #define CN10K_DDRC_PERF_CNT_END_STATUS 0x8038 #define ODY_DDRC_PERF_CNT_END_STATUS 0x20120 +#define CN20K_DDRC_PERF_CNT_END_STATUS 0x20100 #define END_STATUS_VAL_END_TIMER_MODE_END 0x1 =20 /* Performance Counters Configuration Registers */ #define CN10K_DDRC_PERF_CFG_BASE 0x8040 #define ODY_DDRC_PERF_CFG_BASE 0x20160 +#define CN20K_DDRC_PERF_CFG_BASE 0x20140 +#define CN20K_DDRC_PERF_CFG1_BASE 0x20180 =20 /* 8 Generic event counter + 2 fixed event counters */ #define DDRC_PERF_NUM_GEN_COUNTERS 8 @@ -61,6 +73,24 @@ * DO NOT change these event-id numbers, they are used to * program event bitmap in h/w. */ + +/* CN20K specific events */ +#define EVENT_PERF_OP_IS_RD16 61 +#define EVENT_PERF_OP_IS_RD32 60 +#define EVENT_PERF_OP_IS_WR16 59 +#define EVENT_PERF_OP_IS_WR32 58 +#define EVENT_OP_IS_ENTER_DSM 44 +#define EVENT_OP_IS_RFM 43 + + +#define EVENT_CN20K_OP_IS_ZQLATCH 62 +#define EVENT_CN20K_OP_IS_ZQSTART 63 +#define EVENT_CN20K_OP_IS_TCR_MRR 50 +#define EVENT_CN20K_OP_IS_DQSOSC_MRR 49 +#define EVENT_CN20K_OP_IS_DQSOSC_MPC 48 +#define EVENT_CN20K_VISIBLE_WIN_LIMIT_REACHED_WR 47 +#define EVENT_CN20K_VISIBLE_WIN_LIMIT_REACHED_RD 46 + #define EVENT_DFI_CMD_IS_RETRY 61 #define EVENT_RD_UC_ECC_ERROR 60 #define EVENT_RD_CRC_ERROR 59 @@ -87,6 +117,9 @@ #define EVENT_OP_IS_SPEC_REF 41 #define EVENT_OP_IS_CRIT_REF 40 #define EVENT_OP_IS_REFRESH 39 +#define EVENT_OP_IS_CAS_WCK_SUS 38 +#define EVENT_OP_IS_CAS_WS_OFF 37 +#define EVENT_OP_IS_CAS_WS 36 #define EVENT_OP_IS_ENTER_MPSM 35 #define EVENT_OP_IS_ENTER_POWERDOWN 31 #define EVENT_OP_IS_ENTER_SELFREF 27 @@ -183,8 +216,8 @@ struct ddr_pmu_platform_data { u64 cnt_freerun_clr; u64 cnt_value_wr_op; u64 cnt_value_rd_op; - bool is_cn10k; - bool is_ody; + u64 cfg1_base; + unsigned int silicon_flags; /* IS_CN10K, IS_ODY, or IS_CN20K */ }; =20 static ssize_t cn10k_ddr_pmu_event_show(struct device *dev, @@ -336,6 +369,80 @@ static struct attribute *odyssey_ddr_perf_events_attrs= [] =3D { NULL }; =20 +static struct attribute *cn20k_ddr_perf_events_attrs[] =3D { + /* Programmable */ + CN10K_DDR_PMU_EVENT_ATTR(ddr_hif_rd_or_wr_access, EVENT_HIF_RD_OR_WR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_hif_wr_access, EVENT_HIF_WR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_hif_rd_access, EVENT_HIF_RD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_hif_rmw_access, EVENT_HIF_RMW), + CN10K_DDR_PMU_EVENT_ATTR(ddr_hif_pri_rdaccess, EVENT_HIF_HI_PRI_RD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_rd_bypass_access, EVENT_READ_BYPASS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_act_bypass_access, EVENT_ACT_BYPASS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_dfi_wr_data_access, + EVENT_DFI_WR_DATA_CYCLES), + CN10K_DDR_PMU_EVENT_ATTR(ddr_dfi_rd_data_access, + EVENT_DFI_RD_DATA_CYCLES), + CN10K_DDR_PMU_EVENT_ATTR(ddr_hpri_sched_rd_crit_access, + EVENT_HPR_XACT_WHEN_CRITICAL), + CN10K_DDR_PMU_EVENT_ATTR(ddr_lpri_sched_rd_crit_access, + EVENT_LPR_XACT_WHEN_CRITICAL), + CN10K_DDR_PMU_EVENT_ATTR(ddr_wr_trxn_crit_access, + EVENT_WR_XACT_WHEN_CRITICAL), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_active_access, EVENT_OP_IS_ACTIVATE), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_rd_or_wr_access, + EVENT_OP_IS_RD_OR_WR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_rd_active_access, + EVENT_OP_IS_RD_ACTIVATE), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_read, EVENT_OP_IS_RD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_write, EVENT_OP_IS_WR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cam_mwr, EVENT_OP_IS_MWR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_precharge, EVENT_OP_IS_PRECHARGE), + CN10K_DDR_PMU_EVENT_ATTR(ddr_precharge_for_rdwr, + EVENT_PRECHARGE_FOR_RDWR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_precharge_for_other, + EVENT_PRECHARGE_FOR_OTHER), + CN10K_DDR_PMU_EVENT_ATTR(ddr_rdwr_transitions, EVENT_RDWR_TRANSITIONS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_write_combine, EVENT_WRITE_COMBINE), + CN10K_DDR_PMU_EVENT_ATTR(ddr_war_hazard, EVENT_WAR_HAZARD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_raw_hazard, EVENT_RAW_HAZARD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_waw_hazard, EVENT_WAW_HAZARD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_enter_selfref, EVENT_OP_IS_ENTER_SELFREF), + CN10K_DDR_PMU_EVENT_ATTR(ddr_enter_powerdown, + EVENT_OP_IS_ENTER_POWERDOWN), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cas_ws, EVENT_OP_IS_CAS_WS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cas_ws_off, EVENT_OP_IS_CAS_WS_OFF), + CN10K_DDR_PMU_EVENT_ATTR(ddr_cas_wck_sus, EVENT_OP_IS_CAS_WCK_SUS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_refresh, EVENT_OP_IS_REFRESH), + CN10K_DDR_PMU_EVENT_ATTR(ddr_crit_ref, EVENT_OP_IS_CRIT_REF), + CN10K_DDR_PMU_EVENT_ATTR(ddr_spec_ref, EVENT_OP_IS_SPEC_REF), + CN10K_DDR_PMU_EVENT_ATTR(ddr_load_mode, EVENT_OP_IS_LOAD_MODE), + CN10K_DDR_PMU_EVENT_ATTR(ddr_rfm, EVENT_OP_IS_RFM), + CN10K_DDR_PMU_EVENT_ATTR(ddr_enter_dsm, EVENT_OP_IS_ENTER_DSM), + CN10K_DDR_PMU_EVENT_ATTR(ddr_dfi_cycles, EVENT_DFI_CYCLES), + CN10K_DDR_PMU_EVENT_ATTR(ddr_win_limit_reached_rd, + EVENT_CN20K_VISIBLE_WIN_LIMIT_REACHED_RD), + CN10K_DDR_PMU_EVENT_ATTR(ddr_win_limit_reached_wr, + EVENT_CN20K_VISIBLE_WIN_LIMIT_REACHED_WR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_dqsosc_mpc, EVENT_CN20K_OP_IS_DQSOSC_MPC), + CN10K_DDR_PMU_EVENT_ATTR(ddr_dqsosc_mrr, EVENT_CN20K_OP_IS_DQSOSC_MRR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_tcr_mrr, EVENT_CN20K_OP_IS_TCR_MRR), + CN10K_DDR_PMU_EVENT_ATTR(ddr_zqstart, EVENT_CN20K_OP_IS_ZQSTART), + CN10K_DDR_PMU_EVENT_ATTR(ddr_zqlatch, EVENT_CN20K_OP_IS_ZQLATCH), + CN10K_DDR_PMU_EVENT_ATTR(ddr_read16, EVENT_PERF_OP_IS_RD16), + CN10K_DDR_PMU_EVENT_ATTR(ddr_read32, EVENT_PERF_OP_IS_RD32), + CN10K_DDR_PMU_EVENT_ATTR(ddr_write16, EVENT_PERF_OP_IS_WR16), + CN10K_DDR_PMU_EVENT_ATTR(ddr_write32, EVENT_PERF_OP_IS_WR32), + /* Free run event counters */ + CN10K_DDR_PMU_EVENT_ATTR(ddr_ddr_reads, EVENT_DDR_READS), + CN10K_DDR_PMU_EVENT_ATTR(ddr_ddr_writes, EVENT_DDR_WRITES), + NULL +}; + +static struct attribute_group cn20k_ddr_perf_events_attr_group =3D { + .name =3D "events", + .attrs =3D cn20k_ddr_perf_events_attrs, +}; + static struct attribute_group odyssey_ddr_perf_events_attr_group =3D { .name =3D "events", .attrs =3D odyssey_ddr_perf_events_attrs, @@ -393,6 +500,13 @@ static const struct attribute_group *odyssey_attr_grou= ps[] =3D { NULL }; =20 +static const struct attribute_group *cn20k_attr_groups[] =3D { + &cn20k_ddr_perf_events_attr_group, + &cn10k_ddr_perf_format_attr_group, + &cn10k_ddr_perf_cpumask_attr_group, + NULL +}; + /* Default poll timeout is 100 sec, which is very sufficient for * 48 bit counter incremented max at 5.6 GT/s, which may take many * hours to overflow. @@ -411,14 +525,38 @@ static int ddr_perf_get_event_bitmap(int eventid, u64= *event_bitmap, int err =3D 0; =20 switch (eventid) { + case EVENT_CN20K_OP_IS_ZQLATCH ... EVENT_CN20K_OP_IS_ZQSTART: + if (ddr_pmu->p_data->silicon_flags & IS_CN20K) { + *event_bitmap =3D (1ULL << (eventid - 42)); + break; + } + err =3D -EINVAL; + break; case EVENT_DFI_PARITY_POISON ...EVENT_DFI_CMD_IS_RETRY: - if (!ddr_pmu->p_data->is_ody) { + /* + * 58..61: CN20K perf width events share numeric IDs with Odyssey + * DFI events; same 1ULL << (eventid - 1) bitmap on both paths. + */ + if (eventid >=3D EVENT_PERF_OP_IS_WR32 && + eventid <=3D EVENT_PERF_OP_IS_RD16) { + if (ddr_pmu->p_data->silicon_flags & IS_CN20K) { + *event_bitmap =3D (1ULL << (eventid - 1)); + break; + } + if (!(ddr_pmu->p_data->silicon_flags & IS_ODY)) { + err =3D -EINVAL; + break; + } + *event_bitmap =3D (1ULL << (eventid - 1)); + break; + } + if (!(ddr_pmu->p_data->silicon_flags & IS_ODY)) { err =3D -EINVAL; break; } fallthrough; case EVENT_HIF_RD_OR_WR ... EVENT_WAW_HAZARD: - case EVENT_OP_IS_REFRESH ... EVENT_OP_IS_ZQLATCH: + case EVENT_OP_IS_CAS_WS ... EVENT_OP_IS_ZQLATCH: *event_bitmap =3D (1ULL << (eventid - 1)); break; case EVENT_OP_IS_ENTER_SELFREF: @@ -524,9 +662,9 @@ static void cn10k_ddr_perf_counter_enable(struct cn10k_= ddr_pmu *pmu, int counter, bool enable) { const struct ddr_pmu_platform_data *p_data =3D pmu->p_data; + unsigned int silicon_flags =3D pmu->p_data->silicon_flags; u64 ctrl_reg =3D pmu->p_data->cnt_op_mode_ctrl; const struct ddr_pmu_ops *ops =3D pmu->ops; - bool is_ody =3D pmu->p_data->is_ody; u32 reg; u64 val; =20 @@ -546,7 +684,7 @@ static void cn10k_ddr_perf_counter_enable(struct cn10k_= ddr_pmu *pmu, =20 writeq_relaxed(val, pmu->base + reg); =20 - if (is_ody) { + if ((silicon_flags & IS_ODY) || (silicon_flags & IS_CN20K)) { if (enable) { /* * Setup the PMU counter to work in @@ -621,6 +759,7 @@ static int cn10k_ddr_perf_event_add(struct perf_event *= event, int flags) { struct cn10k_ddr_pmu *pmu =3D to_cn10k_ddr_pmu(event->pmu); const struct ddr_pmu_platform_data *p_data =3D pmu->p_data; + unsigned int silicon_flags =3D pmu->p_data->silicon_flags; const struct ddr_pmu_ops *ops =3D pmu->ops; struct hw_perf_event *hwc =3D &event->hw; u8 config =3D event->attr.config; @@ -642,10 +781,27 @@ static int cn10k_ddr_perf_event_add(struct perf_event= *event, int flags) if (counter < DDRC_PERF_NUM_GEN_COUNTERS) { /* Generic counters, configure event id */ reg_offset =3D DDRC_PERF_CFG(p_data->cfg_base, counter); + ret =3D ddr_perf_get_event_bitmap(config, &val, pmu); if (ret) - return ret; - + goto err_free_counter; + + if (silicon_flags & IS_CN20K) { + if (config =3D=3D EVENT_CN20K_OP_IS_ZQSTART || + config =3D=3D EVENT_CN20K_OP_IS_ZQLATCH) { + /* ZQ lives in CFG1; clear stale event mask in CFG0 */ + writeq_relaxed(0, pmu->base + + DDRC_PERF_CFG(p_data->cfg_base, + counter)); + reg_offset =3D DDRC_PERF_CFG(p_data->cfg1_base, + counter); + } else { + /* Clear CFG1 so a prior ZQ select cannot linger */ + writeq_relaxed(0, pmu->base + + DDRC_PERF_CFG(p_data->cfg1_base, + counter)); + } + } writeq_relaxed(val, pmu->base + reg_offset); } else { /* fixed event counter, clear counter value */ @@ -661,6 +817,14 @@ static int cn10k_ddr_perf_event_add(struct perf_event = *event, int flags) cn10k_ddr_perf_event_start(event, flags); =20 return 0; + +err_free_counter: + if (pmu->active_events =3D=3D 1) + hrtimer_cancel(&pmu->hrtimer); + pmu->active_events--; + cn10k_ddr_perf_free_counter(pmu, counter); + hwc->idx =3D -1; + return ret; } =20 static void cn10k_ddr_perf_event_stop(struct perf_event *event, int flags) @@ -952,7 +1116,25 @@ static const struct ddr_pmu_platform_data cn10k_ddr_p= mu_pdata =3D { .cnt_freerun_clr =3D 0, .cnt_value_wr_op =3D CN10K_DDRC_PERF_CNT_VALUE_WR_OP, .cnt_value_rd_op =3D CN10K_DDRC_PERF_CNT_VALUE_RD_OP, - .is_cn10k =3D TRUE, + .silicon_flags =3D IS_CN10K, +}; + +static const struct ddr_pmu_platform_data cn20k_ddr_pmu_pdata =3D { + .counter_overflow_val =3D 0, + .counter_max_val =3D GENMASK_ULL(63, 0), + .cnt_base =3D ODY_DDRC_PERF_CNT_VALUE_BASE, + .cfg_base =3D CN20K_DDRC_PERF_CFG_BASE, + .cfg1_base =3D CN20K_DDRC_PERF_CFG1_BASE, + .cnt_op_mode_ctrl =3D CN20K_DDRC_PERF_CNT_OP_MODE_CTRL, + .cnt_start_op_ctrl =3D CN20K_DDRC_PERF_CNT_START_OP_CTRL, + .cnt_end_op_ctrl =3D CN20K_DDRC_PERF_CNT_END_OP_CTRL, + .cnt_end_status =3D CN20K_DDRC_PERF_CNT_END_STATUS, + .cnt_freerun_en =3D 0, + .cnt_freerun_ctrl =3D ODY_DDRC_PERF_CNT_FREERUN_CTRL, + .cnt_freerun_clr =3D ODY_DDRC_PERF_CNT_FREERUN_CLR, + .cnt_value_wr_op =3D ODY_DDRC_PERF_CNT_VALUE_WR_OP, + .cnt_value_rd_op =3D ODY_DDRC_PERF_CNT_VALUE_RD_OP, + .silicon_flags =3D IS_CN20K, }; #endif =20 @@ -979,7 +1161,7 @@ static const struct ddr_pmu_platform_data odyssey_ddr_= pmu_pdata =3D { .cnt_freerun_clr =3D ODY_DDRC_PERF_CNT_FREERUN_CLR, .cnt_value_wr_op =3D ODY_DDRC_PERF_CNT_VALUE_WR_OP, .cnt_value_rd_op =3D ODY_DDRC_PERF_CNT_VALUE_RD_OP, - .is_ody =3D TRUE, + .silicon_flags =3D IS_ODY, }; #endif =20 @@ -989,8 +1171,7 @@ static int cn10k_ddr_perf_probe(struct platform_device= *pdev) struct cn10k_ddr_pmu *ddr_pmu; struct resource *res; void __iomem *base; - bool is_cn10k; - bool is_ody; + unsigned int silicon_flags; char *name; int ret; =20 @@ -1014,10 +1195,9 @@ static int cn10k_ddr_perf_probe(struct platform_devi= ce *pdev) ddr_pmu->base =3D base; =20 ddr_pmu->p_data =3D dev_data; - is_cn10k =3D ddr_pmu->p_data->is_cn10k; - is_ody =3D ddr_pmu->p_data->is_ody; + silicon_flags =3D ddr_pmu->p_data->silicon_flags; =20 - if (is_cn10k) { + if (silicon_flags & IS_CN10K) { ddr_pmu->ops =3D &ddr_pmu_ops; /* Setup the PMU counter to work in manual mode */ writeq_relaxed(OP_MODE_CTRL_VAL_MANUAL, ddr_pmu->base + @@ -1039,7 +1219,7 @@ static int cn10k_ddr_perf_probe(struct platform_devic= e *pdev) }; } =20 - if (is_ody) { + if (silicon_flags & IS_ODY) { ddr_pmu->ops =3D &ddr_pmu_ody_ops; =20 ddr_pmu->pmu =3D (struct pmu) { @@ -1056,6 +1236,22 @@ static int cn10k_ddr_perf_probe(struct platform_devi= ce *pdev) }; } =20 + if (silicon_flags & IS_CN20K) { + ddr_pmu->ops =3D &ddr_pmu_ody_ops; + + ddr_pmu->pmu =3D (struct pmu) { + .module =3D THIS_MODULE, + .capabilities =3D PERF_PMU_CAP_NO_EXCLUDE, + .task_ctx_nr =3D perf_invalid_context, + .attr_groups =3D cn20k_attr_groups, + .event_init =3D cn10k_ddr_perf_event_init, + .add =3D cn10k_ddr_perf_event_add, + .del =3D cn10k_ddr_perf_event_del, + .start =3D cn10k_ddr_perf_event_start, + .stop =3D cn10k_ddr_perf_event_stop, + .read =3D cn10k_ddr_perf_event_update, + }; + } /* Choose this cpu to collect perf data */ ddr_pmu->cpu =3D raw_smp_processor_id(); =20 @@ -1098,6 +1294,7 @@ static void cn10k_ddr_perf_remove(struct platform_dev= ice *pdev) #ifdef CONFIG_OF static const struct of_device_id cn10k_ddr_pmu_of_match[] =3D { { .compatible =3D "marvell,cn10k-ddr-pmu", .data =3D &cn10k_ddr_pmu_pdata= }, + { .compatible =3D "marvell,cn20k-ddr-pmu", .data =3D &cn20k_ddr_pmu_pdata= }, { }, }; MODULE_DEVICE_TABLE(of, cn10k_ddr_pmu_of_match); @@ -1107,6 +1304,7 @@ MODULE_DEVICE_TABLE(of, cn10k_ddr_pmu_of_match); static const struct acpi_device_id cn10k_ddr_pmu_acpi_match[] =3D { {"MRVL000A", (kernel_ulong_t)&cn10k_ddr_pmu_pdata }, {"MRVL000C", (kernel_ulong_t)&odyssey_ddr_pmu_pdata}, + {"MRVL000B", (kernel_ulong_t)&cn20k_ddr_pmu_pdata}, {}, }; MODULE_DEVICE_TABLE(acpi, cn10k_ddr_pmu_acpi_match); --=20 2.25.1 From nobody Mon Jun 8 06:36:25 2026 Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A8AF385D6E; Mon, 1 Jun 2026 07:33:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.148.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299220; cv=none; b=OTk5lbMw0auF0+VcHicQGjmOch10cQMOZ1P53lXHwVfign8qRdXTNzH3hhnfPNSyYwV7ypNW1rYW+U8IUHjgJM919vUp2ED0d6JwqGl47DRdriyto1rs/v0RBpNzYL+Q8Gwd75KmLLVKDOUflzAiuuCnUIMz6wop3uTxPCu4veI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780299220; c=relaxed/simple; bh=uS8SVGAcwmWAVe8/w13kUsNvmpdPZ7XOzo21Ab+ySqk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=vEZXjRHWPjwCW/mFc07sR1zg03Csa7XzBkHysoCamNsADHy/S5Dv2pB3LKNYBEHNERXaINkWzNBPXPbugvz1ezgZxgwf75TrLvV2cXRm4Z0vkx5mCzT+l4cPCC4ga3jzvBdeUCldnY/3wqB0MGDNMtMwT1TiweOfkSixWDzgtqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com; spf=pass smtp.mailfrom=marvell.com; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b=L70mGwZ6; arc=none smtp.client-ip=67.231.148.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=marvell.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marvell.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marvell.com header.i=@marvell.com header.b="L70mGwZ6" Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64VLpD8M1007224; Mon, 1 Jun 2026 00:33:33 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h= cc:content-type:date:from:in-reply-to:message-id:mime-version :references:subject:to; s=pfpt0220; bh=ysX8HVe5tI0y8KixQmCJcom7R XVurl7yJ/4ljZeiGh8=; b=L70mGwZ6ZGH172jiqSkJmz3SG+Rgeg8CYOf3PraLU LIvQebe793ffoClrtnrdt2K9wg2alXjDJnjN1Z3pUXNY05xMHt7gVeruAdVZHjVI nAcPgCFOlY41CCJ5+RiM2F7Bne2Z7UeA9JJUKzObvObysCUUKTzDbtuzihWoWpc7 6turwA6d+gOB+GW5L7dEIZ7gzROhF4PDdHsEOboEN8wfKYEz1L/eaAW1B3PT1WLv fN/MTxs0E+s7jZhHllL1oZh/vR8JfoFfjwu5QxdP9R2UC2qT/n+CBpOh/oFHBKhM ju7wZel9jurM/PHR28sy9YieaOK+b9Csan53isklEfKuw== Received: from dc5-exch05.marvell.com ([199.233.59.128]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 4efw8hw76b-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 01 Jun 2026 00:33:32 -0700 (PDT) Received: from DC5-EXCH05.marvell.com (10.69.176.209) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Mon, 1 Jun 2026 00:33:31 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH05.marvell.com (10.69.176.209) with Microsoft SMTP Server id 15.2.1544.25 via Frontend Transport; Mon, 1 Jun 2026 00:33:31 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id ECE8F3F7082; Mon, 1 Jun 2026 00:33:28 -0700 (PDT) From: Geetha sowjanya To: , , , CC: , , Subject: [PATCH v8 3/3] perf: marvell: Cancel CN10K DDR PMU hrtimer on device remove Date: Mon, 1 Jun 2026 13:03:18 +0530 Message-ID: <20260601073318.7098-4-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260601073318.7098-1-gakula@marvell.com> References: <20260601073318.7098-1-gakula@marvell.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjAxMDA3NSBTYWx0ZWRfX2k8a47EXMGhQ x3VEZO9QbSoe8fgA5vxrxQH8ATjXXakMeA7G/1nNomco3kkBzpMIici4EWLcq+Um95gA96TFJ3g /C66ZaMGhLsYt1DnZ6s724EVuhAxvzv+wz1mahfW1RKELqb1URRd1dLuqREhKPAdb69HiMNCq5W h2FTVEG9FSfJUARQi0FxA+ih9uK+c7fvUPt2eLCMLhbDcl5I2/nTmQ0XBM3yzgFkMvG3r82y2ri tNE/DDwiQeUlfRYLgKZIx8UjIjrABGKfYn/hWXN2Xh19Olsh8leRtNEciD9D4XpwBsDG5G923Vo JEJ+3KP9pdWOwI30hOuwYQeWS/3sFRUDYPj7fzoa7fxr7OTfywPVaOb6QFpL9ix3uV4SDC0qvg/ GOxRZkDbeRu5ckO1WAS/5k0JYp+IC76IRfrI9bGYOEsPfXMTPoid2ne2zZTJKC4/ZaVb6vXSwbo Zjekkc81U4FhfW3EgYg== X-Proofpoint-GUID: stzZQ0fRULCmDkINP2iZGQPWSZN_R5e5 X-Proofpoint-ORIG-GUID: stzZQ0fRULCmDkINP2iZGQPWSZN_R5e5 X-Authority-Analysis: v=2.4 cv=F99nsKhN c=1 sm=1 tr=0 ts=6a1d35cc cx=c_pps a=rEv8fa4AjpPjGxpoe8rlIQ==:117 a=rEv8fa4AjpPjGxpoe8rlIQ==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=EAYMVhzMl8SCOHhVQcBL:22 a=M5GUcnROAAAA:8 a=u0CBKMH8rBo-bx1LD9MA:9 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-01_02,2026-05-28_03,2025-10-01_01 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" cn10k_ddr_perf_remove() did not cancel the poll hrtimer before returning. If the device was unbound while perf events were still active the timer=20 callback could run post-free. To fix the issue by adding hrtimer_cancel() in remove(). Signed-off-by: Geetha sowjanya --- Changes in v8: - perf: Cancel poll hrtimer in cn10k_ddr_perf_remove() to avoid use-after-f= ree on device unbind (pre-existing for CN10K/Odyssey). drivers/perf/marvell_cn10k_ddr_pmu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/perf/marvell_cn10k_ddr_pmu.c b/drivers/perf/marvell_cn= 10k_ddr_pmu.c index 6f638dfe829b..9c82bf4ee2c4 100644 --- a/drivers/perf/marvell_cn10k_ddr_pmu.c +++ b/drivers/perf/marvell_cn10k_ddr_pmu.c @@ -1284,6 +1284,12 @@ static void cn10k_ddr_perf_remove(struct platform_de= vice *pdev) { struct cn10k_ddr_pmu *ddr_pmu =3D platform_get_drvdata(pdev); =20 + /* + * Cancel the poll timer before further teardown so the handler + * cannot run after this function returns. + */ + hrtimer_cancel(&ddr_pmu->hrtimer); + cpuhp_state_remove_instance_nocalls( CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE, &ddr_pmu->node); --=20 2.25.1