Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5f1a291 authored by Sinclair Yeh's avatar Sinclair Yeh
Browse files

drm/vmwgfx: Delay pinning fbdev framebuffer until after mode set



For the Screen Object display unit, we need to reserve a
guest-invisible region equal to the size of the framebuffer for
the host.  This region can only be reserved in VRAM, whereas
the guest-visible framebuffer can be reserved in either VRAM or
GMR.

As such priority should be given to the guest-invisible
region otherwise in a limited VRAM situation, we can fail to
allocate this region.

This patch makes it so that vmw_sou_backing_alloc() is called
before the framebuffer is pinned.

Signed-off-by: default avatarSinclair Yeh <syeh@vmware.com>
Reviewed-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Cc: <stable@vger.kernel.org>
---
This is the last patch of a 3-patch series to fix console black
screen issue on Ubuntu 16.04 server
parent 4ed7e224
Loading
Loading
Loading
Loading
+25 −22
Original line number Diff line number Diff line
@@ -517,28 +517,6 @@ static int vmw_fb_kms_framebuffer(struct fb_info *info)

	par->set_fb = &vfb->base;

	if (!par->bo_ptr) {
		/*
		 * Pin before mapping. Since we don't know in what placement
		 * to pin, call into KMS to do it for us.
		 */
		ret = vfb->pin(vfb);
		if (ret) {
			DRM_ERROR("Could not pin the fbdev framebuffer.\n");
			return ret;
		}

		ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
				  par->vmw_bo->base.num_pages, &par->map);
		if (ret) {
			vfb->unpin(vfb);
			DRM_ERROR("Could not map the fbdev framebuffer.\n");
			return ret;
		}

		par->bo_ptr = ttm_kmap_obj_virtual(&par->map, &par->bo_iowrite);
	}

	return 0;
}

@@ -601,6 +579,31 @@ static int vmw_fb_set_par(struct fb_info *info)
	if (ret)
		goto out_unlock;

	if (!par->bo_ptr) {
		struct vmw_framebuffer *vfb = vmw_framebuffer_to_vfb(set.fb);

		/*
		 * Pin before mapping. Since we don't know in what placement
		 * to pin, call into KMS to do it for us.
		 */
		ret = vfb->pin(vfb);
		if (ret) {
			DRM_ERROR("Could not pin the fbdev framebuffer.\n");
			return ret;
		}

		ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
				  par->vmw_bo->base.num_pages, &par->map);
		if (ret) {
			vfb->unpin(vfb);
			DRM_ERROR("Could not map the fbdev framebuffer.\n");
			return ret;
		}

		par->bo_ptr = ttm_kmap_obj_virtual(&par->map, &par->bo_iowrite);
	}


	vmw_fb_dirty_mark(par, par->fb_x, par->fb_y,
			  par->set_fb->width, par->set_fb->height);