From nobody Mon Feb 9 08:11:48 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1602765531; cv=none; d=zohomail.com; s=zohoarc; b=Nx+DO1PHu1ypIrMi0lG2ZlVU1m8KMDLlX0EpdfBKIGJQ0k8ek7SHHTOQSoQ1r0koAwCjocK1KsR9f0req6RXL0xXjUBQ1nYQPB9/ESUFgyrpvVrRaGrNMojpMojZwq4Vq+KbRHh/T8k8qLdqJONfvhKupjNzKO941Y6rNZkbb/4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602765531; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=uNhA09qlpF0ZWpl73YtRBj6UbPTjJMBRgcrjSTlyD6Y=; b=lUiVmHglDkpEMsFYpnuvKg/pHFFIf86hhpdcrgCQMrCblxad2mE6/av0lSdLIoPxP01RZG3ztce1VuXgzEBOY+NF18ex7tuYPkhIqgzAwCJoiPyCJ1cp2S42u3FPEe7jLm9z9d61YT5Pco7vn8fom8671bb0Tr3D1JBTBHCUraA= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1602765531850594.1839806511715; Thu, 15 Oct 2020 05:38:51 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.7301.19116 (Exim 4.92) (envelope-from ) id 1kT2Wi-00010Z-QF; Thu, 15 Oct 2020 12:38:36 +0000 Received: by outflank-mailman (output) from mailman id 7301.19116; Thu, 15 Oct 2020 12:38:36 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kT2Wi-00010F-JB; Thu, 15 Oct 2020 12:38:36 +0000 Received: by outflank-mailman (input) for mailman id 7301; Thu, 15 Oct 2020 12:38:35 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kT2Wg-0000WT-WB for xen-devel@lists.xenproject.org; Thu, 15 Oct 2020 12:38:35 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 72199514-ffd8-427d-a971-e46c3b277dac; Thu, 15 Oct 2020 12:38:17 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 28C49B19A; Thu, 15 Oct 2020 12:38:16 +0000 (UTC) Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kT2Wg-0000WT-WB for xen-devel@lists.xenproject.org; Thu, 15 Oct 2020 12:38:35 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 72199514-ffd8-427d-a971-e46c3b277dac; Thu, 15 Oct 2020 12:38:17 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 28C49B19A; Thu, 15 Oct 2020 12:38:16 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 72199514-ffd8-427d-a971-e46c3b277dac X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Thomas Zimmermann To: maarten.lankhorst@linux.intel.com, mripard@kernel.org, airlied@linux.ie, daniel@ffwll.ch, sam@ravnborg.org, alexander.deucher@amd.com, christian.koenig@amd.com, kraxel@redhat.com, l.stach@pengutronix.de, linux+etnaviv@armlinux.org.uk, christian.gmeiner@gmail.com, inki.dae@samsung.com, jy0922.shim@samsung.com, sw0312.kim@samsung.com, kyungmin.park@samsung.com, kgene@kernel.org, krzk@kernel.org, yuq825@gmail.com, bskeggs@redhat.com, robh@kernel.org, tomeu.vizoso@collabora.com, steven.price@arm.com, alyssa.rosenzweig@collabora.com, hjc@rock-chips.com, heiko@sntech.de, hdegoede@redhat.com, sean@poorly.run, eric@anholt.net, oleksandr_andrushchenko@epam.com, ray.huang@amd.com, sumit.semwal@linaro.org, emil.velikov@collabora.com, luben.tuikov@amd.com, apaneers@amd.com, linus.walleij@linaro.org, melissa.srw@gmail.com, chris@chris-wilson.co.uk, miaoqinglang@huawei.com Cc: dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, virtualization@lists.linux-foundation.org, etnaviv@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, lima@lists.freedesktop.org, nouveau@lists.freedesktop.org, spice-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, xen-devel@lists.xenproject.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, Thomas Zimmermann , Daniel Vetter Subject: [PATCH v4 08/10] drm/gem: Store client buffer mappings as struct dma_buf_map Date: Thu, 15 Oct 2020 14:38:04 +0200 Message-Id: <20201015123806.32416-9-tzimmermann@suse.de> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201015123806.32416-1-tzimmermann@suse.de> References: <20201015123806.32416-1-tzimmermann@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Kernel DRM clients now store their framebuffer address in an instance of struct dma_buf_map. Depending on the buffer's location, the address refers to system or I/O memory. Callers of drm_client_buffer_vmap() receive a copy of the value in the call's supplied arguments. It can be accessed and modified with dma_buf_map interfaces. Signed-off-by: Thomas Zimmermann Reviewed-by: Daniel Vetter --- drivers/gpu/drm/drm_client.c | 34 +++++++++++++++++++-------------- drivers/gpu/drm/drm_fb_helper.c | 23 +++++++++++++--------- include/drm/drm_client.h | 7 ++++--- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c index ac0082bed966..fe573acf1067 100644 --- a/drivers/gpu/drm/drm_client.c +++ b/drivers/gpu/drm/drm_client.c @@ -235,7 +235,7 @@ static void drm_client_buffer_delete(struct drm_client_= buffer *buffer) { struct drm_device *dev =3D buffer->client->dev; =20 - drm_gem_vunmap(buffer->gem, buffer->vaddr); + drm_gem_vunmap(buffer->gem, &buffer->map); =20 if (buffer->gem) drm_gem_object_put(buffer->gem); @@ -291,25 +291,31 @@ drm_client_buffer_create(struct drm_client_dev *clien= t, u32 width, u32 height, u /** * drm_client_buffer_vmap - Map DRM client buffer into address space * @buffer: DRM client buffer + * @map_copy: Returns the mapped memory's address * * This function maps a client buffer into kernel address space. If the - * buffer is already mapped, it returns the mapping's address. + * buffer is already mapped, it returns the existing mapping's address. * * Client buffer mappings are not ref'counted. Each call to * drm_client_buffer_vmap() should be followed by a call to * drm_client_buffer_vunmap(); or the client buffer should be mapped * throughout its lifetime. * + * The returned address is a copy of the internal value. In contrast to + * other vmap interfaces, you don't need it for the client's vunmap + * function. So you can modify it at will during blit and draw operations. + * * Returns: - * The mapped memory's address + * 0 on success, or a negative errno code otherwise. */ -void *drm_client_buffer_vmap(struct drm_client_buffer *buffer) +int +drm_client_buffer_vmap(struct drm_client_buffer *buffer, struct dma_buf_ma= p *map_copy) { - struct dma_buf_map map; + struct dma_buf_map *map =3D &buffer->map; int ret; =20 - if (buffer->vaddr) - return buffer->vaddr; + if (dma_buf_map_is_set(map)) + goto out; =20 /* * FIXME: The dependency on GEM here isn't required, we could @@ -319,13 +325,14 @@ void *drm_client_buffer_vmap(struct drm_client_buffer= *buffer) * fd_install step out of the driver backend hooks, to make that * final step optional for internal users. */ - ret =3D drm_gem_vmap(buffer->gem, &map); + ret =3D drm_gem_vmap(buffer->gem, map); if (ret) - return ERR_PTR(ret); + return ret; =20 - buffer->vaddr =3D map.vaddr; +out: + *map_copy =3D *map; =20 - return map.vaddr; + return 0; } EXPORT_SYMBOL(drm_client_buffer_vmap); =20 @@ -339,10 +346,9 @@ EXPORT_SYMBOL(drm_client_buffer_vmap); */ void drm_client_buffer_vunmap(struct drm_client_buffer *buffer) { - struct dma_buf_map map =3D DMA_BUF_MAP_INIT_VADDR(buffer->vaddr); + struct dma_buf_map *map =3D &buffer->map; =20 - drm_gem_vunmap(buffer->gem, &map); - buffer->vaddr =3D NULL; + drm_gem_vunmap(buffer->gem, map); } EXPORT_SYMBOL(drm_client_buffer_vunmap); =20 diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helpe= r.c index c2f72bb6afb1..6212cd7cde1d 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -378,7 +378,7 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb= _helper *fb_helper, unsigned int cpp =3D fb->format->cpp[0]; size_t offset =3D clip->y1 * fb->pitches[0] + clip->x1 * cpp; void *src =3D fb_helper->fbdev->screen_buffer + offset; - void *dst =3D fb_helper->buffer->vaddr + offset; + void *dst =3D fb_helper->buffer->map.vaddr + offset; size_t len =3D (clip->x2 - clip->x1) * cpp; unsigned int y; =20 @@ -400,7 +400,8 @@ static void drm_fb_helper_dirty_work(struct work_struct= *work) struct drm_clip_rect *clip =3D &helper->dirty_clip; struct drm_clip_rect clip_copy; unsigned long flags; - void *vaddr; + struct dma_buf_map map; + int ret; =20 spin_lock_irqsave(&helper->dirty_lock, flags); clip_copy =3D *clip; @@ -413,8 +414,8 @@ static void drm_fb_helper_dirty_work(struct work_struct= *work) =20 /* Generic fbdev uses a shadow buffer */ if (helper->buffer) { - vaddr =3D drm_client_buffer_vmap(helper->buffer); - if (IS_ERR(vaddr)) + ret =3D drm_client_buffer_vmap(helper->buffer, &map); + if (ret) return; drm_fb_helper_dirty_blit_real(helper, &clip_copy); } @@ -2060,7 +2061,8 @@ static int drm_fb_helper_generic_probe(struct drm_fb_= helper *fb_helper, struct drm_framebuffer *fb; struct fb_info *fbi; u32 format; - void *vaddr; + struct dma_buf_map map; + int ret; =20 drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n", sizes->surface_width, sizes->surface_height, @@ -2096,11 +2098,14 @@ static int drm_fb_helper_generic_probe(struct drm_f= b_helper *fb_helper, fb_deferred_io_init(fbi); } else { /* buffer is mapped for HW framebuffer */ - vaddr =3D drm_client_buffer_vmap(fb_helper->buffer); - if (IS_ERR(vaddr)) - return PTR_ERR(vaddr); + ret =3D drm_client_buffer_vmap(fb_helper->buffer, &map); + if (ret) + return ret; + if (map.is_iomem) + fbi->screen_base =3D map.vaddr_iomem; + else + fbi->screen_buffer =3D map.vaddr; =20 - fbi->screen_buffer =3D vaddr; /* Shamelessly leak the physical address to user-space */ #if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM) if (drm_leak_fbdev_smem && fbi->fix.smem_start =3D=3D 0) diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h index 7aaea665bfc2..f07f2fb02e75 100644 --- a/include/drm/drm_client.h +++ b/include/drm/drm_client.h @@ -3,6 +3,7 @@ #ifndef _DRM_CLIENT_H_ #define _DRM_CLIENT_H_ =20 +#include #include #include #include @@ -141,9 +142,9 @@ struct drm_client_buffer { struct drm_gem_object *gem; =20 /** - * @vaddr: Virtual address for the buffer + * @map: Virtual address for the buffer */ - void *vaddr; + struct dma_buf_map map; =20 /** * @fb: DRM framebuffer @@ -155,7 +156,7 @@ struct drm_client_buffer * drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u3= 2 height, u32 format); void drm_client_framebuffer_delete(struct drm_client_buffer *buffer); int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct = drm_rect *rect); -void *drm_client_buffer_vmap(struct drm_client_buffer *buffer); +int drm_client_buffer_vmap(struct drm_client_buffer *buffer, struct dma_bu= f_map *map); void drm_client_buffer_vunmap(struct drm_client_buffer *buffer); =20 int drm_client_modeset_create(struct drm_client_dev *client); --=20 2.28.0