dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers
@ 2019-11-14 14:10 Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 1/5] drm/udl: Unmap buffer object after damage update Thomas Zimmermann
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

Udl uses struct udl_framebuffer for representing its framebuffer. The
type can be replaced by the standard DRM framebuffer structure.

Patches 1 to 4 prepare the driver for the conversion. Patch 5 replaces
the structure.

The patchset has been tested by running the fb console, X11 and Weston
on a DisplayLink adapter.

Thomas Zimmermann (5):
  drm/udl: Unmap buffer object after damage update
  drm/udl: Remove udl implementation of GEM's free_object()
  drm/udl: Store active framebuffer in device structure
  drm/udl: Call udl_handle_damage() with DRM framebuffer
  drm/udl: Replace struct udl_framebuffer with generic implementation

 drivers/gpu/drm/udl/udl_drv.h     |  14 ++--
 drivers/gpu/drm/udl/udl_fb.c      | 131 +++++++++++-------------------
 drivers/gpu/drm/udl/udl_gem.c     |  18 +---
 drivers/gpu/drm/udl/udl_main.c    |   3 +
 drivers/gpu/drm/udl/udl_modeset.c |  31 +++----
 5 files changed, 70 insertions(+), 127 deletions(-)

--
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/5] drm/udl: Unmap buffer object after damage update
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
@ 2019-11-14 14:10 ` Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 2/5] drm/udl: Remove udl implementation of GEM's free_object() Thomas Zimmermann
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

Udl keeps a BO mapped for its entire lifetime if it has been used in a
damage update at least once. The BO's free callback release the mapping
before it frees the BO.

Change this behaviour to unmap immediately after the damage update, so
SHMEM's implementation of free can be used.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_fb.c | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index 8fe4d8cf3212..a9e6ec360b16 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -73,6 +73,7 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	struct urb *urb;
 	int aligned_x;
 	int log_bpp;
+	void *vaddr;
 
 	BUG_ON(!is_power_of_2(fb->base.format->cpp[0]));
 	log_bpp = __ffs(fb->base.format->cpp[0]);
@@ -80,14 +81,10 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	if (!fb->active_16)
 		return 0;
 
-	if (!fb->shmem->vaddr) {
-		void *vaddr;
-
-		vaddr = drm_gem_shmem_vmap(&fb->shmem->base);
-		if (IS_ERR(vaddr)) {
-			DRM_ERROR("failed to vmap fb\n");
-			return 0;
-		}
+	vaddr = drm_gem_shmem_vmap(&fb->shmem->base);
+	if (IS_ERR(vaddr)) {
+		DRM_ERROR("failed to vmap fb\n");
+		return 0;
 	}
 
 	aligned_x = DL_ALIGN_DOWN(x, sizeof(unsigned long));
@@ -96,22 +93,23 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 
 	if ((width <= 0) ||
 	    (x + width > fb->base.width) ||
-	    (y + height > fb->base.height))
-		return -EINVAL;
+	    (y + height > fb->base.height)) {
+		ret = -EINVAL;
+		goto err_drm_gem_shmem_vunmap;
+	}
 
 	start_cycles = get_cycles();
 
 	urb = udl_get_urb(dev);
 	if (!urb)
-		return 0;
+		goto out;
 	cmd = urb->transfer_buffer;
 
 	for (i = y; i < y + height ; i++) {
 		const int line_offset = fb->base.pitches[0] * i;
 		const int byte_offset = line_offset + (x << log_bpp);
 		const int dev_byte_offset = (fb->base.width * i + x) << log_bpp;
-		if (udl_render_hline(dev, log_bpp, &urb,
-				     (char *) fb->shmem->vaddr,
+		if (udl_render_hline(dev, log_bpp, &urb, (char *)vaddr,
 				     &cmd, byte_offset, dev_byte_offset,
 				     width << log_bpp,
 				     &bytes_identical, &bytes_sent))
@@ -138,7 +136,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 		    >> 10)), /* Kcycles */
 		   &udl->cpu_kcycles_used);
 
+out:
+	drm_gem_shmem_vunmap(&fb->shmem->base, vaddr);
+
 	return 0;
+
+err_drm_gem_shmem_vunmap:
+	drm_gem_shmem_vunmap(&fb->shmem->base, vaddr);
+	return ret;
 }
 
 static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/5] drm/udl: Remove udl implementation of GEM's free_object()
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 1/5] drm/udl: Unmap buffer object after damage update Thomas Zimmermann
@ 2019-11-14 14:10 ` Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 3/5] drm/udl: Store active framebuffer in device structure Thomas Zimmermann
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

