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

xorg-server: Changes to 'ubuntu++1'



 debian/patches/series                     |    2 
 debian/patches/xf86-add--gpu-switch.patch |  236 ++++++++++++++++++++++--------
 debian/patches/xf86-fixup-detection.patch |   79 ++++++++++
 3 files changed, 259 insertions(+), 58 deletions(-)

New commits:
commit ef7a883c40fe43d9ba301cc7f9979ff883fe1968
Author: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date:   Thu Jun 13 11:04:27 2013 +0200

    make -gpu work correctly

diff --git a/debian/patches/series b/debian/patches/series
index 5ff1f8b..9e10a04 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -45,4 +45,6 @@ dix-fixup-build-failure.patch
 config-add-no-removal.patch
 xf86-detach-scanout.patch
 xf86-fixup-unbind.patch
+xf86-fixup-detection.patch
 228_autobind_gpu.patch
+xf86-add--gpu-switch.patch
diff --git a/debian/patches/xf86-add--gpu-switch.patch b/debian/patches/xf86-add--gpu-switch.patch
index 5d92129..3e6cc44 100644
--- a/debian/patches/xf86-add--gpu-switch.patch
+++ b/debian/patches/xf86-add--gpu-switch.patch
@@ -1,6 +1,8 @@
+diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
+index 91ec4c8..b9a1065 100644
 --- a/hw/xfree86/common/xf86Init.c
 +++ b/hw/xfree86/common/xf86Init.c
-@@ -95,6 +95,9 @@
+@@ -95,6 +95,9 @@ void (*xf86OSPMClose) (void) = NULL;
  #endif
  static Bool xorgHWOpenConsole = FALSE;
  
@@ -10,7 +12,7 @@
  /* Common pixmap formats */
  
  static PixmapFormatRec formats[MAXFORMATS] = {
-@@ -1435,6 +1438,23 @@
+@@ -1399,6 +1402,23 @@ ddxProcessArgument(int argc, char **argv, int i)
          xf86PointerName = argv[++i];
          return 2;
      }
