summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Deucher <alex@botch2.(none)>2007-09-22 10:41:55 -0400
committerAlex Deucher <alex@botch2.(none)>2007-09-22 10:41:55 -0400
commitd2ce4a5003ce1291ea2327b2c00a0b24408fe26c (patch)
tree4d81478f6782c6b55f22efa4515dcaf590308192 /src
parentf95b9ab729376083bf0d12987ee260ec2aba721e (diff)
RADEON: RMX updates
- add option to turn off RMX - turn off RMX by default on DVI - add infrastructure to support more RMX modes
Diffstat (limited to 'src')
-rw-r--r--src/radeon_output.c64
-rw-r--r--src/radeon_probe.h9
2 files changed, 45 insertions, 28 deletions
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 8b7ae08..d2e2363 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -648,13 +648,17 @@ radeon_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
return MODE_CLOCK_RANGE;
}
- if (radeon_output->type != OUTPUT_LVDS)
- return MODE_OK;
-
- if (pMode->HDisplay > radeon_output->PanelXRes ||
- pMode->VDisplay > radeon_output->PanelYRes)
- return MODE_PANEL;
-
+ if (radeon_output->type == OUTPUT_LVDS) {
+ if (radeon_output->rmx_type == RMX_OFF) {
+ if (pMode->HDisplay != radeon_output->PanelXRes ||
+ pMode->VDisplay != radeon_output->PanelYRes)
+ return MODE_PANEL;
+ }
+ if (pMode->HDisplay > radeon_output->PanelXRes ||
+ pMode->VDisplay > radeon_output->PanelYRes)
+ return MODE_PANEL;
+ }
+
return MODE_OK;
}
@@ -664,7 +668,8 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
{
RADEONOutputPrivatePtr radeon_output = output->driver_private;
- if (radeon_output->MonType == MT_LCD || radeon_output->MonType == MT_DFP) {
+ if ((radeon_output->MonType == MT_LCD || radeon_output->MonType == MT_DFP)
+ && radeon_output->rmx_type != RMX_OFF) {
xf86CrtcPtr crtc = output->crtc;
RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
@@ -1675,7 +1680,7 @@ radeon_create_resources(xf86OutputPtr output)
}
- /* RMX control - fullscreen, centered, keep ratio */
+ /* RMX control - fullscreen, centered, keep ratio, off */
/* actually more of a crtc property as only crtc1 has rmx */
if (radeon_output->type == OUTPUT_LVDS ||
radeon_output->type == OUTPUT_DVI) {
@@ -1688,7 +1693,10 @@ radeon_create_resources(xf86OutputPtr output)
"RRConfigureOutputProperty error, %d\n", err);
}
/* Set the current value of the property */
- s = "full";
+ if (radeon_output->type == OUTPUT_LVDS)
+ s = "full";
+ else
+ s = "off";
err = RRChangeOutputProperty(output->randr_output, rmx_atom,
XA_STRING, 8, PropModeReplace, strlen(s), (pointer)s,
FALSE, FALSE);
@@ -1869,24 +1877,24 @@ radeon_set_property(xf86OutputPtr output, Atom property,
radeon_output->load_detection = val;
} else if (property == rmx_atom) {
- xf86CrtcPtr crtc = output->crtc;
- RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
- if (radeon_crtc->crtc_id == 0) {
- const char *s;
- if (value->type != XA_STRING || value->format != 8)
- return FALSE;
- s = (char*)value->data;
- if (value->size == strlen("full") && !strncmp("full", s, strlen("full"))) {
- return TRUE;
- } else if (value->size == strlen("aspect") && !strncmp("aspect", s, strlen("aspect"))) {
- return TRUE;
- } else if (value->size == strlen("center") && !strncmp("center", s, strlen("center"))) {
- return TRUE;
- }
- return FALSE;
- } else {
- return FALSE;
- }
+ const char *s;
+ if (value->type != XA_STRING || value->format != 8)
+ return FALSE;
+ s = (char*)value->data;
+ if (value->size == strlen("full") && !strncmp("full", s, strlen("full"))) {
+ radeon_output->rmx_type = RMX_FULL;
+ return TRUE;
+ } else if (value->size == strlen("aspect") && !strncmp("aspect", s, strlen("aspect"))) {
+ radeon_output->rmx_type = RMX_ASPECT;
+ return TRUE;
+ } else if (value->size == strlen("center") && !strncmp("center", s, strlen("center"))) {
+ radeon_output->rmx_type = RMX_CENTER;
+ return TRUE;
+ } else if (value->size == strlen("off") && !strncmp("off", s, strlen("off"))) {
+ radeon_output->rmx_type = RMX_OFF;
+ return TRUE;
+ }
+ return FALSE;
} else if (property == tmds_pll_atom) {
const char *s;
if (value->type != XA_STRING || value->format != 8)
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index bc6f0b9..ec895e4 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -122,6 +122,14 @@ typedef enum
DVI_ANALOG
} RADEONDviType;
+typedef enum
+{
+ RMX_OFF,
+ RMX_FULL,
+ RMX_CENTER,
+ RMX_ASPECT
+} RADEONRMXType;
+
typedef struct {
CARD32 freq;
CARD32 value;
@@ -196,6 +204,7 @@ typedef struct _RADEONOutputPrivateRec {
int PanelPwrDly;
int DotClock;
RADEONTMDSPll tmds_pll[4];
+ RADEONRMXType rmx_type;
/* TV out */
TVStd default_tvStd;
TVStd tvStd;