diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon.h')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8c42d54c2e26..34e52304a525 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -109,7 +109,7 @@ extern int radeon_lockup_timeout; | |||
| 109 | #define RADEON_BIOS_NUM_SCRATCH 8 | 109 | #define RADEON_BIOS_NUM_SCRATCH 8 |
| 110 | 110 | ||
| 111 | /* max number of rings */ | 111 | /* max number of rings */ |
| 112 | #define RADEON_NUM_RINGS 3 | 112 | #define RADEON_NUM_RINGS 5 |
| 113 | 113 | ||
| 114 | /* fence seq are set to this number when signaled */ | 114 | /* fence seq are set to this number when signaled */ |
| 115 | #define RADEON_FENCE_SIGNALED_SEQ 0LL | 115 | #define RADEON_FENCE_SIGNALED_SEQ 0LL |
| @@ -122,11 +122,21 @@ extern int radeon_lockup_timeout; | |||
| 122 | #define CAYMAN_RING_TYPE_CP1_INDEX 1 | 122 | #define CAYMAN_RING_TYPE_CP1_INDEX 1 |
| 123 | #define CAYMAN_RING_TYPE_CP2_INDEX 2 | 123 | #define CAYMAN_RING_TYPE_CP2_INDEX 2 |
| 124 | 124 | ||
| 125 | /* R600+ has an async dma ring */ | ||
| 126 | #define R600_RING_TYPE_DMA_INDEX 3 | ||
| 127 | /* cayman add a second async dma ring */ | ||
| 128 | #define CAYMAN_RING_TYPE_DMA1_INDEX 4 | ||
| 129 | |||
| 125 | /* hardcode those limit for now */ | 130 | /* hardcode those limit for now */ |
| 126 | #define RADEON_VA_IB_OFFSET (1 << 20) | 131 | #define RADEON_VA_IB_OFFSET (1 << 20) |
| 127 | #define RADEON_VA_RESERVED_SIZE (8 << 20) | 132 | #define RADEON_VA_RESERVED_SIZE (8 << 20) |
| 128 | #define RADEON_IB_VM_MAX_SIZE (64 << 10) | 133 | #define RADEON_IB_VM_MAX_SIZE (64 << 10) |
| 129 | 134 | ||
| 135 | /* reset flags */ | ||
| 136 | #define RADEON_RESET_GFX (1 << 0) | ||
| 137 | #define RADEON_RESET_COMPUTE (1 << 1) | ||
| 138 | #define RADEON_RESET_DMA (1 << 2) | ||
| 139 | |||
| 130 | /* | 140 | /* |
| 131 | * Errata workarounds. | 141 | * Errata workarounds. |
| 132 | */ | 142 | */ |
| @@ -220,12 +230,13 @@ struct radeon_fence { | |||
| 220 | int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); | 230 | int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); |
| 221 | int radeon_fence_driver_init(struct radeon_device *rdev); | 231 | int radeon_fence_driver_init(struct radeon_device *rdev); |
| 222 | void radeon_fence_driver_fini(struct radeon_device *rdev); | 232 | void radeon_fence_driver_fini(struct radeon_device *rdev); |
| 233 | void radeon_fence_driver_force_completion(struct radeon_device *rdev); | ||
| 223 | int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); | 234 | int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); |
| 224 | void radeon_fence_process(struct radeon_device *rdev, int ring); | 235 | void radeon_fence_process(struct radeon_device *rdev, int ring); |
| 225 | bool radeon_fence_signaled(struct radeon_fence *fence); | 236 | bool radeon_fence_signaled(struct radeon_fence *fence); |
| 226 | int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); | 237 | int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); |
| 227 | int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); | 238 | int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); |
| 228 | void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); | 239 | int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); |
| 229 | int radeon_fence_wait_any(struct radeon_device *rdev, | 240 | int radeon_fence_wait_any(struct radeon_device *rdev, |
| 230 | struct radeon_fence **fences, | 241 | struct radeon_fence **fences, |
| 231 | bool intr); | 242 | bool intr); |
| @@ -313,6 +324,7 @@ struct radeon_bo { | |||
| 313 | struct list_head list; | 324 | struct list_head list; |
| 314 | /* Protected by tbo.reserved */ | 325 | /* Protected by tbo.reserved */ |
| 315 | u32 placements[3]; | 326 | u32 placements[3]; |
| 327 | u32 busy_placements[3]; | ||
| 316 | struct ttm_placement placement; | 328 | struct ttm_placement placement; |
| 317 | struct ttm_buffer_object tbo; | 329 | struct ttm_buffer_object tbo; |
| 318 | struct ttm_bo_kmap_obj kmap; | 330 | struct ttm_bo_kmap_obj kmap; |
| @@ -787,6 +799,15 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigne | |||
| 787 | void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); | 799 | void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); |
| 788 | 800 | ||
| 789 | 801 | ||
| 802 | /* r600 async dma */ | ||
| 803 | void r600_dma_stop(struct radeon_device *rdev); | ||
| 804 | int r600_dma_resume(struct radeon_device *rdev); | ||
| 805 | void r600_dma_fini(struct radeon_device *rdev); | ||
| 806 | |||
| 807 | void cayman_dma_stop(struct radeon_device *rdev); | ||
| 808 | int cayman_dma_resume(struct radeon_device *rdev); | ||
| 809 | void cayman_dma_fini(struct radeon_device *rdev); | ||
| 810 | |||
| 790 | /* | 811 | /* |
| 791 | * CS. | 812 | * CS. |
| 792 | */ | 813 | */ |
| @@ -824,6 +845,7 @@ struct radeon_cs_parser { | |||
| 824 | struct radeon_cs_reloc *relocs; | 845 | struct radeon_cs_reloc *relocs; |
| 825 | struct radeon_cs_reloc **relocs_ptr; | 846 | struct radeon_cs_reloc **relocs_ptr; |
| 826 | struct list_head validated; | 847 | struct list_head validated; |
| 848 | unsigned dma_reloc_idx; | ||
| 827 | /* indices of various chunks */ | 849 | /* indices of various chunks */ |
| 828 | int chunk_ib_idx; | 850 | int chunk_ib_idx; |
| 829 | int chunk_relocs_idx; | 851 | int chunk_relocs_idx; |
| @@ -883,7 +905,9 @@ struct radeon_wb { | |||
| 883 | #define RADEON_WB_CP_RPTR_OFFSET 1024 | 905 | #define RADEON_WB_CP_RPTR_OFFSET 1024 |
| 884 | #define RADEON_WB_CP1_RPTR_OFFSET 1280 | 906 | #define RADEON_WB_CP1_RPTR_OFFSET 1280 |
| 885 | #define RADEON_WB_CP2_RPTR_OFFSET 1536 | 907 | #define RADEON_WB_CP2_RPTR_OFFSET 1536 |
| 908 | #define R600_WB_DMA_RPTR_OFFSET 1792 | ||
| 886 | #define R600_WB_IH_WPTR_OFFSET 2048 | 909 | #define R600_WB_IH_WPTR_OFFSET 2048 |
| 910 | #define CAYMAN_WB_DMA1_RPTR_OFFSET 2304 | ||
| 887 | #define R600_WB_EVENT_OFFSET 3072 | 911 | #define R600_WB_EVENT_OFFSET 3072 |
| 888 | 912 | ||
| 889 | /** | 913 | /** |
| @@ -1539,6 +1563,8 @@ struct radeon_device { | |||
| 1539 | /* Register mmio */ | 1563 | /* Register mmio */ |
| 1540 | resource_size_t rmmio_base; | 1564 | resource_size_t rmmio_base; |
| 1541 | resource_size_t rmmio_size; | 1565 | resource_size_t rmmio_size; |
| 1566 | /* protects concurrent MM_INDEX/DATA based register access */ | ||
| 1567 | spinlock_t mmio_idx_lock; | ||
| 1542 | void __iomem *rmmio; | 1568 | void __iomem *rmmio; |
| 1543 | radeon_rreg_t mc_rreg; | 1569 | radeon_rreg_t mc_rreg; |
| 1544 | radeon_wreg_t mc_wreg; | 1570 | radeon_wreg_t mc_wreg; |
| @@ -1614,8 +1640,10 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 1614 | void radeon_device_fini(struct radeon_device *rdev); | 1640 | void radeon_device_fini(struct radeon_device *rdev); |
| 1615 | int radeon_gpu_wait_for_idle(struct radeon_device *rdev); | 1641 | int radeon_gpu_wait_for_idle(struct radeon_device *rdev); |
| 1616 | 1642 | ||
| 1617 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); | 1643 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, |
| 1618 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 1644 | bool always_indirect); |
| 1645 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, | ||
| 1646 | bool always_indirect); | ||
| 1619 | u32 r100_io_rreg(struct radeon_device *rdev, u32 reg); | 1647 | u32 r100_io_rreg(struct radeon_device *rdev, u32 reg); |
| 1620 | void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); | 1648 | void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); |
| 1621 | 1649 | ||
| @@ -1631,9 +1659,11 @@ void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); | |||
| 1631 | #define WREG8(reg, v) writeb(v, (rdev->rmmio) + (reg)) | 1659 | #define WREG8(reg, v) writeb(v, (rdev->rmmio) + (reg)) |
| 1632 | #define RREG16(reg) readw((rdev->rmmio) + (reg)) | 1660 | #define RREG16(reg) readw((rdev->rmmio) + (reg)) |
| 1633 | #define WREG16(reg, v) writew(v, (rdev->rmmio) + (reg)) | 1661 | #define WREG16(reg, v) writew(v, (rdev->rmmio) + (reg)) |
| 1634 | #define RREG32(reg) r100_mm_rreg(rdev, (reg)) | 1662 | #define RREG32(reg) r100_mm_rreg(rdev, (reg), false) |
| 1635 | #define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg))) | 1663 | #define RREG32_IDX(reg) r100_mm_rreg(rdev, (reg), true) |
| 1636 | #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) | 1664 | #define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg), false)) |
| 1665 | #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v), false) | ||
| 1666 | #define WREG32_IDX(reg, v) r100_mm_wreg(rdev, (reg), (v), true) | ||
| 1637 | #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) | 1667 | #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) |
| 1638 | #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) | 1668 | #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) |
| 1639 | #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) | 1669 | #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) |
| @@ -1658,7 +1688,7 @@ void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); | |||
| 1658 | tmp_ |= ((val) & ~(mask)); \ | 1688 | tmp_ |= ((val) & ~(mask)); \ |
| 1659 | WREG32_PLL(reg, tmp_); \ | 1689 | WREG32_PLL(reg, tmp_); \ |
| 1660 | } while (0) | 1690 | } while (0) |
| 1661 | #define DREG32_SYS(sqf, rdev, reg) seq_printf((sqf), #reg " : 0x%08X\n", r100_mm_rreg((rdev), (reg))) | 1691 | #define DREG32_SYS(sqf, rdev, reg) seq_printf((sqf), #reg " : 0x%08X\n", r100_mm_rreg((rdev), (reg), false)) |
| 1662 | #define RREG32_IO(reg) r100_io_rreg(rdev, (reg)) | 1692 | #define RREG32_IO(reg) r100_io_rreg(rdev, (reg)) |
| 1663 | #define WREG32_IO(reg, v) r100_io_wreg(rdev, (reg), (v)) | 1693 | #define WREG32_IO(reg, v) r100_io_wreg(rdev, (reg), (v)) |
| 1664 | 1694 | ||
