[Intel-gfx] [PATCH 2/2] set hdtv broadcast mode for HDMI output

Ma Ling ling.ma at intel.com
Mon Mar 16 03:34:21 CET 2009


enabling hdtv broadcast color mode by creating hdmi output property.

Signed-off-by: Ma Ling <ling.ma at intel.com>
---
 src/i830_hdmi.c |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/src/i830_hdmi.c b/src/i830_hdmi.c
index 05aa9ac..5edb3df 100644
--- a/src/i830_hdmi.c
+++ b/src/i830_hdmi.c
@@ -33,6 +33,7 @@
 #include "i830.h"
 #include "xf86Modes.h"
 #include "i830_display.h"
+#include "X11/Xatom.h"
 
 struct i830_hdmi_priv {
     uint32_t output_reg;
@@ -40,6 +41,7 @@ struct i830_hdmi_priv {
     uint32_t save_SDVO;
 
     Bool has_hdmi_sink;
+    Atom broadcast_atom;
 };
 
 static int
@@ -214,7 +216,113 @@ i830_hdmi_destroy (xf86OutputPtr output)
     }
 }
 
+static void
+i830_hdmi_create_resources(xf86OutputPtr output)
+{
+    ScrnInfoPtr             pScrn = output->scrn;
+    I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct i830_hdmi_priv   *dev_priv = intel_output->dev_priv;
+    int32_t                 broadcast_range[2];
+    uint32_t                data;
+    int                     err;
+
+    dev_priv->broadcast_atom =
+        MakeAtom("BROADCAST_RGB", sizeof("BROADCAST_RGB")-1, TRUE);
+
+    broadcast_range[0] = 0;
+    broadcast_range[1] = 1;
+    err = RRConfigureOutputProperty(output->randr_output,
+                                    dev_priv->broadcast_atom,
+                                    FALSE, TRUE, FALSE, 2, broadcast_range);
+    if (err != 0) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                   "RRConfigureOutputProperty error, %d\n", err);
+    }
+    /* Set the current value of the broadcast property */
+    data = 0;
+    err = RRChangeOutputProperty(output->randr_output,
+                                 dev_priv->broadcast_atom,
+                                 XA_INTEGER, 32, PropModeReplace, 1, &data,
+                                 FALSE, TRUE);
+    if (err != 0) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                   "RRChangeOutputProperty error, %d\n", err);
+    }
+}
+
+static Bool
+i830_hdmi_get_property(xf86OutputPtr output, Atom property)
+{
+    ScrnInfoPtr             pScrn = output->scrn;
+    I830Ptr                 pI830 = I830PTR(pScrn);
+    I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct i830_hdmi_priv   *dev_priv = intel_output->dev_priv;
+    int                     ret;
+
+    if (property == dev_priv->broadcast_atom) {
+        uint32_t val = 0;
+
+        if ((INREG(dev_priv->output_reg) & SDVO_COLOR_RANGE))
+            val = 1;
+
+        ret = RRChangeOutputProperty(output->randr_output,
+                                     dev_priv->broadcast_atom,
+                                     XA_INTEGER, 32, PropModeReplace, 1, &val,
+                                     FALSE, TRUE);
+        if (ret != Success)
+            return FALSE;
+    }
+    return TRUE;
+}
+
+static Bool
+i830_hdmi_set_property(xf86OutputPtr output, Atom property,
+                       RRPropertyValuePtr value)
+{
+    ScrnInfoPtr             pScrn = output->scrn;
+    I830Ptr                 pI830 = I830PTR(pScrn);
+    I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct i830_hdmi_priv   *dev_priv = intel_output->dev_priv;
+
+    if (property ==  dev_priv->broadcast_atom) {
+        uint32_t val;
+
+        if (value->type != XA_INTEGER || value->format != 32 ||
+            value->size != 1)
+        {
+            return FALSE;
+        }
+
+        val = *(INT32 *)value->data;
+        if (val < 0 || val > 1)
+        {
+            return FALSE;
+        }
+
+        /* only R G B are 8bit color mode */
+        if (pScrn->depth != 24 ||
+            /* only DevCL and DevCTG */
+            !(IS_I965G(pI830) || IS_G4X(pI830)) ||
+            /* only TMDS encoding */
+            !strstr(output->name, "HDMI")) {
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                       "Failed to Set Broadcast Color \n");
+            return FALSE;
+        }
+
+        if (val == 1)
+            OUTREG(dev_priv->output_reg,
+                   INREG(dev_priv->output_reg) | SDVO_COLOR_RANGE);
+        else if (val == 0)
+            OUTREG(dev_priv->output_reg,
+                   INREG(dev_priv->output_reg) & ~SDVO_COLOR_RANGE);
+    }
+
+    return TRUE;
+}
+
 static const xf86OutputFuncsRec i830_hdmi_output_funcs = {
+    .create_resources = i830_hdmi_create_resources,
     .dpms = i830_hdmi_dpms,
     .save = i830_hdmi_save,
     .restore = i830_hdmi_restore,
@@ -225,6 +333,8 @@ static const xf86OutputFuncsRec i830_hdmi_output_funcs = {
     .commit = i830_output_commit,
     .detect = i830_hdmi_detect,
     .get_modes = i830_ddc_get_modes,
+    .set_property = i830_hdmi_set_property,
+    .get_property = i830_hdmi_get_property,
     .destroy = i830_hdmi_destroy
 };
 
-- 
1.5.4.4






More information about the Intel-gfx mailing list