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

Commit f4ce5af7 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

drm/mgag200: Pin framebuffer BO during dirty update



Another explicit lock operation of a GEM VRAM BO is located in mgag200's
framebuffer update code. Instead of locking the BO, we pin it to wherever
it is.

v2:
	* update with pin flag of 0

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190613073041.29350-7-tzimmermann@suse.de
parent da460a29
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,
	struct drm_gem_vram_object *gbo;
	int src_offset, dst_offset;
	int bpp = mfbdev->mfb.base.format->cpp[0];
	int ret = -EBUSY;
	int ret;
	u8 *dst;
	bool unmap = false;
	bool store_for_later = false;
@@ -36,16 +36,18 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,
	obj = mfbdev->mfb.obj;
	gbo = drm_gem_vram_of_gem(obj);

	/* Try to lock the BO. If we fail with -EBUSY then
	 * the BO is being moved and we should store up the
	 * damage until later.
	if (drm_can_sleep()) {
		/* We pin the BO so it won't be moved during the
		 * update. The actual location, video RAM or system
		 * memory, is not important.
		 */
	if (drm_can_sleep())
		ret = drm_gem_vram_lock(gbo, true);
		ret = drm_gem_vram_pin(gbo, 0);
		if (ret) {
			if (ret != -EBUSY)
				return;

			store_for_later = true;
		}
	} else {
		store_for_later = true;
	}

@@ -100,7 +102,7 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,
		drm_gem_vram_kunmap(gbo);

out:
	drm_gem_vram_unlock(gbo);
	drm_gem_vram_unpin(gbo);
}

static void mga_fillrect(struct fb_info *info,