Udl's custom implementation for struct drm_gem_object_funcs.free_object
unmaps perma-mapped memory buffer before freeing the buffer object.

After switching to generic fbdev emulation and fixing the damage
handler, no perma-mapped buffers have to be released. Switch to SHMEM's
implementation of free_object.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_gem.c | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
index 6eade6b4b0dc..b6e26f98aa0a 100644
--- a/drivers/gpu/drm/udl/udl_gem.c
+++ b/drivers/gpu/drm/udl/udl_gem.c
@@ -17,22 +17,6 @@
  * GEM object funcs
  */
 
-static void udl_gem_object_free_object(struct drm_gem_object *obj)
-{
-	struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
-	/* Fbdev emulation vmaps the buffer. Unmap it here for consistency
-	 * with the original udl GEM code.
-	 *
-	 * TODO: Switch to generic fbdev emulation and release the
-	 *       GEM object with drm_gem_shmem_free_object().
-	 */
-	if (shmem->vaddr)
-		drm_gem_shmem_vunmap(obj, shmem->vaddr);
-
-	drm_gem_shmem_free_object(obj);
-}
-
 static int udl_gem_object_mmap(struct drm_gem_object *obj,
 			       struct vm_area_struct *vma)
 {
@@ -91,7 +75,7 @@ static void *udl_gem_object_vmap(struct drm_gem_object *obj)
 }
 
 static const struct drm_gem_object_funcs udl_gem_object_funcs = {
-	.free = udl_gem_object_free_object,
+	.free = drm_gem_shmem_free_object,
 	.print_info = drm_gem_shmem_print_info,
 	.pin = drm_gem_shmem_pin,
 	.unpin = drm_gem_shmem_unpin,
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/5] drm/udl: Store active framebuffer in device structure
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 1/5] drm/udl: Unmap buffer object after damage update Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 2/5] drm/udl: Remove udl implementation of GEM's free_object() Thomas Zimmermann
@ 2019-11-14 14:10 ` Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 4/5] drm/udl: Call udl_handle_damage() with DRM framebuffer Thomas Zimmermann
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

The framebuffer's 'active_16' flag signals which framebuffer to flush
to device memory. Moving the 'active_16' state from struct udl_framebuffer
into struct udl_device prepares for using the generic GEM framebuffer.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_drv.h     |  5 ++++-
 drivers/gpu/drm/udl/udl_fb.c      | 13 +++++++++++--
 drivers/gpu/drm/udl/udl_main.c    |  3 +++
 drivers/gpu/drm/udl/udl_modeset.c | 18 +++++++-----------
 4 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index be585e3e572d..a0946b955739 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -53,6 +53,10 @@ struct udl_device {
 	struct usb_device *udev;
 	struct drm_crtc *crtc;
 
+	/* active framebuffer on the 16-bit channel */
+	const struct drm_framebuffer *active_fb_16;
+	spinlock_t active_fb_16_lock;
+
 	struct mutex gem_lock;
 
 	int sku_pixel_limit;
@@ -73,7 +77,6 @@ struct udl_device {
 struct udl_framebuffer {
 	struct drm_framebuffer base;
 	struct drm_gem_shmem_object *shmem;
-	bool active_16; /* active on the 16-bit channel */
 };
 
 #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base)
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index a9e6ec360b16..e9a4bbd5b195 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -78,8 +78,12 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	BUG_ON(!is_power_of_2(fb->base.format->cpp[0]));
 	log_bpp = __ffs(fb->base.format->cpp[0]);
 
-	if (!fb->active_16)
+	spin_lock(&udl->active_fb_16_lock);
+	if (udl->active_fb_16 != &fb->base) {
+		spin_unlock(&udl->active_fb_16_lock);
 		return 0;
+	}
+	spin_unlock(&udl->active_fb_16_lock);
 
 	vaddr = drm_gem_shmem_vmap(&fb->shmem->base);
 	if (IS_ERR(vaddr)) {
@@ -153,14 +157,19 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
 				      unsigned num_clips)
 {
 	struct udl_framebuffer *ufb = to_udl_fb(fb);
+	struct udl_device *udl = fb->dev->dev_private;
 	struct dma_buf_attachment *import_attach;
 	int i;
 	int ret = 0;
 
 	drm_modeset_lock_all(fb->dev);
 
-	if (!ufb->active_16)
+	spin_lock(&udl->active_fb_16_lock);
+	if (udl->active_fb_16 != fb) {
+		spin_unlock(&udl->active_fb_16_lock);
 		goto unlock;
+	}
+	spin_unlock(&udl->active_fb_16_lock);
 
 	import_attach = ufb->shmem->base.import_attach;
 
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
index 9b091b5b063e..a23218fc7d8e 100644
--- a/drivers/gpu/drm/udl/udl_main.c
+++ b/drivers/gpu/drm/udl/udl_main.c
@@ -317,6 +317,9 @@ int udl_init(struct udl_device *udl)
 
 	DRM_DEBUG("\n");
 
+	udl->active_fb_16 = NULL;
+	spin_lock_init(&udl->active_fb_16_lock);
+
 	mutex_init(&udl->gem_lock);
 
 	if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
diff --git a/drivers/gpu/drm/udl/udl_modeset.c b/drivers/gpu/drm/udl/udl_modeset.c
index 6582c9d27a87..44a741f463c9 100644
--- a/drivers/gpu/drm/udl/udl_modeset.c
+++ b/drivers/gpu/drm/udl/udl_modeset.c
@@ -332,11 +332,9 @@ static int udl_crtc_mode_set(struct drm_crtc *crtc,
 
 	wrptr = udl_dummy_render(wrptr);
 
-	if (old_fb) {
-		struct udl_framebuffer *uold_fb = to_udl_fb(old_fb);
-		uold_fb->active_16 = false;
-	}
-	ufb->active_16 = true;
+	spin_lock(&udl->active_fb_16_lock);
+	udl->active_fb_16 = &ufb->base;
+	spin_unlock(&udl->active_fb_16_lock);
 	udl->mode_buf_len = wrptr - buf;
 
 	/* damage all of it */
@@ -364,13 +362,11 @@ static int udl_crtc_page_flip(struct drm_crtc *crtc,
 {
 	struct udl_framebuffer *ufb = to_udl_fb(fb);
 	struct drm_device *dev = crtc->dev;
+	struct udl_device *udl = dev->dev_private;
 
-	struct drm_framebuffer *old_fb = crtc->primary->fb;
-	if (old_fb) {
-		struct udl_framebuffer *uold_fb = to_udl_fb(old_fb);
-		uold_fb->active_16 = false;
-	}
-	ufb->active_16 = true;
+	spin_lock(&udl->active_fb_16_lock);
+	udl->active_fb_16 = fb;
+	spin_unlock(&udl->active_fb_16_lock);
 
 	udl_handle_damage(ufb, 0, 0, fb->width, fb->height);
 
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/5] drm/udl: Call udl_handle_damage() with DRM framebuffer
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
                   ` (2 preceding siblings ...)
  2019-11-14 14:10 ` [PATCH 3/5] drm/udl: Store active framebuffer in device structure Thomas Zimmermann
@ 2019-11-14 14:10 ` Thomas Zimmermann
  2019-11-14 14:10 ` [PATCH 5/5] drm/udl: Replace struct udl_framebuffer with generic implementation Thomas Zimmermann
  2019-11-25 18:39 ` [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Sam Ravnborg
  5 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

Simplifying the udl code before replacing struct udl_framebuffer.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_drv.h     |  2 +-
 drivers/gpu/drm/udl/udl_fb.c      | 35 ++++++++++++++++---------------
 drivers/gpu/drm/udl/udl_modeset.c | 15 +++++++------
 3 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index a0946b955739..c5e3160392cb 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -110,7 +110,7 @@ int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr,
 struct drm_gem_object *udl_driver_gem_create_object(struct drm_device *dev,
 						    size_t size);
 
-int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
+int udl_handle_damage(struct drm_framebuffer *fb, int x, int y,
 		      int width, int height);
 
 int udl_drop_usb(struct drm_device *dev);
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index e9a4bbd5b195..ad7bf165b59b 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -60,10 +60,10 @@ static uint16_t rgb16(uint32_t col)
 }
 #endif
 
