From nobody Mon Sep 28 23:12:46 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 B8B6433F5A8 for ; Sat, 15 Aug 2026 16:25:13 +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=1786811115; cv=none; b=LfzU3pDsvROODY/IfN56I534JBYg6FvgRscGpKdJPaXcVUuz6Ymy6SNmmuO+5wweNKNsB2BuPcoJS3twfIwM/It+InbOR2D3rw2KJSTplw4RSwEvB2DFtTiYc63mhT2vsnHdob8XtBBfXfVi4ZIw6Huy6vTx3Dfd9JPXOYE2KTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786811115; c=relaxed/simple; bh=mjLGBOdLUui8fb36s9PmneBaH7IYyj2J9H5dc5GNfLU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=nl2i4F0I11yqxvFuqmDTecOgbLUmQxxCLvLbLGUMSEb/nCnH3l3/IIUd3KNG4HLdVCTjnx/5Ts25xYIwewIDRGGXLqiKy/Lf43PP57Ovdl7fJaFV4D4SY+FE+T1Vdl75XR3xBbMJ2W6kRxLvvVq3CchUdqW20pStupsg8N0oNuY= 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=HJKqrgHG; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=OYhG+7KY; 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="HJKqrgHG"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="OYhG+7KY" 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 67FDMYen642771 for ; Sat, 15 Aug 2026 16:25:11 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=wYegldaqcQnq4ZW+F3qC9Y V0DTZYsroa5keW6DtlMr4=; b=HJKqrgHGxFYrmpCSdm3Cfa7WxUn0LunedChOKp WLXrI6lQ5yS2bWKZlch0A71Z9KkfNGU6uhwuxmfl62+YiQXpbzF8tYd9cT8nDyNc WyFUgncxl2TcBamcINs8m2F8mwv0mIu2I8UtINa1qN9FHLFuvP2OxdxPji0dNEkq p0OdcD4rcoVcGV8qbPpQo974xwGaW3xvPC8/05LuAK4iEwU4v6xA63Ak6calaDpm pnFwKYj4YlxLfzWX544qfxb/jXh5rxCNim3W6X13s46WsOSwx5RZj2lv/mYjtaRl RA5pUS7aPfQmjH33aO5fj1WgkKfxCPPeKj83Czoc5fPJZyqw== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g2ghfsden-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 15 Aug 2026 16:25:11 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cccfa32670so25418085ad.2 for ; Sat, 15 Aug 2026 09:25:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1786811111; x=1787415911; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=wYegldaqcQnq4ZW+F3qC9YV0DTZYsroa5keW6DtlMr4=; b=OYhG+7KYaOgnfoKmve7LDiKkxmORKrFW09rP0h7FM+Ed9HKfrvpk1ieZALnW+0k1nO 6oSOrjXlZLUWrAsFv4ZDComVSQzvvHB+sDmimz1lg3oy8ZMtpZ31DjtuMd9HY0OelYCE 4M2opMGuDEnRPMq9cAhIJQjKovIDjay/7jY+ZMaUdYGjppmv3ZMVA6na3fiTfDrqzkmq 4RWhQ3hHy6Fl1d1ak0HIZBwNRsdgohkzp0RWq52IIK00sxwsKIxxN8TSRW6jTQvKuCRA JWO4Rkevw3pXRjbK48s7GzKzzgGsSCslGPSf9leJgb4lViAm+c51WtbM/0i12NlEfETz FHow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786811111; x=1787415911; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=wYegldaqcQnq4ZW+F3qC9YV0DTZYsroa5keW6DtlMr4=; b=rCzV5cIZTl6BVChJDc6+j1sH1mBmBK4A0xlRS57fUyYBRbhWqKGAwmC1wL3gt5Zs+I FPvegQ2So2JZNwdstTAbxXE++3KI7X25Df5ANpVjK8M8p0Z5AskxHcOo1j7mA8Z6PmvA A0pDsuV3WJTdCZg+1TJFqHOz8njETa1A7uPp0KepDRCdgabHMbZPhZUhNR980Ywoj36X tMN553bWSlZydtXG9ktcL36GQc1lR5qn2e5chr+Y8yMd0l9FQSGscsWSsZ2keo+I402P F4lEruOQ1HvgIO5Qow1VMILiitSRAyP+w98t/3dksMx9mWGb9wyHbsPzvWzrVrQHsoZh DDww== X-Gm-Message-State: AOJu0YwVSNwi30gDHf5Ym0uk1/VpAGoCBcPIiysapr+OfkT62YDKG0Py DeuvsbthulRgqSVVDNqG9Or/q58FURqWWqB4LqwlXiPrmdUE6hfNDwk4qFrYL1VwFXFOCgeUtgW kyCiMUTs7yW7Lj8ar7UVx3kUjGmrhGmXkFjo7lQTUz0/yIevdj1I5KNlYLt9ijjKiwHVGGklbb1 Q= X-Gm-Gg: AR+sD12oHxtod1PiEOkj9bTCbWjZqPnCkOJuybOJzRIrebYIBmneUV4qWFOarKd6VUV /nG/tqDJYY9rzwnUn410xrImEeYS3Q3BLaHxbmBFtiLdoEE1WSGwzUwruvK4l3GGIrXYUq7hBL9 IOuI8LBZTmpSKXHbi0aRx2qX4EV/L1ZmqRex7UbuNZjOfErrm59WMu33YYXWLBpDLNRvOS+2zqY vojsN/UKV6sfDwCQzwsPTvl0ujUT+Ovkoa12Oaxg23C9eUILxPuxSUse0lJd7qdgDaYrr7PXCgI p5npN+mDkQhdQPYHq6m+N0XcMNzVHr5lb9oeZp5KaS7IUThorwKDwgrVfpVjCuo5kgxgSCaZafb YiUIRC8Pbaomh4Ow9NzsrCw1c7Ob/RxA= X-Received: by 2002:a17:90b:4ac8:b0:38e:11ba:992c with SMTP id 98e67ed59e1d1-3933e5d22acmr14089781a91.12.1786811110240; Sat, 15 Aug 2026 09:25:10 -0700 (PDT) X-Received: by 2002:a17:90b:4ac8:b0:38e:11ba:992c with SMTP id 98e67ed59e1d1-3933e5d22acmr14089726a91.12.1786811109575; Sat, 15 Aug 2026 09:25:09 -0700 (PDT) Received: from hu-renjiang-sha.qualcomm.com ([114.94.8.21]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-320e9df03ecsm17394521eec.18.2026.08.15.09.25.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 15 Aug 2026 09:25:09 -0700 (PDT) From: Renjiang Han Date: Sat, 15 Aug 2026 21:55:01 +0530 Subject: [PATCH] media: qcom: iris: add firmware debug logging 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: <20260815-media-qcom-iris-fw-log-v1-1-c8a70eb08849@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIANySgGoC/yWMWw6DIBQFt2Lud0kAQbBbafzgcbE3qVrBPhLj3 kvq55yTmR0KZsIC12aHjG8qtMwVxKWBcHfziIxiZZBcdtwKzSaM5NgalolRpsLShz2WkbW+k95 2SnvjoMrPjIm+//BtODnj+qr97RzBu4KsZibaro20kQuJyatWmtQHo6NGrqQzoRfYO63q6XoLw 3H8AJkOQv20AAAA X-Change-ID: 20260815-media-qcom-iris-fw-log-3b62b8645b7a To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, Wangao Wang , Renjiang Han X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1786811106; l=22780; i=renjiang.han@oss.qualcomm.com; s=20241001; h=from:subject:message-id; bh=mjLGBOdLUui8fb36s9PmneBaH7IYyj2J9H5dc5GNfLU=; b=11cwQt/HaPIXK3UdfKnDpiV8k8AxE0fxYDHZU5KaljRg93CqPaiFFoRy6+Z9Qf1jRgWXGXzet PExbt4OyeGhD2rGHe7K4T8smvkAVIBQzL9JQpPq3HCKKWiITW4WA/rX X-Developer-Key: i=renjiang.han@oss.qualcomm.com; a=ed25519; pk=8N59kMJUiVH++5QxJzTyHB/wh/kG5LxQ44j9zhUvZmw= X-Proofpoint-Spam-Info: AW1haW4tMjYwODE1MDEyMCBTYWx0ZWRfX4qSD5OegRlUM XFc32MDGC0KmhXoeox5kIkcXrvcCXsH8qH31nAAyyk07aRiD93QgT8R8DxJGj+iPI0KCbgzbwiV HL4Kv16oqrHf67X2PetSYdXpjecTWUY= X-Proofpoint-ORIG-GUID: j9ZmC20p9wVTT2CtDRpo2wyrA4Upy9FO X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE1MDEyMCBTYWx0ZWRfX09WsOfLXm2MR UKeAGiQVQpUZq+KpIp3FM/85F7IqEILXryYISUV0hW8nFQX0yCAtWjQgskjhSz4R2FS99GVCHc7 6Q04/3LNY4hoNuJFw7m4sq6gqXM4WvO72mxehj3jn94A3VFwe5iwrppMypa7SlCPp4a4GP2aTff xCUdCW8uTdYNv52jk7P3Q7s6qxKn7bL/v+mOKX+zlHwRTAVEVu0mj5JOC0uRDAruZxNXvCcRQEu IksiNzykrmqYZ+UAsebG+a7j48cdq2hZRqjV3oK7ptjlqIJMMSsD8852O+abOp1U6LRHuovjXHD HkNj/QwkeeokWY49G4KNvmG50aayX+Ae05uFgJsurgQ//ylNzbCXMwPLlFmQGVT3TKqA1UkrE9V PXWL3kMoGtxvG0QzS6fb0H6rSskgXe2p3sh3967h9TBhe6i2kdmviwEJ776Fuaq9x4Az+LiuiP0 fjhgOhPU2dNq5DdTkCQ== X-Authority-Analysis: v=2.4 cv=TMJ1jVla c=1 sm=1 tr=0 ts=6a8092e7 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=Uz3yg00KUFJ2y2WijEJ4bw==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=4MRVJbwt7L54SN3KyJEA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-GUID: j9ZmC20p9wVTT2CtDRpo2wyrA4Upy9FO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-15_04,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 phishscore=0 clxscore=1011 bulkscore=0 spamscore=0 suspectscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608150120 Iris does not provide runtime control for firmware debug logging, which makes firmware-side failures harder to diagnose without rebuilding or reloading the driver. Add a debugfs fw_level file under the Iris debugfs directory so the firmware debug log mask can be configured at runtime. Keep the default mask limited to firmware error and fatal messages to avoid enabling verbose firmware logging by default. Store the mask per Iris core, and normalize values written through debugfs so userspace reads back the same mask that is sent to firmware. Use READ_ONCE() and WRITE_ONCE() for lockless debugfs access and HFI packet construction. Program the firmware debug configuration during core initialization and before opening a new session. This lets a fw_level value written before session start take effect for that session without requiring a driver reload. Add HFI Gen1 and Gen2 support for sending the firmware debug configuration to firmware, and flush firmware debug messages from the debug queue. Firmware error and fatal messages are emitted through dev_err_ratelimited(), while other firmware debug messages use dev_dbg(). Treat failures to configure firmware debug logging as non-fatal, since they should not prevent video sessions from running. Tested-by: Wangao Wang Signed-off-by: Renjiang Han --- The driver currently has no way to configure firmware debug logging at runtime. This makes firmware-side issues harder to debug, because changing the firmware debug mask requires a rebuild or reload. The patch adds a debugfs fw_level file under the Iris debugfs directory. The value is stored per Iris core and is normalized on write, so userspace reads back the same mask that is programmed to firmware. The firmware debug configuration is sent during core initialization and before opening a new session. This allows a fw_level value written before a session starts to take effect for that session. HFI Gen1 and Gen2 paths are added for programming the debug configuration and reading firmware debug messages from the debug queue. Firmware error and fatal messages are printed with dev_err_ratelimited(), while other firmware messages use dev_dbg(). The default mask enables only firmware error and fatal messages to avoid enabling verbose firmware logging by default. Failure to configure firmware debug logging is treated as non-fatal and does not block normal video operation. --- drivers/media/platform/qcom/iris/Makefile | 1 + drivers/media/platform/qcom/iris/iris_core.h | 7 +++- drivers/media/platform/qcom/iris/iris_debugfs.c | 42 ++++++++++++++++++= ++++ drivers/media/platform/qcom/iris/iris_debugfs.h | 14 ++++++++ drivers/media/platform/qcom/iris/iris_hfi_common.c | 35 ++++++++++++++++++ drivers/media/platform/qcom/iris/iris_hfi_common.h | 10 ++++++ .../platform/qcom/iris/iris_hfi_gen1_command.c | 30 ++++++++++++++++ .../platform/qcom/iris/iris_hfi_gen1_defines.h | 7 ++++ .../platform/qcom/iris/iris_hfi_gen1_response.c | 31 ++++++++++++---- .../platform/qcom/iris/iris_hfi_gen2_command.c | 21 +++++++++++ .../platform/qcom/iris/iris_hfi_gen2_defines.h | 3 ++ .../platform/qcom/iris/iris_hfi_gen2_packet.c | 29 +++++++++++++++ .../platform/qcom/iris/iris_hfi_gen2_packet.h | 1 + .../platform/qcom/iris/iris_hfi_gen2_response.c | 10 ++++-- drivers/media/platform/qcom/iris/iris_probe.c | 6 ++++ drivers/media/platform/qcom/iris/iris_vb2.c | 6 +++- 16 files changed, 242 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/qcom/iris/Makefile b/drivers/media/plat= form/qcom/iris/Makefile index 48e415cbc4390bc596f6239fefa2a2ad2cd3a2bb..105a66e1b0af44f010730a899be= 26cae23d76c73 100644 --- a/drivers/media/platform/qcom/iris/Makefile +++ b/drivers/media/platform/qcom/iris/Makefile @@ -2,6 +2,7 @@ qcom-iris-objs +=3D iris_buffer.o \ iris_common.o \ iris_core.o \ iris_ctrls.o \ + iris_debugfs.o \ iris_firmware.o \ iris_hfi_common.o \ iris_hfi_gen1.o \ diff --git a/drivers/media/platform/qcom/iris/iris_core.h b/drivers/media/p= latform/qcom/iris/iris_core.h index 24da60448cf24820af7947b85eb7208555ab7786..a8e34c456ce3f3f178ca66a278d= 06d1ab50dafc4 100644 --- a/drivers/media/platform/qcom/iris/iris_core.h +++ b/drivers/media/platform/qcom/iris/iris_core.h @@ -31,6 +31,7 @@ enum domain_type { }; =20 struct qcom_ubwc_cfg_data; +struct dentry; =20 /** * struct iris_core - holds core parameters valid for all instances @@ -65,7 +66,9 @@ struct qcom_ubwc_cfg_data; * @command_queue: shared interface queue to send commands to firmware * @message_queue: shared interface queue to receive responses from firmwa= re * @debug_queue: shared interface queue to receive debug info from firmware - * @lock: a lock for this strucure + * @root: debugfs root directory + * @fw_debug: firmware debug log mask + * @lock: a lock for this structure * @response_packet: a pointer to response packet from fw to driver * @header_id: id of packet header * @packet_id: id of packet @@ -110,6 +113,8 @@ struct iris_core { struct iris_iface_q_info command_queue; struct iris_iface_q_info message_queue; struct iris_iface_q_info debug_queue; + struct dentry *root; + u32 fw_debug; struct mutex lock; /* lock for core related operations */ u8 *response_packet; u32 header_id; diff --git a/drivers/media/platform/qcom/iris/iris_debugfs.c b/drivers/medi= a/platform/qcom/iris/iris_debugfs.c new file mode 100644 index 0000000000000000000000000000000000000000..6122b994ad0aa70c0c4f26ea4ce= 076f1b025f810 --- /dev/null +++ b/drivers/media/platform/qcom/iris/iris_debugfs.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#include + +#include "iris_core.h" +#include "iris_debugfs.h" + +static int iris_fw_level_get(void *data, u64 *val) +{ + struct iris_core *core =3D data; + + *val =3D READ_ONCE(core->fw_debug); + + return 0; +} + +static int iris_fw_level_set(void *data, u64 val) +{ + struct iris_core *core =3D data; + + WRITE_ONCE(core->fw_debug, (u32)val & IRIS_FW_DEBUG_LOGMASK); + + return 0; +} + +DEFINE_DEBUGFS_ATTRIBUTE(iris_fw_level_fops, iris_fw_level_get, + iris_fw_level_set, "0x%08llx\n"); + +void iris_debugfs_init(struct iris_core *core) +{ + core->root =3D debugfs_create_dir("iris", NULL); + debugfs_create_file("fw_level", 0600, core->root, core, + &iris_fw_level_fops); +} + +void iris_debugfs_deinit(struct iris_core *core) +{ + debugfs_remove(core->root); +} diff --git a/drivers/media/platform/qcom/iris/iris_debugfs.h b/drivers/medi= a/platform/qcom/iris/iris_debugfs.h new file mode 100644 index 0000000000000000000000000000000000000000..aa3cb97eb2b2e71dfe6a0db6ccf= d430256cdb6fa --- /dev/null +++ b/drivers/media/platform/qcom/iris/iris_debugfs.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#ifndef __IRIS_DEBUGFS_H__ +#define __IRIS_DEBUGFS_H__ + +struct iris_core; + +void iris_debugfs_init(struct iris_core *core); +void iris_debugfs_deinit(struct iris_core *core); + +#endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.c b/drivers/m= edia/platform/qcom/iris/iris_hfi_common.c index 8769ec61f11769e004945063381d9baddb302b06..d54394770740016852d5f46905f= e3b476ce094ad 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_common.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.c @@ -87,9 +87,44 @@ int iris_hfi_core_init(struct iris_core *core) if (ret) return ret; =20 + if (hfi_ops->sys_set_debug) { + ret =3D hfi_ops->sys_set_debug(core); + if (ret) + dev_warn(core->dev, + "failed to configure firmware debug logging: %d\n", + ret); + } + return hfi_ops->sys_interframe_powercollapse(core); } =20 +int iris_hfi_set_debug(struct iris_core *core) +{ + const struct iris_hfi_sys_ops *hfi_ops =3D core->hfi_sys_ops; + int ret =3D 0; + + if (!hfi_ops->sys_set_debug) + return 0; + + ret =3D pm_runtime_resume_and_get(core->dev); + if (ret < 0) + return ret; + + mutex_lock(&core->lock); + if (core->state !=3D IRIS_CORE_INIT) { + ret =3D 0; + goto unlock; + } + + ret =3D hfi_ops->sys_set_debug(core); + +unlock: + mutex_unlock(&core->lock); + pm_runtime_put_autosuspend(core->dev); + + return ret; +} + irqreturn_t iris_hfi_isr(int irq, void *data) { disable_irq_nosync(irq); diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/m= edia/platform/qcom/iris/iris_hfi_common.h index a27447eb2519962cb958b0e330a6d018310c3450..d8bc0862c54bd229d5751137525= 26d51e863e303 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h @@ -105,9 +105,18 @@ struct iris_hfi_prop_type_handle { int (*handle)(struct iris_inst *inst, u32 plane); }; =20 +#define IRIS_FW_DEBUG_LOW 0x00000001 +#define IRIS_FW_DEBUG_MEDIUM 0x00000002 +#define IRIS_FW_DEBUG_HIGH 0x00000004 +#define IRIS_FW_DEBUG_ERROR 0x00000008 +#define IRIS_FW_DEBUG_FATAL 0x00000010 +#define IRIS_FW_DEBUG_PERF 0x00000020 +#define IRIS_FW_DEBUG_LOGMASK 0x0fffffff + struct iris_hfi_sys_ops { int (*sys_init)(struct iris_core *core); int (*sys_image_version)(struct iris_core *core); + int (*sys_set_debug)(struct iris_core *core); int (*sys_interframe_powercollapse)(struct iris_core *core); int (*sys_pc_prep)(struct iris_core *core); =20 @@ -153,6 +162,7 @@ u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries= ); u32 iris_hfi_get_v4l2_transfer_char(u32 hfi_characterstics); u32 iris_hfi_get_v4l2_matrix_coefficients(u32 hfi_coefficients); int iris_hfi_core_init(struct iris_core *core); +int iris_hfi_set_debug(struct iris_core *core); int iris_hfi_pm_suspend(struct iris_core *core); int iris_hfi_pm_resume(struct iris_core *core); =20 diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index f6e9cbfccd09e4013e842c92c8272ddeb1b166d3..55e2fade62e0450b8ce5e5c928b= 746dcb6ef8387 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -53,6 +53,35 @@ static int iris_hfi_gen1_sys_image_version(struct iris_c= ore *core) return iris_hfi_queue_cmd_write_locked(core, &packet, packet.hdr.size); } =20 +static int iris_hfi_gen1_sys_set_debug(struct iris_core *core) +{ + struct hfi_sys_set_property_pkt *pkt; + struct hfi_debug_config *hfi; + u32 fw_debug; + u32 packet_size; + int ret; + + packet_size =3D struct_size(pkt, data, 1) + sizeof(*hfi); + pkt =3D kzalloc(packet_size, GFP_KERNEL); + if (!pkt) + return -ENOMEM; + + hfi =3D (struct hfi_debug_config *)&pkt->data[1]; + + pkt->hdr.size =3D packet_size; + pkt->hdr.pkt_type =3D HFI_CMD_SYS_SET_PROPERTY; + pkt->num_properties =3D 1; + pkt->data[0] =3D HFI_PROPERTY_SYS_DEBUG_CONFIG; + fw_debug =3D READ_ONCE(core->fw_debug) & IRIS_FW_DEBUG_LOGMASK; + hfi->config =3D fw_debug; + hfi->mode =3D fw_debug ? HFI_DEBUG_MODE_QUEUE : 0; + + ret =3D iris_hfi_queue_cmd_write_locked(core, pkt, pkt->hdr.size); + kfree(pkt); + + return ret; +} + static int iris_hfi_gen1_sys_interframe_powercollapse(struct iris_core *co= re) { struct hfi_sys_set_property_pkt *pkt; @@ -1149,6 +1178,7 @@ static struct iris_inst *iris_hfi_gen1_get_instance(v= oid) static const struct iris_hfi_sys_ops iris_hfi_gen1_sys_ops =3D { .sys_init =3D iris_hfi_gen1_sys_init, .sys_image_version =3D iris_hfi_gen1_sys_image_version, + .sys_set_debug =3D iris_hfi_gen1_sys_set_debug, .sys_interframe_powercollapse =3D iris_hfi_gen1_sys_interframe_powercolla= pse, .sys_pc_prep =3D iris_hfi_gen1_sys_pc_prep, =20 diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_defines.h index 275f3fea3d2aabe26a2a0498c78c09ec28765b24..c892e28058641a82ade1a0eb521= 02e133429ef7d 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h @@ -80,6 +80,13 @@ #define HFI_BUFFER_INTERNAL_SCRATCH_1 0x7 #define HFI_BUFFER_INTERNAL_SCRATCH_2 0x8 =20 +#define HFI_DEBUG_MODE_QUEUE 0x01 +struct hfi_debug_config { + u32 config; + u32 mode; +}; + +#define HFI_PROPERTY_SYS_DEBUG_CONFIG 0x1 #define HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL 0x5 #define HFI_PROPERTY_SYS_IMAGE_VERSION 0x6 =20 diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/dr= ivers/media/platform/qcom/iris/iris_hfi_gen1_response.c index bfd7495bf44f064091afb3245ec53cd18d323068..a446c1930fe58480eedb441be66= 12ba42a083093 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c @@ -674,16 +674,35 @@ static void iris_hfi_gen1_handle_response(struct iris= _core *core, void *response =20 static void iris_hfi_gen1_flush_debug_queue(struct iris_core *core, u8 *pa= cket) { - struct hfi_msg_sys_coverage_pkt *pkt; + struct hfi_msg_sys_debug_pkt *pkt; + struct hfi_pkt_hdr *hdr; + u32 log_size; + u8 *log; =20 while (!iris_hfi_queue_dbg_read(core, packet)) { - pkt =3D (struct hfi_msg_sys_coverage_pkt *)packet; + hdr =3D (struct hfi_pkt_hdr *)packet; =20 - if (pkt->hdr.pkt_type !=3D HFI_MSG_SYS_COV) { - struct hfi_msg_sys_debug_pkt *pkt =3D - (struct hfi_msg_sys_debug_pkt *)packet; + if (hdr->size <=3D sizeof(*hdr)) + continue; + + if (hdr->size >=3D IFACEQ_CORE_PKT_SIZE) + continue; + + if (hdr->pkt_type !=3D HFI_MSG_SYS_COV) { + pkt =3D (struct hfi_msg_sys_debug_pkt *)packet; + + if (hdr->size <=3D sizeof(*pkt)) + continue; + + log =3D pkt->msg_data; + log_size =3D hdr->size - sizeof(*pkt); + if (pkt->msg_size < log_size) + log_size =3D pkt->msg_size; =20 - dev_dbg(core->dev, "%s", pkt->msg_data); + if (pkt->msg_type & (IRIS_FW_DEBUG_ERROR | IRIS_FW_DEBUG_FATAL)) + dev_err_ratelimited(core->dev, "%.*s", (int)log_size, log); + else + dev_dbg(core->dev, "%.*s", (int)log_size, log); } } } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_command.c index 388a36ff2b07b7bcd8db21d4345bc900356b4ec3..cca3c2e8668802d45ff309928a7= 31b04a78a1bcc 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c @@ -17,6 +17,9 @@ #define SYS_IFPC_PKT_SIZE (sizeof(struct iris_hfi_header) + \ sizeof(struct iris_hfi_packet) + sizeof(u32)) =20 +#define SYS_DEBUG_PKT_SIZE (sizeof(struct iris_hfi_header) + \ + 2 * (sizeof(struct iris_hfi_packet) + sizeof(u32))) + #define SYS_NO_PAYLOAD_PKT_SIZE (sizeof(struct iris_hfi_header) + \ sizeof(struct iris_hfi_packet)) =20 @@ -54,6 +57,23 @@ static int iris_hfi_gen2_sys_image_version(struct iris_c= ore *core) return ret; } =20 +static int iris_hfi_gen2_sys_set_debug(struct iris_core *core) +{ + struct iris_hfi_header *hdr; + int ret; + + hdr =3D kzalloc(SYS_DEBUG_PKT_SIZE, GFP_KERNEL); + if (!hdr) + return -ENOMEM; + + iris_hfi_gen2_packet_set_debug(core, hdr); + ret =3D iris_hfi_queue_cmd_write_locked(core, hdr, hdr->size); + + kfree(hdr); + + return ret; +} + static int iris_hfi_gen2_sys_interframe_powercollapse(struct iris_core *co= re) { struct iris_hfi_header *hdr; @@ -1391,6 +1411,7 @@ static struct iris_inst *iris_hfi_gen2_get_instance(v= oid) static const struct iris_hfi_sys_ops iris_hfi_gen2_sys_ops =3D { .sys_init =3D iris_hfi_gen2_sys_init, .sys_image_version =3D iris_hfi_gen2_sys_image_version, + .sys_set_debug =3D iris_hfi_gen2_sys_set_debug, .sys_interframe_powercollapse =3D iris_hfi_gen2_sys_interframe_powercolla= pse, .sys_pc_prep =3D iris_hfi_gen2_sys_pc_prep, =20 diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_defines.h index f43aea10090d8f1d6ae5c20547e5f6321b2ca203..1d4ded82ecdac6e4af9fdd11460= 158682d27fbf3 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -39,6 +39,9 @@ #define HFI_PROP_UBWC_BANK_SWZL_LEVEL2 0x03000007 #define HFI_PROP_UBWC_BANK_SWZL_LEVEL3 0x03000008 #define HFI_PROP_UBWC_BANK_SPREADING 0x03000009 +#define HFI_PROP_DEBUG_CONFIG 0x0300000a +#define HFI_PROP_DEBUG_LOG_LEVEL 0x0300000b +#define HFI_DEBUG_CONFIG_DEFAULT 0x00000000 #define HFI_PROP_CODEC 0x03000100 #define HFI_PROP_COLOR_FORMAT 0x03000101 #define HFI_PROP_BITSTREAM_RESOLUTION 0x03000103 diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.c index 0d05dd2afc07d830cc8502ab5f28001312991ba8..2dbe57b87fd3c3198d183c32be9= 12797cf36de39 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c @@ -226,6 +226,35 @@ void iris_hfi_gen2_packet_image_version(struct iris_co= re *core, struct iris_hfi_ NULL, 0); } =20 +void iris_hfi_gen2_packet_set_debug(struct iris_core *core, struct iris_hf= i_header *hdr) +{ + u32 fw_debug; + u32 payload; + + iris_hfi_gen2_create_header(hdr, 0, core->header_id++); + + payload =3D HFI_DEBUG_CONFIG_DEFAULT; + iris_hfi_gen2_create_packet(hdr, + HFI_PROP_DEBUG_CONFIG, + HFI_HOST_FLAGS_NONE, + HFI_PAYLOAD_U32_ENUM, + HFI_PORT_NONE, + core->packet_id++, + &payload, + sizeof(u32)); + + fw_debug =3D READ_ONCE(core->fw_debug) & IRIS_FW_DEBUG_LOGMASK; + payload =3D fw_debug; + iris_hfi_gen2_create_packet(hdr, + HFI_PROP_DEBUG_LOG_LEVEL, + HFI_HOST_FLAGS_NONE, + HFI_PAYLOAD_U32_ENUM, + HFI_PORT_NONE, + core->packet_id++, + &payload, + sizeof(u32)); +} + void iris_hfi_gen2_packet_session_command(struct iris_inst *inst, u32 pkt_= type, u32 flags, u32 port, u32 session_id, u32 payload_type, void *payload, diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.h index 25b9582349ca1a0ce6efc0b146a3abb798485c45..aff025fbf5eadbedbf0108b41b6= f9bf418d4f779 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h @@ -111,6 +111,7 @@ u32 iris_hfi_gen2_get_color_info(u32 matrix_coeff, u32 = transfer_char, u32 primar =20 void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi= _header *hdr); void iris_hfi_gen2_packet_image_version(struct iris_core *core, struct iri= s_hfi_header *hdr); +void iris_hfi_gen2_packet_set_debug(struct iris_core *core, struct iris_hf= i_header *hdr); void iris_hfi_gen2_packet_session_command(struct iris_inst *inst, u32 pkt_= type, u32 flags, u32 port, u32 session_id, u32 payload_type, void *payload, diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/dr= ivers/media/platform/qcom/iris/iris_hfi_gen2_response.c index 8c2644c7f6e85983d7ad7584fc0cb570e4813ae4..c845e5e6de50b75237cb829d35b= eb988f3b3d367 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c @@ -991,20 +991,24 @@ static int iris_hfi_gen2_handle_response(struct iris_= core *core, void *response) static void iris_hfi_gen2_flush_debug_queue(struct iris_core *core, u8 *pa= cket) { struct hfi_debug_header *pkt; + u32 log_size; u8 *log; =20 while (!iris_hfi_queue_dbg_read(core, packet)) { pkt =3D (struct hfi_debug_header *)packet; =20 - if (pkt->size < sizeof(*pkt)) + if (pkt->size <=3D sizeof(*pkt) + 1) continue; =20 if (pkt->size >=3D IFACEQ_CORE_PKT_SIZE) continue; =20 - packet[pkt->size] =3D '\0'; log =3D (u8 *)packet + sizeof(*pkt) + 1; - dev_dbg(core->dev, "%s", log); + log_size =3D pkt->size - sizeof(*pkt) - 1; + if (pkt->debug_level & (IRIS_FW_DEBUG_ERROR | IRIS_FW_DEBUG_FATAL)) + dev_err_ratelimited(core->dev, "%.*s", (int)log_size, log); + else + dev_dbg(core->dev, "%.*s", (int)log_size, log); } } =20 diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/= platform/qcom/iris/iris_probe.c index e4acf4a74f944bcae83089ef5489f204d4b0078e..8bc94acc4f58ce7792ddaeaad03= 6475c476d5c36 100644 --- a/drivers/media/platform/qcom/iris/iris_probe.c +++ b/drivers/media/platform/qcom/iris/iris_probe.c @@ -12,6 +12,7 @@ #include #include =20 +#include "iris_debugfs.h" #include "iris_core.h" #include "iris_ctrls.h" #include "iris_vidc.h" @@ -207,6 +208,8 @@ static void iris_remove(struct platform_device *pdev) =20 v4l2_device_unregister(&core->v4l2_dev); =20 + iris_debugfs_deinit(core); + mutex_destroy(&core->lock); } =20 @@ -230,6 +233,7 @@ static int iris_probe(struct platform_device *pdev) if (!core) return -ENOMEM; core->dev =3D dev; + core->fw_debug =3D IRIS_FW_DEBUG_ERROR | IRIS_FW_DEBUG_FATAL; =20 core->state =3D IRIS_CORE_DEINIT; mutex_init(&core->lock); @@ -298,6 +302,8 @@ static int iris_probe(struct platform_device *pdev) if (ret) goto err_vdev_unreg_enc; =20 + iris_debugfs_init(core); + return 0; =20 err_vdev_unreg_enc: diff --git a/drivers/media/platform/qcom/iris/iris_vb2.c b/drivers/media/pl= atform/qcom/iris/iris_vb2.c index a2ea2d67f60d05bc0dceb097f94a4f80199b0618..e4b874a7119fd05669e49e66efc= 3c0e3a0feb314 100644 --- a/drivers/media/platform/qcom/iris/iris_vb2.c +++ b/drivers/media/platform/qcom/iris/iris_vb2.c @@ -127,7 +127,9 @@ int iris_vb2_queue_setup(struct vb2_queue *q, goto unlock; =20 if (!inst->once_per_session_set) { - inst->once_per_session_set =3D true; + ret =3D iris_hfi_set_debug(core); + if (ret) + dev_warn(core->dev, "failed to set firmware debug level: %d\n", ret); =20 ret =3D inst->hfi_session_ops->session_open(inst); if (ret) { @@ -136,6 +138,8 @@ int iris_vb2_queue_setup(struct vb2_queue *q, goto unlock; } =20 + inst->once_per_session_set =3D true; + ret =3D iris_inst_change_state(inst, IRIS_INST_INIT); if (ret) goto unlock; --- base-commit: 28d012efb4327f9c75d5e042a7c91e9a542efa98 change-id: 20260815-media-qcom-iris-fw-log-3b62b8645b7a Best regards, --=20 Renjiang Han