Common subdirectories: orig/xserver-xorg-video-ati-6.9.0/src/AtomBios and xserver-xorg-video-ati-6.9.0/src/AtomBios
diff -u orig/xserver-xorg-video-ati-6.9.0/src/Makefile.am xserver-xorg-video-ati-6.9.0/src/Makefile.am
--- orig/xserver-xorg-video-ati-6.9.0/src/Makefile.am	2008-03-06 13:28:35.000000000 -0500
+++ xserver-xorg-video-ati-6.9.0/src/Makefile.am	2010-02-21 13:10:03.000000000 -0500
@@ -153,3 +153,12 @@
 	pcidb/ati_pciids.csv \
 	pcidb/parse_pci_ids.pl \
 	radeon_atombios.h
+
+pcidatadir = $(datadir)/xserver-xorg/pci
+pcidata_DATA = radeon.ids
+
+radeon.ids: ati_pciids_gen.h
+	cat ${srcdir}/ati_pciids_gen.h \
+		| grep -v PCI_CHIP_MACH32 | grep -v PCI_CHIP_MACH64 | grep -v PCI_CHIP_RAGE128 \
+		| awk '/^#define.*PCI_CHIP/ {print $$3}' \
+		| sed -e 's/0x/1002/' > radeon.ids
Common subdirectories: orig/xserver-xorg-video-ati-6.9.0/src/modes and xserver-xorg-video-ati-6.9.0/src/modes
Common subdirectories: orig/xserver-xorg-video-ati-6.9.0/src/parser and xserver-xorg-video-ati-6.9.0/src/parser
Common subdirectories: orig/xserver-xorg-video-ati-6.9.0/src/pcidb and xserver-xorg-video-ati-6.9.0/src/pcidb
diff -u orig/xserver-xorg-video-ati-6.9.0/src/radeon.h xserver-xorg-video-ati-6.9.0/src/radeon.h
--- orig/xserver-xorg-video-ati-6.9.0/src/radeon.h	2010-02-21 13:46:53.000000000 -0500
+++ xserver-xorg-video-ati-6.9.0/src/radeon.h	2010-02-21 13:41:06.000000000 -0500
@@ -204,7 +204,8 @@
     OPTION_TVSTD,
     OPTION_IGNORE_LID_STATUS,
     OPTION_DEFAULT_TVDAC_ADJ,
-    OPTION_INT10
+    OPTION_INT10,
+    OPTION_ZAPHOD_HEADS
 } RADEONOpts;
 
 
@@ -969,6 +970,9 @@
 				      RADEONInfoPtr info);
 extern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn,
 					 RADEONSavePtr restore);
+extern Bool
+RADEONZaphodStringMatches(ScrnInfoPtr pScrn, Bool is_primary,
+                          const char *s, char *output_name);
 
 #ifdef USE_EXA
 /* radeon_exa.c */
diff -u orig/xserver-xorg-video-ati-6.9.0/src/radeon_driver.c xserver-xorg-video-ati-6.9.0/src/radeon_driver.c
--- orig/xserver-xorg-video-ati-6.9.0/src/radeon_driver.c	2010-02-21 13:46:53.000000000 -0500
+++ xserver-xorg-video-ati-6.9.0/src/radeon_driver.c	2010-02-21 13:45:42.000000000 -0500
@@ -192,6 +192,7 @@
     { OPTION_IGNORE_LID_STATUS, "IgnoreLidStatus", OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_DEFAULT_TVDAC_ADJ, "DefaultTVDACAdj", OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_INT10,             "Int10",           OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_ZAPHOD_HEADS,      "ZaphodHeads",     OPTV_STRING,  {0}, FALSE },
     { -1,                    NULL,               OPTV_NONE,    {0}, FALSE }
 };
 
@@ -2561,16 +2562,30 @@
 {
     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)) {
+          fprintf(stderr, "Bar: 1\n");
+          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) {
+          fprintf(stderr, "Bar: 2\n");
+          xf86OutputDestroy(config->output[1]);
+        }
+      } else {
+        while(config->num_output > 1) {
+          fprintf(stderr, "Bar: 3\n");
+          xf86OutputDestroy(config->output[1]);
+        }
+      }
     }
 }
 
@@ -5988,3 +6003,48 @@
 	    break;
     }
 }
+
+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) {
+        fprintf(stderr, "FOO: 1\n");
+        return TRUE;
+      }
+    } else {
+      if (strcmp(s2, output_name) == 0) {
+        fprintf(stderr, "FOO: 2\n");
+        return TRUE;
+      }
+    }
+
+    return FALSE;
+}
