From nobody Sun May 24 20:36:24 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 C35403E2755 for ; Thu, 21 May 2026 13:14:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779369279; cv=none; b=lj/Mp79uQr/LVsWcZ3ikWczZ/85iJXgLvHl+b7Zs4YkBP1XEvnK/OXOY7STwMdslPrS/1xZRQl2uYfvP7e/UyEcvZ8ZUw5x6TtSNuDXPHaLWmcKjMpO87yNv+0MGrT/EoSHOdKN5Qls33dzmFYC/apnihOSIOw6aMWlGl/CsHF4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779369279; c=relaxed/simple; bh=4XNB5JIGLjpANm8G9Mn+wCMnN2QbN2hJxUFucPulnHQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=QtnUxbVGKAcQ809PUWIf1wJiYs8P2U2OroAy3MPhDfFpQlcYQT9R2AXVioJjdqpIMAR3AQnD+tHx/85pELuJTJEBfLWbyJKAKDR7kdee+5UGn1d/GjoYM1alCm5UzsTMneLp+nelWChQlyGN/9ATxyZ0IE/ZyWpXUMnUZG3ORpU= 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=FOramGzm; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WM4wafmI; arc=none smtp.client-ip=205.220.180.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="FOramGzm"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WM4wafmI" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64L99p5t3343557 for ; Thu, 21 May 2026 13:14:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=wNjMyJsY5JJvxdt736Bz6x bi/GKfy2/4NcKpcMc4sZ0=; b=FOramGzm8tEJF1FaRPDHX4JXoU40OwD8mM2ltv p6xitA3UzPZtpgV0GW4uQFqameeOMlwJPrGEzYss/el2vWzGykuNUIhz/qBqaoLp L2AdZh2/UTAtHgpQmXF/uhrP8t9ExO7EY9KOUATY1bHOb91U0z2f1vQAyo8gCmRp cYbgeEFBgyxND9Y8NgWlyXYSJKUuxgSyDkmksOUxqz2AluNABmVefuu7GA/sjnxm ZDHBEB4pN0XELvG9Rl6nWeG4oIzTXUY7VgAeIz84QgleueskT7hBtHYWptF5ZDtD /I1ExnL/y5SHQ4qxQeGffnwO6X7C8osJv6JTaudl0ZYjxELA== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e9wahsehr-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 21 May 2026 13:14:36 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c8514f8ed5dso428147a12.3 for ; Thu, 21 May 2026 06:14:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779369275; x=1779974075; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=wNjMyJsY5JJvxdt736Bz6xbi/GKfy2/4NcKpcMc4sZ0=; b=WM4wafmIuNoDURD0518VcjyT6bLlfApvvZIdVDZKvDKKveC0P4gqmIxuvo0aLO7XP0 Fb3k6E5wscJPeppk/4MSocjrbKBKqnbRBiQxXQ4MLmD/ngFE/Ot5kopYKJswXXzx15pe +0kT9/9ip/tqWMMyTuzQNSxn1VB9pDmhGUBSCkQOhOs+TMuuHnh+hJMl0Grfvt/B4Jkb YVRq9ZqlgVR5/Wgef+aUqsbWM1bOUPOX5CMqniFADpxID4gYHJHkKaWgPlBfb253HmD1 UJ0ah49gjdbm/sytUQWSbHfmyfmKgCgO4hbY8EeYxJ8D9NuRa+j1qRcSUPCITparyaQl 7SyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779369275; x=1779974075; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=wNjMyJsY5JJvxdt736Bz6xbi/GKfy2/4NcKpcMc4sZ0=; b=N9XTnJ9GLknRBJ1KS24spxZcsB2leAQ7hcFhOgBuggHMFKU1RUA8qt2WIXqBJamD8o vqU3Frms0/EDt4w51HyTR/Bj+4HWUsA6qZ8tzq69rSuBzDcA0f+1Dt2tRGutsdv19LvW qYQwHg40FadmtubeEK3LAyQY4TQ8fiSzMarixlnoIwAXM1JMBJSZDkNQDeAEhcANvxPr Fhu38rCqU8jlxi2mFGMZpF8OAWMSmoI1oUroAk3P7edU6hWocwLwPfZMOHFjp+B/jYrT G2XDFiBDcEtVoKwPBerBB2KGKiYXzofcBVjjMUUQgG13768HG3X5hSj6ZOO29GNcjgvN 0TlQ== X-Gm-Message-State: AOJu0YxkYID/4CiL8iE2KylNcvizmO3f0IRezMtV9VGxuSARLeVq7Sy+ RdRxK9cWNEHUZ5TlSSr8grpsdsaRn1G5nCDIdswkW139tmgrF4z+zJSMX7OaOJD/aaLacZyRLDH QKq0L1MyReC/vysucRLI+boIzjAvsNQiyLSFTsEDjcHGAKyK7MqSW3/7hQVKcMVJ3H5U= X-Gm-Gg: Acq92OFi1YWI0of4dFZijetM9XvLBMbh95C0SZtH8Wox7AuOXAQI9xrj2decUvkIlPT eygDsoOsXO6TRE8fIgqIeY/oUReE+0/xLuOAcRJzUqHwHOCvSLvsBqs2Z8l7xw66LJDCLywXWsd H1LGaqRxacqUI+jZsFmPMMsJ0EJYMm5az7Lv7JLuUHakrn967ayH9TX9R3XxG3UA8e5BfmQywyb Ce2NFfgCRg8bjCz6SfCXzMVhTKdBdS0b8AajpnOFtyd34yJz6u0r5FwLX5SRz9wboFCzCircSSo moKGLZOhLK5nq6ylijosnJIC2vxdh01wzWWCFHMaEMLGnquEvFbyviYvfyINkB4fTPxs+lHOE/r QDZFGNKaLScWst/b2EKj0w5yS3fKjKGBmgXWq3uOQv0gNRksJH3Ln/xyjkHYVuwpI7HJHbQmV5n c4WhWD3dO6X+n8vQ== X-Received: by 2002:a05:6a21:6497:b0:3b3:cea:874d with SMTP id adf61e73a8af0-3b30ceaa701mr2762004637.18.1779369275326; Thu, 21 May 2026 06:14:35 -0700 (PDT) X-Received: by 2002:a05:6a21:6497:b0:3b3:cea:874d with SMTP id adf61e73a8af0-3b30ceaa701mr2761950637.18.1779369274722; Thu, 21 May 2026 06:14:34 -0700 (PDT) Received: from jinlmao-gv.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c851991e83asm327045a12.25.2026.05.21.06.14.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 May 2026 06:14:34 -0700 (PDT) From: Yingchao Deng Date: Thu, 21 May 2026 21:14:24 +0800 Subject: [PATCH v6] stm: class: Add MIPI OST protocol support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260521-stm_p_ost-v6-1-e557900b686b@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIADAFD2oC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyzHQUlJIzE vPSU3UzU4B8JSMDIzMDUyND3eKS3PiC+PziEl1jEwvLNBOjRMtUi2QloPqCotS0zAqwWdGxtbU A4LBz5VsAAAA= To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Jonathan Corbet , Shuah Khan , Alexander Shishkin , Alexandre Torgue Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, quic_yingdeng@quicinc.com, tingwei.zhang@oss.qualcomm.com, jinlong.mao@oss.qualcomm.com, jie.gan@oss.qualcomm.com, yuanfang.zhang@oss.qualcomm.com, Yingchao Deng X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779369270; l=15483; i=yingchao.deng@oss.qualcomm.com; s=20260521; h=from:subject:message-id; bh=4XNB5JIGLjpANm8G9Mn+wCMnN2QbN2hJxUFucPulnHQ=; b=it+LsOxLa/DSMYiyCmbeE4wGLVzOgkyuIMxI0NWlIp/dDeEx0zxnjsTNo0fHYfCDKwFiORWk9 tv0/++ST1K4BC36kK35V2FO8peV85qMq2PDPjvb2nC0WKf1SX7ifVLC X-Developer-Key: i=yingchao.deng@oss.qualcomm.com; a=ed25519; pk=YbHeeX0Qzqo7voZLva784lFhVChB9yF3a4sceW95ljA= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDEzMiBTYWx0ZWRfX6nON0QGLJ3iI M9D7gYZTZTg/UqgVih17AdO61I5phVAWFvaR2PG7v0jPdSerH8OuKVc5uRoGPSg+82xG33nHpxQ xgLeCnGL5Y0SD3BYYUBy3wPJC+yKax4ubpF37wcL0QlcLa6G8vCDPUHtwnwlj/fFIwhjTN6BSSG E/gUvo0KMe4md+OrcK1no1zSNjgkuahtI37Ack/T2ka3PYlp1OBdIrwA4Y66X7rpwg7+Gix3Gcg d9aT8S52UU8P8v+71KgQdh/f0ZnFQ8QKulSughUaN1vNcRkZsMTJ60TRQyaQcdJ0djyEcqBRYah VP7gWgCO17NVeUWeiRSqfC2z2U17aNoM1F6Uvio/i+xE5H1Odg6jVOKwp+5k20TPIIxKDe486NH 54UCwYAqIWyKhJV3Cxh0ucfS9GtxD7N/TH6U7FxaMnz4FiDq3Ogc8XXrQ1jy4A4spdxbSNNac54 GsvlPHhbiF559X0dsuQ== X-Proofpoint-ORIG-GUID: -GTDRBxLesZBb1RzyCBprHdTw2xQoDTU X-Proofpoint-GUID: -GTDRBxLesZBb1RzyCBprHdTw2xQoDTU X-Authority-Analysis: v=2.4 cv=H8LrBeYi c=1 sm=1 tr=0 ts=6a0f053c cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=COk6AnOGAAAA:8 a=56qk-FYNGTj2BDIEd0YA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 adultscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210132 Add MIPI OST (Open System Trace) protocol support for stm to format the traces. The OST Protocol abstracts the underlying layers from the sending and receiving applications, thus removing dependencies on the connection media and platform implementation. OST over STP packet consists of Header/Payload/End. Header is designed to include the information required by all OST packets. Information that is not shared by all packets is left to the higher layer protocols. Thus, the OST Protocol Header can be regarded as the first part of a complete OST Packet Header, while a higher layer header can be regarded as an extension designed for a specific purpose. +--------+--------+--------+--------+ | start |version |entity |protocol| +--------+--------+--------+--------+ | stm version | magic | +-----------------------------------+ | cpu | +-----------------------------------+ | timestamp | | | +-----------------------------------+ | tgid | | | +-----------------------------------+ | payload | +-----------------------------------+ | ... | end | +-----------------------------------+ In header, there will be STARTSIMPLE/VERSION/ENTITY/PROTOCOL. STARTSIMPLE is used to signal the beginning of a simplified OST protocol. The Version field is a one byte, unsigned number identifying the version of the OST Protocol. The Entity ID field is a one byte unsigned number that identifies the source. Entity ID values (0~239) are defined and controlled by the TS owner, and shall be unique for the whole TS. The configfs entity attribute allows the user to configure which Entity ID is associated with each policy node. The Protocol ID field is a one byte unsigned number identifying the higher layer protocol of the OST Packet, i.e. identifying the format of the data after the OST Protocol Header. OST Control Protocol ID value represents the common control protocol, the remaining Protocol ID values may be used by any higher layer protocols capable of being transported by the OST Protocol. Co-developed-by: Tingwei Zhang Signed-off-by: Tingwei Zhang Co-developed-by: Yuanfang Zhang Signed-off-by: Yuanfang Zhang Co-developed-by: Jinlong Mao Signed-off-by: Jinlong Mao Signed-off-by: Yingchao Deng --- Changes in v6: 1. Rebase on top of linux-next-20260518. 2. Fix Kconfig: 'default CONFIG_STM' -> 'default STM'. 3. Fix documentation grammar issues. 4. Add p_ost entry to Documentation/trace/index.rst. 5. Add missing priv_sz field to stm_protocol_driver registration. 6. Use kzalloc_obj() instead of kzalloc() in ost_output_open(). 7. Add mutex protection in entity configfs store handler. 8. Keep the configfs entity attribute: entity ID values (0~239) are defined and controlled by the TS owner and are deployment-specific. stm_source_type only carries a small number of in-kernel source classifications and cannot represent the full range of OST entity assignments needed in practice. The configfs attribute allows each policy node to declare its entity. OST_ENTITY_TYPE_NONE is an enum sentinel (not entity ID 0) that causes ost_write() to return -EINVAL when no entity is configured, preventing emission of packets with an unintended entity field. OST_ENTITY_DIAG (0xEE) is a TS-owner-defined value used by Qualcomm's diagnostic framework as the standard entity identifier for diagnostic trace sources. Link to v5: https://lore.kernel.org/all/20260129-p_ost-v5-1-2b14fff39428@os= s.qualcomm.com/ Changes in v5: 1. Add Co-developed-by tag. 2. Use yearless copyright for new file. - Link to v4: https://lore.kernel.org/all/20251024-p_ost-v4-1-3652a06fd055@= oss.qualcomm.com/ Changes in v4: 1. Delete unused variable 'i'. 2. Fix build error: call to undeclared function 'task_tgid_nr'. Link to v3 - https://lore.kernel.org/all/20251022071834.1658684-1-yingchao.= deng@oss.qualcomm.com/ Changes in v3: 1. Add more details about OST. 2. Delete 'entity_available' node, and 'entity' node will show available and currently selected (shown in square brackets) entity. 3. Removed the usage of config_item->ci_group->cg_subsys->su_mutex. Link to v2 - https://lore.kernel.org/all/20230419141328.37472-1-quic_jinlma= o@quicinc.com/ --- .../ABI/testing/configfs-stp-policy-p_ost | 9 + Documentation/trace/index.rst | 1 + Documentation/trace/p_ost.rst | 39 ++++ drivers/hwtracing/stm/Kconfig | 14 ++ drivers/hwtracing/stm/Makefile | 2 + drivers/hwtracing/stm/p_ost.c | 241 +++++++++++++++++= ++++ 6 files changed, 306 insertions(+) diff --git a/Documentation/ABI/testing/configfs-stp-policy-p_ost b/Document= ation/ABI/testing/configfs-stp-policy-p_ost new file mode 100644 index 000000000000..8fb160b50c40 --- /dev/null +++ b/Documentation/ABI/testing/configfs-stp-policy-p_ost @@ -0,0 +1,9 @@ +What: /config/stp-policy/:p_ost.//entity +Date: May 2026 +KernelVersion: 7.1 +Description: + Set the entity ID which identifies the trace source in the + OST packet header. Entity ID values (0~239) are defined by + the TS owner. Currently supported values are ftrace, console + and diag. RW. + diff --git a/Documentation/trace/index.rst b/Documentation/trace/index.rst index 5d9bf4694d5d..9cd1e0b5af6d 100644 --- a/Documentation/trace/index.rst +++ b/Documentation/trace/index.rst @@ -72,6 +72,7 @@ interactions and system performance. intel_th stm sys-t + p_ost coresight/index rv/index hisi-ptt diff --git a/Documentation/trace/p_ost.rst b/Documentation/trace/p_ost.rst new file mode 100644 index 000000000000..2b92e2229653 --- /dev/null +++ b/Documentation/trace/p_ost.rst @@ -0,0 +1,39 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +MIPI OST over STP +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The OST (Open System Trace) driver is used with STM class devices to +generate standardized trace stream. Trace sources can be identified +by different entity IDs. + +CONFIG_STM_PROTO_OST is for p_ost driver enablement. Once this config +is enabled, you can select the p_ost protocol by command below: + +# mkdir /sys/kernel/config/stp-policy/stm0:p_ost.policy + +The policy name format is extended like this: + + :. + +With a coresight-stm device, it will look like "stm0:p_ost.policy". + +With the MIPI OST protocol driver, the attributes for each protocol node a= re: + +# mkdir /sys/kernel/config/stp-policy/stm0:p_ost.policy/default +# ls /sys/kernel/config/stp-policy/stm0:p_ost.policy/default +channels entity masters + +The entity here is the set of entities that p_ost supports. Currently +p_ost supports ftrace, console and diag entities. + +Set entity: +# echo 'ftrace' > /sys/kernel/config/stp-policy/stm0:p_ost.policy/default/= entity + +Get available and currently selected (shown in square brackets) entity: +# cat /sys/kernel/config/stp-policy/stm0:p_ost.policy/default/entity +[ftrace] console diag + +See Documentation/ABI/testing/configfs-stp-policy-p_ost for more details. + diff --git a/drivers/hwtracing/stm/Kconfig b/drivers/hwtracing/stm/Kconfig index cd7f0b0f3fbe..4c83da5d95a0 100644 --- a/drivers/hwtracing/stm/Kconfig +++ b/drivers/hwtracing/stm/Kconfig @@ -40,6 +40,20 @@ config STM_PROTO_SYS_T =20 If you don't know what this is, say N. =20 +config STM_PROTO_OST + tristate "MIPI OST STM framing protocol driver" + default STM + help + This is an implementation of MIPI OST protocol to be used + over the STP transport. In addition to the data payload, it + also carries additional metadata for entity, better + means of trace source identification, etc. + + The receiving side must be able to decode this protocol in + addition to the MIPI STP, in order to extract the data. + + If you don't know what this is, say N. + config STM_DUMMY tristate "Dummy STM driver" help diff --git a/drivers/hwtracing/stm/Makefile b/drivers/hwtracing/stm/Makefile index 1692fcd29277..d9c8615849b9 100644 --- a/drivers/hwtracing/stm/Makefile +++ b/drivers/hwtracing/stm/Makefile @@ -5,9 +5,11 @@ stm_core-y :=3D core.o policy.o =20 obj-$(CONFIG_STM_PROTO_BASIC) +=3D stm_p_basic.o obj-$(CONFIG_STM_PROTO_SYS_T) +=3D stm_p_sys-t.o +obj-$(CONFIG_STM_PROTO_OST) +=3D stm_p_ost.o =20 stm_p_basic-y :=3D p_basic.o stm_p_sys-t-y :=3D p_sys-t.o +stm_p_ost-y :=3D p_ost.o =20 obj-$(CONFIG_STM_DUMMY) +=3D dummy_stm.o =20 diff --git a/drivers/hwtracing/stm/p_ost.c b/drivers/hwtracing/stm/p_ost.c new file mode 100644 index 000000000000..d2174872b761 --- /dev/null +++ b/drivers/hwtracing/stm/p_ost.c @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + * MIPI OST framing protocol for STM devices. + */ + +#include +#include +#include +#include +#include "stm.h" + +/* + * OST Base Protocol Header + * + * Position Bits Field Name + * 0 8 STARTSIMPLE + * 1 8 Version + * 2 8 Entity ID + * 3 8 Protocol ID + */ +#define OST_FIELD_STARTSIMPLE 0 +#define OST_FIELD_VERSION 8 +#define OST_FIELD_ENTITY 16 +#define OST_FIELD_PROTOCOL 24 + +#define OST_TOKEN_STARTSIMPLE 0x10 +#define OST_VERSION_MIPI1 0x10 + +/* entity id to identify the source */ +#define OST_ENTITY_FTRACE 0x01 +#define OST_ENTITY_CONSOLE 0x02 +#define OST_ENTITY_DIAG 0xEE + +#define OST_CONTROL_PROTOCOL 0x0 + +#define DATA_HEADER ((OST_TOKEN_STARTSIMPLE << OST_FIELD_STARTSIMPLE) | \ + (OST_VERSION_MIPI1 << OST_FIELD_VERSION) | \ + (OST_CONTROL_PROTOCOL << OST_FIELD_PROTOCOL)) + +#define STM_MAKE_VERSION(ma, mi) (((ma) << 8) | (mi)) +#define STM_HEADER_MAGIC (0x5953) + +enum ost_entity_type { + OST_ENTITY_TYPE_NONE, + OST_ENTITY_TYPE_FTRACE, + OST_ENTITY_TYPE_CONSOLE, + OST_ENTITY_TYPE_DIAG, +}; + +static const char * const str_ost_entity_type[] =3D { + [OST_ENTITY_TYPE_NONE] =3D "none", + [OST_ENTITY_TYPE_FTRACE] =3D "ftrace", + [OST_ENTITY_TYPE_CONSOLE] =3D "console", + [OST_ENTITY_TYPE_DIAG] =3D "diag", +}; + +static const u32 ost_entity_value[] =3D { + [OST_ENTITY_TYPE_NONE] =3D 0, + [OST_ENTITY_TYPE_FTRACE] =3D OST_ENTITY_FTRACE, + [OST_ENTITY_TYPE_CONSOLE] =3D OST_ENTITY_CONSOLE, + [OST_ENTITY_TYPE_DIAG] =3D OST_ENTITY_DIAG, +}; + +struct ost_policy_node { + enum ost_entity_type entity_type; +}; + +struct ost_output { + struct ost_policy_node node; +}; + +/* Set default entity type as none */ +static void ost_policy_node_init(void *priv) +{ + struct ost_policy_node *pn =3D priv; + + pn->entity_type =3D OST_ENTITY_TYPE_NONE; +} + +static int ost_output_open(void *priv, struct stm_output *output) +{ + struct ost_policy_node *pn =3D priv; + struct ost_output *opriv; + + opriv =3D kzalloc_obj(*opriv, GFP_ATOMIC); + if (!opriv) + return -ENOMEM; + + memcpy(&opriv->node, pn, sizeof(opriv->node)); + output->pdrv_private =3D opriv; + return 0; +} + +static void ost_output_close(struct stm_output *output) +{ + kfree(output->pdrv_private); +} + +static ssize_t ost_t_policy_entity_show(struct config_item *item, + char *page) +{ + struct ost_policy_node *pn =3D to_pdrv_policy_node(item); + ssize_t sz =3D 0; + int i; + + for (i =3D 1; i < ARRAY_SIZE(str_ost_entity_type); i++) { + if (i =3D=3D pn->entity_type) + sz +=3D sysfs_emit_at(page, sz, "[%s] ", str_ost_entity_type[i]); + else + sz +=3D sysfs_emit_at(page, sz, "%s ", str_ost_entity_type[i]); + } + + sz +=3D sysfs_emit_at(page, sz, "\n"); + return sz; +} + +static int entity_index(const char *str) +{ + int i; + + for (i =3D 1; i < ARRAY_SIZE(str_ost_entity_type); i++) { + if (sysfs_streq(str, str_ost_entity_type[i])) + return i; + } + + return 0; +} + +static ssize_t +ost_t_policy_entity_store(struct config_item *item, const char *page, + size_t count) +{ + struct mutex *mutexp =3D &item->ci_group->cg_subsys->su_mutex; + struct ost_policy_node *pn =3D to_pdrv_policy_node(item); + int i; + + i =3D entity_index(page); + if (i) { + mutex_lock(mutexp); + pn->entity_type =3D i; + mutex_unlock(mutexp); + } else { + return -EINVAL; + } + + return count; +} +CONFIGFS_ATTR(ost_t_policy_, entity); + +static struct configfs_attribute *ost_t_policy_attrs[] =3D { + &ost_t_policy_attr_entity, + NULL, +}; + +static ssize_t +notrace ost_write(struct stm_data *data, struct stm_output *output, + unsigned int chan, const char *buf, size_t count, + struct stm_source_data *source) +{ + struct ost_output *op =3D output->pdrv_private; + unsigned int c =3D output->channel + chan; + unsigned int m =3D output->master; + const unsigned char nil =3D 0; + u32 header =3D DATA_HEADER; + struct trc_hdr { + u16 version; + u16 magic; + u32 cpu; + u64 timestamp; + u64 tgid; + } hdr; + ssize_t sz; + + /* + * Identify the source by entity type. + * If entity type is not set, return error value. + */ + if (op->node.entity_type) + header |=3D (ost_entity_value[op->node.entity_type] << OST_FIELD_ENTITY); + else + return -EINVAL; + + /* + * STP framing rules for OST frames: + * * the first packet of the OST frame is marked; + * * the last packet is a FLAG with timestamped tag. + */ + /* Message layout: HEADER / DATA / TAIL */ + /* HEADER */ + sz =3D data->packet(data, m, c, STP_PACKET_DATA, STP_PACKET_MARKED, + 4, (u8 *)&header); + if (sz <=3D 0) + return sz; + + /* DATA */ + hdr.version =3D STM_MAKE_VERSION(0, 3); + hdr.magic =3D STM_HEADER_MAGIC; + hdr.cpu =3D raw_smp_processor_id(); + hdr.timestamp =3D sched_clock(); + hdr.tgid =3D task_tgid_nr(current); + sz =3D stm_data_write(data, m, c, false, &hdr, sizeof(hdr)); + if (sz <=3D 0) + return sz; + + sz =3D stm_data_write(data, m, c, false, buf, count); + + /* TAIL */ + if (sz > 0) + data->packet(data, m, c, STP_PACKET_FLAG, + STP_PACKET_TIMESTAMPED, 0, &nil); + + return sz; +} + +static const struct stm_protocol_driver ost_pdrv =3D { + .owner =3D THIS_MODULE, + .name =3D "p_ost", + .priv_sz =3D sizeof(struct ost_policy_node), + .write =3D ost_write, + .policy_attr =3D ost_t_policy_attrs, + .output_open =3D ost_output_open, + .output_close =3D ost_output_close, + .policy_node_init =3D ost_policy_node_init, +}; + +static int ost_stm_init(void) +{ + return stm_register_protocol(&ost_pdrv); +} +module_init(ost_stm_init); + +static void ost_stm_exit(void) +{ + stm_unregister_protocol(&ost_pdrv); +} +module_exit(ost_stm_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("MIPI Open System Trace STM framing protocol driver"); --- base-commit: 80dd246accce631c328ea43294e53b2b2dd2aa32 change-id: 20260521-stm_p_ost-3489f42a9e8c Best regards, --=20 Yingchao Deng