[PATCH 6/6] drm/i915/icl: Add support for multi segmented gamma mode

Uma Shankar uma.shankar at intel.com
Sat Jan 6 14:08:01 UTC 2018


Gen11 introduced a new gamma mode i.e, multi segmented
gamma mode. Added support for the same.

Signed-off-by: Uma Shankar <uma.shankar at intel.com>
---
 drivers/gpu/drm/i915/intel_color.c | 40 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_color.c b/drivers/gpu/drm/i915/intel_color.c
index 23878a0..15aa3ff 100644
--- a/drivers/gpu/drm/i915/intel_color.c
+++ b/drivers/gpu/drm/i915/intel_color.c
@@ -676,6 +676,10 @@ static void icl_load_gamma_lut(struct drm_crtc_state *state, u32 offset)
 		struct drm_color_lut *lut =
 			(struct drm_color_lut *) state->gamma_lut->data;
 
+		if (intel_crtc_state->gamma_mode_type ==
+				MULTI_SEGMENTED_GAMMA_MODE_12BIT)
+			lut += 9;
+
 		for (i = 0; i < lut_size; i++) {
 			word = (drm_color_lut_extract(lut[i].red, 10) << 20) |
 			(drm_color_lut_extract(lut[i].green, 10) << 10) |
@@ -706,6 +710,37 @@ static void icl_load_gamma_lut(struct drm_crtc_state *state, u32 offset)
 	}
 }
 
+static void icl_load_gamma_multi_segmented_lut(struct drm_crtc_state *state,
+					       u32 offset)
+{
+	struct drm_crtc *crtc = state->crtc;
+	struct drm_device *dev = crtc->dev;
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	enum pipe pipe = to_intel_crtc(crtc)->pipe;
+	uint32_t i, lut_size = 9;
+
+	WARN_ON(offset & ~PAL_PREC_MULTI_SEGMENT_INDEX_VALUE_MASK);
+
+	I915_WRITE(PREC_PAL_MULTI_SEG_INDEX(pipe),
+			(PAL_PREC_AUTO_INCREMENT | offset));
+
+	if (state->gamma_lut) {
+		struct drm_color_lut *lut =
+			(struct drm_color_lut *)state->gamma_lut->data;
+
+		for (i = 0; i < lut_size; i++) {
+			uint32_t word =
+			(drm_color_lut_extract(lut[i].red, 10) << 20) |
+			(drm_color_lut_extract(lut[i].green, 10) << 10) |
+			drm_color_lut_extract(lut[i].blue, 10);
+
+			I915_WRITE(PREC_PAL_MULTI_SEG_DATA(pipe), word);
+		}
+	}
+
+	icl_load_gamma_lut(state, 0);
+}
+
 static void icl_load_luts(struct drm_crtc_state *state)
 {
 	struct drm_crtc *crtc = state->crtc;
@@ -724,6 +759,11 @@ static void icl_load_luts(struct drm_crtc_state *state)
 	if (intel_state->gamma_mode_type == PRECISION_PALETTE_MODE_10BIT) {
 		icl_load_gamma_lut(state, 0);
 		intel_state->gamma_mode = GAMMA_MODE_MODE_10BIT;
+	} else if (intel_state->gamma_mode_type ==
+			MULTI_SEGMENTED_GAMMA_MODE_12BIT) {
+		icl_load_gamma_multi_segmented_lut(state, 0);
+		intel_state->gamma_mode =
+			GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED;
 	}
 
 	I915_WRITE(GAMMA_MODE(pipe), intel_state->gamma_mode);
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list