diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 54 | 
2 files changed, 62 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index 362d9559f065..bdae70e128c4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -57,6 +57,7 @@ struct amdgpu_hpd;  #define to_amdgpu_connector(x) container_of(x, struct amdgpu_connector, base)  #define to_amdgpu_encoder(x) container_of(x, struct amdgpu_encoder, base)  #define to_amdgpu_framebuffer(x) container_of(x, struct amdgpu_framebuffer, base) +#define to_amdgpu_plane(x)	container_of(x, struct amdgpu_plane, base)  #define AMDGPU_MAX_HPD_PINS 6  #define AMDGPU_MAX_CRTCS 6 @@ -439,6 +440,18 @@ struct amdgpu_crtc {  	struct drm_pending_vblank_event *event;  }; +struct amdgpu_drm_plane_state { +	struct drm_plane_state base; +	unsigned int h_ratio; +	unsigned int v_ratio; +}; + +static inline struct amdgpu_drm_plane_state * +to_amdgpu_plane_state(struct drm_plane_state *state) +{ +	return container_of(state, struct amdgpu_drm_plane_state, base); +} +  struct amdgpu_plane {  	struct drm_plane base;  	enum drm_plane_type plane_type; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c index 1751f138c36a..aa243584b2cc 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c @@ -1445,12 +1445,56 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {  	.atomic_check = dm_encoder_helper_atomic_check  }; +static void dm_drm_plane_reset(struct drm_plane *plane) +{ +	struct amdgpu_drm_plane_state *amdgpu_state; + +	if (plane->state) { +		amdgpu_state = to_amdgpu_plane_state(plane->state); +		if (amdgpu_state->base.fb) +			drm_framebuffer_unreference(amdgpu_state->base.fb); +		kfree(amdgpu_state); +		plane->state = NULL; +	} + +	amdgpu_state = kzalloc(sizeof(*amdgpu_state), GFP_KERNEL); +	if (amdgpu_state) { +		plane->state = &amdgpu_state->base; +		plane->state->plane = plane; +	} +} + +static struct drm_plane_state * +dm_drm_plane_duplicate_state(struct drm_plane *plane) +{ +	struct amdgpu_drm_plane_state *amdgpu_state; +	struct amdgpu_drm_plane_state *copy; + +	amdgpu_state = to_amdgpu_plane_state(plane->state); +	copy = kzalloc(sizeof(*amdgpu_state), GFP_KERNEL); +	if (!copy) +		return NULL; + +	__drm_atomic_helper_plane_duplicate_state(plane, ©->base); +	return ©->base; +} + +static void dm_drm_plane_destroy_state(struct drm_plane *plane, +					   struct drm_plane_state *old_state) +{ +	struct amdgpu_drm_plane_state *old_amdgpu_state = +					to_amdgpu_plane_state(old_state); +	__drm_atomic_helper_plane_destroy_state(old_state); +	kfree(old_amdgpu_state); +} +  static const struct drm_plane_funcs dm_plane_funcs = { -	.update_plane   = drm_atomic_helper_update_plane, -	.disable_plane  = drm_atomic_helper_disable_plane, -	.reset = drm_atomic_helper_plane_reset, -	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, -	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state +	.update_plane	= drm_atomic_helper_update_plane, +	.disable_plane	= drm_atomic_helper_disable_plane, +	.destroy	= drm_plane_cleanup, +	.reset = dm_drm_plane_reset, +	.atomic_duplicate_state = dm_drm_plane_duplicate_state, +	.atomic_destroy_state = dm_drm_plane_destroy_state,  };  static int dm_plane_helper_prepare_fb(  | 
