[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-ati: Changes to 'upstream-experimental'



 configure.ac                        |   30 +++++--
 man/radeon.man                      |   28 ++++--
 src/ati_pciids_gen.h                |   51 ++++++++++++
 src/drmmode_display.c               |   33 ++++----
 src/evergreen_accel.c               |    2 
 src/evergreen_exa.c                 |   20 +++-
 src/evergreen_textured_videofuncs.c |   15 ++-
 src/pcidb/ati_pciids.csv            |   51 ++++++++++++
 src/r600_exa.c                      |    5 -
 src/radeon.h                        |   23 +++--
 src/radeon_bo_helper.c              |    2 
 src/radeon_chipinfo_gen.h           |   51 ++++++++++++
 src/radeon_chipset_gen.h            |   51 ++++++++++++
 src/radeon_dri2.c                   |   41 +++++-----
 src/radeon_drm.h                    |    2 
 src/radeon_exa_funcs.c              |    5 -
 src/radeon_glamor.c                 |   42 ++++++++--
 src/radeon_glamor.h                 |    4 
 src/radeon_kms.c                    |  147 +++++++++++++++++++++++++-----------
 src/radeon_pci_chipset_gen.h        |   51 ++++++++++++
 src/radeon_pci_device_match_gen.h   |   51 ++++++++++++
 src/radeon_probe.c                  |   15 +++
 src/radeon_probe.h                  |   11 ++
 src/radeon_video.c                  |    9 +-
 24 files changed, 607 insertions(+), 133 deletions(-)

New commits:
commit cc615d06db0332fc6e673b55632bcc7bf957b44b
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Wed Jun 4 16:58:53 2014 +0900

    Rename Option "NoAccel" to "Accel"
    
    Removes the need for a double negation when forcing acceleration on.
    
    Note that this change is backwards compatible, as the option parser
    automagically handles the 'No' prefix.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/man/radeon.man b/man/radeon.man
index 65b880c..802f6c2 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -225,12 +225,12 @@ are supported:
 Selects software cursor.  The default is
 .B off.
 .TP
-.BI "Option \*qNoAccel\*q \*q" boolean \*q
+.BI "Option \*qAccel\*q \*q" boolean \*q
 Enables or disables all hardware acceleration.
 .br
-The default is to
-.B enable
-hardware acceleration.
+The default is
+.B on
+except for HAWAII.
 .TP
 .BI "Option \*qZaphodHeads\*q \*q" string \*q
 Specify the RandR output(s) to use with zaphod mode for a particular driver
diff --git a/src/radeon.h b/src/radeon.h
index 136a430..eac6ed5 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -135,7 +135,7 @@
 #endif
 
 typedef enum {
-    OPTION_NOACCEL,
+    OPTION_ACCEL,
     OPTION_SW_CURSOR,
     OPTION_PAGE_FLIP,
     OPTION_EXA_PIXMAPS,
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index ceaf575..707d0c7 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -59,7 +59,7 @@ extern SymTabRec RADEONChipsets[];
 static Bool radeon_setup_kernel_mem(ScreenPtr pScreen);
 
 const OptionInfoRec RADEONOptions_KMS[] = {
-    { OPTION_NOACCEL,        "NoAccel",          OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_ACCEL,          "Accel",            OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_SW_CURSOR,      "SWcursor",         OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_PAGE_FLIP,      "EnablePageFlip",   OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_COLOR_TILING,   "ColorTiling",      OPTV_BOOLEAN, {0}, FALSE },
@@ -499,8 +499,8 @@ static Bool RADEONPreInitAccel_KMS(ScrnInfoPtr pScrn)
 	info->is_fast_fb = TRUE;
     }
 
-    if (xf86ReturnOptValBool(info->Options, OPTION_NOACCEL,
-			     info->ChipFamily == CHIP_FAMILY_HAWAII) ||
+    if (!xf86ReturnOptValBool(info->Options, OPTION_ACCEL,
+			     info->ChipFamily != CHIP_FAMILY_HAWAII) ||
 	(!RADEONIsAccelWorking(pScrn))) {
 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
 		   "GPU accel disabled or not working, using shadowfb for KMS\n");

commit 851b2cf8714618843725f6d067915375485ade9d
Author: Adam Jackson <ajax@redhat.com>
Date:   Wed May 21 09:34:32 2014 -0400

    kms: Use own thunk function instead of shadowUpdatePackedWeak
    
    I plan to delete the Weak functions from a future server.
    
    Signed-off-by: Adam Jackson <ajax@redhat.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 5e052e4..ceaf575 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -212,6 +212,12 @@ radeonShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
     return ((uint8_t *)info->front_bo->ptr + row * stride + offset);
 }
 
+static void
+radeonUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+    shadowUpdatePacked(pScreen, pBuf);
+}
+
 static Bool RADEONCreateScreenResources_KMS(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
@@ -232,7 +238,7 @@ static Bool RADEONCreateScreenResources_KMS(ScreenPtr pScreen)
     if (info->r600_shadow_fb) {
 	pixmap = pScreen->GetScreenPixmap(pScreen);
 
-	if (!shadowAdd(pScreen, pixmap, shadowUpdatePackedWeak(),
+	if (!shadowAdd(pScreen, pixmap, radeonUpdatePacked,
 		       radeonShadowWindow, 0, NULL))
 	    return FALSE;
     }

commit b2dba2906f0b2284f17f53fd5251ba0f03d52a8b
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu May 15 16:07:53 2014 +0900

    Don't disable acceleration on >= SI on attempts to force EXA
    
    Also make this case clear in the log file:
    
     (WW) RADEON(0): EXA not supported, using glamor
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_glamor.c b/src/radeon_glamor.c
index 4aea51d..210ddcf 100644
--- a/src/radeon_glamor.c
+++ b/src/radeon_glamor.c
@@ -90,8 +90,13 @@ radeon_glamor_pre_init(ScrnInfoPtr scrn)
 	if (s == NULL && info->ChipFamily < CHIP_FAMILY_TAHITI)
 		return FALSE;
 
-	if (s && strcasecmp(s, "glamor") != 0)
-		return FALSE;
+	if (s && strcasecmp(s, "glamor") != 0) {
+		if (info->ChipFamily >= CHIP_FAMILY_TAHITI)
+			xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+				   "EXA not supported, using glamor\n");
+		else
+			return FALSE;
+	}
 
 	if (info->ChipFamily < CHIP_FAMILY_R300) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,

commit be1469cc23aba46daf3293b3d09c5f2e792e7f42
Author: Alex Deucher <alexander.deucher@amd.com>
Date:   Fri May 2 17:48:07 2014 -0400

    radeon: enable tiling for mullins
    
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index fb93f8a..5e052e4 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -889,13 +889,13 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 	     * with proper bit, in the meantime you need to set tiling option in
 	     * xorg configuration files
 	     */
-	    info->ChipFamily <= CHIP_FAMILY_HAWAII &&
+	    info->ChipFamily <= CHIP_FAMILY_MULLINS &&
 	    !info->is_fast_fb;
 
 	/* 2D color tiling */
 	if (info->ChipFamily >= CHIP_FAMILY_R600) {
 		info->allowColorTiling2D = xf86ReturnOptValBool(info->Options, OPTION_COLOR_TILING_2D,
-                                                                info->ChipFamily <= CHIP_FAMILY_HAWAII);
+                                                                info->ChipFamily <= CHIP_FAMILY_MULLINS);
 	}
 
 	if (info->ChipFamily >= CHIP_FAMILY_R600) {

commit 2ae8e4b8d12f5c9bab6655eb8cd3c5c1d5cfb10e
Author: Samuel Li <samuel.li@amd.com>
Date:   Tue Nov 12 15:30:42 2013 -0500

    radeon: add Mullins pci ids.
    
    Signed-off-by: Samuel Li <samuel.li@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>

diff --git a/src/ati_pciids_gen.h b/src/ati_pciids_gen.h
index eb57992..94c8fc8 100644
--- a/src/ati_pciids_gen.h
+++ b/src/ati_pciids_gen.h
@@ -722,6 +722,22 @@
 #define PCI_CHIP_KABINI_983D 0x983D
 #define PCI_CHIP_KABINI_983E 0x983E
 #define PCI_CHIP_KABINI_983F 0x983F
+#define PCI_CHIP_MULLINS_9850 0x9850
+#define PCI_CHIP_MULLINS_9851 0x9851
+#define PCI_CHIP_MULLINS_9852 0x9852
+#define PCI_CHIP_MULLINS_9853 0x9853
+#define PCI_CHIP_MULLINS_9854 0x9854
+#define PCI_CHIP_MULLINS_9855 0x9855
+#define PCI_CHIP_MULLINS_9856 0x9856
+#define PCI_CHIP_MULLINS_9857 0x9857
+#define PCI_CHIP_MULLINS_9858 0x9858
+#define PCI_CHIP_MULLINS_9859 0x9859
+#define PCI_CHIP_MULLINS_985A 0x985A
+#define PCI_CHIP_MULLINS_985B 0x985B
+#define PCI_CHIP_MULLINS_985C 0x985C
+#define PCI_CHIP_MULLINS_985D 0x985D
+#define PCI_CHIP_MULLINS_985E 0x985E
+#define PCI_CHIP_MULLINS_985F 0x985F
 #define PCI_CHIP_KAVERI_1304 0x1304
 #define PCI_CHIP_KAVERI_1305 0x1305
 #define PCI_CHIP_KAVERI_1306 0x1306
diff --git a/src/pcidb/ati_pciids.csv b/src/pcidb/ati_pciids.csv
index 8469a2a..e334230 100644
--- a/src/pcidb/ati_pciids.csv
+++ b/src/pcidb/ati_pciids.csv
@@ -723,6 +723,22 @@
 "0x983D","KABINI_983D","KABINI",,1,,,1,"KABINI"
 "0x983E","KABINI_983E","KABINI",,1,,,1,"KABINI"
 "0x983F","KABINI_983F","KABINI",,1,,,1,"KABINI"
+"0x9850","MULLINS_9850","MULLINS",1,1,,,1,"MULLINS"
+"0x9851","MULLINS_9851","MULLINS",1,1,,,1,"MULLINS"
+"0x9852","MULLINS_9852","MULLINS",1,1,,,1,"MULLINS"
+"0x9853","MULLINS_9853","MULLINS",1,1,,,1,"MULLINS"
+"0x9854","MULLINS_9854","MULLINS",1,1,,,1,"MULLINS"
+"0x9845","MULLINS_9855","MULLINS",1,1,,,1,"MULLINS"
+"0x9856","MULLINS_9856","MULLINS",1,1,,,1,"MULLINS"
+"0x9857","MULLINS_9857","MULLINS",1,1,,,1,"MULLINS"
+"0x9858","MULLINS_9858","MULLINS",1,1,,,1,"MULLINS"
+"0x9859","MULLINS_9859","MULLINS",1,1,,,1,"MULLINS"
+"0x985A","MULLINS_985A","MULLINS",1,1,,,1,"MULLINS"
+"0x985B","MULLINS_985B","MULLINS",1,1,,,1,"MULLINS"
+"0x985C","MULLINS_985C","MULLINS",1,1,,,1,"MULLINS"
+"0x985D","MULLINS_985D","MULLINS",1,1,,,1,"MULLINS"
+"0x985E","MULLINS_985E","MULLINS",1,1,,,1,"MULLINS"
+"0x985F","MULLINS_985F","MULLINS",1,1,,,1,"MULLINS"
 "0x1304","KAVERI_1304","KAVERI",1,1,,,1,"KAVERI"
 "0x1305","KAVERI_1305","KAVERI",,1,,,1,"KAVERI"
 "0x1306","KAVERI_1306","KAVERI",1,1,,,1,"KAVERI"
diff --git a/src/radeon_chipinfo_gen.h b/src/radeon_chipinfo_gen.h
index fc9474b..4f6e3bc 100644
--- a/src/radeon_chipinfo_gen.h
+++ b/src/radeon_chipinfo_gen.h
@@ -642,6 +642,22 @@ static RADEONCardInfo RADEONCards[] = {
  { 0x983D, CHIP_FAMILY_KABINI, 0, 1, 0, 0, 1 },
  { 0x983E, CHIP_FAMILY_KABINI, 0, 1, 0, 0, 1 },
  { 0x983F, CHIP_FAMILY_KABINI, 0, 1, 0, 0, 1 },
+ { 0x9850, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9851, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9852, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9853, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9854, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9855, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9856, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9857, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9858, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x9859, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985A, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985B, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985C, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985D, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985E, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
+ { 0x985F, CHIP_FAMILY_MULLINS, 1, 1, 0, 0, 1 },
  { 0x1304, CHIP_FAMILY_KAVERI, 1, 1, 0, 0, 1 },
  { 0x1305, CHIP_FAMILY_KAVERI, 0, 1, 0, 0, 1 },
  { 0x1306, CHIP_FAMILY_KAVERI, 1, 1, 0, 0, 1 },
diff --git a/src/radeon_chipset_gen.h b/src/radeon_chipset_gen.h
index afab6b0..03a413e 100644
--- a/src/radeon_chipset_gen.h
+++ b/src/radeon_chipset_gen.h
@@ -642,6 +642,22 @@ SymTabRec RADEONChipsets[] = {
   { PCI_CHIP_KABINI_983D, "KABINI" },
   { PCI_CHIP_KABINI_983E, "KABINI" },
   { PCI_CHIP_KABINI_983F, "KABINI" },
+  { PCI_CHIP_MULLINS_9850, "MULLINS" },
+  { PCI_CHIP_MULLINS_9851, "MULLINS" },
+  { PCI_CHIP_MULLINS_9852, "MULLINS" },
+  { PCI_CHIP_MULLINS_9853, "MULLINS" },
+  { PCI_CHIP_MULLINS_9854, "MULLINS" },
+  { PCI_CHIP_MULLINS_9855, "MULLINS" },
+  { PCI_CHIP_MULLINS_9856, "MULLINS" },
+  { PCI_CHIP_MULLINS_9857, "MULLINS" },
+  { PCI_CHIP_MULLINS_9858, "MULLINS" },
+  { PCI_CHIP_MULLINS_9859, "MULLINS" },
+  { PCI_CHIP_MULLINS_985A, "MULLINS" },
+  { PCI_CHIP_MULLINS_985B, "MULLINS" },
+  { PCI_CHIP_MULLINS_985C, "MULLINS" },
+  { PCI_CHIP_MULLINS_985D, "MULLINS" },
+  { PCI_CHIP_MULLINS_985E, "MULLINS" },
+  { PCI_CHIP_MULLINS_985F, "MULLINS" },
   { PCI_CHIP_KAVERI_1304, "KAVERI" },
   { PCI_CHIP_KAVERI_1305, "KAVERI" },
   { PCI_CHIP_KAVERI_1306, "KAVERI" },
diff --git a/src/radeon_pci_chipset_gen.h b/src/radeon_pci_chipset_gen.h
index da4440b..a9b186c 100644
--- a/src/radeon_pci_chipset_gen.h
+++ b/src/radeon_pci_chipset_gen.h
@@ -642,6 +642,22 @@ static PciChipsets RADEONPciChipsets[] = {
  { PCI_CHIP_KABINI_983D, PCI_CHIP_KABINI_983D, RES_SHARED_VGA },
  { PCI_CHIP_KABINI_983E, PCI_CHIP_KABINI_983E, RES_SHARED_VGA },
  { PCI_CHIP_KABINI_983F, PCI_CHIP_KABINI_983F, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9850, PCI_CHIP_MULLINS_9850, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9851, PCI_CHIP_MULLINS_9851, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9852, PCI_CHIP_MULLINS_9852, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9853, PCI_CHIP_MULLINS_9853, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9854, PCI_CHIP_MULLINS_9854, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9855, PCI_CHIP_MULLINS_9855, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9856, PCI_CHIP_MULLINS_9856, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9857, PCI_CHIP_MULLINS_9857, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9858, PCI_CHIP_MULLINS_9858, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_9859, PCI_CHIP_MULLINS_9859, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985A, PCI_CHIP_MULLINS_985A, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985B, PCI_CHIP_MULLINS_985B, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985C, PCI_CHIP_MULLINS_985C, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985D, PCI_CHIP_MULLINS_985D, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985E, PCI_CHIP_MULLINS_985E, RES_SHARED_VGA },
+ { PCI_CHIP_MULLINS_985F, PCI_CHIP_MULLINS_985F, RES_SHARED_VGA },
  { PCI_CHIP_KAVERI_1304, PCI_CHIP_KAVERI_1304, RES_SHARED_VGA },
  { PCI_CHIP_KAVERI_1305, PCI_CHIP_KAVERI_1305, RES_SHARED_VGA },
  { PCI_CHIP_KAVERI_1306, PCI_CHIP_KAVERI_1306, RES_SHARED_VGA },
diff --git a/src/radeon_pci_device_match_gen.h b/src/radeon_pci_device_match_gen.h
index d4b3763..a73d9c1 100644
--- a/src/radeon_pci_device_match_gen.h
+++ b/src/radeon_pci_device_match_gen.h
@@ -642,6 +642,22 @@ static const struct pci_id_match radeon_device_match[] = {
  ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983D, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983E, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_KABINI_983F, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9850, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9851, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9852, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9853, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9854, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9855, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9856, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9857, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9858, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_9859, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985A, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985B, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985C, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985D, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985E, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_MULLINS_985F, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1304, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1305, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_KAVERI_1306, 0 ),

commit 5c86a3461597647224c33d5190b4531aeeb2655f
Author: Samuel Li <samuel.li@amd.com>
Date:   Thu Apr 17 15:17:28 2014 -0400

    radeon: add support for Mullins.
    
    Signed-off-by: Samuel Li <samuel.li@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>

diff --git a/man/radeon.man b/man/radeon.man
index f6a825d..65b880c 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -208,6 +208,9 @@ KABINI APUs
 .TP 12
 .B HAWAII
 Radeon R9 series
+.TP 12
+.B MULLINS
+MULLINS APUs
 .PD
 .SH CONFIGURATION DETAILS
 Please refer to __xconfigfile__(__filemansuffix__) for general configuration
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index 9500189..3fe4644 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -116,6 +116,7 @@ typedef enum {
     CHIP_FAMILY_KAVERI,
     CHIP_FAMILY_KABINI,
     CHIP_FAMILY_HAWAII,
+    CHIP_FAMILY_MULLINS,
     CHIP_FAMILY_LAST
 } RADEONChipFamily;
 

commit fdb90ffc50acbb7d5ba0598470f9feeac6ce55fc
Author: Alex Deucher <alexander.deucher@amd.com>
Date:   Fri May 2 17:45:45 2014 -0400

    radeon: require libdrm_radeon 2.4.54 for mullins support
    
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/configure.ac b/configure.ac
index 9086bb6..dc2a656 100644
--- a/configure.ac
+++ b/configure.ac
@@ -71,7 +71,7 @@ XORG_DRIVER_CHECK_EXT(XV, videoproto)
 XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto)
 
 # Checks for libraries.
-PKG_CHECK_MODULES(LIBDRM, [libdrm >= 2.4.51])
+PKG_CHECK_MODULES(LIBDRM, [libdrm >= 2.4.54])
 PKG_CHECK_MODULES(LIBDRM_RADEON, [libdrm_radeon])
 
 # Obtain compiler/linker options for the driver dependencies

commit 06e3c8c53ef4bd159f5864eabf726438d008b49a
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed Apr 23 13:39:42 2014 +1000

    radeon: fix use-after-free in modesetting cleanup
    
    noticed while looking at something else.
    
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 02bdf9e..bd8e701 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -958,8 +958,8 @@ drmmode_output_destroy(xf86OutputPtr output)
 	}
 	for (i = 0; i < drmmode_output->mode_output->count_encoders; i++) {
 		drmModeFreeEncoder(drmmode_output->mode_encoders[i]);
-		free(drmmode_output->mode_encoders);
 	}
+	free(drmmode_output->mode_encoders);
 	free(drmmode_output->props);
 	drmModeFreeConnector(drmmode_output->mode_output);
 	free(drmmode_output);

commit dbac18c361f9e514ecb40d0617f9d68b65a542e0
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Mon Apr 28 17:51:56 2014 +0900

    Revert "Adapt to load_cursor_argb signature change in xserver 1.15.99.902"
    
    This reverts commit 48d3dbc8a0d3bfde88f46e402e530438f9317715.
    
    xserver Git has been updated to be backwards compatible with the
    previous API.

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index fc99128..02bdf9e 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -590,11 +590,7 @@ drmmode_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
 	drmModeMoveCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, x, y);
 }
 
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
-static Bool
-#else
 static void
-#endif
 drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 {
 	ScrnInfoPtr pScrn = crtc->scrn;
@@ -609,10 +605,6 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 
 	for (i = 0; i < cursor_size; i++)
 		ptr[i] = cpu_to_le32(image[i]);
-
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
-	return TRUE;
-#endif
 }
 
 

commit c84230d686c078aac1dc98d82153f8b02521b2e1
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Fri Apr 25 09:17:51 2014 +0900

    dri2: Handle PRIME for source buffer as well in radeon_dri2_copy_region2
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77810
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index d47b035..9a9918b 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -409,7 +409,14 @@ radeon_dri2_copy_region2(ScreenPtr pScreen,
     dst_drawable = &dst_private->pixmap->drawable;
 
     if (src_private->attachment == DRI2BufferFrontLeft) {
-        src_drawable = drawable;
+#ifdef USE_DRI2_PRIME
+	if (drawable->pScreen != pScreen) {
+	    src_drawable = DRI2UpdatePrime(drawable, src_buffer);
+	    if (!src_drawable)
+		return;
+	} else
+#endif
+	    src_drawable = drawable;
     }
     if (dst_private->attachment == DRI2BufferFrontLeft) {
 #ifdef USE_DRI2_PRIME

commit 48d3dbc8a0d3bfde88f46e402e530438f9317715
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Tue Apr 15 17:45:35 2014 +0900

    Adapt to load_cursor_argb signature change in xserver 1.15.99.902
    
    Apart from the compiler warning below, not doing this may result in
    accidentally using software cursors.
    
    ../../src/drmmode_display.c:808:5: warning: initialization from incompatible pointer type [enabled by default]
         .load_cursor_argb = drmmode_load_cursor_argb,
         ^
    ../../src/drmmode_display.c:808:5: warning: (near initialization for 'drmmode_crtc_funcs.load_cursor_argb') [enabled by default]
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 02bdf9e..fc99128 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -590,7 +590,11 @@ drmmode_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
 	drmModeMoveCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, x, y);
 }
 
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
+static Bool
+#else
 static void
+#endif
 drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 {
 	ScrnInfoPtr pScrn = crtc->scrn;
@@ -605,6 +609,10 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 
 	for (i = 0; i < cursor_size; i++)
 		ptr[i] = cpu_to_le32(image[i]);
+
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0)
+	return TRUE;
+#endif
 }
 
 

commit 409786a8f780d78a83bf0bddea5d37117ff6fa39
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Apr 10 11:43:04 2014 +0900

    glamor: Fix test for creating shared pixmaps
    
    The pixmap usage hint is not a bitmask in general. The test for
    CREATE_PIXMAP_USAGE_SHARED was incorrectly triggering for a glamor internal
    usage hint being added in the xserver tree.
    
    Tested-by: Ed Tomlinson <edtoml@gmail.com>

diff --git a/src/radeon.h b/src/radeon.h
index f364b67..136a430 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -794,6 +794,13 @@ enum {
     RADEON_CREATE_PIXMAP_SZBUFFER		= 0x80000000, /* for eg */
 };
 
+#define RADEON_CREATE_PIXMAP_TILING_FLAGS	\
+    (RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE |	\
+     RADEON_CREATE_PIXMAP_TILING_MACRO |	\
+     RADEON_CREATE_PIXMAP_TILING_MICRO |	\
+     RADEON_CREATE_PIXMAP_DEPTH |		\
+     RADEON_CREATE_PIXMAP_SZBUFFER)
+
 
 /* Compute log base 2 of val. */
 static __inline__ int
diff --git a/src/radeon_glamor.c b/src/radeon_glamor.c
index 7f1247c..4aea51d 100644
--- a/src/radeon_glamor.c
+++ b/src/radeon_glamor.c
@@ -172,12 +172,14 @@ Bool radeon_glamor_pixmap_is_offscreen(PixmapPtr pixmap)
 	return priv && priv->bo;
 }
 
-#ifdef CREATE_PIXMAP_USAGE_SHARED
-#define RADEON_CREATE_PIXMAP_SHARED (CREATE_PIXMAP_USAGE_SHARED | RADEON_CREATE_PIXMAP_DRI2)
-#else
-#define RADEON_CREATE_PIXMAP_SHARED RADEON_CREATE_PIXMAP_DRI2
+#ifndef CREATE_PIXMAP_USAGE_SHARED
+#define CREATE_PIXMAP_USAGE_SHARED RADEON_CREATE_PIXMAP_DRI2
 #endif
 
+#define RADEON_CREATE_PIXMAP_SHARED(usage) \
+	(((usage) & ~RADEON_CREATE_PIXMAP_TILING_FLAGS) == RADEON_CREATE_PIXMAP_DRI2 || \
+	 (usage) == CREATE_PIXMAP_USAGE_SHARED)
+
 static PixmapPtr
 radeon_glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
 			unsigned usage)
