All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Clifton <pcjc2@cam.ac.uk>
To: "intel-gfx@lists.freedesktop.org" <intel-gfx@lists.freedesktop.org>
Subject: [PATCH 2/3] drm/intel: Attempt to use 10-bit gamma palette mode
Date: Mon, 26 Apr 2010 23:24:17 +0100	[thread overview]
Message-ID: <1272320658-2157-2-git-send-email-pcjc2@cam.ac.uk> (raw)
In-Reply-To: <1272320445.23864.4.camel@pcjc2lap>

---
 drivers/gpu/drm/i915/i915_reg.h      |    7 ++++++-
 drivers/gpu/drm/i915/intel_display.c |   33 ++++++++++++++++++++++++++-------
 2 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index ab1bd2d..7a0c6ac 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1766,6 +1766,9 @@
 #define   PIPECONF_INTERLACE_W_FIELD_INDICATION	(6 << 21)
 #define   PIPECONF_INTERLACE_FIELD_0_ONLY		(7 << 21)
 #define   PIPECONF_CXSR_DOWNCLOCK	(1<<16)
+#define PIPEAGCMAXRED		0x70010
+#define PIPEAGCMAXGREEN		0x70014
+#define PIPEAGCMAXBLUE		0x70018
 #define PIPEASTAT		0x70024
 #define   PIPE_FIFO_UNDERRUN_STATUS		(1UL<<31)
 #define   PIPE_CRC_ERROR_ENABLE			(1UL<<29)
@@ -1958,13 +1961,15 @@
 /* Pipe B */
 #define PIPEBDSL		0x71000
 #define PIPEBCONF		0x71008
+#define PIPEBGCMAXRED		0x71010
+#define PIPEBGCMAXGREEN		0x71014
+#define PIPEBGCMAXBLUE		0x71018
 #define PIPEBSTAT		0x71024
 #define PIPEBFRAMEHIGH		0x71040
 #define PIPEBFRAMEPIXEL		0x71044
 #define PIPEB_FRMCOUNT_GM45	0x71040
 #define PIPEB_FLIPCOUNT_GM45	0x71044
 
-
 /* Display B control */
 #define DSPBCNTR		0x71180
 #define   DISPPLANE_ALPHA_TRANS_ENABLE		(1<<15)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 456f738..5e8191a 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3433,6 +3433,9 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
 	int pipe = intel_crtc->pipe;
 	int pal_reg = (pipe == 0) ? PALETTE_A : PALETTE_B;
 	int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
+	int maxr_reg = (pipe == 0) ? PIPEAGCMAXRED : PIPEBGCMAXRED;
+	int maxg_reg = (pipe == 0) ? PIPEAGCMAXGREEN : PIPEBGCMAXGREEN;
+	int maxb_reg = (pipe == 0) ? PIPEAGCMAXBLUE : PIPEBGCMAXBLUE;
 	int pipeconf = I915_READ(pipeconf_reg);
 	int i;
 
@@ -3445,17 +3448,33 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
 		pal_reg = (intel_crtc->pipe == 0) ? LGC_PALETTE_A :
 						    LGC_PALETTE_B;
 
-	/* Switch to 8-bit gamma mode */
-	pipeconf &= ~PIPEACONF_GAMMA;
+	/* Switch to 10-bit gamma mode */
+	pipeconf |= PIPEACONF_GAMMA;
 	I915_WRITE(pipeconf_reg, pipeconf);
 	I915_READ(pipeconf_reg);
 
-	for (i = 0; i < 256; i++) {
-		I915_WRITE(pal_reg + 4 * i,
-			   ((intel_crtc->lut_r[i] >> 8) << 16) |
-			   ((intel_crtc->lut_g[i] >> 8) << 8) |
-			   (intel_crtc->lut_b[i] >> 8));
+	/* Use every other value from the LUT passed,
+	 * 10-bit mode uses 128 entries. */
+	for (i = 0; i < 128; i++) {
+		I915_WRITE(pal_reg + 8 * i,
+			   ((intel_crtc->lut_r[2 * i] & 0xFF) << 16) |
+			   ((intel_crtc->lut_g[2 * i] & 0xFF) << 8) |
+			   (intel_crtc->lut_b[2 * i] & 0xFF));
+		I915_WRITE(pal_reg + 8 * i + 4,
+			   ((intel_crtc->lut_r[2 * i] >> 8) << 16) |
+			   ((intel_crtc->lut_g[2 * i] >> 8) << 8) |
+			   (intel_crtc->lut_b[2 * i] >> 8));
 	}
+
+	/* FIXME: Distortion here, we're trying to get 129 evenly spaced
+	 * samples from a LUT with 256 entries. We use 0, 2, 4 ... 254,
+	 * for the main palette, then entry 255 for this last register.
+	 */
+	/* Note that these registers _could_ take the LUT value of
+	 * 1024, but we're maxing out at 1023.984375 as it is easier. */
+	I915_WRITE(maxr_reg, intel_crtc->lut_r[255]);
+	I915_WRITE(maxg_reg, intel_crtc->lut_g[255]);
+	I915_WRITE(maxb_reg, intel_crtc->lut_b[255]);
 }
 
 static int intel_crtc_cursor_set(struct drm_crtc *crtc,
-- 
1.7.0.4

  parent reply	other threads:[~2010-04-26 22:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-24 16:25 8-bit vs. 10-bit palette mode, and LVDS dithering Peter Clifton
2010-04-26 14:29 ` Adam Jackson
2010-04-26 21:19   ` [PATCH] drm/intel: Set 8-bit gamma mode for the palette Peter Clifton
2010-04-27 13:53     ` Adam Jackson
2010-04-26 22:22   ` 8-bit vs. 10-bit palette mode, and LVDS dithering Peter Clifton
2010-04-26 22:24     ` [PATCH 1/3] drm/intel: Store full 16 bits of colors passed to gamma LUT Peter Clifton
2010-04-26 22:24     ` Peter Clifton [this message]
2010-04-27  1:09       ` [PATCH 2/3] drm/intel: Attempt to use 10-bit gamma palette mode Andrew Lutomirski
2010-04-27  6:44         ` Peter Clifton
2010-04-26 22:24     ` [PATCH 3/3] drm/intel: Use 10-bit palette properly, only store 129 entries Peter Clifton
2010-04-27 14:06       ` Adam Jackson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1272320658-2157-2-git-send-email-pcjc2@cam.ac.uk \
    --to=pcjc2@cam.ac.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.