diff options
Diffstat (limited to 'drivers/gpu/drm/arm/malidp_planes.c')
| -rw-r--r-- | drivers/gpu/drm/arm/malidp_planes.c | 79 | 
1 files changed, 42 insertions, 37 deletions
| diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c index 351a85088d0e..ddbba67f0283 100644 --- a/drivers/gpu/drm/arm/malidp_planes.c +++ b/drivers/gpu/drm/arm/malidp_planes.c @@ -502,20 +502,22 @@ static void malidp_de_prefetch_settings(struct malidp_plane *mp,  }  static int malidp_de_plane_check(struct drm_plane *plane, -				 struct drm_plane_state *state) +				 struct drm_atomic_state *state)  { +	struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, +										 plane);  	struct malidp_plane *mp = to_malidp_plane(plane); -	struct malidp_plane_state *ms = to_malidp_plane_state(state); -	bool rotated = state->rotation & MALIDP_ROTATED_MASK; +	struct malidp_plane_state *ms = to_malidp_plane_state(new_plane_state); +	bool rotated = new_plane_state->rotation & MALIDP_ROTATED_MASK;  	struct drm_framebuffer *fb; -	u16 pixel_alpha = state->pixel_blend_mode; +	u16 pixel_alpha = new_plane_state->pixel_blend_mode;  	int i, ret;  	unsigned int block_w, block_h; -	if (!state->crtc || WARN_ON(!state->fb)) +	if (!new_plane_state->crtc || WARN_ON(!new_plane_state->fb))  		return 0; -	fb = state->fb; +	fb = new_plane_state->fb;  	ms->format = malidp_hw_get_format_id(&mp->hwdev->hw->map,  					     mp->layer->id, fb->format->format, @@ -541,15 +543,15 @@ static int malidp_de_plane_check(struct drm_plane *plane,  		DRM_DEBUG_KMS("Buffer width/height needs to be a multiple of tile sizes");  		return -EINVAL;  	} -	if ((state->src_x >> 16) % block_w || (state->src_y >> 16) % block_h) { +	if ((new_plane_state->src_x >> 16) % block_w || (new_plane_state->src_y >> 16) % block_h) {  		DRM_DEBUG_KMS("Plane src_x/src_y needs to be a multiple of tile sizes");  		return -EINVAL;  	} -	if ((state->crtc_w > mp->hwdev->max_line_size) || -	    (state->crtc_h > mp->hwdev->max_line_size) || -	    (state->crtc_w < mp->hwdev->min_line_size) || -	    (state->crtc_h < mp->hwdev->min_line_size)) +	if ((new_plane_state->crtc_w > mp->hwdev->max_line_size) || +	    (new_plane_state->crtc_h > mp->hwdev->max_line_size) || +	    (new_plane_state->crtc_w < mp->hwdev->min_line_size) || +	    (new_plane_state->crtc_h < mp->hwdev->min_line_size))  		return -EINVAL;  	/* @@ -559,15 +561,15 @@ static int malidp_de_plane_check(struct drm_plane *plane,  	 */  	if (ms->n_planes == 3 &&  	    !(mp->hwdev->hw->features & MALIDP_DEVICE_LV_HAS_3_STRIDES) && -	    (state->fb->pitches[1] != state->fb->pitches[2])) +	    (new_plane_state->fb->pitches[1] != new_plane_state->fb->pitches[2]))  		return -EINVAL; -	ret = malidp_se_check_scaling(mp, state); +	ret = malidp_se_check_scaling(mp, new_plane_state);  	if (ret)  		return ret;  	/* validate the rotation constraints for each layer */ -	if (state->rotation != DRM_MODE_ROTATE_0) { +	if (new_plane_state->rotation != DRM_MODE_ROTATE_0) {  		if (mp->layer->rot == ROTATE_NONE)  			return -EINVAL;  		if ((mp->layer->rot == ROTATE_COMPRESSED) && !(fb->modifier)) @@ -588,11 +590,11 @@ static int malidp_de_plane_check(struct drm_plane *plane,  	}  	ms->rotmem_size = 0; -	if (state->rotation & MALIDP_ROTATED_MASK) { +	if (new_plane_state->rotation & MALIDP_ROTATED_MASK) {  		int val; -		val = mp->hwdev->hw->rotmem_required(mp->hwdev, state->crtc_w, -						     state->crtc_h, +		val = mp->hwdev->hw->rotmem_required(mp->hwdev, new_plane_state->crtc_w, +						     new_plane_state->crtc_h,  						     fb->format->format,  						     !!(fb->modifier));  		if (val < 0) @@ -602,7 +604,7 @@ static int malidp_de_plane_check(struct drm_plane *plane,  	}  	/* HW can't support plane + pixel blending */ -	if ((state->alpha != DRM_BLEND_ALPHA_OPAQUE) && +	if ((new_plane_state->alpha != DRM_BLEND_ALPHA_OPAQUE) &&  	    (pixel_alpha != DRM_MODE_BLEND_PIXEL_NONE) &&  	    fb->format->has_alpha)  		return -EINVAL; @@ -789,13 +791,16 @@ static void malidp_de_set_plane_afbc(struct drm_plane *plane)  }  static void malidp_de_plane_update(struct drm_plane *plane, -				   struct drm_plane_state *old_state) +				   struct drm_atomic_state *state)  { +	struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state, +									   plane);  	struct malidp_plane *mp;  	struct malidp_plane_state *ms = to_malidp_plane_state(plane->state); -	struct drm_plane_state *state = plane->state; -	u16 pixel_alpha = state->pixel_blend_mode; -	u8 plane_alpha = state->alpha >> 8; +	struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state, +									   plane); +	u16 pixel_alpha = new_state->pixel_blend_mode; +	u8 plane_alpha = new_state->alpha >> 8;  	u32 src_w, src_h, dest_w, dest_h, val;  	int i;  	struct drm_framebuffer *fb = plane->state->fb; @@ -811,12 +816,12 @@ static void malidp_de_plane_update(struct drm_plane *plane,  		src_h = fb->height;  	} else {  		/* convert src values from Q16 fixed point to integer */ -		src_w = state->src_w >> 16; -		src_h = state->src_h >> 16; +		src_w = new_state->src_w >> 16; +		src_h = new_state->src_h >> 16;  	} -	dest_w = state->crtc_w; -	dest_h = state->crtc_h; +	dest_w = new_state->crtc_w; +	dest_h = new_state->crtc_h;  	val = malidp_hw_read(mp->hwdev, mp->layer->base);  	val = (val & ~LAYER_FORMAT_MASK) | ms->format; @@ -828,7 +833,7 @@ static void malidp_de_plane_update(struct drm_plane *plane,  	malidp_de_set_mmu_control(mp, ms);  	malidp_de_set_plane_pitches(mp, ms->n_planes, -				    state->fb->pitches); +				    new_state->fb->pitches);  	if ((plane->state->color_encoding != old_state->color_encoding) ||  	    (plane->state->color_range != old_state->color_range)) @@ -841,8 +846,8 @@ static void malidp_de_plane_update(struct drm_plane *plane,  	malidp_hw_write(mp->hwdev, LAYER_H_VAL(dest_w) | LAYER_V_VAL(dest_h),  			mp->layer->base + MALIDP_LAYER_COMP_SIZE); -	malidp_hw_write(mp->hwdev, LAYER_H_VAL(state->crtc_x) | -			LAYER_V_VAL(state->crtc_y), +	malidp_hw_write(mp->hwdev, LAYER_H_VAL(new_state->crtc_x) | +			LAYER_V_VAL(new_state->crtc_y),  			mp->layer->base + MALIDP_LAYER_OFFSET);  	if (mp->layer->id == DE_SMART) { @@ -864,19 +869,19 @@ static void malidp_de_plane_update(struct drm_plane *plane,  	val &= ~LAYER_ROT_MASK;  	/* setup the rotation and axis flip bits */ -	if (state->rotation & DRM_MODE_ROTATE_MASK) +	if (new_state->rotation & DRM_MODE_ROTATE_MASK)  		val |= ilog2(plane->state->rotation & DRM_MODE_ROTATE_MASK) <<  		       LAYER_ROT_OFFSET; -	if (state->rotation & DRM_MODE_REFLECT_X) +	if (new_state->rotation & DRM_MODE_REFLECT_X)  		val |= LAYER_H_FLIP; -	if (state->rotation & DRM_MODE_REFLECT_Y) +	if (new_state->rotation & DRM_MODE_REFLECT_Y)  		val |= LAYER_V_FLIP;  	val &= ~(LAYER_COMP_MASK | LAYER_PMUL_ENABLE | LAYER_ALPHA(0xff)); -	if (state->alpha != DRM_BLEND_ALPHA_OPAQUE) { +	if (new_state->alpha != DRM_BLEND_ALPHA_OPAQUE) {  		val |= LAYER_COMP_PLANE; -	} else if (state->fb->format->has_alpha) { +	} else if (new_state->fb->format->has_alpha) {  		/* We only care about blend mode if the format has alpha */  		switch (pixel_alpha) {  		case DRM_MODE_BLEND_PREMULTI: @@ -890,9 +895,9 @@ static void malidp_de_plane_update(struct drm_plane *plane,  	val |= LAYER_ALPHA(plane_alpha);  	val &= ~LAYER_FLOWCFG(LAYER_FLOWCFG_MASK); -	if (state->crtc) { +	if (new_state->crtc) {  		struct malidp_crtc_state *m = -			to_malidp_crtc_state(state->crtc->state); +			to_malidp_crtc_state(new_state->crtc->state);  		if (m->scaler_config.scale_enable &&  		    m->scaler_config.plane_src_id == mp->layer->id) @@ -907,7 +912,7 @@ static void malidp_de_plane_update(struct drm_plane *plane,  }  static void malidp_de_plane_disable(struct drm_plane *plane, -				    struct drm_plane_state *state) +				    struct drm_atomic_state *state)  {  	struct malidp_plane *mp = to_malidp_plane(plane); | 
