summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2010-02-17 12:22:48 -0500
committerAlex Deucher <alexdeucher@gmail.com>2010-02-17 12:34:53 -0500
commit579cdcf9b4e38c791a497b747a055fc0a07d8dd6 (patch)
treeecb395794693564fcc77a9d77c2ab62777241f84
parent47136fa347d1756523239746b4c74cd5278a1118 (diff)
radeon: add ZaphodHeads option
Allows users that want to use zaphod mode to select which xrandr outputs are assigned to which head. E.g., Option "ZaphodHeads" "LVDS,VGA-0" will assign LVDS to the first zaphod driver instance and VGA-0 to the second instance.
-rw-r--r--man/radeon.man10
-rw-r--r--src/drmmode_display.c9
-rw-r--r--src/radeon.h6
-rw-r--r--src/radeon_driver.c63
-rw-r--r--src/radeon_kms.c10
5 files changed, 87 insertions, 11 deletions
diff --git a/man/radeon.man b/man/radeon.man
index 0ea866fe..ca8ce60d 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -614,6 +614,16 @@ to determine whether to allow EXA to use VRAM for non-essential pixmaps.
This option allows us to override the heurisitc.
The default is
.B on with > 32MB VRAM, off with < 32MB.
+.TP
+.BI "Option \*qZaphodHeads\*q \*q" string \*q
+Specify the randr outputs to use with zaphod mode. If you do not specify
+an outputs, the driver will pick them automatically.
+.br
+For example:
+.B
+Option \*qZaphodHeads\*q \*qLVDS,VGA-0\*q
+will assign xrandr output LVDS to the first instance of the driver and
+VGA-0 to the second instance.
.SH TEXTURED VIDEO ATTRIBUTES
The driver supports the following X11 Xv attributes for Textured Video.
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index b7a62189..bb29c251 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -854,6 +854,7 @@ const char *output_names[] = { "None",
static void
drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
xf86OutputPtr output;
drmModeConnectorPtr koutput;
drmModeEncoderPtr *kencoders = NULL;
@@ -861,6 +862,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
drmModePropertyPtr props;
char name[32];
int i;
+ const char *s;
koutput = drmModeGetConnector(drmmode->fd, drmmode->mode_res->connectors[num]);
if (!koutput)
@@ -870,7 +872,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
if (!kencoders) {
goto out_free_encoders;
}
-
+
for (i = 0; i < koutput->count_encoders; i++) {
kencoders[i] = drmModeGetEncoder(drmmode->fd, koutput->encoders[i]);
if (!kencoders[i]) {
@@ -897,6 +899,11 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1);
}
+ if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS))) {
+ if (!RADEONZaphodStringMatches(pScrn, info->IsPrimary, s, name))
+ goto out_free_encoders;
+ }
+
output = xf86OutputCreate (pScrn, &drmmode_output_funcs, name);
if (!output) {
goto out_free_encoders;
diff --git a/src/radeon.h b/src/radeon.h
index f9c78ab2..36b2d8be 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -223,7 +223,8 @@ typedef enum {
OPTION_R4XX_ATOM,
OPTION_FORCE_LOW_POWER,
OPTION_DYNAMIC_PM,
- OPTION_NEW_PLL
+ OPTION_NEW_PLL,
+ OPTION_ZAPHOD_HEADS
} RADEONOpts;
@@ -1236,6 +1237,9 @@ extern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save,
RADEONInfoPtr info);
extern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn,
RADEONSavePtr restore);
+extern Bool
+RADEONZaphodStringMatches(ScrnInfoPtr pScrn, Bool is_primary,
+ const char *s, char *output_name);
Bool RADEONGetRec(ScrnInfoPtr pScrn);
void RADEONFreeRec(ScrnInfoPtr pScrn);
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index c4d2ef5c..c97be4f9 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -206,6 +206,7 @@ static const OptionInfoRec RADEONOptions[] = {
{ OPTION_FORCE_LOW_POWER, "ForceLowPowerMode", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_DYNAMIC_PM, "DynamicPM", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_NEW_PLL, "NewPLL", OPTV_BOOLEAN, {0}, FALSE },
+ { OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE },
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -2786,19 +2787,69 @@ RADEONPreInitBIOS(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10)
return TRUE;
}
+Bool
+RADEONZaphodStringMatches(ScrnInfoPtr pScrn, Bool is_primary,
+ const char *s, char *output_name)
+{
+ int i = 0, second = 0;
+ char s1[20], s2[20];
+
+ do {
+ switch(*s) {
+ case ',':
+ s1[i] = '\0';
+ i = 0;
+ second = 1;
+ break;
+ case ' ':
+ case '\t':
+ case '\n':
+ case '\r':
+ break;
+ default:
+ if (second)
+ s2[i] = *s;
+ else
+ s1[i] = *s;
+ i++;
+ break;
+ }
+ } while(*s++);
+ s2[i] = '\0';
+
+ if (is_primary) {
+ if (strcmp(s1, output_name) == 0)
+ return TRUE;
+ } else {
+ if (strcmp(s2, output_name) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void RADEONFixZaphodOutputs(ScrnInfoPtr pScrn)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int o;
+ char *s;
- if (info->IsPrimary) {
- xf86OutputDestroy(config->output[0]);
- while(config->num_output > 1) {
- xf86OutputDestroy(config->output[1]);
+ if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS))) {
+ for (o = 0; o < config->num_output; o++) {
+ if (!RADEONZaphodStringMatches(pScrn, info->IsPrimary, s, config->output[o]->name))
+ xf86OutputDestroy(config->output[o]);
}
} else {
- while(config->num_output > 1) {
- xf86OutputDestroy(config->output[1]);
+ if (info->IsPrimary) {
+ xf86OutputDestroy(config->output[0]);
+ while(config->num_output > 1) {
+ xf86OutputDestroy(config->output[1]);
+ }
+ } else {
+ while(config->num_output > 1) {
+ xf86OutputDestroy(config->output[1]);
+ }
}
}
}
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index e9e5b5d6..00cea421 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -66,9 +66,10 @@ const OptionInfoRec RADEONOptions_KMS[] = {
{ OPTION_SUBPIXEL_ORDER, "SubPixelOrder", OPTV_ANYSTR, {0}, FALSE },
{ OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE },
{ OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_TVSTD, "TVStandard", OPTV_STRING, {0}, FALSE },
- { OPTION_EXA_VSYNC, "EXAVSync", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_EXA_PIXMAPS, "EXAPixmaps", OPTV_BOOLEAN, {0}, FALSE },
+ { OPTION_TVSTD, "TVStandard", OPTV_STRING, {0}, FALSE },
+ { OPTION_EXA_VSYNC, "EXAVSync", OPTV_BOOLEAN, {0}, FALSE },
+ { OPTION_EXA_PIXMAPS, "EXAPixmaps", OPTV_BOOLEAN, {0}, FALSE },
+ { OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE },
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -369,6 +370,7 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
int zaphod_mask = 0;
char *bus_id;
Gamma zeros = { 0.0, 0.0, 0.0 };
+ const char *s;
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
"RADEONPreInit_KMS\n");
@@ -430,6 +432,8 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
zaphod_mask = 0xd;
if (info->IsSecondary)
zaphod_mask = 0x2;
+ if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS)))
+ zaphod_mask = 0xf;
info->allowColorTiling = xf86ReturnOptValBool(info->Options,
OPTION_COLOR_TILING, FALSE);