]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/drm_pci.c
Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / gpu / drm / drm_pci.c
index 754bc96e10c70ffd406e51ea6327c5690376e273..bd719e936e13a028a0748f8077029f235fe0a611 100644 (file)
@@ -439,78 +439,67 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
        return 0;
 }
 
-#else
-
-int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
-{
-       return -1;
-}
-
-#endif
-
-EXPORT_SYMBOL(drm_pci_init);
-
-/*@}*/
-void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
-{
-       struct drm_device *dev, *tmp;
-       DRM_DEBUG("\n");
-
-       if (driver->driver_features & DRIVER_MODESET) {
-               pci_unregister_driver(pdriver);
-       } else {
-               list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
-                       drm_put_dev(dev);
-       }
-       DRM_INFO("Module unloaded\n");
-}
-EXPORT_SYMBOL(drm_pci_exit);
-
 int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *mask)
 {
        struct pci_dev *root;
-       int pos;
-       u32 lnkcap = 0, lnkcap2 = 0;
+       u32 lnkcap, lnkcap2;
 
        *mask = 0;
        if (!dev->pdev)
                return -EINVAL;
 
-       if (!pci_is_pcie(dev->pdev))
-               return -EINVAL;
-
        root = dev->pdev->bus->self;
 
-       pos = pci_pcie_cap(root);
-       if (!pos)
-               return -EINVAL;
-
        /* we've been informed via and serverworks don't make the cut */
        if (root->vendor == PCI_VENDOR_ID_VIA ||
            root->vendor == PCI_VENDOR_ID_SERVERWORKS)
                return -EINVAL;
 
-       pci_read_config_dword(root, pos + PCI_EXP_LNKCAP, &lnkcap);
-       pci_read_config_dword(root, pos + PCI_EXP_LNKCAP2, &lnkcap2);
+       pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
+       pcie_capability_read_dword(root, PCI_EXP_LNKCAP2, &lnkcap2);
 
-       lnkcap &= PCI_EXP_LNKCAP_SLS;
-       lnkcap2 &= 0xfe;
-
-       if (lnkcap2) { /* PCIE GEN 3.0 */
+       if (lnkcap2) {  /* PCIe r3.0-compliant */
                if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_2_5GB)
                        *mask |= DRM_PCIE_SPEED_25;
                if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_5_0GB)
                        *mask |= DRM_PCIE_SPEED_50;
                if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB)
                        *mask |= DRM_PCIE_SPEED_80;
-       } else {
-               if (lnkcap & 1)
+       } else {        /* pre-r3.0 */
+               if (lnkcap & PCI_EXP_LNKCAP_SLS_2_5GB)
                        *mask |= DRM_PCIE_SPEED_25;
-               if (lnkcap & 2)
-                       *mask |= DRM_PCIE_SPEED_50;
+               if (lnkcap & PCI_EXP_LNKCAP_SLS_5_0GB)
+                       *mask |= (DRM_PCIE_SPEED_25 | DRM_PCIE_SPEED_50);
        }
 
        DRM_INFO("probing gen 2 caps for device %x:%x = %x/%x\n", root->vendor, root->device, lnkcap, lnkcap2);
        return 0;
 }
 EXPORT_SYMBOL(drm_pcie_get_speed_cap_mask);
+
+#else
+
+int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
+{
+       return -1;
+}
+
+#endif
+
+EXPORT_SYMBOL(drm_pci_init);
+
+/*@}*/
+void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
+{
+       struct drm_device *dev, *tmp;
+       DRM_DEBUG("\n");
+
+       if (driver->driver_features & DRIVER_MODESET) {
+               pci_unregister_driver(pdriver);
+       } else {
+               list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
+                       drm_put_dev(dev);
+       }
+       DRM_INFO("Module unloaded\n");
+}
+EXPORT_SYMBOL(drm_pci_exit);