From nobody Thu Apr 2 22:23:01 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 9B63A1D45E8; Thu, 26 Mar 2026 09:07:01 +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=1774516024; cv=none; b=jrh/DVFmMHEgJTC44Vt5HWTfhfBz8pf42kmO7MRk3zX+uSYdcSampRRe1rHNWJEX/gQABYPil27RSaNm1ceeov8XMvfEQXd8dqv+128YvrUbzmYA2F+YN+ojOmY8bTxbCBlDi5rRg5lHUNhYIChPesOgLV6kg2FKDNM/UdcHbco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774516024; c=relaxed/simple; bh=8Dem+Qg7gHnBB++ByLPrNLh4BB7PBaE09mAU2r0hNDs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HlMY5EP4moH4X+W6bU+LsD1yOQj/g0GMGIiQEE7+ZbRBiC59X0aAw4Jq4DUnI0K5QTW1OY7ZO2KOjNg+KCL8nxWwp3RDCW8ESBD7Qv4q3z5YWGI9EukrdFzDGV3YlLAEr6ceRYCdtAZTdVPc35Ir/sUreaZqIjCjSTzEV1ZbCNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none 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=PCiG3Sgp; arc=none smtp.client-ip=67.231.148.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none 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="PCiG3Sgp" 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 62Q7H9fV2125486; Thu, 26 Mar 2026 02:06:53 -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=se03Pleb/yvbhpdA/nP9mguBl HjhILkDPsR0MJ+AyMY=; b=PCiG3SgpEbvWRQTu4kad+h6ehEIX2FG2sgfMFfm97 2IyIFOytkWTPP3y/A69tcRdT0Mn/XV597ExFDCjToeP8KWtgCrdPKKD6ItID4q9z Z76dQnmz174pryk/BpMda52ICP9POUgSPhFytaV805zXN/snHPyZK20TOAEjSueo 0jdLS0Yme9hlKE7Z/yYoqDZfeTLla7ssYwIOFQIpjhSU2qNF2s9RIywaEQgKmtSW ffEn9L8nt1UVZDjmuLMTrccAP9cMLQMsITrS5vTAe1c9d9yol9CyqKeqSN2UQt3Q QlyOCiKFIgzKBwFzMZIMkRVOGQ4OCXY8E/QKBFuKjnWTQ== Received: from dc5-exch05.marvell.com ([199.233.59.128]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 4d47nac0ts-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 26 Mar 2026 02:06:53 -0700 (PDT) Received: from DC6WP-EXCH02.marvell.com (10.76.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; Thu, 26 Mar 2026 02:06:52 -0700 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; Thu, 26 Mar 2026 02:06:52 -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; Thu, 26 Mar 2026 02:06:52 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id 995BD3F7041; Thu, 26 Mar 2026 02:06:49 -0700 (PDT) From: Geetha sowjanya To: , , , CC: , , Subject: [PATCH 1/2] dt-bindings: perf: marvell: Document CN20K DDR PMU Date: Thu, 26 Mar 2026 14:36:44 +0530 Message-ID: <20260326090645.22590-2-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260326090645.22590-1-gakula@marvell.com> References: <20260326090645.22590-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: AW1haW4tMjYwMzI2MDA2NiBTYWx0ZWRfX/J5Arq7S4bjC zQadQ6PFaV0w2/oFsNfaidkz+iO+2cu5Hi9YgIUeVHXLVR4qhx6vFlCwVYoDq6wkufZU2N/qT61 zoBL6eWy9IbAwL9OJn0fQWPPKTf/88z7ev3fwJdXTdQedyQXpx9lWCpZu/eYdVo/3z99S0bkeIg xXHTOAE/0BF0c1p+/UvQy5pacMXAl1lmIQ1FESU6js04bYI/MaVBpagdw2nqhgZmRSQx/j450Tr v0Vcno+IS7rFhHfpiwsaS8vw4clrt0Z/kGaQV6HNHJdTL4csFopMXee58ze6jqU5S++OobTU+/Y HBKNgfEKn7g8oJIPjTNQbvLaWZ6OJmS95keEWveK9pS6MRNTastgNXWEOU4nrKq3cHmyS4ZbWOp fEHeHc2NHl9g9GA2Qu5ff6ju2O+L2N1UV1f97J+HMHc/pJ3RKaAaNjCFqW441pEIusH8miSgpvM vBh8Wcj0HDsAEJHw6IA== X-Authority-Analysis: v=2.4 cv=LsifC3dc c=1 sm=1 tr=0 ts=69c4f72d cx=c_pps a=rEv8fa4AjpPjGxpoe8rlIQ==:117 a=rEv8fa4AjpPjGxpoe8rlIQ==:17 a=Yq5XynenixoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=EAYMVhzMl8SCOHhVQcBL:22 a=gEfo2CItAAAA:8 a=M5GUcnROAAAA:8 a=4RHyKZYBQQhKSXLDbdEA:9 a=sptkURWiP4Gy88Gu7hUp:22 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-ORIG-GUID: 0st2OJMtM2llfiW5VdOFHYLxAIjmqY_r X-Proofpoint-GUID: 0st2OJMtM2llfiW5VdOFHYLxAIjmqY_r X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-26_02,2026-03-24_01,2025-10-01_01 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a devicetree binding for the Marvell CN20K DDR performance monitor block, including the marvell,cn20k-ddr-pmu compatible string and the required MMIO reg region. Signed-off-by: Geetha sowjanya --- .../bindings/perf/marvell-cn20k-ddr.yaml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Documentation/devicetree/bindings/perf/marvell-cn20k-dd= r.yaml diff --git a/Documentation/devicetree/bindings/perf/marvell-cn20k-ddr.yaml = b/Documentation/devicetree/bindings/perf/marvell-cn20k-ddr.yaml new file mode 100644 index 000000000000..6677d9eb4ba3 --- /dev/null +++ b/Documentation/devicetree/bindings/perf/marvell-cn20k-ddr.yaml @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/perf/marvell-cn20k-ddr.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Marvell CN20K DDR performance monitor + +maintainers: + - Geetha sowjanya + +properties: + compatible: + items: + - enum: + - marvell,cn20k-ddr-pmu + + reg: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + bus { + #address-cells =3D <2>; + #size-cells =3D <2>; + + ddrcpmu { + compatible =3D "marvell,cn20k-ddr-pmu"; + reg =3D <0xc200 0x00000000 0x0 0x100000>; + }; + }; --=20 2.25.1 From nobody Thu Apr 2 22:23:01 2026 Received: from mx0a-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 2B52A3B9D92; Thu, 26 Mar 2026 09:07:08 +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=1774516031; cv=none; b=OLj9go8RbA9Ei1dbIc4HV5//rk/0spb5heoJ4b7RxXwk1gMeHiZOA7m+6savq49jgMXhaKFInVndKVlg54u6R3g0Buiu1MeX8isG3mIsPn2XOt7fup0qNYfq1eWP2CEtkpOZ4OzpmLNVDqnuB2ZSFLhiqTS6g8hLyFuVTThCEZw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774516031; c=relaxed/simple; bh=DoXQRe7hcWtxPGGVoRo1ja3dj3tJlCTl4VyNv9MFYKM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QiY8IF0MzltiT1JaJv3g0mpQieE4LCoUk9QOOGbguAAOs7qra1CINyTtNlz69G9CFomm89+wJ+nGQOYE/TQzQpEgLC71zrfX8ncTJsWW7xWntrqdcJQzdMTghIBPCCCVshrlM7EwDGeLQ5fJWAmgrjOXS8XD7JFAtxnDCJZlhoo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none 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=Y+CV6SBe; arc=none smtp.client-ip=67.231.148.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none 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="Y+CV6SBe" Received: from pps.filterd (m0431384.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62Q7PGQg147428; Thu, 26 Mar 2026 02:06:56 -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=L9xd7vMLFeG3N3Dmk/LIu/Jxg /dW3RJ5aKkQFlvfWY4=; b=Y+CV6SBeTpgxk5Bny2+XNVBuKogzyXUYt8NIfpnYa JRDC1pdsyHsmZU3VzLgazI5zZK9b2BsqwK9tudaQbILahf6BqbM37Ykv8xtst8jJ /n1bC/tv3nHfwurcu9KSUrNP9SXyE4pBjFJkd1lWfUKYGcor3EK9xcGOmrcLLi39 vfyjfJBCKv6JfaoVGErOcbKf647N2nrwEL02TwF4f3qbMnROm454zFlJZ6B4Zz4V gmnRY1Ld3+OyFkBK+KdQRT3ZyP3YRzx82GF9T+TlIdqNiLTa4RQTVUZLAj7wKKAj g8p1HdND1zB4WPPfm7iQSPiJMDJW04iIE3TMe1kLx8JBQ== Received: from dc5-exch05.marvell.com ([199.233.59.128]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 4d420jmsnn-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 26 Mar 2026 02:06:56 -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; Thu, 26 Mar 2026 02:06:54 -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; Thu, 26 Mar 2026 02:06:54 -0700 Received: from hyd1soter3.marvell.com (unknown [10.29.37.12]) by maili.marvell.com (Postfix) with ESMTP id 73E603F7041; Thu, 26 Mar 2026 02:06:52 -0700 (PDT) From: Geetha sowjanya To: , , , CC: , , Subject: [PATCH 2/2] perf: marvell: Add CN20K DDR PMU support Date: Thu, 26 Mar 2026 14:36:45 +0530 Message-ID: <20260326090645.22590-3-gakula@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260326090645.22590-1-gakula@marvell.com> References: <20260326090645.22590-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: 49G4pcon70oA1KZo_So4BdOd-gis6FZM X-Authority-Analysis: v=2.4 cv=ULDQ3Sfy c=1 sm=1 tr=0 ts=69c4f730 cx=c_pps a=rEv8fa4AjpPjGxpoe8rlIQ==:117 a=rEv8fa4AjpPjGxpoe8rlIQ==:17 a=Yq5XynenixoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=l0iWHRpgs5sLHlkKQ1IR:22 a=TtqV-g6YmW1Jfm2GSLaY:22 a=M5GUcnROAAAA:8 a=WnYttJQ71G5mWjJxUIAA:9 a=OBjm3rFKGHvpk9ecZwUJ:22 X-Proofpoint-GUID: 49G4pcon70oA1KZo_So4BdOd-gis6FZM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzI2MDA2NiBTYWx0ZWRfX5pnkDQgXda/h Tb5mfKMLPUV0+z7DvCuNMJ9DIOrdoDdNl8jpQHeXe35L/XDpeL4eKeznxEYAmwO4ERPSGgpw1bP KFOc7nR4J3VBXPPanR2iMWfZvgcNo1+1d4ctNS1IcpI2M1kN8ZyqCKNaMhs5IsBbACyFdIB4mmm QQyNE+qms2D6qeESQ5Y75Mw8+yx5Jf0kKWQb3uxzIG+zD7NPyDvPiO1OWmKrtDW8tkzw44lGUuP 9+xBTcHDEE29OM48eqYHYfvLwMPXoJecNlTmH5SNMnRVWOCcUyFXz0++noDO9KPfuwM3fEU2fLB Ur96P4ZPtiMW3dfb/0JHeuqTwqSC6v+s6qGuGmjDC00zWaCWLptU9tzGafrBsRAz+ahklvu08A5 pyLtc2M0SY4H1pIyh38RK33bybhYWgesXG8SHNIIKYe5hlRlF10t7OowmexP7brIL9akjVIiiIq XBgzgskUgvnz5Qapq4g== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-26_02,2026-03-24_01,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 Odyssey PMU code path where appropriate. Signed-off-by: Geetha sowjanya --- drivers/perf/marvell_cn10k_ddr_pmu.c | 187 ++++++++++++++++++++++++--- 1 file changed, 171 insertions(+), 16 deletions(-) diff --git a/drivers/perf/marvell_cn10k_ddr_pmu.c b/drivers/perf/marvell_cn= 10k_ddr_pmu.c index 72ac17efd846..7e2e1823b009 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,23 @@ * 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_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_CN20K_OP_IS_ZQLATCH 21 +#define EVENT_CN20K_OP_IS_ZQSTART 22 + #define EVENT_DFI_CMD_IS_RETRY 61 #define EVENT_RD_UC_ECC_ERROR 60 #define EVENT_RD_CRC_ERROR 59 @@ -87,6 +116,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 +215,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 +368,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 +499,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. @@ -412,7 +525,7 @@ static int ddr_perf_get_event_bitmap(int eventid, u64 *= event_bitmap, =20 switch (eventid) { case EVENT_DFI_PARITY_POISON ...EVENT_DFI_CMD_IS_RETRY: - if (!ddr_pmu->p_data->is_ody) { + if (!(ddr_pmu->p_data->silicon_flags & IS_ODY)) { err =3D -EINVAL; break; } @@ -524,9 +637,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 +659,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) { if (enable) { /* * Setup the PMU counter to work in @@ -621,6 +734,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 +756,17 @@ 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; =20 + if (silicon_flags & IS_CN20K) { + val =3D (1ULL << (config - 1)); + if (config =3D=3D EVENT_CN20K_OP_IS_ZQSTART || + config =3D=3D EVENT_CN20K_OP_IS_ZQLATCH) + reg_offset =3D DDRC_PERF_CFG(p_data->cfg1_base, counter); + } else { + ret =3D ddr_perf_get_event_bitmap(config, &val, pmu); + if (ret) + return ret; + } writeq_relaxed(val, pmu->base + reg_offset); } else { /* fixed event counter, clear counter value */ @@ -952,7 +1073,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 +1118,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 +1128,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 +1152,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 +1176,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 +1193,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 +1251,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 +1261,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