[Intel-gfx] [PATCH 20/20] drm/i915: Add 10bit gamma mode for gen2/3
Shankar, Uma
uma.shankar at intel.com
Mon Sep 21 19:40:19 UTC 2020
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Saturday, July 18, 2020 2:44 AM
> To: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 20/20] drm/i915: Add 10bit gamma mode for gen2/3
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Some gen2/gen3 parts have a 10bit gamma mode, on some pipes.
> Expose it.
>
> The format is different to the later i965+ style in that we store a 10bit value and
> a 6 bit floating point slope for each entry. Ie. the hardware extrapolates the
> intermediate steps from the current LUT entry, instead of interpolating between
> the current and next LUT entries. This also means we don't store the last LUT
> entry in any register as it is defined by the previous LUT entry's value+slope.
>
> The slope has limited precision though (2 bit exponent + 4 bit mantissa), so we
> have to allow for more error in the state checker for the last entry, and we have
> to make sure userspace doesn't pass in something where the slope is simply to
> steep. In theory we should perhaps check the slope for every interval, but we
> don't do that for any other interpolated gamma mode and I suspect they may
> also have some internal limit on the slope. I haven't confirmed that theory
> though. Anyways, only the last entry provides a slight challenge for the state
> checker since all the other entries do have an explicit value stored in a register.
Couldn't verify the details from spec. But with the description, was not able to spot any issue
with the implementation.
Acked-by: Uma Shankar <uma.shankar at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_color.c | 248 ++++++++++++++++++++-
> drivers/gpu/drm/i915/i915_pci.c | 10 +-
> drivers/gpu/drm/i915/i915_reg.h | 38 +++-
> 3 files changed, 279 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_color.c
> b/drivers/gpu/drm/i915/display/intel_color.c
> index ca6c6679368c..055a49ed4e3a 100644
> --- a/drivers/gpu/drm/i915/display/intel_color.c
> +++ b/drivers/gpu/drm/i915/display/intel_color.c
> @@ -414,6 +414,79 @@ static void i9xx_lut_8_pack(struct drm_color_lut *entry,
> u32 val)
> entry->blue =
> intel_color_lut_pack(REG_FIELD_GET(LGC_PALETTE_BLUE_MASK, val), 8); }
>
> +/* i8xx/i9xx+ 10bit slope format "even DW" (low 8 bits) */ static u32
> +_i9xx_lut_10_ldw(u16 a) {
> + return drm_color_lut_extract(a, 10) & 0xff; }
> +
> +static u32 i9xx_lut_10_ldw(const struct drm_color_lut *color) {
> + return _i9xx_lut_10_ldw(color[0].red) << 16 |
> + _i9xx_lut_10_ldw(color[0].green) << 8 |
> + _i9xx_lut_10_ldw(color[0].blue);
> +}
> +
> +/* i8xx/i9xx+ 10bit slope format "odd DW" (high 2 bits + slope) */
> +static u32 _i9xx_lut_10_udw(u16 a, u16 b) {
> + unsigned int mantissa, exponent;
> +
> + a = drm_color_lut_extract(a, 10);
> + b = drm_color_lut_extract(b, 10);
> +
> + /* b = a + 8 * m * 2 ^ -e */
> + mantissa = clamp(b - a, 0, 0x7f);
> + exponent = 3;
> + while (mantissa > 0xf) {
> + mantissa >>= 1;
> + exponent--;
> + }
> +
> + return (exponent << 6) |
> + (mantissa << 2) |
> + (a >> 8);
> +}
> +
> +static u32 i9xx_lut_10_udw(const struct drm_color_lut *color) {
> + return _i9xx_lut_10_udw(color[0].red, color[1].red) << 16 |
> + _i9xx_lut_10_udw(color[0].green, color[1].green) << 8 |
> + _i9xx_lut_10_udw(color[0].blue, color[1].blue); }
> +
> +static void i9xx_lut_10_pack(struct drm_color_lut *color,
> + u32 ldw, u32 udw)
> +{
> + u16 red = REG_FIELD_GET(PALETTE_10BIT_RED_LDW_MASK, ldw) |
> + REG_FIELD_GET(PALETTE_10BIT_RED_UDW_MASK, udw) << 8;
> + u16 green = REG_FIELD_GET(PALETTE_10BIT_GREEN_LDW_MASK, ldw) |
> + REG_FIELD_GET(PALETTE_10BIT_GREEN_UDW_MASK, udw) << 8;
> + u16 blue = REG_FIELD_GET(PALETTE_10BIT_BLUE_LDW_MASK, ldw) |
> + REG_FIELD_GET(PALETTE_10BIT_BLUE_UDW_MASK, udw) << 8;
> +
> + color->red = intel_color_lut_pack(red, 10);
> + color->green = intel_color_lut_pack(green, 10);
> + color->blue = intel_color_lut_pack(blue, 10); }
> +
> +static void i9xx_lut_10_pack_slope(struct drm_color_lut *color,
> + u32 ldw, u32 udw)
> +{
> + int r_exp = REG_FIELD_GET(PALETTE_10BIT_RED_EXP_MASK, udw);
> + int r_mant = REG_FIELD_GET(PALETTE_10BIT_RED_MANT_MASK, udw);
> + int g_exp = REG_FIELD_GET(PALETTE_10BIT_GREEN_EXP_MASK, udw);
> + int g_mant = REG_FIELD_GET(PALETTE_10BIT_GREEN_MANT_MASK,
> udw);
> + int b_exp = REG_FIELD_GET(PALETTE_10BIT_BLUE_EXP_MASK, udw);
> + int b_mant = REG_FIELD_GET(PALETTE_10BIT_BLUE_MANT_MASK, udw);
> +
> + i9xx_lut_10_pack(color, ldw, udw);
> +
> + color->red += r_mant << (3 - r_exp);
> + color->green += g_mant << (3 - g_exp);
> + color->blue += b_mant << (3 - b_exp);
> +}
> +
> /* i965+ "10.6" bit interpolated format "even DW" (low 8 bits) */ static u32
> i965_lut_10p6_ldw(const struct drm_color_lut *color) { @@ -554,6 +627,22 @@
> static void i9xx_load_lut_8(struct intel_crtc *crtc,
> i9xx_lut_8(&lut[i]));
> }
>
> +static void i9xx_load_lut_10(struct intel_crtc *crtc,
> + const struct drm_property_blob *blob) {
> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + const struct drm_color_lut *lut = blob->data;
> + int i, lut_size = drm_color_lut_size(blob);
> + enum pipe pipe = crtc->pipe;
> +
> + for (i = 0; i < lut_size - 1; i++) {
> + intel_de_write(dev_priv, PALETTE(pipe, 2 * i + 0),
> + i9xx_lut_10_ldw(&lut[i]));
> + intel_de_write(dev_priv, PALETTE(pipe, 2 * i + 1),
> + i9xx_lut_10_udw(&lut[i]));
> + }
> +}
> +
> static void i9xx_load_luts(const struct intel_crtc_state *crtc_state) {
> struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> @@ -562,7 +651,10 @@ static void i9xx_load_luts(const struct intel_crtc_state
> *crtc_state)
>
> assert_pll_enabled(dev_priv, crtc->pipe);
>
> - i9xx_load_lut_8(crtc, gamma_lut);
> + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
> + i9xx_load_lut_8(crtc, gamma_lut);
> + else
> + i9xx_load_lut_10(crtc, gamma_lut);
> }
>
> static void i965_load_lut_10p6(struct intel_crtc *crtc, @@ -1326,11 +1418,36
> @@ static u32 i9xx_gamma_mode(struct intel_crtc_state *crtc_state)
> crtc_state_is_legacy_gamma(crtc_state))
> return GAMMA_MODE_MODE_8BIT;
> else
> - return GAMMA_MODE_MODE_10BIT; /* i965+ only */
> + return GAMMA_MODE_MODE_10BIT;
> +}
> +
> +static int i9xx_lut_10_diff(u16 a, u16 b) {
> + return drm_color_lut_extract(a, 10) -
> + drm_color_lut_extract(b, 10);
> +}
> +
> +static int i9xx_check_lut_10(struct drm_i915_private *dev_priv,
> + const struct drm_property_blob *blob) {
> + const struct drm_color_lut *lut = blob->data;
> + int lut_size = drm_color_lut_size(blob);
> + const struct drm_color_lut *a = &lut[lut_size - 2];
> + const struct drm_color_lut *b = &lut[lut_size - 1];
> +
> + if (i9xx_lut_10_diff(b->red, a->red) > 0x7f ||
> + i9xx_lut_10_diff(b->green, a->green) > 0x7f ||
> + i9xx_lut_10_diff(b->blue, a->blue) > 0x7f) {
> + drm_dbg_kms(&dev_priv->drm, "Last gamma LUT entry exceeds
> max slope\n");
> + return -EINVAL;
> + }
> +
> + return 0;
> }
>
> static int i9xx_color_check(struct intel_crtc_state *crtc_state) {
> + struct drm_i915_private *dev_priv =
> +to_i915(crtc_state->uapi.crtc->dev);
> int ret;
>
> ret = check_luts(crtc_state);
> @@ -1343,6 +1460,13 @@ static int i9xx_color_check(struct intel_crtc_state
> *crtc_state)
>
> crtc_state->gamma_mode = i9xx_gamma_mode(crtc_state);
>
> + if (INTEL_GEN(dev_priv) < 4 &&
> + crtc_state->gamma_mode == GAMMA_MODE_MODE_10BIT) {
> + ret = i9xx_check_lut_10(dev_priv, crtc_state->hw.gamma_lut);
> + if (ret)
> + return ret;
> + }
> +
> ret = intel_color_add_affected_planes(crtc_state);
> if (ret)
> return ret;
> @@ -1613,6 +1737,22 @@ static int icl_color_check(struct intel_crtc_state
> *crtc_state) }
>
> static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state)
> +{
> + if (!crtc_state->gamma_enable)
> + return 0;
> +
> + switch (crtc_state->gamma_mode) {
> + case GAMMA_MODE_MODE_8BIT:
> + return 8;
> + case GAMMA_MODE_MODE_10BIT:
> + return 10;
> + default:
> + MISSING_CASE(crtc_state->gamma_mode);
> + return 0;
> + }
> +}
> +
> +static int i965_gamma_precision(const struct intel_crtc_state
> +*crtc_state)
> {
> if (!crtc_state->gamma_enable)
> return 0;
> @@ -1700,7 +1840,7 @@ static int chv_gamma_precision(const struct
> intel_crtc_state *crtc_state)
> if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
> return 10;
> else
> - return i9xx_gamma_precision(crtc_state);
> + return i965_gamma_precision(crtc_state);
> }
>
> static int glk_degamma_precision(const struct intel_crtc_state *crtc_state) @@ -
> 1803,6 +1943,37 @@ static bool intel_lut_equal(const struct drm_property_blob
> *blob1,
> return true;
> }
>
> +static bool i9xx_lut_10_equal(const struct drm_property_blob *blob1,
> + const struct drm_property_blob *blob2,
> + int bit_precision)
> +{
> + const struct drm_color_lut *lut1, *lut2;
> + int i, lut_size;
> +
> + if (!intel_color_lut_sizes_equal(blob1, blob2))
> + return false;
> +
> + if (!blob1)
> + return true;
> +
> + if (!bit_precision)
> + return false;
> +
> + lut_size = drm_color_lut_size(blob1);
> + lut1 = blob1->data;
> + lut2 = blob2->data;
> +
> + for (i = 0; i < lut_size - 1; i++) {
> + if (!lut_entry_equal(&lut1[i], &lut2[i],
> + 0xffff >> bit_precision))
> + return false;
> + }
> +
> + /* limited precision for the last entry due to floating point slope */
> + return lut_entry_equal(&lut1[i], &lut2[i],
> + 0xffff >> (bit_precision - 3)); }
> +
> static bool i9xx_degamma_equal(const struct intel_crtc_state *crtc_state1,
> const struct intel_crtc_state *crtc_state2,
> bool fastset)
> @@ -1821,8 +1992,23 @@ static bool i9xx_gamma_equal(const struct
> intel_crtc_state *crtc_state1,
> const struct drm_property_blob *gamma_lut1 = crtc_state1-
> >hw.gamma_lut;
> const struct drm_property_blob *gamma_lut2 = crtc_state2-
> >hw.gamma_lut;
>
> + if (crtc_state1->gamma_mode == GAMMA_MODE_MODE_10BIT)
> + return i9xx_lut_10_equal(gamma_lut1, gamma_lut2,
> + i9xx_gamma_precision(crtc_state1));
> + else
> + return intel_lut_equal(gamma_lut1, gamma_lut2,
> + i9xx_gamma_precision(crtc_state1));
> +}
> +
> +static bool i965_gamma_equal(const struct intel_crtc_state *crtc_state1,
> + const struct intel_crtc_state *crtc_state2,
> + bool fastset)
> +{
> + const struct drm_property_blob *gamma_lut1 = crtc_state1-
> >hw.gamma_lut;
> + const struct drm_property_blob *gamma_lut2 =
> +crtc_state2->hw.gamma_lut;
> +
> return intel_lut_equal(gamma_lut1, gamma_lut2,
> - i9xx_gamma_precision(crtc_state1));
> + i965_gamma_precision(crtc_state1));
> }
>
> static bool chv_degamma_equal(const struct intel_crtc_state *crtc_state1, @@ -
> 2084,6 +2270,36 @@ static struct drm_property_blob *i9xx_read_lut_8(struct
> intel_crtc *crtc)
> return blob;
> }
>
> +static struct drm_property_blob *
> +i9xx_read_lut_10(struct intel_crtc *crtc) {
> + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> + u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
> + enum pipe pipe = crtc->pipe;
> + struct drm_property_blob *blob;
> + struct drm_color_lut *lut;
> + u32 ldw, udw;
> + int i;
> +
> + blob = drm_property_create_blob(&dev_priv->drm,
> + lut_size * sizeof(lut[0]), NULL);
> + if (IS_ERR(blob))
> + return NULL;
> +
> + lut = blob->data;
> +
> + for (i = 0; i < lut_size - 1; i++) {
> + ldw = intel_de_read(dev_priv, PALETTE(pipe, 2 * i + 0));
> + udw = intel_de_read(dev_priv, PALETTE(pipe, 2 * i + 1));
> +
> + i9xx_lut_10_pack(&lut[i], ldw, udw);
> + }
> +
> + i9xx_lut_10_pack_slope(&lut[i], ldw, udw);
> +
> + return blob;
> +}
> +
> static void i9xx_read_luts(struct intel_crtc_state *crtc_state) {
> struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> @@ -2091,7 +2307,10 @@ static void i9xx_read_luts(struct intel_crtc_state
> *crtc_state)
> if (!crtc_state->gamma_enable)
> return;
>
> - crtc_state->hw.gamma_lut = i9xx_read_lut_8(crtc);
> + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
> + crtc_state->hw.gamma_lut = i9xx_read_lut_8(crtc);
> + else
> + crtc_state->hw.gamma_lut = i9xx_read_lut_10(crtc);
> }
>
> static struct drm_property_blob *i965_read_lut_10p6(struct intel_crtc *crtc)
> @@ -2546,6 +2765,7 @@ void intel_color_init(struct intel_crtc *crtc) {
> struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> bool has_ctm = INTEL_INFO(dev_priv)->color.degamma_lut_size != 0;
> + int gamma_lut_size;
>
> drm_mode_crtc_set_gamma_size(&crtc->base, 256);
>
> @@ -2562,7 +2782,7 @@ void intel_color_init(struct intel_crtc *crtc)
> dev_priv->display.color_commit = i9xx_color_commit;
> dev_priv->display.load_luts = i965_load_luts;
> dev_priv->display.read_luts = i965_read_luts;
> - dev_priv->display.gamma_equal = i9xx_gamma_equal;
> + dev_priv->display.gamma_equal = i965_gamma_equal;
> dev_priv->display.degamma_equal =
> i9xx_degamma_equal;
> } else {
> dev_priv->display.color_check = i9xx_color_check; @@ -
> 2618,8 +2838,20 @@ void intel_color_init(struct intel_crtc *crtc)
>
> }
>
> + /*
> + * "DPALETTE_A: NOTE: The 8-bit (non-10-bit) mode is the
> + * only mode supported by Alviso and Grantsdale."
> + *
> + * Actually looks like this affects all of gen3.
> + * Confirmed on alv,cst,pnv. Mobile gen2 parts (alm,mgm)
> + * are confirmed not to suffer from this restriction.
> + */
> + if (IS_GEN(dev_priv, 3) && crtc->pipe == PIPE_A)
> + gamma_lut_size = 256;
> + else
> + gamma_lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size;
> +
> drm_crtc_enable_color_mgmt(&crtc->base,
> INTEL_INFO(dev_priv)-
> >color.degamma_lut_size,
> - has_ctm,
> - INTEL_INFO(dev_priv)->color.gamma_lut_size);
> + has_ctm, gamma_lut_size);
> }
> diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
> index 2338f92ce490..baa24e4691c0 100644
> --- a/drivers/gpu/drm/i915/i915_pci.c
> +++ b/drivers/gpu/drm/i915/i915_pci.c
> @@ -127,9 +127,9 @@
> [PIPE_D] = TGL_CURSOR_D_OFFSET, \
> }
>
> -#define I9XX_COLORS \
> +#define I845_COLORS \
> .color = { .gamma_lut_size = 256 }
> -#define I965_COLORS \
> +#define I9XX_COLORS \
> .color = { .gamma_lut_size = 129, \
> .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
> }
> @@ -194,7 +194,7 @@
> .dma_mask_size = 32, \
> I845_PIPE_OFFSETS, \
> I845_CURSOR_OFFSETS, \
> - I9XX_COLORS, \
> + I845_COLORS, \
> GEN_DEFAULT_PAGE_SIZES, \
> GEN_DEFAULT_REGIONS
>
> @@ -323,7 +323,7 @@ static const struct intel_device_info pnv_m_info = {
> .dma_mask_size = 36, \
> I9XX_PIPE_OFFSETS, \
> I9XX_CURSOR_OFFSETS, \
> - I965_COLORS, \
> + I9XX_COLORS, \
> GEN_DEFAULT_PAGE_SIZES, \
> GEN_DEFAULT_REGIONS
>
> @@ -524,7 +524,7 @@ static const struct intel_device_info vlv_info = {
> .display_mmio_offset = VLV_DISPLAY_BASE,
> I9XX_PIPE_OFFSETS,
> I9XX_CURSOR_OFFSETS,
> - I965_COLORS,
> + I9XX_COLORS,
> GEN_DEFAULT_PAGE_SIZES,
> GEN_DEFAULT_REGIONS,
> };
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 428ef06b8084..0c34d62f22f4 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3708,10 +3708,40 @@ static inline bool i915_mmio_reg_valid(i915_reg_t
> reg)
> #define _PALETTE_A 0xa000
> #define _PALETTE_B 0xa800
> #define _CHV_PALETTE_C 0xc000
> -#define PALETTE_RED_MASK REG_GENMASK(23, 16)
> -#define PALETTE_GREEN_MASK REG_GENMASK(15, 8)
> -#define PALETTE_BLUE_MASK REG_GENMASK(7, 0)
> -#define PALETTE(pipe, i) _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \
> +/* 8bit palette mode */
> +#define PALETTE_RED_MASK REG_GENMASK(23, 16)
> +#define PALETTE_RED(x)
> REG_FIELD_PREP(PALETTE_RED_MASK, (x))
> +#define PALETTE_GREEN_MASK REG_GENMASK(15, 8)
> +#define PALETTE_GREEN(x) REG_FIELD_PREP(PALETTE_GREEN_MASK,
> (x))
> +#define PALETTE_BLUE_MASK REG_GENMASK(7, 0)
> +#define PALETTE_BLUE(x) REG_FIELD_PREP(PALETTE_BLUE_MASK,
> (x))
> +/* i9xx 10bit interpolated ldw */
> +#define PALETTE_10BIT_RED_LDW_MASK REG_GENMASK(23, 16)
> +#define PALETTE_10BIT_RED_LDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_RED_LDW_MASK, (x))
> +#define PALETTE_10BIT_GREEN_LDW_MASK REG_GENMASK(15, 8)
> +#define PALETTE_10BIT_GREEN_LDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_GREEN_LDW_MASK, (x))
> +#define PALETTE_10BIT_BLUE_LDW_MASK REG_GENMASK(7, 0)
> +#define PALETTE_10BIT_BLUE_LDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_BLUE_LDW_MASK, (x))
> +/* i9xx 10bit interpolated udw */
> +#define PALETTE_10BIT_RED_EXP_MASK REG_GENMASK(23, 22)
> +#define PALETTE_10BIT_RED_EXP(x)
> REG_FIELD_PREP(PALETTE_10BIT_RED_EXP_MASK, (x))
> +#define PALETTE_10BIT_RED_MANT_MASK REG_GENMASK(21, 18)
> +#define PALETTE_10BIT_RED_MANT(x)
> REG_FIELD_PREP(PALETTE_10BIT_RED_MANT_MASK, (x))
> +#define PALETTE_10BIT_RED_UDW_MASK REG_GENMASK(17, 16)
> +#define PALETTE_10BIT_RED_UDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_RED_UDW_MASK, (X))
> +#define PALETTE_10BIT_GREEN_EXP_MASK REG_GENMASK(15, 14)
> +#define PALETTE_10BIT_GREEN_EXP(x)
> REG_FIELD_PREP(PALETTE_10BIT_GREEN_EXP_MASK, (x))
> +#define PALETTE_10BIT_GREEN_MANT_MASK REG_GENMASK(13, 10)
> +#define PALETTE_10BIT_GREEN_MANT(x)
> REG_FIELD_PREP(PALETTE_10BIT_GREEN_MANT_MASK, (x))
> +#define PALETTE_10BIT_GREEN_UDW_MASK REG_GENMASK(9, 8)
> +#define PALETTE_10BIT_GREEN_UDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_GREEN_UDW_MASK, (x))
> +#define PALETTE_10BIT_BLUE_EXP_MASK REG_GENMASK(7, 6)
> +#define PALETTE_10BIT_BLUE_EXP(x)
> REG_FIELD_PREP(PALETTE_10BIT_BLUE_EXP_MASK, (x))
> +#define PALETTE_10BIT_BLUE_MANT_MASK REG_GENMASK(5, 2)
> +#define PALETTE_10BIT_BLUE_MANT(x)
> REG_FIELD_PREP(PALETTE_10BIT_BLUE_MANT_MASK, (x))
> +#define PALETTE_10BIT_BLUE_UDW_MASK REG_GENMASK(1, 0)
> +#define PALETTE_10BIT_BLUE_UDW(x)
> REG_FIELD_PREP(PALETTE_10BIT_BLUE_UDW_MASK, (x))
> +#define PALETTE(pipe, i) _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \
> _PICK((pipe), _PALETTE_A, \
> _PALETTE_B, _CHV_PALETTE_C) + \
> (i) * 4)
> --
> 2.26.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list