From nobody Mon Feb 9 23:00:34 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 14F031EEE6 for ; Tue, 30 Dec 2025 11:02:41 +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=1767092563; cv=none; b=aCnyNpsHnEcbxX8wYNoKrb5/S0jFxXgAM+s2o2JhmNqwjj4bG12+UrYFCY2IAi47lbKpDBgR4fD6SilRJ2DAjtlIA5jPXb3W79uDXKwnbOM3AweRAman/zwADQjsBSeJIxrnLLQlX/xsBfFfZVlx/NxbDLTOpcSjlWwmcWjaorA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767092563; c=relaxed/simple; bh=kzaUN+x2tytlHR+0KUUHjrghzg/fT+mbgBEGSbNP1ag=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Nt8I319F2hUQT1LLmldXy8fBADT4LpEhTNjH6b7oLbrOaJZkAku1eCXNefaZtD7S+DDxiDcL2soH5M0hhIg5MsNYlU1ziLKWaIpTFLkdz+vYWMcHzUHqJ8dFS2ZkYSGvkAETzqC4/8vtkSk3WXYrq5TmuQbpcubtnRgvfXNXpoI= 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=pPjnz7Gy; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=epwWxpOG; 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="pPjnz7Gy"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="epwWxpOG" 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 5BU9HXZb2380826 for ; Tue, 30 Dec 2025 11:02:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=VYwQ/Hx44kd wcs759Yx8Gs08E+Q2dSlIoFnhLpXFKqU=; b=pPjnz7GygYTWoDKptwvj3aPNlKv I34MNm9IYPfIHWBK2zVtO8L/GpuxXjM5dP7vmLNFEnCeGzi1CvdpiFFhcbttQpBk K5L2biLIiclFdHxUBfsBmQvIAg7ErWGwH7vKiGA/wjVlwSXgPGBFCnf2dPfPYDQN LxBc07Vc8Aix8C5xBYrWRq/lARdQjng3XCDzUt4kchFcEBI7lPl5xjiS6f8qOp0c bwNHupfQWHdcFOZzzz3LL26vDnn1Juo77P9oMl2hj07C0B1vOUfgAlBOKYeYjfkZ Ruk30Lu9dNze0bjao1xuO4aXYBzKwYMsZltYLEFB12/pZrKWCUJDGiqTFIg== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bbqk1ax9j-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 30 Dec 2025 11:02:41 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7f66686710fso23023284b3a.3 for ; Tue, 30 Dec 2025 03:02:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767092560; x=1767697360; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VYwQ/Hx44kdwcs759Yx8Gs08E+Q2dSlIoFnhLpXFKqU=; b=epwWxpOGMhG3mFnBl8rmJ6/j2vbL62wbt+U30ptSxVJDd5qsxquc7x4xblaEUvb3Sd G35cZAkIubGuZom5VQPubBI/gOiqUqy3NK8BWEwY5bntFnw3ts+VrpHxtWenfMr45vtu um73uspxeGAUkr5pSYhbp326VSqKs+XJK0dOmIDI4zZ41TI3sFYJBZw2WvwwsXLGJ/RQ MpNF7NXOJmmqQiWRg+NIWv+1OL/1cpaDeTKG6oNsx/DfFq9bpcwkITP6OG80qnvxlzEn BW2KeUL4BGu6OqM+5CFy5CM86CWiD2CgqsVvEeVWmww+f54HOW0h3O0Z4WYa62K2eUmu tI6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767092560; x=1767697360; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VYwQ/Hx44kdwcs759Yx8Gs08E+Q2dSlIoFnhLpXFKqU=; b=oYeMC3WhUeWypZSSXR54wyk9rbt0E2e7SYtrHrbQz1LQztjDtTsOHsugyaKxEkJi8Z WmlFz0RuKyDH6Sg75TszO28bzs85uw76tO1EnnQMeY1xgFy7lNgMdaEuzq8qV9G8A20I sloFCdcysyGHIsysf7DZKFEOwON2YGc2I05xaW/mmdgOVc3FXGsCa8p5vU4bHZelWR+o Vz5IG2CESSJ+pJ+Q8ioKb3zOBxHB2Hb9EQafEhyyE86yZ8eUG/aNVcM44duqNH2ou8aq BnPpQH8Dgm9bvAZlaww8HwLdUGjkJzvHjij8+spR872wS2dOmwLx9LXhbiZn0ZGIYAgb LMuw== X-Forwarded-Encrypted: i=1; AJvYcCXEgfmdAaf7p3b0rilAU7B+ZPIxYngpwGo0o2FYSP65RIhe8FTloP2ys6X+SF7i0VhUx5moyLcmzQK1W30=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7M83tx0LirGwvmtcVHXmGLjuN/pkazN9PDyW3GkiBs05kL44i pLaEt/UAC/pj1u4qJt479qNK1Nf0zFne2URXH79t8RGaaePL4GZsuYtLNedU43qvM2mABnmBXFl gf8JppCAUTUE4EE5qI/G1F+QFobYpG2gqq5ud9Mr2b25ynW6L4QjAGU5HhTJt63i/x+k= X-Gm-Gg: AY/fxX6t0l7qlKCj+PFZ92ds6WfKzGAwKxtSZovJmqQtUqf2Vf9dq1zaZ1+XDQH4qs6 yKlMFjp8N5MxdUWYyY3EFf/ASkzm8Y/lSsZPJmPOtcCFGzDti2W/DHaV6g3sesag5bAYN3tu4sq iKoet9lLu8OTyRGFt4rHVAxl4qlEwZhh3MzYOjGOZr6/8fbzMPPaXYMmq+2zLUriGBhItNoaHon VGgJ1U4TSjMV2tjLNBsSTGQViRXO/mQ3JEQyUXh0piiHDeFzW6xF9OtyGECGufWOADzozOhvlMV p6K+8J3dI6z63nmJQ6Iqv0cpkQ2W7pHjBrhEJJiss2bBBFxuFpI6FKca/5LLTsR9UCz5q2f8x7N mfLjZJUCuUTPpCuwQWhzl/3X4j9K7pD1wKTxtTrc6Sw== X-Received: by 2002:a05:6a20:3ca8:b0:33c:2154:d4f4 with SMTP id adf61e73a8af0-376aa500867mr30883650637.49.1767092560452; Tue, 30 Dec 2025 03:02:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IFhhWXGKYIxwN0TmVgGtWsqgsEy8WyS+QDcMuCfhzukRTbnwE5KpXtMVJAEy0hB11Qi0NV12w== X-Received: by 2002:a05:6a20:3ca8:b0:33c:2154:d4f4 with SMTP id adf61e73a8af0-376aa500867mr30883629637.49.1767092559966; Tue, 30 Dec 2025 03:02:39 -0800 (PST) Received: from hu-ekangupt-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c3a4deb6f17sm2556908a12.22.2025.12.30.03.02.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Dec 2025 03:02:39 -0800 (PST) From: Ekansh Gupta To: srini@kernel.org, linux-arm-msm@vger.kernel.org Cc: gregkh@linuxfoundation.org, quic_bkumar@quicinc.com, linux-kernel@vger.kernel.org, quic_chennak@quicinc.com, dri-devel@lists.freedesktop.org, arnd@arndb.de, dmitry.baryshkov@oss.qualcomm.com Subject: [PATCH v3 3/3] misc: fastrpc: Support mapping userspace-allocated buffers Date: Tue, 30 Dec 2025 16:32:25 +0530 Message-Id: <20251230110225.3655707-4-ekansh.gupta@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251230110225.3655707-1-ekansh.gupta@oss.qualcomm.com> References: <20251230110225.3655707-1-ekansh.gupta@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: L4jIvgmUrYKKIqyj2a2nXq7TNAmK2Gol X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjMwMDA5OSBTYWx0ZWRfXyYzVht5QhsnB 5Y7yNNPKM88kRfsjenfT/Cqp/UWCCZndA0d2aqV1IZoDT2EmsU+YMzkmq2zunVS7RHW2q0Oudy4 qg3niocIVq68Tt9ojPJg9/FXBZ7aBb7AEfP6WA3EDJF81casyypGXATMQzKP0367uQCePOYN+zi Obhwk3R4afvhVARazNQu4AVJpd8SUcAw6eMWF1517r4fj+sGh08kGx83QauBecnuVO4h94PMXxQ jzEdXJwCIMzk/fTj4J0qDII5Ili618u5B7LhC04wuvgV+FFfulXd4j8MJqU9zK+prulfT8YoCIi c2tp+IdOJPUtVJVF1ecTZ4VqwnnmWReGLOirLES9ADkk/6mO3AV2YiaaX88jwspRU8vlKCnt0Kd mh0YLPpDfenb3S14O4UQyANCMYyDCd2qhipEu5GNXuAFMEdi4n1xuawXOSdw7x+LGj0wwuFtzcv TCmuW2I1bPjB63EM1zw== X-Authority-Analysis: v=2.4 cv=Tf6bdBQh c=1 sm=1 tr=0 ts=6953b151 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=LDv6qzVS_9dTolnp15UA:9 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-GUID: L4jIvgmUrYKKIqyj2a2nXq7TNAmK2Gol X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-29_07,2025-12-30_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 phishscore=0 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512300099 Content-Type: text/plain; charset="utf-8" Currently, FastRPC only supports mapping buffers allocated by the kernel. This limits flexibility for applications that allocate memory in userspace using rpcmem or DMABUF and need to share it with the DSP. Add support for mapping and unmapping userspace-allocated buffers to the DSP through SMMU. This includes handling map requests for rpcmem and DMABUF-backed memory and providing corresponding unmap functionality. Signed-off-by: Ekansh Gupta --- drivers/misc/fastrpc.c | 97 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 11 deletions(-) diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 24064efe5dd8..b677e485bade 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -1854,8 +1854,10 @@ static int fastrpc_req_munmap_impl(struct fastrpc_us= er *fl, struct fastrpc_buf * static int fastrpc_req_munmap(struct fastrpc_user *fl, char __user *argp) { struct fastrpc_buf *buf =3D NULL, *iter, *b; + struct fastrpc_map *map =3D NULL, *iterm, *m; struct fastrpc_req_munmap req; struct device *dev =3D fl->sctx->dev; + int err; =20 if (copy_from_user(&req, argp, sizeof(req))) return -EFAULT; @@ -1869,13 +1871,42 @@ static int fastrpc_req_munmap(struct fastrpc_user *= fl, char __user *argp) } spin_unlock(&fl->lock); =20 - if (!buf) { - dev_err(dev, "buffer not found: addr=3D%p [len=3D0x%08llx]\n", + if (buf) { + err =3D fastrpc_req_munmap_impl(fl, buf); + if (err) { + spin_lock(&fl->lock); + list_add_tail(&buf->node, &fl->mmaps); + spin_unlock(&fl->lock); + } + return err; + } + + spin_lock(&fl->lock); + list_for_each_entry_safe(iterm, m, &fl->maps, node) { + if (iterm->raddr =3D=3D req.vaddrout) { + map =3D iterm; + list_del(&iterm->node); + break; + } + } + spin_unlock(&fl->lock); + if (!map) { + dev_dbg(dev, "buffer/map not found addr=3D%p len=3D0x%08llx\n", (void *)(unsigned long)req.vaddrout, req.size); return -EINVAL; } =20 - return fastrpc_req_munmap_impl(fl, buf); + err =3D fastrpc_req_munmap_dsp(fl, map->raddr, map->size); + if (err) { + dev_dbg(dev, "unmap error: fd=3D%d, raddr=3D%p\n", + map->fd, (void *)(unsigned long)map->raddr); + spin_lock(&fl->lock); + list_add_tail(&map->node, &fl->maps); + spin_unlock(&fl->lock); + } else { + fastrpc_map_put(map); + } + return err; } =20 static int fastrpc_req_map_dsp(struct fastrpc_user *fl, u64 phys, @@ -1989,25 +2020,69 @@ static int fastrpc_req_buf_alloc(struct fastrpc_use= r *fl, return err; } =20 -static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp) +static int fastrpc_req_map_create(struct fastrpc_user *fl, + struct fastrpc_req_mmap req, + char __user *argp) { - struct fastrpc_req_mmap req; + struct fastrpc_map *map =3D NULL; + struct device *dev =3D fl->sctx->dev; + u64 raddr =3D 0; int err; =20 - if (copy_from_user(&req, argp, sizeof(req))) - return -EFAULT; + err =3D fastrpc_map_create(fl, req.fd, req.size, 0, &map); + if (err) { + dev_err(dev, "failed to map buffer, fd =3D %d\n", req.fd); + return err; + } + + err =3D fastrpc_req_map_dsp(fl, map->phys, map->size, req.flags, + req.vaddrin, &raddr); + if (err) + goto err_invoke; =20 - if (req.flags !=3D ADSP_MMAP_ADD_PAGES && req.flags !=3D ADSP_MMAP_REMOTE= _HEAP_ADDR) { - dev_err(fl->sctx->dev, "flag not supported 0x%x\n", req.flags); + /* update the buffer to be able to deallocate the memory on the DSP */ + map->raddr =3D (u64)raddr; =20 - return -EINVAL; + /* let the client know the address to use */ + req.vaddrout =3D raddr; + dev_dbg(dev, "mmap OK: raddr=3D%p [len=3D0x%08llx]\n", + (void *)(unsigned long)map->raddr, map->size); + + if (copy_to_user(argp, &req, sizeof(req))) { + err =3D -EFAULT; + goto err_copy; } =20 - err =3D fastrpc_req_buf_alloc(fl, req, argp); + return 0; +err_copy: + fastrpc_req_munmap_dsp(fl, map->raddr, map->size); +err_invoke: + fastrpc_map_put(map); =20 return err; } =20 +static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp) +{ + struct fastrpc_req_mmap req; + int err; + + if (copy_from_user(&req, argp, sizeof(req))) + return -EFAULT; + + if ((req.flags =3D=3D ADSP_MMAP_ADD_PAGES || + req.flags =3D=3D ADSP_MMAP_REMOTE_HEAP_ADDR)) { + err =3D fastrpc_req_buf_alloc(fl, req, argp); + if (err) + return err; + } else { + err =3D fastrpc_req_map_create(fl, req, argp); + if (err) + return err; + } + return 0; +} + static int fastrpc_req_mem_unmap_impl(struct fastrpc_user *fl, struct fast= rpc_mem_unmap *req) { struct fastrpc_invoke_args args[1] =3D { [0] =3D { 0 } }; --=20 2.34.1