OSDN Git Service

ati_pcigart: stop working in the evenings you mess up too often
authorDave Airlie <airlied@redhat.com>
Wed, 14 May 2008 12:44:22 +0000 (22:44 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 14 May 2008 12:44:22 +0000 (22:44 +1000)
linux-core/ati_pcigart.c

index 34081d4..f7752b5 100644 (file)
@@ -36,6 +36,9 @@
 # define ATI_PCIGART_PAGE_SIZE         4096    /**< PCI GART page size */
 # define ATI_PCIGART_PAGE_MASK         (~(ATI_PCIGART_PAGE_SIZE-1))
 
+#define ATI_PCIE_WRITE 0x4
+#define ATI_PCIE_READ 0x8
+
 static int drm_ati_alloc_pcigart_table(struct drm_device *dev,
                                       struct drm_ati_pcigart_info *gart_info)
 {
@@ -105,6 +108,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
        dma_addr_t bus_address = 0;
        int i, j, ret = 0;
        int max_pages;
+       dma_addr_t entry_addr;
 
        if (!entry) {
                DRM_ERROR("no scatter/gather memory!\n");
@@ -151,27 +155,26 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
                        goto done;
                }
 
+               entry_addr = entry->busaddr[i];
                for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
+                       page_base = (u32) entry_addr & ATI_PCIGART_PAGE_MASK;
                        switch(gart_info->gart_reg_if) {
                        case DRM_ATI_GART_IGP:
-                               page_base = (u32) entry->busaddr[i] & ATI_PCIGART_PAGE_MASK;
-                               page_base |= (upper_32_bits(entry->busaddr[i]) & 0xff) << 4;
-                               *pci_gart = cpu_to_le32((page_base) | 0xc);
+                               page_base |= (upper_32_bits(entry_addr) & 0xff) << 4;
+                               page_base |= ATI_PCIE_READ | ATI_PCIE_WRITE;
                                break;
                        case DRM_ATI_GART_PCIE:
-                               page_base = (u32)(entry->busaddr[i] & ATI_PCIGART_PAGE_MASK);
                                page_base >>= 8;
-                               page_base |= (upper_32_bits(entry->busaddr[i]) & 0xff) << 24;
-                               *pci_gart = cpu_to_le32((page_base >> 8) | 0xc);
+                               page_base |= (upper_32_bits(entry_addr) & 0xff) << 24;
+                               page_base |= 0xc;
                                break;
                        default:
                        case DRM_ATI_GART_PCI:
-                               page_base = (u32) entry->busaddr[i];
-                               *pci_gart = cpu_to_le32(page_base);
                                break;
                        }
+                       *pci_gart = cpu_to_le32(page_base);
                        pci_gart++;
-                       page_base += ATI_PCIGART_PAGE_SIZE;
+                       entry_addr += ATI_PCIGART_PAGE_SIZE;
                }
        }