-int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
+int udl_handle_damage(struct drm_framebuffer *fb, int x, int y,
 		      int width, int height)
 {
-	struct drm_device *dev = fb->base.dev;
+	struct drm_device *dev = fb->dev;
 	struct udl_device *udl = to_udl(dev);
 	int i, ret;
 	char *cmd;
@@ -75,17 +75,19 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	int log_bpp;
 	void *vaddr;
 
-	BUG_ON(!is_power_of_2(fb->base.format->cpp[0]));
-	log_bpp = __ffs(fb->base.format->cpp[0]);
+	if (WARN_ON(!is_power_of_2(fb->format->cpp[0])))
+		return -EINVAL;
+
+	log_bpp = __ffs(fb->format->cpp[0]);
 
 	spin_lock(&udl->active_fb_16_lock);
-	if (udl->active_fb_16 != &fb->base) {
+	if (udl->active_fb_16 != fb) {
 		spin_unlock(&udl->active_fb_16_lock);
 		return 0;
 	}
 	spin_unlock(&udl->active_fb_16_lock);
 
-	vaddr = drm_gem_shmem_vmap(&fb->shmem->base);
+	vaddr = drm_gem_shmem_vmap(fb->obj[0]);
 	if (IS_ERR(vaddr)) {
 		DRM_ERROR("failed to vmap fb\n");
 		return 0;
@@ -96,8 +98,8 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	x = aligned_x;
 
 	if ((width <= 0) ||
-	    (x + width > fb->base.width) ||
-	    (y + height > fb->base.height)) {
+	    (x + width > fb->width) ||
+	    (y + height > fb->height)) {
 		ret = -EINVAL;
 		goto err_drm_gem_shmem_vunmap;
 	}
@@ -110,9 +112,9 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 	cmd = urb->transfer_buffer;
 
 	for (i = y; i < y + height ; i++) {
-		const int line_offset = fb->base.pitches[0] * i;
+		const int line_offset = fb->pitches[0] * i;
 		const int byte_offset = line_offset + (x << log_bpp);
-		const int dev_byte_offset = (fb->base.width * i + x) << log_bpp;
+		const int dev_byte_offset = (fb->width * i + x) << log_bpp;
 		if (udl_render_hline(dev, log_bpp, &urb, (char *)vaddr,
 				     &cmd, byte_offset, dev_byte_offset,
 				     width << log_bpp,
@@ -141,12 +143,12 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 		   &udl->cpu_kcycles_used);
 
 out:
-	drm_gem_shmem_vunmap(&fb->shmem->base, vaddr);
+	drm_gem_shmem_vunmap(fb->obj[0], vaddr);
 
 	return 0;
 
 err_drm_gem_shmem_vunmap:
-	drm_gem_shmem_vunmap(&fb->shmem->base, vaddr);
+	drm_gem_shmem_vunmap(fb->obj[0], vaddr);
 	return ret;
 }
 
@@ -156,7 +158,6 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
 				      struct drm_clip_rect *clips,
 				      unsigned num_clips)
 {
-	struct udl_framebuffer *ufb = to_udl_fb(fb);
 	struct udl_device *udl = fb->dev->dev_private;
 	struct dma_buf_attachment *import_attach;
 	int i;
@@ -171,7 +172,7 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
 	}
 	spin_unlock(&udl->active_fb_16_lock);
 
-	import_attach = ufb->shmem->base.import_attach;
+	import_attach = fb->obj[0]->import_attach;
 
 	if (import_attach) {
 		ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
@@ -181,9 +182,9 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
 	}
 
 	for (i = 0; i < num_clips; i++) {
-		ret = udl_handle_damage(ufb, clips[i].x1, clips[i].y1,
-				  clips[i].x2 - clips[i].x1,
-				  clips[i].y2 - clips[i].y1);
+		ret = udl_handle_damage(fb, clips[i].x1, clips[i].y1,
+					clips[i].x2 - clips[i].x1,
+					clips[i].y2 - clips[i].y1);
 		if (ret)
 			break;
 	}
diff --git a/drivers/gpu/drm/udl/udl_modeset.c b/drivers/gpu/drm/udl/udl_modeset.c
index 44a741f463c9..91af25caed64 100644
--- a/drivers/gpu/drm/udl/udl_modeset.c
+++ b/drivers/gpu/drm/udl/udl_modeset.c
@@ -301,7 +301,7 @@ static int udl_crtc_mode_set(struct drm_crtc *crtc,
 
 {
 	struct drm_device *dev = crtc->dev;
-	struct udl_framebuffer *ufb = to_udl_fb(crtc->primary->fb);
+	struct drm_framebuffer *fb = crtc->primary->fb;
 	struct udl_device *udl = dev->dev_private;
 	char *buf;
 	char *wrptr;
@@ -333,12 +333,12 @@ static int udl_crtc_mode_set(struct drm_crtc *crtc,
 	wrptr = udl_dummy_render(wrptr);
 
 	spin_lock(&udl->active_fb_16_lock);
-	udl->active_fb_16 = &ufb->base;
+	udl->active_fb_16 = fb;
 	spin_unlock(&udl->active_fb_16_lock);
 	udl->mode_buf_len = wrptr - buf;
 
 	/* damage all of it */
-	udl_handle_damage(ufb, 0, 0, ufb->base.width, ufb->base.height);
+	udl_handle_damage(fb, 0, 0, fb->width, fb->height);
 	return 0;
 }
 
@@ -360,7 +360,6 @@ static int udl_crtc_page_flip(struct drm_crtc *crtc,
 			      uint32_t page_flip_flags,
 			      struct drm_modeset_acquire_ctx *ctx)
 {
-	struct udl_framebuffer *ufb = to_udl_fb(fb);
 	struct drm_device *dev = crtc->dev;
 	struct udl_device *udl = dev->dev_private;
 
@@ -368,7 +367,7 @@ static int udl_crtc_page_flip(struct drm_crtc *crtc,
 	udl->active_fb_16 = fb;
 	spin_unlock(&udl->active_fb_16_lock);
 
-	udl_handle_damage(ufb, 0, 0, fb->width, fb->height);
+	udl_handle_damage(fb, 0, 0, fb->width, fb->height);
 
 	spin_lock_irq(&dev->event_lock);
 	if (event)
@@ -448,13 +447,13 @@ int udl_modeset_init(struct drm_device *dev)
 void udl_modeset_restore(struct drm_device *dev)
 {
 	struct udl_device *udl = dev->dev_private;
-	struct udl_framebuffer *ufb;
+	struct drm_framebuffer *fb;
 
 	if (!udl->crtc || !udl->crtc->primary->fb)
 		return;
 	udl_crtc_commit(udl->crtc);
-	ufb = to_udl_fb(udl->crtc->primary->fb);
-	udl_handle_damage(ufb, 0, 0, ufb->base.width, ufb->base.height);
+	fb = udl->crtc->primary->fb;
+	udl_handle_damage(fb, 0, 0, fb->width, fb->height);
 }
 
 void udl_modeset_cleanup(struct drm_device *dev)
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 5/5] drm/udl: Replace struct udl_framebuffer with generic implementation
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
                   ` (3 preceding siblings ...)
  2019-11-14 14:10 ` [PATCH 4/5] drm/udl: Call udl_handle_damage() with DRM framebuffer Thomas Zimmermann
@ 2019-11-14 14:10 ` Thomas Zimmermann
  2019-11-25 18:39 ` [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Sam Ravnborg
  5 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-14 14:10 UTC (permalink / raw)
  To: airlied, sean, daniel, kraxel, emil.velikov, sam, noralf
  Cc: Thomas Zimmermann, dri-devel

The udl driver's struct udl_framebuffer stores a DRM framebuffer
with an associated GEM object. This functionality is also provided by
generic code. Switch udl over.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/udl/udl_drv.h |  7 ----
 drivers/gpu/drm/udl/udl_fb.c  | 62 ++++-------------------------------
 2 files changed, 6 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index c5e3160392cb..66cbe04f832a 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -74,13 +74,6 @@ struct udl_device {
 
 #define to_udl(x) container_of(x, struct udl_device, drm)
 
-struct udl_framebuffer {
-	struct drm_framebuffer base;
-	struct drm_gem_shmem_object *shmem;
-};
-
-#define to_udl_fb(x) container_of(x, struct udl_framebuffer, base)
-
 /* modeset */
 int udl_modeset_init(struct drm_device *dev);
 void udl_modeset_restore(struct drm_device *dev);
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index ad7bf165b59b..c1996ac73a1f 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -14,6 +14,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_modeset_helper.h>
 
@@ -199,68 +200,17 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
 	return ret;
 }
 
-static void udl_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-	struct udl_framebuffer *ufb = to_udl_fb(fb);
-
-	if (ufb->shmem)
-		drm_gem_object_put_unlocked(&ufb->shmem->base);
-
-	drm_framebuffer_cleanup(fb);
-	kfree(ufb);
-}
-
 static const struct drm_framebuffer_funcs udlfb_funcs = {
-	.destroy = udl_user_framebuffer_destroy,
-	.dirty = udl_user_framebuffer_dirty,
+	.destroy	= drm_gem_fb_destroy,
+	.create_handle	= drm_gem_fb_create_handle,
+	.dirty		= udl_user_framebuffer_dirty,
 };
 
-
-static int
-udl_framebuffer_init(struct drm_device *dev,
-		     struct udl_framebuffer *ufb,
-		     const struct drm_mode_fb_cmd2 *mode_cmd,
-		     struct drm_gem_shmem_object *shmem)
-{
-	int ret;
-
-	ufb->shmem = shmem;
-	drm_helper_mode_fill_fb_struct(dev, &ufb->base, mode_cmd);
-	ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
-	return ret;
-}
-
 struct drm_framebuffer *
 udl_fb_user_fb_create(struct drm_device *dev,
 		   struct drm_file *file,
 		   const struct drm_mode_fb_cmd2 *mode_cmd)
 {
-	struct drm_gem_object *obj;
-	struct udl_framebuffer *ufb;
-	int ret;
-	uint32_t size;
-
-	obj = drm_gem_object_lookup(file, mode_cmd->handles[0]);
-	if (obj == NULL)
-		return ERR_PTR(-ENOENT);
-
-	size = mode_cmd->pitches[0] * mode_cmd->height;
-	size = ALIGN(size, PAGE_SIZE);
-
-	if (size > obj->size) {
-		DRM_ERROR("object size not sufficient for fb %d %zu %d %d\n", size, obj->size, mode_cmd->pitches[0], mode_cmd->height);
-		return ERR_PTR(-ENOMEM);
-	}
-
-	ufb = kzalloc(sizeof(*ufb), GFP_KERNEL);
-	if (ufb == NULL)
-		return ERR_PTR(-ENOMEM);
-
-	ret = udl_framebuffer_init(dev, ufb, mode_cmd,
-				   to_drm_gem_shmem_obj(obj));
-	if (ret) {
-		kfree(ufb);
-		return ERR_PTR(-EINVAL);
-	}
-	return &ufb->base;
+	return drm_gem_fb_create_with_funcs(dev, file, mode_cmd,
+					    &udlfb_funcs);
 }
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers
  2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
                   ` (4 preceding siblings ...)
  2019-11-14 14:10 ` [PATCH 5/5] drm/udl: Replace struct udl_framebuffer with generic implementation Thomas Zimmermann
@ 2019-11-25 18:39 ` Sam Ravnborg
  2019-11-26  8:49   ` Thomas Zimmermann
  5 siblings, 1 reply; 8+ messages in thread
From: Sam Ravnborg @ 2019-11-25 18:39 UTC (permalink / raw)
  To: Thomas Zimmermann; +Cc: dri-devel, kraxel, airlied, sean, emil.velikov

Hi Thomas.

On Thu, Nov 14, 2019 at 03:10:20PM +0100, Thomas Zimmermann wrote:
> Udl uses struct udl_framebuffer for representing its framebuffer. The
> type can be replaced by the standard DRM framebuffer structure.
> 
> Patches 1 to 4 prepare the driver for the conversion. Patch 5 replaces
> the structure.
> 
> The patchset has been tested by running the fb console, X11 and Weston
> on a DisplayLink adapter.

Series looks good, with some nice cleanup to prepare for the
removal of udl_framebuffer.

Whole series is:
Acked-by: Sam Ravnborg <sam@ravnborg.org>

> 
> Thomas Zimmermann (5):
>   drm/udl: Unmap buffer object after damage update
>   drm/udl: Remove udl implementation of GEM's free_object()
>   drm/udl: Store active framebuffer in device structure
>   drm/udl: Call udl_handle_damage() with DRM framebuffer
>   drm/udl: Replace struct udl_framebuffer with generic implementation
> 
>  drivers/gpu/drm/udl/udl_drv.h     |  14 ++--
>  drivers/gpu/drm/udl/udl_fb.c      | 131 +++++++++++-------------------
>  drivers/gpu/drm/udl/udl_gem.c     |  18 +---
>  drivers/gpu/drm/udl/udl_main.c    |   3 +
>  drivers/gpu/drm/udl/udl_modeset.c |  31 +++----
>  5 files changed, 70 insertions(+), 127 deletions(-)
> 
> --
> 2.23.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers
  2019-11-25 18:39 ` [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Sam Ravnborg
@ 2019-11-26  8:49   ` Thomas Zimmermann
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Zimmermann @ 2019-11-26  8:49 UTC (permalink / raw)
  To: Sam Ravnborg; +Cc: dri-devel, kraxel, airlied, sean, emil.velikov


[-- Attachment #1.1.1: Type: text/plain, Size: 1574 bytes --]



Am 25.11.19 um 19:39 schrieb Sam Ravnborg:
> Hi Thomas.
> 
> On Thu, Nov 14, 2019 at 03:10:20PM +0100, Thomas Zimmermann wrote:
>> Udl uses struct udl_framebuffer for representing its framebuffer. The
>> type can be replaced by the standard DRM framebuffer structure.
>>
>> Patches 1 to 4 prepare the driver for the conversion. Patch 5 replaces
>> the structure.
>>
>> The patchset has been tested by running the fb console, X11 and Weston
>> on a DisplayLink adapter.
> 
> Series looks good, with some nice cleanup to prepare for the
> removal of udl_framebuffer.
> 
> Whole series is:
> Acked-by: Sam Ravnborg <sam@ravnborg.org>

Thanks!

> 
>>
>> Thomas Zimmermann (5):
>>   drm/udl: Unmap buffer object after damage update
>>   drm/udl: Remove udl implementation of GEM's free_object()
>>   drm/udl: Store active framebuffer in device structure
>>   drm/udl: Call udl_handle_damage() with DRM framebuffer
>>   drm/udl: Replace struct udl_framebuffer with generic implementation
>>
>>  drivers/gpu/drm/udl/udl_drv.h     |  14 ++--
>>  drivers/gpu/drm/udl/udl_fb.c      | 131 +++++++++++-------------------
>>  drivers/gpu/drm/udl/udl_gem.c     |  18 +---
>>  drivers/gpu/drm/udl/udl_main.c    |   3 +
>>  drivers/gpu/drm/udl/udl_modeset.c |  31 +++----
>>  5 files changed, 70 insertions(+), 127 deletions(-)
>>
>> --
>> 2.23.0

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Felix Imendörffer


[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-11-26  8:49 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-14 14:10 [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Thomas Zimmermann
2019-11-14 14:10 ` [PATCH 1/5] drm/udl: Unmap buffer object after damage update Thomas Zimmermann
2019-11-14 14:10 ` [PATCH 2/5] drm/udl: Remove udl implementation of GEM's free_object() Thomas Zimmermann
2019-11-14 14:10 ` [PATCH 3/5] drm/udl: Store active framebuffer in device structure Thomas Zimmermann
2019-11-14 14:10 ` [PATCH 4/5] drm/udl: Call udl_handle_damage() with DRM framebuffer Thomas Zimmermann
2019-11-14 14:10 ` [PATCH 5/5] drm/udl: Replace struct udl_framebuffer with generic implementation Thomas Zimmermann
2019-11-25 18:39 ` [PATCH 0/5] drm/udl: Convert to GEM framebuffer helpers Sam Ravnborg
2019-11-26  8:49   ` Thomas Zimmermann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).