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

Commit 9d7e7002 authored by Daniel Stone's avatar Daniel Stone
Browse files

drm/cirrus: Place GEM BOs in drm_framebuffer



Since drm_framebuffer can now store GEM objects directly, place them
there rather than in our own subclass. As this makes the framebuffer
create_handle and destroy functions the same as the GEM framebuffer
helper, we can reuse those.

Signed-off-by: default avatarDaniel Stone <daniels@collabora.com>
Reviewed-by: default avatarThierry Reding <treding@nvidia.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: virtualization@lists.linux-foundation.org
Link: https://patchwork.freedesktop.org/patch/msgid/20180330141138.28987-1-daniels@collabora.com
parent c9b6be7d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -119,7 +119,6 @@ struct cirrus_connector {

struct cirrus_framebuffer {
	struct drm_framebuffer		base;
	struct drm_gem_object *obj;
};

struct cirrus_mc {
+4 −4
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
	int x2, y2;
	unsigned long flags;

	obj = afbdev->gfb.obj;
	obj = afbdev->gfb.base.obj[0];
	bo = gem_to_cirrus_bo(obj);

	/*
@@ -250,9 +250,9 @@ static int cirrus_fbdev_destroy(struct drm_device *dev,

	drm_fb_helper_unregister_fbi(&gfbdev->helper);

	if (gfb->obj) {
		drm_gem_object_put_unlocked(gfb->obj);
		gfb->obj = NULL;
	if (gfb->base.obj[0]) {
		drm_gem_object_put_unlocked(gfb->base.obj[0]);
		gfb->base.obj[0] = NULL;
	}

	vfree(gfbdev->sysram);
+4 −21
Original line number Diff line number Diff line
@@ -10,30 +10,13 @@
 */
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>

#include "cirrus_drv.h"

static int cirrus_create_handle(struct drm_framebuffer *fb,
				struct drm_file* file_priv,
				unsigned int* handle)
{
	struct cirrus_framebuffer *cirrus_fb = to_cirrus_framebuffer(fb);

	return drm_gem_handle_create(file_priv, cirrus_fb->obj, handle);
}

static void cirrus_user_framebuffer_destroy(struct drm_framebuffer *fb)
{
	struct cirrus_framebuffer *cirrus_fb = to_cirrus_framebuffer(fb);

	drm_gem_object_put_unlocked(cirrus_fb->obj);
	drm_framebuffer_cleanup(fb);
	kfree(fb);
}

static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
	.create_handle = cirrus_create_handle,
	.destroy = cirrus_user_framebuffer_destroy,
	.create_handle = drm_gem_fb_create_handle,
	.destroy = drm_gem_fb_destroy,
};

int cirrus_framebuffer_init(struct drm_device *dev,
@@ -44,7 +27,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
	int ret;

	drm_helper_mode_fill_fb_struct(dev, &gfb->base, mode_cmd);
	gfb->obj = obj;
	gfb->base.obj[0] = obj;
	ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs);
	if (ret) {
		DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
+2 −2
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
	/* push the previous fb to system ram */
	if (!atomic && fb) {
		cirrus_fb = to_cirrus_framebuffer(fb);
		obj = cirrus_fb->obj;
		obj = cirrus_fb->base.obj[0];
		bo = gem_to_cirrus_bo(obj);
		ret = cirrus_bo_reserve(bo, false);
		if (ret)
@@ -120,7 +120,7 @@ static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
	}

	cirrus_fb = to_cirrus_framebuffer(crtc->primary->fb);
	obj = cirrus_fb->obj;
	obj = cirrus_fb->base.obj[0];
	bo = gem_to_cirrus_bo(obj);

	ret = cirrus_bo_reserve(bo, false);