aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch173
1 files changed, 173 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch
new file mode 100644
index 00000000..b409f7a5
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0531-drm-amd-display-Create-dm_plane_state.patch
@@ -0,0 +1,173 @@
+From 31e602e09de9230cdcf40edf837ef8de39cd2ec9 Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+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 <Andrey.Grodzovsky@amd.com>
+Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ 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, &copy->base);
+- return &copy->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
+