From nobody Tue Apr 7 01:03:54 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 74D013AB286 for ; Thu, 2 Apr 2026 09:28:54 +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=1775122145; cv=none; b=GqVLFqPDyRK51tENyhyplNDH6itThuQe6fRyhEHlsqnIwwmorDHy9GP84jszsQlkqh2fWJsIqcCQ3ZPsgK2GCJncUB9IkyTiA533YL0DXRtH9tp/lhHCxBUYQo4woo0OOnpHKXnwwyFgxwopUTTjdPMe6LzkGZw8xZB/XK6C1D8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122145; c=relaxed/simple; bh=HKFOu1fNblOcn/HFOdu48EyT+lBa2UuOd8Ya8wh5870=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oVGn5N6DyV8qP7R38j4tBHD+arrshEaSql31NPHyX7Kqe6goVi16nAnos5AJSH42PDai8s+2ud8qO7bX970OnVRcJIJAsHDRbkVf7bWNinMvdVOalGeAvGZBwgplIWH6kMet3s8W3WEG+x4CuxfcndnP6nb+XGFGXoVt2l8MV/E= 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=QOsiPHKx; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=HqWJDmaU; 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="QOsiPHKx"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="HqWJDmaU" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6326l6ie3044345 for ; Thu, 2 Apr 2026 09:28:52 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=QOsiPHKxJU0AYO7HKMMYnthq4Ii kSXio3+LB27asj+rCsUYQqgIlPeCiY9HxV/48vVc/sJrRp+7flLGLsT6uaPcc0X7 WMlCOfE5rsSTIWwPi+Ao2IgnCVlmq62Tr2Xnn9RD9YL7D3voogd/dojX5Orh3geM aAMJl0o98MwWXFM8P4EdQXvVojzVzgq1VNR2lBqxxaYimxAP5G5vp1O/OTazfskT XuM0buLVNxv3qLoswleMJOkypyNoYxp6PMeBDcEWMz/yfiGqhIUjymRcn/YEsIir ihif0/Da4b5j6ruH+wcGGhznU5wthOvfgcdTa5EvrPXITwiRQLQTADUYKqQ== 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 4d9483v5pq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:28:52 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-2bdc1b30ac8so5156907eec.1 for ; Thu, 02 Apr 2026 02:28:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122132; x=1775726932; 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=HqWJDmaUNr1/iDCuHLNF++ScWdv4Oge8xMAgKR+rvaF1uVHnwFgeQAJ3I0PELWn20T 9aG1sruwjO/s3AVSBtx928kvJpsLw5ykLzDFNS53Xwktgjh8eth9L4Qh0nTnpZDJL2DH es1UAZOSccsMQipW81exopKQy9DOy5nrpDsKqCNKquDJFFa9vTxRnnEnStcZi3N+3FtV JqTCmDbAVvuPXa53IUiTI1vS26GIG5ZlAJvRAdY2jKiBOaPIz+3EvnLJX8SVT0lbcdPJ 1S7THaVVT7ZB8tTOI+61UV7j4tzltSAQ+Zk9WCDDR6TSbG7XN8zAQaCfMLxCiOvsSFQf dOLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122132; x=1775726932; 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=ivqJ2f5861nFYLRT4hUvnwQy8te4wSZMhULAfkwBABLL6VUHPIF91GrOfUJfH4seCs 5a9CgOcq1qIBq0UehnK8HnKvYzd8zNF618XLiFIx9z/e60wby3ARSS47gauKUHdL+0vJ icuZ1MzOkMzZMpNYdIDZ2K9kbquXLz1TZwINqqyxGO/UGF1mYgvWmb0MwU+0p7bJ6o9Y DKFy9w9UJreGRjkiB+WcwEnrcmhzxH0ySKxpm9diacKCAJ4ghquCE/7h96WZVZOjzktP A0gomZZ8YcIgkfzoSJjjjUjUEGKUIvkQvERBHl/h4raD9zLwLVsIhio1fuRX0VkaMN5M JBNw== X-Forwarded-Encrypted: i=1; AJvYcCXrKHTGpNFf2CUZhb+1c5Vi8hCn49H4IQx5Eo1oE+ELwZ0VK+oRED4ZdEVTWCcv50ln3cMV19Kp5NDBZqk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz56Ml1Y9H768USeP9RW0j9SfgRnyzTQH3/Z6WFTgBDPOUczDiT Xw+0X9O8EjkvV8TxQ+2RJMAACH2/6MBrDhMZNgYhUt1o2VABkdJ8jTv3iFsDFTucOwWBP2eOwIa wz/3CNrkyTMlTf2/fuOxxwGkjYr2u22/EMo7nNhUAcIeb+meahWM9N9C7O9Ggy3Lo5Zo= X-Gm-Gg: ATEYQzwM5fBJLLkLoL1hlS6RyO94BleV3M2Z9q5QlqQdGlqluKwNYQh7nyZ8R+ps71n 9CJv5+pELHxII5b9U3rEPvin0CFiyIo/b1N2F4xK0TJfK9FtxHyM5biUfq5IGF1ZXTeYygqGrZj xsAydCtB0ncHZjSf5ktWeGeDE4POMrsSAtVMBkhLnbzsSUx/Q14XR4A7w+MTHg4qlQACBeZBVix WXUT9MYvFWvJ+LQNmHV4SJSGvCvrNOVXe9eoU/NTHyhznWeyvInZkXvBvBRvHWwYueG0gYSs3n2 1KwCdlvWim0C1sTzHfUMLTsWOozkAX6oktsR7jZrlYU74BCH1jrqiokgUClnfhZlDTOBgKIeVev If3bVL0IXk6yuy5qQdhEYB8FQfoQa8XXzafOM1SOs6T8r8A4vJ7hzFINvhohRfKpPwVPrBOLgBR /K X-Received: by 2002:a05:7301:6787:b0:2c5:fb3f:70e1 with SMTP id 5a478bee46e88-2ca9037b03fmr1380030eec.24.1775122131687; Thu, 02 Apr 2026 02:28:51 -0700 (PDT) X-Received: by 2002:a05:7301:6787:b0:2c5:fb3f:70e1 with SMTP id 5a478bee46e88-2ca9037b03fmr1379996eec.24.1775122131091; Thu, 02 Apr 2026 02:28: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-2cafd073194sm951094eec.28.2026.04.02.02.28.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:28: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, Rob Herring Subject: [PATCH v13 1/7] dt-bindings: arm: Add support for Qualcomm TGU trace Date: Thu, 2 Apr 2026 02:28:32 -0700 Message-Id: <20260402092838.341295-2-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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=RYydyltv c=1 sm=1 tr=0 ts=69ce36d4 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=gEfo2CItAAAA:8 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=N3VNWiZ0WD7Ir0aJMQYA:9 a=6Ab_bkdmUrQuMsNx7PHu:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfXz1P8zilpYLK3 PwqPqGs94fTcGpUln8aBMiSnUlgGA6rjlj0i18Ze5J2TtHrTiJRW3NngFx/+M80J3yN0vQAqjHA 7JuiaRl0t2a7PKYl+KPVXENgRI4P7H7brVZW2NtZ54q0b/Sf7crl76s+5hpLEoifv7CIb1AZeqn mOBVJaz1aBaGBXsUyUHsrl9WPdF9x65+TOnUERUMIboP4ACSppbPKo+1UyLtU9XcGEnKyDpq4Hs TClt1HG8v6bQgh1D9Dr4YncVe+BY1H2mPKoxgRKWj8lfsbgL0jym3WlP2sw8rffqdCqMpmmhHNA GYtZ81/sM2ws7TjU1CiRmOMPPmHamdPq5QGDX5FjSqeay8GVHqdgEVVl/2rJfEw925tyl+U6UP+ v1GJeVfMxE5+Ln+jLpPf5u9EkuDprwnZn/bKF3Wk5aDNnsqxBKI72RNXAQ8J/4qOQT+siFu+dmK eEdvzPOSet9jYVZZ55g== X-Proofpoint-ORIG-GUID: lxjDy1kAKox-GSldJKB4-TNJhUrkmiYQ X-Proofpoint-GUID: lxjDy1kAKox-GSldJKB4-TNJhUrkmiYQ 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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:03:54 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 E37823939AC for ; Thu, 2 Apr 2026 09:28:55 +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=1775122147; cv=none; b=jPrf4FzmjkE6oIzBXO/685u/dJ/ADy5k0xvVMSanNKFQTz+B0uwlbfC6RQT7TTMT8IoBGI3HR3UVru/qD3Q+70qzt2b+QA34h/uKVQvD6zHuVJyxC47aJt6XtYb97qn05tGrtDf49RsfZuUBab9KKYEWUVkyRwr+am2+0SXj814= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122147; c=relaxed/simple; bh=YkfibUf3Sk8wjpdDwqM7ptZvyASwNPFHGpIrHotam/Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=X5+eHsrlGMYcAk9xhpeB4M3vytdp9bLR5Sihy3CSpRipUB85pdOyzD+AEkjP1GPnEZ/jwLHKUYJIKm0hsCVyfJryRbrn6hbrHTKMRE73UMOs6v+vrQa4oIprWEHv2R9QqlnPZpsuRd2w2+3rmCA1Szo1TdI9M+FoFSKSiau9+L4= 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=WmRY2AcE; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dBocttn3; 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="WmRY2AcE"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dBocttn3" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6327CVL33044437 for ; Thu, 2 Apr 2026 09:28:55 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=OZaEG6ZKced fi4AQS4ZSrWco9P0mCBULI4k4ihcHhYs=; b=WmRY2AcErmE9lGxSgVZgxPXQZRi O8S6vy0Nd/na0yQLxkFlcQTkgkIYQFCEHlEZon7Ndo4uIVVtMN/jMmOEEMIbdK8U T5fdpOcAz84e53/XVP5L2FDzwSyFQcmxhAHgr6ldK/nsDricmGK2MCapF4SRww1u sDlzUWv4jc+93OCVBojc+EqgaY0aHuD4NRdrabAiz3glMAjOt6coNXSC3WdXSpyc tzV/svKMG3lsN3RaEFvaG2Vm/ocdG3BMay1lwqTxV+AlRM/oQTVw9YzLOyELGyFy MQCqJqfYE+yue8/7yE9UDXIH7xi7Tl5hGP/RWcTDb1fVmcdyvKBgfezEw3Q== 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 4d9483v5q0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:28:54 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-2c0ba59a830so1044474eec.0 for ; Thu, 02 Apr 2026 02:28:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122134; x=1775726934; 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=OZaEG6ZKcedfi4AQS4ZSrWco9P0mCBULI4k4ihcHhYs=; b=dBocttn3H+7UBtBtReIZscSv1LYgnyrwmuFeeLXBLsAwlgPAGxZ/BApHpfDMQe01p+ IXXKsXXo7lpQsT1R573cmH/9boFFDL9tNYMeku5QBR49PTFsW513o/EyWyFK995u/87s aFwzDQXDCubliC10ukj7xzKYV05WzL33iMQnknxReCI2W7iM6MvqoQl+Xi3V7HX0krkz O2OboBsWzUNrR6ZtXHYSD7FsxAxznPFccsdkL08xy30gW4Jo4fE0AhM71ie3xmjlo8Fg /DC6wvJundDigQW2zINZteynrQj0QeU3fk4u01o5NB3EZAmmE9plYJLqkAHnQwbtiBkj voFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122134; x=1775726934; 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=OZaEG6ZKcedfi4AQS4ZSrWco9P0mCBULI4k4ihcHhYs=; b=LNp3k/nDAJDbsTwRGnj6ZguSIapgEnuupCs8AmxeRqS24akeYzdYJsqkKkO1HAOapU +fPJ/2sXiMaVJAlXppWkGwSMbegNFUhgIMT/j/M5S/7rf/jns/ZT3kNGLnhRQUtHcPIe IyFT3JX1N4OxH592QlNnt2IVyn+HdCZ76pIddWZsXf9+TVh+BdSx28aGZ4lJNgcw7kha 5hsbEaMafb+Od3tVmTuPk9L+LT4l931edbGSWbU+DZD3dKW3ghw22AVEhB5JgKvNIVq6 mhCFzdjSKLcGxROVt9kNy1/DrxVKGbKGrBFIltWJ5HreaDb44rzdVGdqEtYONRiYV/iQ 5qHw== X-Forwarded-Encrypted: i=1; AJvYcCVLizFhSzsNbxG5Lez7QLcJQCbzW81xuVVqH/jONq4MOYj9bGZ9+sI7mw40voEnIcjNP47iBCc4SKqzIaU=@vger.kernel.org X-Gm-Message-State: AOJu0YxL9BGV6nrvZRW4m1r3FC3DuwEpTlq7f7e6/PmUa5EFHfqzCqq1 Wgm+pFiAPym7r1pJSNly74I0ucXfJacKyUULb7uwQBvkdK/Fcz+XmyQrjPl1FFkqdsPh1DXK5g7 n/zuBHKyfrpQvZ44tQBnhGCoB2TvP/HEm7pqmfeuD8bfxJfGZVsVFpggJWjdWw1T5l1o= X-Gm-Gg: ATEYQzxLuJI2G+BWSO5jOPOAbLBjUuVqlcKKL13vsBaOMAlimMO/pmYoOwR1key7GZj VCObrOdsDxOGB7X2264txsjnoAFQRdgCEYcdpRK9B4xavyH0PExCaj4ythmr3DqUKCvAEYU62lL jU8Z5ZxVSPNkZ/1CsC/iU/4H8s+60+2BqgzZg2lo1JTda4lE7lLvshdvUZ+c2cMaPLpq1iX29D0 qh2+mjOl98+YJgNUJdYKZOTiscvsNRcQg6n+FSiNIYfL3gQD4HgEsnlITcMJuhUJFaODbU8Ur+v OpHWfkBzBwc6VNYm0M+PRDC6TSF/l6CBOaDk+ZwpwgttCOF99hsGW0BBZPEM6DdxrMOFgBQFA26 xNkSjZ4i8QOv7GRiSGRNtLLXzGrxAaYuIURKyPorDCkFZqCLRLVax2BR5xWxzuwS4kjSde0i7pV If X-Received: by 2002:a05:7300:aa8c:b0:2c7:31b2:44ad with SMTP id 5a478bee46e88-2c9331af315mr3531649eec.31.1775122134049; Thu, 02 Apr 2026 02:28:54 -0700 (PDT) X-Received: by 2002:a05:7300:aa8c:b0:2c7:31b2:44ad with SMTP id 5a478bee46e88-2c9331af315mr3531634eec.31.1775122133456; Thu, 02 Apr 2026 02:28:53 -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-2cafd073194sm951094eec.28.2026.04.02.02.28.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:28:52 -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 v13 2/7] qcom-tgu: Add TGU driver Date: Thu, 2 Apr 2026 02:28:33 -0700 Message-Id: <20260402092838.341295-3-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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=RYydyltv c=1 sm=1 tr=0 ts=69ce36d6 cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=h99DN6MNysFgGb7_OMAA:9 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfX+eUC0B6vRIk3 BhvMTaOtSSubW6hT0dNqQLbrgdercxJ9nTSOggO3Cal3Pzjx73tUyypD41zstu+Ree7bPF/Bg8X iPmCm4rEft2B8uCNVQKGYK/KkK4h1YaGrwkQ0RGsBjK+KP99g78FjZek+4p7RSgCWckQv/7Yq+s lcSHMhHeI8MNsc3yWsr78fMsCA8znioL0sej3pW8CT2CxLMlUnf9P6LxuUuo/dc8+Zer41POAIL sT1a20+2wrkNqw0y0DmbSkfSCNQnCzZHceJlbDmZavihwa/KAPe0Xq9sbN6AySqnwPtCG1qYbRR ImFRPGiF+BbeQojCEAG4O5Pz6qzTKL8oecsQk6/qvGe/OHV0eduTvuDiPAUvT+twy1NMJ9WXLxs NKH1UOetETbGOZxNPeF4nUjI1RaYvA917ji/KU1MzN2I4RxJRvUq03fo5qvGiqUF8i9HKrjAUz9 fkTR2mqNmpxf2XyPxzA== X-Proofpoint-ORIG-GUID: HW0VBHvl4yFJibEpd8Rhn-gwp29V9zwE X-Proofpoint-GUID: HW0VBHvl4yFJibEpd8Rhn-gwp29V9zwE 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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 --- .../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 | 193 ++++++++++++++++++ drivers/hwtracing/qcom/tgu.h | 51 +++++ 7 files changed, 277 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..f877a00fcaa5 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu @@ -0,0 +1,9 @@ +What: /sys/bus/amba/devices//enable_tgu +Date: April 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..49c8f710b931 --- /dev/null +++ b/drivers/hwtracing/qcom/tgu.c @@ -0,0 +1,193 @@ +// 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); + drvdata->enabled =3D true; + + tgu_write_all_hw_regs(drvdata); + + 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) +{ + struct tgu_drvdata *drvdata =3D dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret || val > 1) + return -EINVAL; + + if (val) { + scoped_guard(spinlock, &drvdata->lock) { + if (drvdata->enabled) + return -EBUSY; + } + + 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 { + scoped_guard(spinlock, &drvdata->lock) { + if (!drvdata->enabled) + return -EINVAL; + } + + 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:03:54 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 4E68F3939BC for ; Thu, 2 Apr 2026 09:28:58 +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=1775122150; cv=none; b=X9cTezprGUGEz74jR/0uAPmUi+n7tia+A7mSuy1Cl6pxR5bvqv+q5p/Wptr5IX35ZVFHU5yV/o/AEoUP9W8zuK27r3Y8Uw7iKd+UXA2W9xsEDF65URZi9rfzjFF3Lsv0klceg6q+uhShcPAubQ9UZEsRYn1HNs0ZpIoIAjTBfjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122150; c=relaxed/simple; bh=KD2SAb+e/uR9Eh1XQv7DCatmmMJC41e6moFGXruPCUc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ajoa6OsrmITR9xvMQ/0vTUyXazTfUGe51kjIWWID2rQ/5HonHDIMY3gwqmGDsX+nGHTVkWAT92pDBD5Rs3n9ZU4rA3wgBMhC2qwz+4MRb5y/ScBiVspyT7AhrOew6Z4644MaOMtW8Mt/UCBXkgM1GqCtBIXmrgPp8qHkFaOEjqg= 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=heN/qHIu; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=HkgqKi1p; 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="heN/qHIu"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="HkgqKi1p" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6327HGTC3044207 for ; Thu, 2 Apr 2026 09:28:57 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=JaqwCZj9Swd 1fACkPdCTJ6dqBbgsrSueBbaArya7FU0=; b=heN/qHIu8eeix4FqEWOXLuyOGtH XWZhZO+z3dyCo10V8CYoy0pPr9qG7m6Gbxv7101PWCnhKOEOpOjgS9nBTCWVr7KE j8yG5MpwGHsQRE8+J/9EhgvtX5QU6E4PPe4h0rpAyOVBYRuGNd9BcgMo8NZZ5wxH i8YFTyK1AyIUvZZpvNsooQ9X0CmtGkJongJVofrMIKCFl5uXRilPKYTMy8YGgQWL aUDq9svw0AyA74uTETaRIPwxnvFBAmtJPWPx68+JEj9bhCEBHSbX3bf/XDNBxU8N tFenk8KGaRPLxjnC3tQr+rlC7UkuM1iRkO1My0PNbKMVdaOu3DZmD9///1A== 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 4d9483v5qe-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:28:57 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-2ba8013a9e3so816729eec.0 for ; Thu, 02 Apr 2026 02:28:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122137; x=1775726937; 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=JaqwCZj9Swd1fACkPdCTJ6dqBbgsrSueBbaArya7FU0=; b=HkgqKi1pKj9EaLSNiMTOcC33AHmGAeAZIvQcqwHU7Lb+PPcZpVlJbrhRvIM+8kAnVF ihhg+zp8U5swDNEIX3bQOxb5ylr+HahmOrNO5uepLYPeu2rpi5ldoq788K+jZLToRF5f qIoJZfisVHfu/xSJcVjF+vVzESo1mc7vocP7bq8dCbi2oMpqdeacYJ7wMJZKM4G2bafL VGnntnR4W9dpFJVdDAElxUovirHndSgwIiiBOeXRBeldPY5a2m5J9HCDd/AuglFd0Jgp JGFAG/SF3U2MiUU52XpCJYbIeuttBxtnaAbw19mKJj778Ghyzyj5JGv5ddfmPVU2AsBi GVdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122137; x=1775726937; 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=JaqwCZj9Swd1fACkPdCTJ6dqBbgsrSueBbaArya7FU0=; b=ISx5g3IlQparc3TUIJxkabeZD7jkZBGSg6kjMfXR3k96PDvk+nuQ9gVcoo8vCLOa4A GaosMhYZwcemPryUNmzMiuVyBD4GEKsENGApNMLdb7o/xC5JIHep/xzfnebEIU3tREDl umCME6OkMyJZ/a3eptX3Gm3lirMc25HKT5jrhER/vYXyKgkH9YKlEFu6qJ0+DNv8/Nb5 i0d4+xejm0ojHGcURcJ9Q60utaL7B6fC7DqMDF/FHFL5P96joTU8Ih28pZFVIs1jBmZ1 4W5Ptn92e69uJCmjUHODks1cSy2+LpgSPYr1jywl4Y8Y7yUDVWsJtV3qs72v39y6xf28 ZUUA== X-Forwarded-Encrypted: i=1; AJvYcCXIORpnirEC3CnKS7sHA8F0JsW8Gp1qDw0FGWDzlCwZ6UM/ecXH5VvaJVm4qFRTs4ij0iI+Da0FTxAZvD0=@vger.kernel.org X-Gm-Message-State: AOJu0YyYX8pCS85RT+XfKqQXssiy2RNaNP3issrePLpg5hqrP8jKopYS m6DyTKLJyMlBCd4KprFvw4BX3/1E3mNukMy1MJBe9S8UFDJkMtltpLjJXXMIxQ8C/vunWRtJwGt Po7E4BiykGsMRj0cGjekTeMESwuShVcdg7C94LeL+xa0870gliu91/LHh0Z4fb3RcqLs= X-Gm-Gg: ATEYQzzrJMZius4cDmATk10s4jrwiF/rxi73qFEkbX8O7EWRXQ/mGHzK58qtQA/afsu vO2RDOL/UloPnRrZjnX9Pkl8ryV3TL7MROH2Ki3LQ6AqD+e3uddfUowRX/B2LyuMbeKs01Z27CQ zll7GRanCK3O/0hB2pkI0aRrCXRCYD8yWEs2fHIcdDDXpSPpY0FH9SCmTdhv5ssjqQ1bYFmpRGG WT+JlyfHa46+nScjZJR2+5Ju1mWAKsxj/osvvq92DLFxFIZnt5x8dOe0Z6XdrzKYfOoRIsGCzWg sV1yGqXk41ykJb1MnGd4AK5oaPMMx6eXR314+vq9DOSJaUK84jOBnL22++VFp0NLo4KFj8kA4Kt BeOlWkdrVWusX8xG6e8P9v5jXORlczmR2oQx5UGEvV4zRjCtL5wbeua+Uh8y7hhV1Sb3P5hhMys 4a X-Received: by 2002:a05:7300:2213:b0:2c4:c4ef:48f7 with SMTP id 5a478bee46e88-2c931170de3mr3477762eec.11.1775122136607; Thu, 02 Apr 2026 02:28:56 -0700 (PDT) X-Received: by 2002:a05:7300:2213:b0:2c4:c4ef:48f7 with SMTP id 5a478bee46e88-2c931170de3mr3477745eec.11.1775122135995; Thu, 02 Apr 2026 02:28:55 -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-2cafd073194sm951094eec.28.2026.04.02.02.28.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:28:55 -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, Jie Gan Subject: [PATCH v13 3/7] qcom-tgu: Add signal priority support Date: Thu, 2 Apr 2026 02:28:34 -0700 Message-Id: <20260402092838.341295-4-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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=RYydyltv c=1 sm=1 tr=0 ts=69ce36d9 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=aHbVEu0FunmFpxPyS6YA:9 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfX0gBOVeaXb/12 4GnhepPLiDw4c9ETId+VrDOGvtkc6yPZYmtFFEAOrPXX2+k47NULwOIinao2LuTrq0AWreCf2cN XxDF4A/18+33ZZ9Mz7kb0lDp4gIO1PCiBltvrmjMd0K9di0m2Q/7dvJOziGRyIxnTQickPLYfdd eQY5ycJdmeFa4q55HzZgPf9yEUS1XfcveoRkpbURKcYO8SMkdr9eY1NNrm+Ju4+3AtBw43YS9pK lxxNCkb/puW7enuZtzkOUMr8tbwRZt4825q3aVsg0K2kmYL3MzKJyS2QkjKy0q56TsCmtztvp0U HxOrOr+WN8r1bwENFUqRu+j6o8T5eg2M4HNWPBiQdH34BwnKuHTh1895MGCtEk2mM3o+hYgoPRa nKt/4mfttCkB9iRlkpiS1N/WZPCVij2mZT7yQ4nWMiJ3ZCBvOkJON4HZ+ahddm05mLitGK7wIbj Pmu87KI6bWEcQyjb3pw== X-Proofpoint-ORIG-GUID: QMUnTFEoWkzIBGaxeyhUOMHXs2fU1QzC X-Proofpoint-GUID: QMUnTFEoWkzIBGaxeyhUOMHXs2fU1QzC 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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. Reviewed-by: Jie Gan Signed-off-by: Songwei Chai --- .../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 f877a00fcaa5..223873789ca6 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: April 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 49c8f710b931..7d69986c3e3d 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); @@ -121,6 +230,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 @@ -128,6 +269,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); @@ -143,12 +286,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:03:54 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 D78D039099A for ; Thu, 2 Apr 2026 09:29:01 +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=1775122154; cv=none; b=LifL3VSHLo1GfyNpV0dRJjj3UrQU1buZDJyzhn7rDK54UmGR/9BIIsc2OYivhiHQG2ze9R69TvocA5H3HexornxbBw58GaXt9Q2rk1QXznYjKuCoPySbv60cLlw4j48fI3aSELUjwBmdwMchh8E6hERiY7PyIqXe+LqsR1yVN7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122154; c=relaxed/simple; bh=6EUcjJijW8rc8wh1RTKjvOHrDb3PpQGNe3Cnrbfavd0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DiUZ516X/ql1ksbl6Mf6HuABiWg0YantkC99ArfdgvGXroroL3O5YJ07Aqkt1BJBVsZsnTVd+Vs0C7LsQns/ofwqvcAoHwJUB5a5JDuPaIvkH9mNAvvkYh1LhfqcLrrhsLmBI0rNYmMnOF2Ezujl95TtwG0GnvTGXhW1MRCFdO4= 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=X0gRTA2E; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=NJW+OV9c; 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="X0gRTA2E"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="NJW+OV9c" 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 6324R56V1551875 for ; Thu, 2 Apr 2026 09:28:59 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=HtBjObk+MAy Dwr/W5dHYl19JESzJDJMYoBzqhZZrP2Q=; b=X0gRTA2ERU/ddRIYjf470RuYVdA dRIOP7djbhU20Ms29/1ievcf+OCVmJwUYHMPZ1G2ATphHZvL5lnFkWk2t6Nfsva7 PMAITBBVMJSaaUZVk3fCOjE9YeBP1ZzjEuTaYYYcUC09xYboJs+k/JBq9G9GV05B ivhcxUiwSLBe+u1eeiRO3/pcH5XfMr+bwM+lZbnD+2tMiMfAiF8cfdiyRLXGV6kZ RqDJWoKHSu8v2rqV7mmIQGbNGwOp8xdQDwOQ5+7XQNNSHY06/mYYIqYBKrdKcVMp IgwANlBmd6HHI8PS+Hx4MhZJFwivQb0NH0grsQMH9Hngp4ej7rRIAxgTcFQ== 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 4d9hees7km-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:28:59 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-2c18175fc54so3541945eec.1 for ; Thu, 02 Apr 2026 02:28:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122139; x=1775726939; 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=HtBjObk+MAyDwr/W5dHYl19JESzJDJMYoBzqhZZrP2Q=; b=NJW+OV9c7l68vVXXw+Id4vyjywedHAG7EYYCr7LPAf9lHHwXi2tJeOgSq4p5U8TfM1 sEFOU4bRamtFdHOx7M12a9HfqLKa7JQEMzv7i5pPJEbuqcvzKcPCWikebaxnNuqj74Kf WCx+Hpr7FBMT+RQ5exzS2pPW2TerbOnSn/VF5a/w4wssBC7YZ0/eZcHQyaI5CfwtZDml OZac8eoENtIhtTV9gRfv/S6SUrLA2PssvDseMgehJcX6XeicEZ48epnC8jRzC3pONBNJ 9JcN+XyvM0nUdGlJ1/9LUfz4/sESFgI01O0sf8HuvCmInB4e+kOjYTVlXETXeYpdUWCi Hvsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122139; x=1775726939; 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=HtBjObk+MAyDwr/W5dHYl19JESzJDJMYoBzqhZZrP2Q=; b=WdSVXAz7CvMrIv5UNwj6JwcRlyP+mvNZqfw1IaISWX2QaTfaOFcvH7T4bOTiEEFvet NpjPTGTE8JEOALJgQEmUb5ZEHzQNx/Y55ej+onTOWc3xgNBwXI7o4SFwn6cKNY1nDQKh mbUEF0SvTUkSkdPmoDqvCkgvBF7yuIRK9Q4+T6GVyAJMoJo2+VM38RhOjXz5EkMOuOZ2 zZa2dEzIiT8N0IFX2dRzcev/ugOv/OfH9Qc7DP06hTsAbDlItY4YD08oxDueVEDIEwJn uUzv3J0zZb9L8QdqVN/ACEXS7hihO392pUw5HnUevFjqVPJ6pwOc6ews7Q5ciVYkEM9G WZaQ== X-Forwarded-Encrypted: i=1; AJvYcCWcRdE2U0j5L7AYE//S77dP2+NKI2ZtxgJavH/2mXHR3gFF/g1t/0LRO76jgD/iRTAmtvCpiKPskNglNDE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/2D57Kie3aQgZDfYbIR/PEtjeKo9JhvdtiZqD+fdRKM/x2W+D lhLbZca2NKpz5O//3dm8ettE79WmSlB9GpgAESzBNhO6Jc9yv7O0TrznQn0KCCsOrWoOCBXfiKh N2iGt4rcs6wdLGpgXJ7KsCQeGAHLwldzi15Yg7FdMxwYCx+34oGZa2rOIbzPt4WSOAq8= X-Gm-Gg: ATEYQzzE3C67EiKI8fKBMLex/cEBY4goULIXnXyDS4iGdQ5y5V+FUWSqcWLqTeZHR/J BhxmU3ayEF24DpuZXdoyls/1GzZqI5oCyYSG4aR5P7M5UJ7PigFpUMYbN3DywYlArXp88Q5pH39 goaGg0RRtdPeb4oKIdCp9w//Dp8giIqJARjyVIlUlniEP9uCZrFwvfnNgVWYdthDUBTmwN85ObE /elI+iu1TBZvukgeF15i7aIsSnMgNMTEviGb2LRMsUc2NvrXMzIjLXKjT+19OVmkaDe1Mh3ZI8z eicLf0flKm6i17a6R7o5v1xjkYyCUDyqyLm90hveE2DfnrGOCJlJN38DlOsSlUvXBMT/J82ZXmY RatpKhVaMRyBB7y/9HM+pSV3vGVxItu3srVFsEqVVIvkJMxwx2QRp2XR2rWN3DPRvW4Mo5TIfnt Vu X-Received: by 2002:a05:7300:d50c:b0:2c7:e3a8:2562 with SMTP id 5a478bee46e88-2c930c7640cmr3756949eec.4.1775122138842; Thu, 02 Apr 2026 02:28:58 -0700 (PDT) X-Received: by 2002:a05:7300:d50c:b0:2c7:e3a8:2562 with SMTP id 5a478bee46e88-2c930c7640cmr3756931eec.4.1775122138233; Thu, 02 Apr 2026 02:28: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-2cafd073194sm951094eec.28.2026.04.02.02.28.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:28: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, Jie Gan Subject: [PATCH v13 4/7] qcom-tgu: Add TGU decode support Date: Thu, 2 Apr 2026 02:28:35 -0700 Message-Id: <20260402092838.341295-5-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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: 64FsenqeTGJad0od3i-wNvlA39osFJjD X-Authority-Analysis: v=2.4 cv=VY36/Vp9 c=1 sm=1 tr=0 ts=69ce36db cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=p0PFFVR7nGJo5X-0Br8A:9 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-GUID: 64FsenqeTGJad0od3i-wNvlA39osFJjD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfX2hliw3P5J78M n/pCYk0j34a5huEpm6ZF93PHK1gwywr+NESgjK+/c3V8INcYtDX9wk8IoeTzfvwBkL6crCtA2S0 TYUFKR49cBDhVMdbKS3OkEzDXJqeRZZ/fbBFhy953kOJ2Fd8g5qojb2dOwJVeSj3ZKM216dT6rB lmDFcFypU5p5mlLPk/A2aTH9eRw7ANEUmGxOeqvsLD39xhWj3WNEjnj36JAPDyRBea3fi5bi40q haGHWB1MdVkvyiQdMt8NP3C/ce90/+DokTg6sk4AgEdSLDTqbwwH19PO2SL3EcYZiKq5v9IaYy2 15zZ1WZ0dkswho3d0QHQFgQlVya8tnIHRo4Hkz8Zj+Z990FxVFlovLDJyazwcWcjHhkIzmJnT6N f/g/V2URaCnssD3NWQfzejHuQ/3D6n3SAcIoGQvj7nfPY0glc41iM14LpyekoCuqd1ZEVRa9Gw5 RPzl+TSvaxdOJLO+g+Q== 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 spamscore=0 adultscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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. Reviewed-by: Jie Gan Signed-off-by: Songwei Chai --- .../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 223873789ca6..4ef0d696d3d0 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: April 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 7d69986c3e3d..5b37eb10f863 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,16 +217,26 @@ 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); - drvdata->enabled =3D true; =20 - tgu_write_all_hw_regs(drvdata); + 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) @@ -262,6 +358,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 @@ -269,8 +373,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); @@ -288,6 +392,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) { @@ -310,6 +415,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:03:54 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 C7EBF39182C for ; Thu, 2 Apr 2026 09:29: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=1775122157; cv=none; b=gII4aqDgeFs9VEkfi+jboI9GETUlo0NvijNWCkvWG/fUHDmoVySoAwvUP+rA9HnN0QE7p7O5RU4V4qfoRSn4w+wXB3V4k+crr/elYnG4GLce0W2BNzyHFiy1yJyOFBjah6LpqSq31o3pRQlEnc73DS0wTT6TiTtS1pRoJ1fNfng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122157; c=relaxed/simple; bh=zM1IM+N8PcbAaqyvnzjF8NUaAGzCr3+yL2dQodAku1Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eZzs8WD0XATgDBtTwKj6UpBN8cuCmec66YhZ1pH3hJxZO2FqA6u9ms6Wlkcf/Q3dDqhFQiZEPFBPPdvsUQaoLkgmlvKnZv2hJApCf0akkga9Xv/lF47uUgoGY6rNY7cPpHBhzSdXJZUI8WGEGq9/oanVgy0Z7XJXnW8wVaGeMRc= 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=Ltv7CY98; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WqTPOO/G; 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="Ltv7CY98"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WqTPOO/G" 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 6324Qh2t1551221 for ; Thu, 2 Apr 2026 09:29:02 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=H3ohFTGXI3E m1WV/owX09SmkHTBw1bejtZk7T2akX+I=; b=Ltv7CY98ZVPGdW6o0oUAKLo7EVp 8LyU1nCPRvera+Nsfboxq7qYJWAEFiHzZO2lgtEqmmu1SAywMzZkFBz4eaqsbEam orcEeeEt4gr2lPIyTrRb1cLpUPicNEXC48y/MMGu5uCi+gFqhY8xUkiXjGmuY5xi 1cZZ3RqgeEGjca/ps0buHq3mPiVTKxstveOtAYBWTs+jov4eVwBRg91bK4wExn5r JcwQ0p+5JDiD31xbWZ7kZGDqbhOVOuDXwDneYmVxFwBJtOdZi/YnXsR0w3IuTjpN xaFc8aB5dO5XD/ON71fT8iav8jG0/3uJcvJk+4cLTI3iwx8C1mk0q2UyqaQ== 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 4d9hees7ks-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:29:01 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-2c7130f88e3so5593610eec.0 for ; Thu, 02 Apr 2026 02:29:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122141; x=1775726941; 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=H3ohFTGXI3Em1WV/owX09SmkHTBw1bejtZk7T2akX+I=; b=WqTPOO/Gx0VElwXTC3nr0LoPIqx7foUBTV5vNgueiYDr2nf7z+fsodrwFyK6r641Wz As7tP6WzQyQ2l9Fd/wP8V2XjZLk/fJplljUod0LNDqDLkEFx1Ptg2V+nGeB+/weExF9h AKi5n1SoqJgFDxRACU81PGitJWP8cOiH9bxYm2it/RzIaDUgZtTFCwWmv5s3oKGj0Bye JKqfUiyOoj8p0jTtsEus0ilSp8WK/Wr/7DEBN2ArqN+tT66JzAR4BaIFMZ8QF8tYFmFV cU/bgVS7CsfXigFliwANHv0SZel1Ae2M1Cacfdmv0dSe5KoBxGkiKLFryR24F6T7jRtB 2ZIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122141; x=1775726941; 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=H3ohFTGXI3Em1WV/owX09SmkHTBw1bejtZk7T2akX+I=; b=jxlUPErcDS/izFf0iSyQe6bF269P06660zT1iufz/pH13LAVghO0VQnaikNL8UySd+ +bOJqtWJJzEqtXPgZbcEbp1Izr//lzU2aRbZT1giRTzwij6DjAJ1BtYj0vj6uE7RX+Z2 H6O6Jho6xp9gZONELPvhHIAhLUoqwqIyjEyds9iFcZ337r9oMQthi9Dbd/wRXQ+eTPL0 yDHXsXGLM+pvsg2oEf7nIdO3nt5M1dodgpkD0ayvQ8uRpYnl6vAXrxKei8jCbQdf94cF drStiisnWKcPCsc3Q32ISkIVvshQU1MkXdXd0hZ3gHv0YqYwlPy6+k73ezqgRdM1RC0x siCw== X-Forwarded-Encrypted: i=1; AJvYcCUO9tP7oSnm+CmChWY5DvKItjQw2Aqtg9SDkL+RWgxh7EPPV6y4NewP7BJx5UbhAd7BFvO1nJ9Ew6K4nGg=@vger.kernel.org X-Gm-Message-State: AOJu0Yz/L2wuNVrCUMgOm0RxyZTSRTz2cYlJ6M3MnuWovaciNQ5NDCfU 1io20MQKNpkJS7KPospYVGWl6RQtCupjYcmCoqPmaW+zqH1tT+EwFsX16nDnU1wyrgJFyiIWR/d 5w6iL2Fi+5YNl0qGtsoXTx6k4/kZkiEL2fg7i7kAQ5Ee/AAoS8XPPtzqt6WspTKYSd8E= X-Gm-Gg: ATEYQzzIFc61W9ZN74jo7Kr5hkwukyWdvXrgbMIgNtAD95Dsq8VShBzSyYa3zP22IBo 3HUoyB8YaRr2XKDXu40LBaSGi4K+Bws2iVHvdUJ7bbZdtdq3jkWB/+BmP1jp0VYaHQ2ZixgDxYQ /uWzpjhrpOqfZ7nikqKm3DRqusBSLBrmjmeibtm5KXtFJ/6o04XzRLtNiW68mOkLmbeJj65UZ5X NehVBIA8ByA03svC6t9N/tYNlCEuzljw9zBuiknuKzyyNG3Bct0OIEo5Pd8nUN2u/n9cF0eRcKT g7yybnF8N6k40ZJu8fVE7nCfU554sipXSEI/2/saZL8N5QKmKL0QWJwUV90HHQ3/7yTJmRhNbDX Xem5hpuVx0TSQzVyIPuzVOWRLheNJrqWAffaaKn/jQ/bv+GrvEYb+SuClkq4PR74l2MeLrovwtw lv X-Received: by 2002:a05:693c:2b16:b0:2c5:60d0:7031 with SMTP id 5a478bee46e88-2c930798b89mr4003033eec.4.1775122141043; Thu, 02 Apr 2026 02:29:01 -0700 (PDT) X-Received: by 2002:a05:693c:2b16:b0:2c5:60d0:7031 with SMTP id 5a478bee46e88-2c930798b89mr4003017eec.4.1775122140493; Thu, 02 Apr 2026 02:29:00 -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-2cafd073194sm951094eec.28.2026.04.02.02.28.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:29: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, Jie Gan Subject: [PATCH v13 5/7] qcom-tgu: Add support to configure next action Date: Thu, 2 Apr 2026 02:28:36 -0700 Message-Id: <20260402092838.341295-6-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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: ICYgdBg8l4h_kVPisRuAC22_O-QLgK7y X-Authority-Analysis: v=2.4 cv=VY36/Vp9 c=1 sm=1 tr=0 ts=69ce36dd cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=s623Ih-0px1LxcEVn60A:9 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-GUID: ICYgdBg8l4h_kVPisRuAC22_O-QLgK7y X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfXwQu8Ga/SCJPA jQuUuuWiMDUZ6MKnsj2e+sydczMBJGsGbT8MTDLCweKP0SkWBEcjBCUl8cSdd8mUur5Utr/QA2/ c418kDfxAeocBnwtGSrqjJSXFIdbEGpJtc4ggC6M0tyPSSz2qhqF5K3VKqyUisWeicL9ju+7Zxk DU+v+aRu3qLqWLAPFJmo4jfBMPHfWBXUAgnGfRUgf9dJI1u+UWft1zzTNrHumX+x8kZ/wo6dBBa L2WaSPp54HGPMY8TulDX/bCgEQB9Qf55wrZrX8yH0K74T1e6B5OK3z4KeeNwb9EkWMpieTRyYSb BNBvH3PjEe9IywlT6FhIyK90mdbyAsOKd+ovuP6Bz/Yhfj/IK9lXkVtbseomu/P8KebswGF6e+l eTvacgyfH2CKqTvseHGx8K0JvDagbclfmfO+4hotdjZpljqtld7TsWgSLTeHQowV3rbl7JF6F8V lY48khCbu2hMBvcFUgg== 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 spamscore=0 adultscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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. Reviewed-by: Jie Gan Signed-off-by: Songwei Chai --- .../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 4ef0d696d3d0..786cb852bbe5 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: April 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 5b37eb10f863..4112e6a691d6 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) @@ -366,6 +397,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 @@ -373,8 +412,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); @@ -425,6 +464,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:03:54 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 076563AD51E for ; Thu, 2 Apr 2026 09:29: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=1775122159; cv=none; b=nfCaMs9LO31PXIHlL+uY+HUeRBYJrCRqCCDO10vOKXPnjwyMqzra3+v7MgyouanEqApLR6nFY6eRIvkWp9rAhh87eydwx8bY6ONMfX1pxSdPQNuG5vFzNplqqVdunsfDYbHAeI0i1F5aIzLyr8I9lL9GXY9Xw1kmJDZLcGlehns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122159; c=relaxed/simple; bh=gTJ3BSIWefWpBZI5MS87NJlAdy1vxwKR+pYRK//MukQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sGx4I6XkJAqxF9/Ku6L2U6t6Hph00JjhMju0wDGeYl8EscAZoF+Cdb7BSre15O6+LN8y5PXPMxcDTXcwaMF9NQAB1Bv6WalJud9sdvtfY7vf6UFL577rBv+1l/qJvZMWOjfv94SygvZnv4WJ84XJXmWJjbjmleoo2eif2AkzSCU= 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=cJz+60Jf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=aAn1Obpx; 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="cJz+60Jf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="aAn1Obpx" 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 63271jcQ1964880 for ; Thu, 2 Apr 2026 09:29:04 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=q6lXtThucKH ybuyqUpEZZzVjYFazBqw0iAinXPxQP+o=; b=cJz+60JfWMxPVbjToEGZIwX2DaK tYq88uGFJlbp9K2IJ8hY7K18Ag2NbZgS/Y5YAGgN5jFc2z8KmHke8sxaU8Gsvr48 /S9zCXStbL8WXt0gfvIvpFvJJXCn8mWhcky0dxucRgbAifqTdtjKYHqSn6sd6FLx 2MmFRt0sjuwy8X/cM48vc+t1/T0VQFXMAv5F9H0WJwOTTIQFtdbsQWfUWHKB58pf SnfJMYYsCkSeOLKRTsvrvMVpPr1XCm/9czbw+zgbiwoZgMJd+6+qokTcMvMRRWhA BWBM7qcoNbiUkrAibVsOmqBISUCV0sApB+a9hAEqSoHSaPhFQFpOiTodH5Q== 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 4d9b9h2d9b-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:29:04 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-2c7130f88e3so5593783eec.0 for ; Thu, 02 Apr 2026 02:29:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122143; x=1775726943; 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=q6lXtThucKHybuyqUpEZZzVjYFazBqw0iAinXPxQP+o=; b=aAn1ObpxSH3I78hM89L6zSSzSQGEv5kFRXDZFHPk9DDlpZIXdzRvMgLpz339BjXJ5F VqFYzFaH6FvMQ7wYexSUbJRt6ZwyKOCEsOjNY0+0moW3Bqngwa/queOwtPAA5AvEDJFU offE/AoOovz1GqlBSPqApuTFBdULghCFO0yrSlRGDy0BfIlCcdK0kG+Ikoi8BpH68+7R q1E7OOpL/GRpiej7lQU5zneOHu5pe5xFi5zlMQtsW2QaozJ08AWmHlhT/oZeDDlZeDVb 79t5WykDz/AUh2iseNJpBmBhif7HNJcAiDONnFEG8hsRrfsP6JPkeJTRW3PZHXr1vh01 vBfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122143; x=1775726943; 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=q6lXtThucKHybuyqUpEZZzVjYFazBqw0iAinXPxQP+o=; b=Y15uhJVghugUuioSuSbVqi+9Rh6iLbiSJwh23fK0NBncK/VqsAPk0I2kiSWLPZmvfM Tg6MKjRENaTU56pb6KldFrAFdLrg60u5NH+8i52x5u9x10uAa3Mfz67SyTZSQysW0+HD h+9+46h/4CYzcGRU8MlFZtotpZLpAYPzj4QJIIKjOFd8gX79FUY3tvfIrxt/hwmwqQ5o xmRu89NY/NfdZMO36pOg7cyoPZxmUTeD6xCMSQTgk+lyrVnoUXHT6hF21NaJrC7BuvO2 TDTlVr8wIWxleWtdYSbrPa/2fxeVP1UXzPb0WTPCnG8AEm/hCQu+iRjqMfMtnFcs/he2 rnZQ== X-Forwarded-Encrypted: i=1; AJvYcCU2DuFsKfxZI24p/EuhqpWKftnMAcK5FF1iioKozRaYm7ntncxwapRkOhPVDWO2tWqMGRMxYYuuyEkr5e0=@vger.kernel.org X-Gm-Message-State: AOJu0YzubGW9BrFj8YVSXLdubJFATY/AGH2PjLv19F4AlV2C9OzxEa/m YIrkvx9iADL+VeLXYrN03opmL58pV3TG/BRJYPxAnMAtjcgJox6/pehaNTRHNUva9Z4VKcmLV/E oTqgpSwu0CkQEZY0/jF6h/aVgyLIskUY9+xSuciLRHb5nwKIwJXCjEtWdxkEcjOJv9Y0= X-Gm-Gg: ATEYQzwzS/4TtyFf1y+qZstgYSLb9Zf0pNlBLjSDjETrLvlxNgyEvNC0yum6txMGXEv ju+TAoJ9YCqF/E+9yWlVYR4hqeX7saxRgVEnmgwZO87hNa9SgdClmWhKPN1XYIk2cNLQPXOxAg9 sSHRKt5Gk62NaH1uCrbAptDw0Ik/wE4XXhPPN2NU9y97geoDB4dBP5rZvQD4isTUpErVlGpvon5 D3cC7CNXWmQCJEuF7bpmtFi8wPhbmFy+dh4PZ3jkKoTlX9DZWLQiz5ZlzPr6QnewwZthbK0sfir uLp309c12yWx7e2jAKWPMPex3jjz8UrUb6LsPUM3BffK5XxySC2k5XDq9pEh1eUMa17zaJXHVS4 N3ikKShmYS01A35lmXhJUNbUL/jSSEpQa+1XPXYgAguxIW5P76wqb+2qMeHxxhm5Z/SHqXr053C Uw X-Received: by 2002:a05:7300:cc12:b0:2c6:31f0:a018 with SMTP id 5a478bee46e88-2c9328a5ff7mr4026799eec.22.1775122143287; Thu, 02 Apr 2026 02:29:03 -0700 (PDT) X-Received: by 2002:a05:7300:cc12:b0:2c6:31f0:a018 with SMTP id 5a478bee46e88-2c9328a5ff7mr4026784eec.22.1775122142688; Thu, 02 Apr 2026 02:29:02 -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-2cafd073194sm951094eec.28.2026.04.02.02.29.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:29:02 -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, Jie Gan Subject: [PATCH v13 6/7] qcom-tgu: Add timer/counter functionality for TGU Date: Thu, 2 Apr 2026 02:28:37 -0700 Message-Id: <20260402092838.341295-7-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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=TqLrRTXh c=1 sm=1 tr=0 ts=69ce36e0 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=eGDQztGCVwpQsGOtWZEA:9 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-ORIG-GUID: asSyzAReOJJKfNErMfzpboh1PLBT2cwG X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfX0QD87gScjO6M AO5B9JclqjR7RkbL5hktwelcmSc12bI5s6XBnRnzQl1kxicefuOMRsSpM+kk3+Q0H/HdAXboXd4 +jXFDsthHAjtSHWLDlPB29jNVmZ35PxhTL+il07nDAdF1DyTx7J9YGmjtq5MRI6gTU4rNpNhYkI 7LAhA0XDqWFq90Rq9asLqWuX/5zmXRlL+hArV5CaVxaSq6GC+h8eiKhEEsfsw+Q6JZOXFK3++pS ANLqnOtzZBfSqgS+YgrtzN+w/v137C6rdmD+ixtxVuIRV/zjzZohYJfMqhHPkzOW9QvWy+F9bWt ekHusHHguDRS/L8TNk7VJhNCh+Fm6vFywlOvFQHRZME36d23UVVXAArZKq4q8Mk1PgttuTYtNi0 jnRxAlKWCIOp1eJZpdsubka/+0xzZQcMj4NDm1vliaXQlE8Stu9jzWxyYBOn1qm61ORG22DCXBV iO2yacGQF7eqvPPwNIg== X-Proofpoint-GUID: asSyzAReOJJKfNErMfzpboh1PLBT2cwG 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 spamscore=0 adultscore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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. Reviewed-by: Jie Gan Signed-off-by: Songwei Chai --- .../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 786cb852bbe5..7a3573e03e27 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: April 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: April 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 4112e6a691d6..4a529520b428 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); @@ -405,6 +480,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 @@ -412,8 +503,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); @@ -432,6 +523,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) { @@ -474,6 +566,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:03:54 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 10C1D3AB266 for ; Thu, 2 Apr 2026 09:29:07 +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=1775122160; cv=none; b=UKWFX9aCAGF6ZKlR0Qtcg55dympU2hGCWw2B6TYuPiQDOAQpwtYIq2KWxcyD1hwCSfq4KwgXtpqN0AJc3Vm8ap358lYnHrozqUXxGJZuTeWlrthPnehPHVS3m6ixx36arqAa8qMY3wMfq0FHOk2P4xwUy94SYSS0xoz1badkMsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775122160; c=relaxed/simple; bh=u0RTqoRtgeoqSCDkkz0FRCIn6kIQxtQe29l0ZLG4Yrg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=i/1IHzPUwz4iweT/nz+9l/JYs0Gw7o0qxsqmzFbMG0Ow2YXPVtFrR4lOtgAmFqAUe6pLvgH5THA4HvvB3DnvzBPXiYbg1F9O9AvPUJBU0l63dWn3WYMYQFF6qm4hcQNo4bHwQes2iAsqL8rgOcslRQOhdEZTrU3u6rYgWo2L7BY= 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=BLfps5bP; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IgdCm6Jl; 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="BLfps5bP"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IgdCm6Jl" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6326wrdK3044204 for ; Thu, 2 Apr 2026 09:29:06 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=4N7tIyw5iZL vzZnTOYoRHg1O5/XCBmsdPAKZlPxWO8A=; b=BLfps5bPumsutZTffiFBEqxm7TM UUcYeFGb/mzApNeLNCxDFtFi92twZx5gtyZ94VRfxwI5NFcORfdDvuf814YwUrgU v3DaVxR/6fORK7k8sr1lDYtXFI9F1o7knrLB8IaEL7Tv8gAZF6Cl12f1u1+vsSnX M+uDsQJIr8nWYN1RoJzgXrs78QIL/TiQKrjza+VEtQir9rSk0GljwgsxyqoYH5y1 gbaZNbcAvtm4odW4glYdMRjP4hGxQDhY83/jkN+J6B/nwLdX3eX9duEIAn8AB/MQ GTcbFwLPOH6DeTSb6kSAkZLGS/4z3yHDmoTbZTm9iRavS/+dr/y6ijvz6XQ== 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 4d9483v5re-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 02 Apr 2026 09:29:06 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-2bda35eab74so645614eec.0 for ; Thu, 02 Apr 2026 02:29:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775122145; x=1775726945; 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=4N7tIyw5iZLvzZnTOYoRHg1O5/XCBmsdPAKZlPxWO8A=; b=IgdCm6Jl9ULhsxXvn+cn3l6Yt1t2nrCfFVvAxxkKPHobh0Z7j34WiFh8PbBgWKdVrx +pQzGZAwFJ6vCeNbQnjBXQkiyem6/pEvuthoUS95WVuf1SQ3uoFLmt3AqaWQri72JBJk H0bqKF2C0OId/Ccu9gmmARh73p+1ygH8rtcqYFr/2/iLOce9he1LxAI+UJWYC8eJlyCb 7fZCZsmv9YVBWObsr8v3bHF4Q9KME5dwspkvqlxxTFzzhBD0C63dMLzU97Qg+c53hgfw UxZVshYRaTtESHRb4bee4TOdpGZ2a4YL+r5nR16I9CzS2EbwJ9KYwHnQRqT/wYPhUYVm FlHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775122145; x=1775726945; 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=4N7tIyw5iZLvzZnTOYoRHg1O5/XCBmsdPAKZlPxWO8A=; b=FH1L3tWRYtX7Lh+2lHR2W+hP8kQDyfz+3Rnr/yt2OgP0hV1aw0rZQ7rgqKh7DdNaEy TAnIGy1N1mg5q4YvvN9cnMdgIAnDj3Hs/h0h9wMBDCZd/TKXYQH0bkajpzBO3ultuXZN PlxHa61YhH0pli/bRMBjSOK6b9bRDDPUDUJZ454Of7Xv3zfaqVQoQvyB0fZ/5rrYG6Et NLryt6d6AdI1hpcRF5D7PtlFfTPy0+bMg1kgFNfsoJq+CaMbJ49AQPEwmYfKV3TYKLu4 gu1Syb+6zrg+Q+wUK+Y93ESBWiwXVa06MRxCOSbDlahdTaqkAYOqyYmdMeA1r5JSSNaF /CTA== X-Forwarded-Encrypted: i=1; AJvYcCVrZyiK3Rgufv77d2Z4ITx4ERq9orvCQ7KC3AlLVUb2+sG5SHNNOzDAyVr2x/LAPFnO61Ai/Cl1gMuGX+M=@vger.kernel.org X-Gm-Message-State: AOJu0YzwyrudmyVUMePYMnivq4FRzB7kNFwkV92hXMXPMCPLbqGu0hvj 8J0Ka8LIMZOcrcYOgLfUk9E9WY7OjE90UgwtcBHSYZMlq7bXclg8QSdAeiTazVr8QuapWBS9IST 8hBWZWGW3DjutQKAtBlUVou2VmwHHHnBcous3vkABiCaCvVO6QoZHjiMAsyK2FAJdfX4= X-Gm-Gg: ATEYQzwKBCSkVP9K/V2LzTL5DFzAybeay/zA1Mm0OBPj2ivczWqkGVyhdypG5hixpCn zgtIm1R/rEl21odzBqjxTuIDfh1qfjy0yAeN8QLmjrvGwHj6ZOUeYVzeq15J129zVHVE7d2Sptk ZmqMATreSqBERzpi8czNqGvvtwneOPAL3JVofNd2+mWtJ+i29MGmgGiuSYpNcoGd+9Ku4PEel9+ TlAX+MCYYNzWUB/1P4thUz6TTy0S40GYuHT+T4kiPZK/iqkAkq8yZOS5yNBmYhqLZ/skj5a70uy oVwYplvB5CNtFX1tSsuV5RJXbvlOCW9dj5Io+D/fv80vSUAfxlN8A1E/hgzGbcb6AQjvuY1YCJV B/xCNbvOCegz6wZ7Q2F1ONUh2aHcU1OzHVLIj6ccvBW8fd3RC2ZDYTg7OYanj8YNQ5JT9T71ccQ gE X-Received: by 2002:a05:7301:1007:b0:2be:9c19:b34b with SMTP id 5a478bee46e88-2cad64be0femr685514eec.4.1775122145380; Thu, 02 Apr 2026 02:29:05 -0700 (PDT) X-Received: by 2002:a05:7301:1007:b0:2be:9c19:b34b with SMTP id 5a478bee46e88-2cad64be0femr685492eec.4.1775122144851; Thu, 02 Apr 2026 02:29:04 -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-2cafd073194sm951094eec.28.2026.04.02.02.29.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 02:29:04 -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 v13 7/7] qcom-tgu: Add reset node to initialize Date: Thu, 2 Apr 2026 02:28:38 -0700 Message-Id: <20260402092838.341295-8-songwei.chai@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260402092838.341295-1-songwei.chai@oss.qualcomm.com> References: <20260402092838.341295-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=RYydyltv c=1 sm=1 tr=0 ts=69ce36e2 cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=IgPCHI2mAnvcCQI4J_AA:9 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDA4NCBTYWx0ZWRfX5PBXrX90haQ9 a5ezXD+q7+RWhbhV9sYcTntFw37I6kGEwhfSHiM55KFkYzgoicId9UdSDce9qx/opyDyhmBxCFM 4AjG9gP/JQfpvoRZ+/ajXgDWxmBVuHKYfT4MO1+bjRNYUVmpA0ufd0GefHUTVgTQDd2Q+I5hy/G z8+cyF9PW1JnJNNiZH20SwP7vLkcn6P0jvjsYkqOtXhXyzd/g1Zop5gyAMfC0ufPI7eQb7JIbjp 93APcF9MWq1MsDHyTC5RK8dqmh0ZLWQMkEExy3mB03zfEniATXddIJymALkLtDWcQDinl5lZZUD ejhNOroe8PcIy3zkOJmWC/KXNl4Nbr3ZwZ9N5S3aekQ+qgGIcLsNq5ZnwkqSChp0yiedmMEA36s eD81OwmpnpXycNHzNiC9fXjpPc33D2SZ1e+G3mlHhZ2FfrlkmTKzC/eePVK07tSylzi8Tuo3oLV fvmC4aohyUxc0LoioQg== X-Proofpoint-ORIG-GUID: PneKmKlsAC7IA9w-I1dG1R4X-n7w2QM5 X-Proofpoint-GUID: PneKmKlsAC7IA9w-I1dG1R4X-n7w2QM5 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-04-02_01,2026-04-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604020084 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 --- .../ABI/testing/sysfs-bus-amba-devices-tgu | 7 ++ drivers/hwtracing/qcom/tgu.c | 74 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/Documen= tation/ABI/testing/sysfs-bus-amba-devices-tgu index 7a3573e03e27..a6b6019c8ef1 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: April 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 4a529520b428..752fcd2963e1 100644 --- a/drivers/hwtracing/qcom/tgu.c +++ b/drivers/hwtracing/qcom/tgu.c @@ -420,8 +420,82 @@ 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; + 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; + 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"); + + 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