From mboxrd@z Thu Jan 1 00:00:00 1970 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 3E7492C326D for ; Mon, 17 Aug 2026 04:48:40 +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=1786942122; cv=none; b=lZsCpNwvCdLLgW9b1TAqcOgv/7qDVn9elw4HKi3W6u2NbHoASGjZiu8OuoUYwp7MDmLpSd6PNKbvDo7RS8fvtZMV5bnSyeJ4szHNiAybBs8KE1IKq8gLau1jkoi8dHLSJH4pE/lJWazAvpZI06tixkhetBX0TSqEaG6eExQJW7I= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786942122; c=relaxed/simple; bh=vyyAKW+sDxkJvnWkRtGMDfJQbird7CY22fXpG75dfI8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QYNH3Nba9TH8GZ5QfV0E1eUxgRgMyNVkLagNsxsKMsUPfMCeEj2IYbVCDY+8YpCaeJQZRLw7YFwBmN8Aj0lMRi9BTS21pNT3aasSpgiJzm+WDaU5eSNf12URV5nKbBvnbUCd6gXsI2f4ksyYlk2yjqfkQpzVkB8OiZvMNPevPqY= 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=jBMwGdK9; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Rq21t6/X; 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="jBMwGdK9"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Rq21t6/X" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67GLDIeb1386359 for ; Mon, 17 Aug 2026 04:48:39 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= gnJNXuCmyusrhVQ5qCCdytU60hZXzPi/toGazcunr3U=; b=jBMwGdK9HwDpevJ+ rux7M8rbogOqak+z1h8o0F/65/2ZWH1ceAO30uzQBJUSrdJXjjM4Rn15gqkkwBfx 2KNRpNz8UDNVWf67s5UhXkTS+lauL2K3oI++tWL6uGOynfDxyzG477686ru+x27J X3To5VgsZehwbqBVQHiwd5DFmyF2uE+2OkF/unhanTD1bPSuID4fuqqnG5lp7s2N haqkZmFX8ATkcodAvMgIrXLtfdt7vjm4xQtI5/y4uJVuYWgODthskV7DKDGI6z9b iy5pmHWIS7c8miVAMaqcWfHjYzAQTnUCHT+54C/fOceqcRZ1JbMNgprII9qEFbKZ h8Bthw== Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g3mx4rudu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 17 Aug 2026 04:48:39 +0000 (GMT) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-848662cd2a1so3189437b3a.2 for ; Sun, 16 Aug 2026 21:48:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1786942119; x=1787546919; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=gnJNXuCmyusrhVQ5qCCdytU60hZXzPi/toGazcunr3U=; b=Rq21t6/XBunQPzpQXMU436910dE1ZI2LLam8oIRhIva7UiUcO4yu1SYbmFpbZN6Uij jPk8yWsEipuX+BedbBwuEIrLIWd7pzZsGECguCfaNjOSgjScOcarLtJ1WOBn8cKSC766 /m8d+XjmmbImb4BaXHnv9GKG9fNnTb9ZRZ+ZLtDrV7mVm9+7ZS9+8kKcy2nygwELAuSY cO/i71CIOkDmCW6sItw+P12CfQiFKuQBdO84RYKhND07Ct6O6XTmYge3OqPZ3BVHD1jv sHCd/Gm4tctQilCX7YCU74wHnk4QcgLhgT5tzUxCZEVHOx/VAslL/BuDFRSYQF+o8ujP UDuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786942119; x=1787546919; h=cc:to:in-reply-to:references: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=gnJNXuCmyusrhVQ5qCCdytU60hZXzPi/toGazcunr3U=; b=cRTBD1TKzRhz16DwITEsUJL76Y71/5NlN4l8ligusXo7IDtB3Lr+iLSalSaOR3ml4g etttU9vwGz6nkFnF3npTGu/xwAUlk7B5PaV9jsKp/K0FenPqw5ZTPCW+78PGrK08dnhu Lj+7HisxTZQromyZ7qNs+xOdZIutcU9Gq8ffK7BiE9XIiqoG4QgFIHXYMDE3WxWmOETE cUL7ot6Gt9XrDFXePPjv4VBVgUK1CX1EV8odg+qwijIPrWDeqPyVN3K4Z3X9TrVRP8R2 WVmn3X2kTbaZsXuCLezc5I5CGYEt5dbq0RWiFBbNOxK2seR5uDrb6KWFVElI10diyqWO X9gg== X-Forwarded-Encrypted: i=1; AHgh+RrvRL6cjyKmycEbMYX82MbD8KKc9OxZRbIrvvcNGq4OEhPx/6WbLDSSMJudDkw2hYSG7yaKNtXDDlkY4XY=@vger.kernel.org X-Gm-Message-State: AOJu0YxVPomW/E9kB0pvevzFzHRQs/74ca/cbz+NqvUMyGFIMyuSRJ5D XqyFb67BTzInxhTW+sILea344ajjKT7bnYDHSJan8evVLsto3qcrZM+LHUqVRig8+FlOTW1F6FW NkmIPEHkyBr6OIxUYYNKxTw4VCGILwpK5UGTjP2SJndeXMrIl6q6Ex1Bq5ujos1yQCnw= X-Gm-Gg: AR+sD129djN2YZf/EM9QKxnqFG9qPwsLxkpG1ugwp/0X+lgHJg3br5ybkoekiiA6OLo mGDBowMJ7ukmM2/4jiKB2LomKPBBo1gsZ9rv5TtVJtTYjSB/hFPG0Onxa9lBDhPC3X6L7EEjjMS H/1LzoDMvvl6DbFoNnP6LidDpec/XKcES+KXJFbIonN6O88B70aK2/9FfOlS8AKkGQ1PjOYw6ZE 0gs/z1SfV7tMKxnr43rRrsAXuSO6IT/r6y2MEi9P6L5YO2myXOv/kK9NjRajKVrrgXinQb+aOdO H3n8il2G8pzWLUy/hxmJZCX1W62HQELtWw3NSXSgXQFL0/tIbVMnFHeZM9tUzaSMkplNm/vLpjK egUgWS4fP4Gv8kjCzD6N/48+hF0pgQJk8 X-Received: by 2002:a05:6a00:32c3:b0:847:881c:7026 with SMTP id d2e1a72fcca58-84fde1501cemr21344762b3a.3.1786942118790; Sun, 16 Aug 2026 21:48:38 -0700 (PDT) X-Received: by 2002:a05:6a00:32c3:b0:847:881c:7026 with SMTP id d2e1a72fcca58-84fde1501cemr21344741b3a.3.1786942118322; Sun, 16 Aug 2026 21:48:38 -0700 (PDT) Received: from hu-ekangupt-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-8517d046638sm2149250b3a.27.2026.08.16.21.48.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 16 Aug 2026 21:48:37 -0700 (PDT) From: Ekansh Gupta Date: Mon, 17 Aug 2026 10:17:41 +0530 Subject: [PATCH v2 06/15] accel/qda: Create compute context bank devices on QDA compute bus 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: <20260817-qda-v2-v2-6-69a02e9090d4@oss.qualcomm.com> References: <20260817-qda-v2-v2-0-69a02e9090d4@oss.qualcomm.com> In-Reply-To: <20260817-qda-v2-v2-0-69a02e9090d4@oss.qualcomm.com> To: Oded Gabbay , Jonathan Corbet , Shuah Khan , Randy Dunlap , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , "Joerg Roedel (AMD)" , Will Deacon , Robin Murphy , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: Bharath Kumar , Chenna Kesava Raju , srinivas.kandagatla@oss.qualcomm.com, dmitry.baryshkov@oss.qualcomm.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-arm-msm@vger.kernel.org, llvm@lists.linux.dev, iommu@lists.linux.dev, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, Ekansh Gupta X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1786942058; l=7659; i=ekansh.gupta@oss.qualcomm.com; s=20260223; h=from:subject:message-id; bh=vyyAKW+sDxkJvnWkRtGMDfJQbird7CY22fXpG75dfI8=; b=9iSkBuK0+IvRZzeuUuxCA3txvr7RXBv9HocPubw7VSQhNZIb23asi+VU2A7GF556vKccuuFT5 CEcv2JEnaPyDLM5cvWl2HDbdbG6+lkEv61S+iefHgPM0Vj8R3WH6BDD X-Developer-Key: i=ekansh.gupta@oss.qualcomm.com; a=ed25519; pk=n0SepARizye+pYjhjg1RA5J+Nq4+IJbyRcBybU+/ERQ= X-Proofpoint-ORIG-GUID: _WiMDQCZwW6zjc8E2ky_RWor9EomgBFw X-Proofpoint-Spam-Info: AW1haW4tMjYwODE3MDAzMyBTYWx0ZWRfX0NK7AbuFX5MD 1xATx1bhqUoqNiAx+tXm++GsMebB4VvgESU9pW1xuNN/jQlpPXshbJl80XNn/a9aAbq7AtOilyz E5vSsGKmf/lhbDjttxX7zIP9bIafO60= X-Proofpoint-GUID: _WiMDQCZwW6zjc8E2ky_RWor9EomgBFw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE3MDAzMyBTYWx0ZWRfX0hR7JRloua3t ZuqI6+F+6lALMFvlng3OYjvRIoEKe3pvHIoqkK/Dac2ghM2obWxjdP+sG0S+BsqHC3zlOnM2Sow URnRi2cjReF0uKYr/2ZV4nQbDzyOsg5qk151ePbxD47z+1q/R1GLEWe3uSAjmGLZkogUsU+Hv7x cnSK1Xfr42lvMZ3sghYbsVJW4CuaEYGMeyahwqXFSxpdAtzX1GRsOWjJ9cx1EtcjZ5LPq07ozy7 vDOKfaYZnn6iV18MUF8CuItJo3aRlvxw9EXrvBfZFmVWTq8nHFftiibwkCeCe5ztbVBNR2onHWJ jfoLA5+TJhSZ/FI4tpkPURjbTzq6TkS6BGOkV/yX7D9QDKTMVvSThJ8/aF1BFxm1aJnqFPDoBOV WxP+U25te0lhmtg+Y5cQOz9CjHLhurDgxzx5hefXhMYOENgzOL83edGDR69brI5vJeE4JdnFdiY mVIjKt4I+GYfEWAxD8A== X-Authority-Analysis: v=2.4 cv=Y6XIdBeN c=1 sm=1 tr=0 ts=6a8292a7 cx=c_pps a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=_bi6IaUD7rjJwiY1G1oA:9 a=QEXdDO2ut3YA:10 a=OpyuDcXvxspvyRM73sMx:22 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-16_06,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 phishscore=0 bulkscore=0 suspectscore=0 impostorscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608170033 Introduce the CB (compute context bank) device management layer. Each DSP domain node in the device tree may contain child nodes with compatible "qcom,fastrpc-compute-cb", each representing one IOMMU context bank. Enumerate those child nodes during RPMsg probe and create a corresponding device on the qda-compute-cb bus for each one, so that the IOMMU subsystem assigns each of them its own domain and DSP buffer mappings are isolated per session. qda_cb_populate() walks the child nodes and creates one CB device each, unwinding everything it created if any single creation fails. qda_destroy_cb_device() removes a device from its IOMMU group before unregistering it so the domain is released cleanly. CB devices are created before the DRM device is registered and destroyed after it is unplugged, so user space cannot reach a CB that does not exist yet, and no ioctl can be in flight while one is torn down. Assisted-by: Claude:claude-sonnet-5 Signed-off-by: Ekansh Gupta --- Changes in v2: - Use qda_cb_device_create() and pass the name as a format string instead of formatting into a stack buffer (Dmitry Baryshkov) - Fail probe on the first CB creation error and unwind, instead of counting successes and continuing (Dmitry Baryshkov) - Drop the impossible NULL check in qda_destroy_cb_device() (Dmitry Baryshkov) - Use drm_*() logging consistently instead of mixing with dev_*() (Dmitry Baryshkov) --- drivers/accel/qda/Makefile | 1 + drivers/accel/qda/qda_cb.c | 86 +++++++++++++++++++++++++++++++++++++++++++ drivers/accel/qda/qda_cb.h | 32 ++++++++++++++++ drivers/accel/qda/qda_drv.c | 1 + drivers/accel/qda/qda_drv.h | 3 ++ drivers/accel/qda/qda_rpmsg.c | 16 +++++++- 6 files changed, 138 insertions(+), 1 deletion(-) diff --git a/drivers/accel/qda/Makefile b/drivers/accel/qda/Makefile index 424176f652a5..143c9e4e789e 100644 --- a/drivers/accel/qda/Makefile +++ b/drivers/accel/qda/Makefile @@ -6,6 +6,7 @@ obj-$(CONFIG_DRM_ACCEL_QDA) := qda.o qda-y := \ + qda_cb.o \ qda_drv.o \ qda_rpmsg.o diff --git a/drivers/accel/qda/qda_cb.c b/drivers/accel/qda/qda_cb.c new file mode 100644 index 000000000000..9c5ef32f351e --- /dev/null +++ b/drivers/accel/qda/qda_cb.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +#include +#include +#include +#include +#include +#include +#include +#include "qda_drv.h" +#include "qda_cb.h" + +int qda_create_cb_device(struct qda_dev *qdev, struct device_node *cb_node) +{ + struct qda_cb_dev *entry; + struct device *cb_dev; + u32 sid = 0; + + if (of_property_read_u32(cb_node, "reg", &sid)) + drm_info(&qdev->drm_dev, "No stream ID in DT node %pOFn, using 0\n", cb_node); + + cb_dev = qda_cb_device_create(qdev->dev, DMA_BIT_MASK(32), cb_node, + "qda-cb-%s-%u", qdev->dsp_name, sid); + if (IS_ERR(cb_dev)) { + drm_err(&qdev->drm_dev, "Failed to create CB device for SID %u: %ld\n", + sid, PTR_ERR(cb_dev)); + return PTR_ERR(cb_dev); + } + + entry = kzalloc_obj(*entry); + if (!entry) { + qda_destroy_cb_device(cb_dev); + return -ENOMEM; + } + + entry->dev = cb_dev; + list_add_tail(&entry->node, &qdev->cb_devs); + + return 0; +} + +void qda_cb_unpopulate(struct qda_dev *qdev) +{ + struct qda_cb_dev *entry, *tmp; + + list_for_each_entry_safe(entry, tmp, &qdev->cb_devs, node) { + list_del(&entry->node); + qda_destroy_cb_device(entry->dev); + kfree(entry); + } +} + +int qda_cb_populate(struct qda_dev *qdev, struct device_node *parent_node) +{ + struct device_node *child; + int ret; + + for_each_child_of_node(parent_node, child) { + if (!of_device_is_compatible(child, "qcom,fastrpc-compute-cb")) + continue; + + ret = qda_create_cb_device(qdev, child); + if (ret) { + drm_err(&qdev->drm_dev, "Failed to create CB device for: %s\n", + child->name); + of_node_put(child); + qda_cb_unpopulate(qdev); + return ret; + } + } + + return 0; +} + +void qda_destroy_cb_device(struct device *cb_dev) +{ + struct iommu_group *group; + + group = iommu_group_get(cb_dev); + if (group) { + iommu_group_remove_device(cb_dev); + iommu_group_put(group); + } + + device_unregister(cb_dev); +} diff --git a/drivers/accel/qda/qda_cb.h b/drivers/accel/qda/qda_cb.h new file mode 100644 index 000000000000..bd83d64fa425 --- /dev/null +++ b/drivers/accel/qda/qda_cb.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef __QDA_CB_H__ +#define __QDA_CB_H__ + +#include +#include +#include +#include "qda_drv.h" + +struct qda_cb_dev { + struct list_head node; + struct device *dev; +}; + +/* + * Compute bus (CB) device management + */ +int qda_create_cb_device(struct qda_dev *qdev, struct device_node *cb_node); +void qda_destroy_cb_device(struct device *cb_dev); + +/* + * Transport-agnostic CB device population/teardown. + * Called by any transport layer (RPMsg, etc.) during probe/remove. + */ +int qda_cb_populate(struct qda_dev *qdev, struct device_node *parent_node); +void qda_cb_unpopulate(struct qda_dev *qdev); + +#endif /* __QDA_CB_H__ */ diff --git a/drivers/accel/qda/qda_drv.c b/drivers/accel/qda/qda_drv.c index 9a64f7dfcb6e..09b6d5ac390b 100644 --- a/drivers/accel/qda/qda_drv.c +++ b/drivers/accel/qda/qda_drv.c @@ -52,6 +52,7 @@ struct qda_dev *qda_alloc_device(struct device *dev) if (IS_ERR(qdev)) return ERR_CAST(qdev); + INIT_LIST_HEAD(&qdev->cb_devs); return qdev; } diff --git a/drivers/accel/qda/qda_drv.h b/drivers/accel/qda/qda_drv.h index 4a27fb40c280..3bd41b9593fa 100644 --- a/drivers/accel/qda/qda_drv.h +++ b/drivers/accel/qda/qda_drv.h @@ -7,6 +7,7 @@ #define __QDA_DRV_H__ #include +#include #include #include #include @@ -37,6 +38,8 @@ struct qda_dev { struct rpmsg_device *rpdev; /** @dev: Underlying Linux device */ struct device *dev; + /** @cb_devs: Compute context-bank (CB) child devices */ + struct list_head cb_devs; /** @dsp_name: Name of the DSP domain (e.g. "cdsp", "adsp") */ const char *dsp_name; }; diff --git a/drivers/accel/qda/qda_rpmsg.c b/drivers/accel/qda/qda_rpmsg.c index 6a6e58333a68..723b3e61bf0a 100644 --- a/drivers/accel/qda/qda_rpmsg.c +++ b/drivers/accel/qda/qda_rpmsg.c @@ -5,6 +5,7 @@ #include #include +#include "qda_cb.h" #include "qda_drv.h" static struct qda_dev *qda_rpmsg_alloc_and_init_qdev(struct rpmsg_device *rpdev) @@ -40,6 +41,7 @@ static void qda_rpmsg_remove(struct rpmsg_device *rpdev) */ drm_dev_unplug(&qdev->drm_dev); qdev->rpdev = NULL; + qda_cb_unpopulate(qdev); } static int qda_rpmsg_probe(struct rpmsg_device *rpdev) @@ -57,7 +59,19 @@ static int qda_rpmsg_probe(struct rpmsg_device *rpdev) return ret; } - return qda_register_device(qdev); + ret = qda_cb_populate(qdev, rpdev->dev.of_node); + if (ret) + return ret; + + ret = qda_register_device(qdev); + if (ret) + goto err_unpopulate; + + return 0; + +err_unpopulate: + qda_cb_unpopulate(qdev); + return ret; } static const struct of_device_id qda_rpmsg_id_table[] = { -- 2.34.1