diff mbox

[2/6] drm/i915: Color Manager: Add CSC color correction

Message ID 1392899847-2641-3-git-send-email-shashank.sharma@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sharma, Shashank Feb. 20, 2014, 12:37 p.m. UTC
This patch is first extension to color manager framework.
It adds implementataion of color manager property CSC
correction (wide gamute) in intel color manager framework.

Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
---
 drivers/gpu/drm/i915/intel_clrmgr.c |  117 +++++++++++++++++++++++++++++++++--
 1 file changed, 112 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_clrmgr.c b/drivers/gpu/drm/i915/intel_clrmgr.c
index 2c826f3..363e3e6 100644
--- a/drivers/gpu/drm/i915/intel_clrmgr.c
+++ b/drivers/gpu/drm/i915/intel_clrmgr.c
@@ -146,11 +146,6 @@  static bool intel_clrmgr_disable_gamma(struct drm_device *dev, int identifier)
 {
 	return true;
 }
-
-static void intel_clrmgr_disable_csc(struct drm_device *dev, int identifier)
-{
-}
-
 static bool intel_clrmgr_enable_hs(struct drm_device *dev, int identifier)
 {
 	return true;
@@ -165,8 +160,120 @@  static bool intel_clrmgr_enable_gamma(struct drm_device *dev, int identifier)
 	return true;
 }
 
+/*
+* intel_disable_csc
+* Disable color space conversion on PIPE
+* idenifier is pipe identifier
+*/
+void
+intel_disable_csc(struct drm_device *dev, int identifier)
+{
+	u32 pipeconf = 0;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
+	if (_validate_pipe(identifier))
+		return;
+
+	/* Disable CSC on PIPE */
+	pipeconf = I915_READ(PIPECONF(identifier));
+	pipeconf &= ~(PIPECONF_CSC_ENABLE);
+	I915_WRITE(PIPECONF(identifier), pipeconf);
+	POSTING_READ(PIPECONF(identifier));
+
+	DRM_DEBUG_DRIVER("CSC disabled on PIPE %c\n",
+		identifier == pipe_a ? 'A' : 'B');
+
+	return;
+}
+
+/*
+* intel_clrmgr_disable_csc
+* Disable property CSC
+* identifier = pipe identifier
+*/
+static void intel_clrmgr_disable_csc(struct drm_device *dev, int identifier)
+{
+	drm_i915_private_t *dev_priv = dev->dev_private;
+	struct clrmgr_pipe_status *pstatus = dev_priv->clrmgr_status.pstatus;
+
+	if (!pstatus) {
+		DRM_ERROR("Clrmgr: color manager not initialized");
+		return;
+	}
+
+	intel_disable_csc(dev, identifier);
+	pstatus->csc_enabled = false;
+	DRM_DEBUG_DRIVER("Clrmgr: CSC disabled\n");
+}
+
+/*
+* intel_enable_csc
+* Enable color space conversion on PIPE
+* data is correction values to be written
+* identifier is pipe identifier
+*/
+int
+intel_enable_csc(struct drm_device *dev, u32 *data, int identifier)
+{
+	int count = 0;
+	int pipe = 0;
+	u32 csc_reg = 0;
+	u32 pipeconf = 0;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
+	if (!data) {
+		DRM_ERROR("NULL input to enable CSC");
+		return -EINVAL;
+	}
+
+	if (identifier != pipe_a) {
+		DRM_ERROR("CSC is supported on PIPEA only for now");
+		return -EINVAL;
+	}
+
+	pipeconf = I915_READ(PIPECONF(identifier));
+	pipeconf |= PIPECONF_CSC_ENABLE;
+	csc_reg = PIPECSC(identifier);
+
+	/* Enable csc correction */
+	I915_WRITE(PIPECONF(identifier), pipeconf);
+	POSTING_READ(PIPECONF(identifier));
+
+	/* Write csc coeff to csc regs */
+	while (count < CSC_MAX_COEFF_COUNT) {
+		I915_WRITE(csc_reg + (4 * count), ((u32 *)data)[count]);
+		count++;
+	}
+
+	DRM_DEBUG_DRIVER("CSC enabled on PIPE %c\n",
+		pipe == pipe_a ? 'A' : 'B');
+
+	return 0;
+}
+
+/*
+* intel_clrmgr_enable_csc
+* Enable property CSC
+* identifier = pipe identifier
+*/
 static bool intel_clrmgr_enable_csc(struct drm_device *dev, int identifier)
 {
+	drm_i915_private_t *dev_priv = dev->dev_private;
+	struct clrmgr_pipe_status *pstatus = dev_priv->clrmgr_status.pstatus;
+
+	if (!pstatus) {
+		DRM_ERROR("Clrmgr: color manager not initialized");
+		return false;
+	}
+
+	if (intel_enable_csc(dev, clrmgr_luts[clrmgr_csc],
+			identifier)) {
+		DRM_ERROR("Clrmgr: Enable CSC failed");
+		return false;
+	}
+
+	pstatus->csc_enabled = true;
+	DRM_DEBUG_DRIVER("Clrmgr: CSC Enabled");
 	return true;
 }