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

* 'drm-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
drm: remove drm_{alloc,free}_pages
drm: sis fix compile warning
drm: add new radeon PCI ids..
drm: read breadcrumb in IRQ handler
drm: fixup i915 breadcrumb read/write
drm: remove pointless checks in radeon_state
drm: fixup improper cast.
drm: rationalise some pci ids
drm: Add general-purpose packet for manipulating scratch registers (r300)
drm: rework radeon memory map (radeon 1.23)
drm: update r300 register names
drm: fixup PCI DMA support

+414 -319
+7 -9
drivers/char/drm/drmP.h
··· 357 357 spinlock_t lock; 358 358 } drm_freelist_t; 359 359 360 + typedef struct drm_dma_handle { 361 + dma_addr_t busaddr; 362 + void *vaddr; 363 + size_t size; 364 + } drm_dma_handle_t; 365 + 360 366 /** 361 367 * Buffer entry. There is one of this for each buffer size order. 362 368 */ ··· 372 366 drm_buf_t *buflist; /**< buffer list */ 373 367 int seg_count; 374 368 int page_order; 375 - unsigned long *seglist; 369 + drm_dma_handle_t **seglist; 376 370 377 371 drm_freelist_t freelist; 378 372 } drm_buf_entry_t; ··· 488 482 int context; 489 483 drm_hw_lock_t *lock; 490 484 } drm_sigdata_t; 491 - 492 - typedef struct drm_dma_handle { 493 - dma_addr_t busaddr; 494 - void *vaddr; 495 - size_t size; 496 - } drm_dma_handle_t; 497 485 498 486 /** 499 487 * Mappings list ··· 813 813 extern int drm_mem_info(char *buf, char **start, off_t offset, 814 814 int request, int *eof, void *data); 815 815 extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area); 816 - extern unsigned long drm_alloc_pages(int order, int area); 817 - extern void drm_free_pages(unsigned long address, int order, int area); 818 816 extern void *drm_ioremap(unsigned long offset, unsigned long size, 819 817 drm_device_t * dev); 820 818 extern void *drm_ioremap_nocache(unsigned long offset, unsigned long size,
+11 -9
drivers/char/drm/drm_bufs.c
··· 474 474 if (entry->seg_count) { 475 475 for (i = 0; i < entry->seg_count; i++) { 476 476 if (entry->seglist[i]) { 477 - drm_free_pages(entry->seglist[i], 478 - entry->page_order, DRM_MEM_DMA); 477 + drm_pci_free(dev, entry->seglist[i]); 479 478 } 480 479 } 481 480 drm_free(entry->seglist, ··· 677 678 int total; 678 679 int page_order; 679 680 drm_buf_entry_t *entry; 680 - unsigned long page; 681 + drm_dma_handle_t *dmah; 681 682 drm_buf_t *buf; 682 683 int alignment; 683 684 unsigned long offset; ··· 780 781 page_count = 0; 781 782 782 783 while (entry->buf_count < count) { 783 - page = drm_alloc_pages(page_order, DRM_MEM_DMA); 784 - if (!page) { 784 + 785 + dmah = drm_pci_alloc(dev, PAGE_SIZE << page_order, 0x1000, 0xfffffffful); 786 + 787 + if (!dmah) { 785 788 /* Set count correctly so we free the proper amount. */ 786 789 entry->buf_count = count; 787 790 entry->seg_count = count; ··· 795 794 atomic_dec(&dev->buf_alloc); 796 795 return -ENOMEM; 797 796 } 798 - entry->seglist[entry->seg_count++] = page; 797 + entry->seglist[entry->seg_count++] = dmah; 799 798 for (i = 0; i < (1 << page_order); i++) { 800 799 DRM_DEBUG("page %d @ 0x%08lx\n", 801 800 dma->page_count + page_count, 802 - page + PAGE_SIZE * i); 801 + (unsigned long)dmah->vaddr + PAGE_SIZE * i); 803 802 temp_pagelist[dma->page_count + page_count++] 804 - = page + PAGE_SIZE * i; 803 + = (unsigned long)dmah->vaddr + PAGE_SIZE * i; 805 804 } 806 805 for (offset = 0; 807 806 offset + size <= total && entry->buf_count < count; ··· 812 811 buf->order = order; 813 812 buf->used = 0; 814 813 buf->offset = (dma->byte_count + byte_count + offset); 815 - buf->address = (void *)(page + offset); 814 + buf->address = (void *)(dmah->vaddr + offset); 815 + buf->bus_address = dmah->busaddr + offset; 816 816 buf->next = NULL; 817 817 buf->waiting = 0; 818 818 buf->pending = 0;
+1 -3
drivers/char/drm/drm_dma.c
··· 85 85 dma->bufs[i].seg_count); 86 86 for (j = 0; j < dma->bufs[i].seg_count; j++) { 87 87 if (dma->bufs[i].seglist[j]) { 88 - drm_free_pages(dma->bufs[i].seglist[j], 89 - dma->bufs[i].page_order, 90 - DRM_MEM_DMA); 88 + drm_pci_free(dev, dma->bufs[i].seglist[j]); 91 89 } 92 90 } 93 91 drm_free(dma->bufs[i].seglist,
-59
drivers/char/drm/drm_memory.c
··· 79 79 return pt; 80 80 } 81 81 82 - /** 83 - * Allocate pages. 84 - * 85 - * \param order size order. 86 - * \param area memory area. (Not used.) 87 - * \return page address on success, or zero on failure. 88 - * 89 - * Allocate and reserve free pages. 90 - */ 91 - unsigned long drm_alloc_pages(int order, int area) 92 - { 93 - unsigned long address; 94 - unsigned long bytes = PAGE_SIZE << order; 95 - unsigned long addr; 96 - unsigned int sz; 97 - 98 - address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order); 99 - if (!address) 100 - return 0; 101 - 102 - /* Zero */ 103 - memset((void *)address, 0, bytes); 104 - 105 - /* Reserve */ 106 - for (addr = address, sz = bytes; 107 - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 108 - SetPageReserved(virt_to_page(addr)); 109 - } 110 - 111 - return address; 112 - } 113 - 114 - /** 115 - * Free pages. 116 - * 117 - * \param address address of the pages to free. 118 - * \param order size order. 119 - * \param area memory area. (Not used.) 120 - * 121 - * Unreserve and free pages allocated by alloc_pages(). 122 - */ 123 - void drm_free_pages(unsigned long address, int order, int area) 124 - { 125 - unsigned long bytes = PAGE_SIZE << order; 126 - unsigned long addr; 127 - unsigned int sz; 128 - 129 - if (!address) 130 - return; 131 - 132 - /* Unreserve */ 133 - for (addr = address, sz = bytes; 134 - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 135 - ClearPageReserved(virt_to_page(addr)); 136 - } 137 - 138 - free_pages(address, order); 139 - } 140 - 141 82 #if __OS_HAS_AGP 142 83 /** Wrapper around agp_allocate_memory() */ 143 84 DRM_AGP_MEM *drm_alloc_agp(drm_device_t * dev, int pages, u32 type)
-70
drivers/char/drm/drm_memory_debug.h
··· 206 206 } 207 207 } 208 208 209 - unsigned long drm_alloc_pages (int order, int area) { 210 - unsigned long address; 211 - unsigned long bytes = PAGE_SIZE << order; 212 - unsigned long addr; 213 - unsigned int sz; 214 - 215 - spin_lock(&drm_mem_lock); 216 - if ((drm_ram_used >> PAGE_SHIFT) 217 - > (DRM_RAM_PERCENT * drm_ram_available) / 100) { 218 - spin_unlock(&drm_mem_lock); 219 - return 0; 220 - } 221 - spin_unlock(&drm_mem_lock); 222 - 223 - address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order); 224 - if (!address) { 225 - spin_lock(&drm_mem_lock); 226 - ++drm_mem_stats[area].fail_count; 227 - spin_unlock(&drm_mem_lock); 228 - return 0; 229 - } 230 - spin_lock(&drm_mem_lock); 231 - ++drm_mem_stats[area].succeed_count; 232 - drm_mem_stats[area].bytes_allocated += bytes; 233 - drm_ram_used += bytes; 234 - spin_unlock(&drm_mem_lock); 235 - 236 - /* Zero outside the lock */ 237 - memset((void *)address, 0, bytes); 238 - 239 - /* Reserve */ 240 - for (addr = address, sz = bytes; 241 - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 242 - SetPageReserved(virt_to_page(addr)); 243 - } 244 - 245 - return address; 246 - } 247 - 248 - void drm_free_pages (unsigned long address, int order, int area) { 249 - unsigned long bytes = PAGE_SIZE << order; 250 - int alloc_count; 251 - int free_count; 252 - unsigned long addr; 253 - unsigned int sz; 254 - 255 - if (!address) { 256 - DRM_MEM_ERROR(area, "Attempt to free address 0\n"); 257 - } else { 258 - /* Unreserve */ 259 - for (addr = address, sz = bytes; 260 - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 261 - ClearPageReserved(virt_to_page(addr)); 262 - } 263 - free_pages(address, order); 264 - } 265 - 266 - spin_lock(&drm_mem_lock); 267 - free_count = ++drm_mem_stats[area].free_count; 268 - alloc_count = drm_mem_stats[area].succeed_count; 269 - drm_mem_stats[area].bytes_freed += bytes; 270 - drm_ram_used -= bytes; 271 - spin_unlock(&drm_mem_lock); 272 - if (free_count > alloc_count) { 273 - DRM_MEM_ERROR(area, 274 - "Excess frees: %d frees, %d allocs\n", 275 - free_count, alloc_count); 276 - } 277 - } 278 - 279 209 void *drm_ioremap (unsigned long offset, unsigned long size, 280 210 drm_device_t * dev) { 281 211 void *pt;
+25 -4
drivers/char/drm/drm_pci.c
··· 50 50 dma_addr_t maxaddr) 51 51 { 52 52 drm_dma_handle_t *dmah; 53 + #if 1 54 + unsigned long addr; 55 + size_t sz; 56 + #endif 53 57 #ifdef DRM_DEBUG_MEMORY 54 58 int area = DRM_MEM_DMA; 55 59 ··· 83 79 return NULL; 84 80 85 81 dmah->size = size; 86 - dmah->vaddr = pci_alloc_consistent(dev->pdev, size, &dmah->busaddr); 82 + dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL | __GFP_COMP); 87 83 88 84 #ifdef DRM_DEBUG_MEMORY 89 85 if (dmah->vaddr == NULL) { ··· 108 104 109 105 memset(dmah->vaddr, 0, size); 110 106 107 + /* XXX - Is virt_to_page() legal for consistent mem? */ 108 + /* Reserve */ 109 + for (addr = (unsigned long)dmah->vaddr, sz = size; 110 + sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 111 + SetPageReserved(virt_to_page(addr)); 112 + } 113 + 111 114 return dmah; 112 115 } 113 116 114 117 EXPORT_SYMBOL(drm_pci_alloc); 115 118 116 119 /** 117 - * \brief Free a PCI consistent memory block with freeing its descriptor. 120 + * \brief Free a PCI consistent memory block without freeing its descriptor. 118 121 * 119 122 * This function is for internal use in the Linux-specific DRM core code. 120 123 */ 121 124 void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah) 122 125 { 126 + #if 1 127 + unsigned long addr; 128 + size_t sz; 129 + #endif 123 130 #ifdef DRM_DEBUG_MEMORY 124 131 int area = DRM_MEM_DMA; 125 132 int alloc_count; ··· 142 127 DRM_MEM_ERROR(area, "Attempt to free address 0\n"); 143 128 #endif 144 129 } else { 145 - pci_free_consistent(dev->pdev, dmah->size, dmah->vaddr, 146 - dmah->busaddr); 130 + /* XXX - Is virt_to_page() legal for consistent mem? */ 131 + /* Unreserve */ 132 + for (addr = (unsigned long)dmah->vaddr, sz = dmah->size; 133 + sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { 134 + ClearPageReserved(virt_to_page(addr)); 135 + } 136 + dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr, 137 + dmah->busaddr); 147 138 } 148 139 149 140 #ifdef DRM_DEBUG_MEMORY
+79 -37
drivers/char/drm/drm_pciids.h
··· 3 3 Please contact dri-devel@lists.sf.net to add new cards to this list 4 4 */ 5 5 #define radeon_PCI_IDS \ 6 - {0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350},\ 6 + {0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY}, \ 7 + {0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 8 + {0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 9 + {0x1002, 0x3E50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 10 + {0x1002, 0x3E54, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 7 11 {0x1002, 0x4136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|CHIP_IS_IGP}, \ 8 12 {0x1002, 0x4137, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP}, \ 9 13 {0x1002, 0x4144, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 10 14 {0x1002, 0x4145, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 11 15 {0x1002, 0x4146, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 12 16 {0x1002, 0x4147, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 17 + {0x1002, 0x4148, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 18 + {0x1002, 0x4149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 19 + {0x1002, 0x414A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 20 + {0x1002, 0x414B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 13 21 {0x1002, 0x4150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 14 22 {0x1002, 0x4151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 15 23 {0x1002, 0x4152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 16 24 {0x1002, 0x4153, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 17 25 {0x1002, 0x4154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 26 + {0x1002, 0x4155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 18 27 {0x1002, 0x4156, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 19 - {0x1002, 0x4237, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS250|CHIP_IS_IGP}, \ 28 + {0x1002, 0x4237, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP}, \ 20 29 {0x1002, 0x4242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 21 30 {0x1002, 0x4243, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 22 31 {0x1002, 0x4336, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|CHIP_IS_IGP|CHIP_IS_MOBILITY}, \ 23 32 {0x1002, 0x4337, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP|CHIP_IS_MOBILITY}, \ 24 - {0x1002, 0x4437, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS250|CHIP_IS_IGP|CHIP_IS_MOBILITY}, \ 25 - {0x1002, 0x4964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250}, \ 26 - {0x1002, 0x4965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250}, \ 27 - {0x1002, 0x4966, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250}, \ 28 - {0x1002, 0x4967, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250}, \ 29 - {0x1002, 0x4A49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420}, \ 30 - {0x1002, 0x4A4B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420}, \ 33 + {0x1002, 0x4437, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP|CHIP_IS_MOBILITY}, \ 34 + {0x1002, 0x4966, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250}, \ 35 + {0x1002, 0x4967, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250}, \ 36 + {0x1002, 0x4A48, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 37 + {0x1002, 0x4A49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 38 + {0x1002, 0x4A4A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 39 + {0x1002, 0x4A4B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 40 + {0x1002, 0x4A4C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 41 + {0x1002, 0x4A4D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 42 + {0x1002, 0x4A4E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 43 + {0x1002, 0x4A4F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 44 + {0x1002, 0x4A50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 45 + {0x1002, 0x4A54, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 46 + {0x1002, 0x4B49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 47 + {0x1002, 0x4B4A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 48 + {0x1002, 0x4B4B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 49 + {0x1002, 0x4B4C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 31 50 {0x1002, 0x4C57, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200|CHIP_IS_MOBILITY}, \ 32 51 {0x1002, 0x4C58, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200|CHIP_IS_MOBILITY}, \ 33 52 {0x1002, 0x4C59, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|CHIP_IS_MOBILITY}, \ 34 53 {0x1002, 0x4C5A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|CHIP_IS_MOBILITY}, \ 35 - {0x1002, 0x4C64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250|CHIP_IS_MOBILITY}, \ 36 - {0x1002, 0x4C65, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250|CHIP_IS_MOBILITY}, \ 37 - {0x1002, 0x4C66, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250|CHIP_IS_MOBILITY}, \ 38 - {0x1002, 0x4C67, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R250|CHIP_IS_MOBILITY}, \ 54 + {0x1002, 0x4C64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|CHIP_IS_MOBILITY}, \ 55 + {0x1002, 0x4C66, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|CHIP_IS_MOBILITY}, \ 56 + {0x1002, 0x4C67, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|CHIP_IS_MOBILITY}, \ 39 57 {0x1002, 0x4E44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 40 58 {0x1002, 0x4E45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 41 - {0x1002, 0x4E46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 59 + {0x1002, 0x4E46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 42 60 {0x1002, 0x4E47, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 43 61 {0x1002, 0x4E48, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 44 62 {0x1002, 0x4E49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 45 - {0x1002, 0x4E4A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 63 + {0x1002, 0x4E4A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 46 64 {0x1002, 0x4E4B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 47 65 {0x1002, 0x4E50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 48 66 {0x1002, 0x4E51, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 67 + {0x1002, 0x4E52, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 68 + {0x1002, 0x4E53, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 49 69 {0x1002, 0x4E54, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 50 70 {0x1002, 0x4E56, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350|CHIP_IS_MOBILITY}, \ 51 71 {0x1002, 0x5144, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R100|CHIP_SINGLE_CRTC}, \ ··· 73 53 {0x1002, 0x5146, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R100|CHIP_SINGLE_CRTC}, \ 74 54 {0x1002, 0x5147, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R100|CHIP_SINGLE_CRTC}, \ 75 55 {0x1002, 0x5148, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 76 - {0x1002, 0x5149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 77 - {0x1002, 0x514A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 78 - {0x1002, 0x514B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 79 56 {0x1002, 0x514C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 80 57 {0x1002, 0x514D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 81 - {0x1002, 0x514E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 82 - {0x1002, 0x514F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 83 58 {0x1002, 0x5157, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200}, \ 84 59 {0x1002, 0x5158, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200}, \ 85 60 {0x1002, 0x5159, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ 86 61 {0x1002, 0x515A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ 87 62 {0x1002, 0x515E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ 88 - {0x1002, 0x5168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 89 - {0x1002, 0x5169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 90 - {0x1002, 0x516A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 91 - {0x1002, 0x516B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 92 - {0x1002, 0x516C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R200}, \ 93 - {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350}, \ 94 - {0x1002, 0x554F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 63 + {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY}, \ 64 + {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY}, \ 65 + {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_IS_MOBILITY}, \ 66 + {0x1002, 0x5548, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 67 + {0x1002, 0x5549, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 68 + {0x1002, 0x554A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 69 + {0x1002, 0x554B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 70 + {0x1002, 0x554C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 71 + {0x1002, 0x554D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 72 + {0x1002, 0x554E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 73 + {0x1002, 0x554F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 74 + {0x1002, 0x5550, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 75 + {0x1002, 0x5551, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 76 + {0x1002, 0x5552, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 77 + {0x1002, 0x5554, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 78 + {0x1002, 0x564A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 79 + {0x1002, 0x564B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 80 + {0x1002, 0x564F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 81 + {0x1002, 0x5652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 82 + {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 95 83 {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP}, \ 96 84 {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP|CHIP_IS_MOBILITY}, \ 97 - {0x1002, 0x5836, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP}, \ 98 - {0x1002, 0x5837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP}, \ 99 85 {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 100 86 {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 101 87 {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 102 - {0x1002, 0x5963, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 103 88 {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 104 - {0x1002, 0x5968, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 89 + {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 105 90 {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ 106 - {0x1002, 0x596A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 107 - {0x1002, 0x596B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 91 + {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 92 + {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 93 + {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 94 + {0x1002, 0x5b64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 95 + {0x1002, 0x5b65, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|CHIP_NEW_MEMMAP}, \ 108 96 {0x1002, 0x5c61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280|CHIP_IS_MOBILITY}, \ 109 - {0x1002, 0x5c62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 110 97 {0x1002, 0x5c63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280|CHIP_IS_MOBILITY}, \ 111 - {0x1002, 0x5c64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ 112 - {0x1002, 0x5d4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R350}, \ 113 - {0x1002, 0x5e4b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420}, \ 98 + {0x1002, 0x5d48, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 99 + {0x1002, 0x5d49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 100 + {0x1002, 0x5d4a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 101 + {0x1002, 0x5d4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 102 + {0x1002, 0x5d4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 103 + {0x1002, 0x5d4e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 104 + {0x1002, 0x5d4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 105 + {0x1002, 0x5d50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 106 + {0x1002, 0x5d52, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 107 + {0x1002, 0x5d57, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R420|CHIP_NEW_MEMMAP}, \ 108 + {0x1002, 0x5e48, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 109 + {0x1002, 0x5e4a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 110 + {0x1002, 0x5e4b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 111 + {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 112 + {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 113 + {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|CHIP_NEW_MEMMAP}, \ 114 + {0x1002, 0x7834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP|CHIP_NEW_MEMMAP}, \ 115 + {0x1002, 0x7835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|CHIP_IS_IGP|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP}, \ 114 116 {0, 0, 0} 115 117 116 118 #define r128_PCI_IDS \
-2
drivers/char/drm/i915_dma.c
··· 495 495 } 496 496 } 497 497 498 - dev_priv->sarea_priv->last_enqueue = dev_priv->counter++; 499 - 500 498 i915_emit_breadcrumb(dev); 501 499 502 500 return 0;
+2
drivers/char/drm/i915_irq.c
··· 53 53 54 54 I915_WRITE16(I915REG_INT_IDENTITY_R, temp); 55 55 56 + dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 57 + 56 58 if (temp & USER_INT_FLAG) 57 59 DRM_WAKEUP(&dev_priv->irq_queue); 58 60
+78 -8
drivers/char/drm/r300_cmdbuf.c
··· 214 214 ADD_RANGE(0x4F54, 1); 215 215 216 216 ADD_RANGE(R300_TX_FILTER_0, 16); 217 - ADD_RANGE(R300_TX_UNK1_0, 16); 217 + ADD_RANGE(R300_TX_FILTER1_0, 16); 218 218 ADD_RANGE(R300_TX_SIZE_0, 16); 219 219 ADD_RANGE(R300_TX_FORMAT_0, 16); 220 220 ADD_RANGE(R300_TX_PITCH_0, 16); 221 221 /* Texture offset is dangerous and needs more checking */ 222 222 ADD_RANGE_MARK(R300_TX_OFFSET_0, 16, MARK_CHECK_OFFSET); 223 - ADD_RANGE(R300_TX_UNK4_0, 16); 223 + ADD_RANGE(R300_TX_CHROMA_KEY_0, 16); 224 224 ADD_RANGE(R300_TX_BORDER_COLOR_0, 16); 225 225 226 226 /* Sporadic registers used as primitives are emitted */ ··· 242 242 return 0; 243 243 } 244 244 245 - /* we expect offsets passed to the framebuffer to be either within video memory or 246 - within AGP space */ 245 + /* 246 + * we expect offsets passed to the framebuffer to be either within video 247 + * memory or within AGP space 248 + */ 247 249 static __inline__ int r300_check_offset(drm_radeon_private_t *dev_priv, 248 250 u32 offset) 249 251 { ··· 253 251 but this value is not being kept. 254 252 This code is correct for now (does the same thing as the 255 253 code that sets MC_FB_LOCATION) in radeon_cp.c */ 256 - if ((offset >= dev_priv->fb_location) && 257 - (offset < dev_priv->gart_vm_start)) 254 + if (offset >= dev_priv->fb_location && 255 + offset < (dev_priv->fb_location + dev_priv->fb_size)) 258 256 return 0; 259 - if ((offset >= dev_priv->gart_vm_start) && 260 - (offset < dev_priv->gart_vm_start + dev_priv->gart_size)) 257 + if (offset >= dev_priv->gart_vm_start && 258 + offset < (dev_priv->gart_vm_start + dev_priv->gart_size)) 261 259 return 0; 262 260 return 1; 263 261 } ··· 492 490 493 491 return 0; 494 492 } 493 + 495 494 static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv, 496 495 drm_radeon_kcmd_buffer_t *cmdbuf) 497 496 { ··· 704 701 buf->used = 0; 705 702 } 706 703 704 + static int r300_scratch(drm_radeon_private_t *dev_priv, 705 + drm_radeon_kcmd_buffer_t *cmdbuf, 706 + drm_r300_cmd_header_t header) 707 + { 708 + u32 *ref_age_base; 709 + u32 i, buf_idx, h_pending; 710 + RING_LOCALS; 711 + 712 + if (cmdbuf->bufsz < 713 + (sizeof(u64) + header.scratch.n_bufs * sizeof(buf_idx))) { 714 + return DRM_ERR(EINVAL); 715 + } 716 + 717 + if (header.scratch.reg >= 5) { 718 + return DRM_ERR(EINVAL); 719 + } 720 + 721 + dev_priv->scratch_ages[header.scratch.reg]++; 722 + 723 + ref_age_base = *(u32 **)cmdbuf->buf; 724 + 725 + cmdbuf->buf += sizeof(u64); 726 + cmdbuf->bufsz -= sizeof(u64); 727 + 728 + for (i=0; i < header.scratch.n_bufs; i++) { 729 + buf_idx = *(u32 *)cmdbuf->buf; 730 + buf_idx *= 2; /* 8 bytes per buf */ 731 + 732 + if (DRM_COPY_TO_USER(ref_age_base + buf_idx, &dev_priv->scratch_ages[header.scratch.reg], sizeof(u32))) { 733 + return DRM_ERR(EINVAL); 734 + } 735 + 736 + if (DRM_COPY_FROM_USER(&h_pending, ref_age_base + buf_idx + 1, sizeof(u32))) { 737 + return DRM_ERR(EINVAL); 738 + } 739 + 740 + if (h_pending == 0) { 741 + return DRM_ERR(EINVAL); 742 + } 743 + 744 + h_pending--; 745 + 746 + if (DRM_COPY_TO_USER(ref_age_base + buf_idx + 1, &h_pending, sizeof(u32))) { 747 + return DRM_ERR(EINVAL); 748 + } 749 + 750 + cmdbuf->buf += sizeof(buf_idx); 751 + cmdbuf->bufsz -= sizeof(buf_idx); 752 + } 753 + 754 + BEGIN_RING(2); 755 + OUT_RING(CP_PACKET0(RADEON_SCRATCH_REG0 + header.scratch.reg * 4, 0)); 756 + OUT_RING(dev_priv->scratch_ages[header.scratch.reg]); 757 + ADVANCE_RING(); 758 + 759 + return 0; 760 + } 761 + 707 762 /** 708 763 * Parses and validates a user-supplied command buffer and emits appropriate 709 764 * commands on the DMA ring buffer. ··· 899 838 } 900 839 break; 901 840 841 + case R300_CMD_SCRATCH: 842 + DRM_DEBUG("R300_CMD_SCRATCH\n"); 843 + ret = r300_scratch(dev_priv, cmdbuf, header); 844 + if (ret) { 845 + DRM_ERROR("r300_scratch failed\n"); 846 + goto cleanup; 847 + } 848 + break; 849 + 902 850 default: 903 851 DRM_ERROR("bad cmd_type %i at %p\n", 904 852 header.header.cmd_type,
+32 -7
drivers/char/drm/r300_reg.h
··· 711 711 # define R300_TX_MAX_ANISO_16_TO_1 (8 << 21) 712 712 # define R300_TX_MAX_ANISO_MASK (14 << 21) 713 713 714 - #define R300_TX_UNK1_0 0x4440 714 + #define R300_TX_FILTER1_0 0x4440 715 + # define R300_CHROMA_KEY_MODE_DISABLE 0 716 + # define R300_CHROMA_KEY_FORCE 1 717 + # define R300_CHROMA_KEY_BLEND 2 718 + # define R300_MC_ROUND_NORMAL (0<<2) 719 + # define R300_MC_ROUND_MPEG4 (1<<2) 715 720 # define R300_LOD_BIAS_MASK 0x1fff 721 + # define R300_EDGE_ANISO_EDGE_DIAG (0<<13) 722 + # define R300_EDGE_ANISO_EDGE_ONLY (1<<13) 723 + # define R300_MC_COORD_TRUNCATE_DISABLE (0<<14) 724 + # define R300_MC_COORD_TRUNCATE_MPEG (1<<14) 725 + # define R300_TX_TRI_PERF_0_8 (0<<15) 726 + # define R300_TX_TRI_PERF_1_8 (1<<15) 727 + # define R300_TX_TRI_PERF_1_4 (2<<15) 728 + # define R300_TX_TRI_PERF_3_8 (3<<15) 729 + # define R300_ANISO_THRESHOLD_MASK (7<<17) 716 730 717 731 #define R300_TX_SIZE_0 0x4480 718 732 # define R300_TX_WIDTHMASK_SHIFT 0 ··· 736 722 # define R300_TX_UNK23 (1 << 23) 737 723 # define R300_TX_SIZE_SHIFT 26 /* largest of width, height */ 738 724 # define R300_TX_SIZE_MASK (15 << 26) 725 + # define R300_TX_SIZE_PROJECTED (1<<30) 726 + # define R300_TX_SIZE_TXPITCH_EN (1<<31) 739 727 #define R300_TX_FORMAT_0 0x44C0 740 728 /* The interpretation of the format word by Wladimir van der Laan */ 741 729 /* The X, Y, Z and W refer to the layout of the components. ··· 766 750 # define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */ 767 751 # define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */ 768 752 /* 0x16 - some 16 bit green format.. ?? */ 769 - # define R300_TX_FORMAT_UNK25 (1 << 25) /* no swizzle */ 753 + # define R300_TX_FORMAT_UNK25 (1 << 25) /* no swizzle */ 754 + # define R300_TX_FORMAT_CUBIC_MAP (1 << 26) 770 755 771 756 /* gap */ 772 757 /* Floating point formats */ ··· 817 800 818 801 # define R300_TX_FORMAT_YUV_MODE 0x00800000 819 802 820 - #define R300_TX_PITCH_0 0x4500 803 + #define R300_TX_PITCH_0 0x4500 /* obvious missing in gap */ 821 804 #define R300_TX_OFFSET_0 0x4540 822 805 /* BEGIN: Guess from R200 */ 823 806 # define R300_TXO_ENDIAN_NO_SWAP (0 << 0) 824 807 # define R300_TXO_ENDIAN_BYTE_SWAP (1 << 0) 825 808 # define R300_TXO_ENDIAN_WORD_SWAP (2 << 0) 826 809 # define R300_TXO_ENDIAN_HALFDW_SWAP (3 << 0) 810 + # define R300_TXO_MACRO_TILE (1 << 2) 811 + # define R300_TXO_MICRO_TILE (1 << 3) 827 812 # define R300_TXO_OFFSET_MASK 0xffffffe0 828 813 # define R300_TXO_OFFSET_SHIFT 5 829 814 /* END */ 830 - #define R300_TX_UNK4_0 0x4580 831 - #define R300_TX_BORDER_COLOR_0 0x45C0 //ff00ff00 == { 0, 1.0, 0, 1.0 } 815 + #define R300_TX_CHROMA_KEY_0 0x4580 /* 32 bit chroma key */ 816 + #define R300_TX_BORDER_COLOR_0 0x45C0 //ff00ff00 == { 0, 1.0, 0, 1.0 } 832 817 833 818 /* END */ 834 819 ··· 887 868 # define R300_PFS_NODE_TEX_OFFSET_MASK (31 << 12) 888 869 # define R300_PFS_NODE_TEX_END_SHIFT 17 889 870 # define R300_PFS_NODE_TEX_END_MASK (31 << 17) 890 - # define R300_PFS_NODE_LAST_NODE (1 << 22) 871 + /*# define R300_PFS_NODE_LAST_NODE (1 << 22) */ 872 + # define R300_PFS_NODE_OUTPUT_COLOR (1 << 22) 873 + # define R300_PFS_NODE_OUTPUT_DEPTH (1 << 23) 891 874 892 875 /* TEX 893 876 // As far as I can tell, texture instructions cannot write into output ··· 908 887 */ 909 888 # define R300_FPITX_OPCODE_SHIFT 15 910 889 # define R300_FPITX_OP_TEX 1 890 + # define R300_FPITX_OP_KIL 2 911 891 # define R300_FPITX_OP_TXP 3 912 892 # define R300_FPITX_OP_TXB 4 913 893 ··· 984 962 # define R300_FPI1_SRC2C_CONST (1 << 17) 985 963 # define R300_FPI1_DSTC_SHIFT 18 986 964 # define R300_FPI1_DSTC_MASK (31 << 18) 965 + # define R300_FPI1_DSTC_REG_MASK_SHIFT 23 987 966 # define R300_FPI1_DSTC_REG_X (1 << 23) 988 967 # define R300_FPI1_DSTC_REG_Y (1 << 24) 989 968 # define R300_FPI1_DSTC_REG_Z (1 << 25) 969 + # define R300_FPI1_DSTC_OUTPUT_MASK_SHIFT 26 990 970 # define R300_FPI1_DSTC_OUTPUT_X (1 << 26) 991 971 # define R300_FPI1_DSTC_OUTPUT_Y (1 << 27) 992 972 # define R300_FPI1_DSTC_OUTPUT_Z (1 << 28) ··· 1007 983 # define R300_FPI3_DSTA_MASK (31 << 18) 1008 984 # define R300_FPI3_DSTA_REG (1 << 23) 1009 985 # define R300_FPI3_DSTA_OUTPUT (1 << 24) 986 + # define R300_FPI3_DSTA_DEPTH (1 << 27) 1010 987 1011 988 #define R300_PFS_INSTR0_0 0x48C0 1012 989 # define R300_FPI0_ARGC_SRC0C_XYZ 0 ··· 1061 1036 # define R300_FPI0_OUTC_FRC (9 << 23) 1062 1037 # define R300_FPI0_OUTC_REPL_ALPHA (10 << 23) 1063 1038 # define R300_FPI0_OUTC_SAT (1 << 30) 1064 - # define R300_FPI0_UNKNOWN_31 (1 << 31) 1039 + # define R300_FPI0_INSERT_NOP (1 << 31) 1065 1040 1066 1041 #define R300_PFS_INSTR2_0 0x49C0 1067 1042 # define R300_FPI2_ARGA_SRC0C_X 0
+109 -44
drivers/char/drm/radeon_cp.c
··· 1118 1118 { 1119 1119 u32 ring_start, cur_read_ptr; 1120 1120 u32 tmp; 1121 - 1122 - /* Initialize the memory controller */ 1123 - RADEON_WRITE(RADEON_MC_FB_LOCATION, 1124 - ((dev_priv->gart_vm_start - 1) & 0xffff0000) 1125 - | (dev_priv->fb_location >> 16)); 1121 + 1122 + /* Initialize the memory controller. With new memory map, the fb location 1123 + * is not changed, it should have been properly initialized already. Part 1124 + * of the problem is that the code below is bogus, assuming the GART is 1125 + * always appended to the fb which is not necessarily the case 1126 + */ 1127 + if (!dev_priv->new_memmap) 1128 + RADEON_WRITE(RADEON_MC_FB_LOCATION, 1129 + ((dev_priv->gart_vm_start - 1) & 0xffff0000) 1130 + | (dev_priv->fb_location >> 16)); 1126 1131 1127 1132 #if __OS_HAS_AGP 1128 1133 if (dev_priv->flags & CHIP_IS_AGP) { 1134 + RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base); 1129 1135 RADEON_WRITE(RADEON_MC_AGP_LOCATION, 1130 1136 (((dev_priv->gart_vm_start - 1 + 1131 1137 dev_priv->gart_size) & 0xffff0000) | ··· 1159 1153 1160 1154 #if __OS_HAS_AGP 1161 1155 if (dev_priv->flags & CHIP_IS_AGP) { 1162 - /* set RADEON_AGP_BASE here instead of relying on X from user space */ 1163 - RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base); 1164 1156 RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR, 1165 1157 dev_priv->ring_rptr->offset 1166 1158 - dev->agp->base + dev_priv->gart_vm_start); ··· 1178 1174 entry->handle + tmp_ofs); 1179 1175 } 1180 1176 1177 + /* Set ring buffer size */ 1178 + #ifdef __BIG_ENDIAN 1179 + RADEON_WRITE(RADEON_CP_RB_CNTL, 1180 + dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT); 1181 + #else 1182 + RADEON_WRITE(RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw); 1183 + #endif 1184 + 1185 + /* Start with assuming that writeback doesn't work */ 1186 + dev_priv->writeback_works = 0; 1187 + 1181 1188 /* Initialize the scratch register pointer. This will cause 1182 1189 * the scratch register values to be written out to memory 1183 1190 * whenever they are updated. ··· 1205 1190 1206 1191 RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7); 1207 1192 1208 - /* Writeback doesn't seem to work everywhere, test it first */ 1193 + /* Turn on bus mastering */ 1194 + tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; 1195 + RADEON_WRITE(RADEON_BUS_CNTL, tmp); 1196 + 1197 + dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0; 1198 + RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame); 1199 + 1200 + dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0; 1201 + RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 1202 + dev_priv->sarea_priv->last_dispatch); 1203 + 1204 + dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0; 1205 + RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear); 1206 + 1207 + radeon_do_wait_for_idle(dev_priv); 1208 + 1209 + /* Sync everything up */ 1210 + RADEON_WRITE(RADEON_ISYNC_CNTL, 1211 + (RADEON_ISYNC_ANY2D_IDLE3D | 1212 + RADEON_ISYNC_ANY3D_IDLE2D | 1213 + RADEON_ISYNC_WAIT_IDLEGUI | 1214 + RADEON_ISYNC_CPSCRATCH_IDLEGUI)); 1215 + 1216 + } 1217 + 1218 + static void radeon_test_writeback(drm_radeon_private_t * dev_priv) 1219 + { 1220 + u32 tmp; 1221 + 1222 + /* Writeback doesn't seem to work everywhere, test it here and possibly 1223 + * enable it if it appears to work 1224 + */ 1209 1225 DRM_WRITE32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0); 1210 1226 RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef); 1211 1227 ··· 1249 1203 1250 1204 if (tmp < dev_priv->usec_timeout) { 1251 1205 dev_priv->writeback_works = 1; 1252 - DRM_DEBUG("writeback test succeeded, tmp=%d\n", tmp); 1206 + DRM_INFO("writeback test succeeded in %d usecs\n", tmp); 1253 1207 } else { 1254 1208 dev_priv->writeback_works = 0; 1255 - DRM_DEBUG("writeback test failed\n"); 1209 + DRM_INFO("writeback test failed\n"); 1256 1210 } 1257 1211 if (radeon_no_wb == 1) { 1258 1212 dev_priv->writeback_works = 0; 1259 - DRM_DEBUG("writeback forced off\n"); 1213 + DRM_INFO("writeback forced off\n"); 1260 1214 } 1261 - 1262 - dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0; 1263 - RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame); 1264 - 1265 - dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0; 1266 - RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 1267 - dev_priv->sarea_priv->last_dispatch); 1268 - 1269 - dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0; 1270 - RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear); 1271 - 1272 - /* Set ring buffer size */ 1273 - #ifdef __BIG_ENDIAN 1274 - RADEON_WRITE(RADEON_CP_RB_CNTL, 1275 - dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT); 1276 - #else 1277 - RADEON_WRITE(RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw); 1278 - #endif 1279 - 1280 - radeon_do_wait_for_idle(dev_priv); 1281 - 1282 - /* Turn on bus mastering */ 1283 - tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; 1284 - RADEON_WRITE(RADEON_BUS_CNTL, tmp); 1285 - 1286 - /* Sync everything up */ 1287 - RADEON_WRITE(RADEON_ISYNC_CNTL, 1288 - (RADEON_ISYNC_ANY2D_IDLE3D | 1289 - RADEON_ISYNC_ANY3D_IDLE2D | 1290 - RADEON_ISYNC_WAIT_IDLEGUI | 1291 - RADEON_ISYNC_CPSCRATCH_IDLEGUI)); 1292 1215 } 1293 1216 1294 1217 /* Enable or disable PCI-E GART on the chip */ ··· 1331 1316 drm_radeon_private_t *dev_priv = dev->dev_private; 1332 1317 1333 1318 DRM_DEBUG("\n"); 1319 + 1320 + /* if we require new memory map but we don't have it fail */ 1321 + if ((dev_priv->flags & CHIP_NEW_MEMMAP) && !dev_priv->new_memmap) 1322 + { 1323 + DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX\n"); 1324 + radeon_do_cleanup_cp(dev); 1325 + return DRM_ERR(EINVAL); 1326 + } 1334 1327 1335 1328 if (init->is_pci && (dev_priv->flags & CHIP_IS_AGP)) 1336 1329 { ··· 1519 1496 1520 1497 dev_priv->fb_location = (RADEON_READ(RADEON_MC_FB_LOCATION) 1521 1498 & 0xffff) << 16; 1499 + dev_priv->fb_size = 1500 + ((RADEON_READ(RADEON_MC_FB_LOCATION) & 0xffff0000u) + 0x10000) 1501 + - dev_priv->fb_location; 1522 1502 1523 1503 dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) | 1524 1504 ((dev_priv->front_offset ··· 1536 1510 + dev_priv->fb_location) >> 10)); 1537 1511 1538 1512 dev_priv->gart_size = init->gart_size; 1539 - dev_priv->gart_vm_start = dev_priv->fb_location 1540 - + RADEON_READ(RADEON_CONFIG_APER_SIZE); 1513 + 1514 + /* New let's set the memory map ... */ 1515 + if (dev_priv->new_memmap) { 1516 + u32 base = 0; 1517 + 1518 + DRM_INFO("Setting GART location based on new memory map\n"); 1519 + 1520 + /* If using AGP, try to locate the AGP aperture at the same 1521 + * location in the card and on the bus, though we have to 1522 + * align it down. 1523 + */ 1524 + #if __OS_HAS_AGP 1525 + if (dev_priv->flags & CHIP_IS_AGP) { 1526 + base = dev->agp->base; 1527 + /* Check if valid */ 1528 + if ((base + dev_priv->gart_size) > dev_priv->fb_location && 1529 + base < (dev_priv->fb_location + dev_priv->fb_size)) { 1530 + DRM_INFO("Can't use AGP base @0x%08lx, won't fit\n", 1531 + dev->agp->base); 1532 + base = 0; 1533 + } 1534 + } 1535 + #endif 1536 + /* If not or if AGP is at 0 (Macs), try to put it elsewhere */ 1537 + if (base == 0) { 1538 + base = dev_priv->fb_location + dev_priv->fb_size; 1539 + if (((base + dev_priv->gart_size) & 0xfffffffful) 1540 + < base) 1541 + base = dev_priv->fb_location 1542 + - dev_priv->gart_size; 1543 + } 1544 + dev_priv->gart_vm_start = base & 0xffc00000u; 1545 + if (dev_priv->gart_vm_start != base) 1546 + DRM_INFO("GART aligned down from 0x%08x to 0x%08x\n", 1547 + base, dev_priv->gart_vm_start); 1548 + } else { 1549 + DRM_INFO("Setting GART location based on old memory map\n"); 1550 + dev_priv->gart_vm_start = dev_priv->fb_location + 1551 + RADEON_READ(RADEON_CONFIG_APER_SIZE); 1552 + } 1541 1553 1542 1554 #if __OS_HAS_AGP 1543 1555 if (dev_priv->flags & CHIP_IS_AGP) ··· 1660 1596 dev_priv->last_buf = 0; 1661 1597 1662 1598 radeon_do_engine_reset(dev); 1599 + radeon_test_writeback(dev_priv); 1663 1600 1664 1601 return 0; 1665 1602 }
+5
drivers/char/drm/radeon_drm.h
··· 222 222 # define R300_WAIT_3D 0x2 223 223 # define R300_WAIT_2D_CLEAN 0x3 224 224 # define R300_WAIT_3D_CLEAN 0x4 225 + #define R300_CMD_SCRATCH 8 225 226 226 227 typedef union { 227 228 unsigned int u; ··· 248 247 struct { 249 248 unsigned char cmd_type, flags, pad0, pad1; 250 249 } wait; 250 + struct { 251 + unsigned char cmd_type, reg, n_bufs, flags; 252 + } scratch; 251 253 } drm_r300_cmd_header_t; 252 254 253 255 #define RADEON_FRONT 0x1 ··· 701 697 #define RADEON_SETPARAM_FB_LOCATION 1 /* determined framebuffer location */ 702 698 #define RADEON_SETPARAM_SWITCH_TILING 2 /* enable/disable color tiling */ 703 699 #define RADEON_SETPARAM_PCIGART_LOCATION 3 /* PCI Gart Location */ 700 + #define RADEON_SETPARAM_NEW_MEMMAP 4 /* Use new memory map */ 704 701 705 702 /* 1.14: Clients can allocate/free a surface 706 703 */
+17 -8
drivers/char/drm/radeon_drv.h
··· 38 38 39 39 #define DRIVER_NAME "radeon" 40 40 #define DRIVER_DESC "ATI Radeon" 41 - #define DRIVER_DATE "20051229" 41 + #define DRIVER_DATE "20060225" 42 42 43 43 /* Interface history: 44 44 * ··· 91 91 * 1.20- Add support for r300 texrect 92 92 * 1.21- Add support for card type getparam 93 93 * 1.22- Add support for texture cache flushes (R300_TX_CNTL) 94 + * 1.23- Add new radeon memory map work from benh 95 + * 1.24- Add general-purpose packet for manipulating scratch registers (r300) 94 96 */ 95 97 #define DRIVER_MAJOR 1 96 - #define DRIVER_MINOR 22 98 + #define DRIVER_MINOR 24 97 99 #define DRIVER_PATCHLEVEL 0 98 100 99 101 /* ··· 103 101 */ 104 102 enum radeon_family { 105 103 CHIP_R100, 106 - CHIP_RS100, 107 104 CHIP_RV100, 105 + CHIP_RS100, 108 106 CHIP_RV200, 109 - CHIP_R200, 110 107 CHIP_RS200, 111 - CHIP_R250, 112 - CHIP_RS250, 108 + CHIP_R200, 113 109 CHIP_RV250, 110 + CHIP_RS300, 114 111 CHIP_RV280, 115 112 CHIP_R300, 116 - CHIP_RS300, 117 113 CHIP_R350, 118 114 CHIP_RV350, 115 + CHIP_RV380, 119 116 CHIP_R420, 117 + CHIP_RV410, 118 + CHIP_RS400, 120 119 CHIP_LAST, 121 120 }; 122 121 ··· 139 136 CHIP_IS_AGP = 0x00080000UL, 140 137 CHIP_HAS_HIERZ = 0x00100000UL, 141 138 CHIP_IS_PCIE = 0x00200000UL, 139 + CHIP_NEW_MEMMAP = 0x00400000UL, 142 140 }; 143 141 144 - #define GET_RING_HEAD(dev_priv) DRM_READ32( (dev_priv)->ring_rptr, 0 ) 142 + #define GET_RING_HEAD(dev_priv) (dev_priv->writeback_works ? \ 143 + DRM_READ32( (dev_priv)->ring_rptr, 0 ) : RADEON_READ(RADEON_CP_RB_RPTR)) 145 144 #define SET_RING_HEAD(dev_priv,val) DRM_WRITE32( (dev_priv)->ring_rptr, 0, (val) ) 146 145 147 146 typedef struct drm_radeon_freelist { ··· 204 199 drm_radeon_sarea_t *sarea_priv; 205 200 206 201 u32 fb_location; 202 + u32 fb_size; 203 + int new_memmap; 207 204 208 205 int gart_size; 209 206 u32 gart_vm_start; ··· 278 271 279 272 unsigned long pcigart_offset; 280 273 drm_ati_pcigart_info gart_info; 274 + 275 + u32 scratch_ages[5]; 281 276 282 277 /* starting from here on, data is preserved accross an open */ 283 278 uint32_t flags; /* see radeon_chip_flags */
+47 -58
drivers/char/drm/radeon_state.c
··· 45 45 u32 off = *offset; 46 46 struct drm_radeon_driver_file_fields *radeon_priv; 47 47 48 - if (off >= dev_priv->fb_location && 49 - off < (dev_priv->gart_vm_start + dev_priv->gart_size)) 48 + /* Hrm ... the story of the offset ... So this function converts 49 + * the various ideas of what userland clients might have for an 50 + * offset in the card address space into an offset into the card 51 + * address space :) So with a sane client, it should just keep 52 + * the value intact and just do some boundary checking. However, 53 + * not all clients are sane. Some older clients pass us 0 based 54 + * offsets relative to the start of the framebuffer and some may 55 + * assume the AGP aperture it appended to the framebuffer, so we 56 + * try to detect those cases and fix them up. 57 + * 58 + * Note: It might be a good idea here to make sure the offset lands 59 + * in some "allowed" area to protect things like the PCIE GART... 60 + */ 61 + 62 + /* First, the best case, the offset already lands in either the 63 + * framebuffer or the GART mapped space 64 + */ 65 + if ((off >= dev_priv->fb_location && 66 + off < (dev_priv->fb_location + dev_priv->fb_size)) || 67 + (off >= dev_priv->gart_vm_start && 68 + off < (dev_priv->gart_vm_start + dev_priv->gart_size))) 50 69 return 0; 51 70 52 - radeon_priv = filp_priv->driver_priv; 53 - off += radeon_priv->radeon_fb_delta; 71 + /* Ok, that didn't happen... now check if we have a zero based 72 + * offset that fits in the framebuffer + gart space, apply the 73 + * magic offset we get from SETPARAM or calculated from fb_location 74 + */ 75 + if (off < (dev_priv->fb_size + dev_priv->gart_size)) { 76 + radeon_priv = filp_priv->driver_priv; 77 + off += radeon_priv->radeon_fb_delta; 78 + } 54 79 55 - DRM_DEBUG("offset fixed up to 0x%x\n", off); 80 + /* Finally, assume we aimed at a GART offset if beyond the fb */ 81 + if (off > (dev_priv->fb_location + dev_priv->fb_size)) 82 + off = off - (dev_priv->fb_location + dev_priv->fb_size) + 83 + dev_priv->gart_vm_start; 56 84 57 - if (off < dev_priv->fb_location || 58 - off >= (dev_priv->gart_vm_start + dev_priv->gart_size)) 59 - return DRM_ERR(EINVAL); 60 - 61 - *offset = off; 62 - 63 - return 0; 85 + /* Now recheck and fail if out of bounds */ 86 + if ((off >= dev_priv->fb_location && 87 + off < (dev_priv->fb_location + dev_priv->fb_size)) || 88 + (off >= dev_priv->gart_vm_start && 89 + off < (dev_priv->gart_vm_start + dev_priv->gart_size))) { 90 + DRM_DEBUG("offset fixed up to 0x%x\n", off); 91 + *offset = off; 92 + return 0; 93 + } 94 + return DRM_ERR(EINVAL); 64 95 } 65 96 66 97 static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t * ··· 1970 1939 drm_radeon_private_t *dev_priv = dev->dev_private; 1971 1940 drm_radeon_surface_alloc_t alloc; 1972 1941 1973 - if (!dev_priv) { 1974 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 1975 - return DRM_ERR(EINVAL); 1976 - } 1977 - 1978 1942 DRM_COPY_FROM_USER_IOCTL(alloc, 1979 1943 (drm_radeon_surface_alloc_t __user *) data, 1980 1944 sizeof(alloc)); ··· 1986 1960 drm_radeon_private_t *dev_priv = dev->dev_private; 1987 1961 drm_radeon_surface_free_t memfree; 1988 1962 1989 - if (!dev_priv) { 1990 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 1991 - return DRM_ERR(EINVAL); 1992 - } 1993 - 1994 - DRM_COPY_FROM_USER_IOCTL(memfree, (drm_radeon_mem_free_t __user *) data, 1963 + DRM_COPY_FROM_USER_IOCTL(memfree, (drm_radeon_surface_free_t __user *) data, 1995 1964 sizeof(memfree)); 1996 1965 1997 1966 if (free_surface(filp, dev_priv, memfree.address)) ··· 2121 2100 2122 2101 LOCK_TEST_WITH_RETURN(dev, filp); 2123 2102 2124 - if (!dev_priv) { 2125 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2126 - return DRM_ERR(EINVAL); 2127 - } 2128 - 2129 2103 DRM_GET_PRIV_WITH_RETURN(filp_priv, filp); 2130 2104 2131 2105 DRM_COPY_FROM_USER_IOCTL(vertex, (drm_radeon_vertex_t __user *) data, ··· 2204 2188 int count; 2205 2189 2206 2190 LOCK_TEST_WITH_RETURN(dev, filp); 2207 - 2208 - if (!dev_priv) { 2209 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2210 - return DRM_ERR(EINVAL); 2211 - } 2212 2191 2213 2192 DRM_GET_PRIV_WITH_RETURN(filp_priv, filp); 2214 2193 ··· 2351 2340 2352 2341 LOCK_TEST_WITH_RETURN(dev, filp); 2353 2342 2354 - if (!dev_priv) { 2355 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2356 - return DRM_ERR(EINVAL); 2357 - } 2358 - 2359 2343 DRM_COPY_FROM_USER_IOCTL(indirect, 2360 2344 (drm_radeon_indirect_t __user *) data, 2361 2345 sizeof(indirect)); ··· 2422 2416 unsigned char laststate; 2423 2417 2424 2418 LOCK_TEST_WITH_RETURN(dev, filp); 2425 - 2426 - if (!dev_priv) { 2427 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2428 - return DRM_ERR(EINVAL); 2429 - } 2430 2419 2431 2420 DRM_GET_PRIV_WITH_RETURN(filp_priv, filp); 2432 2421 ··· 2739 2738 2740 2739 LOCK_TEST_WITH_RETURN(dev, filp); 2741 2740 2742 - if (!dev_priv) { 2743 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2744 - return DRM_ERR(EINVAL); 2745 - } 2746 - 2747 2741 DRM_GET_PRIV_WITH_RETURN(filp_priv, filp); 2748 2742 2749 2743 DRM_COPY_FROM_USER_IOCTL(cmdbuf, ··· 2893 2897 drm_radeon_getparam_t param; 2894 2898 int value; 2895 2899 2896 - if (!dev_priv) { 2897 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2898 - return DRM_ERR(EINVAL); 2899 - } 2900 - 2901 2900 DRM_COPY_FROM_USER_IOCTL(param, (drm_radeon_getparam_t __user *) data, 2902 2901 sizeof(param)); 2903 2902 ··· 2972 2981 drm_radeon_setparam_t sp; 2973 2982 struct drm_radeon_driver_file_fields *radeon_priv; 2974 2983 2975 - if (!dev_priv) { 2976 - DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 2977 - return DRM_ERR(EINVAL); 2978 - } 2979 - 2980 2984 DRM_GET_PRIV_WITH_RETURN(filp_priv, filp); 2981 2985 2982 2986 DRM_COPY_FROM_USER_IOCTL(sp, (drm_radeon_setparam_t __user *) data, ··· 2997 3011 break; 2998 3012 case RADEON_SETPARAM_PCIGART_LOCATION: 2999 3013 dev_priv->pcigart_offset = sp.value; 3014 + break; 3015 + case RADEON_SETPARAM_NEW_MEMMAP: 3016 + dev_priv->new_memmap = sp.value; 3000 3017 break; 3001 3018 default: 3002 3019 DRM_DEBUG("Invalid parameter %d\n", sp.param);
+1 -1
drivers/char/drm/sis_mm.c
··· 110 110 111 111 DRM_COPY_TO_USER_IOCTL(argp, fb, sizeof(fb)); 112 112 113 - DRM_DEBUG("alloc fb, size = %d, offset = %ld\n", fb.size, req.offset); 113 + DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb.size, req.offset); 114 114 115 115 return retval; 116 116 }