From nobody Wed Oct 8 19:25:04 2025 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 2A2012F49FD for ; Wed, 25 Jun 2025 18:59:09 +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=1750877951; cv=none; b=KWba/EX9tOtQMUkgBUziJSEK7/LPaqPsNrwHQl3KzDQKQrZDRmL0h6QE0l3Fo80edc6nkGEEovkKPEMHS8xzlMUQrrBO8jztznb8Nw37SGYE0oWTI/Up0/F1kwUOb4cnHV/x0jUJXDxYr42zyBMMOM0ocVGepp0fUk1r6arA7rM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750877951; c=relaxed/simple; bh=J0pQNbB6x/H7ePaaaS7ZUOpUGbfsgtn3CSHqO9Dcccc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eL7fLdZX55FVd1CjXIeNc1y68ygCBra+Res+CZ98K3hePGdb/xoSXDt14nKqNSkDh+Uq7KvPkICZF5mNDwQj1XLsJz4dWRrfGu02DSWDlydoMCJ9q0ko5G6uuBNaStbMGntD46IVaKImzuQpc/JZB26mn05Taoauz9tECqMFsWI= 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=Jsjj11g2; 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="Jsjj11g2" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55PBrQRA012117 for ; Wed, 25 Jun 2025 18:59:08 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=F1yQ7yX6yaI pkwDE3wKH9/Crq7XFmKQYbQ8fPyvBhLE=; b=Jsjj11g2GaQ7eLpMX999DlmpRRZ Qdm/Ot9DBdj2iOFXnlkYR98in9o5uGBvdnv1k+wkco73TQPDbIYTGRVgUPmOQ7ow /n/2bFPspIRN5jh4DSRjlSD3kbTpCTjBL/I372r8pp8yrYw2mMtbEwJFFOjzMuak 4zyG8LJ3c915BHAgGSBWBs2MsN7b/EXj2hzv8VC5kcPJgIYAu60BEB3ro7XTPB3i fXFfgFvyOsBMVZhj2IunSw2Y+xwnysfAszBTpzVcLrk5CPfadmwWaIZ5WFYwcNZL 3V4RD6mV3Ltg9+zGKghl11tkcSygCgzTKoYbxK0BbxwWnOsua9PYFsyO3sw== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 47fbm1yh16-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Wed, 25 Jun 2025 18:59:07 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-b2fcbd76b61so207031a12.3 for ; Wed, 25 Jun 2025 11:59:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750877947; x=1751482747; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=F1yQ7yX6yaIpkwDE3wKH9/Crq7XFmKQYbQ8fPyvBhLE=; b=dcneIZZEBVcND4y5Rv7h91cMcjsavxRjf3kAP2V+qjFvFi9YFVQn+RNc2DT/vJwbOA 7d59e0WQvC1p/M/Tq3Gs08J2kKiGfSiJO2/WEEfCHLUrtGDAf1HYlSTlMT5P19pfMtFM XOo7sEe7Zs57ZbwRD/CdjCooCa1qHBdQWKyXHdGMz46lpe32jGxsEB7QK+TqJ6DvwKrI 8BlKdM+6UN9QW0Y58rFeK4/9D5nrhBc331JSnLY9Z1Ot6ki8KBZetcIzYAemYKygsfRy xrO/+zWSVwgEGoDu65GUpqcJ36vLbAscGEkJgW11e+k6v3FtDk6EBTC2Rj8wgF3dC+ho Mc/A== X-Forwarded-Encrypted: i=1; AJvYcCVkSmPj+nk2G19/x3pGHi/EJW47toduGbVkDBtXfTK39d2T7EKZX/Hg8TEN8yGwaSL7piGDSnA9I/mXvV0=@vger.kernel.org X-Gm-Message-State: AOJu0YxehZCpqV47dzUXRnGCoCPtjETs2IzaJM9uHwblA0VErzmC85ni H+NtSm86khqRO+eSwPbfEazYw50KNfGuQSl7AFRTSmIWiYSQtPZjZq0ADyyEAfUp+cXKqeHaAz1 O8TbQ59aM8UZrMw89BI7e9bulKHcFT4Gcxlq9xLAON4AC6Ww6qpmmD0oZJqGpNJycflM= X-Gm-Gg: ASbGnctFTVH79Ry9ynPqFPHVlocz9I/rPA3zzeAoFzpES7aBtyIM1WajVuCr0sOZAW3 sYfcLN7/fuWM3+/bmoZFMN4ROadE1VEv9p+1KGFkB7ZHeLzE4vk5z50/yQoXHQ3qmNNUzL7tAxx UZPtaPVkCZvtjSuQvkEXf6Y+Y//htRYcZ8rVhvLeVplSY+M5EDygaFTo7nQfVxK/cYFi8JGQV4g 9qJZnneOrPeiTs7sAcSBxBXXfZo8ZDpbSRm7CnjPp/NtDlNhunFeJGPMKF8dquHmvXS4fro8Pow iXaj0gExr0g1MNmiaOUXoaOumlTZr5ak X-Received: by 2002:a05:6a21:680b:b0:204:4573:d854 with SMTP id adf61e73a8af0-2207f1adf3bmr5936428637.9.1750877946431; Wed, 25 Jun 2025 11:59:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF1LmWA4B37cTCZvJEIcBbu0dTeCfOuaoULsy1QTxM37zp0IXZvdQikKnG42zq3g+gUrjS54w== X-Received: by 2002:a05:6a21:680b:b0:204:4573:d854 with SMTP id adf61e73a8af0-2207f1adf3bmr5936371637.9.1750877945889; Wed, 25 Jun 2025 11:59:05 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:5b3e:de60:4fda:e7b1]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b31f125d668sm11591495a12.54.2025.06.25.11.59.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Jun 2025 11:59:05 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Connor Abbott , Antonino Maniscalco , Rob Clark , Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Konrad Dybcio , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= , linux-kernel@vger.kernel.org (open list), linux-media@vger.kernel.org (open list:DMA BUFFER SHARING FRAMEWORK:Keyword:\bdma_(?:buf|fence|resv)\b), linaro-mm-sig@lists.linaro.org (moderated list:DMA BUFFER SHARING FRAMEWORK:Keyword:\bdma_(?:buf|fence|resv)\b) Subject: [PATCH v7 29/42] drm/msm: Extract out syncobj helpers Date: Wed, 25 Jun 2025 11:47:22 -0700 Message-ID: <20250625184918.124608-30-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250625184918.124608-1-robin.clark@oss.qualcomm.com> References: <20250625184918.124608-1-robin.clark@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-Authority-Analysis: v=2.4 cv=YYu95xRf c=1 sm=1 tr=0 ts=685c46fb cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=cm27Pg_UAAAA:8 a=EUspDBNiAAAA:8 a=ii7SkllToyZ1umWTbp4A:9 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: 9h669e0wd74ciX84y0FOoDK_i4zxHE_6 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjI1MDE0MiBTYWx0ZWRfX7MBsAfm9SxAy +KGvwdDWuH0y5VEyEvepEhSZykafhRk4XqhNoN902fQo3G8v9V9kHPTWSUnhQXZQJWeUbmblJIB oQZrcmHKaj8cOGixUX3zMTP8w5qKyC2CW9janAlIuEO/88vJBNXx5Q3uYGPdLHpL4Dx6OUdvPon pOkSeK2sNO8HRrDER5aAzV4g17paFzn0zIno/XyFRc82dsSAloT+mq8568zm6hm7kTk59UX0ASS uLhRVFNNLL9kcByevFUtlcnC5AmOjjMsPn6bjLF/WurmMIqUjLmBju/sEk+TQm37Cr/aXU0XdPv huHBcgRhPq4cZkMnt+AvN2vN3S9s4PjSSuD9Cqa8mOklU4M6BRwgJdaFr7Fw7IUya5vUKY+DjDi M8LR5cbi4VpBfCwSIKZLqwFOkMHx4BEXy/8In4xNDFCoKhlLbe0Hm1ywCaMpj7yDSECZi21d X-Proofpoint-ORIG-GUID: 9h669e0wd74ciX84y0FOoDK_i4zxHE_6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.7,FMLib:17.12.80.40 definitions=2025-06-25_06,2025-06-25_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 spamscore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 priorityscore=1501 phishscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 bulkscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505280000 definitions=main-2506250142 Content-Type: text/plain; charset="utf-8" From: Rob Clark We'll be re-using these for the VM_BIND ioctl. Also, rename a few things in the uapi header to reflect that syncobj use is not specific to the submit ioctl. Signed-off-by: Rob Clark Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/Makefile | 1 + drivers/gpu/drm/msm/msm_gem_submit.c | 192 ++------------------------- drivers/gpu/drm/msm/msm_syncobj.c | 172 ++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_syncobj.h | 37 ++++++ include/uapi/drm/msm_drm.h | 26 ++-- 5 files changed, 235 insertions(+), 193 deletions(-) create mode 100644 drivers/gpu/drm/msm/msm_syncobj.c create mode 100644 drivers/gpu/drm/msm/msm_syncobj.h diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile index 5df20cbeafb8..8af34f87e0c8 100644 --- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile @@ -128,6 +128,7 @@ msm-y +=3D \ msm_rd.o \ msm_ringbuffer.o \ msm_submitqueue.o \ + msm_syncobj.o \ msm_gpu_tracepoints.o \ =20 msm-$(CONFIG_DRM_FBDEV_EMULATION) +=3D msm_fbdev.o diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index 9562b6343e13..9f18771a1e88 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -16,6 +16,7 @@ #include "msm_gpu.h" #include "msm_gem.h" #include "msm_gpu_trace.h" +#include "msm_syncobj.h" =20 /* For userspace errors, use DRM_UT_DRIVER.. so that userspace can enable * error msgs for debugging, but we don't spam dmesg by default @@ -491,173 +492,6 @@ void msm_submit_retire(struct msm_gem_submit *submit) } } =20 -struct msm_submit_post_dep { - struct drm_syncobj *syncobj; - uint64_t point; - struct dma_fence_chain *chain; -}; - -static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit, - struct drm_file *file, - uint64_t in_syncobjs_addr, - uint32_t nr_in_syncobjs, - size_t syncobj_stride) -{ - struct drm_syncobj **syncobjs =3D NULL; - struct drm_msm_gem_submit_syncobj syncobj_desc =3D {0}; - int ret =3D 0; - uint32_t i, j; - - syncobjs =3D kcalloc(nr_in_syncobjs, sizeof(*syncobjs), - GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); - if (!syncobjs) - return ERR_PTR(-ENOMEM); - - for (i =3D 0; i < nr_in_syncobjs; ++i) { - uint64_t address =3D in_syncobjs_addr + i * syncobj_stride; - - if (copy_from_user(&syncobj_desc, - u64_to_user_ptr(address), - min(syncobj_stride, sizeof(syncobj_desc)))) { - ret =3D -EFAULT; - break; - } - - if (syncobj_desc.point && - !drm_core_check_feature(submit->dev, DRIVER_SYNCOBJ_TIMELINE)) { - ret =3D SUBMIT_ERROR(EOPNOTSUPP, submit, "syncobj timeline unsupported"= ); - break; - } - - if (syncobj_desc.flags & ~MSM_SUBMIT_SYNCOBJ_FLAGS) { - ret =3D SUBMIT_ERROR(EINVAL, submit, "invalid syncobj flags: %x", synco= bj_desc.flags); - break; - } - - ret =3D drm_sched_job_add_syncobj_dependency(&submit->base, file, - syncobj_desc.handle, syncobj_desc.point); - if (ret) - break; - - if (syncobj_desc.flags & MSM_SUBMIT_SYNCOBJ_RESET) { - syncobjs[i] =3D - drm_syncobj_find(file, syncobj_desc.handle); - if (!syncobjs[i]) { - ret =3D SUBMIT_ERROR(EINVAL, submit, "invalid syncobj handle: %u", i); - break; - } - } - } - - if (ret) { - for (j =3D 0; j <=3D i; ++j) { - if (syncobjs[j]) - drm_syncobj_put(syncobjs[j]); - } - kfree(syncobjs); - return ERR_PTR(ret); - } - return syncobjs; -} - -static void msm_reset_syncobjs(struct drm_syncobj **syncobjs, - uint32_t nr_syncobjs) -{ - uint32_t i; - - for (i =3D 0; syncobjs && i < nr_syncobjs; ++i) { - if (syncobjs[i]) - drm_syncobj_replace_fence(syncobjs[i], NULL); - } -} - -static struct msm_submit_post_dep *msm_parse_post_deps(struct drm_device *= dev, - struct drm_file *fi= le, - uint64_t syncobjs_a= ddr, - uint32_t nr_syncobj= s, - size_t syncobj_stri= de) -{ - struct msm_submit_post_dep *post_deps; - struct drm_msm_gem_submit_syncobj syncobj_desc =3D {0}; - int ret =3D 0; - uint32_t i, j; - - post_deps =3D kcalloc(nr_syncobjs, sizeof(*post_deps), - GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); - if (!post_deps) - return ERR_PTR(-ENOMEM); - - for (i =3D 0; i < nr_syncobjs; ++i) { - uint64_t address =3D syncobjs_addr + i * syncobj_stride; - - if (copy_from_user(&syncobj_desc, - u64_to_user_ptr(address), - min(syncobj_stride, sizeof(syncobj_desc)))) { - ret =3D -EFAULT; - break; - } - - post_deps[i].point =3D syncobj_desc.point; - - if (syncobj_desc.flags) { - ret =3D UERR(EINVAL, dev, "invalid syncobj flags"); - break; - } - - if (syncobj_desc.point) { - if (!drm_core_check_feature(dev, - DRIVER_SYNCOBJ_TIMELINE)) { - ret =3D UERR(EOPNOTSUPP, dev, "syncobj timeline unsupported"); - break; - } - - post_deps[i].chain =3D dma_fence_chain_alloc(); - if (!post_deps[i].chain) { - ret =3D -ENOMEM; - break; - } - } - - post_deps[i].syncobj =3D - drm_syncobj_find(file, syncobj_desc.handle); - if (!post_deps[i].syncobj) { - ret =3D UERR(EINVAL, dev, "invalid syncobj handle"); - break; - } - } - - if (ret) { - for (j =3D 0; j <=3D i; ++j) { - dma_fence_chain_free(post_deps[j].chain); - if (post_deps[j].syncobj) - drm_syncobj_put(post_deps[j].syncobj); - } - - kfree(post_deps); - return ERR_PTR(ret); - } - - return post_deps; -} - -static void msm_process_post_deps(struct msm_submit_post_dep *post_deps, - uint32_t count, struct dma_fence *fence) -{ - uint32_t i; - - for (i =3D 0; post_deps && i < count; ++i) { - if (post_deps[i].chain) { - drm_syncobj_add_point(post_deps[i].syncobj, - post_deps[i].chain, - fence, post_deps[i].point); - post_deps[i].chain =3D NULL; - } else { - drm_syncobj_replace_fence(post_deps[i].syncobj, - fence); - } - } -} - int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_file *file) { @@ -668,7 +502,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *= data, struct msm_gpu *gpu =3D priv->gpu; struct msm_gpu_submitqueue *queue; struct msm_ringbuffer *ring; - struct msm_submit_post_dep *post_deps =3D NULL; + struct msm_syncobj_post_dep *post_deps =3D NULL; struct drm_syncobj **syncobjs_to_reset =3D NULL; struct sync_file *sync_file =3D NULL; int out_fence_fd =3D -1; @@ -745,10 +579,10 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void= *data, } =20 if (args->flags & MSM_SUBMIT_SYNCOBJ_IN) { - syncobjs_to_reset =3D msm_parse_deps(submit, file, - args->in_syncobjs, - args->nr_in_syncobjs, - args->syncobj_stride); + syncobjs_to_reset =3D msm_syncobj_parse_deps(dev, &submit->base, + file, args->in_syncobjs, + args->nr_in_syncobjs, + args->syncobj_stride); if (IS_ERR(syncobjs_to_reset)) { ret =3D PTR_ERR(syncobjs_to_reset); goto out_unlock; @@ -756,10 +590,10 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void= *data, } =20 if (args->flags & MSM_SUBMIT_SYNCOBJ_OUT) { - post_deps =3D msm_parse_post_deps(dev, file, - args->out_syncobjs, - args->nr_out_syncobjs, - args->syncobj_stride); + post_deps =3D msm_syncobj_parse_post_deps(dev, file, + args->out_syncobjs, + args->nr_out_syncobjs, + args->syncobj_stride); if (IS_ERR(post_deps)) { ret =3D PTR_ERR(post_deps); goto out_unlock; @@ -902,10 +736,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void = *data, args->fence =3D submit->fence_id; queue->last_fence =3D submit->fence_id; =20 - msm_reset_syncobjs(syncobjs_to_reset, args->nr_in_syncobjs); - msm_process_post_deps(post_deps, args->nr_out_syncobjs, - submit->user_fence); - + msm_syncobj_reset(syncobjs_to_reset, args->nr_in_syncobjs); + msm_syncobj_process_post_deps(post_deps, args->nr_out_syncobjs, submit->u= ser_fence); =20 out: submit_cleanup(submit, !!ret); diff --git a/drivers/gpu/drm/msm/msm_syncobj.c b/drivers/gpu/drm/msm/msm_sy= ncobj.c new file mode 100644 index 000000000000..4baa9f522c54 --- /dev/null +++ b/drivers/gpu/drm/msm/msm_syncobj.c @@ -0,0 +1,172 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (C) 2020 Google, Inc */ + +#include "drm/drm_drv.h" + +#include "msm_drv.h" +#include "msm_syncobj.h" + +struct drm_syncobj ** +msm_syncobj_parse_deps(struct drm_device *dev, + struct drm_sched_job *job, + struct drm_file *file, + uint64_t in_syncobjs_addr, + uint32_t nr_in_syncobjs, + size_t syncobj_stride) +{ + struct drm_syncobj **syncobjs =3D NULL; + struct drm_msm_syncobj syncobj_desc =3D {0}; + int ret =3D 0; + uint32_t i, j; + + syncobjs =3D kcalloc(nr_in_syncobjs, sizeof(*syncobjs), + GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); + if (!syncobjs) + return ERR_PTR(-ENOMEM); + + for (i =3D 0; i < nr_in_syncobjs; ++i) { + uint64_t address =3D in_syncobjs_addr + i * syncobj_stride; + + if (copy_from_user(&syncobj_desc, + u64_to_user_ptr(address), + min(syncobj_stride, sizeof(syncobj_desc)))) { + ret =3D -EFAULT; + break; + } + + if (syncobj_desc.point && + !drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE)) { + ret =3D UERR(EOPNOTSUPP, dev, "syncobj timeline unsupported"); + break; + } + + if (syncobj_desc.flags & ~MSM_SYNCOBJ_FLAGS) { + ret =3D UERR(EINVAL, dev, "invalid syncobj flags: %x", syncobj_desc.fla= gs); + break; + } + + ret =3D drm_sched_job_add_syncobj_dependency(job, file, + syncobj_desc.handle, + syncobj_desc.point); + if (ret) + break; + + if (syncobj_desc.flags & MSM_SYNCOBJ_RESET) { + syncobjs[i] =3D drm_syncobj_find(file, syncobj_desc.handle); + if (!syncobjs[i]) { + ret =3D UERR(EINVAL, dev, "invalid syncobj handle: %u", i); + break; + } + } + } + + if (ret) { + for (j =3D 0; j <=3D i; ++j) { + if (syncobjs[j]) + drm_syncobj_put(syncobjs[j]); + } + kfree(syncobjs); + return ERR_PTR(ret); + } + return syncobjs; +} + +void +msm_syncobj_reset(struct drm_syncobj **syncobjs, uint32_t nr_syncobjs) +{ + uint32_t i; + + for (i =3D 0; syncobjs && i < nr_syncobjs; ++i) { + if (syncobjs[i]) + drm_syncobj_replace_fence(syncobjs[i], NULL); + } +} + +struct msm_syncobj_post_dep * +msm_syncobj_parse_post_deps(struct drm_device *dev, + struct drm_file *file, + uint64_t syncobjs_addr, + uint32_t nr_syncobjs, + size_t syncobj_stride) +{ + struct msm_syncobj_post_dep *post_deps; + struct drm_msm_syncobj syncobj_desc =3D {0}; + int ret =3D 0; + uint32_t i, j; + + post_deps =3D kcalloc(nr_syncobjs, sizeof(*post_deps), + GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); + if (!post_deps) + return ERR_PTR(-ENOMEM); + + for (i =3D 0; i < nr_syncobjs; ++i) { + uint64_t address =3D syncobjs_addr + i * syncobj_stride; + + if (copy_from_user(&syncobj_desc, + u64_to_user_ptr(address), + min(syncobj_stride, sizeof(syncobj_desc)))) { + ret =3D -EFAULT; + break; + } + + post_deps[i].point =3D syncobj_desc.point; + + if (syncobj_desc.flags) { + ret =3D UERR(EINVAL, dev, "invalid syncobj flags"); + break; + } + + if (syncobj_desc.point) { + if (!drm_core_check_feature(dev, + DRIVER_SYNCOBJ_TIMELINE)) { + ret =3D UERR(EOPNOTSUPP, dev, "syncobj timeline unsupported"); + break; + } + + post_deps[i].chain =3D dma_fence_chain_alloc(); + if (!post_deps[i].chain) { + ret =3D -ENOMEM; + break; + } + } + + post_deps[i].syncobj =3D + drm_syncobj_find(file, syncobj_desc.handle); + if (!post_deps[i].syncobj) { + ret =3D UERR(EINVAL, dev, "invalid syncobj handle"); + break; + } + } + + if (ret) { + for (j =3D 0; j <=3D i; ++j) { + dma_fence_chain_free(post_deps[j].chain); + if (post_deps[j].syncobj) + drm_syncobj_put(post_deps[j].syncobj); + } + + kfree(post_deps); + return ERR_PTR(ret); + } + + return post_deps; +} + +void +msm_syncobj_process_post_deps(struct msm_syncobj_post_dep *post_deps, + uint32_t count, struct dma_fence *fence) +{ + uint32_t i; + + for (i =3D 0; post_deps && i < count; ++i) { + if (post_deps[i].chain) { + drm_syncobj_add_point(post_deps[i].syncobj, + post_deps[i].chain, + fence, post_deps[i].point); + post_deps[i].chain =3D NULL; + } else { + drm_syncobj_replace_fence(post_deps[i].syncobj, + fence); + } + } +} diff --git a/drivers/gpu/drm/msm/msm_syncobj.h b/drivers/gpu/drm/msm/msm_sy= ncobj.h new file mode 100644 index 000000000000..bcaa15d01da0 --- /dev/null +++ b/drivers/gpu/drm/msm/msm_syncobj.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (C) 2020 Google, Inc */ + +#ifndef __MSM_GEM_SYNCOBJ_H__ +#define __MSM_GEM_SYNCOBJ_H__ + +#include "drm/drm_device.h" +#include "drm/drm_syncobj.h" +#include "drm/gpu_scheduler.h" + +struct msm_syncobj_post_dep { + struct drm_syncobj *syncobj; + uint64_t point; + struct dma_fence_chain *chain; +}; + +struct drm_syncobj ** +msm_syncobj_parse_deps(struct drm_device *dev, + struct drm_sched_job *job, + struct drm_file *file, + uint64_t in_syncobjs_addr, + uint32_t nr_in_syncobjs, + size_t syncobj_stride); + +void msm_syncobj_reset(struct drm_syncobj **syncobjs, uint32_t nr_syncobjs= ); + +struct msm_syncobj_post_dep * +msm_syncobj_parse_post_deps(struct drm_device *dev, + struct drm_file *file, + uint64_t syncobjs_addr, + uint32_t nr_syncobjs, + size_t syncobj_stride); + +void msm_syncobj_process_post_deps(struct msm_syncobj_post_dep *post_deps, + uint32_t count, struct dma_fence *fence); + +#endif /* __MSM_GEM_SYNCOBJ_H__ */ diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h index 1bccc347945c..2c2fc4b284d0 100644 --- a/include/uapi/drm/msm_drm.h +++ b/include/uapi/drm/msm_drm.h @@ -220,6 +220,17 @@ struct drm_msm_gem_cpu_fini { * Cmdstream Submission: */ =20 +#define MSM_SYNCOBJ_RESET 0x00000001 /* Reset syncobj after wait. */ +#define MSM_SYNCOBJ_FLAGS ( \ + MSM_SYNCOBJ_RESET | \ + 0) + +struct drm_msm_syncobj { + __u32 handle; /* in, syncobj handle. */ + __u32 flags; /* in, from MSM_SUBMIT_SYNCOBJ_FLAGS */ + __u64 point; /* in, timepoint for timeline syncobjs. */ +}; + /* The value written into the cmdstream is logically: * * ((relocbuf->gpuaddr + reloc_offset) << shift) | or @@ -309,17 +320,6 @@ struct drm_msm_gem_submit_bo { MSM_SUBMIT_FENCE_SN_IN | \ 0) =20 -#define MSM_SUBMIT_SYNCOBJ_RESET 0x00000001 /* Reset syncobj after wait. */ -#define MSM_SUBMIT_SYNCOBJ_FLAGS ( \ - MSM_SUBMIT_SYNCOBJ_RESET | \ - 0) - -struct drm_msm_gem_submit_syncobj { - __u32 handle; /* in, syncobj handle. */ - __u32 flags; /* in, from MSM_SUBMIT_SYNCOBJ_FLAGS */ - __u64 point; /* in, timepoint for timeline syncobjs. */ -}; - /* Each cmdstream submit consists of a table of buffers involved, and * one or more cmdstream buffers. This allows for conditional execution * (context-restore), and IB buffers needed for per tile/bin draw cmds. @@ -333,8 +333,8 @@ struct drm_msm_gem_submit { __u64 cmds; /* in, ptr to array of submit_cmd's */ __s32 fence_fd; /* in/out fence fd (see MSM_SUBMIT_FENCE_FD_IN/OUT)= */ __u32 queueid; /* in, submitqueue id */ - __u64 in_syncobjs; /* in, ptr to array of drm_msm_gem_submit_syncobj */ - __u64 out_syncobjs; /* in, ptr to array of drm_msm_gem_submit_syncobj */ + __u64 in_syncobjs; /* in, ptr to array of drm_msm_syncobj */ + __u64 out_syncobjs; /* in, ptr to array of drm_msm_syncobj */ __u32 nr_in_syncobjs; /* in, number of entries in in_syncobj */ __u32 nr_out_syncobjs; /* in, number of entries in out_syncobj. */ __u32 syncobj_stride; /* in, stride of syncobj arrays. */ --=20 2.49.0