[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