diff options
| author | Lowry Li (Arm Technology China) <Lowry.Li@arm.com> | 2019-09-24 08:00:49 +0000 | 
|---|---|---|
| committer | james qian wang (Arm Technology China) <james.qian.wang@arm.com> | 2019-10-16 16:05:00 +0800 | 
| commit | f15886fa7d29977efd27e653f1653f3d80910fd9 (patch) | |
| tree | a84b8172513c0e13ce8bd334fcacf35b17a8a3dc | |
| parent | 2b2510da431aecf2dfee217cfb9b5b54a6813098 (diff) | |
drm/komeda: Adds layer horizontal input size limitation check for D71
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>
Signed-off-by: james qian wang (Arm Technology China) <james.qian.wang@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190924080022.19250-3-lowry.li@arm.com
| -rw-r--r-- | drivers/gpu/drm/arm/display/komeda/d71/d71_component.c | 49 | 
1 files changed, 49 insertions, 0 deletions
| 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 b2db9ee16fda..f160ae7e17b4 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, | 
