.atomic_destroy_state = dpu_drm_atomic_plane_destroy_state,
};
+static inline dma_addr_t
+drm_plane_state_to_baseaddr(struct drm_plane_state *state)
+{
+ struct drm_framebuffer *fb = state->fb;
+ struct drm_gem_cma_object *cma_obj;
+
+ cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ BUG_ON(!cma_obj);
+
+ return cma_obj->paddr + fb->offsets[0] +
+ fb->pitches[0] * (state->src_y >> 16) +
+ (fb->bits_per_pixel >> 3) * (state->src_x >> 16);
+}
+
static int dpu_plane_atomic_check(struct drm_plane *plane,
struct drm_plane_state *state)
{
struct dpu_plane_state *dpstate = to_dpu_plane_state(state);
struct drm_crtc_state *crtc_state;
struct drm_framebuffer *fb = state->fb;
- struct drm_gem_cma_object *cma_obj;
+ dma_addr_t baseaddr;
unsigned int depth;
int bpp;
}
/* base address alignment check */
- cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+ baseaddr = drm_plane_state_to_baseaddr(state);
drm_fb_get_bpp_depth(fb->pixel_format, &depth, &bpp);
switch (bpp) {
case 32:
- if (cma_obj->paddr & 0x3)
+ if (baseaddr & 0x3)
return -EINVAL;
break;
case 16:
- if (cma_obj->paddr & 0x1)
+ if (baseaddr & 0x1)
return -EINVAL;
break;
}
struct dpu_layerblend *lb;
struct dpu_constframe *cf;
struct dpu_extdst *ed;
- struct drm_gem_cma_object *cma_obj;
struct device *dev = plane->dev->dev;
- unsigned int depth, src_x, src_y, src_w, src_h;
+ unsigned int depth, src_w, src_h;
int bpp, fd_id, lb_id;
/*
fd = res->fd[fd_id];
lb = res->lb[lb_id];
- cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
-
- src_x = state->src_x >> 16;
- src_y = state->src_y >> 16;
src_w = state->src_w >> 16;
src_h = state->src_h >> 16;
fetchdecode_source_stride(fd, fb->pitches[0]);
fetchdecode_src_buf_dimensions(fd, src_w, src_h);
fetchdecode_set_fmt(fd, fb->pixel_format);
- fetchdecode_clipoffset(fd, src_x, src_y);
- fetchdecode_clipdimensions(fd, src_w, src_h);
fetchdecode_layerproperty(fd, true);
- fetchdecode_framedimensions(fd, state->crtc_w, state->crtc_h);
- fetchdecode_baseaddress(fd, cma_obj->paddr);
+ fetchdecode_framedimensions(fd, src_w, src_h);
+ fetchdecode_baseaddress(fd, drm_plane_state_to_baseaddr(state));
layerblend_pixengcfg_dynamic_prim_sel(lb, dpstate->stage);
layerblend_pixengcfg_dynamic_sec_sel(lb, dpstate->source);