@@ -34,7 +36,7 @@
      if (!strcmp(argv[i], "-keyboard")) {
          CHECK_FOR_REQUIRED_ARGUMENT();
          xf86KeyboardName = argv[++i];
-@@ -1543,6 +1563,7 @@
+@@ -1507,6 +1527,7 @@ ddxUseMsg(void)
          ("-keyboard name         specify the core keyboard InputDevice name\n");
      ErrorF
          ("-pointer name          specify the core pointer InputDevice name\n");
@@ -42,9 +44,11 @@
      ErrorF("-nosilk                disable Silken Mouse\n");
      ErrorF("-flipPixels            swap default black/white Pixel values\n");
  #ifdef XF86VIDMODE
+diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
+index 58cfe0a..a639fbd 100644
 --- a/hw/xfree86/common/xf86Priv.h
 +++ b/hw/xfree86/common/xf86Priv.h
-@@ -98,6 +98,11 @@
+@@ -96,6 +96,11 @@ extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;
  
  extern ScrnInfoPtr *xf86GPUScreens;      /* List of pointers to ScrnInfoRecs */
  extern int xf86NumGPUScreens;
@@ -56,63 +60,179 @@
  #ifndef DEFAULT_VERBOSE
  #define DEFAULT_VERBOSE		0
  #endif
---- a/hw/xfree86/common/xf86platformBus.c
-+++ b/hw/xfree86/common/xf86platformBus.c
-@@ -355,7 +355,14 @@
-     Bool foundScreen = FALSE;
-     GDevPtr *devList;
-     const unsigned numDevs = xf86MatchDevice(drvp->driverName, &devList);
--    int i, j;
-+    int i, j, primary_idx = 0;
-+
-+    for (i = 0; i < xf86_num_platform_devices; ++i) {
-+        if (xf86_platform_devices[j].pdev && xf86IsPrimaryPlatform(&xf86_platform_devices[i])) {
-+            primary_idx = i;
-+            break;
-+        }
-+    }
+diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
+index 258988a..51a3b53 100644
+--- a/hw/xfree86/common/xf86pciBus.c
++++ b/hw/xfree86/common/xf86pciBus.c
+@@ -77,6 +77,10 @@ int pciSlotClaimed = 0;
+     (((c) & 0x00ffff00) \
+ 	 == ((PCI_CLASS_DISPLAY << 16) | (PCI_SUBCLASS_DISPLAY_VGA << 8)))
  
-     /* find the main device or any device specificed in xorg.conf */
-     for (i = 0; i < numDevs; i++) {
-@@ -369,23 +376,35 @@
-                 if (ServerIsNotSeat0())
-                     break;
-                 if (xf86_platform_devices[j].pdev) {
--                    if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
-+                    if (xf86gpu_idx >= 0)
-                         break;
--                }
--                else {
-+                    else if (j == primary_idx)
-+                        break;
-+                } else if ((xf86_num_platform_devices == 1) && (!foundScreen))
-                     /* there's no way to handle real platform devices at this point,
-                      * as there's no valid busID to be used, so try to move forward
-                      * in case there's only one platform device, and see if the
-                      * driver's probe succeeds or not at least once */
--                    if ((xf86_num_platform_devices == 1) && (!foundScreen))
--                        break;
--                }
-+                    break;
++#define IS_3D(c) \
++    (((c) & 0x00ffff00) \
++	 == ((PCI_CLASS_DISPLAY << 16) | (PCI_SUBCLASS_DISPLAY_3D << 8)))
++
+ static struct pci_slot_match xf86IsolateDevice = {
+     PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0
+ };
+@@ -88,6 +92,7 @@ static struct pci_slot_match xf86IsolateDevice = {
+ void
+ xf86PciProbe(void)
+ {
++    int primary_idx = -1;
+     int i = 0, k;
+     int num = 0;
+     struct pci_device *info;
+@@ -113,6 +118,7 @@ xf86PciProbe(void)
+             if (primaryBus.type == BUS_NONE && pci_device_is_boot_vga(info)) {
+                 primaryBus.type = BUS_PCI;
+                 primaryBus.id.pci = info;
++                primary_idx = num - 1;
              }
+             info->user_data = 0;
          }
+@@ -128,10 +134,12 @@ xf86PciProbe(void)
+             pci_device_cfg_read_u16(info, &command, 4);
  
-         if (j == xf86_num_platform_devices)
-              continue;
- 
-+        /*
-+         * When xf86gpu_idx is set the primary device will come first.
-+         * The rest will be reordered, this way -gpu 0 will always map
-+         * to the default.
-+         */
-+        if (xf86gpu_idx >= 0) {
-+            if (j < primary_idx)  {
-+                if (j + 1 != xf86gpu_idx)
-+                     continue;
-+            } else if (j - primary_idx != xf86gpu_idx)
-+                continue;
-+        }
+             if ((command & PCI_CMD_MEM_ENABLE)
+-                && ((num == 1) || IS_VGA(info->device_class))) {
++                && (num == 1 || IS_VGA(info->device_class) ||
++                    IS_3D(info->device_class))) {
+                 if (primaryBus.type == BUS_NONE) {
+                     primaryBus.type = BUS_PCI;
+                     primaryBus.id.pci = info;
++                    primary_idx = i;
+                 }
+                 else {
+                     xf86Msg(X_NOTICE,
+@@ -142,6 +150,17 @@ xf86PciProbe(void)
+         }
+     }
+ 
++    if (xf86gpu_idx > 0 && primary_idx >= 0) {
++        if (xf86gpu_idx >= num)
++            FatalError("invalid -gpu %i specified devices, only %i cards found\n", xf86gpu_idx, num);
 +
-         foundScreen = probeSingleDevice(&xf86_platform_devices[j], drvp, devList[i], 0);
-         if (!foundScreen)
++        primaryBus.type = BUS_PCI;
++        if (xf86gpu_idx > primary_idx)
++            primaryBus.id.pci = xf86PciVideoInfo[xf86gpu_idx];
++        else
++            primaryBus.id.pci = xf86PciVideoInfo[xf86gpu_idx - 1];
++    }
++
+     /* Print a summary of the video devices found */
+     for (k = 0; k < num; k++) {
+         const char *prim = " ";
+@@ -153,7 +172,7 @@ xf86PciProbe(void)
              continue;
+ 
+         if (xf86IsPrimaryPci(info))
+-            prim = "*";
++            prim = xf86gpu_idx > 0 ? "o" : "*";
+ 
+         xf86Msg(X_PROBED, "PCI:%s(%u:%u:%u:%u) %04x:%04x:%04x:%04x ", prim,
+                 info->domain, info->bus, info->dev, info->func,
+diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
+index e368dee..2fb4694 100644
+--- a/hw/xfree86/common/xf86platformBus.c
++++ b/hw/xfree86/common/xf86platformBus.c
+@@ -131,7 +131,7 @@ xf86IsPrimaryPlatform(struct xf86_platform_device *plat)
+     return ((primaryBus.type == BUS_PLATFORM) && (plat == primaryBus.id.plat));
+ }
+ 
+-static void
++static int
+ platform_find_pci_info(struct xf86_platform_device *pd, char *busid)
+ {
+     struct pci_slot_match devmatch;
+@@ -143,20 +143,22 @@ platform_find_pci_info(struct xf86_platform_device *pd, char *busid)
+                  &devmatch.domain, &devmatch.bus, &devmatch.dev,
+                  &devmatch.func);
+     if (ret != 4)
+-        return;
++        return 0;
+ 
+     iter = pci_slot_match_iterator_create(&devmatch);
+     info = pci_device_next(iter);
++    ret = 0;
+     if (info) {
+         pd->pdev = info;
+         pci_device_probe(info);
+         if (pci_device_is_boot_vga(info)) {
+             primaryBus.type = BUS_PLATFORM;
+             primaryBus.id.plat = pd;
++            ret = 1;
+         }
+     }
+     pci_iterator_destroy(iter);
+-
++    return ret;
+ }
+ 
+ static Bool
+@@ -216,22 +219,46 @@ xf86PlatformMatchDriver(char *matches[], int nmatches)
+ int
+ xf86platformProbe(void)
+ {
+-    int i;
+-    Bool pci = TRUE;
++    int i, primary_idx = 0;
+ 
+     config_odev_probe(xf86PlatformDeviceProbe);
+ 
+-    if (!xf86scanpci()) {
+-        pci = FALSE;
+-    }
++    if (!xf86scanpci())
++        return 0;
+ 
+     for (i = 0; i < xf86_num_platform_devices; i++) {
+         char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
+ 
+-        if (pci && (strncmp(busid, "pci:", 4) == 0)) {
+-            platform_find_pci_info(&xf86_platform_devices[i], busid);
++        if (strncmp(busid, "pci:", 4) == 0) {
++            if (platform_find_pci_info(&xf86_platform_devices[i], busid))
++                primary_idx = i;
+         }
+     }
++
++    if (xf86gpu_idx > 0 &&
++        xf86gpu_idx < xf86_num_platform_devices) {
++        if (xf86gpu_idx <= primary_idx)
++            primaryBus.id.plat = &xf86_platform_devices[xf86gpu_idx - 1];
++        else
++            primaryBus.id.plat = &xf86_platform_devices[xf86gpu_idx];
++    }
++
++    for (i = 0; i < xf86_num_platform_devices; i++) {
++        const char *prim = " ";
++        Bool memdone = FALSE, iodone = FALSE;
++        struct xf86_platform_device *dev = &xf86_platform_devices[i];
++
++        if (xf86IsPrimaryPlatform(dev))
++            prim = xf86gpu_idx > 0 ? "o" : "*";
++
++        xf86Msg(X_PROBED, "[%s%i] %s %s %s %04x:%04x\n", prim, i,
++                xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID),
++                xf86_get_platform_attrib(i, ODEV_ATTRIB_PATH),
++                xf86_get_platform_attrib(i, ODEV_ATTRIB_SYSPATH),
++                dev->pdev ? dev->pdev->vendor_id : 0xffff,
++                dev->pdev ? dev->pdev->device_id : 0xffff);
++    }
++
+     return 0;
+ }
+ 
+diff --git a/hw/xfree86/os-support/bus/xf86Pci.h b/hw/xfree86/os-support/bus/xf86Pci.h
+index f69e55b..1183b7a 100644
+--- a/hw/xfree86/os-support/bus/xf86Pci.h
++++ b/hw/xfree86/os-support/bus/xf86Pci.h
+@@ -173,6 +173,7 @@
+ /* 0x03 display subclasses */
+ #define PCI_SUBCLASS_DISPLAY_VGA	0x00
+ #define PCI_SUBCLASS_DISPLAY_XGA	0x01
++#define PCI_SUBCLASS_DISPLAY_3D		0x02
+ #define PCI_SUBCLASS_DISPLAY_MISC	0x80
+ 
+ /* 0x04 multimedia subclasses */
diff --git a/debian/patches/xf86-fixup-detection.patch b/debian/patches/xf86-fixup-detection.patch
new file mode 100644
index 0000000..e454c75
--- /dev/null
+++ b/debian/patches/xf86-fixup-detection.patch
@@ -0,0 +1,79 @@
+--- a/hw/xfree86/common/xf86pciBus.c
++++ b/hw/xfree86/common/xf86pciBus.c
+@@ -546,6 +546,15 @@
+                     for (k = 0; k < xf86NumEntities; k++) {
+                         EntityPtr pEnt = xf86Entities[k];
+ 
++#ifdef XSERVER_PLATFORM_BUS
++                        if (pEnt->bus.type == BUS_PLATFORM &&
++                            pEnt->bus.id.plat->pdev &&
++                            MATCH_PCI_DEVICES(pEnt->bus.id.plat->pdev, pPci)) {
++                            foundScreen = TRUE;
++                            break;
++                        }
++#endif
++
+                         if (pEnt->bus.type != BUS_PCI)
+                             continue;
+                         if (pEnt->bus.id.pci == pPci) {
+--- a/hw/xfree86/common/xf86platformBus.c
++++ b/hw/xfree86/common/xf86platformBus.c
+@@ -167,11 +167,12 @@
+     for (i = 0; i < xf86NumEntities; i++) {
+         const EntityPtr u = xf86Entities[i];
+ 
+-        if (pd->pdev && u->bus.type == BUS_PCI)
+-            return !MATCH_PCI_DEVICES(pd->pdev, u->bus.id.pci);
+-        if ((u->bus.type == BUS_PLATFORM) && (pd == u->bus.id.plat)) {
++        if (pd->pdev && u->bus.type == BUS_PCI &&
++            MATCH_PCI_DEVICES(pd->pdev, u->bus.id.pci))
++            return FALSE;
++
++        if ((u->bus.type == BUS_PLATFORM) && (pd == u->bus.id.plat))
+             return FALSE;
+-        }
+     }
+     return TRUE;
+ }
+@@ -302,6 +303,11 @@
+         for (nent = 0; nent < xf86NumEntities; nent++) {
+             EntityPtr pEnt = xf86Entities[nent];
+ 
++            if (dev->pdev && pEnt->bus.type == BUS_PCI &&
++                MATCH_PCI_DEVICES(dev->pdev, pEnt->bus.id.pci)) {
++                return FALSE;
++            }
++
+             if (pEnt->bus.type != BUS_PLATFORM)
+                 continue;
+             if (pEnt->bus.id.plat == dev) {
+@@ -368,18 +374,15 @@
+                 /* for non-seat0 servers assume first device is the master */
+                 if (ServerIsNotSeat0())
+                     break;
+-                if (xf86_platform_devices[j].pdev) {
+-                    if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
+-                        break;
+-                }
+-                else {
++                if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
++                    break;
++                else
+                     /* there's no way to handle real platform devices at this point,
+                      * as there's no valid busID to be used, so try to move forward
+                      * in case there's only one platform device, and see if the
+                      * driver's probe succeeds or not at least once */
+                     if ((xf86_num_platform_devices == 1) && (!foundScreen))
+                         break;
+-                }
+             }
+         }
+ 
+@@ -398,6 +401,7 @@
+         }
+     }
+ 
++    free(devList);
+     return foundScreen;
+ }
+ 


Reply to: