xf86-video-ati: Branch 'master' - 3 commits

Hans de Goede jwrdegoede at kemper.freedesktop.org
Wed Apr 2 07:00:00 PDT 2014


 src/radeon_kms.c   |  106 ++++++++++++++++++++++++++++++++++++++---------------
 src/radeon_probe.c |    5 ++
 src/radeon_probe.h |    2 +
 3 files changed, 84 insertions(+), 29 deletions(-)

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

    Add support for server managed fds
    
    Signed-off-by: Hans de Goede <hdegoede at 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 at 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 at 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;
 
     /* Check that what we opened was a master or a master-capable FD,
      * by setting the version of the interface we'll use to talk to it.
commit a63342ad15408071437c80b411d14196f3288aed
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Mar 17 10:36:55 2014 +0100

    radeon_open_drm_master get rid of unnecessary goto
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 4f1f5ee..16a1b5f 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -594,9 +594,9 @@ static Bool radeon_open_drm_master(ScrnInfoPtr pScrn)
 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
 		   " reusing fd for second head\n");
 
-	info->dri2.drm_fd = pRADEONEnt->fd;
+	info->drmmode.fd = info->dri2.drm_fd = pRADEONEnt->fd;
 	pRADEONEnt->fd_ref++;
-	goto out;
+	return TRUE;
     }
 
 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
@@ -638,7 +638,6 @@ static Bool radeon_open_drm_master(ScrnInfoPtr pScrn)
 
     pRADEONEnt->fd = info->dri2.drm_fd;
     pRADEONEnt->fd_ref = 1;
- out:
     info->drmmode.fd = info->dri2.drm_fd;
     return TRUE;
 }


More information about the xorg-commit mailing list