From patchwork Tue Oct 13 07:00:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joonyoung Shim X-Patchwork-Id: 7381581 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0B9CD9F7C9 for ; Tue, 13 Oct 2015 07:01:08 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0570F206AB for ; Tue, 13 Oct 2015 07:01:07 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id E1EF52093F for ; Tue, 13 Oct 2015 07:01:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0FD896E6CE; Tue, 13 Oct 2015 00:01:04 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4249F6E8DB for ; Tue, 13 Oct 2015 00:00:59 -0700 (PDT) Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NW502JR9CTJW280@mailout2.samsung.com> for dri-devel@lists.freedesktop.org; Tue, 13 Oct 2015 16:00:55 +0900 (KST) Received: from epcpsbgm1new.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 68.F8.05284.72CAC165; Tue, 13 Oct 2015 16:00:55 +0900 (KST) X-AuditID: cbfee68f-f796f6d0000014a4-eb-561cac279c29 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1new.samsung.com (EPCPMTA) with SMTP id 05.AE.23663.72CAC165; Tue, 13 Oct 2015 16:00:55 +0900 (KST) Received: from localhost.localdomain ([10.252.81.123]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NW500D04CTI4DN1@mmp2.samsung.com>; Tue, 13 Oct 2015 16:00:54 +0900 (KST) From: Joonyoung Shim To: dri-devel@lists.freedesktop.org Subject: [PATCH 9/9] drm/exynos: add ioctls for cpu access of gem object from user Date: Tue, 13 Oct 2015 16:00:54 +0900 Message-id: <1444719654-10639-10-git-send-email-jy0922.shim@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1444719654-10639-1-git-send-email-jy0922.shim@samsung.com> References: <1444719654-10639-1-git-send-email-jy0922.shim@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLLMWRmVeSWpSXmKPExsWyRsSkSFd9jUyYwZ/bghZXvr5ns5h0fwKL xYt7F1ksZkx+yebA4nG/+ziTR9+WVYwBTFFcNimpOZllqUX6dglcGXfnPmAtuGdQsfL2AZYG xr8aXYwcHBICJhI/npZ3MXICmWISF+6tZ+ti5OIQEljBKPH28zlGiARQzfXl7CC2kMAsRokV E7whin4wSkz+08YEkmAT0JO4s+04mC0ioCzxd+IqsGZmAU+JFavmgcWFBUIkvvZ1sIHYLAKq Ep3b28HivAIeEnteNrFALJOTOHlsMiuIzQkUf3pwKxvEYneJE0e7WEEWSwi8ZpOYt/wi1CAB iW+TD7FAfCMrsekAM8QcSYmDK26wTGAUXsDIsIpRNLUguaA4Kb3IWK84Mbe4NC9dLzk/dxMj MFRP/3vWv4Px7gHrQ4wCHIxKPLwvImXChFgTy4orcw8xmgJtmMgsJZqcD4yIvJJ4Q2MzIwtT E1NjI3NLMyVx3oVSP4OFBNITS1KzU1MLUovii0pzUosPMTJxcEo1MMq//pp4wLSvePamY7Oy v7jfXV74lie/YMOO1DtaHHtyHryfGDhr74z6Q5uevim01Vm27HgYU0TClEubXMWOS077fb4p eUvTkVCm3uLsxwdMWa0dbnmdnT1nxZnZZvrdN9l81/5+3L3yaYjgxguZ/XcEmY5uEXF//yl5 cpBp90XOs96LPnv6Tj2rxFKckWioxVxUnAgAEGmOcVACAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupmkeLIzCtJLcpLzFFi42I5/e+xoK76Gpkwg7ULeSyufH3PZjHp/gQW ixf3LrJYzJj8ks2BxeN+93Emj74tqxgDmKIaGG0yUhNTUosUUvOS81My89JtlbyD453jTc0M DHUNLS3MlRTyEnNTbZVcfAJ03TJzgFYpKZQl5pQChQISi4uV9O0wTQgNcdO1gGmM0PUNCYLr MTJAAwlrGDPuzn3AWnDPoGLl7QMsDYx/NboYOTkkBEwkflxfzg5hi0lcuLeeDcQWEpjFKLFi gncXIxeQ/YNRYvKfNiaQBJuAnsSdbcfBbBEBZYm/E1cxgtjMAp4SK1bNA4sLC4RIfO3rABvE IqAq0bm9HSzOK+AhsedlEwvEMjmJk8cms4LYnEDxpwe3Qi12lzhxtIt1AiPvAkaGVYwSqQXJ BcVJ6bmGeanlesWJucWleel6yfm5mxjBEfFMagfjwV3uhxgFOBiVeHhfRMqECbEmlhVX5h5i lOBgVhLhTWoBCvGmJFZWpRblxxeV5qQWH2I0BTpsIrOUaHI+MFrzSuINjU3MjCyNzA0tjIzN lcR5bxxiCBMSSE8sSc1OTS1ILYLpY+LglGpg3HJb+KHUOUfBHIn6/cLBgnXHq5L1GH//7pKq 3BZ/UaM2Ttk69gt/57nZRiU/3C93fklPyZ8a8MeY5YBKzf4boq/X39AveVPmfp7z4Xyv53ll 3y7tYPKWk89Yvu335RNbTi0zbdrN3Bdd6GDp+SVzmdHWjTx+b7c5n26f8DOnWSpJof3o1SJv JZbijERDLeai4kQAU9umpZ4CAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Cc: sw0312.kim@samsung.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This adds necessary two ioctls for cpu access of gem object from user. It needs to be synced properly in order for the cpu and device if the buffer of gem object is cachable. - DRM_IOCTL_EXYNOS_GEM_CPU_PREP Should be used explicitly before it will be cpu access of gem object from user. - DRM_IOCTL_EXYNOS_GEM_CPU_FINI Should be used explicitly after it is finished cpu access of gem object from user. Signed-off-by: Joonyoung Shim --- This is based on patch of Daniel dropping DRM_UNLOCKED flag on each drivers[1] and patch that is droped DRM_UNLOCKED flag from my posted patch[2]. [1] http://lists.freedesktop.org/archives/intel-gfx/2015-September/075368.html [2] http://www.spinics.net/lists/dri-devel/msg91465.html drivers/gpu/drm/exynos/exynos_drm_drv.c | 4 +++ drivers/gpu/drm/exynos/exynos_drm_gem.c | 48 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_gem.h | 14 ++++++++++ include/uapi/drm/exynos_drm.h | 18 ++++++++++++- 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 74bf3afed519..f15945c1c01d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -408,6 +408,10 @@ static const struct drm_ioctl_desc exynos_ioctls[] = { DRM_AUTH | DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(EXYNOS_GEM_MAP, exynos_drm_gem_map_ioctl, DRM_AUTH | DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(EXYNOS_GEM_CPU_PREP, exynos_drm_gem_cpu_prep_ioctl, + DRM_AUTH | DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(EXYNOS_GEM_CPU_FINI, exynos_drm_gem_cpu_fini_ioctl, + DRM_AUTH | DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(EXYNOS_GEM_GET, exynos_drm_gem_get_ioctl, DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(EXYNOS_VIDI_CONNECTION, vidi_connection_ioctl, diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 01c5e0854016..4907ad3994db 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -321,6 +321,54 @@ int exynos_drm_gem_map_ioctl(struct drm_device *dev, void *data, &args->offset); } +int exynos_drm_gem_cpu_prep_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_exynos_gem_cpu_access *args = data; + struct drm_gem_object *obj; + struct exynos_drm_gem *exynos_gem; + + obj = drm_gem_object_lookup(dev, file, args->handle); + if (!obj) { + DRM_ERROR("Failed to lookup gem object\n"); + return -EINVAL; + } + + exynos_gem = to_exynos_gem(obj); + + if (exynos_gem->flags & EXYNOS_BO_CACHABLE) + dma_sync_sg_for_cpu(dev->dev, exynos_gem->sgt->sgl, + exynos_gem->sgt->nents, DMA_FROM_DEVICE); + + drm_gem_object_unreference_unlocked(obj); + + return 0; +} + +int exynos_drm_gem_cpu_fini_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_exynos_gem_cpu_access *args = data; + struct drm_gem_object *obj; + struct exynos_drm_gem *exynos_gem; + + obj = drm_gem_object_lookup(dev, file, args->handle); + if (!obj) { + DRM_ERROR("Failed to lookup gem object\n"); + return -EINVAL; + } + + exynos_gem = to_exynos_gem(obj); + + if (exynos_gem->flags & EXYNOS_BO_CACHABLE) + dma_sync_sg_for_device(dev->dev, exynos_gem->sgt->sgl, + exynos_gem->sgt->nents, DMA_TO_DEVICE); + + drm_gem_object_unreference_unlocked(obj); + + return 0; +} + dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev, unsigned int gem_handle, struct drm_file *filp) diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index e9eb5631f322..d5aac38f455a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -74,6 +74,20 @@ int exynos_drm_gem_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); /* + * Should be used explicitly before it will be cpu access of gem object + * from user. + */ +int exynos_drm_gem_cpu_prep_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* + * Should be used explicitly after it is finished cpu access of gem + * object from user. + */ +int exynos_drm_gem_cpu_fini_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +/* * get dma address from gem handle and this function could be used for * other drivers such as 2d/3d acceleration drivers. * with this function call, gem object reference count would be increased. diff --git a/include/uapi/drm/exynos_drm.h b/include/uapi/drm/exynos_drm.h index 1d7c80734e43..b16a9a9ea34e 100644 --- a/include/uapi/drm/exynos_drm.h +++ b/include/uapi/drm/exynos_drm.h @@ -46,6 +46,16 @@ struct drm_exynos_gem_map { }; /** + * A structure for cpu access of gem object from user. + * + * @handle: handle of gem object. + */ +struct drm_exynos_gem_cpu_access { + __u32 handle; + __u32 reserved; +}; + +/** * A structure to gem information. * * @handle: a handle to gem object created. @@ -301,8 +311,10 @@ struct drm_exynos_ipp_cmd_ctrl { #define DRM_EXYNOS_GEM_CREATE 0x00 #define DRM_EXYNOS_GEM_MAP 0x01 -/* Reserved 0x03 ~ 0x05 for exynos specific gem ioctl */ +#define DRM_EXYNOS_GEM_CPU_PREP 0x02 +#define DRM_EXYNOS_GEM_CPU_FINI 0x03 #define DRM_EXYNOS_GEM_GET 0x04 +/* Reserved 0x05 ~ 0x06 for exynos specific gem ioctl */ #define DRM_EXYNOS_VIDI_CONNECTION 0x07 /* G2D */ @@ -320,6 +332,10 @@ struct drm_exynos_ipp_cmd_ctrl { DRM_EXYNOS_GEM_CREATE, struct drm_exynos_gem_create) #define DRM_IOCTL_EXYNOS_GEM_MAP DRM_IOWR(DRM_COMMAND_BASE + \ DRM_EXYNOS_GEM_MAP, struct drm_exynos_gem_map) +#define DRM_IOCTL_EXYNOS_GEM_CPU_PREP DRM_IOWR(DRM_COMMAND_BASE + \ + DRM_EXYNOS_GEM_CPU_PREP, struct drm_exynos_gem_cpu_access) +#define DRM_IOCTL_EXYNOS_GEM_CPU_FINI DRM_IOWR(DRM_COMMAND_BASE + \ + DRM_EXYNOS_GEM_CPU_FINI, struct drm_exynos_gem_cpu_access) #define DRM_IOCTL_EXYNOS_GEM_GET DRM_IOWR(DRM_COMMAND_BASE + \ DRM_EXYNOS_GEM_GET, struct drm_exynos_gem_info)