From 31e602e09de9230cdcf40edf837ef8de39cd2ec9 Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Thu, 22 Jun 2017 17:37:22 -0400 Subject: [PATCH 0531/4131] drm/amd/display: Create dm_plane_state. Hook up dc_surface creation/destruction to dm_plane_state. Rename amdgpu_drm_plane_state to dm_plane_state and do minor cleanups. Signed-off-by: Andrey Grodzovsky Reviewed-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 14 ++-- .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 80 ++++++++++++++++------ 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index cb52da06..06cdf51 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -59,6 +59,8 @@ struct amdgpu_hpd; #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 to_dm_plane_state(x) container_of(x, struct dm_plane_state, base); + #define AMDGPU_MAX_HPD_PINS 6 #define AMDGPU_MAX_CRTCS 6 #define AMDGPU_MAX_PLANES 6 @@ -444,16 +446,18 @@ struct amdgpu_crtc { struct drm_pending_vblank_event *event; }; -struct amdgpu_drm_plane_state { +/* TODO rename to dc_plane_state */ +struct dc_surface; + +struct dm_plane_state { struct drm_plane_state base; - unsigned int h_ratio; - unsigned int v_ratio; + struct dc_surface* dc_surface; }; -static inline struct amdgpu_drm_plane_state * +static inline struct dm_plane_state * to_amdgpu_plane_state(struct drm_plane_state *state) { - return container_of(state, struct amdgpu_drm_plane_state, base); + return container_of(state, struct dm_plane_state, base); } struct amdgpu_plane { 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 2c015a0..7a050aa 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 @@ -1499,45 +1499,82 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = { static void dm_drm_plane_reset(struct drm_plane *plane) { - struct amdgpu_drm_plane_state *amdgpu_state; + struct dm_plane_state *amdgpu_state = NULL; + struct amdgpu_device *adev = plane->dev->dev_private; - 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; - } + if (plane->state) + plane->funcs->atomic_destroy_state(plane, plane->state); amdgpu_state = kzalloc(sizeof(*amdgpu_state), GFP_KERNEL); + if (amdgpu_state) { plane->state = &amdgpu_state->base; plane->state->plane = plane; + plane->state->rotation = DRM_ROTATE_0; + + amdgpu_state->dc_surface = dc_create_surface(adev->dm.dc); + WARN_ON(!amdgpu_state->dc_surface); } + else + WARN_ON(1); } 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; + struct dm_plane_state *dm_plane_state, *old_dm_plane_state; + struct amdgpu_device *adev = plane->dev->dev_private; - amdgpu_state = to_amdgpu_plane_state(plane->state); - copy = kzalloc(sizeof(*amdgpu_state), GFP_KERNEL); - if (!copy) + old_dm_plane_state = to_dm_plane_state(plane->state); + dm_plane_state = kzalloc(sizeof(*dm_plane_state), GFP_KERNEL); + if (!dm_plane_state) return NULL; - __drm_atomic_helper_plane_duplicate_state(plane, ©->base); - return ©->base; + if (old_dm_plane_state->dc_surface) { + struct dc_surface *dc_surface = dc_create_surface(adev->dm.dc); + if (WARN_ON(!dc_surface)) + return NULL; + + __drm_atomic_helper_plane_duplicate_state(plane, &dm_plane_state->base); + + memcpy(dc_surface, old_dm_plane_state->dc_surface, sizeof(*dc_surface)); + + if (old_dm_plane_state->dc_surface->gamma_correction) + dc_gamma_retain(dc_surface->gamma_correction); + + if (old_dm_plane_state->dc_surface->in_transfer_func) + dc_transfer_func_retain(dc_surface->in_transfer_func); + + dm_plane_state->dc_surface = dc_surface; + + /*TODO Check for inferred values to be reset */ + } + else { + WARN_ON(1); + return NULL; + } + + return &dm_plane_state->base; } -static void dm_drm_plane_destroy_state(struct drm_plane *plane, - struct drm_plane_state *old_state) +void dm_drm_plane_destroy_state(struct drm_plane *plane, + struct drm_plane_state *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); + struct dm_plane_state *dm_plane_state = to_dm_plane_state(state); + + if (dm_plane_state->dc_surface) { + struct dc_surface *dc_surface = dm_plane_state->dc_surface; + + if (dc_surface->gamma_correction) + dc_gamma_release(&dc_surface->gamma_correction); + + if (dc_surface->in_transfer_func) + dc_transfer_func_release(dc_surface->in_transfer_func); + + dc_surface_release(dc_surface); + } + + drm_atomic_helper_plane_destroy_state(plane, state); } static const struct drm_plane_funcs dm_plane_funcs = { @@ -2548,6 +2585,7 @@ static void amdgpu_dm_commit_surfaces(struct drm_atomic_state *state, for (i = 0; i < planes_count; i++) dc_surface_release(dc_surfaces_constructed[i]); } else { + /*TODO BUG Here should go disable planes on CRTC. */ } } -- 2.7.4