Commit 4bc22a1a authored by Dave Airlie's avatar Dave Airlie

Merge branch 'drm-radeon-next' of ../drm-radeon-next into drm-core-next

* 'drm-radeon-next' of ../drm-radeon-next:
  drm/radeon: introduce a sub allocator and convert ib pool to it v4
  drm/radeon/kms: add support for per-ring fence interrupts
  drm/radeon/kms: add cayman specific fence_ring_emit
  drm/radeon/kms: add some new ring params to better handle other ring types
  drm/radeon: improve radeon_test_syncing function
  drm/radeon: precompute fence cpu/gpu addr once v3
  drm/radeon: move ring debugfs into radeon_ring.c
  drm/radeon: rename struct radeon_cp to radeon_ring
  drm/radeon: disable compute rings on cayman for now
  drm/radeon: add radeon_fence_count_emited function
  drm/radeon: make some asic pointers per ring
  drm/radeon: Add radeon_test_syncing function v2
  drm/radeon: make cp variable an array
  drm/radeon: make ring rptr and wptr register offsets variable
  drm/radeon: make all functions work with multiple rings.
  drm/radeon/kms: add support for semaphores v3
  drm/radeon/kms: add support for multiple fence queues v2
  drm/radeon: fix a spelling mistake
  drm/radeon: no need to check all relocs for duplicates
  drm/radeon: fix debugfs handling v3