@@ -186,7 +188,7 @@ radeon_glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
 	struct radeon_pixmap *priv;
 	PixmapPtr pixmap, new_pixmap = NULL;
 
-	if (!(usage & RADEON_CREATE_PIXMAP_SHARED)) {
+	if (!RADEON_CREATE_PIXMAP_SHARED(usage)) {
 		pixmap = glamor_create_pixmap(screen, w, h, depth, usage);
 		if (pixmap)
 			return pixmap;
@@ -229,7 +231,7 @@ radeon_glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
 	return pixmap;
 
 fallback_glamor:
-	if (usage & RADEON_CREATE_PIXMAP_SHARED) {
+	if (RADEON_CREATE_PIXMAP_SHARED(usage)) {
 	/* XXX need further work to handle the DRI2 failure case.
 	 * Glamor don't know how to handle a BO only pixmap. Put
 	 * a warning indicator here.

commit aecf1c4e5f4718adcfb85836830d065d3f4f97a5
Author: Michel Dänzer <michel.daenzer@amd.com>
Date:   Thu Apr 10 15:10:56 2014 +0900

    dri2: Fix conflicting CreatePixmap usage flag definitions
    
    RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE was the same as
    RADEON_CREATE_PIXMAP_DRI2.
    
    Disambiguate the definitions and rearrange them to try and prevent this
    from happening again.
    
    Tested-by: Ed Tomlinson <edtoml@gmail.com>

diff --git a/src/radeon.h b/src/radeon.h
index f1817e7..f364b67 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -786,12 +786,12 @@ static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
 }
 
 enum {
-    RADEON_CREATE_PIXMAP_DRI2 = 0x08000000,
-    RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000,
-    RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000,
-    RADEON_CREATE_PIXMAP_DEPTH = 0x40000000, /* for r200 */
-    RADEON_CREATE_PIXMAP_SZBUFFER = 0x80000000, /* for eg */
-    RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE = 0x8000000,
+    RADEON_CREATE_PIXMAP_DRI2			= 0x04000000,
+    RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE	= 0x08000000,
+    RADEON_CREATE_PIXMAP_TILING_MACRO		= 0x10000000,
+    RADEON_CREATE_PIXMAP_TILING_MICRO		= 0x20000000,
+    RADEON_CREATE_PIXMAP_DEPTH			= 0x40000000, /* for r200 */
+    RADEON_CREATE_PIXMAP_SZBUFFER		= 0x80000000, /* for eg */
 };
 
 

commit b50da3b96c212086cb58501dbe988d64f1f35b6d
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Apr 11 09:44:37 2014 +0200

    Fix building on older servers without xf86platformBus.h
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index f7f0a0d..fb93f8a 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -593,7 +593,7 @@ static int radeon_get_drm_master_fd(ScrnInfoPtr pScrn)
     char *busid;
     int fd;
 
-#if defined(ODEV_ATTRIB_FD)
+#ifdef XF86_PDEV_SERVER_FD
     if (pRADEONEnt->platform_dev) {
         fd = xf86_get_platform_device_int_attrib(pRADEONEnt->platform_dev,
                                                  ODEV_ATTRIB_FD, -1);
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index 4f5e645..9500189 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -37,12 +37,16 @@
 #define _RADEON_PROBE_H_ 1
 
 #include <stdint.h>
+#include "xorg-server.h"
 #include "xf86str.h"
 #include "xf86DDC.h"
 #include "randrstr.h"
 
 #include "xf86Crtc.h"
+
+#ifdef XSERVER_PLATFORM_BUS
 #include "xf86platformBus.h"
+#endif
 
 #include "compat-api.h"
 #include "exa.h"
@@ -137,7 +141,9 @@ typedef struct
     int fd_ref;
     unsigned long     fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
     int fd_wakeup_ref;
+#ifdef XSERVER_PLATFORM_BUS
     struct xf86_platform_device *platform_dev;
+#endif
 } RADEONEntRec, *RADEONEntPtr;
 
 extern const OptionInfoRec *RADEONOptionsWeak(void);

commit ed0cfbb4fe77146b0b38f777bc28f3a4ea6da07f
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Mar 7 13:27:30 2014 +0100

    Add support for server managed fds
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index c0f9762..f7f0a0d 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -180,7 +180,11 @@ static void RADEONFreeRec(ScrnInfoPtr pScrn)
         pRADEONEnt = pPriv->ptr;
         pRADEONEnt->fd_ref--;
         if (!pRADEONEnt->fd_ref) {
-            drmClose(pRADEONEnt->fd);
+#ifdef XF86_PDEV_SERVER_FD
+            if (!(pRADEONEnt->platform_dev &&
+                    pRADEONEnt->platform_dev->flags & XF86_PDEV_SERVER_FD))
+#endif
+                drmClose(pRADEONEnt->fd);
             pRADEONEnt->fd = 0;
         }
     }
@@ -584,10 +588,20 @@ static Bool RADEONPreInitChipType_KMS(ScrnInfoPtr pScrn)
 static int radeon_get_drm_master_fd(ScrnInfoPtr pScrn)
 {
     RADEONInfoPtr  info   = RADEONPTR(pScrn);
+    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
     struct pci_device *dev = info->PciInfo;
     char *busid;
     int fd;
 
+#if defined(ODEV_ATTRIB_FD)
+    if (pRADEONEnt->platform_dev) {
+        fd = xf86_get_platform_device_int_attrib(pRADEONEnt->platform_dev,
+                                                 ODEV_ATTRIB_FD, -1);
+        if (fd != -1)
+            return fd;
+    }
+#endif
+
 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
     XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
                 dev->domain, dev->bus, dev->dev, dev->func);
@@ -1107,6 +1121,39 @@ static Bool RADEONSaveScreen_KMS(ScreenPtr pScreen, int mode)
     return TRUE;
 }
 
+static Bool radeon_set_drm_master(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr  info  = RADEONPTR(pScrn);
+    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
+    int err;
+
+#ifdef XF86_PDEV_SERVER_FD
+    if (pRADEONEnt->platform_dev &&
+            (pRADEONEnt->platform_dev->flags & XF86_PDEV_SERVER_FD))
+        return TRUE;
+#endif
+
+    err = drmSetMaster(info->dri2.drm_fd);
+    if (err)
+        ErrorF("Unable to retrieve master\n");
+
+    return err == 0;
+}
+
+static void radeon_drop_drm_master(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr  info  = RADEONPTR(pScrn);
+    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
+
+#ifdef XF86_PDEV_SERVER_FD
+    if (pRADEONEnt->platform_dev &&
+            (pRADEONEnt->platform_dev->flags & XF86_PDEV_SERVER_FD))
+        return;
+#endif
+
+    drmDropMaster(info->dri2.drm_fd);
+}
+
 /* Called at the end of each server generation.  Restore the original
  * text mode, unmap video memory, and unwrap and call the saved
  * CloseScreen function.
@@ -1133,7 +1180,7 @@ static Bool RADEONCloseScreen_KMS(CLOSE_SCREEN_ARGS_DECL)
     if (info->accel_state->use_vbos)
         radeon_vbo_free_lists(pScrn);
 
-    drmDropMaster(info->dri2.drm_fd);
+    radeon_drop_drm_master(pScrn);
 
     drmmode_fini(pScrn, &info->drmmode);
     if (info->dri2.enabled)
@@ -1168,7 +1215,6 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
     int            subPixelOrder = SubPixelUnknown;
     char*          s;
     void *front_ptr;
-    int ret;
 
     pScrn->fbOffset = 0;
 
@@ -1179,11 +1225,9 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL)
 			  pScrn->defaultVisual)) return FALSE;
     miSetPixmapDepths ();
 
-    ret = drmSetMaster(info->dri2.drm_fd);
-    if (ret) {
-        ErrorF("Unable to retrieve master\n");
+    if (!radeon_set_drm_master(pScrn))
         return FALSE;
-    }
+
     info->directRenderingEnabled = FALSE;
     if (info->r600_shadow_fb == FALSE)
         info->directRenderingEnabled = radeon_dri2_screen_init(pScreen);
@@ -1396,15 +1440,12 @@ Bool RADEONEnterVT_KMS(VT_FUNC_ARGS_DECL)
 {
     SCRN_INFO_PTR(arg);
     RADEONInfoPtr  info  = RADEONPTR(pScrn);
-    int ret;
 
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
 		   "RADEONEnterVT_KMS\n");
 
+    radeon_set_drm_master(pScrn);
 
-    ret = drmSetMaster(info->dri2.drm_fd);
-    if (ret)
-	ErrorF("Unable to retrieve master\n");
     info->accel_state->XInited3D = FALSE;
     info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN;
 
@@ -1425,7 +1466,7 @@ void RADEONLeaveVT_KMS(VT_FUNC_ARGS_DECL)
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
 		   "RADEONLeaveVT_KMS\n");
 
-    drmDropMaster(info->dri2.drm_fd);
+    radeon_drop_drm_master(pScrn);
 
     xf86RotateFreeShadow(pScrn);
 
diff --git a/src/radeon_probe.c b/src/radeon_probe.c
index 2d3c58e..ad1e96e 100644
--- a/src/radeon_probe.c
+++ b/src/radeon_probe.c
@@ -202,6 +202,10 @@ RADEONDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
 	    flag = (CARD32 *)data;
 	    (*flag) = 0;
 	    return TRUE;
+#if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(1,15,99,0,0)
+	case SUPPORTS_SERVER_FDS:
+	    return TRUE;
+#endif
 	default:
 	    return FALSE;
     }
@@ -272,6 +276,7 @@ radeon_platform_probe(DriverPtr pDriver,
             pRADEONEnt = pPriv->ptr;
             pRADEONEnt->HasSecondary = TRUE;
         }
+        pRADEONEnt->platform_dev = dev;
     }
 
     free(pEnt);
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index cea6695..4f5e645 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -42,6 +42,7 @@
 #include "randrstr.h"
 
 #include "xf86Crtc.h"
+#include "xf86platformBus.h"
 
 #include "compat-api.h"
 #include "exa.h"
@@ -136,6 +137,7 @@ typedef struct
     int fd_ref;
     unsigned long     fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
     int fd_wakeup_ref;
+    struct xf86_platform_device *platform_dev;
 } RADEONEntRec, *RADEONEntPtr;
 
 extern const OptionInfoRec *RADEONOptionsWeak(void);

commit 3d7861fe112f25874319d4cdc12b745fbcd359cf
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Mon Mar 17 10:38:13 2014 +0100

    Add radeon_get_drm_master_fd helper function
    
    This is a preparation patch for adding server-managed-fd support without it
    turning into a goto fest.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 16a1b5f..c0f9762 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -581,23 +581,12 @@ static Bool RADEONPreInitChipType_KMS(ScrnInfoPtr pScrn)
     return TRUE;
 }
 
-static Bool radeon_open_drm_master(ScrnInfoPtr pScrn)
+static int radeon_get_drm_master_fd(ScrnInfoPtr pScrn)
 {
     RADEONInfoPtr  info   = RADEONPTR(pScrn);
-    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
     struct pci_device *dev = info->PciInfo;
     char *busid;
-    drmSetVersion sv;
-    int err;
-
-    if (pRADEONEnt->fd) {
-	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-		   " reusing fd for second head\n");
-
-	info->drmmode.fd = info->dri2.drm_fd = pRADEONEnt->fd;
-	pRADEONEnt->fd_ref++;
-	return TRUE;
-    }
+    int fd;
 
 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
     XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
@@ -607,16 +596,35 @@ static Bool radeon_open_drm_master(ScrnInfoPtr pScrn)
 		      dev->domain, dev->bus, dev->dev, dev->func);
 #endif
 
-    info->dri2.drm_fd = drmOpen(NULL, busid);
-    if (info->dri2.drm_fd == -1) {
-
+    fd = drmOpen(NULL, busid);
+    if (fd == -1)
 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
 		   "[drm] Failed to open DRM device for %s: %s\n",
 		   busid, strerror(errno));
-	free(busid);
-	return FALSE;
-    }
+
     free(busid);
+    return fd;
+}
+
+static Bool radeon_open_drm_master(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr  info   = RADEONPTR(pScrn);
+    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
+    drmSetVersion sv;
+    int err;
+
+    if (pRADEONEnt->fd) {
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+		   " reusing fd for second head\n");
+
+	info->drmmode.fd = info->dri2.drm_fd = pRADEONEnt->fd;
+	pRADEONEnt->fd_ref++;
+        return TRUE;
+    }
+
+    info->dri2.drm_fd = radeon_get_drm_master_fd(pScrn);
+    if (info->dri2.drm_fd == -1)
+	return FALSE;


Reply to: