summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
diff options
context:
space:
mode:
authorjames qian wang (Arm Technology China) <james.qian.wang@arm.com>2019-05-17 11:05:06 +0100
committerLiviu Dudau <Liviu.Dudau@arm.com>2019-06-19 11:42:17 +0100
commitdf860f98bcd52c5425b40eb53e6a46ddbb6f1adc (patch)
tree51ab1d7bb3c1c2fb12fdd2bd650c24c5eac03abc /drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
parent6af386db05635db7cc3fac4d1d38a83b953f7251 (diff)
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: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com> Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Diffstat (limited to 'drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c')
-rw-r--r--drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
index 042d4d749d18..d9f4e883bf43 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c
@@ -271,21 +271,33 @@ komeda_component_get_avail_scaler(struct komeda_component *c,
static int
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_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))
return -EINVAL;
- if (!in_range(&layer->hsize_in, dflow->in_w)) {
- DRM_DEBUG_ATOMIC("src_w: %d is out of range.\n", dflow->in_w);
+ if (komeda_fb_check_src_coords(kfb, dflow->in_x, dflow->in_y,
+ 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;
}
- if (!in_range(&layer->vsize_in, dflow->in_h)) {
- DRM_DEBUG_ATOMIC("src_h: %d is out of range.\n", dflow->in_h);
+ if (!in_range(&layer->vsize_in, vsize_in)) {
+ DRM_DEBUG_ATOMIC("invalidate src_h %d.\n", vsize_in);
return -EINVAL;
}
@@ -304,7 +316,7 @@ komeda_layer_validate(struct komeda_layer *layer,
struct komeda_layer_state *st;
int i, err;
- err = komeda_layer_check_cfg(layer, kplane_st, dflow);
+ err = komeda_layer_check_cfg(layer, kfb, dflow);
if (err)
return err;
@@ -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_component_state *c_st;
struct komeda_layer_state *st;
- int i;
+ int i, err;
- if (!komeda_fb_is_layer_supported(kfb, wb_layer->layer_type,
- dflow->rot))
- return -EINVAL;
+ err = komeda_layer_check_cfg(wb_layer, kfb, dflow);
+ if (err)
+ return err;
c_st = komeda_component_get_state_and_set_user(&wb_layer->base,
conn_st->state, conn_st->connector, conn_st->crtc);