From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 669E2C982D0 for ; Sun, 20 Sep 2026 09:21:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=88JakCX7JME16ZQerxoV/0O9DseNm+nmavHCj/aXCuw=; b=0287Ec1sqX/iDHNewDd5Vtyhka GhRsi+Od6V3dPjVPaVmO3JXfjugJiOkV5K1g/PSdzuvXlZnk+668NrpvEM19qkeRpwXKKwV2DCJ+C sZ2Qc2NL0KXCseUib3MffniUJ2J0wEH28kn5aGt3Xf8LzTYno1vkk5XbRvZo5j4XhXDeuMwFlybLv UiodyQN/OpLAOcSW7/6epm0S1iYQgmsICFHk6fgW+SGkr35mImDhTUlfnG0KE/NSO7dktg/zCRZwu 61jCwOlYSpoDwerQzGbC21hURdam+4f9SFFT0xNuqNUXL3aIGLBWQulariDV7+C1TfDysTnNqTO0x a19telOw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x8Djo-0000000HA4A-2gn8; Sun, 20 Sep 2026 09:21:32 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x8Djb-0000000H9rU-19J0 for linux-arm-kernel@lists.infradead.org; Sun, 20 Sep 2026 09:21:20 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2452E1C0A; Sun, 20 Sep 2026 02:21:15 -0700 (PDT) Received: from pluto.fritz.box (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CC0F63F59E; Sun, 20 Sep 2026 02:21:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1789896078; bh=lepzCoFoOSnld2fNwqgC5kvTkcktJyOziMdVACzjx3I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gld4dXuuiorZRdlZprOK5GOP23RkmC/2ha3ITW1yDr/LiBczqEP88fT8f1zIy3LHC aGGUaFEa4V4DtMmoLU6ipnQKiW53440ORf1iHMEcReOOduHIM4NtOjWboA/kZb9y2L APkKH7MOuV4Ux56SFBAYnrmMf96dDrQf0z+dbq/M= From: Cristian Marussi To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, arm-scmi@vger.kernel.org, linux-doc@vger.kernel.org Cc: sudeep.holla@kernel.org, james.quinlan@broadcom.com, f.fainelli@gmail.com, vincent.guittot@linaro.org, etienne.carriere@st.com, peng.fan@oss.nxp.com, michal.simek@amd.com, d-gole@ti.com, jic23@kernel.org, elif.topuz@arm.com, lukasz.luba@arm.com, philip.radford@arm.com, david@kernel.org, souvik.chakravarty@arm.com, leitao@kernel.org, kas@kernel.org, puranjay@kernel.org, usama.arif@linux.dev, kernel-team@meta.com, Cristian Marussi Subject: [PATCH v12 16/25] firmware: arm_scmi: Add Telemetry debugfs SHMTI dump support Date: Sun, 20 Sep 2026 10:19:19 +0100 Message-ID: <20260920091928.2014972-17-cristian.marussi@arm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260920091928.2014972-1-cristian.marussi@arm.com> References: <20260920091928.2014972-1-cristian.marussi@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260920_022119_403761_DA548B26 X-CRM114-Status: GOOD ( 17.65 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Expose one debugfs entry for each discovered SHMTI that can be used to dump the related SHMTI in binary form from TBGN up to TEND markers. No processing is done kernel side, beside using proper accessors for device memory. Signed-off-by: Cristian Marussi --- v11 --> v12 - fix debugfs shmti dump file to use the SID as name v8 --> v9 - use kvzalloc/kfree - use file_update_time to update debugfs file ts v5 --> v6 - added mutex to protect binary dump buffer during reads (Sashiko) - using debugfs_create_file_size() (Sashiko) --- drivers/firmware/arm_scmi/telemetry.c | 95 +++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/drivers/firmware/arm_scmi/telemetry.c b/drivers/firmware/arm_scmi/telemetry.c index ada4838d2351..7c1da722e0c3 100644 --- a/drivers/firmware/arm_scmi/telemetry.c +++ b/drivers/firmware/arm_scmi/telemetry.c @@ -11,8 +11,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -407,6 +410,14 @@ struct telemetry_shmti { struct scmi_telemetry_shmti_info info; }; +struct scmi_telemetry_dbg_shmti { + struct telemetry_shmti *shmti; + size_t buf_sz; + void *buf; + /* Protect this descriptor from concurrent readers using it */ + struct mutex mtx; +}; + #define SHMTI_EPLG(s) \ ({ \ struct telemetry_shmti *_s = (s); \ @@ -1506,6 +1517,87 @@ scmi_telemetry_enumerate_common_intervals(struct telemetry_info *ti) ti->info.intervals); } +static int scmi_telemetry_dbg_shmti_open(struct inode *inode, struct file *filp) +{ + struct scmi_telemetry_dbg_shmti *sblob; + struct telemetry_shmti *shmti; + + if (!inode->i_private) + return -ENODEV; + + shmti = inode->i_private; + sblob = kzalloc_obj(*sblob); + if (!sblob) + return -ENOMEM; + + sblob->shmti = shmti; + sblob->buf = kvzalloc(shmti->info.len, GFP_KERNEL); + if (!sblob->buf) { + kfree(sblob); + return -ENOMEM; + } + + mutex_init(&sblob->mtx); + + filp->private_data = sblob; + + return 0; +} + +static ssize_t scmi_telemetry_dbg_shmti_read(struct file *filp, char __user *buf, + size_t count, loff_t *ppos) +{ + struct scmi_telemetry_dbg_shmti *sblob = filp->private_data; + + /* Dump on first read and again after each rewind to start pos */ + guard(mutex)(&sblob->mtx); + if (!sblob->buf_sz || *ppos == 0) { + memcpy_fromio(sblob->buf, sblob->shmti->base, + sblob->shmti->info.len); + sblob->buf_sz = sblob->shmti->info.len; + /* update inode timestamps */ + file_update_time(filp); + } + + return simple_read_from_buffer(buf, count, ppos, sblob->buf, sblob->buf_sz); +} + +static int scmi_telemetry_dbg_shmti_release(struct inode *inode, struct file *filp) +{ + struct scmi_telemetry_dbg_shmti *sblob = filp->private_data; + + kvfree(sblob->buf); + kfree(sblob); + + return 0; +} + +static const struct file_operations scmi_telemetry_dbg_shmti_fops = { + .open = scmi_telemetry_dbg_shmti_open, + .release = scmi_telemetry_dbg_shmti_release, + .read = scmi_telemetry_dbg_shmti_read, + .llseek = generic_file_llseek, + .owner = THIS_MODULE, +}; + +static void scmi_telemetry_debugfs_initialize(struct telemetry_info *ti) +{ + const struct scmi_protocol_handle *ph = ti->ph; + struct dentry *top, *shmti_top; + + top = ph->hops->debugfs_proto_dentry_get(ph); + shmti_top = debugfs_create_dir("shmtis", top); + + for (unsigned int i = 0; i < ti->num_shmti; i++) { + char id[16]; + + snprintf(id, 16, "%u", ti->shmti[i].info.sid); + debugfs_create_file_size(id, 0444, shmti_top, &ti->shmti[i], + &scmi_telemetry_dbg_shmti_fops, + ti->shmti[i].info.len); + } +} + static int iter_shmti_update_state(struct scmi_iterator_state *st, const void *response, void *priv) { @@ -4119,6 +4211,9 @@ static int scmi_telemetry_protocol_init(const struct scmi_protocol_handle *ph) } } + if (IS_ENABLED(CONFIG_ARM_SCMI_DEBUG_PROTOCOLS)) + scmi_telemetry_debugfs_initialize(ti); + return 0; } -- 2.54.0