parents e2e022ec b15ba512
...@@ -70,7 +70,8 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \ ...@@ -70,7 +70,8 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \ r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \
r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \ r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \
evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \ evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \
radeon_trace_points.o ni.o cayman_blit_shaders.o atombios_encoders.o radeon_trace_points.o ni.o cayman_blit_shaders.o atombios_encoders.o \
radeon_semaphore.o radeon_sa.o
radeon-$(CONFIG_COMPAT) += radeon_ioc32.o radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -42,6 +42,9 @@ ...@@ -42,6 +42,9 @@
#define CAYMAN_MAX_TCC_MASK 0xFF #define CAYMAN_MAX_TCC_MASK 0xFF
#define DMIF_ADDR_CONFIG 0xBD4 #define DMIF_ADDR_CONFIG 0xBD4
#define SRBM_GFX_CNTL 0x0E44
#define RINGID(x) (((x) & 0x3) << 0)
#define VMID(x) (((x) & 0x7) << 0)
#define SRBM_STATUS 0x0E50 #define SRBM_STATUS 0x0E50
#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470 #define VM_CONTEXT0_REQUEST_RESPONSE 0x1470
...@@ -394,6 +397,12 @@ ...@@ -394,6 +397,12 @@
#define CP_RB0_RPTR_ADDR 0xC10C #define CP_RB0_RPTR_ADDR 0xC10C
#define CP_RB0_RPTR_ADDR_HI 0xC110 #define CP_RB0_RPTR_ADDR_HI 0xC110
#define CP_RB0_WPTR 0xC114 #define CP_RB0_WPTR 0xC114
#define CP_INT_CNTL 0xC124
# define CNTX_BUSY_INT_ENABLE (1 << 19)
# define CNTX_EMPTY_INT_ENABLE (1 << 20)
# define TIME_STAMP_INT_ENABLE (1 << 26)
#define CP_RB1_BASE 0xC180 #define CP_RB1_BASE 0xC180
#define CP_RB1_CNTL 0xC184 #define CP_RB1_CNTL 0xC184
#define CP_RB1_RPTR_ADDR 0xC188 #define CP_RB1_RPTR_ADDR 0xC188
...@@ -411,6 +420,10 @@ ...@@ -411,6 +420,10 @@
#define CP_ME_RAM_DATA 0xC160 #define CP_ME_RAM_DATA 0xC160
#define CP_DEBUG 0xC1FC #define CP_DEBUG 0xC1FC
#define VGT_EVENT_INITIATOR 0x28a90
# define CACHE_FLUSH_AND_INV_EVENT_TS (0x14 << 0)
# define CACHE_FLUSH_AND_INV_EVENT (0x16 << 0)
/* /*
* PM4 * PM4
*/ */
...@@ -494,7 +507,27 @@ ...@@ -494,7 +507,27 @@
#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) #define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
#define PACKET3_COND_WRITE 0x45 #define PACKET3_COND_WRITE 0x45
#define PACKET3_EVENT_WRITE 0x46 #define PACKET3_EVENT_WRITE 0x46
#define EVENT_TYPE(x) ((x) << 0)
#define EVENT_INDEX(x) ((x) << 8)
/* 0 - any non-TS event
* 1 - ZPASS_DONE
* 2 - SAMPLE_PIPELINESTAT
* 3 - SAMPLE_STREAMOUTSTAT*
* 4 - *S_PARTIAL_FLUSH
* 5 - TS events
*/
#define PACKET3_EVENT_WRITE_EOP 0x47 #define PACKET3_EVENT_WRITE_EOP 0x47
#define DATA_SEL(x) ((x) << 29)
/* 0 - discard
* 1 - send low 32bit data
* 2 - send 64bit data
* 3 - send 64bit counter value
*/
#define INT_SEL(x) ((x) << 24)
/* 0 - none
* 1 - interrupt only (DATA_SEL = 0)
* 2 - interrupt when data write is confirmed
*/
#define PACKET3_EVENT_WRITE_EOS 0x48 #define PACKET3_EVENT_WRITE_EOS 0x48
#define PACKET3_PREAMBLE_CNTL 0x4A #define PACKET3_PREAMBLE_CNTL 0x4A
# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28) # define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
......
This diff is collapsed.
...@@ -87,6 +87,7 @@ int r200_copy_dma(struct radeon_device *rdev, ...@@ -87,6 +87,7 @@ int r200_copy_dma(struct radeon_device *rdev,
unsigned num_gpu_pages, unsigned num_gpu_pages,
struct radeon_fence *fence) struct radeon_fence *fence)
{ {
struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
uint32_t size; uint32_t size;
uint32_t cur_size; uint32_t cur_size;
int i, num_loops; int i, num_loops;
...@@ -95,33 +96,33 @@ int r200_copy_dma(struct radeon_device *rdev, ...@@ -95,33 +96,33 @@ int r200_copy_dma(struct radeon_device *rdev,
/* radeon pitch is /64 */ /* radeon pitch is /64 */
size = num_gpu_pages << RADEON_GPU_PAGE_SHIFT; size = num_gpu_pages << RADEON_GPU_PAGE_SHIFT;
num_loops = DIV_ROUND_UP(size, 0x1FFFFF); num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
r = radeon_ring_lock(rdev, num_loops * 4 + 64); r = radeon_ring_lock(rdev, ring, num_loops * 4 + 64);
if (r) { if (r) {
DRM_ERROR("radeon: moving bo (%d).\n", r); DRM_ERROR("radeon: moving bo (%d).\n", r);
return r; return r;
} }
/* Must wait for 2D idle & clean before DMA or hangs might happen */ /* Must wait for 2D idle & clean before DMA or hangs might happen */
radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
radeon_ring_write(rdev, (1 << 16)); radeon_ring_write(ring, (1 << 16));
for (i = 0; i < num_loops; i++) { for (i = 0; i < num_loops; i++) {
cur_size = size; cur_size = size;
if (cur_size > 0x1FFFFF) { if (cur_size > 0x1FFFFF) {
cur_size = 0x1FFFFF; cur_size = 0x1FFFFF;
} }
size -= cur_size; size -= cur_size;
radeon_ring_write(rdev, PACKET0(0x720, 2)); radeon_ring_write(ring, PACKET0(0x720, 2));
radeon_ring_write(rdev, src_offset); radeon_ring_write(ring, src_offset);
radeon_ring_write(rdev, dst_offset); radeon_ring_write(ring, dst_offset);
radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); radeon_ring_write(ring, cur_size | (1 << 31) | (1 << 30));
src_offset += cur_size; src_offset += cur_size;
dst_offset += cur_size; dst_offset += cur_size;
} }
radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); radeon_ring_write(ring, RADEON_WAIT_DMA_GUI_IDLE);
if (fence) { if (fence) {
r = radeon_fence_emit(rdev, fence); r = radeon_fence_emit(rdev, fence);
} }
radeon_ring_unlock_commit(rdev); radeon_ring_unlock_commit(rdev, ring);
return r; return r;
} }
......
...@@ -175,37 +175,40 @@ void rv370_pcie_gart_fini(struct radeon_device *rdev) ...@@ -175,37 +175,40 @@ void rv370_pcie_gart_fini(struct radeon_device *rdev)
void r300_fence_ring_emit(struct radeon_device *rdev, void r300_fence_ring_emit(struct radeon_device *rdev,
struct radeon_fence *fence) struct radeon_fence *fence)
{ {
struct radeon_ring *ring = &rdev->ring[fence->ring];
/* Who ever call radeon_fence_emit should call ring_lock and ask /* Who ever call radeon_fence_emit should call ring_lock and ask
* for enough space (today caller are ib schedule and buffer move) */ * for enough space (today caller are ib schedule and buffer move) */
/* Write SC register so SC & US assert idle */ /* Write SC register so SC & US assert idle */
radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_TL, 0)); radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_TL, 0));
radeon_ring_write(rdev, 0); radeon_ring_write(ring, 0);
radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_BR, 0)); radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_BR, 0));
radeon_ring_write(rdev, 0); radeon_ring_write(ring, 0);
/* Flush 3D cache */ /* Flush 3D cache */
radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_RB3D_DC_FLUSH); radeon_ring_write(ring, R300_RB3D_DC_FLUSH);
radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_ZC_FLUSH); radeon_ring_write(ring, R300_ZC_FLUSH);
/* Wait until IDLE & CLEAN */ /* Wait until IDLE & CLEAN */
radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
radeon_ring_write(rdev, (RADEON_WAIT_3D_IDLECLEAN | radeon_ring_write(ring, (RADEON_WAIT_3D_IDLECLEAN |
RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN |
RADEON_WAIT_DMA_GUI_IDLE)); RADEON_WAIT_DMA_GUI_IDLE));
radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | radeon_ring_write(ring, rdev->config.r300.hdp_cntl |
RADEON_HDP_READ_BUFFER_INVALIDATE); RADEON_HDP_READ_BUFFER_INVALIDATE);
radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
radeon_ring_write(rdev, rdev->config.r300.hdp_cntl); radeon_ring_write(ring, rdev->config.r300.hdp_cntl);
/* Emit fence sequence & fire IRQ */ /* Emit fence sequence & fire IRQ */
radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0));
radeon_ring_write(rdev, fence->seq); radeon_ring_write(ring, fence->seq);
radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0)); radeon_ring_write(ring, PACKET0(RADEON_GEN_INT_STATUS, 0));
radeon_ring_write(rdev, RADEON_SW_INT_FIRE); radeon_ring_write(ring, RADEON_SW_INT_FIRE);
} }
void r300_ring_start(struct radeon_device *rdev) void r300_ring_start(struct radeon_device *rdev)
{ {
struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
unsigned gb_tile_config; unsigned gb_tile_config;
int r; int r;
...@@ -227,44 +230,44 @@ void r300_ring_start(struct radeon_device *rdev) ...@@ -227,44 +230,44 @@ void r300_ring_start(struct radeon_device *rdev)
break; break;
} }
r = radeon_ring_lock(rdev, 64); r = radeon_ring_lock(rdev, ring, 64);
if (r) { if (r) {
return; return;
} }
radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0)); radeon_ring_write(ring, PACKET0(RADEON_ISYNC_CNTL, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
RADEON_ISYNC_ANY2D_IDLE3D | RADEON_ISYNC_ANY2D_IDLE3D |
RADEON_ISYNC_ANY3D_IDLE2D | RADEON_ISYNC_ANY3D_IDLE2D |
RADEON_ISYNC_WAIT_IDLEGUI | RADEON_ISYNC_WAIT_IDLEGUI |
RADEON_ISYNC_CPSCRATCH_IDLEGUI); RADEON_ISYNC_CPSCRATCH_IDLEGUI);
radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0)); radeon_ring_write(ring, PACKET0(R300_GB_TILE_CONFIG, 0));
radeon_ring_write(rdev, gb_tile_config); radeon_ring_write(ring, gb_tile_config);
radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN |
RADEON_WAIT_3D_IDLECLEAN); RADEON_WAIT_3D_IDLECLEAN);
radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0)); radeon_ring_write(ring, PACKET0(R300_DST_PIPE_CONFIG, 0));
radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG); radeon_ring_write(ring, R300_PIPE_AUTO_CONFIG);
radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); radeon_ring_write(ring, PACKET0(R300_GB_SELECT, 0));
radeon_ring_write(rdev, 0); radeon_ring_write(ring, 0);
radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); radeon_ring_write(ring, PACKET0(R300_GB_ENABLE, 0));
radeon_ring_write(rdev, 0); radeon_ring_write(ring, 0);
radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE);
radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN |
RADEON_WAIT_3D_IDLECLEAN); RADEON_WAIT_3D_IDLECLEAN);
radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0)); radeon_ring_write(ring, PACKET0(R300_GB_AA_CONFIG, 0));
radeon_ring_write(rdev, 0); radeon_ring_write(ring, 0);
radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE);
radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0)); radeon_ring_write(ring, PACKET0(R300_GB_MSPOS0, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
((6 << R300_MS_X0_SHIFT) | ((6 << R300_MS_X0_SHIFT) |
(6 << R300_MS_Y0_SHIFT) | (6 << R300_MS_Y0_SHIFT) |
(6 << R300_MS_X1_SHIFT) | (6 << R300_MS_X1_SHIFT) |
...@@ -273,8 +276,8 @@ void r300_ring_start(struct radeon_device *rdev) ...@@ -273,8 +276,8 @@ void r300_ring_start(struct radeon_device *rdev)
(6 << R300_MS_Y2_SHIFT) | (6 << R300_MS_Y2_SHIFT) |
(6 << R300_MSBD0_Y_SHIFT) | (6 << R300_MSBD0_Y_SHIFT) |
(6 << R300_MSBD0_X_SHIFT))); (6 << R300_MSBD0_X_SHIFT)));
radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0)); radeon_ring_write(ring, PACKET0(R300_GB_MSPOS1, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
((6 << R300_MS_X3_SHIFT) | ((6 << R300_MS_X3_SHIFT) |
(6 << R300_MS_Y3_SHIFT) | (6 << R300_MS_Y3_SHIFT) |
(6 << R300_MS_X4_SHIFT) | (6 << R300_MS_X4_SHIFT) |
...@@ -282,16 +285,16 @@ void r300_ring_start(struct radeon_device *rdev) ...@@ -282,16 +285,16 @@ void r300_ring_start(struct radeon_device *rdev)
(6 << R300_MS_X5_SHIFT) | (6 << R300_MS_X5_SHIFT) |
(6 << R300_MS_Y5_SHIFT) | (6 << R300_MS_Y5_SHIFT) |
(6 << R300_MSBD1_SHIFT))); (6 << R300_MSBD1_SHIFT)));
radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0)); radeon_ring_write(ring, PACKET0(R300_GA_ENHANCE, 0));
radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); radeon_ring_write(ring, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0)); radeon_ring_write(ring, PACKET0(R300_GA_POLY_MODE, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0)); radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0));
radeon_ring_write(rdev, radeon_ring_write(ring,
R300_GEOMETRY_ROUND_NEAREST | R300_GEOMETRY_ROUND_NEAREST |
R300_COLOR_ROUND_NEAREST); R300_COLOR_ROUND_NEAREST);
radeon_ring_unlock_commit(rdev); radeon_ring_unlock_commit(rdev, ring);
} }
void r300_errata(struct radeon_device *rdev) void r300_errata(struct radeon_device *rdev)
...@@ -375,26 +378,26 @@ void r300_gpu_init(struct radeon_device *rdev) ...@@ -375,26 +378,26 @@ void r300_gpu_init(struct radeon_device *rdev)
rdev->num_gb_pipes, rdev->num_z_pipes); rdev->num_gb_pipes, rdev->num_z_pipes);
} }
bool r300_gpu_is_lockup(struct radeon_device *rdev) bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
{ {
u32 rbbm_status; u32 rbbm_status;
int r; int r;
rbbm_status = RREG32(R_000E40_RBBM_STATUS); rbbm_status = RREG32(R_000E40_RBBM_STATUS);
if (!G_000E40_GUI_ACTIVE(rbbm_status)) { if (!G_000E40_GUI_ACTIVE(rbbm_status)) {
r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); r100_gpu_lockup_update(&rdev->config.r300.lockup, ring);
return false; return false;
} }
/* force CP activities */ /* force CP activities */
r = radeon_ring_lock(rdev, 2); r = radeon_ring_lock(rdev, ring, 2);
if (!r) { if (!r) {
/* PACKET2 NOP */ /* PACKET2 NOP */
radeon_ring_write(rdev, 0x80000000); radeon_ring_write(ring, 0x80000000);
radeon_ring_write(rdev, 0x80000000); radeon_ring_write(ring, 0x80000000);
radeon_ring_unlock_commit(rdev); radeon_ring_unlock_commit(rdev, ring);
} }
rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); ring->rptr = RREG32(RADEON_CP_RB_RPTR);
return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, ring);
} }
int r300_asic_reset(struct radeon_device *rdev) int r300_asic_reset(struct radeon_device *rdev)
...@@ -1396,6 +1399,12 @@ static int r300_startup(struct radeon_device *rdev) ...@@ -1396,6 +1399,12 @@ static int r300_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -1405,11 +1414,18 @@ static int r300_startup(struct radeon_device *rdev) ...@@ -1405,11 +1414,18 @@ static int r300_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failed initializing CP (%d).\n", r); dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
return r; return r;
} }
r = r100_ib_init(rdev);
r = radeon_ib_pool_start(rdev);
if (r)
return r;
r = r100_ib_test(rdev);
if (r) { if (r) {
dev_err(rdev->dev, "failed initializing IB (%d).\n", r); dev_err(rdev->dev, "failed testing IB (%d).\n", r);
rdev->accel_working = false;
return r; return r;
} }
return 0; return 0;
} }
...@@ -1434,11 +1450,14 @@ int r300_resume(struct radeon_device *rdev) ...@@ -1434,11 +1450,14 @@ int r300_resume(struct radeon_device *rdev)
r300_clock_startup(rdev); r300_clock_startup(rdev);
/* Initialize surface registers */ /* Initialize surface registers */
radeon_surface_init(rdev); radeon_surface_init(rdev);
rdev->accel_working = true;
return r300_startup(rdev); return r300_startup(rdev);
} }
int r300_suspend(struct radeon_device *rdev) int r300_suspend(struct radeon_device *rdev)
{ {
radeon_ib_pool_suspend(rdev);
r100_cp_disable(rdev); r100_cp_disable(rdev);
radeon_wb_disable(rdev); radeon_wb_disable(rdev);
r100_irq_disable(rdev); r100_irq_disable(rdev);
...@@ -1539,7 +1558,14 @@ int r300_init(struct radeon_device *rdev) ...@@ -1539,7 +1558,14 @@ int r300_init(struct radeon_device *rdev)
return r; return r;
} }
r300_set_reg_safe(rdev); r300_set_reg_safe(rdev);
r = radeon_ib_pool_init(rdev);
rdev->accel_working = true; rdev->accel_working = true;
if (r) {
dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
rdev->accel_working = false;
}
r = r300_startup(rdev); r = r300_startup(rdev);
if (r) { if (r) {
/* Somethings want wront with the accel init stop accel */ /* Somethings want wront with the accel init stop accel */
......
...@@ -199,6 +199,8 @@ static void r420_clock_resume(struct radeon_device *rdev) ...@@ -199,6 +199,8 @@ static void r420_clock_resume(struct radeon_device *rdev)
static void r420_cp_errata_init(struct radeon_device *rdev) static void r420_cp_errata_init(struct radeon_device *rdev)
{ {
struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
/* RV410 and R420 can lock up if CP DMA to host memory happens /* RV410 and R420 can lock up if CP DMA to host memory happens
* while the 2D engine is busy. * while the 2D engine is busy.
* *
...@@ -206,22 +208,24 @@ static void r420_cp_errata_init(struct radeon_device *rdev) ...@@ -206,22 +208,24 @@ static void r420_cp_errata_init(struct radeon_device *rdev)
* of the CP init, apparently. * of the CP init, apparently.
*/ */
radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch); radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch);
radeon_ring_lock(rdev, 8); radeon_ring_lock(rdev, ring, 8);
radeon_ring_write(rdev, PACKET0(R300_CP_RESYNC_ADDR, 1)); radeon_ring_write(ring, PACKET0(R300_CP_RESYNC_ADDR, 1));
radeon_ring_write(rdev, rdev->config.r300.resync_scratch); radeon_ring_write(ring, rdev->config.r300.resync_scratch);
radeon_ring_write(rdev, 0xDEADBEEF); radeon_ring_write(ring, 0xDEADBEEF);
radeon_ring_unlock_commit(rdev); radeon_ring_unlock_commit(rdev, ring);
} }
static void r420_cp_errata_fini(struct radeon_device *rdev) static void r420_cp_errata_fini(struct radeon_device *rdev)
{ {
struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
/* Catch the RESYNC we dispatched all the way back, /* Catch the RESYNC we dispatched all the way back,
* at the very beginning of the CP init. * at the very beginning of the CP init.
*/ */
radeon_ring_lock(rdev, 8); radeon_ring_lock(rdev, ring, 8);
radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
radeon_ring_write(rdev, R300_RB3D_DC_FINISH); radeon_ring_write(ring, R300_RB3D_DC_FINISH);
radeon_ring_unlock_commit(rdev); radeon_ring_unlock_commit(rdev, ring);
radeon_scratch_free(rdev, rdev->config.r300.resync_scratch); radeon_scratch_free(rdev, rdev->config.r300.resync_scratch);
} }
...@@ -254,6 +258,12 @@ static int r420_startup(struct radeon_device *rdev) ...@@ -254,6 +258,12 @@ static int r420_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -264,11 +274,18 @@ static int r420_startup(struct radeon_device *rdev) ...@@ -264,11 +274,18 @@ static int r420_startup(struct radeon_device *rdev)
return r; return r;
} }
r420_cp_errata_init(rdev); r420_cp_errata_init(rdev);
r = r100_ib_init(rdev);
r = radeon_ib_pool_start(rdev);
if (r)
return r;
r = r100_ib_test(rdev);
if (r) { if (r) {
dev_err(rdev->dev, "failed initializing IB (%d).\n", r); dev_err(rdev->dev, "failed testing IB (%d).\n", r);
rdev->accel_working = false;
return r; return r;
} }
return 0; return 0;
} }
...@@ -297,11 +314,14 @@ int r420_resume(struct radeon_device *rdev) ...@@ -297,11 +314,14 @@ int r420_resume(struct radeon_device *rdev)
r420_clock_resume(rdev); r420_clock_resume(rdev);
/* Initialize surface registers */ /* Initialize surface registers */
radeon_surface_init(rdev); radeon_surface_init(rdev);
rdev->accel_working = true;
return r420_startup(rdev); return r420_startup(rdev);
} }
int r420_suspend(struct radeon_device *rdev) int r420_suspend(struct radeon_device *rdev)
{ {
radeon_ib_pool_suspend(rdev);
r420_cp_errata_fini(rdev); r420_cp_errata_fini(rdev);
r100_cp_disable(rdev); r100_cp_disable(rdev);
radeon_wb_disable(rdev); radeon_wb_disable(rdev);
...@@ -414,7 +434,14 @@ int r420_init(struct radeon_device *rdev) ...@@ -414,7 +434,14 @@ int r420_init(struct radeon_device *rdev)
return r; return r;
} }
r420_set_reg_safe(rdev); r420_set_reg_safe(rdev);
r = radeon_ib_pool_init(rdev);
rdev->accel_working = true; rdev->accel_working = true;
if (r) {
dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
rdev->accel_working = false;
}
r = r420_startup(rdev); r = r420_startup(rdev);
if (r) { if (r) {
/* Somethings want wront with the accel init stop accel */ /* Somethings want wront with the accel init stop accel */
......
...@@ -187,6 +187,12 @@ static int r520_startup(struct radeon_device *rdev) ...@@ -187,6 +187,12 @@ static int r520_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
rs600_irq_set(rdev); rs600_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -196,9 +202,15 @@ static int r520_startup(struct radeon_device *rdev) ...@@ -196,9 +202,15 @@ static int r520_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failed initializing CP (%d).\n", r); dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
return r; return r;
} }
r = r100_ib_init(rdev);
r = radeon_ib_pool_start(rdev);
if (r)
return r;
r = r100_ib_test(rdev);
if (r) { if (r) {
dev_err(rdev->dev, "failed initializing IB (%d).\n", r); dev_err(rdev->dev, "failed testing IB (%d).\n", r);
rdev->accel_working = false;
return r; return r;
} }
return 0; return 0;
...@@ -223,6 +235,8 @@ int r520_resume(struct radeon_device *rdev) ...@@ -223,6 +235,8 @@ int r520_resume(struct radeon_device *rdev)
rv515_clock_startup(rdev); rv515_clock_startup(rdev);
/* Initialize surface registers */ /* Initialize surface registers */
radeon_surface_init(rdev); radeon_surface_init(rdev);
rdev->accel_working = true;
return r520_startup(rdev); return r520_startup(rdev);
} }
...@@ -292,7 +306,14 @@ int r520_init(struct radeon_device *rdev) ...@@ -292,7 +306,14 @@ int r520_init(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
rv515_set_safe_registers(rdev); rv515_set_safe_registers(rdev);
r = radeon_ib_pool_init(rdev);
rdev->accel_working = true; rdev->accel_working = true;
if (r) {
dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
rdev->accel_working = false;
}
r = r520_startup(rdev); r = r520_startup(rdev);
if (r) { if (r) {
/* Somethings want wront with the accel init stop accel */ /* Somethings want wront with the accel init stop accel */
......
This diff is collapsed.
This diff is collapsed.
...@@ -1815,7 +1815,7 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev, ...@@ -1815,7 +1815,7 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev,
dev_priv->ring.size_l2qw); dev_priv->ring.size_l2qw);
#endif #endif
RADEON_WRITE(R600_CP_SEM_WAIT_TIMER, 0x4); RADEON_WRITE(R600_CP_SEM_WAIT_TIMER, 0x0);
/* Set the write pointer delay */ /* Set the write pointer delay */
RADEON_WRITE(R600_CP_RB_WPTR_DELAY, 0); RADEON_WRITE(R600_CP_RB_WPTR_DELAY, 0);
......
...@@ -831,6 +831,8 @@ ...@@ -831,6 +831,8 @@
#define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34
#define PACKET3_INDIRECT_BUFFER_MP 0x38 #define PACKET3_INDIRECT_BUFFER_MP 0x38
#define PACKET3_MEM_SEMAPHORE 0x39 #define PACKET3_MEM_SEMAPHORE 0x39
# define PACKET3_SEM_SEL_SIGNAL (0x6 << 29)
# define PACKET3_SEM_SEL_WAIT (0x7 << 29)
#define PACKET3_MPEG_INDEX 0x3A #define PACKET3_MPEG_INDEX 0x3A
#define PACKET3_WAIT_REG_MEM 0x3C #define PACKET3_WAIT_REG_MEM 0x3C
#define PACKET3_MEM_WRITE 0x3D #define PACKET3_MEM_WRITE 0x3D
......
This diff is collapsed.
This diff is collapsed.
...@@ -58,17 +58,20 @@ void r100_fini(struct radeon_device *rdev); ...@@ -58,17 +58,20 @@ void r100_fini(struct radeon_device *rdev);
int r100_suspend(struct radeon_device *rdev); int r100_suspend(struct radeon_device *rdev);
int r100_resume(struct radeon_device *rdev); int r100_resume(struct radeon_device *rdev);
void r100_vga_set_state(struct radeon_device *rdev, bool state); void r100_vga_set_state(struct radeon_device *rdev, bool state);
bool r100_gpu_is_lockup(struct radeon_device *rdev); bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
int r100_asic_reset(struct radeon_device *rdev); int r100_asic_reset(struct radeon_device *rdev);
u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
void r100_pci_gart_tlb_flush(struct radeon_device *rdev); void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
void r100_cp_commit(struct radeon_device *rdev);
void r100_ring_start(struct radeon_device *rdev); void r100_ring_start(struct radeon_device *rdev);
int r100_irq_set(struct radeon_device *rdev); int r100_irq_set(struct radeon_device *rdev);
int r100_irq_process(struct radeon_device *rdev); int r100_irq_process(struct radeon_device *rdev);
void r100_fence_ring_emit(struct radeon_device *rdev, void r100_fence_ring_emit(struct radeon_device *rdev,
struct radeon_fence *fence); struct radeon_fence *fence);
void r100_semaphore_ring_emit(struct radeon_device *rdev,
struct radeon_ring *cp,
struct radeon_semaphore *semaphore,
bool emit_wait);
int r100_cs_parse(struct radeon_cs_parser *p); int r100_cs_parse(struct radeon_cs_parser *p);
void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg); uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg);
...@@ -83,7 +86,7 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, ...@@ -83,7 +86,7 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg,
void r100_clear_surface_reg(struct radeon_device *rdev, int reg); void r100_clear_surface_reg(struct radeon_device *rdev, int reg);
void r100_bandwidth_update(struct radeon_device *rdev); void r100_bandwidth_update(struct radeon_device *rdev);
void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
int r100_ring_test(struct radeon_device *rdev); int r100_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
void r100_hpd_init(struct radeon_device *rdev); void r100_hpd_init(struct radeon_device *rdev);
void r100_hpd_fini(struct radeon_device *rdev); void r100_hpd_fini(struct radeon_device *rdev);
bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd);
...@@ -101,12 +104,12 @@ void r100_pci_gart_disable(struct radeon_device *rdev); ...@@ -101,12 +104,12 @@ void r100_pci_gart_disable(struct radeon_device *rdev);
int r100_debugfs_mc_info_init(struct radeon_device *rdev); int r100_debugfs_mc_info_init(struct radeon_device *rdev);
int r100_gui_wait_for_idle(struct radeon_device *rdev); int r100_gui_wait_for_idle(struct radeon_device *rdev);
void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup,
struct radeon_cp *cp); struct radeon_ring *cp);
bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, bool r100_gpu_cp_is_lockup(struct radeon_device *rdev,
struct r100_gpu_lockup *lockup, struct r100_gpu_lockup *lockup,
struct radeon_cp *cp); struct radeon_ring *cp);
void r100_ib_fini(struct radeon_device *rdev); void r100_ib_fini(struct radeon_device *rdev);
int r100_ib_init(struct radeon_device *rdev); int r100_ib_test(struct radeon_device *rdev);
void r100_irq_disable(struct radeon_device *rdev); void r100_irq_disable(struct radeon_device *rdev);
void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save); void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save);
void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save); void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save);
...@@ -154,7 +157,7 @@ extern int r300_init(struct radeon_device *rdev); ...@@ -154,7 +157,7 @@ extern int r300_init(struct radeon_device *rdev);
extern void r300_fini(struct radeon_device *rdev); extern void r300_fini(struct radeon_device *rdev);
extern int r300_suspend(struct radeon_device *rdev); extern int r300_suspend(struct radeon_device *rdev);
extern int r300_resume(struct radeon_device *rdev); extern int r300_resume(struct radeon_device *rdev);
extern bool r300_gpu_is_lockup(struct radeon_device *rdev); extern bool r300_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
extern int r300_asic_reset(struct radeon_device *rdev); extern int r300_asic_reset(struct radeon_device *rdev);
extern void r300_ring_start(struct radeon_device *rdev); extern void r300_ring_start(struct radeon_device *rdev);
extern void r300_fence_ring_emit(struct radeon_device *rdev, extern void r300_fence_ring_emit(struct radeon_device *rdev,
...@@ -293,22 +296,25 @@ int r600_resume(struct radeon_device *rdev); ...@@ -293,22 +296,25 @@ int r600_resume(struct radeon_device *rdev);
void r600_vga_set_state(struct radeon_device *rdev, bool state); void r600_vga_set_state(struct radeon_device *rdev, bool state);
int r600_wb_init(struct radeon_device *rdev); int r600_wb_init(struct radeon_device *rdev);
void r600_wb_fini(struct radeon_device *rdev); void r600_wb_fini(struct radeon_device *rdev);
void r600_cp_commit(struct radeon_device *rdev);
void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); void r600_pcie_gart_tlb_flush(struct radeon_device *rdev);
uint32_t r600_pciep_rreg(struct radeon_device *rdev, uint32_t reg); uint32_t r600_pciep_rreg(struct radeon_device *rdev, uint32_t reg);
void r600_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); void r600_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
int r600_cs_parse(struct radeon_cs_parser *p); int r600_cs_parse(struct radeon_cs_parser *p);
void r600_fence_ring_emit(struct radeon_device *rdev, void r600_fence_ring_emit(struct radeon_device *rdev,
struct radeon_fence *fence); struct radeon_fence *fence);
bool r600_gpu_is_lockup(struct radeon_device *rdev); void r600_semaphore_ring_emit(struct radeon_device *rdev,
struct radeon_ring *cp,
struct radeon_semaphore *semaphore,
bool emit_wait);
bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
int r600_asic_reset(struct radeon_device *rdev); int r600_asic_reset(struct radeon_device *rdev);
int r600_set_surface_reg(struct radeon_device *rdev, int reg, int r600_set_surface_reg(struct radeon_device *rdev, int reg,
uint32_t tiling_flags, uint32_t pitch, uint32_t tiling_flags, uint32_t pitch,
uint32_t offset, uint32_t obj_size); uint32_t offset, uint32_t obj_size);
void r600_clear_surface_reg(struct radeon_device *rdev, int reg); void r600_clear_surface_reg(struct radeon_device *rdev, int reg);
int r600_ib_test(struct radeon_device *rdev); int r600_ib_test(struct radeon_device *rdev, int ring);
void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
int r600_ring_test(struct radeon_device *rdev); int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
int r600_copy_blit(struct radeon_device *rdev, int r600_copy_blit(struct radeon_device *rdev,
uint64_t src_offset, uint64_t dst_offset, uint64_t src_offset, uint64_t dst_offset,
unsigned num_gpu_pages, struct radeon_fence *fence); unsigned num_gpu_pages, struct radeon_fence *fence);
...@@ -328,7 +334,7 @@ extern int r600_get_pcie_lanes(struct radeon_device *rdev); ...@@ -328,7 +334,7 @@ extern int r600_get_pcie_lanes(struct radeon_device *rdev);
bool r600_card_posted(struct radeon_device *rdev); bool r600_card_posted(struct radeon_device *rdev);
void r600_cp_stop(struct radeon_device *rdev); void r600_cp_stop(struct radeon_device *rdev);
int r600_cp_start(struct radeon_device *rdev); int r600_cp_start(struct radeon_device *rdev);
void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); void r600_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size);
int r600_cp_resume(struct radeon_device *rdev); int r600_cp_resume(struct radeon_device *rdev);
void r600_cp_fini(struct radeon_device *rdev); void r600_cp_fini(struct radeon_device *rdev);
int r600_count_pipe_bits(uint32_t val); int r600_count_pipe_bits(uint32_t val);
...@@ -397,7 +403,7 @@ int evergreen_init(struct radeon_device *rdev); ...@@ -397,7 +403,7 @@ int evergreen_init(struct radeon_device *rdev);
void evergreen_fini(struct radeon_device *rdev); void evergreen_fini(struct radeon_device *rdev);
int evergreen_suspend(struct radeon_device *rdev); int evergreen_suspend(struct radeon_device *rdev);
int evergreen_resume(struct radeon_device *rdev); int evergreen_resume(struct radeon_device *rdev);
bool evergreen_gpu_is_lockup(struct radeon_device *rdev); bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
int evergreen_asic_reset(struct radeon_device *rdev); int evergreen_asic_reset(struct radeon_device *rdev);
void evergreen_bandwidth_update(struct radeon_device *rdev); void evergreen_bandwidth_update(struct radeon_device *rdev);
void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
...@@ -423,12 +429,14 @@ int evergreen_blit_init(struct radeon_device *rdev); ...@@ -423,12 +429,14 @@ int evergreen_blit_init(struct radeon_device *rdev);
/* /*
* cayman * cayman
*/ */
void cayman_fence_ring_emit(struct radeon_device *rdev,
struct radeon_fence *fence);
void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev); void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev);
int cayman_init(struct radeon_device *rdev); int cayman_init(struct radeon_device *rdev);
void cayman_fini(struct radeon_device *rdev); void cayman_fini(struct radeon_device *rdev);
int cayman_suspend(struct radeon_device *rdev); int cayman_suspend(struct radeon_device *rdev);
int cayman_resume(struct radeon_device *rdev); int cayman_resume(struct radeon_device *rdev);
bool cayman_gpu_is_lockup(struct radeon_device *rdev); bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
int cayman_asic_reset(struct radeon_device *rdev); int cayman_asic_reset(struct radeon_device *rdev);
#endif #endif
...@@ -43,7 +43,7 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, ...@@ -43,7 +43,7 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
start_jiffies = jiffies; start_jiffies = jiffies;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
r = radeon_fence_create(rdev, &fence); r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
if (r) if (r)
return r; return r;
......
...@@ -58,7 +58,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) ...@@ -58,7 +58,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
duplicate = false; duplicate = false;
r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4]; r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4];
for (j = 0; j < p->nrelocs; j++) { for (j = 0; j < i; j++) {
if (r->handle == p->relocs[j].handle) { if (r->handle == p->relocs[j].handle) {
p->relocs_ptr[i] = &p->relocs[j]; p->relocs_ptr[i] = &p->relocs[j];
duplicate = true; duplicate = true;
...@@ -84,7 +84,8 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) ...@@ -84,7 +84,8 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
p->relocs[i].flags = r->flags; p->relocs[i].flags = r->flags;
radeon_bo_list_add_object(&p->relocs[i].lobj, radeon_bo_list_add_object(&p->relocs[i].lobj,
&p->validated); &p->validated);
} } else
p->relocs[i].handle = 0;
} }
return radeon_bo_list_validate(&p->validated); return radeon_bo_list_validate(&p->validated);
} }
...@@ -245,7 +246,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ...@@ -245,7 +246,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
radeon_mutex_unlock(&rdev->cs_mutex); radeon_mutex_unlock(&rdev->cs_mutex);
return r; return r;
} }
r = radeon_ib_get(rdev, &parser.ib); r = radeon_ib_get(rdev, RADEON_RING_TYPE_GFX_INDEX, &parser.ib);
if (r) { if (r) {
DRM_ERROR("Failed to get ib !\n"); DRM_ERROR("Failed to get ib !\n");
radeon_cs_parser_fini(&parser, r); radeon_cs_parser_fini(&parser, r);
......
...@@ -718,17 +718,20 @@ int radeon_device_init(struct radeon_device *rdev, ...@@ -718,17 +718,20 @@ int radeon_device_init(struct radeon_device *rdev,
* can recall function without having locking issues */ * can recall function without having locking issues */
radeon_mutex_init(&rdev->cs_mutex); radeon_mutex_init(&rdev->cs_mutex);
mutex_init(&rdev->ib_pool.mutex); mutex_init(&rdev->ib_pool.mutex);
mutex_init(&rdev->cp.mutex); for (i = 0; i < RADEON_NUM_RINGS; ++i)
mutex_init(&rdev->ring[i].mutex);
mutex_init(&rdev->dc_hw_i2c_mutex); mutex_init(&rdev->dc_hw_i2c_mutex);
if (rdev->family >= CHIP_R600) if (rdev->family >= CHIP_R600)
spin_lock_init(&rdev->ih.lock); spin_lock_init(&rdev->ih.lock);
mutex_init(&rdev->gem.mutex); mutex_init(&rdev->gem.mutex);
mutex_init(&rdev->pm.mutex); mutex_init(&rdev->pm.mutex);
mutex_init(&rdev->vram_mutex); mutex_init(&rdev->vram_mutex);
rwlock_init(&rdev->fence_drv.lock); rwlock_init(&rdev->fence_lock);
rwlock_init(&rdev->semaphore_drv.lock);
INIT_LIST_HEAD(&rdev->gem.objects); INIT_LIST_HEAD(&rdev->gem.objects);
init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.vblank_queue);
init_waitqueue_head(&rdev->irq.idle_queue); init_waitqueue_head(&rdev->irq.idle_queue);
INIT_LIST_HEAD(&rdev->semaphore_drv.free);
/* Set asic functions */ /* Set asic functions */
r = radeon_asic_init(rdev); r = radeon_asic_init(rdev);
...@@ -820,15 +823,20 @@ int radeon_device_init(struct radeon_device *rdev, ...@@ -820,15 +823,20 @@ int radeon_device_init(struct radeon_device *rdev,
if (r) if (r)
return r; return r;
} }
if (radeon_testing) { if ((radeon_testing & 1)) {
radeon_test_moves(rdev); radeon_test_moves(rdev);
} }
if ((radeon_testing & 2)) {
radeon_test_syncing(rdev);
}
if (radeon_benchmarking) { if (radeon_benchmarking) {
radeon_benchmark(rdev, radeon_benchmarking); radeon_benchmark(rdev, radeon_benchmarking);
} }
return 0; return 0;
} }
static void radeon_debugfs_remove_files(struct radeon_device *rdev);
void radeon_device_fini(struct radeon_device *rdev) void radeon_device_fini(struct radeon_device *rdev)
{ {
DRM_INFO("radeon: finishing device.\n"); DRM_INFO("radeon: finishing device.\n");
...@@ -843,6 +851,7 @@ void radeon_device_fini(struct radeon_device *rdev) ...@@ -843,6 +851,7 @@ void radeon_device_fini(struct radeon_device *rdev)
rdev->rio_mem = NULL; rdev->rio_mem = NULL;
iounmap(rdev->rmmio); iounmap(rdev->rmmio);
rdev->rmmio = NULL; rdev->rmmio = NULL;
radeon_debugfs_remove_files(rdev);
} }
...@@ -854,7 +863,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) ...@@ -854,7 +863,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
struct radeon_device *rdev; struct radeon_device *rdev;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_connector *connector; struct drm_connector *connector;
int r; int i, r;
if (dev == NULL || dev->dev_private == NULL) { if (dev == NULL || dev->dev_private == NULL) {
return -ENODEV; return -ENODEV;
...@@ -893,7 +902,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) ...@@ -893,7 +902,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
/* evict vram memory */ /* evict vram memory */
radeon_bo_evict_vram(rdev); radeon_bo_evict_vram(rdev);
/* wait for gpu to finish processing current batch */ /* wait for gpu to finish processing current batch */
radeon_fence_wait_last(rdev); for (i = 0; i < RADEON_NUM_RINGS; i++)
radeon_fence_wait_last(rdev, i);
radeon_save_bios_scratch_regs(rdev); radeon_save_bios_scratch_regs(rdev);
...@@ -992,36 +1002,29 @@ int radeon_gpu_reset(struct radeon_device *rdev) ...@@ -992,36 +1002,29 @@ int radeon_gpu_reset(struct radeon_device *rdev)
/* /*
* Debugfs * Debugfs
*/ */
struct radeon_debugfs {
struct drm_info_list *files;
unsigned num_files;
};
static struct radeon_debugfs _radeon_debugfs[RADEON_DEBUGFS_MAX_COMPONENTS];
static unsigned _radeon_debugfs_count = 0;
int radeon_debugfs_add_files(struct radeon_device *rdev, int radeon_debugfs_add_files(struct radeon_device *rdev,
struct drm_info_list *files, struct drm_info_list *files,
unsigned nfiles) unsigned nfiles)
{ {
unsigned i; unsigned i;
for (i = 0; i < _radeon_debugfs_count; i++) { for (i = 0; i < rdev->debugfs_count; i++) {
if (_radeon_debugfs[i].files == files) { if (rdev->debugfs[i].files == files) {
/* Already registered */ /* Already registered */
return 0; return 0;
} }
} }
i = _radeon_debugfs_count + 1; i = rdev->debugfs_count + 1;
if (i > RADEON_DEBUGFS_MAX_COMPONENTS) { if (i > RADEON_DEBUGFS_MAX_COMPONENTS) {
DRM_ERROR("Reached maximum number of debugfs components.\n"); DRM_ERROR("Reached maximum number of debugfs components.\n");
DRM_ERROR("Report so we increase " DRM_ERROR("Report so we increase "
"RADEON_DEBUGFS_MAX_COMPONENTS.\n"); "RADEON_DEBUGFS_MAX_COMPONENTS.\n");
return -EINVAL; return -EINVAL;
} }
_radeon_debugfs[_radeon_debugfs_count].files = files; rdev->debugfs[rdev->debugfs_count].files = files;
_radeon_debugfs[_radeon_debugfs_count].num_files = nfiles; rdev->debugfs[rdev->debugfs_count].num_files = nfiles;
_radeon_debugfs_count = i; rdev->debugfs_count = i;
#if defined(CONFIG_DEBUG_FS) #if defined(CONFIG_DEBUG_FS)
drm_debugfs_create_files(files, nfiles, drm_debugfs_create_files(files, nfiles,
rdev->ddev->control->debugfs_root, rdev->ddev->control->debugfs_root,
...@@ -1033,6 +1036,22 @@ int radeon_debugfs_add_files(struct radeon_device *rdev, ...@@ -1033,6 +1036,22 @@ int radeon_debugfs_add_files(struct radeon_device *rdev,
return 0; return 0;
} }
static void radeon_debugfs_remove_files(struct radeon_device *rdev)
{
#if defined(CONFIG_DEBUG_FS)
unsigned i;
for (i = 0; i < rdev->debugfs_count; i++) {
drm_debugfs_remove_files(rdev->debugfs[i].files,
rdev->debugfs[i].num_files,
rdev->ddev->control);
drm_debugfs_remove_files(rdev->debugfs[i].files,
rdev->debugfs[i].num_files,
rdev->ddev->primary);
}
#endif
}
#if defined(CONFIG_DEBUG_FS) #if defined(CONFIG_DEBUG_FS)
int radeon_debugfs_init(struct drm_minor *minor) int radeon_debugfs_init(struct drm_minor *minor)
{ {
...@@ -1041,11 +1060,5 @@ int radeon_debugfs_init(struct drm_minor *minor) ...@@ -1041,11 +1060,5 @@ int radeon_debugfs_init(struct drm_minor *minor)
void radeon_debugfs_cleanup(struct drm_minor *minor) void radeon_debugfs_cleanup(struct drm_minor *minor)
{ {
unsigned i;
for (i = 0; i < _radeon_debugfs_count; i++) {
drm_debugfs_remove_files(_radeon_debugfs[i].files,
_radeon_debugfs[i].num_files, minor);
}
} }
#endif #endif
This diff is collapsed.
...@@ -152,6 +152,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, ...@@ -152,6 +152,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
struct drm_radeon_gem_info *args = data; struct drm_radeon_gem_info *args = data;
struct ttm_mem_type_manager *man; struct ttm_mem_type_manager *man;
unsigned i;
man = &rdev->mman.bdev.man[TTM_PL_VRAM]; man = &rdev->mman.bdev.man[TTM_PL_VRAM];
...@@ -160,8 +161,9 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, ...@@ -160,8 +161,9 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
if (rdev->stollen_vga_memory) if (rdev->stollen_vga_memory)
args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
args->vram_visible -= radeon_fbdev_total_size(rdev); args->vram_visible -= radeon_fbdev_total_size(rdev);
args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 - args->gart_size = rdev->mc.gtt_size - 4096 - RADEON_IB_POOL_SIZE*64*1024;
RADEON_IB_POOL_SIZE*64*1024; for(i = 0; i < RADEON_NUM_RINGS; ++i)
args->gart_size -= rdev->ring[i].ring_size;
return 0; return 0;
} }
......
...@@ -65,7 +65,8 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev) ...@@ -65,7 +65,8 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
unsigned i; unsigned i;
/* Disable *all* interrupts */ /* Disable *all* interrupts */
rdev->irq.sw_int = false; for (i = 0; i < RADEON_NUM_RINGS; i++)
rdev->irq.sw_int[i] = false;
rdev->irq.gui_idle = false; rdev->irq.gui_idle = false;
for (i = 0; i < RADEON_MAX_HPD_PINS; i++) for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
rdev->irq.hpd[i] = false; rdev->irq.hpd[i] = false;
...@@ -81,9 +82,11 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev) ...@@ -81,9 +82,11 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
int radeon_driver_irq_postinstall_kms(struct drm_device *dev) int radeon_driver_irq_postinstall_kms(struct drm_device *dev)
{ {
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
unsigned i;
dev->max_vblank_count = 0x001fffff; dev->max_vblank_count = 0x001fffff;
rdev->irq.sw_int = true; for (i = 0; i < RADEON_NUM_RINGS; i++)
rdev->irq.sw_int[i] = true;
radeon_irq_set(rdev); radeon_irq_set(rdev);
return 0; return 0;
} }
...@@ -97,7 +100,8 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) ...@@ -97,7 +100,8 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
return; return;
} }
/* Disable *all* interrupts */ /* Disable *all* interrupts */
rdev->irq.sw_int = false; for (i = 0; i < RADEON_NUM_RINGS; i++)
rdev->irq.sw_int[i] = false;
rdev->irq.gui_idle = false; rdev->irq.gui_idle = false;
for (i = 0; i < RADEON_MAX_HPD_PINS; i++) for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
rdev->irq.hpd[i] = false; rdev->irq.hpd[i] = false;
...@@ -194,26 +198,26 @@ void radeon_irq_kms_fini(struct radeon_device *rdev) ...@@ -194,26 +198,26 @@ void radeon_irq_kms_fini(struct radeon_device *rdev)
flush_work_sync(&rdev->hotplug_work); flush_work_sync(&rdev->hotplug_work);
} }
void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring)
{ {
unsigned long irqflags; unsigned long irqflags;
spin_lock_irqsave(&rdev->irq.sw_lock, irqflags); spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
if (rdev->ddev->irq_enabled && (++rdev->irq.sw_refcount == 1)) { if (rdev->ddev->irq_enabled && (++rdev->irq.sw_refcount[ring] == 1)) {
rdev->irq.sw_int = true; rdev->irq.sw_int[ring] = true;
radeon_irq_set(rdev); radeon_irq_set(rdev);
} }
spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags); spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
} }
void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev) void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring)
{ {
unsigned long irqflags; unsigned long irqflags;
spin_lock_irqsave(&rdev->irq.sw_lock, irqflags); spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
BUG_ON(rdev->ddev->irq_enabled && rdev->irq.sw_refcount <= 0); BUG_ON(rdev->ddev->irq_enabled && rdev->irq.sw_refcount[ring] <= 0);
if (rdev->ddev->irq_enabled && (--rdev->irq.sw_refcount == 0)) { if (rdev->ddev->irq_enabled && (--rdev->irq.sw_refcount[ring] == 0)) {
rdev->irq.sw_int = false; rdev->irq.sw_int[ring] = false;
radeon_irq_set(rdev); radeon_irq_set(rdev);
} }
spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags); spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
......
...@@ -128,4 +128,24 @@ extern void radeon_bo_move_notify(struct ttm_buffer_object *bo, ...@@ -128,4 +128,24 @@ extern void radeon_bo_move_notify(struct ttm_buffer_object *bo,
struct ttm_mem_reg *mem); struct ttm_mem_reg *mem);
extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo); extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
extern int radeon_bo_get_surface_reg(struct radeon_bo *bo); extern int radeon_bo_get_surface_reg(struct radeon_bo *bo);
/*
* sub allocation
*/
extern int radeon_sa_bo_manager_init(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager,
unsigned size, u32 domain);
extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager);
extern int radeon_sa_bo_manager_start(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager);
extern int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager);
extern int radeon_sa_bo_new(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager,
struct radeon_sa_bo *sa_bo,
unsigned size, unsigned align);
extern void radeon_sa_bo_free(struct radeon_device *rdev,
struct radeon_sa_bo *sa_bo);
#endif #endif
...@@ -252,7 +252,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) ...@@ -252,7 +252,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
mutex_lock(&rdev->ddev->struct_mutex); mutex_lock(&rdev->ddev->struct_mutex);
mutex_lock(&rdev->vram_mutex); mutex_lock(&rdev->vram_mutex);
mutex_lock(&rdev->cp.mutex); for (i = 0; i < RADEON_NUM_RINGS; ++i) {
if (rdev->ring[i].ring_obj)
mutex_lock(&rdev->ring[i].mutex);
}
/* gui idle int has issues on older chips it seems */ /* gui idle int has issues on older chips it seems */
if (rdev->family >= CHIP_R600) { if (rdev->family >= CHIP_R600) {
...@@ -268,12 +271,13 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) ...@@ -268,12 +271,13 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
radeon_irq_set(rdev); radeon_irq_set(rdev);
} }
} else { } else {
if (rdev->cp.ready) { struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
if (ring->ready) {
struct radeon_fence *fence; struct radeon_fence *fence;
radeon_ring_alloc(rdev, 64); radeon_ring_alloc(rdev, ring, 64);
radeon_fence_create(rdev, &fence); radeon_fence_create(rdev, &fence, radeon_ring_index(rdev, ring));
radeon_fence_emit(rdev, fence); radeon_fence_emit(rdev, fence);
radeon_ring_commit(rdev); radeon_ring_commit(rdev, ring);
radeon_fence_wait(fence, false); radeon_fence_wait(fence, false);
radeon_fence_unref(&fence); radeon_fence_unref(&fence);
} }
...@@ -307,7 +311,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) ...@@ -307,7 +311,10 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
mutex_unlock(&rdev->cp.mutex); for (i = 0; i < RADEON_NUM_RINGS; ++i) {
if (rdev->ring[i].ring_obj)
mutex_unlock(&rdev->ring[i].mutex);
}
mutex_unlock(&rdev->vram_mutex); mutex_unlock(&rdev->vram_mutex);
mutex_unlock(&rdev->ddev->struct_mutex); mutex_unlock(&rdev->ddev->struct_mutex);
} }
...@@ -795,19 +802,14 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work) ...@@ -795,19 +802,14 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)
resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev); resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
mutex_lock(&rdev->pm.mutex); mutex_lock(&rdev->pm.mutex);
if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) { if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) {
unsigned long irq_flags;
int not_processed = 0; int not_processed = 0;
int i;
read_lock_irqsave(&rdev->fence_drv.lock, irq_flags); for (i = 0; i < RADEON_NUM_RINGS; ++i) {
if (!list_empty(&rdev->fence_drv.emited)) { not_processed += radeon_fence_count_emitted(rdev, i);
struct list_head *ptr; if (not_processed >= 3)
list_for_each(ptr, &rdev->fence_drv.emited) {
/* count up to 3, that's enought info */
if (++not_processed >= 3)
break; break;
} }
}
read_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
if (not_processed >= 3) { /* should upclock */ if (not_processed >= 3) { /* should upclock */
if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) { if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -188,7 +188,7 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo, ...@@ -188,7 +188,7 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo,
rbo = container_of(bo, struct radeon_bo, tbo); rbo = container_of(bo, struct radeon_bo, tbo);
switch (bo->mem.mem_type) { switch (bo->mem.mem_type) {
case TTM_PL_VRAM: case TTM_PL_VRAM:
if (rbo->rdev->cp.ready == false) if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false)
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
else else
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
...@@ -226,7 +226,7 @@ static int radeon_move_blit(struct ttm_buffer_object *bo, ...@@ -226,7 +226,7 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
int r; int r;
rdev = radeon_get_rdev(bo->bdev); rdev = radeon_get_rdev(bo->bdev);
r = radeon_fence_create(rdev, &fence); r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
if (unlikely(r)) { if (unlikely(r)) {
return r; return r;
} }
...@@ -255,7 +255,7 @@ static int radeon_move_blit(struct ttm_buffer_object *bo, ...@@ -255,7 +255,7 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
return -EINVAL; return -EINVAL;
} }
if (!rdev->cp.ready) { if (!rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready) {
DRM_ERROR("Trying to move memory with CP turned off.\n"); DRM_ERROR("Trying to move memory with CP turned off.\n");
return -EINVAL; return -EINVAL;
} }
...@@ -380,7 +380,7 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, ...@@ -380,7 +380,7 @@ static int radeon_bo_move(struct ttm_buffer_object *bo,
radeon_move_null(bo, new_mem); radeon_move_null(bo, new_mem);
return 0; return 0;
} }
if (!rdev->cp.ready || rdev->asic->copy == NULL) { if (!rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready || rdev->asic->copy == NULL) {
/* use memcpy */ /* use memcpy */
goto memcpy; goto memcpy;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment