Skip to content

Commit a3f5aed

Browse files
committed
Merge branch 'drm-fixes-3.8' of git://people.freedesktop.org/~agd5f/linux into drm-next
A number of fixes, and one revert for a patch having some wierd side effects. * 'drm-fixes-3.8' of git://people.freedesktop.org/~agd5f/linux: Revert "drm/radeon: do not move bo to different placement at each cs" drm/radeon: improve semaphore debugging on lockup drm/radeon: allow FP16 color clear registers on r500 drm/radeon: clear reset flags if engines are idle
2 parents 7b4cf99 + 2070787 commit a3f5aed

File tree

10 files changed

+46
-10
lines changed

10 files changed

+46
-10
lines changed

drivers/gpu/drm/radeon/evergreen.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,6 +2401,12 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
24012401
{
24022402
struct evergreen_mc_save save;
24032403

2404+
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
2405+
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
2406+
2407+
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
2408+
reset_mask &= ~RADEON_RESET_DMA;
2409+
24042410
if (reset_mask == 0)
24052411
return 0;
24062412

drivers/gpu/drm/radeon/ni.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,6 +1409,12 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
14091409
{
14101410
struct evergreen_mc_save save;
14111411

1412+
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1413+
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
1414+
1415+
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
1416+
reset_mask &= ~RADEON_RESET_DMA;
1417+
14121418
if (reset_mask == 0)
14131419
return 0;
14141420

drivers/gpu/drm/radeon/r600.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,6 +1378,12 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
13781378
{
13791379
struct rv515_mc_save save;
13801380

1381+
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1382+
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
1383+
1384+
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
1385+
reset_mask &= ~RADEON_RESET_DMA;
1386+
13811387
if (reset_mask == 0)
13821388
return 0;
13831389

drivers/gpu/drm/radeon/radeon.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,6 @@ struct radeon_bo {
324324
struct list_head list;
325325
/* Protected by tbo.reserved */
326326
u32 placements[3];
327-
u32 busy_placements[3];
328327
struct ttm_placement placement;
329328
struct ttm_buffer_object tbo;
330329
struct ttm_bo_kmap_obj kmap;
@@ -654,6 +653,8 @@ struct radeon_ring {
654653
u32 ptr_reg_mask;
655654
u32 nop;
656655
u32 idx;
656+
u64 last_semaphore_signal_addr;
657+
u64 last_semaphore_wait_addr;
657658
};
658659

659660
/*

drivers/gpu/drm/radeon/radeon_drv.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@
6969
* 2.26.0 - r600-eg: fix htile size computation
7070
* 2.27.0 - r600-SI: Add CS ioctl support for async DMA
7171
* 2.28.0 - r600-eg: Add MEM_WRITE packet support
72+
* 2.29.0 - R500 FP16 color clear registers
7273
*/
7374
#define KMS_DRIVER_MAJOR 2
74-
#define KMS_DRIVER_MINOR 28
75+
#define KMS_DRIVER_MINOR 29
7576
#define KMS_DRIVER_PATCHLEVEL 0
7677
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
7778
int radeon_driver_unload_kms(struct drm_device *dev);

drivers/gpu/drm/radeon/radeon_object.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
8484
rbo->placement.fpfn = 0;
8585
rbo->placement.lpfn = 0;
8686
rbo->placement.placement = rbo->placements;
87+
rbo->placement.busy_placement = rbo->placements;
8788
if (domain & RADEON_GEM_DOMAIN_VRAM)
8889
rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
8990
TTM_PL_FLAG_VRAM;
@@ -104,14 +105,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
104105
if (!c)
105106
rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
106107
rbo->placement.num_placement = c;
107-
108-
c = 0;
109-
rbo->placement.busy_placement = rbo->busy_placements;
110-
if (rbo->rdev->flags & RADEON_IS_AGP) {
111-
rbo->busy_placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
112-
} else {
113-
rbo->busy_placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
114-
}
115108
rbo->placement.num_busy_placement = c;
116109
}
117110

@@ -357,6 +350,7 @@ int radeon_bo_list_validate(struct list_head *head)
357350
{
358351
struct radeon_bo_list *lobj;
359352
struct radeon_bo *bo;
353+
u32 domain;
360354
int r;
361355

362356
r = ttm_eu_reserve_buffers(head);
@@ -366,9 +360,17 @@ int radeon_bo_list_validate(struct list_head *head)
366360
list_for_each_entry(lobj, head, tv.head) {
367361
bo = lobj->bo;
368362
if (!bo->pin_count) {
363+
domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
364+
365+
retry:
366+
radeon_ttm_placement_from_domain(bo, domain);
369367
r = ttm_bo_validate(&bo->tbo, &bo->placement,
370368
true, false);
371369
if (unlikely(r)) {
370+
if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
371+
domain |= RADEON_GEM_DOMAIN_GTT;
372+
goto retry;
373+
}
372374
return r;
373375
}
374376
}

drivers/gpu/drm/radeon/radeon_ring.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,8 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
784784
}
785785
seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr);
786786
seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr);
787+
seq_printf(m, "last semaphore signal addr : 0x%016llx\n", ring->last_semaphore_signal_addr);
788+
seq_printf(m, "last semaphore wait addr : 0x%016llx\n", ring->last_semaphore_wait_addr);
787789
seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
788790
seq_printf(m, "%u dwords in ring\n", count);
789791
/* print 8 dw before current rptr as often it's the last executed

drivers/gpu/drm/radeon/radeon_semaphore.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ int radeon_semaphore_sync_rings(struct radeon_device *rdev,
9595
/* we assume caller has already allocated space on waiters ring */
9696
radeon_semaphore_emit_wait(rdev, waiter, semaphore);
9797

98+
/* for debugging lockup only, used by sysfs debug files */
99+
rdev->ring[signaler].last_semaphore_signal_addr = semaphore->gpu_addr;
100+
rdev->ring[waiter].last_semaphore_wait_addr = semaphore->gpu_addr;
101+
98102
return 0;
99103
}
100104

drivers/gpu/drm/radeon/reg_srcs/rv515

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ rv515 0x6d40
324324
0x46AC US_OUT_FMT_2
325325
0x46B0 US_OUT_FMT_3
326326
0x46B4 US_W_FMT
327+
0x46C0 RB3D_COLOR_CLEAR_VALUE_AR
328+
0x46C4 RB3D_COLOR_CLEAR_VALUE_GB
327329
0x4BC0 FG_FOG_BLEND
328330
0x4BC4 FG_FOG_FACTOR
329331
0x4BC8 FG_FOG_COLOR_R

drivers/gpu/drm/radeon/si.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,6 +2215,12 @@ static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
22152215
{
22162216
struct evergreen_mc_save save;
22172217

2218+
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
2219+
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
2220+
2221+
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
2222+
reset_mask &= ~RADEON_RESET_DMA;
2223+
22182224
if (reset_mask == 0)
22192225
return 0;
22202226

0 commit comments

Comments
 (0)