Commit df860f98 authored by james qian wang (Arm Technology China)'s avatar james qian wang (Arm Technology China) Committed by Liviu Dudau

drm/komeda: Add komeda_fb_check_src_coords

Add komeda_fb_check_src_coords and check if the layer configured src
rect can meet the requirement of fb and fb format.
Signed-off-by: default avatarJames Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
parent 6af386db
...@@ -214,6 +214,27 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file, ...@@ -214,6 +214,27 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
int komeda_fb_check_src_coords(const struct komeda_fb *kfb,
u32 src_x, u32 src_y, u32 src_w, u32 src_h)
{
const struct drm_framebuffer *fb = &kfb->base;
const struct drm_format_info *info = fb->format;
if ((src_x + src_w > fb->width) || (src_y + src_h > fb->height)) {
DRM_DEBUG_ATOMIC("Invalid source coordinate.\n");
return -EINVAL;
}
if ((src_x % info->hsub) || (src_w % info->hsub) ||
(src_y % info->vsub) || (src_h % info->vsub)) {
DRM_DEBUG_ATOMIC("Wrong subsampling dimension x:%d, y:%d, w:%d, h:%d for format: %x.\n",
src_x, src_y, src_w, src_h, info->format);
return -EINVAL;
}
return 0;
}
dma_addr_t dma_addr_t
komeda_fb_get_pixel_addr(struct komeda_fb *kfb, int x, int y, int plane) komeda_fb_get_pixel_addr(struct komeda_fb *kfb, int x, int y, int plane)
{ {
......
...@@ -38,6 +38,8 @@ struct komeda_fb { ...@@ -38,6 +38,8 @@ struct komeda_fb {
struct drm_framebuffer * struct drm_framebuffer *
komeda_fb_create(struct drm_device *dev, struct drm_file *file, komeda_fb_create(struct drm_device *dev, struct drm_file *file,
const struct drm_mode_fb_cmd2 *mode_cmd); const struct drm_mode_fb_cmd2 *mode_cmd);
int komeda_fb_check_src_coords(const struct komeda_fb *kfb,
u32 src_x, u32 src_y, u32 src_w, u32 src_h);
dma_addr_t dma_addr_t
komeda_fb_get_pixel_addr(struct komeda_fb *kfb, int x, int y, int plane); komeda_fb_get_pixel_addr(struct komeda_fb *kfb, int x, int y, int plane);
bool komeda_fb_is_layer_supported(struct komeda_fb *kfb, u32 layer_type, bool komeda_fb_is_layer_supported(struct komeda_fb *kfb, u32 layer_type,
......
...@@ -271,21 +271,33 @@ komeda_component_get_avail_scaler(struct komeda_component *c, ...@@ -271,21 +271,33 @@ komeda_component_get_avail_scaler(struct komeda_component *c,
static int static int
komeda_layer_check_cfg(struct komeda_layer *layer, komeda_layer_check_cfg(struct komeda_layer *layer,
struct komeda_plane_state *kplane_st, struct komeda_fb *kfb,
struct komeda_data_flow_cfg *dflow) struct komeda_data_flow_cfg *dflow)
{ {
struct komeda_fb *kfb = to_kfb(kplane_st->base.fb); u32 hsize_in, vsize_in;
if (!komeda_fb_is_layer_supported(kfb, layer->layer_type, dflow->rot)) if (!komeda_fb_is_layer_supported(kfb, layer->layer_type, dflow->rot))
return -EINVAL; return -EINVAL;
if (!in_range(&layer->hsize_in, dflow->in_w)) { if (komeda_fb_check_src_coords(kfb, dflow->in_x, dflow->in_y,
DRM_DEBUG_ATOMIC("src_w: %d is out of range.\n", dflow->in_w); dflow->in_w, dflow->in_h))
return -EINVAL;
if (layer->base.id == KOMEDA_COMPONENT_WB_LAYER) {
hsize_in = dflow->out_w;
vsize_in = dflow->out_h;
} else {
hsize_in = dflow->in_w;
vsize_in = dflow->in_h;
}
if (!in_range(&layer->hsize_in, hsize_in)) {
DRM_DEBUG_ATOMIC("invalidate src_w %d.\n", hsize_in);
return -EINVAL; return -EINVAL;
} }
if (!in_range(&layer->vsize_in, dflow->in_h)) { if (!in_range(&layer->vsize_in, vsize_in)) {
DRM_DEBUG_ATOMIC("src_h: %d is out of range.\n", dflow->in_h); DRM_DEBUG_ATOMIC("invalidate src_h %d.\n", vsize_in);
return -EINVAL; return -EINVAL;
} }
...@@ -304,7 +316,7 @@ komeda_layer_validate(struct komeda_layer *layer, ...@@ -304,7 +316,7 @@ komeda_layer_validate(struct komeda_layer *layer,
struct komeda_layer_state *st; struct komeda_layer_state *st;
int i, err; int i, err;
err = komeda_layer_check_cfg(layer, kplane_st, dflow); err = komeda_layer_check_cfg(layer, kfb, dflow);
if (err) if (err)
return err; return err;
...@@ -362,11 +374,11 @@ komeda_wb_layer_validate(struct komeda_layer *wb_layer, ...@@ -362,11 +374,11 @@ komeda_wb_layer_validate(struct komeda_layer *wb_layer,
struct komeda_fb *kfb = to_kfb(conn_st->writeback_job->fb); struct komeda_fb *kfb = to_kfb(conn_st->writeback_job->fb);
struct komeda_component_state *c_st; struct komeda_component_state *c_st;
struct komeda_layer_state *st; struct komeda_layer_state *st;
int i; int i, err;
if (!komeda_fb_is_layer_supported(kfb, wb_layer->layer_type, err = komeda_layer_check_cfg(wb_layer, kfb, dflow);
dflow->rot)) if (err)
return -EINVAL; return err;
c_st = komeda_component_get_state_and_set_user(&wb_layer->base, c_st = komeda_component_get_state_and_set_user(&wb_layer->base,
conn_st->state, conn_st->connector, conn_st->crtc); conn_st->state, conn_st->connector, conn_st->crtc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment