* 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;
 
 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);
 
        .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
  *
        if (ret)
                return ERR_PTR(ret);
 
-       vfb->pin = vmw_framebuffer_pin;
-       vfb->unpin = vmw_framebuffer_unpin;
-
        return vfb;
 }
 
 
 /* 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
  */
 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;
 };
 
 // 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
  *
  **************************************************************************/
 
+#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)
        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)
 {
        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;
        }
 
 
        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;
        }