drm/vmwgfx: Skipping fbdev fb pinning for ldu
authorSinclair Yeh <syeh@vmware.com>
Thu, 23 Mar 2017 21:41:21 +0000 (14:41 -0700)
committerSinclair Yeh <syeh@vmware.com>
Fri, 31 Mar 2017 22:21:15 +0000 (15:21 -0700)
Pinning fbdev's FB at the start of VRAM prevents X from pinning
its FB.  Since for ldu, the fb would be pinned anyway during a
mode set, just skip pinning it in fbdev.

This is not the best solution, but since ldu is not used much
anymore, it seems like a reasonable workaround.

Signed-off-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c

index 7d3d5e3bcd32e0a1cc262de32303aa45b686df4a..09e120d50e6551f70801d376ace6771ac406b606 100644 (file)
@@ -451,13 +451,15 @@ static int vmw_fb_kms_detach(struct vmw_fb_par *par,
        }
 
        if (par->vmw_bo && detach_bo) {
+               struct vmw_private *vmw_priv = par->vmw_priv;
+
                if (par->bo_ptr) {
                        ttm_bo_kunmap(&par->map);
                        par->bo_ptr = NULL;
                }
                if (unref_bo)
                        vmw_dmabuf_unreference(&par->vmw_bo);
-               else
+               else if (vmw_priv->active_display_unit != vmw_du_legacy)
                        vmw_dmabuf_unpin(par->vmw_priv, par->vmw_bo, false);
        }
 
@@ -585,18 +587,25 @@ static int vmw_fb_set_par(struct fb_info *info)
 
                /*
                 * Pin before mapping. Since we don't know in what placement
-                * to pin, call into KMS to do it for us.
+                * to pin, call into KMS to do it for us.  LDU doesn't require
+                * additional pinning because set_config() would've pinned
+                * it already
                 */
-               ret = vfb->pin(vfb);
-               if (ret) {
-                       DRM_ERROR("Could not pin the fbdev framebuffer.\n");
-                       goto out_unlock;
+               if (vmw_priv->active_display_unit != vmw_du_legacy) {
+                       ret = vfb->pin(vfb);
+                       if (ret) {
+                               DRM_ERROR("Could not pin the fbdev "
+                                         "framebuffer.\n");
+                               goto out_unlock;
+                       }
                }
 
                ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
                                  par->vmw_bo->base.num_pages, &par->map);
                if (ret) {
-                       vfb->unpin(vfb);
+                       if (vmw_priv->active_display_unit != vmw_du_legacy)
+                               vfb->unpin(vfb);
+
                        DRM_ERROR("Could not map the fbdev framebuffer.\n");
                        goto out_unlock;
                }