Message ID | 20190924080022.19250-3-lowry.li@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/komeda: Add layer line size support | expand |
On Tue, Sep 24, 2019 at 08:00:49AM +0000, Lowry Li (Arm Technology China) wrote: > From: "Lowry Li (Arm Technology China)" <Lowry.Li@arm.com> > > Adds maximum line size check according to the AFBC decoder limitation > and special Line size limitation(2046) for format: YUV420_10BIT and X0L2. > > Signed-off-by: Lowry Li (Arm Technology China) <lowry.li@arm.com> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> Best regards, Liviu > --- > .../arm/display/komeda/d71/d71_component.c | 49 +++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c > index 357837b9d6ed..6740b8422f11 100644 > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c > @@ -349,7 +349,56 @@ static void d71_layer_dump(struct komeda_component *c, struct seq_file *sf) > seq_printf(sf, "%sAD_V_CROP:\t\t0x%X\n", prefix, v[2]); > } > > +static int d71_layer_validate(struct komeda_component *c, > + struct komeda_component_state *state) > +{ > + struct komeda_layer_state *st = to_layer_st(state); > + struct komeda_layer *layer = to_layer(c); > + struct drm_plane_state *plane_st; > + struct drm_framebuffer *fb; > + u32 fourcc, line_sz, max_line_sz; > + > + plane_st = drm_atomic_get_new_plane_state(state->obj.state, > + state->plane); > + fb = plane_st->fb; > + fourcc = fb->format->format; > + > + if (drm_rotation_90_or_270(st->rot)) > + line_sz = st->vsize - st->afbc_crop_t - st->afbc_crop_b; > + else > + line_sz = st->hsize - st->afbc_crop_l - st->afbc_crop_r; > + > + if (fb->modifier) { > + if ((fb->modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK) == > + AFBC_FORMAT_MOD_BLOCK_SIZE_32x8) > + max_line_sz = layer->line_sz; > + else > + max_line_sz = layer->line_sz / 2; > + > + if (line_sz > max_line_sz) { > + DRM_DEBUG_ATOMIC("afbc request line_sz: %d exceed the max afbc line_sz: %d.\n", > + line_sz, max_line_sz); > + return -EINVAL; > + } > + } > + > + if (fourcc == DRM_FORMAT_YUV420_10BIT && line_sz > 2046 && (st->afbc_crop_l % 4)) { > + DRM_DEBUG_ATOMIC("YUV420_10BIT input_hsize: %d exceed the max size 2046.\n", > + line_sz); > + return -EINVAL; > + } > + > + if (fourcc == DRM_FORMAT_X0L2 && line_sz > 2046 && (st->addr[0] % 16)) { > + DRM_DEBUG_ATOMIC("X0L2 input_hsize: %d exceed the max size 2046.\n", > + line_sz); > + return -EINVAL; > + } > + > + return 0; > +} > + > static const struct komeda_component_funcs d71_layer_funcs = { > + .validate = d71_layer_validate, > .update = d71_layer_update, > .disable = d71_layer_disable, > .dump_register = d71_layer_dump, > -- > 2.17.1 >
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c index 357837b9d6ed..6740b8422f11 100644 --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c @@ -349,7 +349,56 @@ static void d71_layer_dump(struct komeda_component *c, struct seq_file *sf) seq_printf(sf, "%sAD_V_CROP:\t\t0x%X\n", prefix, v[2]); } +static int d71_layer_validate(struct komeda_component *c, + struct komeda_component_state *state) +{ + struct komeda_layer_state *st = to_layer_st(state); + struct komeda_layer *layer = to_layer(c); + struct drm_plane_state *plane_st; + struct drm_framebuffer *fb; + u32 fourcc, line_sz, max_line_sz; + + plane_st = drm_atomic_get_new_plane_state(state->obj.state, + state->plane); + fb = plane_st->fb; + fourcc = fb->format->format; + + if (drm_rotation_90_or_270(st->rot)) + line_sz = st->vsize - st->afbc_crop_t - st->afbc_crop_b; + else + line_sz = st->hsize - st->afbc_crop_l - st->afbc_crop_r; + + if (fb->modifier) { + if ((fb->modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK) == + AFBC_FORMAT_MOD_BLOCK_SIZE_32x8) + max_line_sz = layer->line_sz; + else + max_line_sz = layer->line_sz / 2; + + if (line_sz > max_line_sz) { + DRM_DEBUG_ATOMIC("afbc request line_sz: %d exceed the max afbc line_sz: %d.\n", + line_sz, max_line_sz); + return -EINVAL; + } + } + + if (fourcc == DRM_FORMAT_YUV420_10BIT && line_sz > 2046 && (st->afbc_crop_l % 4)) { + DRM_DEBUG_ATOMIC("YUV420_10BIT input_hsize: %d exceed the max size 2046.\n", + line_sz); + return -EINVAL; + } + + if (fourcc == DRM_FORMAT_X0L2 && line_sz > 2046 && (st->addr[0] % 16)) { + DRM_DEBUG_ATOMIC("X0L2 input_hsize: %d exceed the max size 2046.\n", + line_sz); + return -EINVAL; + } + + return 0; +} + static const struct komeda_component_funcs d71_layer_funcs = { + .validate = d71_layer_validate, .update = d71_layer_update, .disable = d71_layer_disable, .dump_register = d71_layer_dump,