From nobody Mon Dec 1 22:36:50 2025 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 3890130CD94 for ; Fri, 28 Nov 2025 10:34: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=1764326082; cv=none; b=pwOD3GVOEwdGcnUAV5GJxfBwFUE4B9qjIHzEkzLkiMIY/3gnlfTU+TEIyQ2aDgOqIsFVie7VMpDwxWP9GlWfR1Ry4BxRAfxCuiwgBkLNtbwByMiU5O6i+3MXi6kB2rI1TVDSngb7eF3lCOV+ejFkhx5e1PvTezNTa0RuEnfrtSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764326082; c=relaxed/simple; bh=3McFV9+MNY0DtMFk+39XUHIIYjw72LprTYXBqI4SwGA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Y89R6KT1U9jml816pySvSajnMIK9xtySrcuuLoE5IDkZPjcw0W1Z8W3j3a/C+ahxXQHcp88ucNm61zXPVDVBeconZvEG8xTDgK4OZ1AQgZcg7cWsCsBbIQbwAydhgcDiJP/aAD0RO7WfnOBlYlx/QRb46V9kZyLrJdK+2RKIii0= 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=BDpDz5xh; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Dp6GO3IB; 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="BDpDz5xh"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Dp6GO3IB" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5AS8Oh6o3627427 for ; Fri, 28 Nov 2025 10:34:40 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=tksOsG49Dg9 nA4MxpHKa0diwA7zCt+Mdk9sP8H6UiFQ=; b=BDpDz5xhdBTByVRlPHItsGkAxya X5Up2sJiSn77996IJYwNJOFnTSAv624Z6EnKTnPhrEeC7dy1Bg73qBAiXE0IsNTW sKJ06ZwNEAjN8/J7ibOtWLZ27poS7DdBWLNTONO3WOb8/6hSUNJM2dpPNFk0RqPa F17FGpgd98IecvYO67KXyjJ+mPjYZe0zXRjBhXe8pe29XRosnlotmLPRDFTErWAa LQMD2gI+jvlIePISdQJXYKJ26A6Wgq5ZUS1MThIt4oy7D8klodB1fhoQQdFN1UMl PkNCLvOxkG80Jor60OF+zmbZSwOjTLD1Nh6VzKnwO0hmtCbx0I1WyXAapjQ== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4apmynu101-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Nov 2025 10:34:40 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-297dde580c8so54838745ad.1 for ; Fri, 28 Nov 2025 02:34:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1764326080; x=1764930880; 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=tksOsG49Dg9nA4MxpHKa0diwA7zCt+Mdk9sP8H6UiFQ=; b=Dp6GO3IB6XIOfk3Vbh5TtQXpdI7fZeUniYgjiGwpvy4x8t7nc56ZaX2u1ox9Ew95GB FOmJ1FAgIkubO82kuA4gD/Mjvxu88DepuAuNp+l4e4ifq8oFLK8dTHKw1T2ZbkSS7Mfb fezd1ew0vnY1KQRx4NvvU4lVKOFK7pt6ZkHDJS6vqgEXjgas7ZnqhZHLwoz2gZH61+ma MhpHR/5vNlIeiapKsAsQzJZ941wcZbAqm1Dvr8GlUQ+hxlcWnAUz0tRq7h9/xz5wlJYP 5rh1Tx/xacGY57Zvqbj7e1jZIDJGvtD2aZbCBjWBfnoMET7TaQ4tVO9fIPBol0ksO8WE Ip9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764326080; x=1764930880; 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=tksOsG49Dg9nA4MxpHKa0diwA7zCt+Mdk9sP8H6UiFQ=; b=Gf9FsAEYHquagWWQQubZYBPulPJa32gme+tAMefYDrlRBSi5XAX+bawiPD6vYDrIa2 2YmaFIB9ZBowPqHRkZhet5HgqX8LOxCse7iFLBi8IlaTAdM6f5L593kMg9qnQZ3e74Du NtF1R777bT/BKYQyhrZ8EH3lV43YG/xms/NaWA3DnJ49a9G2LNM3bLbv+ydsaEWTHkh3 h1M6OduVg0YzqnjsQYzXde5qts6wtwpGgd9qJ0FVIuabynaEyFqkt06yJVWK/qrLvgDv chEF6WS9KoVLP/wpis5r6iiJS2SI/i1WlEScM08rcv37tAUGkGvIPjAHAUmIVWjzjQd1 ktSw== X-Forwarded-Encrypted: i=1; AJvYcCUUUbKJL9OuI5sVRCw/uBEvJCL5kcm/MWf3+7PIYvbG0PNdXhzgCeZXEFue7xS0s9nbtJ3wXzCIc9rMziQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwwVfpWn78sf6Uf7XMo1Ii5MSgUwT87BDcm/ls3Ro/wCUWZcF6w sWy5FkNksA0rvwPsQwPukUfMbed71rq9judflP6Y5dJDE74ydxZfbdv9LMr53hn3pc1Ng4Jx2Lp KP4w1Wvj0vgPIqNGzw1/idRcXrUNjze7oUYtUqFKMrDo3gyUmuKieM0Woi4RT5JlEE1I= X-Gm-Gg: ASbGncvxSLV/HUJGs/EYuT/yKcIH54NBbS4oFNiepV1Ue8iNSlKjhH8bu76iBUZujly fSOZ2XIdOoysh21JV7v4QytZtitqdAxYoBMIyN2+FjekDViVLzR/GOP40BPx/YiB1YHpCQiJ23f 5+wEea+wTjJRi8rKvb/wQVcMlXCNaEm8d3FtS5kuCp0meQjfl3KICN2v1dSM0Neu68sHtaLgBPQ kAWM1J46NgRn+6FFDO3a+o1SeEm4iMWsJOKeQEQRqOIVt+zmsMfXexxE/70UUezcFxjdY3ft1qK SEZyWzyw1RUWnkPs+llTGAKHtSDaHplkogH7toGRXggupgI+Abydnep3fWm1zgn/Kr1ayZvv6Yx fq+VFdX4JnCYMuN8UAsiCAwAso/+bmwrdhA2X8foSwA== X-Received: by 2002:a17:903:3b87:b0:295:565b:c691 with SMTP id d9443c01a7336-29baaf75d56mr164237035ad.17.1764326079668; Fri, 28 Nov 2025 02:34:39 -0800 (PST) X-Google-Smtp-Source: AGHT+IFQsu550Gf8bRhwbobshsjKneIYUQA5FyjtpAtmmp+z1D8G7bxKdB2r9mHvhM84fy3g652XSw== X-Received: by 2002:a17:903:3b87:b0:295:565b:c691 with SMTP id d9443c01a7336-29baaf75d56mr164236655ad.17.1764326079120; Fri, 28 Nov 2025 02:34:39 -0800 (PST) Received: from hu-ekangupt-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29bce40b993sm43098195ad.14.2025.11.28.02.34.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Nov 2025 02:34:38 -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 v2 2/2] misc: fastrpc: Support mapping userspace-allocated buffers Date: Fri, 28 Nov 2025 16:04:28 +0530 Message-Id: <20251128103428.1119696-3-ekansh.gupta@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251128103428.1119696-1-ekansh.gupta@oss.qualcomm.com> References: <20251128103428.1119696-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: _wvIUfBCAup8Q3vJUJaQ8lw1xjXkHJgG X-Authority-Analysis: v=2.4 cv=QOplhwLL c=1 sm=1 tr=0 ts=69297ac0 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=9b90K331daA_tkPLntcA:9 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTI4MDA3NiBTYWx0ZWRfXzdl3oD0mSX4p 2ByzqZJX7JqVCpHqqCQ1d5iIMT6UxOQB4V8QjSa+fyXsBmFyjrLOkWLUP7mzehHFvNDnk0FjfqN TpN+Fyz52ncki86eztAY1xxJJWp5Qtm3w5ypf7bQV7a0FsP0cnT2UX7EesLSzWLRZYvSF6O08Ue c1INRFJiwOT3I/Fvp/KqjA0xG81LgnsH/kd4lfR3ncFZ1l3jLxc9CqP0WWMfKkfiCuzJ03eI763 7Vj2fvs27QMJaT2nuaiDzT0bbAf/eu8ffF7gcq7JdsfowOEXlXjgbTtVXP7+hdXHQd320doaivX Vsf2qNIR8ZDUKJ2SbifpKQvFgQS0wEvaNni+isBb3MH8OBiqWM/m9Q4gw1b1gsudmejjZHD5nTE JIEgoCBsBLSdZTvoWQQQsrifwAWwCg== X-Proofpoint-GUID: _wvIUfBCAup8Q3vJUJaQ8lw1xjXkHJgG 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-11-28_03,2025-11-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511280076 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 | 96 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 9bf76e224852..feba79913763 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,41 @@ static int fastrpc_req_munmap(struct fastrpc_user *= fl, char __user *argp) } spin_unlock(&fl->lock); =20 - if (!buf) { - dev_err(dev, "mmap\t\tpt 0x%09llx [len 0x%08llx] not in list\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 0x%09llx, len 0x%08llx\n", 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, "unmmap\tpt fd =3D %d, 0x%09llx error\n", map->fd, map->ra= ddr); + 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 +2019,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; + } =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); + err =3D fastrpc_req_map_dsp(fl, map->phys, map->size, req.flags, + req.vaddrin, &raddr); + if (err) + goto err_invoke; =20 - return -EINVAL; + /* update the buffer to be able to deallocate the memory on the DSP */ + map->raddr =3D (u64)raddr; + + /* let the client know the address to use */ + req.vaddrout =3D raddr; + dev_dbg(dev, "mmap\t\tpt 0x%09llx OK [len 0x%08llx]\n", + map->raddr, map->size); + + if (copy_to_user((void __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