Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6:
via: Make sure we flush write-combining using a follow-up read.
via: Try to improve command-buffer chaining.
drm: remove old taskqueue remnant
drm: rename badly named define and cleanup ioctl code spacing
radeon: Don't mess up page flipping when a file descriptor is closed.
drm/radeon: upgrade to 1.27 - make PCI GART more flexible

+224 -154
+45 -39
drivers/char/drm/ati_pcigart.c
··· 33 33 34 34 #include "drmP.h" 35 35 36 - #if PAGE_SIZE == 65536 37 - # define ATI_PCIGART_TABLE_ORDER 0 38 - # define ATI_PCIGART_TABLE_PAGES (1 << 0) 39 - #elif PAGE_SIZE == 16384 40 - # define ATI_PCIGART_TABLE_ORDER 1 41 - # define ATI_PCIGART_TABLE_PAGES (1 << 1) 42 - #elif PAGE_SIZE == 8192 43 - # define ATI_PCIGART_TABLE_ORDER 2 44 - # define ATI_PCIGART_TABLE_PAGES (1 << 2) 45 - #elif PAGE_SIZE == 4096 46 - # define ATI_PCIGART_TABLE_ORDER 3 47 - # define ATI_PCIGART_TABLE_PAGES (1 << 3) 48 - #else 49 - # error - PAGE_SIZE not 64K, 16K, 8K or 4K 50 - #endif 51 - 52 - # define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */ 53 36 # define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */ 54 37 55 - static void *drm_ati_alloc_pcigart_table(void) 38 + static void *drm_ati_alloc_pcigart_table(int order) 56 39 { 57 40 unsigned long address; 58 41 struct page *page; 59 42 int i; 60 - DRM_DEBUG("%s\n", __FUNCTION__); 43 + 44 + DRM_DEBUG("%s: alloc %d order\n", __FUNCTION__, order); 61 45 62 46 address = __get_free_pages(GFP_KERNEL | __GFP_COMP, 63 - ATI_PCIGART_TABLE_ORDER); 47 + order); 64 48 if (address == 0UL) { 65 49 return NULL; 66 50 } 67 51 68 52 page = virt_to_page(address); 69 53 70 - for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) 54 + for (i = 0; i < order; i++, page++) 71 55 SetPageReserved(page); 72 56 73 57 DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address); 74 58 return (void *)address; 75 59 } 76 60 77 - static void drm_ati_free_pcigart_table(void *address) 61 + static void drm_ati_free_pcigart_table(void *address, int order) 78 62 { 79 63 struct page *page; 80 64 int i; 65 + int num_pages = 1 << order; 81 66 DRM_DEBUG("%s\n", __FUNCTION__); 82 67 83 68 page = virt_to_page((unsigned long)address); 84 69 85 - for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) 70 + for (i = 0; i < num_pages; i++, page++) 86 71 ClearPageReserved(page); 87 72 88 - free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER); 73 + free_pages((unsigned long)address, order); 89 74 } 90 75 91 76 int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info) ··· 78 93 drm_sg_mem_t *entry = dev->sg; 79 94 unsigned long pages; 80 95 int i; 96 + int order; 97 + int num_pages, max_pages; 81 98 82 99 /* we need to support large memory configurations */ 83 100 if (!entry) { ··· 87 100 return 0; 88 101 } 89 102 103 + order = drm_order((gart_info->table_size + (PAGE_SIZE-1)) / PAGE_SIZE); 104 + num_pages = 1 << order; 105 + 90 106 if (gart_info->bus_addr) { 91 107 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) { 92 108 pci_unmap_single(dev->pdev, gart_info->bus_addr, 93 - ATI_PCIGART_TABLE_PAGES * PAGE_SIZE, 109 + num_pages * PAGE_SIZE, 94 110 PCI_DMA_TODEVICE); 95 111 } 96 112 97 - pages = (entry->pages <= ATI_MAX_PCIGART_PAGES) 98 - ? entry->pages : ATI_MAX_PCIGART_PAGES; 113 + max_pages = (gart_info->table_size / sizeof(u32)); 114 + pages = (entry->pages <= max_pages) 115 + ? entry->pages : max_pages; 99 116 100 117 for (i = 0; i < pages; i++) { 101 118 if (!entry->busaddr[i]) ··· 114 123 115 124 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN 116 125 && gart_info->addr) { 117 - drm_ati_free_pcigart_table(gart_info->addr); 126 + drm_ati_free_pcigart_table(gart_info->addr, order); 118 127 gart_info->addr = NULL; 119 128 } 120 129 121 130 return 1; 122 131 } 123 - 124 132 EXPORT_SYMBOL(drm_ati_pcigart_cleanup); 125 133 126 134 int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) ··· 129 139 unsigned long pages; 130 140 u32 *pci_gart, page_base, bus_address = 0; 131 141 int i, j, ret = 0; 142 + int order; 143 + int max_pages; 144 + int num_pages; 132 145 133 146 if (!entry) { 134 147 DRM_ERROR("no scatter/gather memory!\n"); ··· 141 148 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) { 142 149 DRM_DEBUG("PCI: no table in VRAM: using normal RAM\n"); 143 150 144 - address = drm_ati_alloc_pcigart_table(); 151 + order = drm_order((gart_info->table_size + 152 + (PAGE_SIZE-1)) / PAGE_SIZE); 153 + num_pages = 1 << order; 154 + address = drm_ati_alloc_pcigart_table(order); 145 155 if (!address) { 146 156 DRM_ERROR("cannot allocate PCI GART page!\n"); 147 157 goto done; ··· 156 160 } 157 161 158 162 bus_address = pci_map_single(dev->pdev, address, 159 - ATI_PCIGART_TABLE_PAGES * 160 - PAGE_SIZE, PCI_DMA_TODEVICE); 163 + num_pages * PAGE_SIZE, 164 + PCI_DMA_TODEVICE); 161 165 if (bus_address == 0) { 162 166 DRM_ERROR("unable to map PCIGART pages!\n"); 163 - drm_ati_free_pcigart_table(address); 167 + order = drm_order((gart_info->table_size + 168 + (PAGE_SIZE-1)) / PAGE_SIZE); 169 + drm_ati_free_pcigart_table(address, order); 164 170 address = NULL; 165 171 goto done; 166 172 } ··· 175 177 176 178 pci_gart = (u32 *) address; 177 179 178 - pages = (entry->pages <= ATI_MAX_PCIGART_PAGES) 179 - ? entry->pages : ATI_MAX_PCIGART_PAGES; 180 + max_pages = (gart_info->table_size / sizeof(u32)); 181 + pages = (entry->pages <= max_pages) 182 + ? entry->pages : max_pages; 180 183 181 - memset(pci_gart, 0, ATI_MAX_PCIGART_PAGES * sizeof(u32)); 184 + memset(pci_gart, 0, max_pages * sizeof(u32)); 182 185 183 186 for (i = 0; i < pages; i++) { 184 187 /* we need to support large memory configurations */ ··· 197 198 page_base = (u32) entry->busaddr[i]; 198 199 199 200 for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) { 200 - if (gart_info->is_pcie) 201 + switch(gart_info->gart_reg_if) { 202 + case DRM_ATI_GART_IGP: 203 + *pci_gart = cpu_to_le32((page_base) | 0xc); 204 + break; 205 + case DRM_ATI_GART_PCIE: 201 206 *pci_gart = cpu_to_le32((page_base >> 8) | 0xc); 202 - else 207 + break; 208 + default: 209 + case DRM_ATI_GART_PCI: 203 210 *pci_gart = cpu_to_le32(page_base); 211 + break; 212 + } 204 213 pci_gart++; 205 214 page_base += ATI_PCIGART_PAGE_SIZE; 206 215 } ··· 227 220 gart_info->bus_addr = bus_address; 228 221 return ret; 229 222 } 230 - 231 223 EXPORT_SYMBOL(drm_ati_pcigart_init);
+6 -1
drivers/char/drm/drmP.h
··· 519 519 #define DRM_ATI_GART_MAIN 1 520 520 #define DRM_ATI_GART_FB 2 521 521 522 + #define DRM_ATI_GART_PCI 1 523 + #define DRM_ATI_GART_PCIE 2 524 + #define DRM_ATI_GART_IGP 3 525 + 522 526 typedef struct ati_pcigart_info { 523 527 int gart_table_location; 524 - int is_pcie; 528 + int gart_reg_if; 525 529 void *addr; 526 530 dma_addr_t bus_addr; 527 531 drm_local_map_t mapping; 532 + int table_size; 528 533 } drm_ati_pcigart_info; 529 534 530 535 /*
+4 -6
drivers/char/drm/drm_drv.c
··· 15 15 * #define DRIVER_DESC "Matrox G200/G400" 16 16 * #define DRIVER_DATE "20001127" 17 17 * 18 - * #define DRIVER_IOCTL_COUNT DRM_ARRAY_SIZE( mga_ioctls ) 19 - * 20 18 * #define drm_x mga_##x 21 19 * \endcode 22 20 */ ··· 118 120 [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW)] = {drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, 119 121 }; 120 122 121 - #define DRIVER_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) 123 + #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) 122 124 123 125 /** 124 126 * Take down the DRM device. ··· 494 496 (long)old_encode_dev(priv->head->device), 495 497 priv->authenticated); 496 498 497 - if ((nr >= DRIVER_IOCTL_COUNT) && 499 + if ((nr >= DRM_CORE_IOCTL_COUNT) && 498 500 ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END))) 499 501 goto err_i1; 500 - if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) 501 - && (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) 502 + if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) && 503 + (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) 502 504 ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; 503 505 else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) 504 506 ioctl = &drm_ioctls[nr];
-3
drivers/char/drm/drm_os_linux.h
··· 70 70 71 71 #endif 72 72 73 - /** Task queue handler arguments */ 74 - #define DRM_TASKQUEUE_ARGS void *arg 75 - 76 73 /** For data going into the kernel through the ioctl argument */ 77 74 #define DRM_COPY_FROM_USER_IOCTL(arg1, arg2, arg3) \ 78 75 if ( copy_from_user(&arg1, arg2, arg3) ) \
+1
drivers/char/drm/drm_pciids.h
··· 102 102 {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 103 103 {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ 104 104 {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ 105 + {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ 105 106 {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 106 107 {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 107 108 {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
+2 -1
drivers/char/drm/r128_cce.c
··· 560 560 if (dev_priv->is_pci) { 561 561 #endif 562 562 dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN; 563 + dev_priv->gart_info.table_size = R128_PCIGART_TABLE_SIZE; 563 564 dev_priv->gart_info.addr = NULL; 564 565 dev_priv->gart_info.bus_addr = 0; 565 - dev_priv->gart_info.is_pcie = 0; 566 + dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI; 566 567 if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) { 567 568 DRM_ERROR("failed to init PCI GART!\n"); 568 569 dev->dev_private = (void *)dev_priv;
+2
drivers/char/drm/r128_drv.h
··· 383 383 384 384 #define R128_PERFORMANCE_BOXES 0 385 385 386 + #define R128_PCIGART_TABLE_SIZE 32768 387 + 386 388 #define R128_READ(reg) DRM_READ32( dev_priv->mmio, (reg) ) 387 389 #define R128_WRITE(reg,val) DRM_WRITE32( dev_priv->mmio, (reg), (val) ) 388 390 #define R128_READ8(reg) DRM_READ8( dev_priv->mmio, (reg) )
+65 -6
drivers/char/drm/radeon_cp.c
··· 830 830 return RADEON_READ(RADEON_PCIE_DATA); 831 831 } 832 832 833 + static u32 RADEON_READ_IGPGART(drm_radeon_private_t *dev_priv, int addr) 834 + { 835 + u32 ret; 836 + RADEON_WRITE(RADEON_IGPGART_INDEX, addr & 0x7f); 837 + ret = RADEON_READ(RADEON_IGPGART_DATA); 838 + RADEON_WRITE(RADEON_IGPGART_INDEX, 0x7f); 839 + return ret; 840 + } 841 + 833 842 #if RADEON_FIFO_DEBUG 834 843 static void radeon_status(drm_radeon_private_t * dev_priv) 835 844 { ··· 1276 1267 } 1277 1268 } 1278 1269 1279 - /* Enable or disable PCI-E GART on the chip */ 1270 + /* Enable or disable IGP GART on the chip */ 1271 + static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on) 1272 + { 1273 + u32 temp, tmp; 1274 + 1275 + tmp = RADEON_READ(RADEON_AIC_CNTL); 1276 + if (on) { 1277 + DRM_DEBUG("programming igpgart %08X %08lX %08X\n", 1278 + dev_priv->gart_vm_start, 1279 + (long)dev_priv->gart_info.bus_addr, 1280 + dev_priv->gart_size); 1281 + 1282 + RADEON_WRITE_IGPGART(RADEON_IGPGART_UNK_18, 0x1000); 1283 + RADEON_WRITE_IGPGART(RADEON_IGPGART_ENABLE, 0x1); 1284 + RADEON_WRITE_IGPGART(RADEON_IGPGART_CTRL, 0x42040800); 1285 + RADEON_WRITE_IGPGART(RADEON_IGPGART_BASE_ADDR, 1286 + dev_priv->gart_info.bus_addr); 1287 + 1288 + temp = RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_UNK_39); 1289 + RADEON_WRITE_IGPGART(RADEON_IGPGART_UNK_39, temp); 1290 + 1291 + RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev_priv->gart_vm_start); 1292 + dev_priv->gart_size = 32*1024*1024; 1293 + RADEON_WRITE(RADEON_MC_AGP_LOCATION, 1294 + (((dev_priv->gart_vm_start - 1 + 1295 + dev_priv->gart_size) & 0xffff0000) | 1296 + (dev_priv->gart_vm_start >> 16))); 1297 + 1298 + temp = RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_ENABLE); 1299 + RADEON_WRITE_IGPGART(RADEON_IGPGART_ENABLE, temp); 1300 + 1301 + RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_FLUSH); 1302 + RADEON_WRITE_IGPGART(RADEON_IGPGART_FLUSH, 0x1); 1303 + RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_FLUSH); 1304 + RADEON_WRITE_IGPGART(RADEON_IGPGART_FLUSH, 0x0); 1305 + } 1306 + } 1307 + 1280 1308 static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on) 1281 1309 { 1282 1310 u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL); ··· 1347 1301 static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on) 1348 1302 { 1349 1303 u32 tmp; 1304 + 1305 + if (dev_priv->flags & RADEON_IS_IGPGART) { 1306 + radeon_set_igpgart(dev_priv, on); 1307 + return; 1308 + } 1350 1309 1351 1310 if (dev_priv->flags & RADEON_IS_PCIE) { 1352 1311 radeon_set_pciegart(dev_priv, on); ··· 1671 1620 #endif 1672 1621 { 1673 1622 /* if we have an offset set from userspace */ 1674 - if (dev_priv->pcigart_offset) { 1623 + if (dev_priv->pcigart_offset_set) { 1675 1624 dev_priv->gart_info.bus_addr = 1676 1625 dev_priv->pcigart_offset + dev_priv->fb_location; 1677 1626 dev_priv->gart_info.mapping.offset = 1678 1627 dev_priv->gart_info.bus_addr; 1679 1628 dev_priv->gart_info.mapping.size = 1680 - RADEON_PCIGART_TABLE_SIZE; 1629 + dev_priv->gart_info.table_size; 1681 1630 1682 1631 drm_core_ioremap(&dev_priv->gart_info.mapping, dev); 1683 1632 dev_priv->gart_info.addr = 1684 1633 dev_priv->gart_info.mapping.handle; 1685 1634 1686 - dev_priv->gart_info.is_pcie = 1687 - !!(dev_priv->flags & RADEON_IS_PCIE); 1635 + if (dev_priv->flags & RADEON_IS_PCIE) 1636 + dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCIE; 1637 + else 1638 + dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI; 1688 1639 dev_priv->gart_info.gart_table_location = 1689 1640 DRM_ATI_GART_FB; 1690 1641 ··· 1694 1641 dev_priv->gart_info.addr, 1695 1642 dev_priv->pcigart_offset); 1696 1643 } else { 1644 + if (dev_priv->flags & RADEON_IS_IGPGART) 1645 + dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP; 1646 + else 1647 + dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI; 1697 1648 dev_priv->gart_info.gart_table_location = 1698 1649 DRM_ATI_GART_MAIN; 1699 1650 dev_priv->gart_info.addr = NULL; ··· 1771 1714 if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) 1772 1715 { 1773 1716 drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev); 1774 - dev_priv->gart_info.addr = NULL; 1717 + dev_priv->gart_info.addr = 0; 1775 1718 } 1776 1719 } 1777 1720 /* only clear to the start of flags */ ··· 2278 2221 int ret; 2279 2222 drm_local_map_t *map; 2280 2223 drm_radeon_private_t *dev_priv = dev->dev_private; 2224 + 2225 + dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE; 2281 2226 2282 2227 ret = drm_addmap(dev, drm_get_resource_start(dev, 2), 2283 2228 drm_get_resource_len(dev, 2), _DRM_REGISTERS,
+1
drivers/char/drm/radeon_drm.h
··· 707 707 #define RADEON_SETPARAM_SWITCH_TILING 2 /* enable/disable color tiling */ 708 708 #define RADEON_SETPARAM_PCIGART_LOCATION 3 /* PCI Gart Location */ 709 709 #define RADEON_SETPARAM_NEW_MEMMAP 4 /* Use new memory map */ 710 + #define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5 /* PCI GART Table Size */ 710 711 711 712 /* 1.14: Clients can allocate/free a surface 712 713 */
+22 -2
drivers/char/drm/radeon_drv.h
··· 95 95 * 1.24- Add general-purpose packet for manipulating scratch registers (r300) 96 96 * 1.25- Add support for r200 vertex programs (R200_EMIT_VAP_PVS_CNTL, 97 97 * new packet type) 98 + * 1.26- Add support for variable size PCI(E) gart aperture 99 + * 1.27- Add support for IGP GART 98 100 */ 99 101 #define DRIVER_MAJOR 1 100 - #define DRIVER_MINOR 25 102 + #define DRIVER_MINOR 27 101 103 #define DRIVER_PATCHLEVEL 0 102 104 103 105 /* ··· 145 143 RADEON_IS_PCIE = 0x00200000UL, 146 144 RADEON_NEW_MEMMAP = 0x00400000UL, 147 145 RADEON_IS_PCI = 0x00800000UL, 146 + RADEON_IS_IGPGART = 0x01000000UL, 148 147 }; 149 148 150 149 #define GET_RING_HEAD(dev_priv) (dev_priv->writeback_works ? \ ··· 243 240 244 241 int do_boxes; 245 242 int page_flipping; 246 - int current_page; 247 243 248 244 u32 color_fmt; 249 245 unsigned int front_offset; ··· 282 280 struct radeon_virt_surface virt_surfaces[2 * RADEON_MAX_SURFACES]; 283 281 284 282 unsigned long pcigart_offset; 283 + unsigned int pcigart_offset_set; 285 284 drm_ati_pcigart_info gart_info; 286 285 287 286 u32 scratch_ages[5]; ··· 434 431 #define RADEON_PCIE_TX_GART_START_HI 0x15 435 432 #define RADEON_PCIE_TX_GART_END_LO 0x16 436 433 #define RADEON_PCIE_TX_GART_END_HI 0x17 434 + 435 + #define RADEON_IGPGART_INDEX 0x168 436 + #define RADEON_IGPGART_DATA 0x16c 437 + #define RADEON_IGPGART_UNK_18 0x18 438 + #define RADEON_IGPGART_CTRL 0x2b 439 + #define RADEON_IGPGART_BASE_ADDR 0x2c 440 + #define RADEON_IGPGART_FLUSH 0x2e 441 + #define RADEON_IGPGART_ENABLE 0x38 442 + #define RADEON_IGPGART_UNK_39 0x39 437 443 438 444 #define RADEON_MPP_TB_CONFIG 0x01c0 439 445 #define RADEON_MEM_CNTL 0x0140 ··· 974 962 RADEON_WRITE8( RADEON_CLOCK_CNTL_INDEX, \ 975 963 ((addr) & 0x1f) | RADEON_PLL_WR_EN ); \ 976 964 RADEON_WRITE( RADEON_CLOCK_CNTL_DATA, (val) ); \ 965 + } while (0) 966 + 967 + #define RADEON_WRITE_IGPGART( addr, val ) \ 968 + do { \ 969 + RADEON_WRITE( RADEON_IGPGART_INDEX, \ 970 + ((addr) & 0x7f) | (1 << 8)); \ 971 + RADEON_WRITE( RADEON_IGPGART_DATA, (val) ); \ 972 + RADEON_WRITE( RADEON_IGPGART_INDEX, 0x7f ); \ 977 973 } while (0) 978 974 979 975 #define RADEON_WRITE_PCIE( addr, val ) \
+25 -27
drivers/char/drm/radeon_state.c
··· 773 773 RADEON_GMC_SRC_DATATYPE_COLOR | 774 774 RADEON_ROP3_P | RADEON_GMC_CLR_CMP_CNTL_DIS); 775 775 776 - if (dev_priv->page_flipping && dev_priv->current_page == 1) { 776 + if (dev_priv->sarea_priv->pfCurrentPage == 1) { 777 777 OUT_RING(dev_priv->front_pitch_offset); 778 778 } else { 779 779 OUT_RING(dev_priv->back_pitch_offset); ··· 861 861 862 862 dev_priv->stats.clears++; 863 863 864 - if (dev_priv->page_flipping && dev_priv->current_page == 1) { 864 + if (dev_priv->sarea_priv->pfCurrentPage == 1) { 865 865 unsigned int tmp = flags; 866 866 867 867 flags &= ~(RADEON_FRONT | RADEON_BACK); ··· 1382 1382 /* Make this work even if front & back are flipped: 1383 1383 */ 1384 1384 OUT_RING(CP_PACKET0(RADEON_SRC_PITCH_OFFSET, 1)); 1385 - if (dev_priv->current_page == 0) { 1385 + if (dev_priv->sarea_priv->pfCurrentPage == 0) { 1386 1386 OUT_RING(dev_priv->back_pitch_offset); 1387 1387 OUT_RING(dev_priv->front_pitch_offset); 1388 1388 } else { ··· 1416 1416 { 1417 1417 drm_radeon_private_t *dev_priv = dev->dev_private; 1418 1418 drm_sarea_t *sarea = (drm_sarea_t *) dev_priv->sarea->handle; 1419 - int offset = (dev_priv->current_page == 1) 1419 + int offset = (dev_priv->sarea_priv->pfCurrentPage == 1) 1420 1420 ? dev_priv->front_offset : dev_priv->back_offset; 1421 1421 RING_LOCALS; 1422 - DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n", 1422 + DRM_DEBUG("%s: pfCurrentPage=%d\n", 1423 1423 __FUNCTION__, 1424 - dev_priv->current_page, dev_priv->sarea_priv->pfCurrentPage); 1424 + dev_priv->sarea_priv->pfCurrentPage); 1425 1425 1426 1426 /* Do some trivial performance monitoring... 1427 1427 */ ··· 1449 1449 * performing the swapbuffer ioctl. 1450 1450 */ 1451 1451 dev_priv->sarea_priv->last_frame++; 1452 - dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page = 1453 - 1 - dev_priv->current_page; 1452 + dev_priv->sarea_priv->pfCurrentPage = 1453 + 1 - dev_priv->sarea_priv->pfCurrentPage; 1454 1454 1455 1455 BEGIN_RING(2); 1456 1456 ··· 2152 2152 ADVANCE_RING(); 2153 2153 2154 2154 dev_priv->page_flipping = 1; 2155 - dev_priv->current_page = 0; 2156 - dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page; 2157 2155 2158 - return 0; 2159 - } 2156 + if (dev_priv->sarea_priv->pfCurrentPage != 1) 2157 + dev_priv->sarea_priv->pfCurrentPage = 0; 2160 2158 2161 - /* Called whenever a client dies, from drm_release. 2162 - * NOTE: Lock isn't necessarily held when this is called! 2163 - */ 2164 - static int radeon_do_cleanup_pageflip(drm_device_t * dev) 2165 - { 2166 - drm_radeon_private_t *dev_priv = dev->dev_private; 2167 - DRM_DEBUG("\n"); 2168 - 2169 - if (dev_priv->current_page != 0) 2170 - radeon_cp_dispatch_flip(dev); 2171 - 2172 - dev_priv->page_flipping = 0; 2173 2159 return 0; 2174 2160 } 2175 2161 ··· 3131 3145 break; 3132 3146 case RADEON_SETPARAM_PCIGART_LOCATION: 3133 3147 dev_priv->pcigart_offset = sp.value; 3148 + dev_priv->pcigart_offset_set = 1; 3134 3149 break; 3135 3150 case RADEON_SETPARAM_NEW_MEMMAP: 3136 3151 dev_priv->new_memmap = sp.value; 3152 + break; 3153 + case RADEON_SETPARAM_PCIGART_TABLE_SIZE: 3154 + dev_priv->gart_info.table_size = sp.value; 3155 + if (dev_priv->gart_info.table_size < RADEON_PCIGART_TABLE_SIZE) 3156 + dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE; 3137 3157 break; 3138 3158 default: 3139 3159 DRM_DEBUG("Invalid parameter %d\n", sp.param); ··· 3160 3168 { 3161 3169 if (dev->dev_private) { 3162 3170 drm_radeon_private_t *dev_priv = dev->dev_private; 3163 - if (dev_priv->page_flipping) { 3164 - radeon_do_cleanup_pageflip(dev); 3165 - } 3171 + dev_priv->page_flipping = 0; 3166 3172 radeon_mem_release(filp, dev_priv->gart_heap); 3167 3173 radeon_mem_release(filp, dev_priv->fb_heap); 3168 3174 radeon_surfaces_release(filp, dev_priv); ··· 3169 3179 3170 3180 void radeon_driver_lastclose(drm_device_t * dev) 3171 3181 { 3182 + if (dev->dev_private) { 3183 + drm_radeon_private_t *dev_priv = dev->dev_private; 3184 + 3185 + if (dev_priv->sarea_priv && 3186 + dev_priv->sarea_priv->pfCurrentPage != 0) 3187 + radeon_cp_dispatch_flip(dev); 3188 + } 3189 + 3172 3190 radeon_do_release(dev); 3173 3191 } 3174 3192
+48 -67
drivers/char/drm/via_dma.c
··· 252 252 break; 253 253 case VIA_DMA_INITIALIZED: 254 254 retcode = (dev_priv->ring.virtual_start != NULL) ? 255 - 0 : DRM_ERR(EFAULT); 255 + 0 : DRM_ERR(EFAULT); 256 256 break; 257 257 default: 258 258 retcode = DRM_ERR(EINVAL); ··· 432 432 { 433 433 int paused, count; 434 434 volatile uint32_t *paused_at = dev_priv->last_pause_ptr; 435 - 436 - via_flush_write_combine(); 437 - while (!*(via_get_dma(dev_priv) - 1)) ; 438 - *dev_priv->last_pause_ptr = pause_addr_lo; 439 - via_flush_write_combine(); 440 - 441 - /* 442 - * The below statement is inserted to really force the flush. 443 - * Not sure it is needed. 444 - */ 445 - 446 - while (!*dev_priv->last_pause_ptr) ; 447 - dev_priv->last_pause_ptr = via_get_dma(dev_priv) - 1; 448 - while (!*dev_priv->last_pause_ptr) ; 435 + uint32_t reader,ptr; 449 436 450 437 paused = 0; 451 - count = 20; 438 + via_flush_write_combine(); 439 + (void) *(volatile uint32_t *)(via_get_dma(dev_priv) -1); 440 + *paused_at = pause_addr_lo; 441 + via_flush_write_combine(); 442 + (void) *paused_at; 443 + reader = *(dev_priv->hw_addr_ptr); 444 + ptr = ((volatile char *)paused_at - dev_priv->dma_ptr) + 445 + dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4; 446 + dev_priv->last_pause_ptr = via_get_dma(dev_priv) - 1; 452 447 453 - while (!(paused = (VIA_READ(0x41c) & 0x80000000)) && count--) ; 454 - if ((count <= 8) && (count >= 0)) { 455 - uint32_t rgtr, ptr; 456 - rgtr = *(dev_priv->hw_addr_ptr); 457 - ptr = ((volatile char *)dev_priv->last_pause_ptr - 458 - dev_priv->dma_ptr) + dev_priv->dma_offset + 459 - (uint32_t) dev_priv->agpAddr + 4 - CMDBUF_ALIGNMENT_SIZE; 460 - if (rgtr <= ptr) { 461 - DRM_ERROR 462 - ("Command regulator\npaused at count %d, address %x, " 463 - "while current pause address is %x.\n" 464 - "Please mail this message to " 465 - "<unichrome-devel@lists.sourceforge.net>\n", count, 466 - rgtr, ptr); 467 - } 448 + if ((ptr - reader) <= dev_priv->dma_diff ) { 449 + count = 10000000; 450 + while (!(paused = (VIA_READ(0x41c) & 0x80000000)) && count--); 468 451 } 469 452 470 453 if (paused && !no_pci_fire) { 471 - uint32_t rgtr, ptr; 472 - uint32_t ptr_low; 454 + reader = *(dev_priv->hw_addr_ptr); 455 + if ((ptr - reader) == dev_priv->dma_diff) { 473 456 474 - count = 1000000; 475 - while ((VIA_READ(VIA_REG_STATUS) & VIA_CMD_RGTR_BUSY) 476 - && count--) ; 457 + /* 458 + * There is a concern that these writes may stall the PCI bus 459 + * if the GPU is not idle. However, idling the GPU first 460 + * doesn't make a difference. 461 + */ 477 462 478 - rgtr = *(dev_priv->hw_addr_ptr); 479 - ptr = ((volatile char *)paused_at - dev_priv->dma_ptr) + 480 - dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4; 481 - 482 - ptr_low = (ptr > 3 * CMDBUF_ALIGNMENT_SIZE) ? 483 - ptr - 3 * CMDBUF_ALIGNMENT_SIZE : 0; 484 - if (rgtr <= ptr && rgtr >= ptr_low) { 485 463 VIA_WRITE(VIA_REG_TRANSET, (HC_ParaType_PreCR << 16)); 486 464 VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_hi); 487 465 VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_lo); ··· 472 494 static int via_wait_idle(drm_via_private_t * dev_priv) 473 495 { 474 496 int count = 10000000; 497 + 498 + while (!(VIA_READ(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && count--); 499 + 475 500 while (count-- && (VIA_READ(VIA_REG_STATUS) & 476 501 (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | 477 502 VIA_3D_ENG_BUSY))) ; ··· 518 537 uint32_t end_addr, end_addr_lo; 519 538 uint32_t command; 520 539 uint32_t agp_base; 540 + uint32_t ptr; 541 + uint32_t reader; 542 + int count; 521 543 522 544 dev_priv->dma_low = 0; 523 545 ··· 538 554 &pause_addr_hi, &pause_addr_lo, 1) - 1; 539 555 540 556 via_flush_write_combine(); 541 - while (!*dev_priv->last_pause_ptr) ; 557 + (void) *(volatile uint32_t *)dev_priv->last_pause_ptr; 542 558 543 559 VIA_WRITE(VIA_REG_TRANSET, (HC_ParaType_PreCR << 16)); 544 560 VIA_WRITE(VIA_REG_TRANSPACE, command); ··· 550 566 DRM_WRITEMEMORYBARRIER(); 551 567 VIA_WRITE(VIA_REG_TRANSPACE, command | HC_HAGPCMNT_MASK); 552 568 VIA_READ(VIA_REG_TRANSPACE); 569 + 570 + dev_priv->dma_diff = 0; 571 + 572 + count = 10000000; 573 + while (!(VIA_READ(0x41c) & 0x80000000) && count--); 574 + 575 + reader = *(dev_priv->hw_addr_ptr); 576 + ptr = ((volatile char *)dev_priv->last_pause_ptr - dev_priv->dma_ptr) + 577 + dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4; 578 + 579 + /* 580 + * This is the difference between where we tell the 581 + * command reader to pause and where it actually pauses. 582 + * This differs between hw implementation so we need to 583 + * detect it. 584 + */ 585 + 586 + dev_priv->dma_diff = ptr - reader; 553 587 } 554 588 555 589 static void via_pad_cache(drm_via_private_t * dev_priv, int qwords) ··· 594 592 uint32_t pause_addr_lo, pause_addr_hi; 595 593 uint32_t jump_addr_lo, jump_addr_hi; 596 594 volatile uint32_t *last_pause_ptr; 597 - uint32_t dma_low_save1, dma_low_save2; 598 595 599 596 agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; 600 597 via_align_cmd(dev_priv, HC_HAGPBpID_JUMP, 0, &jump_addr_hi, ··· 620 619 &pause_addr_lo, 0); 621 620 622 621 *last_pause_ptr = pause_addr_lo; 623 - dma_low_save1 = dev_priv->dma_low; 624 622 625 - /* 626 - * Now, set a trap that will pause the regulator if it tries to rerun the old 627 - * command buffer. (Which may happen if via_hook_segment detecs a command regulator pause 628 - * and reissues the jump command over PCI, while the regulator has already taken the jump 629 - * and actually paused at the current buffer end). 630 - * There appears to be no other way to detect this condition, since the hw_addr_pointer 631 - * does not seem to get updated immediately when a jump occurs. 632 - */ 633 - 634 - last_pause_ptr = 635 - via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, 636 - &pause_addr_lo, 0) - 1; 637 - via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, 638 - &pause_addr_lo, 0); 639 - *last_pause_ptr = pause_addr_lo; 640 - 641 - dma_low_save2 = dev_priv->dma_low; 642 - dev_priv->dma_low = dma_low_save1; 643 - via_hook_segment(dev_priv, jump_addr_hi, jump_addr_lo, 0); 644 - dev_priv->dma_low = dma_low_save2; 645 - via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0); 623 + via_hook_segment( dev_priv, jump_addr_hi, jump_addr_lo, 0); 646 624 } 625 + 647 626 648 627 static void via_cmdbuf_rewind(drm_via_private_t * dev_priv) 649 628 {
+3 -2
drivers/char/drm/via_drv.h
··· 29 29 30 30 #define DRIVER_NAME "via" 31 31 #define DRIVER_DESC "VIA Unichrome / Pro" 32 - #define DRIVER_DATE "20061227" 32 + #define DRIVER_DATE "20070202" 33 33 34 34 #define DRIVER_MAJOR 2 35 35 #define DRIVER_MINOR 11 36 - #define DRIVER_PATCHLEVEL 0 36 + #define DRIVER_PATCHLEVEL 1 37 37 38 38 #include "via_verifier.h" 39 39 ··· 93 93 unsigned long vram_offset; 94 94 unsigned long agp_offset; 95 95 drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES]; 96 + uint32_t dma_diff; 96 97 } drm_via_private_t; 97 98 98 99 enum via_family {