[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