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

drm/radeon: Pass GART page flags to radeon_gart_set_page() explicitly

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Michel Dänzer and committed by
Alex Deucher
77497f27 a3eb06db

+59 -25
+1 -1
drivers/gpu/drm/radeon/r100.c
··· 682 682 } 683 683 684 684 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, 685 - uint64_t addr) 685 + uint64_t addr, uint32_t flags) 686 686 { 687 687 u32 *gtt = rdev->gart.ptr; 688 688 gtt[i] = cpu_to_le32(lower_32_bits(addr));
+9 -3
drivers/gpu/drm/radeon/r300.c
··· 69 69 mb(); 70 70 } 71 71 72 + #define R300_PTE_UNSNOOPED (1 << 0) 72 73 #define R300_PTE_WRITEABLE (1 << 2) 73 74 #define R300_PTE_READABLE (1 << 3) 74 75 75 76 void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, 76 - uint64_t addr) 77 + uint64_t addr, uint32_t flags) 77 78 { 78 79 void __iomem *ptr = rdev->gart.ptr; 79 80 80 81 addr = (lower_32_bits(addr) >> 8) | 81 - ((upper_32_bits(addr) & 0xff) << 24) | 82 - R300_PTE_WRITEABLE | R300_PTE_READABLE; 82 + ((upper_32_bits(addr) & 0xff) << 24); 83 + if (flags & RADEON_GART_PAGE_READ) 84 + addr |= R300_PTE_READABLE; 85 + if (flags & RADEON_GART_PAGE_WRITE) 86 + addr |= R300_PTE_WRITEABLE; 87 + if (!(flags & RADEON_GART_PAGE_SNOOP)) 88 + addr |= R300_PTE_UNSNOOPED; 83 89 /* on x86 we want this to be CPU endian, on powerpc 84 90 * on powerpc without HW swappers, it'll get swapped on way 85 91 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
+9 -3
drivers/gpu/drm/radeon/radeon.h
··· 593 593 #define RADEON_GPU_PAGE_SHIFT 12 594 594 #define RADEON_GPU_PAGE_ALIGN(a) (((a) + RADEON_GPU_PAGE_MASK) & ~RADEON_GPU_PAGE_MASK) 595 595 596 + #define RADEON_GART_PAGE_DUMMY 0 597 + #define RADEON_GART_PAGE_VALID (1 << 0) 598 + #define RADEON_GART_PAGE_READ (1 << 1) 599 + #define RADEON_GART_PAGE_WRITE (1 << 2) 600 + #define RADEON_GART_PAGE_SNOOP (1 << 3) 601 + 596 602 struct radeon_gart { 597 603 dma_addr_t table_addr; 598 604 struct radeon_bo *robj; ··· 623 617 int pages); 624 618 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 625 619 int pages, struct page **pagelist, 626 - dma_addr_t *dma_addr); 620 + dma_addr_t *dma_addr, uint32_t flags); 627 621 628 622 629 623 /* ··· 1790 1784 struct { 1791 1785 void (*tlb_flush)(struct radeon_device *rdev); 1792 1786 void (*set_page)(struct radeon_device *rdev, unsigned i, 1793 - uint64_t addr); 1787 + uint64_t addr, uint32_t flags); 1794 1788 } gart; 1795 1789 struct { 1796 1790 int (*init)(struct radeon_device *rdev); ··· 2751 2745 #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) 2752 2746 #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) 2753 2747 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) 2754 - #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) 2748 + #define radeon_gart_set_page(rdev, i, p, f) (rdev)->asic->gart.set_page((rdev), (i), (p), (f)) 2755 2749 #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) 2756 2750 #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) 2757 2751 #define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags)))
+4 -4
drivers/gpu/drm/radeon/radeon_asic.h
··· 68 68 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 69 69 void r100_pci_gart_tlb_flush(struct radeon_device *rdev); 70 70 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, 71 - uint64_t addr); 71 + uint64_t addr, uint32_t flags); 72 72 void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); 73 73 int r100_irq_set(struct radeon_device *rdev); 74 74 int r100_irq_process(struct radeon_device *rdev); ··· 173 173 extern int r300_cs_parse(struct radeon_cs_parser *p); 174 174 extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); 175 175 extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, 176 - uint64_t addr); 176 + uint64_t addr, uint32_t flags); 177 177 extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); 178 178 extern int rv370_get_pcie_lanes(struct radeon_device *rdev); 179 179 extern void r300_set_reg_safe(struct radeon_device *rdev); ··· 209 209 extern int rs400_resume(struct radeon_device *rdev); 210 210 void rs400_gart_tlb_flush(struct radeon_device *rdev); 211 211 void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, 212 - uint64_t addr); 212 + uint64_t addr, uint32_t flags); 213 213 uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); 214 214 void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 215 215 int rs400_gart_init(struct radeon_device *rdev); ··· 233 233 u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 234 234 void rs600_gart_tlb_flush(struct radeon_device *rdev); 235 235 void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, 236 - uint64_t addr); 236 + uint64_t addr, uint32_t flags); 237 237 uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); 238 238 void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 239 239 void rs600_bandwidth_update(struct radeon_device *rdev);
+6 -3
drivers/gpu/drm/radeon/radeon_gart.c
··· 243 243 page_base = rdev->gart.pages_addr[p]; 244 244 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 245 245 if (rdev->gart.ptr) { 246 - radeon_gart_set_page(rdev, t, page_base); 246 + radeon_gart_set_page(rdev, t, page_base, 247 + RADEON_GART_PAGE_DUMMY); 247 248 } 248 249 page_base += RADEON_GPU_PAGE_SIZE; 249 250 } ··· 262 261 * @pages: number of pages to bind 263 262 * @pagelist: pages to bind 264 263 * @dma_addr: DMA addresses of pages 264 + * @flags: RADEON_GART_PAGE_* flags 265 265 * 266 266 * Binds the requested pages to the gart page table 267 267 * (all asics). 268 268 * Returns 0 for success, -EINVAL for failure. 269 269 */ 270 270 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 271 - int pages, struct page **pagelist, dma_addr_t *dma_addr) 271 + int pages, struct page **pagelist, dma_addr_t *dma_addr, 272 + uint32_t flags) 272 273 { 273 274 unsigned t; 274 275 unsigned p; ··· 290 287 if (rdev->gart.ptr) { 291 288 page_base = rdev->gart.pages_addr[p]; 292 289 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 293 - radeon_gart_set_page(rdev, t, page_base); 290 + radeon_gart_set_page(rdev, t, page_base, flags); 294 291 page_base += RADEON_GPU_PAGE_SIZE; 295 292 } 296 293 }
+6 -2
drivers/gpu/drm/radeon/radeon_ttm.c
··· 521 521 struct ttm_mem_reg *bo_mem) 522 522 { 523 523 struct radeon_ttm_tt *gtt = (void*)ttm; 524 + uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ | 525 + RADEON_GART_PAGE_WRITE; 524 526 int r; 525 527 526 528 gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT); ··· 530 528 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", 531 529 ttm->num_pages, bo_mem, ttm); 532 530 } 533 - r = radeon_gart_bind(gtt->rdev, gtt->offset, 534 - ttm->num_pages, ttm->pages, gtt->ttm.dma_address); 531 + if (ttm->caching_state == tt_cached) 532 + flags |= RADEON_GART_PAGE_SNOOP; 533 + r = radeon_gart_bind(gtt->rdev, gtt->offset, ttm->num_pages, 534 + ttm->pages, gtt->ttm.dma_address, flags); 535 535 if (r) { 536 536 DRM_ERROR("failed to bind %lu pages at 0x%08X\n", 537 537 ttm->num_pages, (unsigned)gtt->offset);
+10 -3
drivers/gpu/drm/radeon/rs400.c
··· 208 208 radeon_gart_table_ram_free(rdev); 209 209 } 210 210 211 + #define RS400_PTE_UNSNOOPED (1 << 0) 211 212 #define RS400_PTE_WRITEABLE (1 << 2) 212 213 #define RS400_PTE_READABLE (1 << 3) 213 214 214 - void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr) 215 + void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, 216 + uint64_t addr, uint32_t flags) 215 217 { 216 218 uint32_t entry; 217 219 u32 *gtt = rdev->gart.ptr; 218 220 219 221 entry = (lower_32_bits(addr) & PAGE_MASK) | 220 - ((upper_32_bits(addr) & 0xff) << 4) | 221 - RS400_PTE_WRITEABLE | RS400_PTE_READABLE; 222 + ((upper_32_bits(addr) & 0xff) << 4); 223 + if (flags & RADEON_GART_PAGE_READ) 224 + addr |= RS400_PTE_READABLE; 225 + if (flags & RADEON_GART_PAGE_WRITE) 226 + addr |= RS400_PTE_WRITEABLE; 227 + if (!(flags & RADEON_GART_PAGE_SNOOP)) 228 + entry |= RS400_PTE_UNSNOOPED; 222 229 entry = cpu_to_le32(entry); 223 230 gtt[i] = entry; 224 231 }
+11 -5
drivers/gpu/drm/radeon/rs600.c
··· 625 625 radeon_gart_table_vram_free(rdev); 626 626 } 627 627 628 - void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr) 628 + void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, 629 + uint64_t addr, uint32_t flags) 629 630 { 630 631 void __iomem *ptr = (void *)rdev->gart.ptr; 631 632 632 633 addr = addr & 0xFFFFFFFFFFFFF000ULL; 633 - if (addr == rdev->dummy_page.addr) 634 - addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED; 635 - else 636 - addr |= R600_PTE_GART; 634 + addr |= R600_PTE_SYSTEM; 635 + if (flags & RADEON_GART_PAGE_VALID) 636 + addr |= R600_PTE_VALID; 637 + if (flags & RADEON_GART_PAGE_READ) 638 + addr |= R600_PTE_READABLE; 639 + if (flags & RADEON_GART_PAGE_WRITE) 640 + addr |= R600_PTE_WRITEABLE; 641 + if (flags & RADEON_GART_PAGE_SNOOP) 642 + addr |= R600_PTE_SNOOPED; 637 643 writeq(addr, ptr + (i * 8)); 638 644 } 639 645
+3 -1
include/uapi/drm/radeon_drm.h
··· 796 796 uint64_t vram_visible; 797 797 }; 798 798 799 - #define RADEON_GEM_NO_BACKING_STORE 1 799 + #define RADEON_GEM_NO_BACKING_STORE (1 << 0) 800 + #define RADEON_GEM_GTT_UC (1 << 1) 801 + #define RADEON_GEM_GTT_WC (1 << 2) 800 802 801 803 struct drm_radeon_gem_create { 802 804 uint64_t size;