aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon.h')
-rw-r--r--drivers/gpu/drm/radeon/radeon.h46
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 {
220int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); 230int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
221int radeon_fence_driver_init(struct radeon_device *rdev); 231int radeon_fence_driver_init(struct radeon_device *rdev);
222void radeon_fence_driver_fini(struct radeon_device *rdev); 232void radeon_fence_driver_fini(struct radeon_device *rdev);
233void radeon_fence_driver_force_completion(struct radeon_device *rdev);
223int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); 234int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
224void radeon_fence_process(struct radeon_device *rdev, int ring); 235void radeon_fence_process(struct radeon_device *rdev, int ring);
225bool radeon_fence_signaled(struct radeon_fence *fence); 236bool radeon_fence_signaled(struct radeon_fence *fence);
226int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); 237int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
227int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); 238int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring);
228void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); 239int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring);
229int radeon_fence_wait_any(struct radeon_device *rdev, 240int 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
787void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); 799void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp);
788 800
789 801
802/* r600 async dma */
803void r600_dma_stop(struct radeon_device *rdev);
804int r600_dma_resume(struct radeon_device *rdev);
805void r600_dma_fini(struct radeon_device *rdev);
806
807void cayman_dma_stop(struct radeon_device *rdev);
808int cayman_dma_resume(struct radeon_device *rdev);
809void 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,
1614void radeon_device_fini(struct radeon_device *rdev); 1640void radeon_device_fini(struct radeon_device *rdev);
1615int radeon_gpu_wait_for_idle(struct radeon_device *rdev); 1641int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
1616 1642
1617uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); 1643uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg,
1618void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 1644 bool always_indirect);
1645void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v,
1646 bool always_indirect);
1619u32 r100_io_rreg(struct radeon_device *rdev, u32 reg); 1647u32 r100_io_rreg(struct radeon_device *rdev, u32 reg);
1620void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); 1648void 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