From mboxrd@z Thu Jan 1 00:00:00 1970 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 940D0369216 for ; Mon, 23 Feb 2026 19:10:16 +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=1771873818; cv=none; b=keLZYDph42vtJE3VQB5zTpkZYyFltwwxQgn1W40EaVk8/y3aGhN6pZk75gTkIdpoMdOLT90suZyOsnCeXrlR2aatX4GmHVsk+uB3iTNjIEESCplZAl6R/bFiXrM0Ea8bojsR1oQ5rMPrxte3+MD+/wq8h8ai0tO21dmoDsrPDzs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771873818; c=relaxed/simple; bh=eflhBKeXg5zwxShiL+GaVvttYv9N4fOm9mLw1I2A+H0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B6UhH4IiNr+/MTOVn/Ne9zt7b1MCIZAGnHqExqleaxO8L7mQl1ku1s1FPxfJ/JaydmIgS8MtL5PCWlBXMzaWzg5fQxtdOZ545Kk4gQrm7PpPtgIcckC/ObfdoQ5c1VI8TQt3COmJFEKxcrQnHx1xJOkPtOud7NrZJBrCbwRxWaA= 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=neotoJCg; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ehXR7KQu; 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="neotoJCg"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ehXR7KQu" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61NI3RFZ536337 for ; Mon, 23 Feb 2026 19:10:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= fD0JqupCszokMNr/tteqmbM/hp6vcwvxufewpyUQwKQ=; b=neotoJCgxz1Qc9dM Q45RYB0v+pAkJHn//z12naDQwQxnAf7z/aAe939zG5kG6aS1WnjGZopw5NFerlSk /rk5qCjcb4dJ9at47aMuc6wekdDCU1fvrKCGfSUrgL8xcdmuVRxZMb6hrWj2cjj2 jJSI+At3e/oLYB1t0NiL8Bf5G1w5iPZFFJVUoEhKkjdJK9hzewrarM9yZc9niNNj y/8N5Zk/eXYlKlVaetNbLoM50ena0zUyON+6R4qdwwhmytvjJ+JoTgZUiuKtMIkP 0CapXAOBT9pS57mUWZAQxk1OrXGyZIJONvWlBxcol1kyyHubox+bmooXsRZFnaJK n8A1uQ== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cgn7t9m8k-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 23 Feb 2026 19:10:15 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2a92a3f5de9so25837365ad.2 for ; Mon, 23 Feb 2026 11:10:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1771873815; x=1772478615; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fD0JqupCszokMNr/tteqmbM/hp6vcwvxufewpyUQwKQ=; b=ehXR7KQuhvTTBeOXGEjCys91B7s6a0pHIEnfZm+ufZVUajp+ewMEcwdXL6iBXVNPbu N3NX9Qq7e0+hpCLhJyrpt/pi2D9SFamuztfk+p4b6L5+mehtM5lMECB6dS2AgbFnbwDv JtJhVPYrtyKRFBXg7eDlvPBm2Ax5Dq2Pj+tNz3I6fg8psXoYDrMoQrfIG96lX7hBMkEP 3P+/Z+71pWaYZUzbcpdN7p6OaNGBa2IBqjTDFiA2IHvd/hqS/vDqV+8S/N6p1lOx25q+ q1K8ZYMeDKApUt2bB/Q8K7vWuPLWjW1RBK2bcbEILxiQWTsRm8BFuHEeTKcQ0ff4A2MP 3F0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771873815; x=1772478615; h=cc:to:in-reply-to:references: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=fD0JqupCszokMNr/tteqmbM/hp6vcwvxufewpyUQwKQ=; b=HcdKnrxzNmeyF/DT6XOG9t2QNL83AVURWGI437qrbnIBf+eHva2WZGurpOvm3wobB1 JGwdZP34wmJeDDSBKdqMhhhfv2dn9X1uqo0mnZTf0Qv1PI3/HxGHcxvJ9Sqy7xHD0LTM IingchZv3GM+e6iee3YDMMbrBNVGFaDBD8YsDB49Gpe4o2OQyCAhrpGtdis7JtJIdT04 Eyllh+9h/pI+vj+YXJLWL+7KYzYYW/QALBJqNq/PU/wVFlr2PUsAh7AybebBHk0E2xEx eVO/OmCbFPyxq0ANVwzW1f/DKlhGf1LaPObcC69eiLtiUCnlqU2nOj609ptYobPYzHLp /ghQ== X-Forwarded-Encrypted: i=1; AJvYcCV8bAEw7j7RBZ7ozn4pEugz8HUEtZk0oRKCECo5yyZEJubtiLTzD/t2mBu0/+dF5VrgOYe8ro/ooho4x9s=@vger.kernel.org X-Gm-Message-State: AOJu0YwjBip5HYU6GkjjOKM4NyvUg28r9PwRVKxqDkip8PxayBw4LwZZ GJmPxPnGrDP7K+ndHh9qm0HxbTU1KET7LTRQFx3GjYF40tOb6wd40Uj4sPI0bhsg7jYgJLKGdRX m2PLLcvraCvG2a3Z6JArOpHFax4dDWvOBgMTdRXOuD99OtAPY/jsxhSJmVqlGAlYokFI= X-Gm-Gg: ATEYQzxECj9qgHNKAQ0Vr0W5Xi9gsKlgbm15E6X7HU/6Hd3/WxENLnzDOaa2UiQ6eRD Kh/U5bwkp8P9zov9GujqFgkJM8ik8lgxr5qlzLoTg7mzAh8q4XGbsl1NEo2c3dWZYWtY5rMdM+s cqgtDvk3/2gotbMYJwSKvQsA51+k98T33MlU7c96SJ4flKvteifDtudIx/V3Jj117JGx7QkgQhm KJ/5o9D0AR74bWN7I9mD0dTfpgmd6YLHR0flFdHloL+YtWtDHJOBCeskF+R/5P4Ichao7Mo5DVI 6o5vvoeIbAtiY/wu7OUJQQsiTNPie8zUouYdZEJ9ot5TqXhcYAMU1+3QBNNX1tPbbOqNbKlKaUQ V/ujkd8oEzwxt3YePF38L0aYoZdl5M2uX6eaJsotCy/Zqxy2jBVpzOw== X-Received: by 2002:a17:902:ce0e:b0:299:e031:173 with SMTP id d9443c01a7336-2ad744e0f75mr96633005ad.35.1771873814488; Mon, 23 Feb 2026 11:10:14 -0800 (PST) X-Received: by 2002:a17:902:ce0e:b0:299:e031:173 with SMTP id d9443c01a7336-2ad744e0f75mr96632635ad.35.1771873813959; Mon, 23 Feb 2026 11:10:13 -0800 (PST) Received: from hu-ekangupt-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ad74e34e18sm83501505ad.10.2026.02.23.11.10.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 11:10:12 -0800 (PST) From: Ekansh Gupta Date: Tue, 24 Feb 2026 00:39:01 +0530 Subject: [PATCH RFC 07/18] accel/qda: Add DRM accel device registration for QDA driver 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: 7bit Message-Id: <20260224-qda-firstpost-v1-7-fe46a9c1a046@oss.qualcomm.com> References: <20260224-qda-firstpost-v1-0-fe46a9c1a046@oss.qualcomm.com> In-Reply-To: <20260224-qda-firstpost-v1-0-fe46a9c1a046@oss.qualcomm.com> To: Oded Gabbay , Jonathan Corbet , Shuah Khan , Joerg Roedel , Will Deacon , Robin Murphy , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, iommu@lists.linux.dev, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, Srinivas Kandagatla , Dmitry Baryshkov , Bharath Kumar , Chenna Kesava Raju , Ekansh Gupta X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1771873753; l=8182; i=ekansh.gupta@oss.qualcomm.com; s=20260223; h=from:subject:message-id; bh=eflhBKeXg5zwxShiL+GaVvttYv9N4fOm9mLw1I2A+H0=; b=BhxckZcN/OtS9rXcw34lRFsN71y8kr2IKGaSslRspRMkvDtNq/DG+ssbzCenfyQVMQMZh6zGt y3aGCpGgyOyCJanPJPw7P061BJPRJLydGxTVXmRz2lS2TbdWeizB3TC X-Developer-Key: i=ekansh.gupta@oss.qualcomm.com; a=ed25519; pk=n0SepARizye+pYjhjg1RA5J+Nq4+IJbyRcBybU+/ERQ= X-Authority-Analysis: v=2.4 cv=c5OmgB9l c=1 sm=1 tr=0 ts=699ca617 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=rdCUcgxLdif9O8q6BpAA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 X-Proofpoint-GUID: K7CYZLyca2KjMxiQutpVDKd6ElytuRMu X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjIzMDE2NiBTYWx0ZWRfX/UI2ogGW9LRr v97F6hT63JSv3Bn3B/wuNx2UmJmCnhvPkRKIWhUq4FUq3Lckfsgr5q+P6tVLjplcluhh8+se4az MlFNkBXBMp/hADIKgomaEUOA7kjeW6+C1AmS7VBmy7R0bt6ilZaipGeYN7lj5QJbeLrV8iGYCoa 85vVYhQplMxhSqG1tVRVCvGTuUKXdTeVB37h1pcvQWTTVH6tcs4iZvlEwK5L+dyd7O+/RvZM8hS Etv1lyDbkkFNIp/mMORR47z0Qrt9mduBXoEiMeHapsqgMqkuhJiiMJkV3m7W+cwvylsE22TiqGa hDaZMvcJgVJBdiS+tzcynkPtbTipCqiDaBhh7GCQHYjnvKBtvVYrDTj3TRufTf+wvrGhZn7m8rA Dyoh9giuWwRpkalGgYrFBumh4ZCBvcKX1QhjGSVvmXNLFhgxCm0eW7OXlNo/kPUr+1htCyE1w7e Eata4f70Jg7CbrFNtMg== X-Proofpoint-ORIG-GUID: K7CYZLyca2KjMxiQutpVDKd6ElytuRMu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-23_04,2026-02-23_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 bulkscore=0 spamscore=0 suspectscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230166 Add DRM accel integration for the QDA DSP accelerator driver. A new qda_drm_priv structure is introduced to hold per-device DRM state, including a pointer to the memory manager and the parent qda_dev instance. The driver now allocates a drm_device, initializes driver-private state, and registers the device via the DRM accel infrastructure. qda_register_device() performs allocation and registration of the DRM device, while qda_unregister_device() handles device teardown and releases references using drm_dev_unregister() and drm_dev_put(). Initialization and teardown paths are updated so DRM resources are allocated after IOMMU/memory-manager setup and cleaned during RPMsg remove. This patch lays the foundation for adding GEM buffer support and IOCTL handling in later patches as part of the compute accelerator interface. Signed-off-by: Ekansh Gupta --- drivers/accel/qda/qda_drv.c | 103 ++++++++++++++++++++++++++++++++++++++++++ drivers/accel/qda/qda_drv.h | 33 +++++++++++++- drivers/accel/qda/qda_rpmsg.c | 8 ++++ 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/drivers/accel/qda/qda_drv.c b/drivers/accel/qda/qda_drv.c index 69132737f964..a9113ec78fa2 100644 --- a/drivers/accel/qda/qda_drv.c +++ b/drivers/accel/qda/qda_drv.c @@ -4,9 +4,31 @@ #include #include #include +#include +#include +#include +#include +#include #include "qda_drv.h" #include "qda_rpmsg.h" +DEFINE_DRM_ACCEL_FOPS(qda_accel_fops); + +static struct drm_driver qda_drm_driver = { + .driver_features = DRIVER_COMPUTE_ACCEL, + .fops = &qda_accel_fops, + .name = DRIVER_NAME, + .desc = "Qualcomm DSP Accelerator Driver", +}; + +static void cleanup_drm_private(struct qda_dev *qdev) +{ + if (qdev->drm_priv) { + qda_dbg(qdev, "Cleaning up DRM private data\n"); + kfree(qdev->drm_priv); + } +} + static void cleanup_iommu_manager(struct qda_dev *qdev) { if (qdev->iommu_mgr) { @@ -24,6 +46,7 @@ static void cleanup_device_resources(struct qda_dev *qdev) void qda_deinit_device(struct qda_dev *qdev) { + cleanup_drm_private(qdev); cleanup_iommu_manager(qdev); cleanup_device_resources(qdev); } @@ -59,6 +82,18 @@ static int init_memory_manager(struct qda_dev *qdev) return 0; } +static int init_drm_private(struct qda_dev *qdev) +{ + qda_dbg(qdev, "Initializing DRM private data\n"); + + qdev->drm_priv = kzalloc_obj(*qdev->drm_priv, GFP_KERNEL); + if (!qdev->drm_priv) + return -ENOMEM; + + qda_dbg(qdev, "DRM private data initialized successfully\n"); + return 0; +} + int qda_init_device(struct qda_dev *qdev) { int ret; @@ -71,14 +106,82 @@ int qda_init_device(struct qda_dev *qdev) goto err_cleanup_resources; } + ret = init_drm_private(qdev); + if (ret) { + qda_err(qdev, "DRM private data initialization failed: %d\n", ret); + goto err_cleanup_iommu; + } + qda_dbg(qdev, "QDA device initialized successfully\n"); return 0; +err_cleanup_iommu: + cleanup_iommu_manager(qdev); err_cleanup_resources: cleanup_device_resources(qdev); return ret; } +static int setup_and_register_drm_device(struct qda_dev *qdev) +{ + struct drm_device *ddev; + int ret; + + qda_dbg(qdev, "Setting up and registering DRM device\n"); + + ddev = drm_dev_alloc(&qda_drm_driver, qdev->dev); + if (IS_ERR(ddev)) { + ret = PTR_ERR(ddev); + qda_err(qdev, "Failed to allocate DRM device: %d\n", ret); + return ret; + } + + qdev->drm_priv->drm_dev = ddev; + qdev->drm_priv->iommu_mgr = qdev->iommu_mgr; + qdev->drm_priv->qdev = qdev; + + ddev->dev_private = qdev->drm_priv; + qdev->drm_dev = ddev; + + ret = drm_dev_register(ddev, 0); + if (ret) { + qda_err(qdev, "Failed to register DRM device: %d\n", ret); + drm_dev_put(ddev); + return ret; + } + + qda_dbg(qdev, "DRM device registered successfully\n"); + return 0; +} + +int qda_register_device(struct qda_dev *qdev) +{ + int ret; + + ret = setup_and_register_drm_device(qdev); + if (ret) { + qda_err(qdev, "DRM device setup failed: %d\n", ret); + return ret; + } + + qda_dbg(qdev, "QDA device registered successfully\n"); + return 0; +} + +void qda_unregister_device(struct qda_dev *qdev) +{ + qda_info(qdev, "Unregistering QDA device\n"); + + if (qdev->drm_dev) { + qda_dbg(qdev, "Unregistering DRM device\n"); + drm_dev_unregister(qdev->drm_dev); + drm_dev_put(qdev->drm_dev); + qdev->drm_dev = NULL; + } + + qda_dbg(qdev, "QDA device unregistered successfully\n"); +} + static int __init qda_core_init(void) { int ret; diff --git a/drivers/accel/qda/qda_drv.h b/drivers/accel/qda/qda_drv.h index 2cb97e4eafbf..2b80401a3741 100644 --- a/drivers/accel/qda/qda_drv.h +++ b/drivers/accel/qda/qda_drv.h @@ -11,13 +11,35 @@ #include #include #include +#include +#include +#include +#include #include "qda_memory_manager.h" /* Driver identification */ #define DRIVER_NAME "qda" +/** + * struct qda_drm_priv - DRM device private data for QDA device + * + * This structure serves as the DRM device private data (stored in dev_private), + * bridging the DRM device context with the QDA device and providing access to + * shared resources like the memory manager during buffer operations. + */ +struct qda_drm_priv { + /* DRM device structure */ + struct drm_device *drm_dev; + /* Global memory/IOMMU manager */ + struct qda_memory_manager *iommu_mgr; + /* Back-pointer to qda_dev */ + struct qda_dev *qdev; +}; + /* struct qda_dev - Main device structure for QDA driver */ struct qda_dev { + /* DRM device for accelerator interface */ + struct drm_device *drm_dev; /* RPMsg device for communication with remote processor */ struct rpmsg_device *rpdev; /* Underlying device structure */ @@ -26,6 +48,8 @@ struct qda_dev { struct mutex lock; /* IOMMU/memory manager */ struct qda_memory_manager *iommu_mgr; + /* DRM device private data */ + struct qda_drm_priv *drm_priv; /* Flag indicating device removal in progress */ atomic_t removing; /* Name of the DSP (e.g., "cdsp", "adsp") */ @@ -39,8 +63,8 @@ struct qda_dev { * @qdev: QDA device structure * * Returns the most appropriate device structure for logging messages. - * Prefers qdev->dev, or returns NULL if the device is being removed - * or invalid. + * Prefers qdev->dev, falls back to qdev->drm_dev->dev, or returns NULL + * if the device is being removed or invalid. */ static inline struct device *qda_get_log_device(struct qda_dev *qdev) { @@ -50,6 +74,9 @@ static inline struct device *qda_get_log_device(struct qda_dev *qdev) if (qdev->dev) return qdev->dev; + if (qdev->drm_dev) + return qdev->drm_dev->dev; + return NULL; } @@ -93,5 +120,7 @@ static inline struct device *qda_get_log_device(struct qda_dev *qdev) */ int qda_init_device(struct qda_dev *qdev); void qda_deinit_device(struct qda_dev *qdev); +int qda_register_device(struct qda_dev *qdev); +void qda_unregister_device(struct qda_dev *qdev); #endif /* __QDA_DRV_H__ */ diff --git a/drivers/accel/qda/qda_rpmsg.c b/drivers/accel/qda/qda_rpmsg.c index 5a57384de6a2..b2b44b4d3ca8 100644 --- a/drivers/accel/qda/qda_rpmsg.c +++ b/drivers/accel/qda/qda_rpmsg.c @@ -80,6 +80,7 @@ static void qda_rpmsg_remove(struct rpmsg_device *rpdev) qdev->rpdev = NULL; mutex_unlock(&qdev->lock); + qda_unregister_device(qdev); qda_unpopulate_child_devices(qdev); qda_deinit_device(qdev); @@ -123,6 +124,13 @@ static int qda_rpmsg_probe(struct rpmsg_device *rpdev) return ret; } + ret = qda_register_device(qdev); + if (ret) { + qda_deinit_device(qdev); + qda_unpopulate_child_devices(qdev); + return ret; + } + qda_info(qdev, "QDA RPMsg probe completed successfully for %s\n", qdev->dsp_name); return 0; } -- 2.34.1