From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 51E822D9796 for ; Tue, 17 Mar 2026 03:26:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718008; cv=none; b=my3DXXf1Kq3MsLxPpEoWWoKCILKpnmXZwBHNlYwhsbRZ/hymgytI7LVE+iPmcyqoBN+M5u3p2eEaSjOjEjRleuumpxW3dn60ls70zO8C06GWcthiArCkN2FwCNvcXzx+E1y7hAbCj1e2DjesGYgjfQw5KZWOA3VR5yc9fn8cz10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718008; c=relaxed/simple; bh=HKFOu1fNblOcn/HFOdu48EyT+lBa2UuOd8Ya8wh5870=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sbrYM3aTIujV/QbJMX1wxq/n3afEA7Ne6HZiHnYqirFPhlgSv4q4z0LXJZ7DrExlBTJoK3j4Cz+0Igrm1Xt6vTthCKK+AW1wNu3Sgs1CCz1+4RVigsexZe6Gau9vGlbntuAnbK8ZfI8ctDU2RhjwPyCOGvYDGg0aHE6HAdXmbGw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=AAAnisiF; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=McacIj1p; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="AAAnisiF"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="McacIj1p" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62H293kq3124560 for ; Tue, 17 Mar 2026 03:26:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=g0+lG/T+afF 4ySmlryIDom0iKLYnuD7FP3qAhyNGYbE=; b=AAAnisiFj2zY5YrL3HKPnJJK/N7 2vH3oBAanY0B6iBl5Mnj4rU09pWMdtesDNyGNJhoDPO/e+rGpbw3+XuTPqJXm3Xk DxNmIftP3Cp2ngm38HzQ3Cc9pwvhNjfApjmhjlYX2370JKxdCYVJpnrkjDkMXkpQ vAUE5NSQYv2T54IIPAvcQyhlkigNXgDcv1reDZm/ypAFIKowlHqTpNnnp0LODkkQ 9wncZ/e9bjv80VZolW8G0bPOmRKLPZlDixYHZ0uZd0Y1GcyOnHw+uBkpZZEWIp3N L3HL/oKI3XSUuEfoX7HEtAl6zTUWcezLMUtoOa0HzI+XF3bGhhJqQ9CFSog== Received: from mail-dy1-f198.google.com (mail-dy1-f198.google.com [74.125.82.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxfsmk8xa-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:26:46 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-2bda35eab74so204523eec.0 for ; Mon, 16 Mar 2026 20:26:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718006; x=1774322806; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=g0+lG/T+afF4ySmlryIDom0iKLYnuD7FP3qAhyNGYbE=; b=McacIj1pE6quuTF18MXplcbQnm3olLiEISiGNZYdoJBWupkESrQZZctvrAqeqFxqzk hK1+Mz2NDMHu/b7pzlStDFyH3YZmTsSZv5oC2szAFo4qF9YXGfXHujxxVC/hUYNri0u4 KOm6hoNLVCRfO/BGFItTrn93QRHFAzxDgjmlpmz5pU3XK0JjWsyyhxTkaKsBa1gL0wSW hpwZeelwGrAdDrUV53SFgQCm9/VANHI4MwsYpCuOhcKTTPBZ4cR+X/corvih2eaIvnFS InJVw/spjxIIluUxHedk67PBIobYE1LJjiqNsbWChSWFsNY570zqaAeUKS1+EiL0KKko 6rkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718006; x=1774322806; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=g0+lG/T+afF4ySmlryIDom0iKLYnuD7FP3qAhyNGYbE=; b=cd9+/UleyFEoES0s9873IDVlCl1Vt41ckYPlCbEDCpqaTySKNCQxfGUgLwsDYJnqFo 8/ne7v6WNZ3KaH0oA4TfAlkw2ECJK9Wm4R3qgc3QSSGYu8HEet4YIAH1cMgQVpynh+0m 5xdEEuefNmj5/Qf61X/kIiu/LO7aOIXOv6ESI00ep8V3vw/4ERgwqIadadFaA7KK7ZUq xVqaemZjcRKfIrkjccjMY7Hsun5RB9bCiXDQGMp6VX1CYfd4hA6hawu0Zob+pAIrAw1m YW2Yg5sU46LkFAKTHGqy0qGXEhjrLvMS0hhGPQmCzRaOFsM6yKsIC9JQ7yh+4tbJpe2B gP0A== X-Forwarded-Encrypted: i=1; AJvYcCVS/gVLbLvJAipn/KWjO/L7nkPWVtoFMfPH7YyrjHl3RliwlVx/u7qIIVYRtnP4xCmvAxpKH9nuHjdembI=@vger.kernel.org X-Gm-Message-State: AOJu0YyTQ1030RXY3neKwX3412DnJnnCZ40F2WatQuUbis55f6kjicgl ROGQNFZkX12o1jVlZmVj7WBSDfu+5VlCupFbAbsrP3ilhoJaqK4i9bLx4jA2DElCqC08ZrMctGM UdGB5dj8JGxbQ2BEFodNLyuJPRGgR3PN72vVaJ3lchlFYX7HmodfxBlZL+P/mkI7zj3s= X-Gm-Gg: ATEYQzwJXuh4TGBq6LBsXSiHSuU6WUykauInpB8N3tji5cHp9Sou9uCGZVs7q+kKtna nW2cBQG1Dm/NXOMl0Cd/3oqe27Tndcp5xsLozndD83Tg0UO5St5e6tuyQyQApCoSeaA4WcX+j3q +jsfKIoOe5rurkZ2MwNPatc+P9GhEKTe4u5+zwYno+M/Bw9E2zAcAG/o74NpHk/Hql+BVtVITpH N4IVy6EPYlfa1dFrWpVwZf0kDk3314I4gGLpUSlBEcEF4T9yCs7uCVOYtIwzqohC/EQiJb5pSpl RngKQIu4AoxKtiBPUo027ogX3b8QDi72hDbi5I8YmrzNfygQkQLoLRycnjMmthPCIiQgy884np7 NEqYbchlU2UO10Rp1DcuCouWtXnjslwmp3/dZvO58iaaoHFvheRRrdKbuZRFNNYkg0PBc0O9154 Hg X-Received: by 2002:a05:7301:1001:b0:2be:b02b:1b3f with SMTP id 5a478bee46e88-2c0d51f2448mr704166eec.13.1773718005839; Mon, 16 Mar 2026 20:26:45 -0700 (PDT) X-Received: by 2002:a05:7301:1001:b0:2be:b02b:1b3f with SMTP id 5a478bee46e88-2c0d51f2448mr704157eec.13.1773718005213; Mon, 16 Mar 2026 20:26:45 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.26.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:26:44 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org, Rob Herring Subject: [PATCH v12 1/7] dt-bindings: arm: Add support for Qualcomm TGU trace Date: Mon, 16 Mar 2026 20:26:33 -0700 Message-Id: <20260317032639.2393221-2-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfX5brjLLgH2g3N CWvSDTxwGntu72R2jL0zpg6XirIX/SwAEojgZxN08+QNsGLdeuizox1ybaOH6DBuKoAMVKl8x2v lVRwkt6vygkiDE1xh5umtGnQeWAErDbnxVK+to6JuwaFXRiHLvI/Z0u4IssjJiL79nkGwRXQZ3h MObomHW/O7aK8GyJXTqJKiSLmUxzWBhLhQjWisKmQw2cyqZx256lKUjk8Hwr52NZc/anXkEnNo9 SfWxrEzd7cTUqIGy/5Ju5VTTGTjwxThrczqecc7GN5ErkE829hk1rutznF1fQSTbJDxdWZDHMn5 EB5dHGMYk0F8QYIdXCG0HSyM0lwSo8ZVGJZdEKzn/zIWGH58R6Za4PpE0K+73yAgirbkSUM2GAk AnkXJI5o2FFNvbgk01NTiE6r2CXHrC63+RSeeou2sGUDwF+T92p4N7eH63zvnOKEd/clmR2V3UM tnrNd/DO1dWY3FHdRqQ== X-Proofpoint-GUID: x_yVa6yJgBofXxgH-zH053VaAee-QwTW X-Authority-Analysis: v=2.4 cv=V/hwEOni c=1 sm=1 tr=0 ts=69b8c9f6 cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=gEfo2CItAAAA:8 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=N3VNWiZ0WD7Ir0aJMQYA:9 a=bBxd6f-gb0O0v-kibOvt:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-ORIG-GUID: x_yVa6yJgBofXxgH-zH053VaAee-QwTW 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" The Trigger Generation Unit (TGU) is designed to detect patterns or sequences within a specific region of the System on Chip (SoC). Once configured and activated, it monitors sense inputs and can detect a pre-programmed state or sequence across clock cycles, subsequently producing a trigger. TGU configuration space offset table x-------------------------x | | | | | | Step configuration | | space layout | coresight management | x-------------x | registers | |---> | | | | | | reserve | | | | | | |-------------------------| | |-------------| | | | | priority[3] | | step[7] |<-- | |-------------| |-------------------------| | | | priority[2] | | | | | |-------------| | ... | |Steps region | | priority[1] | | | | | |-------------| |-------------------------| | | | priority[0] | | |<-- | |-------------| | step[0] |--------------------> | | |-------------------------| | condition | | | | | | control and status | x-------------x | space | | | x-------------------------x |Timer/Counter| | | x-------------x TGU Configuration in Hardware The TGU provides a step region for user configuration, similar to a flow chart. Each step region consists of three register clusters: 1.Priority Region: Sets the required signals with priority. 2.Condition Region: Defines specific requirements (e.g., signal A reaches three times) and the subsequent action once the requirement is met. 3.Timer/Counter (Optional): Provides timing or counting functionality. Add a new tgu.yaml file to describe the bindings required to define the TGU in the device trees. Reviewed-by: Rob Herring (Arm) Signed-off-by: Songwei Chai --- .../devicetree/bindings/arm/qcom,tgu.yaml | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/qcom,tgu.yaml diff --git a/Documentation/devicetree/bindings/arm/qcom,tgu.yaml b/Document= ation/devicetree/bindings/arm/qcom,tgu.yaml new file mode 100644 index 000000000000..76440f2497b9 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/qcom,tgu.yaml @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/arm/qcom,tgu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Trigger Generation Unit - TGU + +description: | + The Trigger Generation Unit (TGU) is a Data Engine which can be utilized + to sense a plurality of signals and create a trigger into the CTI or + generate interrupts to processors. The TGU is like the trigger circuit + of a Logic Analyzer. The corresponding trigger logic can be realized by + configuring the conditions for each step after sensing the signal. + Once setup and enabled, it will observe sense inputs and based upon + the activity of those inputs, even over clock cycles, may detect a + preprogrammed state/sequence and then produce a trigger or interrupt. + + The primary use case of the TGU is to detect patterns or sequences on a + given set of signals within some region to identify the issue in time + once there is abnormal behavior in the subsystem. + +maintainers: + - Mao Jinlong + - Songwei Chai + +# Need a custom select here or 'arm,primecell' will match on lots of nodes +select: + properties: + compatible: + contains: + enum: + - qcom,tgu + required: + - compatible + +properties: + compatible: + items: + - const: qcom,tgu + - const: arm,primecell + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + clock-names: + items: + - const: apb_pclk + +required: + - compatible + - reg + - clocks + - clock-names + +additionalProperties: false + +examples: + - | + tgu@10b0e000 { + compatible =3D "qcom,tgu", "arm,primecell"; + reg =3D <0x10b0e000 0x1000>; + + clocks =3D <&aoss_qmp>; + clock-names =3D "apb_pclk"; + }; +... --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 E41D62DB7AE for ; Tue, 17 Mar 2026 03:26:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718017; cv=none; b=oBLsNcVF1Jabivdlz8+tgobzqCP6rNfJbjIyQUrEdRd+mCgb75KK4azlmbsNuLax4BDBHQQDXYjlNmIl3vbLVqoTIVrq7/afhcDfgw+IfGUQ5D+Iw0jjv34/WL9VqtTUJsDqhP3tnSLgzEGsd2HlCMwcf0WCTYPhTILxoQbdJs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718017; c=relaxed/simple; bh=ZEyK/NvC8XhHV1VMN7UZRw/1Zd8JOXVVzsp0ONavdKc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lxH1ip/yFIDeHw/D6aD1yCiet2DyA8E3LiBQNO5JssBfTVEeomS7KDF568+o+WjLXIJ7jXEZAgRJU6KnreHdb5C+ckEbcj2z+w5KXxiNmFYenUnIwXu75DY7bTxGmnOHwcWlIHwfcRZqPwML6SHTVNfzz7ToYieJMH5E11pSUFw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=baDrXJIh; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=YNwxejWu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="baDrXJIh"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="YNwxejWu" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62H2VYKE3101993 for ; Tue, 17 Mar 2026 03:26:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=rjTMyY/nVZ5 E0ydjO3Px6iHuenx+E5iNzGh3OC3CnXU=; b=baDrXJIh7x2gDW1lg/mOJoYi7Gp MxmF4JWQSzPyHdyOZq0hKN6PMukY7SZ9WyrLe3TAul16AGmYylLAbxKdQv65Hc+j Rfo5h4/KmeLXUD+eYpGeckJvn41bP+4hm6aASlJGy849lFsFs86re8TXO0FGWw5y pUdHkh7T0eZYPaud5JmTgfZObNz9pPxyMp1p9jWSGr7PBTs2WD+JMxz5mjyBJbRt 2b8tw04OmAZPclkQJIRy7Nok4NOl29wjsk5cpHkCSz0ODeZ9372E2xrjrpU461QY AMysuBv1lbM8W8tVocA4BsJTJ3EDysXaMT/KUAXfUfz473p+lDk/w6Qr5SQ== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxnb79x1r-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:26:53 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-2bea80a5849so77043182eec.0 for ; Mon, 16 Mar 2026 20:26:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718012; x=1774322812; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rjTMyY/nVZ5E0ydjO3Px6iHuenx+E5iNzGh3OC3CnXU=; b=YNwxejWuMiVkxehY+myeuj/+Um9pKz66+VfA6aG6Uos543C+u9RMQm5rKDJvOrxD8T UCPX1IS/0koUw7H7rpqoT8BOV+mBCMaey96IEwgTERPPYB5aWvXKdWih5Nrp16+07hfe KyuyAkr/aGBVISDxv0v0f1qARSbvWdp9tPyiC7tBTtdrkAHQwIkBLbHCcOCwtFRdAtKb LJL3JT0QkU/mwEV8sEyqZwBYGWzQwgm3hOXcb/zbacGMP0TITmeV3bsKZGWojHB3invX DtQ4dbm9tZommBuUcNc5vQk0HwP2DMAFG+emkzn3eW3ys1V/pCO+F3/U2rXEqDg8SR24 uY6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718012; x=1774322812; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rjTMyY/nVZ5E0ydjO3Px6iHuenx+E5iNzGh3OC3CnXU=; b=XsTnB8PvrccJRB6E7NroMCgrPa1ikIFUChSHltiuli5BHVNqIcwlkCXGg69KjdWxQX 19C396Kn40VZb76qSvK0mH88wOzRfvsX2BPgxcCNSlDV7PpHDgIoEuv6isR4zMsl+oBZ Z7Gs5D8/BDlLPO3bwT8KQIy9popxrP4EpBJtLGLLtVURdc4/+nwTmWpgPIZRh1Xq2if4 19W1HKtsC63m+cUdeHk5p4kBCUnaykAAt3jT4UEaj3W6KvO87XpzzLL9UCl+JNAPLRDz tb/wBHxEtPkN15pyN4QfnWthcnhaPGtcAeoRAt8OGjjzO/TByByIXfzaFJQZFYtJG0Cr Pcnw== X-Forwarded-Encrypted: i=1; AJvYcCWosxjjNdj/PfMKuChFY+gARaz6NdB/IFJfhGA2MT3YXkDH3Bq31S3Wj3qda9d8+uGoBMV6owrtwdG+L38=@vger.kernel.org X-Gm-Message-State: AOJu0YwPY7fZDcA+LAp58YRZoC+xSMZcE/oS2QZCW/kQeKfTxUcmjwY2 zsyzFqxf9es+zDTRVYHb1zdXmud+T1y3RBLrMtCeIa5OvL1HkBY9akIZyngJ2SoydD2ZOHV2UuC EA1NWolOdMzU+U0NDr/9ExslZsIgr6c2kuiLrZe33klDkv4cUjIL4abxs1G8ZOaPwMHY= X-Gm-Gg: ATEYQzxhzKeahxg4ZdbXRDD0Z6a2NO6wK72YgBhf4WrlXRYit4VD3gHCyG9GKqcVsRm 6qhzrailWdh8BhwpD5VTLTuc/54fJ0b/VUI6ffIOsyD3Q+yV+mN88ggtrMhMY/bEJm7wI6HUlkk ayR75lTGtArIg0o4lx1KOOCVcAMz18XyivYELlCPxcrW+RXhEs+GwVB6dc7+ed0158AEOYveSTu KrpMz8XlQOXlsRw7ogcpSTTfqAs1RJbPEEflx2EMkyDOIvdJ/M/gHYuqavXFe2N5Is2GNLfJVlz uqiR7+jBrDEdQ37zmh8n1WhH1nzzp1s1aMYJr78m0D+y5pwWS8kWLX6L3ZXcCvinpqVNzfvVogr ndZUlWfvHJWWisqgTo8ufFX6ciNDvV8ogUv9jkYEA3oSPOUSVEKGOrg2txhOPrzyWzOncG6X10D j+ X-Received: by 2002:a05:7301:1f17:b0:2c0:c63d:e02e with SMTP id 5a478bee46e88-2c0c63de76amr2980182eec.3.1773718012313; Mon, 16 Mar 2026 20:26:52 -0700 (PDT) X-Received: by 2002:a05:7301:1f17:b0:2c0:c63d:e02e with SMTP id 5a478bee46e88-2c0c63de76amr2980160eec.3.1773718011716; Mon, 16 Mar 2026 20:26:51 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.26.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:26:50 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 2/7] qcom-tgu: Add TGU driver Date: Mon, 16 Mar 2026 20:26:34 -0700 Message-Id: <20260317032639.2393221-3-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfX7bB3tpO+02Ha ey7EDpEw1nNnYAT7UeTQ1OIp5MohXrbSqOXpvQGffvom4LFqOu4fkU53CjlLii3NdHAUd33l2xk XQV+VLqbgOfMZrOpG4oDjpEDoDa3NT3485UXyvckIt0XtTLnIeD02GHfUJGq7C0DfP4Z29g/ZJy xwS6aeK1VhzJSN1il7aqSzuetujMhOc+8IjMgq+FJNWvHo6aRAlmAmzDXtn+3FvksmZghA3EMOG 85DFpuPp/w0YXS4tr/i/OKM4bHmKZrwzmPZJpefxOxG748BqI79kTD5XPhLiFvxLEfOQKWtaOrA RCDLMrDv2EBI55hl3NBaxmgxqyDQD220+OfKAvjd/LDnZXzjm05hnhT76cvUV5JCuWdC983YPRV BE4pHoXxdj6BwucEpVLt4FsdRE5zBnGjlJQJZF0/e9NjkdnNsn1IRPtkarfFVDP+mbyhpbdC7Xv McvOVFeNVUURVjyy3Zw== X-Authority-Analysis: v=2.4 cv=D7pK6/Rj c=1 sm=1 tr=0 ts=69b8c9fd cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=h99DN6MNysFgGb7_OMAA:9 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-ORIG-GUID: IBzv9NAVwgzGw6eUJpWjmxQJcOlBwzsp X-Proofpoint-GUID: IBzv9NAVwgzGw6eUJpWjmxQJcOlBwzsp 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 clxscore=1015 suspectscore=0 spamscore=0 malwarescore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Add driver to support device TGU (Trigger Generation Unit). TGU is a Data Engine which can be utilized to sense a plurality of signals and create a trigger into the CTI or generate interrupts to processors. Add probe/enable/disable functions for tgu. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 9 + drivers/Makefile | 1 + drivers/hwtracing/Kconfig | 2 + drivers/hwtracing/qcom/Kconfig | 18 ++ drivers/hwtracing/qcom/Makefile | 3 + drivers/hwtracing/qcom/tgu.c | 183 ++++++++++++++++++ drivers/hwtracing/qcom/tgu.h | 51 +++++ 7 files changed, 267 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-amba-devices-tgu create mode 100644 drivers/hwtracing/qcom/Kconfig create mode 100644 drivers/hwtracing/qcom/Makefile create mode 100644 drivers/hwtracing/qcom/tgu.c create mode 100644 drivers/hwtracing/qcom/tgu.h diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu new file mode 100644 index 000000000000..ead237bb7d89 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -0,0 +1,9 @@ +What: /sys/bus/amba/devices//enable_tgu +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the enable/disable status of TGU + Accepts only one of the 2 values - 0 or 1. + 0 : disable TGU. + 1 : enable TGU. diff --git a/drivers/Makefile b/drivers/Makefile index 53fbd2e0acdd..82b712a12a26 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -177,6 +177,7 @@ obj-$(CONFIG_RAS) +=3D ras/ obj-$(CONFIG_USB4) +=3D thunderbolt/ obj-$(CONFIG_CORESIGHT) +=3D hwtracing/coresight/ obj-y +=3D hwtracing/intel_th/ +obj-y +=3D hwtracing/qcom/ obj-$(CONFIG_STM) +=3D hwtracing/stm/ obj-$(CONFIG_HISI_PTT) +=3D hwtracing/ptt/ obj-y +=3D android/ diff --git a/drivers/hwtracing/Kconfig b/drivers/hwtracing/Kconfig index 911ee977103c..8a640218eed8 100644 --- a/drivers/hwtracing/Kconfig +++ b/drivers/hwtracing/Kconfig @@ -7,4 +7,6 @@ source "drivers/hwtracing/intel_th/Kconfig" =20 source "drivers/hwtracing/ptt/Kconfig" =20 +source "drivers/hwtracing/qcom/Kconfig" + endmenu diff --git a/drivers/hwtracing/qcom/Kconfig b/drivers/hwtracing/qcom/Kconfig new file mode 100644 index 000000000000..d6f6d4b0f28e --- /dev/null +++ b/drivers/hwtracing/qcom/Kconfig @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# QCOM specific hwtracing drivers +# +menu "Qualcomm specific hwtracing drivers" + +config QCOM_TGU + tristate "QCOM Trigger Generation Unit driver" + help + This driver provides support for Trigger Generation Unit that is + used to detect patterns or sequences on a given set of signals. + TGU is used to monitor a particular bus within a given region to + detect illegal transaction sequences or slave responses. It is also + used to monitor a data stream to detect protocol violations and to + provide a trigger point for centering data around a specific event + within the trace data buffer. + +endmenu diff --git a/drivers/hwtracing/qcom/Makefile b/drivers/hwtracing/qcom/Makef= ile new file mode 100644 index 000000000000..5a0a868c1ea0 --- /dev/null +++ b/drivers/hwtracing/qcom/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_QCOM_TGU) +=3D tgu.o diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c new file mode 100644 index 000000000000..58c19f12f3d7 --- /dev/null +++ b/drivers/hwtracing/qcom/tgu.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tgu.h" + +static void tgu_write_all_hw_regs(struct tgu_drvdata *drvdata) +{ + TGU_UNLOCK(drvdata->base); + /* Enable TGU to program the triggers */ + writel(1, drvdata->base + TGU_CONTROL); + TGU_LOCK(drvdata->base); +} + +static int tgu_enable(struct device *dev) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + + guard(spinlock)(&drvdata->lock); + if (drvdata->enabled) + return -EBUSY; + + tgu_write_all_hw_regs(drvdata); + drvdata->enabled =3D true; + + return 0; +} + +static void tgu_do_disable(struct tgu_drvdata *drvdata) +{ + TGU_UNLOCK(drvdata->base); + writel(0, drvdata->base + TGU_CONTROL); + TGU_LOCK(drvdata->base); + + drvdata->enabled =3D false; +} + +static void tgu_disable(struct device *dev) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + + guard(spinlock)(&drvdata->lock); + if (!drvdata->enabled) + return; + + tgu_do_disable(drvdata); +} + +static ssize_t enable_tgu_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + bool enabled; + + guard(spinlock)(&drvdata->lock); + enabled =3D drvdata->enabled; + + return sysfs_emit(buf, "%d\n", !!enabled); +} + +/* enable_tgu_store - Configure Trace and Gating Unit (TGU) triggers. */ +static ssize_t enable_tgu_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + unsigned long val; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret || val > 1) + return -EINVAL; + + if (val) { + ret =3D pm_runtime_resume_and_get(dev); + if (ret) + return ret; + ret =3D tgu_enable(dev); + if (ret) { + pm_runtime_put(dev); + return ret; + } + } else { + tgu_disable(dev); + pm_runtime_put(dev); + } + + return size; +} +static DEVICE_ATTR_RW(enable_tgu); + +static struct attribute *tgu_common_attrs[] =3D { + &dev_attr_enable_tgu.attr, + NULL, +}; + +static const struct attribute_group tgu_common_grp =3D { + .attrs =3D tgu_common_attrs, + NULL, +}; + +static const struct attribute_group *tgu_attr_groups[] =3D { + &tgu_common_grp, + NULL, +}; + +static int tgu_probe(struct amba_device *adev, const struct amba_id *id) +{ + struct device *dev =3D &adev->dev; + struct tgu_drvdata *drvdata; + int ret; + + drvdata =3D devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + + drvdata->dev =3D &adev->dev; + dev_set_drvdata(dev, drvdata); + + drvdata->base =3D devm_ioremap_resource(dev, &adev->res); + if (IS_ERR(drvdata->base)) + return PTR_ERR(drvdata->base); + + spin_lock_init(&drvdata->lock); + + ret =3D sysfs_create_groups(&dev->kobj, tgu_attr_groups); + if (ret) { + dev_err(dev, "failed to create sysfs groups: %d\n", ret); + return ret; + } + + drvdata->enabled =3D false; + + pm_runtime_put(&adev->dev); + + return 0; +} + +static void tgu_remove(struct amba_device *adev) +{ + struct device *dev =3D &adev->dev; + + sysfs_remove_groups(&dev->kobj, tgu_attr_groups); + + tgu_disable(dev); +} + +static const struct amba_id tgu_ids[] =3D { + { + .id =3D 0x000f0e00, + .mask =3D 0x000fffff, + }, + { 0, 0, NULL }, +}; + +MODULE_DEVICE_TABLE(amba, tgu_ids); + +static struct amba_driver tgu_driver =3D { + .drv =3D { + .name =3D "qcom-tgu", + .suppress_bind_attrs =3D true, + }, + .probe =3D tgu_probe, + .remove =3D tgu_remove, + .id_table =3D tgu_ids, +}; + +module_amba_driver(tgu_driver); + +MODULE_AUTHOR("Songwei Chai "); +MODULE_AUTHOR("Jinlong Mao "); +MODULE_DESCRIPTION("Qualcomm Trigger Generation Unit driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h new file mode 100644 index 000000000000..dd7533b9d735 --- /dev/null +++ b/drivers/hwtracing/qcom/tgu.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef _QCOM_TGU_H +#define _QCOM_TGU_H + +/* Register addresses */ +#define TGU_CONTROL 0x0000 +#define TGU_LAR 0xfb0 +#define TGU_UNLOCK_OFFSET 0xc5acce55 + +static inline void TGU_LOCK(void __iomem *addr) +{ + do { + /* Wait for things to settle */ + mb(); + writel_relaxed(0x0, addr + TGU_LAR); + } while (0); +} + +static inline void TGU_UNLOCK(void __iomem *addr) +{ + do { + writel_relaxed(TGU_UNLOCK_OFFSET, addr + TGU_LAR); + /* Make sure everyone has seen this */ + mb(); + } while (0); +} + +/** + * struct tgu_drvdata - Data structure for a TGU (Trigger Generator Unit) + * @base: Memory-mapped base address of the TGU device + * @dev: Pointer to the associated device structure + * @lock: Spinlock for handling concurrent access to private data + * @enabled: Flag indicating whether the TGU device is enabled + * + * This structure defines the data associated with a TGU device, + * including its base address, device pointers, clock, spinlock for + * synchronization, trigger data pointers, maximum limits for various + * trigger-related parameters, and enable status. + */ +struct tgu_drvdata { + void __iomem *base; + struct device *dev; + spinlock_t lock; + bool enabled; +}; + +#endif --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 BE0112DC77F for ; Tue, 17 Mar 2026 03:27:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718027; cv=none; b=TZN8xb0g5cTpzBNIZsf7ij8TQ7AM6+vaYiIM4Cnvfyng8/5nZwYE2bldLBVhg7W7bItj5uoybEaI7EXuQ45/4YhxDr6NjKIHoTgrhpbEX4zmT3u47mSk6uZJEi6lo9VUCJY6FnIjoo+tR1oE7wouCcnM5cRI1UEQMN5toxsv408= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718027; c=relaxed/simple; bh=6OxTIth3XLaCQJK5ocPj3o3D7d/7hhTYuzmIGv6d7Yk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dXPcg8uR/nDTK9slabkQarrCJNz6QGhOIvUcCg/bjVcyOsKkuaXrw0qIoag4cQx6S3gQrcwDASV2DjW28/ahiXy5d4m3Kv8jeyM8eNGpqJyxZcWkKP/OX5n3CCaoF45xvwaAzSNhVy/u+47kLN5Gu8rLjLzgTsYkWd1nHXAQW/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=aPO0w6Tg; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=SbONtGPj; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="aPO0w6Tg"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="SbONtGPj" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62H11D67795518 for ; Tue, 17 Mar 2026 03:27:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=UWTjUnOEy98 pmy4x0tkR2J5JPcNFw5eKf+O7f0LuM9A=; b=aPO0w6TgGjYeVktFxVVaiTNR6+U dzeVwueX4io/S9K0bNHM2PAv4mbgaACi4zMDSikIoUoi86+51d7/SqarevExYWP0 P1So0JdSxP2L0va2NeIIKsHkajDq13WuDiIHkr2/nWomDx+INK0XKI6ZNWGYz92c MMlL+XoiPyJzW23O5rTu+z5Wf9usBKtwiJWGtiUYQiCYnk+ZiAzlQbE2YmyDnx/4 23x7ZJtxeJWbYuU6uPfJS6y5WdFtUkH0IXXzRDKqTCpw5dHa4L98ErmSug365Rz9 +t82dnO86nAGA00WZOAuNztQ1+VfqqaaEa5RIPhZ7HKMtI+MoOfPXExQ5FQ== Received: from mail-dy1-f198.google.com (mail-dy1-f198.google.com [74.125.82.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxm6d25m2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:27:05 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-2c0cd2e4aa6so29005306eec.0 for ; Mon, 16 Mar 2026 20:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718024; x=1774322824; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UWTjUnOEy98pmy4x0tkR2J5JPcNFw5eKf+O7f0LuM9A=; b=SbONtGPjtOP9H+mRbZFDtzylo0m0yO84CdGmNahMn0uIxWXU5PfIgUgmZ+rpzWzNUt u91LlkEpyTig91fEA7T2LkOCfciIb6X0tNDH3H5yhOMLZQrBvzR2UOpuZjAtUmvU5NrD JxAb4aJuZ7TopjkhIozgre/EI9m/wpob1IZaAvU1YIZIqH+BWjHpR+bjF65HJVNIWwE+ +ZIOAxIimtJ74rU1kmC7ov/q9Tqhc73jHU8ihLHbyiFdumPyLZLB0IT+HsqyzW74qaEa nIl/4PL0R1gCwihXGZeNsnQholvPqzcm0h2MG4xX6YsKFwBuypo+WYtgLqUuDHTKa/ej bECg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718024; x=1774322824; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UWTjUnOEy98pmy4x0tkR2J5JPcNFw5eKf+O7f0LuM9A=; b=MZpuskTm4yJHe6vm7bgf6q3rXpl5P7q4/nINznI8H1KESi3ICutbe151+vvB+tITrK KgxEgyzDQDr1NVNBlwQ9E6ro2NE6ei7HO0O1uAai2KADK1jsd7JHgcbc/H8efsCWnZO2 vocR8ZqJNPkQP6d4iqBiOLl2UdGteWKHK/dDk6Rfp/eaYh1ivZTcv4i7IZng5ntWhyot z1uDsT0M8tyjLyTs/HO26f0gzsTxWSJ14f8tB9cXhK0C0+FreAvlDg7gwO1/8kykZKMP C9iapeX+tepqapIddDMQ2RAjRI4Wem79grcmrDmDgW6JKgyvB+5BY1pMnqI6iGfMnHZX /HSA== X-Forwarded-Encrypted: i=1; AJvYcCW5PHkM+hOt+9Y8BS7vPvqfxAc6bFsfYzJJfGM3aQiT/IEAgL2KlNxM9Tcp7IjQTAsgS/oGmGf+1OMCoQ8=@vger.kernel.org X-Gm-Message-State: AOJu0YwadBC54onEp1+xOsvFfHtxcsV4tTQ/4ZcZ9Kez6I8VVFKz64ht MWZ+HhxCAdGvLqzebBLr7dH+wbL3HwQlWmBp8R6TwuXb2bKUKYKcNciWrjjXWIrtgyU8hGBsEkb /zlnFRWVpxtlSRNaPtLSM1wYOEqzw6LJRS6Ske2hcp0tVZMvDyPUpYnpcJPQbhiyVVwk= X-Gm-Gg: ATEYQzzuvGB4g0PsNVfCFYNLopVC/WepouUN/M9h22GIszfbA5k7mAQWDL64Hw8EPC6 Xu97KpLU63X+nOflQ0AIuKzC7W/ZR78NJUk0HFnmVPzrIoepwD7ox+eFtXvO1mBnsjw/eklZsIM 3CwsV7vqJLU895OJqKSUu72z6O4NEnN6h1uq9k5ScoxldSkxg5NSS+BT7V/4sElRVLNVIOrgpFr H4VsozYlF3mTONLRQ42eMlPlYTY58ESMPiJTWxOvtsem4v60OeCJrdGIuPzasUFoyaE9ItT0GYt nwQ+BKnpwkPzlxtyPE8z4Sea4kMjIjtumoktbW1B6lCRlJsXWweBux+xb4q4lMMuO8Zcf1btMnk d7hUadQ7QxLvyEsbDa/vjnkysSGX51B1r5G4q8cbuG1M3EwW/Wamy9HTVyx1tIhCoQeD2xSh80T LP X-Received: by 2002:a05:693c:3104:b0:2be:126c:e335 with SMTP id 5a478bee46e88-2bea54504e4mr6969066eec.10.1773718019285; Mon, 16 Mar 2026 20:26:59 -0700 (PDT) X-Received: by 2002:a05:693c:3104:b0:2be:126c:e335 with SMTP id 5a478bee46e88-2bea54504e4mr6969050eec.10.1773718018436; Mon, 16 Mar 2026 20:26:58 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.26.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:26:57 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 3/7] qcom-tgu: Add signal priority support Date: Mon, 16 Mar 2026 20:26:35 -0700 Message-Id: <20260317032639.2393221-4-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=c7+mgB9l c=1 sm=1 tr=0 ts=69b8ca09 cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=aHbVEu0FunmFpxPyS6YA:9 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-ORIG-GUID: CGf_bIjbobV72e_CdeNHta6sJm2Rn1oT X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfX9cYeurGTSFHc O9DkeyRIlep4WK4ynpgEYarqFuv2jgIIYh4qgzCVT4+l38T/Yiejib70WIagxw1GSDFyqqmhPc/ oW1rKRbPPzqx60DfDz3wKcMsakXcrqfdYyK+f3oB7TfZAD0R78OF8eHU7YkHKBEXM1dfAY7tdtt nxPsaGh3ZY3ZRVd8b9gGKsmp7wSdq/YGRZGaQVMiJgaXa9V7iCFzsBtApb4XQFr22rv2DT+jDEU KhR7eM1FsVmmozKGgosLOaBLFKtYSEPtov8BQQ/1hJ5V65fvfkBou9wJBEOJHsStZBuq7dmtXW/ 6svRtBOdR7iw4WWcETf5GIu/UZrxTwd0gkXl8teymMdVFYUeKE/LSadk8WgnS1PD7eBXCtldRex JjhPmLk8GiznmAZQsf2NmMIzGhrhLcARjXyyK2yPEyfn5WeQt1jtB9pgsTIqU8bHcC12NbVZsiM rWwQPfX0384Ghef2fDw== X-Proofpoint-GUID: CGf_bIjbobV72e_CdeNHta6sJm2Rn1oT 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 malwarescore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Like circuit of a Logic analyzer, in TGU, the requirement could be configured in each step and the trigger will be created once the requirements are met. Add priority functionality here to sort the signals into different priorities. The signal which is wanted could be configured in each step's priority node, the larger number means the higher priority and the signal with higher priority will be sensed more preferentially. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 7 + drivers/hwtracing/qcom/tgu.c | 161 ++++++++++++++++++ drivers/hwtracing/qcom/tgu.h | 114 +++++++++++++ 3 files changed, 282 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index ead237bb7d89..a1dfcd366d92 100644 --- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -7,3 +7,10 @@ Description: Accepts only one of the 2 values - 0 or 1. 0 : disable TGU. 1 : enable TGU. + +What: /sys/bus/amba/devices//step[0:7]_priority[0:3]/reg[0:17] +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the sensed signal with specific step and priority for TGU. diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c index 58c19f12f3d7..14d6ad410d89 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -14,14 +14,123 @@ =20 #include "tgu.h" =20 +static int calculate_array_location(struct tgu_drvdata *drvdata, + int step_index, int operation_index, + int reg_index) +{ + return operation_index * (drvdata->num_step) * (drvdata->num_reg) + + step_index * (drvdata->num_reg) + reg_index; +} + +static ssize_t tgu_dataset_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + struct tgu_attribute *tgu_attr =3D + container_of(attr, struct tgu_attribute, attr); + int index; + + index =3D calculate_array_location(drvdata, tgu_attr->step_index, + tgu_attr->operation_index, + tgu_attr->reg_num); + + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->priority[index]); +} + +static ssize_t tgu_dataset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct tgu_drvdata *tgu_drvdata =3D dev_get_drvdata(dev); + struct tgu_attribute *tgu_attr =3D + container_of(attr, struct tgu_attribute, attr); + unsigned long val; + int index; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret) + return ret; + + guard(spinlock)(&tgu_drvdata->lock); + index =3D calculate_array_location(tgu_drvdata, tgu_attr->step_index, + tgu_attr->operation_index, + tgu_attr->reg_num); + + tgu_drvdata->value_table->priority[index] =3D val; + + return size; +} + +static umode_t tgu_node_visible(struct kobject *kobject, + struct attribute *attr, + int n) +{ + struct device *dev =3D kobj_to_dev(kobject); + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + struct device_attribute *dev_attr =3D + container_of(attr, struct device_attribute, attr); + struct tgu_attribute *tgu_attr =3D + container_of(dev_attr, struct tgu_attribute, attr); + + if (tgu_attr->step_index >=3D drvdata->num_step) + return SYSFS_GROUP_INVISIBLE; + + if (tgu_attr->reg_num >=3D drvdata->num_reg) + return 0; + + return attr->mode; +} + static void tgu_write_all_hw_regs(struct tgu_drvdata *drvdata) { + int i, j, k, index; + TGU_UNLOCK(drvdata->base); + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < MAX_PRIORITY; j++) { + for (k =3D 0; k < drvdata->num_reg; k++) { + index =3D calculate_array_location( + drvdata, i, j, k); + + writel(drvdata->value_table->priority[index], + drvdata->base + + PRIORITY_REG_STEP(i, j, k)); + } + } + } /* Enable TGU to program the triggers */ writel(1, drvdata->base + TGU_CONTROL); TGU_LOCK(drvdata->base); } =20 +static void tgu_set_reg_number(struct tgu_drvdata *drvdata) +{ + int num_sense_input; + int num_reg; + u32 devid; + + devid =3D readl(drvdata->base + TGU_DEVID); + + num_sense_input =3D TGU_DEVID_SENSE_INPUT(devid); + num_reg =3D (num_sense_input * TGU_BITS_PER_SIGNAL) / LENGTH_REGISTER; + + if ((num_sense_input * TGU_BITS_PER_SIGNAL) % LENGTH_REGISTER) + num_reg++; + + drvdata->num_reg =3D num_reg; +} + +static void tgu_set_steps(struct tgu_drvdata *drvdata) +{ + u32 devid; + + devid =3D readl(drvdata->base + TGU_DEVID); + + drvdata->num_step =3D TGU_DEVID_STEPS(devid); +} + static int tgu_enable(struct device *dev) { struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); @@ -111,6 +220,38 @@ static const struct attribute_group tgu_common_grp =3D= { =20 static const struct attribute_group *tgu_attr_groups[] =3D { &tgu_common_grp, + PRIORITY_ATTRIBUTE_GROUP_INIT(0, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(0, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(0, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(0, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(1, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(1, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(1, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(1, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(2, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(2, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(2, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(2, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(3, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(3, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(3, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(3, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(4, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(4, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(4, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(4, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(5, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(5, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(5, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(5, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(6, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(6, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(6, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(6, 3), + PRIORITY_ATTRIBUTE_GROUP_INIT(7, 0), + PRIORITY_ATTRIBUTE_GROUP_INIT(7, 1), + PRIORITY_ATTRIBUTE_GROUP_INIT(7, 2), + PRIORITY_ATTRIBUTE_GROUP_INIT(7, 3), NULL, }; =20 @@ -118,6 +259,8 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) { struct device *dev =3D &adev->dev; struct tgu_drvdata *drvdata; + unsigned int *priority; + size_t priority_size; int ret; =20 drvdata =3D devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); @@ -133,12 +276,30 @@ static int tgu_probe(struct amba_device *adev, const = struct amba_id *id) =20 spin_lock_init(&drvdata->lock); =20 + tgu_set_reg_number(drvdata); + tgu_set_steps(drvdata); + ret =3D sysfs_create_groups(&dev->kobj, tgu_attr_groups); if (ret) { dev_err(dev, "failed to create sysfs groups: %d\n", ret); return ret; } =20 + drvdata->value_table =3D + devm_kzalloc(dev, sizeof(*drvdata->value_table), GFP_KERNEL); + if (!drvdata->value_table) + return -ENOMEM; + + priority_size =3D MAX_PRIORITY * drvdata->num_reg * drvdata->num_step; + + priority =3D devm_kcalloc(dev, priority_size, + sizeof(*drvdata->value_table->priority), + GFP_KERNEL); + if (!priority) + return -ENOMEM; + + drvdata->value_table->priority =3D priority; + drvdata->enabled =3D false; =20 pm_runtime_put(&adev->dev); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h index dd7533b9d735..df570c89ffd7 100644 --- a/drivers/hwtracing/qcom/tgu.h +++ b/drivers/hwtracing/qcom/tgu.h @@ -10,6 +10,114 @@ #define TGU_CONTROL 0x0000 #define TGU_LAR 0xfb0 #define TGU_UNLOCK_OFFSET 0xc5acce55 +#define TGU_DEVID 0xfc8 + +#define TGU_DEVID_SENSE_INPUT(devid_val) \ + ((int)FIELD_GET(GENMASK(17, 10), devid_val)) +#define TGU_DEVID_STEPS(devid_val) \ + ((int)FIELD_GET(GENMASK(6, 3), devid_val)) +#define TGU_BITS_PER_SIGNAL 4 +#define LENGTH_REGISTER 32 + +/* + * TGU configuration space Step configuration + * offset table space layout + * x-------------------------x$ x-------------x$ + * | |$ | |$ + * | | | reserve |$ + * | | | |$ + * |coresight management | |-------------|ba= se+n*0x1D8+0x1F4$ + * | registe | |---> |prioroty[3] |$ + * | | | |-------------|ba= se+n*0x1D8+0x194$ + * | | | |prioroty[2] |$ + * |-------------------------| | |-------------|ba= se+n*0x1D8+0x134$ + * | | | |prioroty[1] |$ + * | step[7] | | |-------------|ba= se+n*0x1D8+0xD4$ + * |-------------------------|->base+0x40+7*0x1D8 | |prioroty[0] |$ + * | | | |-------------|ba= se+n*0x1D8+0x74$ + * | ... | | | condition |$ + * | | | | select |$ + * |-------------------------|->base+0x40+1*0x1D8 | |-------------|ba= se+n*0x1D8+0x60$ + * | | | | condition |$ + * | step[0] |--------------------> | decode |$ + * |-------------------------|-> base+0x40 |-------------|ba= se+n*0x1D8+0x50$ + * | | | |$ + * | Control and status space| |Timer/Counter|$ + * | space | | |$ + * x-------------------------x->base x-------------x b= ase+n*0x1D8+0x40$ + * + */ +#define STEP_OFFSET 0x1D8 +#define PRIORITY_START_OFFSET 0x0074 +#define PRIORITY_OFFSET 0x60 +#define REG_OFFSET 0x4 + +/* Calculate compare step addresses */ +#define PRIORITY_REG_STEP(step, priority, reg)\ + (PRIORITY_START_OFFSET + PRIORITY_OFFSET * priority +\ + REG_OFFSET * reg + STEP_OFFSET * step) + +#define tgu_dataset_rw(name, step_index, type, reg_num) \ + (&((struct tgu_attribute[]){ { \ + __ATTR(name, 0644, tgu_dataset_show, tgu_dataset_store), \ + step_index, \ + type, \ + reg_num, \ + } })[0].attr.attr) + +#define STEP_PRIORITY(step_index, reg_num, priority) \ + tgu_dataset_rw(reg##reg_num, step_index, TGU_PRIORITY##priority, \ + reg_num) + +#define STEP_PRIORITY_LIST(step_index, priority) \ + {STEP_PRIORITY(step_index, 0, priority), \ + STEP_PRIORITY(step_index, 1, priority), \ + STEP_PRIORITY(step_index, 2, priority), \ + STEP_PRIORITY(step_index, 3, priority), \ + STEP_PRIORITY(step_index, 4, priority), \ + STEP_PRIORITY(step_index, 5, priority), \ + STEP_PRIORITY(step_index, 6, priority), \ + STEP_PRIORITY(step_index, 7, priority), \ + STEP_PRIORITY(step_index, 8, priority), \ + STEP_PRIORITY(step_index, 9, priority), \ + STEP_PRIORITY(step_index, 10, priority), \ + STEP_PRIORITY(step_index, 11, priority), \ + STEP_PRIORITY(step_index, 12, priority), \ + STEP_PRIORITY(step_index, 13, priority), \ + STEP_PRIORITY(step_index, 14, priority), \ + STEP_PRIORITY(step_index, 15, priority), \ + STEP_PRIORITY(step_index, 16, priority), \ + STEP_PRIORITY(step_index, 17, priority), \ + NULL \ + } + +#define PRIORITY_ATTRIBUTE_GROUP_INIT(step, priority)\ + (&(const struct attribute_group){\ + .attrs =3D (struct attribute*[])STEP_PRIORITY_LIST(step, priority),\ + .is_visible =3D tgu_node_visible,\ + .name =3D "step" #step "_priority" #priority \ + }) + +enum operation_index { + TGU_PRIORITY0, + TGU_PRIORITY1, + TGU_PRIORITY2, + TGU_PRIORITY3, +}; + +/* Maximum priority that TGU supports */ +#define MAX_PRIORITY 4 + +struct tgu_attribute { + struct device_attribute attr; + u32 step_index; + enum operation_index operation_index; + u32 reg_num; +}; + +struct value_table { + unsigned int *priority; +}; =20 static inline void TGU_LOCK(void __iomem *addr) { @@ -35,6 +143,9 @@ static inline void TGU_UNLOCK(void __iomem *addr) * @dev: Pointer to the associated device structure * @lock: Spinlock for handling concurrent access to private data * @enabled: Flag indicating whether the TGU device is enabled + * @value_table: Store given value based on relevant parameters + * @num_reg: Maximum number of registers + * @num_step: Maximum step size * * This structure defines the data associated with a TGU device, * including its base address, device pointers, clock, spinlock for @@ -46,6 +157,9 @@ struct tgu_drvdata { struct device *dev; spinlock_t lock; bool enabled; + struct value_table *value_table; + int num_reg; + int num_step; }; =20 #endif --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 A68122E7180 for ; Tue, 17 Mar 2026 03:27:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718025; cv=none; b=P3g3uvEMWbWBBVe+nMeRpx+kLJZOvx0kDywrN1xBp025smRZztY/QgIEYVQitELPXdzVSgGOCrwVEEAYfOHX9Nj1mGhE3QKQCnjZVgtR4KKm1uKDQFfnJ1x7KRpWzcU2R1BcsSOfQH9h3XVjX2e6J+vSieHbDQO4jKkb5ZxuaGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718025; c=relaxed/simple; bh=PHaZwWrhMPpj4kmBIKEO50FQDH+ve9bYQC4cZzcQp8A=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Nm25CG+Kv98hXATiQGvFB2z3wKqAmbh0M5QX+4t2K9mPQmVnYyxk6pPW1PoT5erbbUO8wLAwr6MPh2nEMUzSJv5pW/Qi1pTlbUYwX+bTkKiErXbT/WkXjOQYW81fCq5lEpyplP4xnJRH9VC6ytqJOdaEIT6b/gpSx6kAPk3VnIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=cgDChaCQ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=J43grOuP; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="cgDChaCQ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="J43grOuP" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62GMfT9r2375005 for ; Tue, 17 Mar 2026 03:27:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=yBNh3oLrOSX ThAtj1dWN5UGz30m2LOoz6aWF9A87UjE=; b=cgDChaCQw7DjwxHdMWJY35g7zGY qBtCDrT7wASHGF5h8BZ3thb0jqgQj0AvgEkQRX7w8TehDGzfyiBFsmwQGORxbnzh E7sTGaBizb6YqsIX3DcVMhhMAtfxyq0XD03Jj7bjOcE0a+/1kkQau4DNM0l8HIb3 diE3zJGzHuzob1t+b0GSAbi9CjWHv9Oq8+tPaJcaqM1OWNMG3+yu/c+BR2I2HSY5 U9REZxSw05J3m0wexnjM8Mb3h/dq8vtHXjfkBYj400tvdyI4iVh1kQSBFpmSLhMJ HMkYbQTM+PTPLldN+8Hi5TgMRXI4MQOu5Il231OOhpQGraeKump1ZvTjhFA== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxkby2cqw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:27:02 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-2bead0a9123so19454100eec.1 for ; Mon, 16 Mar 2026 20:27:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718022; x=1774322822; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yBNh3oLrOSXThAtj1dWN5UGz30m2LOoz6aWF9A87UjE=; b=J43grOuP+S05zn6T4A8XvlS4ZEQIun4QjcA8bHorD2ualdXzDwu98kMQkCNK6u1Mqo gsf7YekZjXc3hBuC7L+7FLLrvtrQT/vMEMLJj+32ePlTdtOP7iVIEWB1p4/Gyu69Fm6w dR28BI9X+yCT/Wm7m2yiCmliFH+y1JxbImm/wxtKTZY1NRRhLje9CEcr0F5mvGdxtaBn SP3xUBcj+jfNFCiuxbwFA4WBfl6H+YiJ1+fXPMc7eNMzsiMZHkIeTWRBDHKYcnMRau0w JbbNripkmpbpZzhTmtGV/Y4gOsFoKzZf0yt0Jxn4Vg8IN9SRSBEdwPwHoagraq+EthHC nnuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718022; x=1774322822; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yBNh3oLrOSXThAtj1dWN5UGz30m2LOoz6aWF9A87UjE=; b=p0EiVpRq1hrnEx6mtZgVBNVEXw8DzMfrbaPJTJB4kofcEFJHnhh5u69548t0ewPE2B HY1lmd+bO5Mbc1w1HRhoAB+o13hlSbpJRO+mX8Hzm3LrwBk09pRPs4Be88m9gKHCUMW2 l4sQLx0QTvj9KFgeeK1Uh2FpKb9rg9Blf2VF7gIzyt1YFzhWRS1RAYrXvNQ3b4dj8gd3 +s/TgHlMISdhp1XbM4xst/AmsAU6pfjcVWX3Aml4EB1PyaFOUawwt39xfTHlUTOo75ij x+W/ijPu7Xkb1D85HqRZOdulefxnDN6Aq1kh2kOQ7FL7GX7XYbUx6eN0+eo3JVelqpck X3RQ== X-Forwarded-Encrypted: i=1; AJvYcCXjufUI54xX9NAc7WLVY6OLbylaSSmRRLd/+KJRJ3i5mOpBy12+I7DF47r91pKcS5yU7XOz5w9dgzYn2+c=@vger.kernel.org X-Gm-Message-State: AOJu0Yzc0LBCRyA3In13kOqXsarLRN8YgGWNJX8pf+EX+cc7M5HKply3 NFYPc+FEgwhwNUXjot/lV35aM77kL9wufQQIj3Ysknce+kUyT5CWLoq1D/DLA56fDiInxhHHuV1 nQ8IM+JglqJ4caGSETzEF7/8v6QPGXPjk2OBUqEG5Xa3sSFQz1BqdZMY8rPZULQU3haM= X-Gm-Gg: ATEYQzy8pVIT4hFtrW0ZQpSnau3UrlR3JoOJTJw+rMxQ/Kd8AOJJm4HTBocx5aqh4j0 IDtPPzO1wCirxq/KjzYHnDJEEtCR+RJ5A25ZCMNAh3OS5XGVu+KJANxCr0r0btoc3s4CFqrCSX/ Sa0i78zjy3pM4ybYSyTaaAMl3YKDL3+ixdVyUVG7k0AyKT+oEAqoVYEqr+zG80OhfVrMJtvF9cL v6M/fhCZv5pxkyiLviheudryMX/0rOts39DjEImYr1ojNqfPiDGESl0pd60ZsECWog6IrpaeztI uGJKQZFGzSoe9E8VQgqQcs8euw77BRL0Dx/n3bZ/UL+SMxAFs7sAOgtEwmaBFzzCCmbq/hwvW1o YOuJggHK62coNerF7CbtN9aRXMhd2XLg0/uGX+7ztqGF1ZyOr0DSKM0pReNUkE8PRIaqjrLCK5g yE X-Received: by 2002:a05:7300:e208:b0:2be:a440:7550 with SMTP id 5a478bee46e88-2bea55edf88mr7715042eec.28.1773718021967; Mon, 16 Mar 2026 20:27:01 -0700 (PDT) X-Received: by 2002:a05:7300:e208:b0:2be:a440:7550 with SMTP id 5a478bee46e88-2bea55edf88mr7715023eec.28.1773718021238; Mon, 16 Mar 2026 20:27:01 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.26.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:27:00 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 4/7] qcom-tgu: Add TGU decode support Date: Mon, 16 Mar 2026 20:26:36 -0700 Message-Id: <20260317032639.2393221-5-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: fqbME19Go0UArjULnnpdu1o-FUNiBJ_H X-Proofpoint-ORIG-GUID: fqbME19Go0UArjULnnpdu1o-FUNiBJ_H X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfX/pLWn7iB+7mW YgVoD0drFLrDVb6h8BgEu5IoCOTJAn/kIb1cZ4nMIi6OM2efCGXXoqEKknXmJN7TKJfdJSITmgl g/2CHKNSNkqOIclsdn5WcGOa6ToLs/gvRaXg61r5WYiYKwkkOPFfdP8Tq46SIVeit+M2WIhbePC 7GB1WJF0DXiTLSkJZgk8JLugcIrxW/TfRFit+cIbrnJL/wBtqZwcK/lHL+DHZAQHyHXrCEbG57A 5WlkUEu36qQenQRk74ney81Vc2sCLQOAGZCnL660rNz+E2dJl0tV4VpvH2I2Ke9TNPbpvvDdS/K i0iquc5NVOcAw0y8hjmeKnAUKl46CmLoAy2FMrX3b7vRt+8YolktS2tMSMbuC9QH5+jPlE7+9VB BdM1ka4uLcUPRwxgbiN+VBG3fE4FGBvfsW+Eqz58uq4YC6uAPLYaA8FOA384yGtMUJVMCBtAPia /RnoGIS+ijaTvF11zaQ== X-Authority-Analysis: v=2.4 cv=ZpLg6t7G c=1 sm=1 tr=0 ts=69b8ca06 cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=DXd_79bSlwW_W-LZS_AA:9 a=scEy_gLbYbu1JhEsrz4S:22 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 impostorscore=0 adultscore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Decoding is when all the potential pieces for creating a trigger are brought together for a given step. Example - there may be a counter keeping track of some occurrences and a priority-group that is being used to detect a pattern on the sense inputs. These 2 inputs to condition_decode must be programmed, for a given step, to establish the condition for the trigger, or movement to another steps. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 7 + drivers/hwtracing/qcom/tgu.c | 157 +++++++++++++++--- drivers/hwtracing/qcom/tgu.h | 27 +++ 3 files changed, 170 insertions(+), 21 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index a1dfcd366d92..18930743c99f 100644 --- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -14,3 +14,10 @@ KernelVersion 7.1 Contact: Jinlong Mao , Songwei Chai Description: (RW) Set/Get the sensed signal with specific step and priority for TGU. + +What: /sys/bus/amba/devices//step[0:7]_condition_decode/reg[0:3] +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the decode mode with specific step for TGU. diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c index 14d6ad410d89..85fe1140eab5 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -18,8 +18,33 @@ static int calculate_array_location(struct tgu_drvdata *= drvdata, int step_index, int operation_index, int reg_index) { - return operation_index * (drvdata->num_step) * (drvdata->num_reg) + - step_index * (drvdata->num_reg) + reg_index; + switch (operation_index) { + case TGU_PRIORITY0: + case TGU_PRIORITY1: + case TGU_PRIORITY2: + case TGU_PRIORITY3: + return operation_index * (drvdata->num_step) * + (drvdata->num_reg) + + step_index * (drvdata->num_reg) + reg_index; + case TGU_CONDITION_DECODE: + return step_index * (drvdata->num_condition_decode) + + reg_index; + default: + break; + } + + return -EINVAL; +} + +static int check_array_location(struct tgu_drvdata *drvdata, int step, + int ops, int reg) +{ + int result =3D calculate_array_location(drvdata, step, ops, reg); + + if (result =3D=3D -EINVAL) + dev_err(drvdata->dev, "check arrary location - Fail\n"); + + return result; } =20 static ssize_t tgu_dataset_show(struct device *dev, @@ -30,12 +55,26 @@ static ssize_t tgu_dataset_show(struct device *dev, container_of(attr, struct tgu_attribute, attr); int index; =20 - index =3D calculate_array_location(drvdata, tgu_attr->step_index, - tgu_attr->operation_index, - tgu_attr->reg_num); - - return sysfs_emit(buf, "0x%x\n", - drvdata->value_table->priority[index]); + index =3D check_array_location(drvdata, tgu_attr->step_index, + tgu_attr->operation_index, tgu_attr->reg_num); + + if (index =3D=3D -EINVAL) + return index; + + switch (tgu_attr->operation_index) { + case TGU_PRIORITY0: + case TGU_PRIORITY1: + case TGU_PRIORITY2: + case TGU_PRIORITY3: + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->priority[index]); + case TGU_CONDITION_DECODE: + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->condition_decode[index]); + default: + break; + } + return -EINVAL; } =20 static ssize_t tgu_dataset_store(struct device *dev, @@ -54,13 +93,31 @@ static ssize_t tgu_dataset_store(struct device *dev, return ret; =20 guard(spinlock)(&tgu_drvdata->lock); - index =3D calculate_array_location(tgu_drvdata, tgu_attr->step_index, + index =3D check_array_location(tgu_drvdata, tgu_attr->step_index, tgu_attr->operation_index, tgu_attr->reg_num); =20 - tgu_drvdata->value_table->priority[index] =3D val; + if (index =3D=3D -EINVAL) + return index; + + switch (tgu_attr->operation_index) { + case TGU_PRIORITY0: + case TGU_PRIORITY1: + case TGU_PRIORITY2: + case TGU_PRIORITY3: + tgu_drvdata->value_table->priority[index] =3D val; + ret =3D size; + break; + case TGU_CONDITION_DECODE: + tgu_drvdata->value_table->condition_decode[index] =3D val; + ret =3D size; + break; + default: + ret =3D -EINVAL; + break; + } =20 - return size; + return ret; } =20 static umode_t tgu_node_visible(struct kobject *kobject, @@ -77,13 +134,26 @@ static umode_t tgu_node_visible(struct kobject *kobjec= t, if (tgu_attr->step_index >=3D drvdata->num_step) return SYSFS_GROUP_INVISIBLE; =20 - if (tgu_attr->reg_num >=3D drvdata->num_reg) - return 0; + switch (tgu_attr->operation_index) { + case TGU_PRIORITY0: + case TGU_PRIORITY1: + case TGU_PRIORITY2: + case TGU_PRIORITY3: + if (tgu_attr->reg_num < drvdata->num_reg) + return attr->mode; + break; + case TGU_CONDITION_DECODE: + if (tgu_attr->reg_num < drvdata->num_condition_decode) + return attr->mode; + break; + default: + break; + } =20 - return attr->mode; + return 0; } =20 -static void tgu_write_all_hw_regs(struct tgu_drvdata *drvdata) +static ssize_t tgu_write_all_hw_regs(struct tgu_drvdata *drvdata) { int i, j, k, index; =20 @@ -91,8 +161,10 @@ static void tgu_write_all_hw_regs(struct tgu_drvdata *d= rvdata) for (i =3D 0; i < drvdata->num_step; i++) { for (j =3D 0; j < MAX_PRIORITY; j++) { for (k =3D 0; k < drvdata->num_reg; k++) { - index =3D calculate_array_location( + index =3D check_array_location( drvdata, i, j, k); + if (index =3D=3D -EINVAL) + goto exit; =20 writel(drvdata->value_table->priority[index], drvdata->base + @@ -100,9 +172,23 @@ static void tgu_write_all_hw_regs(struct tgu_drvdata *= drvdata) } } } + + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < drvdata->num_condition_decode; j++) { + index =3D check_array_location(drvdata, i, + TGU_CONDITION_DECODE, j); + if (index =3D=3D -EINVAL) + goto exit; + + writel(drvdata->value_table->condition_decode[index], + drvdata->base + CONDITION_DECODE_STEP(i, j)); + } + } /* Enable TGU to program the triggers */ writel(1, drvdata->base + TGU_CONTROL); +exit: TGU_LOCK(drvdata->base); + return index >=3D 0 ? 0 : -EINVAL; } =20 static void tgu_set_reg_number(struct tgu_drvdata *drvdata) @@ -131,18 +217,28 @@ static void tgu_set_steps(struct tgu_drvdata *drvdata) drvdata->num_step =3D TGU_DEVID_STEPS(devid); } =20 +static void tgu_set_conditions(struct tgu_drvdata *drvdata) +{ + u32 devid; + + devid =3D readl(drvdata->base + TGU_DEVID); + drvdata->num_condition_decode =3D TGU_DEVID_CONDITIONS(devid); +} + static int tgu_enable(struct device *dev) { struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + int ret; =20 guard(spinlock)(&drvdata->lock); if (drvdata->enabled) return -EBUSY; =20 - tgu_write_all_hw_regs(drvdata); - drvdata->enabled =3D true; + ret =3D tgu_write_all_hw_regs(drvdata); + if (!ret) + drvdata->enabled =3D true; =20 - return 0; + return ret; } =20 static void tgu_do_disable(struct tgu_drvdata *drvdata) @@ -252,6 +348,14 @@ static const struct attribute_group *tgu_attr_groups[]= =3D { PRIORITY_ATTRIBUTE_GROUP_INIT(7, 1), PRIORITY_ATTRIBUTE_GROUP_INIT(7, 2), PRIORITY_ATTRIBUTE_GROUP_INIT(7, 3), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(0), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(1), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(2), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(3), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(4), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(5), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(6), + CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(7), NULL, }; =20 @@ -259,8 +363,8 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) { struct device *dev =3D &adev->dev; struct tgu_drvdata *drvdata; - unsigned int *priority; - size_t priority_size; + unsigned int *priority, *condition; + size_t priority_size, condition_size; int ret; =20 drvdata =3D devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); @@ -278,6 +382,7 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) =20 tgu_set_reg_number(drvdata); tgu_set_steps(drvdata); + tgu_set_conditions(drvdata); =20 ret =3D sysfs_create_groups(&dev->kobj, tgu_attr_groups); if (ret) { @@ -300,6 +405,16 @@ static int tgu_probe(struct amba_device *adev, const s= truct amba_id *id) =20 drvdata->value_table->priority =3D priority; =20 + condition_size =3D drvdata->num_condition_decode * drvdata->num_step; + + condition =3D devm_kcalloc(dev, condition_size, + sizeof(*(drvdata->value_table->condition_decode)), + GFP_KERNEL); + if (!condition) + return -ENOMEM; + + drvdata->value_table->condition_decode =3D condition; + drvdata->enabled =3D false; =20 pm_runtime_put(&adev->dev); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h index df570c89ffd7..987ea07bd618 100644 --- a/drivers/hwtracing/qcom/tgu.h +++ b/drivers/hwtracing/qcom/tgu.h @@ -16,6 +16,8 @@ ((int)FIELD_GET(GENMASK(17, 10), devid_val)) #define TGU_DEVID_STEPS(devid_val) \ ((int)FIELD_GET(GENMASK(6, 3), devid_val)) +#define TGU_DEVID_CONDITIONS(devid_val) \ + ((int)FIELD_GET(GENMASK(2, 0), devid_val)) #define TGU_BITS_PER_SIGNAL 4 #define LENGTH_REGISTER 32 =20 @@ -49,6 +51,7 @@ */ #define STEP_OFFSET 0x1D8 #define PRIORITY_START_OFFSET 0x0074 +#define CONDITION_DECODE_OFFSET 0x0050 #define PRIORITY_OFFSET 0x60 #define REG_OFFSET 0x4 =20 @@ -57,6 +60,9 @@ (PRIORITY_START_OFFSET + PRIORITY_OFFSET * priority +\ REG_OFFSET * reg + STEP_OFFSET * step) =20 +#define CONDITION_DECODE_STEP(step, decode) \ + (CONDITION_DECODE_OFFSET + REG_OFFSET * decode + STEP_OFFSET * step) + #define tgu_dataset_rw(name, step_index, type, reg_num) \ (&((struct tgu_attribute[]){ { \ __ATTR(name, 0644, tgu_dataset_show, tgu_dataset_store), \ @@ -68,6 +74,8 @@ #define STEP_PRIORITY(step_index, reg_num, priority) \ tgu_dataset_rw(reg##reg_num, step_index, TGU_PRIORITY##priority, \ reg_num) +#define STEP_DECODE(step_index, reg_num) \ + tgu_dataset_rw(reg##reg_num, step_index, TGU_CONDITION_DECODE, reg_num) =20 #define STEP_PRIORITY_LIST(step_index, priority) \ {STEP_PRIORITY(step_index, 0, priority), \ @@ -91,6 +99,14 @@ NULL \ } =20 +#define STEP_DECODE_LIST(n) \ + {STEP_DECODE(n, 0), \ + STEP_DECODE(n, 1), \ + STEP_DECODE(n, 2), \ + STEP_DECODE(n, 3), \ + NULL \ + } + #define PRIORITY_ATTRIBUTE_GROUP_INIT(step, priority)\ (&(const struct attribute_group){\ .attrs =3D (struct attribute*[])STEP_PRIORITY_LIST(step, priority),\ @@ -98,11 +114,19 @@ .name =3D "step" #step "_priority" #priority \ }) =20 +#define CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(step)\ + (&(const struct attribute_group){\ + .attrs =3D (struct attribute*[])STEP_DECODE_LIST(step),\ + .is_visible =3D tgu_node_visible,\ + .name =3D "step" #step "_condition_decode" \ + }) + enum operation_index { TGU_PRIORITY0, TGU_PRIORITY1, TGU_PRIORITY2, TGU_PRIORITY3, + TGU_CONDITION_DECODE, }; =20 /* Maximum priority that TGU supports */ @@ -117,6 +141,7 @@ struct tgu_attribute { =20 struct value_table { unsigned int *priority; + unsigned int *condition_decode; }; =20 static inline void TGU_LOCK(void __iomem *addr) @@ -146,6 +171,7 @@ static inline void TGU_UNLOCK(void __iomem *addr) * @value_table: Store given value based on relevant parameters * @num_reg: Maximum number of registers * @num_step: Maximum step size + * @num_condition_decode: Maximum number of condition_decode * * This structure defines the data associated with a TGU device, * including its base address, device pointers, clock, spinlock for @@ -160,6 +186,7 @@ struct tgu_drvdata { struct value_table *value_table; int num_reg; int num_step; + int num_condition_decode; }; =20 #endif --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 3B6742DE70D for ; Tue, 17 Mar 2026 03:27:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718027; cv=none; b=k+Oy2Rn7EyyktVYKYJAwJH/tf4Q5JWHoTJadnDZX7tWl/by9yuLTrszNWfXRAeVn0QrT2joKc3cqpfpCOqNrFB4w950wtN8gQigDdeb45YMtulGr7xDJOz/OCLSILsYRZIyoLHLVNc2KW4JycLI+8A6n8y9xgQvAUKw3B1hTwGw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718027; c=relaxed/simple; bh=qVW/WQ4p1es2H1ON/kIeaX9U/GKYZc9CqxcMpLLDsSo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=D+d9y5gw1IZQyQPYIiKpuIkKmT6x7c7kw1hVLB9AhBGZiIfwIFuSd+/+dbkvs+X/TB28VrbTAVpgbRE6XpR+4L/k0mFFahPsejzNxJ22eD7k9QttUYjga4NIkbzJs1SywFtI21r5ca8vM906mSXbJGt+2mefidt4TU2aBOhIYcw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=HFq2dNYI; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=bSrZgqbZ; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="HFq2dNYI"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="bSrZgqbZ" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62GMkWhl1639392 for ; Tue, 17 Mar 2026 03:27:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=iv2BN0cKboD uBtfMG0o05Gbqs13lk40R9DNkNpg+u3g=; b=HFq2dNYI7mm0jRu5I1JE5Nx0q9j /nBO10rPhzNd1EXEDG/PmxwWXQoai2SMv6AAU+n1NLRPJFWy3rTZxAB3/LVEBu5J 9G2URoIJEf8Pfh0UVGI/03rS9ThwIo+zGdgpQMqxLQSqq3azWzG96KtPz+ShPnbp ZlY3cOOHQc8RfcNuOZRYMiBxikWCJgzCQ1tuBsVE7jvfMXoTCErCf499v+RGaEVr HmhEF98x/0GXvmaxzdCtrz6T0Ozut6CIt8rJnqSbfuJ+Kl7ddMUP15zDx6IAExfo TAYYSacruayqYQfb5/Raah7ddyXkQdqFieY88PFwehhCcoJgvlStX1riLeg== Received: from mail-dy1-f200.google.com (mail-dy1-f200.google.com [74.125.82.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxke0acmj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:27:05 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-2bea1ffd05bso5040184eec.0 for ; Mon, 16 Mar 2026 20:27:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718024; x=1774322824; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iv2BN0cKboDuBtfMG0o05Gbqs13lk40R9DNkNpg+u3g=; b=bSrZgqbZMvYhiIWRa9hVFjR4sovDC2yYoMT0kVYrNtZnQ8Jlkpef0+UXYfjmZgdzl5 igd4oe0ArbU2CfoWaLLOipmR/cM/hKXY2/7MbnZYydM3UnehQHYVN0khoHVMUxGTFA6F SdQoLJxc4giY0EQHavo1/NU/mSHlK9hiIFHyrbrLO9GC/lizqSE+2rHHI40YO3NmyFKF t9JBcGeJKc5fK9mu2bLGgMxPT4FhyCSsK7FwLxbOMXwT25rdnTTcnki5lMYUHzs44x3w CQ6dNBDhGflPDEOXXwVyvQhYr6F1arqxr9FG1ptWiU9dtFRGZYVUPx+BcVM6GkNaZTL7 lqDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718025; x=1774322825; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=iv2BN0cKboDuBtfMG0o05Gbqs13lk40R9DNkNpg+u3g=; b=DxkO4EEtJTaQwhJRBRBBcW2MmW5PSkWIiNVt77bp32iBZ4U+rx3TxTeCvqRvXOrbop JwQjgLmp0sR6C37b0qXTPFVHY29V024uuDP8dWP5YfRxbKRxR9fkSpyaNaRHAFYzzZs3 5DNaR9MOeGvcGdndRwITb90vCDsp+GMxS9XlWCsOAuOjwwGgg/k+9cMRw17QvHgPDEBU sSYY7OtMJuZz4hwm1ywHd8bing9qUzXuv25pWKI6OvwSHXQiJejZ/h4ki8tuDzbsiied oku6wyAa96mZV0bhfEPT9R7jG2gFhP2W5Xp2ertDMfAnHBwlVbW9ohaU1uOdxLfe4Si9 X5Nw== X-Forwarded-Encrypted: i=1; AJvYcCVvJrXkirVDAOKyef3ZWsESjR41P+ZcduAsXIg9LiSwylLCLZW52Gj2s8w0WP6ff7olihZPS6U6dDNthFQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yzl6z8vVkVmnoMfKQRVlaZ8lUT2qGwBd8VSs1TgWnbLWnCf0TVt TTTsKQ7fBHlAW1YNC8G6UmHhIoZwz+LEeZG9A+pxGNRSoHKX9WbEcwyehBeSw4KsUoPbZLvJyE3 ti11box3h5faZg8qTKFj5yhBp9+4pM11gjKLORSEs1CccvYvSFmyKiJ9zeu5KVefLwsyLz5+0f6 2uvA== X-Gm-Gg: ATEYQzxXrtCB9HmIoMO4thNst0xhrkRh7Nddz6lJrMZ+HRzsgVVu+QId6zdDXwNn1h3 0DRO3DlnRZOMN+fKWNczjeVc4dGm5vONXHmNbSJbqInQdRhZPy/Vis2pGAgovGtQKVPXeVwBbUM ZYnYmLZnBAlT4vGWIYtdTyWXcGV9934oAypXNMpx0REfsSpP2SnVXxilkhNTDQY6KCSwwznr31+ Llvy81iIjipn9DRfaoO/zQnkOf9KTpdVEMFYUE0FBgmQmFRsCr6AaCTVyp6VIEpT/uFFC8joDrr IPWhIfaRVIAqoqB6AuZmB2DN/++gm6YKO+OOh9hG9Rhhch+PEWakGztSfDyVwwUFCkeGRMR61yw NCtCqiPDc4x73/47bCLjWyTtOHLD3Kit0eb2MU1WnTLzm++efWPCZ7BQS3gwgGV9rtJh4twwZwp tx X-Received: by 2002:a05:7022:698d:b0:128:dcbd:e27c with SMTP id a92af1059eb24-128f3d5a938mr7419952c88.20.1773718024390; Mon, 16 Mar 2026 20:27:04 -0700 (PDT) X-Received: by 2002:a05:7022:698d:b0:128:dcbd:e27c with SMTP id a92af1059eb24-128f3d5a938mr7419938c88.20.1773718023798; Mon, 16 Mar 2026 20:27:03 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:27:03 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 5/7] qcom-tgu: Add support to configure next action Date: Mon, 16 Mar 2026 20:26:37 -0700 Message-Id: <20260317032639.2393221-6-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: RHR2NppvBcFMAZ7fz60B0R8ezRqI9CPM X-Authority-Analysis: v=2.4 cv=aue/yCZV c=1 sm=1 tr=0 ts=69b8ca09 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=s623Ih-0px1LxcEVn60A:9 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfXxE7p3Uh5pGnj z08emC86nRILAPGxXErxtSa30bNwJjiH5LqiVANanU+SH84YmKBkidl9B9nrGxJc/1MjtRVNcZi fxUvP+rfh4RlRkWcQSJxhV5j0NJTCK+ndFsKlDusXS5ALxtp3e5A/EsISj/GlG+QILaFEaYgo/2 GgIDYSnqy48gsxPnuqCkR4yJ5R6V42SLL2D66O4YQxLzoKMI/d5h0yXA27uX+igiGY63Mpwje1Y DKEWwAQ2ijd40wUgxMdb55SWDjvtObGvjD0XZf7rNWF9jyWRrGqAweDTnJ2E960T1L8NARSvROy TgeUCJ75+YqJUjI/623iNX7tGRO3ODEV8HS4pasZQzWCfnih1kdR7VkRATAvbyqcWlG3VWa9jDx snJSarGj/qtH/HV7w8W0hLZGEmAj0Y/lQv5BaqawyoCsZ5Df2+L6dBiCFxUUBzveFV6CLbyiWjr fqKzK2Vqj0zSxPmGO2w== X-Proofpoint-GUID: RHR2NppvBcFMAZ7fz60B0R8ezRqI9CPM 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Add "select" node for each step to determine if another step is taken, trigger(s) are generated, counters/timers incremented/decremented, etc. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 7 +++ drivers/hwtracing/qcom/tgu.c | 53 ++++++++++++++++++- drivers/hwtracing/qcom/tgu.h | 27 ++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index 18930743c99f..d8431a82574a 100644 --- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -21,3 +21,10 @@ KernelVersion 7.1 Contact: Jinlong Mao , Songwei Chai Description: (RW) Set/Get the decode mode with specific step for TGU. + +What: /sys/bus/amba/devices//step[0:7]_condition_select/reg[0:3] +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the next action with specific step for TGU. diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c index 85fe1140eab5..1d996b9e303a 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -29,6 +29,9 @@ static int calculate_array_location(struct tgu_drvdata *d= rvdata, case TGU_CONDITION_DECODE: return step_index * (drvdata->num_condition_decode) + reg_index; + case TGU_CONDITION_SELECT: + return step_index * (drvdata->num_condition_select) + + reg_index; default: break; } @@ -71,6 +74,9 @@ static ssize_t tgu_dataset_show(struct device *dev, case TGU_CONDITION_DECODE: return sysfs_emit(buf, "0x%x\n", drvdata->value_table->condition_decode[index]); + case TGU_CONDITION_SELECT: + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->condition_select[index]); default: break; } @@ -112,6 +118,10 @@ static ssize_t tgu_dataset_store(struct device *dev, tgu_drvdata->value_table->condition_decode[index] =3D val; ret =3D size; break; + case TGU_CONDITION_SELECT: + tgu_drvdata->value_table->condition_select[index] =3D val; + ret =3D size; + break; default: ret =3D -EINVAL; break; @@ -146,6 +156,13 @@ static umode_t tgu_node_visible(struct kobject *kobjec= t, if (tgu_attr->reg_num < drvdata->num_condition_decode) return attr->mode; break; + case TGU_CONDITION_SELECT: + /* 'default' register is at the end of 'select' region */ + if (tgu_attr->reg_num =3D=3D drvdata->num_condition_select - 1) + attr->name =3D "default"; + if (tgu_attr->reg_num < drvdata->num_condition_select) + return attr->mode; + break; default: break; } @@ -184,6 +201,18 @@ static ssize_t tgu_write_all_hw_regs(struct tgu_drvdat= a *drvdata) drvdata->base + CONDITION_DECODE_STEP(i, j)); } } + + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < drvdata->num_condition_select; j++) { + index =3D check_array_location(drvdata, i, + TGU_CONDITION_SELECT, j); + if (index =3D=3D -EINVAL) + goto exit; + + writel(drvdata->value_table->condition_select[index], + drvdata->base + CONDITION_SELECT_STEP(i, j)); + } + } /* Enable TGU to program the triggers */ writel(1, drvdata->base + TGU_CONTROL); exit: @@ -223,6 +252,8 @@ static void tgu_set_conditions(struct tgu_drvdata *drvd= ata) =20 devid =3D readl(drvdata->base + TGU_DEVID); drvdata->num_condition_decode =3D TGU_DEVID_CONDITIONS(devid); + /* select region has an additional 'default' register */ + drvdata->num_condition_select =3D TGU_DEVID_CONDITIONS(devid) + 1; } =20 static int tgu_enable(struct device *dev) @@ -356,6 +387,14 @@ static const struct attribute_group *tgu_attr_groups[]= =3D { CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(5), CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(6), CONDITION_DECODE_ATTRIBUTE_GROUP_INIT(7), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(0), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(1), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(2), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(3), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(4), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(5), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(6), + CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(7), NULL, }; =20 @@ -363,8 +402,8 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) { struct device *dev =3D &adev->dev; struct tgu_drvdata *drvdata; - unsigned int *priority, *condition; - size_t priority_size, condition_size; + unsigned int *priority, *condition, *select; + size_t priority_size, condition_size, select_size; int ret; =20 drvdata =3D devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); @@ -415,6 +454,16 @@ static int tgu_probe(struct amba_device *adev, const s= truct amba_id *id) =20 drvdata->value_table->condition_decode =3D condition; =20 + select_size =3D drvdata->num_condition_select * drvdata->num_step; + + select =3D devm_kcalloc(dev, select_size, + sizeof(*(drvdata->value_table->condition_select)), + GFP_KERNEL); + if (!select) + return -ENOMEM; + + drvdata->value_table->condition_select =3D select; + drvdata->enabled =3D false; =20 pm_runtime_put(&adev->dev); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h index 987ea07bd618..ac46a2875209 100644 --- a/drivers/hwtracing/qcom/tgu.h +++ b/drivers/hwtracing/qcom/tgu.h @@ -52,6 +52,7 @@ #define STEP_OFFSET 0x1D8 #define PRIORITY_START_OFFSET 0x0074 #define CONDITION_DECODE_OFFSET 0x0050 +#define CONDITION_SELECT_OFFSET 0x0060 #define PRIORITY_OFFSET 0x60 #define REG_OFFSET 0x4 =20 @@ -63,6 +64,9 @@ #define CONDITION_DECODE_STEP(step, decode) \ (CONDITION_DECODE_OFFSET + REG_OFFSET * decode + STEP_OFFSET * step) =20 +#define CONDITION_SELECT_STEP(step, select) \ + (CONDITION_SELECT_OFFSET + REG_OFFSET * select + STEP_OFFSET * step) + #define tgu_dataset_rw(name, step_index, type, reg_num) \ (&((struct tgu_attribute[]){ { \ __ATTR(name, 0644, tgu_dataset_show, tgu_dataset_store), \ @@ -76,6 +80,8 @@ reg_num) #define STEP_DECODE(step_index, reg_num) \ tgu_dataset_rw(reg##reg_num, step_index, TGU_CONDITION_DECODE, reg_num) +#define STEP_SELECT(step_index, reg_num) \ + tgu_dataset_rw(reg##reg_num, step_index, TGU_CONDITION_SELECT, reg_num) =20 #define STEP_PRIORITY_LIST(step_index, priority) \ {STEP_PRIORITY(step_index, 0, priority), \ @@ -107,6 +113,15 @@ NULL \ } =20 +#define STEP_SELECT_LIST(n) \ + {STEP_SELECT(n, 0), \ + STEP_SELECT(n, 1), \ + STEP_SELECT(n, 2), \ + STEP_SELECT(n, 3), \ + STEP_SELECT(n, 4), \ + NULL \ + } + #define PRIORITY_ATTRIBUTE_GROUP_INIT(step, priority)\ (&(const struct attribute_group){\ .attrs =3D (struct attribute*[])STEP_PRIORITY_LIST(step, priority),\ @@ -121,12 +136,21 @@ .name =3D "step" #step "_condition_decode" \ }) =20 +#define CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(step)\ + (&(const struct attribute_group){\ + .attrs =3D (struct attribute*[])STEP_SELECT_LIST(step),\ + .is_visible =3D tgu_node_visible,\ + .name =3D "step" #step "_condition_select" \ + }) + + enum operation_index { TGU_PRIORITY0, TGU_PRIORITY1, TGU_PRIORITY2, TGU_PRIORITY3, TGU_CONDITION_DECODE, + TGU_CONDITION_SELECT, }; =20 /* Maximum priority that TGU supports */ @@ -142,6 +166,7 @@ struct tgu_attribute { struct value_table { unsigned int *priority; unsigned int *condition_decode; + unsigned int *condition_select; }; =20 static inline void TGU_LOCK(void __iomem *addr) @@ -172,6 +197,7 @@ static inline void TGU_UNLOCK(void __iomem *addr) * @num_reg: Maximum number of registers * @num_step: Maximum step size * @num_condition_decode: Maximum number of condition_decode + * @num_condition_select: Maximum number of condition_select * * This structure defines the data associated with a TGU device, * including its base address, device pointers, clock, spinlock for @@ -187,6 +213,7 @@ struct tgu_drvdata { int num_reg; int num_step; int num_condition_decode; + int num_condition_select; }; =20 #endif --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 453A72F1FD5 for ; Tue, 17 Mar 2026 03:27:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718030; cv=none; b=m2imuHwheKNSfklfXeZr9WtGjpUp+qSfPU6moltv5ZPpwJBXNQbEI35ltj97t/pjT4u55MilLLvJ0Q00qkZoRCXjhcqM2/YgmGHdigEDwSeesQJ6l+Ot2mIeR80UcONemrZXObpkIAAydlx/ZMcnkwXcghQcsmWrXXdqDO/r7Wc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718030; c=relaxed/simple; bh=DHQMVm0xm+4vBSQtASYZiIexd81DFPZzjSCKUr21lGo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dO3muLo48SPZK868DKQjjaK/SUOIRMGg+QRWxheSerkwNwzBdhlhg9eeLASk2AyQnaLu2n0SDjIv5vOoZaQQ1nZljphsyLLRYJN9tNArJMbrBpVt1ToPycR6FN1CIx6hv1kMHO7+CP9cFkSyf5XOYHTewgf79hrybWLuNSEpojY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=H5cyBwWh; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=hC+C4H7m; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="H5cyBwWh"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="hC+C4H7m" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62H0d8lr795437 for ; Tue, 17 Mar 2026 03:27:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=cZusbnuL45o hzKQp1GSHPuIGLfUub8pv++b9H4SReHU=; b=H5cyBwWhxO+4kbVjScC2AkpzBd/ cwzCHH6Fh0bwVE2WMkn2u7O30sGCehZPeKFiip3KBWfSTTAhuL9rC8le0V3X4sQM 2EPpmaRDfxrjRGS2oJK0fEllVnCvhL1G0eNJDIR/JSm9eyUqfAXhGqOaLxkW/idZ 9Hmwrps2e4aNI+2yoUNwPQB4xGbX50ixq0h1nW1mLO3ng3nm2i6wnJwJxag4h3mG M7zdch5G1lpHPFc0yXCSE65oVWJAtdYYMSh4WepfRzWbgwtCbouoF8EilIEHXTX6 mUjJRsN41L4YhxHjNulAdvBgQtPu4sLedXSzumTKhDB47iZHMHLso0d6adQ== Received: from mail-dy1-f200.google.com (mail-dy1-f200.google.com [74.125.82.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxm6d25m9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:27:07 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-2bead0a9123so19455842eec.1 for ; Mon, 16 Mar 2026 20:27:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718027; x=1774322827; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cZusbnuL45ohzKQp1GSHPuIGLfUub8pv++b9H4SReHU=; b=hC+C4H7mcu6bZ83cCDc1uBTjZYdOLxtepVVwvw5DH98iSJtocOHOmqj3BnJ6cb72bj m5owjOCaDGiUnOq45L9q1rJvAAbwkKv0TqUmJkiBRkWJKx1/ctyXeg/cftVhtY3BjogU krEg+3V5A5jlEr4+DbJN6lrc/oe1xBXzKpYtIc+CpunXgggQPEo73wwaF76qNI1RCy/A XCms8m2MeGoPV2TmlFSUrAJC83oP9mTeB3Y0ZxqmDFTOkBZBM7gfkEVovi2soADimJpq vEG0Dc7XlCSKmxiMQQUmzXQiEJmC8mE6RWvH6TGwp/SU3TAQKhq03GAuhF1PwK87XR8D L7yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718027; x=1774322827; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=cZusbnuL45ohzKQp1GSHPuIGLfUub8pv++b9H4SReHU=; b=V9G8WXVSoBkLv5E9OFmJ23hjSyWR3+tWc+dbSjf1rMNcoulcR5EIcqBeb95A5PNCfT 8OsGsJ3677YKQbZSagaL4PT4AAj19rDEyfbFpzjhKC00FXBD18542XtH2rGcNMO7PODp pdJBgOcZxcuP4tO8fPNDqFCyQ1bYvdqfL+m8+RQ1hZbax14G+dfkdghuH4avqKBrBGNd tm86tZJ3B4Y5GxGE49NbkQeLVOuAFN7RTNINBcKr4V+s3TZW98rbpK7g7VRgC6tdTmoa 5hR7QljS9yHEbGFZPzsPGQORfKzIYYKL4V7pVAIK2prkw9I2rDhU8X5M6YqJ3nyhH5e7 gvgw== X-Forwarded-Encrypted: i=1; AJvYcCVKdk2twCa3eEd2GBifmkDGk/GXJbtbbmr3+Uob5S46iFHzy954vD6fWbVhgj/M78fiHEtSQzvcj+4H6UI=@vger.kernel.org X-Gm-Message-State: AOJu0YzHXUbEelAWXaDftDUObmpceCOGtOTczmwXmDLWhFomuzgn2UF+ BRuNvM/1X5q0b7rCkxoYJQj+MKRfRFvGDeW6AJQwMKp8ULcVk2FUvBDtdnxkB5hZKVLYF5oslZ8 IZ3A409K6n9mmjlMb1FcrI3b7ksJia+52563oo7tJH/KTDQ8sMgfzcZh/gQCgnmuXuzo= X-Gm-Gg: ATEYQzzgdnhsGAnBOJpZQPdlqMvYrCt6LMRZxqN0j5QAaw7C/Kak6fi0tFfwbIbLnyr 0P1Ul+1SOdpCGMOweUWQxeCcqvlwqrQz3Ux7bohzMrQOi9NQoZwhlU1SCAcDglgid8dD6E3Xn4k 0qYVUhKcgsw3o6nV9lER9riN9XBju20urYKFddYix8A/+ODoDSc60oAFtT1CUHBIUff8olojQVS /Cd8fOMG++qdUKDHcxwY0EzKN3cCwgPsnoBs+dfanOoblEQWIFn08jqquQZG459uo3g7t65uqP/ o5czFYWp6I9c+3BVMUOBXMqU0JyFngZLpKPM/iNjc+BejyywzzvUCbTFX2SOhD4Zsm+IBOeKUFI 6v0NTPeck/abg3PfphOCjfsJ9fA/iDMukRzKky6EX3Yv158kzRkD5bFq9Z561D34P56RNFNYR9C 50 X-Received: by 2002:a05:693c:60dc:b0:2c0:ae1b:4568 with SMTP id 5a478bee46e88-2c0ae1b4774mr4532783eec.7.1773718026797; Mon, 16 Mar 2026 20:27:06 -0700 (PDT) X-Received: by 2002:a05:693c:60dc:b0:2c0:ae1b:4568 with SMTP id 5a478bee46e88-2c0ae1b4774mr4532768eec.7.1773718026244; Mon, 16 Mar 2026 20:27:06 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.27.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:27:05 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 6/7] qcom-tgu: Add timer/counter functionality for TGU Date: Mon, 16 Mar 2026 20:26:38 -0700 Message-Id: <20260317032639.2393221-7-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=c7+mgB9l c=1 sm=1 tr=0 ts=69b8ca0b cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=eGDQztGCVwpQsGOtWZEA:9 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-ORIG-GUID: Y82uki8jifwT1lolwjsJUQsAzTu6XMPp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfXyGhRmqniKiF6 8+4LcAzD8i05TIqnLqb8baScymIWouOqVK0v6shEvbC611CGuMHqT6M+FH56SsamZMNcxv9vQ+p I2EAAb+zsa6VF5uwPbBzv9B46zzF1aAlL33n0yVMSxH/BGgJ1N+MnZ2lxS3weBWC3gALsuprhIe 3NzIRlV764Muk5dfMd69yK1ViQrHYCPlEgs77u91lwcAjUXrkTO0dydSgtrV0czyRaz1w+LEJWl xJyvARq3c1jK7P/9zePq0YahZbjD8Gl33dqzx4rrsKE3+KPPpzr0QGpwJ3dxgyXQawWkH7mdSK+ qP8QfhxN9rn3FB6xAQ9t0EzK1CwRsPjNf0fXS9vy4NXxl4cDCB3ZxGaN77OClngXsqNyvM0LqzO hayarlo0JfsOUzhJXF2y0k/xs6JQ8pI3v75p8RNoQmoeflzYZLpOyLOmkCNB/oBDJlx5rDnbX8F KXShRzOU5kxVtvODfbw== X-Proofpoint-GUID: Y82uki8jifwT1lolwjsJUQsAzTu6XMPp 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 malwarescore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Add counter and timer node for each step which could be programed if they are to be utilized in trigger event/sequence. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 14 +++ drivers/hwtracing/qcom/tgu.c | 116 +++++++++++++++++- drivers/hwtracing/qcom/tgu.h | 56 +++++++++ 3 files changed, 184 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index d8431a82574a..5370882333bc 100644 --- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -28,3 +28,17 @@ KernelVersion 7.1 Contact: Jinlong Mao , Songwei Chai Description: (RW) Set/Get the next action with specific step for TGU. + +What: /sys/bus/amba/devices//step[0:7]_timer/reg[0:1] +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the timer value with specific step for TGU. + +What: /sys/bus/amba/devices//step[0:7]_counter/reg[0:1] +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (RW) Set/Get the counter value with specific step for TGU. diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c index 1d996b9e303a..4539415571f6 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -32,6 +32,10 @@ static int calculate_array_location(struct tgu_drvdata *= drvdata, case TGU_CONDITION_SELECT: return step_index * (drvdata->num_condition_select) + reg_index; + case TGU_COUNTER: + return step_index * (drvdata->num_counter) + reg_index; + case TGU_TIMER: + return step_index * (drvdata->num_timer) + reg_index; default: break; } @@ -77,6 +81,12 @@ static ssize_t tgu_dataset_show(struct device *dev, case TGU_CONDITION_SELECT: return sysfs_emit(buf, "0x%x\n", drvdata->value_table->condition_select[index]); + case TGU_TIMER: + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->timer[index]); + case TGU_COUNTER: + return sysfs_emit(buf, "0x%x\n", + drvdata->value_table->counter[index]); default: break; } @@ -122,6 +132,14 @@ static ssize_t tgu_dataset_store(struct device *dev, tgu_drvdata->value_table->condition_select[index] =3D val; ret =3D size; break; + case TGU_TIMER: + tgu_drvdata->value_table->timer[index] =3D val; + ret =3D size; + break; + case TGU_COUNTER: + tgu_drvdata->value_table->counter[index] =3D val; + ret =3D size; + break; default: ret =3D -EINVAL; break; @@ -163,6 +181,18 @@ static umode_t tgu_node_visible(struct kobject *kobjec= t, if (tgu_attr->reg_num < drvdata->num_condition_select) return attr->mode; break; + case TGU_COUNTER: + if (!drvdata->num_counter) + break; + if (tgu_attr->reg_num < drvdata->num_counter) + return attr->mode; + break; + case TGU_TIMER: + if (!drvdata->num_timer) + break; + if (tgu_attr->reg_num < drvdata->num_timer) + return attr->mode; + break; default: break; } @@ -213,6 +243,30 @@ static ssize_t tgu_write_all_hw_regs(struct tgu_drvdat= a *drvdata) drvdata->base + CONDITION_SELECT_STEP(i, j)); } } + + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < drvdata->num_timer; j++) { + index =3D check_array_location(drvdata, i, TGU_TIMER, j); + + if (index =3D=3D -EINVAL) + goto exit; + + writel(drvdata->value_table->timer[index], + drvdata->base + TIMER_COMPARE_STEP(i, j)); + } + } + + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < drvdata->num_counter; j++) { + index =3D check_array_location(drvdata, i, TGU_COUNTER, j); + + if (index =3D=3D -EINVAL) + goto exit; + + writel(drvdata->value_table->counter[index], + drvdata->base + COUNTER_COMPARE_STEP(i, j)); + } + } /* Enable TGU to program the triggers */ writel(1, drvdata->base + TGU_CONTROL); exit: @@ -256,6 +310,27 @@ static void tgu_set_conditions(struct tgu_drvdata *drv= data) drvdata->num_condition_select =3D TGU_DEVID_CONDITIONS(devid) + 1; } =20 +static void tgu_set_timer_counter(struct tgu_drvdata *drvdata) +{ + int num_timers =3D 0, num_counters =3D 0; + u32 devid2; + + devid2 =3D readl(drvdata->base + CORESIGHT_DEVID2); + + if (TGU_DEVID2_TIMER0(devid2)) + num_timers++; + if (TGU_DEVID2_TIMER1(devid2)) + num_timers++; + + if (TGU_DEVID2_COUNTER0(devid2)) + num_counters++; + if (TGU_DEVID2_COUNTER1(devid2)) + num_counters++; + + drvdata->num_timer =3D num_timers; + drvdata->num_counter =3D num_counters; +} + static int tgu_enable(struct device *dev) { struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); @@ -395,6 +470,22 @@ static const struct attribute_group *tgu_attr_groups[]= =3D { CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(5), CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(6), CONDITION_SELECT_ATTRIBUTE_GROUP_INIT(7), + TIMER_ATTRIBUTE_GROUP_INIT(0), + TIMER_ATTRIBUTE_GROUP_INIT(1), + TIMER_ATTRIBUTE_GROUP_INIT(2), + TIMER_ATTRIBUTE_GROUP_INIT(3), + TIMER_ATTRIBUTE_GROUP_INIT(4), + TIMER_ATTRIBUTE_GROUP_INIT(5), + TIMER_ATTRIBUTE_GROUP_INIT(6), + TIMER_ATTRIBUTE_GROUP_INIT(7), + COUNTER_ATTRIBUTE_GROUP_INIT(0), + COUNTER_ATTRIBUTE_GROUP_INIT(1), + COUNTER_ATTRIBUTE_GROUP_INIT(2), + COUNTER_ATTRIBUTE_GROUP_INIT(3), + COUNTER_ATTRIBUTE_GROUP_INIT(4), + COUNTER_ATTRIBUTE_GROUP_INIT(5), + COUNTER_ATTRIBUTE_GROUP_INIT(6), + COUNTER_ATTRIBUTE_GROUP_INIT(7), NULL, }; =20 @@ -402,8 +493,8 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) { struct device *dev =3D &adev->dev; struct tgu_drvdata *drvdata; - unsigned int *priority, *condition, *select; - size_t priority_size, condition_size, select_size; + unsigned int *priority, *condition, *select, *timer, *counter; + size_t priority_size, condition_size, select_size, timer_size, counter_si= ze; int ret; =20 drvdata =3D devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); @@ -422,6 +513,7 @@ static int tgu_probe(struct amba_device *adev, const st= ruct amba_id *id) tgu_set_reg_number(drvdata); tgu_set_steps(drvdata); tgu_set_conditions(drvdata); + tgu_set_timer_counter(drvdata); =20 ret =3D sysfs_create_groups(&dev->kobj, tgu_attr_groups); if (ret) { @@ -464,6 +556,26 @@ static int tgu_probe(struct amba_device *adev, const s= truct amba_id *id) =20 drvdata->value_table->condition_select =3D select; =20 + timer_size =3D drvdata->num_step * drvdata->num_timer; + + timer =3D devm_kcalloc(dev, timer_size, + sizeof(*(drvdata->value_table->timer)), + GFP_KERNEL); + if (!timer) + return -ENOMEM; + + drvdata->value_table->timer =3D timer; + + counter_size =3D drvdata->num_step * drvdata->num_counter; + + counter =3D devm_kcalloc(dev, counter_size, + sizeof(*(drvdata->value_table->counter)), + GFP_KERNEL); + if (!counter) + return -ENOMEM; + + drvdata->value_table->counter =3D counter; + drvdata->enabled =3D false; =20 pm_runtime_put(&adev->dev); diff --git a/drivers/hwtracing/qcom/tgu.h b/drivers/hwtracing/qcom/tgu.h index ac46a2875209..5dfef0afbad6 100644 --- a/drivers/hwtracing/qcom/tgu.h +++ b/drivers/hwtracing/qcom/tgu.h @@ -11,6 +11,7 @@ #define TGU_LAR 0xfb0 #define TGU_UNLOCK_OFFSET 0xc5acce55 #define TGU_DEVID 0xfc8 +#define CORESIGHT_DEVID2 0xfc0 =20 #define TGU_DEVID_SENSE_INPUT(devid_val) \ ((int)FIELD_GET(GENMASK(17, 10), devid_val)) @@ -18,6 +19,16 @@ ((int)FIELD_GET(GENMASK(6, 3), devid_val)) #define TGU_DEVID_CONDITIONS(devid_val) \ ((int)FIELD_GET(GENMASK(2, 0), devid_val)) +#define TGU_DEVID2_TIMER0(devid_val) \ + ((int)FIELD_GET(GENMASK(23, 18), devid_val)) +#define TGU_DEVID2_TIMER1(devid_val) \ + ((int)FIELD_GET(GENMASK(17, 13), devid_val)) +#define TGU_DEVID2_COUNTER0(devid_val) \ + ((int)FIELD_GET(GENMASK(11, 6), devid_val)) +#define TGU_DEVID2_COUNTER1(devid_val) \ + ((int)FIELD_GET(GENMASK(5, 0), devid_val)) + + #define TGU_BITS_PER_SIGNAL 4 #define LENGTH_REGISTER 32 =20 @@ -53,6 +64,8 @@ #define PRIORITY_START_OFFSET 0x0074 #define CONDITION_DECODE_OFFSET 0x0050 #define CONDITION_SELECT_OFFSET 0x0060 +#define TIMER_START_OFFSET 0x0040 +#define COUNTER_START_OFFSET 0x0048 #define PRIORITY_OFFSET 0x60 #define REG_OFFSET 0x4 =20 @@ -67,6 +80,12 @@ #define CONDITION_SELECT_STEP(step, select) \ (CONDITION_SELECT_OFFSET + REG_OFFSET * select + STEP_OFFSET * step) =20 +#define TIMER_COMPARE_STEP(step, timer) \ + (TIMER_START_OFFSET + REG_OFFSET * timer + STEP_OFFSET * step) + +#define COUNTER_COMPARE_STEP(step, counter) \ + (COUNTER_START_OFFSET + REG_OFFSET * counter + STEP_OFFSET * step) + #define tgu_dataset_rw(name, step_index, type, reg_num) \ (&((struct tgu_attribute[]){ { \ __ATTR(name, 0644, tgu_dataset_show, tgu_dataset_store), \ @@ -82,6 +101,10 @@ tgu_dataset_rw(reg##reg_num, step_index, TGU_CONDITION_DECODE, reg_num) #define STEP_SELECT(step_index, reg_num) \ tgu_dataset_rw(reg##reg_num, step_index, TGU_CONDITION_SELECT, reg_num) +#define STEP_TIMER(step_index, reg_num) \ + tgu_dataset_rw(reg##reg_num, step_index, TGU_TIMER, reg_num) +#define STEP_COUNTER(step_index, reg_num) \ + tgu_dataset_rw(reg##reg_num, step_index, TGU_COUNTER, reg_num) =20 #define STEP_PRIORITY_LIST(step_index, priority) \ {STEP_PRIORITY(step_index, 0, priority), \ @@ -122,6 +145,18 @@ NULL \ } =20 +#define STEP_TIMER_LIST(n) \ + {STEP_TIMER(n, 0), \ + STEP_TIMER(n, 1), \ + NULL \ + } + +#define STEP_COUNTER_LIST(n) \ + {STEP_COUNTER(n, 0), \ + STEP_COUNTER(n, 1), \ + NULL \ + } + #define PRIORITY_ATTRIBUTE_GROUP_INIT(step, priority)\ (&(const struct attribute_group){\ .attrs =3D (struct attribute*[])STEP_PRIORITY_LIST(step, priority),\ @@ -143,6 +178,19 @@ .name =3D "step" #step "_condition_select" \ }) =20 +#define TIMER_ATTRIBUTE_GROUP_INIT(step)\ + (&(const struct attribute_group){\ + .attrs =3D (struct attribute*[])STEP_TIMER_LIST(step),\ + .is_visible =3D tgu_node_visible,\ + .name =3D "step" #step "_timer" \ + }) + +#define COUNTER_ATTRIBUTE_GROUP_INIT(step)\ + (&(const struct attribute_group){\ + .attrs =3D (struct attribute*[])STEP_COUNTER_LIST(step),\ + .is_visible =3D tgu_node_visible,\ + .name =3D "step" #step "_counter" \ + }) =20 enum operation_index { TGU_PRIORITY0, @@ -151,6 +199,8 @@ enum operation_index { TGU_PRIORITY3, TGU_CONDITION_DECODE, TGU_CONDITION_SELECT, + TGU_TIMER, + TGU_COUNTER }; =20 /* Maximum priority that TGU supports */ @@ -167,6 +217,8 @@ struct value_table { unsigned int *priority; unsigned int *condition_decode; unsigned int *condition_select; + unsigned int *timer; + unsigned int *counter; }; =20 static inline void TGU_LOCK(void __iomem *addr) @@ -198,6 +250,8 @@ static inline void TGU_UNLOCK(void __iomem *addr) * @num_step: Maximum step size * @num_condition_decode: Maximum number of condition_decode * @num_condition_select: Maximum number of condition_select + * @num_timer: Maximum number of timers + * @num_counter: Maximum number of counters * * This structure defines the data associated with a TGU device, * including its base address, device pointers, clock, spinlock for @@ -214,6 +268,8 @@ struct tgu_drvdata { int num_step; int num_condition_decode; int num_condition_select; + int num_timer; + int num_counter; }; =20 #endif --=20 2.34.1 From nobody Tue Apr 7 01:13:29 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 8D7F32E888C for ; Tue, 17 Mar 2026 03:27:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718034; cv=none; b=sDIwqoNF4o4DIb0mElcpacPnPnWWl5RUwgnh0+iwjvls7BIuEwFiLGwywhW3cIDL9hJei5Y9VCDh1DAOQARmd7J64K06/oRV9ISJ6CK1/70/633Tk8pSwz+VZu8qYoMAZHbY0/kcGPlPQlmqg8GtASxTBp30TDcb5q3u5Jn7Od0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773718034; c=relaxed/simple; bh=UUs+JPZCYxsQo2F6VHcVqzhamokfy4bkJoHhrbVZqGQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DcA7PqIyyhXBcLW78Cg8Ey/Q7jHlN/yVKwhB0ggRgsSh8hwav9ND3WRE+lNEipOG+gWBv/YWkLy9XtI9ILFgx2Big1lfRa/jwl7cQL0rfTNsVjD1WGJUC0slCqS7GsiBqp0HSOzow3Gg8QJ+YNDUMIoDnF6gIot5FYJdmnYambI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=JmwBrSha; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kiqVCdbu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="JmwBrSha"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kiqVCdbu" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62H2rDoS3124546 for ; Tue, 17 Mar 2026 03:27:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=QFXI9W3wYf+ aodd6TigXJ8+gpEqreWaR9RarC30l04Q=; b=JmwBrShalf2t0vTfWbkQzsc/t+9 vi850mwVYTyiA8gnWLOmxiALBnxpId7LoKl2KMOGqwG+qGiNO4dLaYMs+C6Ka2rn SRmeuABSdyuhRb+urVDNT29JzSVYPZuBJam281/rAicx+b/rSe3BwrfqZeoZPNXX 7G1zL7eyY5+Cn/FYTxCOyvqWxDCWbZSF30YYQlyxVwepbqAz3aMOVJAViPVUQhZL Bg83gBi2lokcD5ChHi8b0vPux26Sv94BTNeYrLycQY4m6HcJN41TbPPRODZai0lR 6lK2Tgh8DoFr5lGPa65bSF1czFpMoqToLdsvMSkXGMrfueGmagAs0bRzztA== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cxfsmk914-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 17 Mar 2026 03:27:11 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-2bea1ffd05bso5040298eec.0 for ; Mon, 16 Mar 2026 20:27:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773718031; x=1774322831; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QFXI9W3wYf+aodd6TigXJ8+gpEqreWaR9RarC30l04Q=; b=kiqVCdbuuXQdDlC+4iNj/krLhsbgVWp87aC1uX3PpuPrKD7OT7OKEcIn7cnVHJb0Wi RzRXc7yzmnOIhS3WecWk55ZXdxpWmsVjgBk1Kxfs6BVAoKCFV4hi58CRx4nlqa4iNvVf SFljkPakjWq2eWuWs/lcIW1nrqSrTAAZf9S3ExppZIxzqXNCIWO/ptOlGT/95RYtGMiO OMnrcHLK0Qz2bqfiQglqcO75EGrZCzC3b0bfAAx6T1NndOEdCb3opEZlel1Iug4FevyB AOuAA7iymK5N/Ix644JH9yeFwysSZW4dBcYtbO6InsuQxQLevMa9kFYe3SrsMLgSOKUR R0vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773718031; x=1774322831; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QFXI9W3wYf+aodd6TigXJ8+gpEqreWaR9RarC30l04Q=; b=amIrTY3ZXdhN4qoHtIMloFXqzmUdICZxp9Yu2c7AAGTRwaC+i5vRk5S2fAvmY5JTqa hpiYsqEchJyIwSPClJjegjTsBPBI/eHdUL6qchCE+HPlFgMo9d/2f95r2lUDzobP2rBa j7K0UFTpj9IQpK4HFcjoRdLfbtK/knE4HNI75tKJhty/tTS8NKcftRmYrsCGH+F8Y3qF VvlJt2w9QCZI/pQnuqzlu53VhijPS6O5kpBKTBU5FfKyN2FMpPaF99NVYlcKW+n6yfua Rs2/P2YsCkRO24irIDYeF20RS3JXDr7bEEZqeRoS/RD/WoNgBz9/wcNgJLEhMIgKZzSX +lNQ== X-Forwarded-Encrypted: i=1; AJvYcCVEKYxLTSVBqW2okR/Pq7ANhwTCW1ytqCNDEMp0mUbMJ3diaQO4kAarfiqBcdAubW9A4hfK1Izz8PYOBVk=@vger.kernel.org X-Gm-Message-State: AOJu0YxkgukDmBmqjlELeSeyUeM8Ll4AbK5I1K+8oXgp1bjlrGMlHY+8 oO7G4lD4fgaZvjleOfyx65b9zWfWMWkLcHGbymYmn4pzWMPMwK0SI9RJiBggIBCBTTbj12Bz+bQ 8vfZhLzxSeomuyaarxMRmo6Bkwm8mCINpiBqaOn2+s9LXuHoDazJ5fFmwXH37bBY0Qp8= X-Gm-Gg: ATEYQzyL9tOd6Z/enXhWTIR7vhTJu6XWtvqWfpFt00x4LlRMfb6LoVMPZmyVfNsj+ov r99A4N+cifQQLua4+KToPKtJpCaYEyEyYEZQ3pYcZmbokeT6ZO6DGMXBge7IR81bS+SkPMPpuOw RmBRflcY74jt0vpDj7tG5t/c2M2LY/rIcYCWs6TJ5o5JR4Kc0KP3hRT4AuDrrOXz8fJql0DElMt uHIBXjBpoO0nr00jxHn8Et/eC3+ZuF/Z3OML4xNOUU2E9yo2L3+iwLAnSoL8B3tbKiqFazqUMur mbEfKf/DJstDaEATgzYqdKh8iflytzOaNKyVh/mdbDlrkhyJawkO3rSpjX7dtkgMMsbga2CWcYU j5AtfUtlumPh3epqKFvzHLo8hd+sNV+3cFjT29zNFOIlPBuVbmhWNY7PK6B+SX8qTqcjqCknVsF 9n X-Received: by 2002:a05:7022:404:b0:128:bae0:e043 with SMTP id a92af1059eb24-128f3df1710mr6715222c88.31.1773718030840; Mon, 16 Mar 2026 20:27:10 -0700 (PDT) X-Received: by 2002:a05:7022:404:b0:128:bae0:e043 with SMTP id a92af1059eb24-128f3df1710mr6715204c88.31.1773718030296; Mon, 16 Mar 2026 20:27:10 -0700 (PDT) Received: from hu-songchai-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2beab3ef844sm17445895eec.15.2026.03.16.20.27.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 20:27:09 -0700 (PDT) From: Songwei Chai To: andersson@kernel.org, alexander.shishkin@linux.intel.com, mike.leach@linaro.org, konrad.dybcio@oss.qualcomm.com, suzuki.poulose@arm.com, james.clark@arm.com, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Songwei Chai , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, coresight@lists.linaro.org, devicetree@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v12 7/7] qcom-tgu: Add reset node to initialize Date: Mon, 16 Mar 2026 20:26:39 -0700 Message-Id: <20260317032639.2393221-8-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> References: <20260317032639.2393221-1-songwei.chai@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzE3MDAyNyBTYWx0ZWRfX1BxJzZN8XOYk 4qX3qJR6MQdOTUu+gR0xbkifF5nGpK7QoTe0t1NW1onVd0IeDR3ngR7P20bHNdNu/Y3ciS3ReLI me9vo+fWaSCOr3o8FqwQ2lIbEcUL5c2DC9TrN4RDxL5OMGtmQvANPOTMYCRKk9xzAO6gh/GAzQu 6+aXSJDsnvF/ZYpmv4SvofBdiW309mUvSFe3KU4YUwQMK/9Vr54+7Kf258nimN9XPIlc2WOOGWe BZ8z1tOXCmmz1Nplh+3FPSUbJxODICbo8AFbzPr5Yrs61NCEualm0a93durmCt5pc64gHtwQSFx Kigq685xp8DtBufkWIre6k/O/4vS2HvPT3ceaYGlyBrzFFVUMQEcR7QSbQZUY8aA8dAEERsXPL6 z4em089KYQ9kRrQWU4bEVjDuGWXthxqEnEgu+qIWjsz2EdrW78WrFI1qIbHb+Vm3ieTnWIidPjk OV2BPsY6SleA1osVS7g== X-Proofpoint-GUID: DuS8pJ1QvPvNAso5gtLpCHOIc6OZOUkC X-Authority-Analysis: v=2.4 cv=V/hwEOni c=1 sm=1 tr=0 ts=69b8ca0f cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=IgPCHI2mAnvcCQI4J_AA:9 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-ORIG-GUID: DuS8pJ1QvPvNAso5gtLpCHOIc6OZOUkC 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-17_01,2026-03-16_06,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603170027 Content-Type: text/plain; charset="utf-8" Add reset node to initialize the value of priority/condition_decode/condition_select/timer/counter nodes. Signed-off-by: Songwei Chai Reviewed-by: Jie Gan --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 7 ++ drivers/hwtracing/qcom/tgu.c | 77 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index 5370882333bc..1dcb8fb71cd9 100644 --- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -42,3 +42,10 @@ KernelVersion 7.1 Contact: Jinlong Mao , Songwei Chai Description: (RW) Set/Get the counter value with specific step for TGU. + +What: /sys/bus/amba/devices//reset_tgu +Date: March 2026 +KernelVersion 7.1 +Contact: Jinlong Mao , Songwei Chai +Description: + (Write) Write 1 to reset the dataset for TGU. diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c index 4539415571f6..e28e6d27cf56 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -410,8 +410,85 @@ static ssize_t enable_tgu_store(struct device *dev, } static DEVICE_ATTR_RW(enable_tgu); =20 +/* reset_tgu_store - Reset Trace and Gating Unit (TGU) configuration. */ +static ssize_t reset_tgu_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t size) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + struct value_table *vt =3D drvdata->value_table; + u32 *cond_decode =3D drvdata->value_table->condition_decode; + bool need_pm_put =3D false; + unsigned long value; + int i, j, ret; + + if (kstrtoul(buf, 0, &value) || value !=3D 1) + return -EINVAL; + + spin_lock(&drvdata->lock); + if (!drvdata->enabled) { + spin_unlock(&drvdata->lock); + ret =3D pm_runtime_resume_and_get(drvdata->dev); + if (ret) + return ret; + need_pm_put =3D true; + spin_lock(&drvdata->lock); + } + + tgu_do_disable(drvdata); + + if (vt->priority) { + size_t size =3D MAX_PRIORITY * drvdata->num_step * + drvdata->num_reg * sizeof(unsigned int); + memset(vt->priority, 0, size); + } + + if (vt->condition_decode) { + size_t size =3D drvdata->num_condition_decode * + drvdata->num_step * sizeof(unsigned int); + memset(vt->condition_decode, 0, size); + } + + /* Initialize all condition registers to NOT(value=3D0x1000000) */ + for (i =3D 0; i < drvdata->num_step; i++) { + for (j =3D 0; j < drvdata->num_condition_decode; j++) { + cond_decode[calculate_array_location(drvdata, i, + TGU_CONDITION_DECODE, j)] =3D 0x1000000; + } + } + + if (vt->condition_select) { + size_t size =3D drvdata->num_condition_select * + drvdata->num_step * sizeof(unsigned int); + memset(vt->condition_select, 0, size); + } + + if (vt->timer) { + size_t size =3D (drvdata->num_step) * (drvdata->num_timer) * + sizeof(unsigned int); + memset(vt->timer, 0, size); + } + + if (vt->counter) { + size_t size =3D (drvdata->num_step) * (drvdata->num_counter) * + sizeof(unsigned int); + memset(vt->counter, 0, size); + } + + spin_unlock(&drvdata->lock); + + dev_dbg(dev, "Qualcomm-TGU reset complete\n"); + + if (need_pm_put) + pm_runtime_put(drvdata->dev); + + return size; +} +static DEVICE_ATTR_WO(reset_tgu); + static struct attribute *tgu_common_attrs[] =3D { &dev_attr_enable_tgu.attr, + &dev_attr_reset_tgu.attr, NULL, }; =20 --=20 2.34.1