]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/sun4i: layers: Use drm_fb_dma_get_gem_addr() to get display memory
authorChen-Yu Tsai <wens@kernel.org>
Mon, 9 Mar 2026 16:56:33 +0000 (00:56 +0800)
committerChen-Yu Tsai <wens@kernel.org>
Sat, 14 Mar 2026 08:08:51 +0000 (16:08 +0800)
Commit 4636ce93d5b2 ("drm/fb-cma-helper: Add drm_fb_cma_get_gem_addr()")
adds a new helper, which covers fetching a drm_framebuffer's GEM object
and calculating the buffer address for a given plane.

This patch uses this helper to replace our own open coded version of the
same function.

Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Link: https://patch.msgid.link/20260309165635.1138413-1-wens@kernel.org
Signed-off-by: Chen-Yu Tsai <wens@kernel.org>
drivers/gpu/drm/sun4i/sun8i_ui_layer.c
drivers/gpu/drm/sun4i/sun8i_vi_layer.c

index f08f6da55dd0c5c760ce733431c81d217b6d10d2..72c92203ae633e56ac7f3c3e8d37ba3d52c9d579 100644 (file)
@@ -124,25 +124,13 @@ static void sun8i_ui_layer_update_buffer(struct sun8i_layer *layer,
 {
        struct drm_plane_state *state = plane->state;
        struct drm_framebuffer *fb = state->fb;
-       struct drm_gem_dma_object *gem;
        dma_addr_t dma_addr;
        u32 ch_base;
-       int bpp;
 
        ch_base = sun8i_channel_base(layer);
 
-       /* Get the physical address of the buffer in memory */
-       gem = drm_fb_dma_get_gem_obj(fb, 0);
-
-       DRM_DEBUG_DRIVER("Using GEM @ %pad\n", &gem->dma_addr);
-
-       /* Compute the start of the displayed memory */
-       bpp = fb->format->cpp[0];
-       dma_addr = gem->dma_addr + fb->offsets[0];
-
-       /* Fixup framebuffer address for src coordinates */
-       dma_addr += (state->src.x1 >> 16) * bpp;
-       dma_addr += (state->src.y1 >> 16) * fb->pitches[0];
+       /* Get the start of the displayed memory */
+       dma_addr = drm_fb_dma_get_gem_addr(fb, state, 0);
 
        /* Set the line width */
        DRM_DEBUG_DRIVER("Layer line width: %d bytes\n", fb->pitches[0]);
index ca3ab59e108d47770f9c08a897b5fde1a9da5a7e..cd8d6c2da0c72ae22479cd50917938e9da8021a3 100644 (file)
@@ -197,38 +197,15 @@ static void sun8i_vi_layer_update_buffer(struct sun8i_layer *layer,
        struct drm_plane_state *state = plane->state;
        struct drm_framebuffer *fb = state->fb;
        const struct drm_format_info *format = fb->format;
-       struct drm_gem_dma_object *gem;
-       u32 dx, dy, src_x, src_y;
        dma_addr_t dma_addr;
        u32 ch_base;
        int i;
 
        ch_base = sun8i_channel_base(layer);
 
-       /* Adjust x and y to be dividable by subsampling factor */
-       src_x = (state->src.x1 >> 16) & ~(format->hsub - 1);
-       src_y = (state->src.y1 >> 16) & ~(format->vsub - 1);
-
        for (i = 0; i < format->num_planes; i++) {
-               /* Get the physical address of the buffer in memory */
-               gem = drm_fb_dma_get_gem_obj(fb, i);
-
-               DRM_DEBUG_DRIVER("Using GEM @ %pad\n", &gem->dma_addr);
-
-               /* Compute the start of the displayed memory */
-               dma_addr = gem->dma_addr + fb->offsets[i];
-
-               dx = src_x;
-               dy = src_y;
-
-               if (i > 0) {
-                       dx /= format->hsub;
-                       dy /= format->vsub;
-               }
-
-               /* Fixup framebuffer address for src coordinates */
-               dma_addr += dx * format->cpp[i];
-               dma_addr += dy * fb->pitches[i];
+               /* Get the start of the displayed memory */
+               dma_addr = drm_fb_dma_get_gem_addr(fb, state, i);
 
                /* Set the line width */
                DRM_DEBUG_DRIVER("Layer %d. line width: %d bytes\n",