[Intel-gfx] [PATCH 1/2] set broadcast RGB mode for HDMI and TMDS from SDVOX output
Ma Ling
ling.ma at intel.com
Wed Mar 25 08:06:33 CET 2009
construct "creat" and "set" function for broadcast rgb property for sdvo output.
Signed-off-by: Ma Ling <ling.ma at intel.com>
---
src/i810_reg.h | 1 +
src/i830_sdvo.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 0 deletions(-)
diff --git a/src/i810_reg.h b/src/i810_reg.h
index bc462fa..6715cae 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_NOT_FULL_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..70f98c9 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 {
@@ -121,6 +122,8 @@ struct i830_sdvo_priv {
/** @} */
};
+static Atom broadcast_atom;
+
/**
* Writes the SDVOB or SDVOC with the given value, but always writes both
* SDVOB and SDVOC to work around apparent hardware issues (according to
@@ -1919,7 +1922,83 @@ i830_sdvo_get_crtc(xf86OutputPtr output)
}
#endif
+static void
+i830_sdvo_create_resources(xf86OutputPtr output)
+{
+ ScrnInfoPtr pScrn = output->scrn;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int32_t broadcast_range[2];
+ uint32_t data;
+ int err;
+
+ /* only R G B are 8bit color mode */
+ if (pScrn->depth != 24 ||
+ /* only 965G and G4X platform */
+ !(IS_I965G(pI830) || IS_G4X(pI830)) ||
+ /* only TMDS encoding */
+ !(strstr(output->name, "TMDS") || strstr(output->name, "HDMI")))
+ return;
+
+ broadcast_atom =
+ MakeAtom("BROADCAST_RGB", sizeof("BROADCAST_RGB") - 1, TRUE);
+
+ broadcast_range[0] = 0;
+ broadcast_range[1] = 1;
+ err = RRConfigureOutputProperty(output->randr_output,
+ 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,
+ 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_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 == 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;
+ }
+
+ if (val == 1)
+ OUTREG(dev_priv->output_device,
+ INREG(dev_priv->output_device) | SDVO_COLOR_NOT_FULL_RANGE);
+ else if (val == 0)
+ OUTREG(dev_priv->output_device,
+ INREG(dev_priv->output_device) & ~SDVO_COLOR_NOT_FULL_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 +2009,7 @@ 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,
.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