[PATCH v2 4/8] drm/vmwgfx: Simplify fb pinning
Maaz Mombasawala (VMware
maazm at fastmail.com
Wed Feb 1 00:33:58 UTC 2023
On 1/30/23 19:35, Zack Rusin wrote:
> From: Zack Rusin <zackr at vmware.com>
>
> Only the legacy display unit requires pinning of the fb memory in vram.
> Both the screen objects and screen targets can present from any buffer.
> That makes the pinning abstraction pointless. Simplify all of the code
> and move it to the legacy display unit, the only place that needs it.
>
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> Reviewed-by: Martin Krastev <krastevm at vmware.com>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 8 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_bo.h | 4 --
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 66 -----------------------------
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 4 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 57 +++++++++++++++++++++----
> 5 files changed, 54 insertions(+), 85 deletions(-)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index b6dc0baef350..c6dc733f6d45 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -73,10 +73,10 @@ static bool bo_is_vmw(struct ttm_buffer_object *bo)
> * Return: Zero on success, Negative error code on failure. In particular
> * -ERESTARTSYS if interrupted by a signal
> */
> -int vmw_bo_pin_in_placement(struct vmw_private *dev_priv,
> - struct vmw_bo *buf,
> - struct ttm_placement *placement,
> - bool interruptible)
> +static int vmw_bo_pin_in_placement(struct vmw_private *dev_priv,
> + struct vmw_bo *buf,
> + struct ttm_placement *placement,
> + bool interruptible)
> {
> struct ttm_operation_ctx ctx = {interruptible, false };
> struct ttm_buffer_object *bo = &buf->base;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> index 03ef4059c0d2..e2dadd68a16d 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h
> @@ -82,10 +82,6 @@ int vmw_bo_init(struct vmw_private *dev_priv,
> int vmw_bo_unref_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file_priv);
>
> -int vmw_bo_pin_in_placement(struct vmw_private *vmw_priv,
> - struct vmw_bo *bo,
> - struct ttm_placement *placement,
> - bool interruptible);
> int vmw_bo_pin_in_vram(struct vmw_private *dev_priv,
> struct vmw_bo *buf,
> bool interruptible);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index ad41396c0a5d..6780391c57ea 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -1487,69 +1487,6 @@ static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
> .dirty = vmw_framebuffer_bo_dirty_ext,
> };
>
> -/*
> - * Pin the bofer in a location suitable for access by the
> - * display system.
> - */
> -static int vmw_framebuffer_pin(struct vmw_framebuffer *vfb)
> -{
> - struct vmw_private *dev_priv = vmw_priv(vfb->base.dev);
> - struct vmw_bo *buf;
> - struct ttm_placement *placement;
> - int ret;
> -
> - buf = vfb->bo ? vmw_framebuffer_to_vfbd(&vfb->base)->buffer :
> - vmw_framebuffer_to_vfbs(&vfb->base)->surface->res.backup;
> -
> - if (!buf)
> - return 0;
> -
> - switch (dev_priv->active_display_unit) {
> - case vmw_du_legacy:
> - vmw_overlay_pause_all(dev_priv);
> - ret = vmw_bo_pin_in_start_of_vram(dev_priv, buf, false);
> - vmw_overlay_resume_all(dev_priv);
> - break;
> - case vmw_du_screen_object:
> - case vmw_du_screen_target:
> - if (vfb->bo) {
> - if (dev_priv->capabilities & SVGA_CAP_3D) {
> - /*
> - * Use surface DMA to get content to
> - * sreen target surface.
> - */
> - placement = &vmw_vram_gmr_placement;
> - } else {
> - /* Use CPU blit. */
> - placement = &vmw_sys_placement;
> - }
> - } else {
> - /* Use surface / image update */
> - placement = &vmw_mob_placement;
> - }
> -
> - return vmw_bo_pin_in_placement(dev_priv, buf, placement, false);
> - default:
> - return -EINVAL;
> - }
> -
> - return ret;
> -}
> -
> -static int vmw_framebuffer_unpin(struct vmw_framebuffer *vfb)
> -{
> - struct vmw_private *dev_priv = vmw_priv(vfb->base.dev);
> - struct vmw_bo *buf;
> -
> - buf = vfb->bo ? vmw_framebuffer_to_vfbd(&vfb->base)->buffer :
> - vmw_framebuffer_to_vfbs(&vfb->base)->surface->res.backup;
> -
> - if (WARN_ON(!buf))
> - return 0;
> -
> - return vmw_bo_unpin(dev_priv, buf, false);
> -}
> -
> /**
> * vmw_create_bo_proxy - create a proxy surface for the buffer object
> *
> @@ -1766,9 +1703,6 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
> if (ret)
> return ERR_PTR(ret);
>
> - vfb->pin = vmw_framebuffer_pin;
> - vfb->unpin = vmw_framebuffer_unpin;
> -
> return vfb;
> }
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> index 2d097ba20ad8..7a97e53e8e51 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> @@ -1,7 +1,7 @@
> /* SPDX-License-Identifier: GPL-2.0 OR MIT */
> /**************************************************************************
> *
> - * Copyright 2009-2022 VMware, Inc., Palo Alto, CA., USA
> + * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA
> *
> * Permission is hereby granted, free of charge, to any person obtaining a
> * copy of this software and associated documentation files (the
> @@ -217,8 +217,6 @@ struct vmw_kms_dirty {
> */
> struct vmw_framebuffer {
> struct drm_framebuffer base;
> - int (*pin)(struct vmw_framebuffer *fb);
> - int (*unpin)(struct vmw_framebuffer *fb);
> bool bo;
> uint32_t user_handle;
> };
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> index a56e5d0ca3c6..b77fe0bc18a7 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> @@ -1,7 +1,7 @@
> // SPDX-License-Identifier: GPL-2.0 OR MIT
> /**************************************************************************
> *
> - * Copyright 2009-2022 VMware, Inc., Palo Alto, CA., USA
> + * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA
> *
> * Permission is hereby granted, free of charge, to any person obtaining a
> * copy of this software and associated documentation files (the
> @@ -25,11 +25,13 @@
> *
> **************************************************************************/
>
> +#include "vmwgfx_bo.h"
> +#include "vmwgfx_kms.h"
> +
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_fourcc.h>
>
> -#include "vmwgfx_kms.h"
>
> #define vmw_crtc_to_ldu(x) \
> container_of(x, struct vmw_legacy_display_unit, base.crtc)
> @@ -134,6 +136,47 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv)
> return 0;
> }
>
> +/*
> + * Pin the buffer in a location suitable for access by the
> + * display system.
> + */
> +static int vmw_ldu_fb_pin(struct vmw_framebuffer *vfb)
> +{
> + struct vmw_private *dev_priv = vmw_priv(vfb->base.dev);
> + struct vmw_bo *buf;
> + int ret;
> +
> + buf = vfb->bo ? vmw_framebuffer_to_vfbd(&vfb->base)->buffer :
> + vmw_framebuffer_to_vfbs(&vfb->base)->surface->res.backup;
> +
> + if (!buf)
> + return 0;
> + WARN_ON(dev_priv->active_display_unit != vmw_du_legacy);
> +
> + if (dev_priv->active_display_unit == vmw_du_legacy) {
> + vmw_overlay_pause_all(dev_priv);
> + ret = vmw_bo_pin_in_start_of_vram(dev_priv, buf, false);
> + vmw_overlay_resume_all(dev_priv);
> + } else
> + ret = -EINVAL;
> +
> + return ret;
> +}
> +
> +static int vmw_ldu_fb_unpin(struct vmw_framebuffer *vfb)
> +{
> + struct vmw_private *dev_priv = vmw_priv(vfb->base.dev);
> + struct vmw_bo *buf;
> +
> + buf = vfb->bo ? vmw_framebuffer_to_vfbd(&vfb->base)->buffer :
> + vmw_framebuffer_to_vfbs(&vfb->base)->surface->res.backup;
> +
> + if (WARN_ON(!buf))
> + return 0;
> +
> + return vmw_bo_unpin(dev_priv, buf, false);
> +}
> +
> static int vmw_ldu_del_active(struct vmw_private *vmw_priv,
> struct vmw_legacy_display_unit *ldu)
> {
> @@ -145,8 +188,7 @@ static int vmw_ldu_del_active(struct vmw_private *vmw_priv,
> list_del_init(&ldu->active);
> if (--(ld->num_active) == 0) {
> BUG_ON(!ld->fb);
> - if (ld->fb->unpin)
> - ld->fb->unpin(ld->fb);
> + WARN_ON(vmw_ldu_fb_unpin(ld->fb));
> ld->fb = NULL;
> }
>
> @@ -163,11 +205,10 @@ static int vmw_ldu_add_active(struct vmw_private *vmw_priv,
>
> BUG_ON(!ld->num_active && ld->fb);
> if (vfb != ld->fb) {
> - if (ld->fb && ld->fb->unpin)
> - ld->fb->unpin(ld->fb);
> + if (ld->fb)
> + WARN_ON(vmw_ldu_fb_unpin(ld->fb));
> vmw_svga_enable(vmw_priv);
> - if (vfb->pin)
> - vfb->pin(vfb);
> + WARN_ON(vmw_ldu_fb_pin(vfb));
> ld->fb = vfb;
> }
>
LGTM!
Reviewed-by: Maaz Mombasawala <mombasawalam at vmware.com>
--
Maaz Mombasawala (VMware) <maazm at fastmail.com>
More information about the dri-devel
mailing list