{
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]);
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",