We were using set_properties and gamma in a weird way.
This change aligns the properties with other drivers
and allows us to remove a private gamma flag and reuse
atomic helpers for most of this.

Change-Id: Ic74b692ee6c6d3e4fd938c6226e65b54075ff983
Signed-off-by: Harry Wentland <harry.wentl...@amd.com>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c    | 89 +++++-----------------
 1 file changed, 21 insertions(+), 68 deletions(-)

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 e80ecd5707f8..2ee5765f0315 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
@@ -61,7 +61,6 @@ struct dm_connector_state {
 #define to_dm_connector_state(x)\
        container_of((x), struct dm_connector_state, base)
 
-#define AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET 1
 
 void amdgpu_dm_encoder_destroy(struct drm_encoder *encoder)
 {
@@ -551,23 +550,18 @@ static void fill_gamma_from_crtc(
 {
        int i;
        struct dc_gamma *gamma;
-       uint16_t *red, *green, *blue;
-       int end = (crtc->gamma_size > NUM_OF_RAW_GAMMA_RAMP_RGB_256) ?
-                       NUM_OF_RAW_GAMMA_RAMP_RGB_256 : crtc->gamma_size;
-
-       red = crtc->gamma_store;
-       green = red + crtc->gamma_size;
-       blue = green + crtc->gamma_size;
+       struct drm_crtc_state *state = crtc->state;
+       struct drm_color_lut *lut = (struct drm_color_lut *) 
state->gamma_lut->data;
 
        gamma = dc_create_gamma();
 
        if (gamma == NULL)
                return;
 
-       for (i = 0; i < end; i++) {
-               gamma->red[i] = (unsigned short) red[i];
-               gamma->green[i] = (unsigned short) green[i];
-               gamma->blue[i] = (unsigned short) blue[i];
+       for (i = 0; i < NUM_OF_RAW_GAMMA_RAMP_RGB_256; i++) {
+               gamma->red[i] = lut[i].red;
+               gamma->green[i] = lut[i].green;
+               gamma->blue[i] = lut[i].blue;
        }
 
        dc_surface->gamma_correction = gamma;
@@ -601,8 +595,7 @@ static void fill_plane_attributes(
        surface->in_transfer_func = input_tf;
 
        /* In case of gamma set, update gamma value */
-       if (crtc->mode.private_flags &
-               AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET) {
+       if (state->crtc->state->gamma_lut) {
                fill_gamma_from_crtc(crtc, surface);
        }
 }
@@ -719,12 +712,6 @@ static void dm_dc_surface_commit(
                        dc_surface,
                        crtc->primary->state,
                        true);
-       if (crtc->mode.private_flags &
-               AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET) {
-               /* reset trigger of gamma */
-               crtc->mode.private_flags &=
-                       ~AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET;
-       }
 
        dc_surfaces[0] = dc_surface;
 
@@ -1049,50 +1036,6 @@ void amdgpu_dm_crtc_destroy(struct drm_crtc *crtc)
        kfree(crtc);
 }
 
-static int amdgpu_dm_atomic_crtc_gamma_set(
-               struct drm_crtc *crtc,
-               u16 *red,
-               u16 *green,
-               u16 *blue,
-               uint32_t size)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_property *prop = dev->mode_config.prop_crtc_id;
-
-       crtc->state->mode.private_flags |= 
AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET;
-
-       return drm_atomic_helper_crtc_set_property(crtc, prop, 0);
-}
-
-static int dm_crtc_funcs_atomic_set_property(
-       struct drm_crtc *crtc,
-       struct drm_crtc_state *crtc_state,
-       struct drm_property *property,
-       uint64_t val)
-{
-       struct drm_plane_state *plane_state;
-
-       crtc_state->planes_changed = true;
-
-       /*
-        * Bit of magic done here. We need to ensure
-        * that planes get update after mode is set.
-        * So, we need to add primary plane to state,
-        * and this way atomic_update would be called
-        * for it
-        */
-       plane_state =
-               drm_atomic_get_plane_state(
-                       crtc_state->state,
-                       crtc->primary);
-
-       if (!plane_state)
-               return -EINVAL;
-
-       return 0;
-}
-
-
 static int amdgpu_atomic_helper_page_flip(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
                                struct drm_pending_vblank_event *event,
@@ -1174,12 +1117,12 @@ static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs 
= {
        .cursor_set = dm_crtc_cursor_set,
        .cursor_move = dm_crtc_cursor_move,
        .destroy = amdgpu_dm_crtc_destroy,
-       .gamma_set = amdgpu_dm_atomic_crtc_gamma_set,
+       .gamma_set = drm_atomic_helper_legacy_gamma_set,
        .set_config = drm_atomic_helper_set_config,
+       .set_property = drm_atomic_helper_crtc_set_property,
        .page_flip = amdgpu_atomic_helper_page_flip,
        .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
-       .atomic_set_property = dm_crtc_funcs_atomic_set_property
 };
 
 static enum drm_connector_status
@@ -2790,8 +2733,7 @@ int amdgpu_dm_atomic_commit(
                struct dm_connector_state *dm_state = NULL;
                enum dm_commit_action action;
 
-               if (!fb || !crtc || !crtc->state->planes_changed ||
-                       !crtc->state->active)
+               if (!fb || !crtc || !crtc->state->active)
                        continue;
 
                action = get_dm_commit_action(crtc->state);
@@ -3223,6 +3165,17 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
                        }
                        break;
                }
+
+               /*
+                * TODO revisit when removing commit action
+                * and looking at atomic flags directly
+                */
+
+               /* commit needs planes right now (for gamma, eg.) */
+               /* TODO rework commit to chack crtc for gamma change */
+               ret = drm_atomic_add_affected_planes(state, crtc);
+               if (ret)
+                       return ret;
        }
 
        for (i = 0; i < set_count; i++) {
-- 
2.9.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to