[Intel-gfx] [PATCH 1/2] set hdtv broadcast mode for HDMI and TMDS output
Ma Ling
ling.ma at intel.com
Mon Mar 16 03:34:14 CET 2009
enabling hdtv broadcast color mode by creating sdvo-hdmi/tmds output property.
Signed-off-by: Ma Ling <ling.ma at intel.com>
---
src/i810_reg.h | 1 +
src/i830_sdvo.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/src/i810_reg.h b/src/i810_reg.h
index bc462fa..6ff1858 100644
--- a/src/i810_reg.h
+++ b/src/i810_reg.h
@@ -1300,6 +1300,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define SDVO_ENCODING_HDMI (0x2 << 10)
/** Requird for HDMI operation */
#define SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9)
+#define SDVO_COLOR_RANGE (1 << 8)
#define SDVO_BORDER_ENABLE (1 << 7)
#define SDVO_AUDIO_ENABLE (1 << 6)
/** New with 965, default is to be set */
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index 254b866..bf1b085 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -49,6 +49,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "i830_display.h"
#include "i810_reg.h"
#include "i830_sdvo_regs.h"
+#include "X11/Xatom.h"
/** SDVO driver private structure. */
struct i830_sdvo_priv {
@@ -118,6 +119,7 @@ struct i830_sdvo_priv {
struct i830_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
struct i830_sdvo_dtd save_output_dtd[16];
uint32_t save_SDVOX;
+ Atom broadcast_atom;
/** @} */
};
@@ -1919,7 +1921,112 @@ i830_sdvo_get_crtc(xf86OutputPtr output)
}
#endif
+static void
+i830_sdvo_create_resources(xf86OutputPtr output)
+{
+ ScrnInfoPtr pScrn = output->scrn;
+ I830OutputPrivatePtr intel_output = output->driver_private;
+ struct i830_sdvo_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_sdvo_get_property(xf86OutputPtr output, Atom property)
+{
+ ScrnInfoPtr pScrn = output->scrn;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830OutputPrivatePtr intel_output = output->driver_private;
+ struct i830_sdvo_priv *dev_priv = intel_output->dev_priv;
+ int ret;
+
+ if (property == dev_priv->broadcast_atom) {
+ uint32_t val = 0;
+
+ if ((INREG(dev_priv->output_device) & 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_sdvo_set_property(xf86OutputPtr output, Atom property,
+ RRPropertyValuePtr value)
+{
+ ScrnInfoPtr pScrn = output->scrn;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830OutputPrivatePtr intel_output = output->driver_private;
+ struct i830_sdvo_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, "TMDS") && !strstr(output->name, "HDMI")) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to Set Broadcast Color \n");
+ return FALSE;
+ }
+
+ if (val == 1)
+ OUTREG(dev_priv->output_device,
+ INREG(dev_priv->output_device) | SDVO_COLOR_RANGE);
+ else if (val == 0)
+ OUTREG(dev_priv->output_device,
+ INREG(dev_priv->output_device) & ~SDVO_COLOR_RANGE);
+ }
+ return TRUE;
+}
+
static const xf86OutputFuncsRec i830_sdvo_output_funcs = {
+ .create_resources = i830_sdvo_create_resources,
.dpms = i830_sdvo_dpms,
.save = i830_sdvo_save,
.restore = i830_sdvo_restore,
@@ -1930,6 +2037,8 @@ static const xf86OutputFuncsRec i830_sdvo_output_funcs = {
.commit = i830_output_commit,
.detect = i830_sdvo_detect,
.get_modes = i830_sdvo_get_modes,
+ .set_property = i830_sdvo_set_property,
+ .get_property = i830_sdvo_get_property,
.destroy = i830_sdvo_destroy,
#ifdef RANDR_GET_CRTC_INTERFACE
.get_crtc = i830_sdvo_get_crtc,
--
1.5.4.4
More information about the Intel-gfx
mailing list