Message ID | 20180330141138.28987-6-daniels@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Fri, Mar 30, 2018 at 03:11:20PM +0100, Daniel Stone wrote: > 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: Daniel Stone <daniels@collabora.com> > Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> -- Sebastian > drivers/gpu/drm/omapdrm/omap_fb.c | 60 ++++++++++----------------------------- > 1 file changed, 15 insertions(+), 45 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c > index 5fd22ca73913..3d6b6f3d6808 100644 > --- a/drivers/gpu/drm/omapdrm/omap_fb.c > +++ b/drivers/gpu/drm/omapdrm/omap_fb.c > @@ -19,6 +19,7 @@ > > #include <drm/drm_crtc.h> > #include <drm/drm_crtc_helper.h> > +#include <drm/drm_gem_framebuffer_helper.h> > > #include "omap_dmm_tiler.h" > #include "omap_drv.h" > @@ -51,7 +52,6 @@ static const u32 formats[] = { > > /* per-plane info for the fb: */ > struct plane { > - struct drm_gem_object *bo; > u32 pitch; > u32 offset; > dma_addr_t dma_addr; > @@ -68,36 +68,9 @@ struct omap_framebuffer { > struct mutex lock; > }; > > -static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, > - struct drm_file *file_priv, > - unsigned int *handle) > -{ > - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); > - return drm_gem_handle_create(file_priv, > - omap_fb->planes[0].bo, handle); > -} > - > -static void omap_framebuffer_destroy(struct drm_framebuffer *fb) > -{ > - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); > - int i, n = fb->format->num_planes; > - > - DBG("destroy: FB ID: %d (%p)", fb->base.id, fb); > - > - drm_framebuffer_cleanup(fb); > - > - for (i = 0; i < n; i++) { > - struct plane *plane = &omap_fb->planes[i]; > - > - drm_gem_object_unreference_unlocked(plane->bo); > - } > - > - kfree(omap_fb); > -} > - > static const struct drm_framebuffer_funcs omap_framebuffer_funcs = { > - .create_handle = omap_framebuffer_create_handle, > - .destroy = omap_framebuffer_destroy, > + .create_handle = drm_gem_fb_create_handle, > + .destroy = drm_gem_fb_destroy, > }; > > static u32 get_linear_addr(struct plane *plane, > @@ -114,10 +87,7 @@ static u32 get_linear_addr(struct plane *plane, > > bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb) > { > - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); > - struct plane *plane = &omap_fb->planes[0]; > - > - return omap_gem_flags(plane->bo) & OMAP_BO_TILED; > + return omap_gem_flags(fb->obj[0]) & OMAP_BO_TILED; > } > > /* Note: DRM rotates counter-clockwise, TILER & DSS rotates clockwise */ > @@ -176,7 +146,7 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, > x = state->src_x >> 16; > y = state->src_y >> 16; > > - if (omap_gem_flags(plane->bo) & OMAP_BO_TILED) { > + if (omap_gem_flags(fb->obj[0]) & OMAP_BO_TILED) { > u32 w = state->src_w >> 16; > u32 h = state->src_h >> 16; > > @@ -201,12 +171,12 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, > x += w - 1; > > /* Note: x and y are in TILER units, not pixels */ > - omap_gem_rotated_dma_addr(plane->bo, orient, x, y, > + omap_gem_rotated_dma_addr(fb->obj[0], orient, x, y, > &info->paddr); > info->rotation_type = OMAP_DSS_ROT_TILER; > info->rotation = state->rotation ?: DRM_MODE_ROTATE_0; > /* Note: stride in TILER units, not pixels */ > - info->screen_width = omap_gem_tiled_stride(plane->bo, orient); > + info->screen_width = omap_gem_tiled_stride(fb->obj[0], orient); > } else { > switch (state->rotation & DRM_MODE_ROTATE_MASK) { > case 0: > @@ -234,8 +204,8 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, > plane = &omap_fb->planes[1]; > > if (info->rotation_type == OMAP_DSS_ROT_TILER) { > - WARN_ON(!(omap_gem_flags(plane->bo) & OMAP_BO_TILED)); > - omap_gem_rotated_dma_addr(plane->bo, orient, x/2, y/2, > + WARN_ON(!(omap_gem_flags(fb->obj[1]) & OMAP_BO_TILED)); > + omap_gem_rotated_dma_addr(fb->obj[1], orient, x/2, y/2, > &info->p_uv_addr); > } else { > info->p_uv_addr = get_linear_addr(plane, format, 1, x, y); > @@ -261,10 +231,10 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) > > for (i = 0; i < n; i++) { > struct plane *plane = &omap_fb->planes[i]; > - ret = omap_gem_pin(plane->bo, &plane->dma_addr); > + ret = omap_gem_pin(fb->obj[i], &plane->dma_addr); > if (ret) > goto fail; > - omap_gem_dma_sync_buffer(plane->bo, DMA_TO_DEVICE); > + omap_gem_dma_sync_buffer(fb->obj[i], DMA_TO_DEVICE); > } > > omap_fb->pin_count++; > @@ -276,7 +246,7 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) > fail: > for (i--; i >= 0; i--) { > struct plane *plane = &omap_fb->planes[i]; > - omap_gem_unpin(plane->bo); > + omap_gem_unpin(fb->obj[i]); > plane->dma_addr = 0; > } > > @@ -302,7 +272,7 @@ void omap_framebuffer_unpin(struct drm_framebuffer *fb) > > for (i = 0; i < n; i++) { > struct plane *plane = &omap_fb->planes[i]; > - omap_gem_unpin(plane->bo); > + omap_gem_unpin(fb->obj[i]); > plane->dma_addr = 0; > } > > @@ -349,7 +319,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m) > struct plane *plane = &omap_fb->planes[i]; > seq_printf(m, " %d: offset=%d pitch=%d, obj: ", > i, plane->offset, plane->pitch); > - omap_gem_describe(plane->bo, m); > + omap_gem_describe(fb->obj[i], m); > } > } > #endif > @@ -454,7 +424,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, > goto fail; > } > > - plane->bo = bos[i]; > + fb->obj[i] = bos[i]; > plane->offset = mode_cmd->offsets[i]; > plane->pitch = pitch; > plane->dma_addr = 0; > -- > 2.16.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
On Fri, Mar 30, 2018 at 03:11:20PM +0100, Daniel Stone wrote: > 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: Daniel Stone <daniels@collabora.com> > Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> > --- > drivers/gpu/drm/omapdrm/omap_fb.c | 60 ++++++++++----------------------------- > 1 file changed, 15 insertions(+), 45 deletions(-) Reviewed-by: Thierry Reding <treding@nvidia.com>
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index 5fd22ca73913..3d6b6f3d6808 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c @@ -19,6 +19,7 @@ #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_gem_framebuffer_helper.h> #include "omap_dmm_tiler.h" #include "omap_drv.h" @@ -51,7 +52,6 @@ static const u32 formats[] = { /* per-plane info for the fb: */ struct plane { - struct drm_gem_object *bo; u32 pitch; u32 offset; dma_addr_t dma_addr; @@ -68,36 +68,9 @@ struct omap_framebuffer { struct mutex lock; }; -static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, - struct drm_file *file_priv, - unsigned int *handle) -{ - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); - return drm_gem_handle_create(file_priv, - omap_fb->planes[0].bo, handle); -} - -static void omap_framebuffer_destroy(struct drm_framebuffer *fb) -{ - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); - int i, n = fb->format->num_planes; - - DBG("destroy: FB ID: %d (%p)", fb->base.id, fb); - - drm_framebuffer_cleanup(fb); - - for (i = 0; i < n; i++) { - struct plane *plane = &omap_fb->planes[i]; - - drm_gem_object_unreference_unlocked(plane->bo); - } - - kfree(omap_fb); -} - static const struct drm_framebuffer_funcs omap_framebuffer_funcs = { - .create_handle = omap_framebuffer_create_handle, - .destroy = omap_framebuffer_destroy, + .create_handle = drm_gem_fb_create_handle, + .destroy = drm_gem_fb_destroy, }; static u32 get_linear_addr(struct plane *plane, @@ -114,10 +87,7 @@ static u32 get_linear_addr(struct plane *plane, bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb) { - struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); - struct plane *plane = &omap_fb->planes[0]; - - return omap_gem_flags(plane->bo) & OMAP_BO_TILED; + return omap_gem_flags(fb->obj[0]) & OMAP_BO_TILED; } /* Note: DRM rotates counter-clockwise, TILER & DSS rotates clockwise */ @@ -176,7 +146,7 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, x = state->src_x >> 16; y = state->src_y >> 16; - if (omap_gem_flags(plane->bo) & OMAP_BO_TILED) { + if (omap_gem_flags(fb->obj[0]) & OMAP_BO_TILED) { u32 w = state->src_w >> 16; u32 h = state->src_h >> 16; @@ -201,12 +171,12 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, x += w - 1; /* Note: x and y are in TILER units, not pixels */ - omap_gem_rotated_dma_addr(plane->bo, orient, x, y, + omap_gem_rotated_dma_addr(fb->obj[0], orient, x, y, &info->paddr); info->rotation_type = OMAP_DSS_ROT_TILER; info->rotation = state->rotation ?: DRM_MODE_ROTATE_0; /* Note: stride in TILER units, not pixels */ - info->screen_width = omap_gem_tiled_stride(plane->bo, orient); + info->screen_width = omap_gem_tiled_stride(fb->obj[0], orient); } else { switch (state->rotation & DRM_MODE_ROTATE_MASK) { case 0: @@ -234,8 +204,8 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, plane = &omap_fb->planes[1]; if (info->rotation_type == OMAP_DSS_ROT_TILER) { - WARN_ON(!(omap_gem_flags(plane->bo) & OMAP_BO_TILED)); - omap_gem_rotated_dma_addr(plane->bo, orient, x/2, y/2, + WARN_ON(!(omap_gem_flags(fb->obj[1]) & OMAP_BO_TILED)); + omap_gem_rotated_dma_addr(fb->obj[1], orient, x/2, y/2, &info->p_uv_addr); } else { info->p_uv_addr = get_linear_addr(plane, format, 1, x, y); @@ -261,10 +231,10 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; - ret = omap_gem_pin(plane->bo, &plane->dma_addr); + ret = omap_gem_pin(fb->obj[i], &plane->dma_addr); if (ret) goto fail; - omap_gem_dma_sync_buffer(plane->bo, DMA_TO_DEVICE); + omap_gem_dma_sync_buffer(fb->obj[i], DMA_TO_DEVICE); } omap_fb->pin_count++; @@ -276,7 +246,7 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) fail: for (i--; i >= 0; i--) { struct plane *plane = &omap_fb->planes[i]; - omap_gem_unpin(plane->bo); + omap_gem_unpin(fb->obj[i]); plane->dma_addr = 0; } @@ -302,7 +272,7 @@ void omap_framebuffer_unpin(struct drm_framebuffer *fb) for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; - omap_gem_unpin(plane->bo); + omap_gem_unpin(fb->obj[i]); plane->dma_addr = 0; } @@ -349,7 +319,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m) struct plane *plane = &omap_fb->planes[i]; seq_printf(m, " %d: offset=%d pitch=%d, obj: ", i, plane->offset, plane->pitch); - omap_gem_describe(plane->bo, m); + omap_gem_describe(fb->obj[i], m); } } #endif @@ -454,7 +424,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, goto fail; } - plane->bo = bos[i]; + fb->obj[i] = bos[i]; plane->offset = mode_cmd->offsets[i]; plane->pitch = pitch; plane->dma_addr = 0;
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: Daniel Stone <daniels@collabora.com> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> --- drivers/gpu/drm/omapdrm/omap_fb.c | 60 ++++++++++----------------------------- 1 file changed, 15 insertions(+), 45 deletions(-)