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
This commit is contained in:
commit
a3f5aed42f
|
@ -2401,6 +2401,12 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
|
|||
{
|
||||
struct evergreen_mc_save save;
|
||||
|
||||
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
|
||||
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
|
||||
|
||||
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
|
||||
reset_mask &= ~RADEON_RESET_DMA;
|
||||
|
||||
if (reset_mask == 0)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -1409,6 +1409,12 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
|
|||
{
|
||||
struct evergreen_mc_save save;
|
||||
|
||||
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
|
||||
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
|
||||
|
||||
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
|
||||
reset_mask &= ~RADEON_RESET_DMA;
|
||||
|
||||
if (reset_mask == 0)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -1378,6 +1378,12 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
|
|||
{
|
||||
struct rv515_mc_save save;
|
||||
|
||||
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
|
||||
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
|
||||
|
||||
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
|
||||
reset_mask &= ~RADEON_RESET_DMA;
|
||||
|
||||
if (reset_mask == 0)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -324,7 +324,6 @@ struct radeon_bo {
|
|||
struct list_head list;
|
||||
/* Protected by tbo.reserved */
|
||||
u32 placements[3];
|
||||
u32 busy_placements[3];
|
||||
struct ttm_placement placement;
|
||||
struct ttm_buffer_object tbo;
|
||||
struct ttm_bo_kmap_obj kmap;
|
||||
|
@ -654,6 +653,8 @@ struct radeon_ring {
|
|||
u32 ptr_reg_mask;
|
||||
u32 nop;
|
||||
u32 idx;
|
||||
u64 last_semaphore_signal_addr;
|
||||
u64 last_semaphore_wait_addr;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -69,9 +69,10 @@
|
|||
* 2.26.0 - r600-eg: fix htile size computation
|
||||
* 2.27.0 - r600-SI: Add CS ioctl support for async DMA
|
||||
* 2.28.0 - r600-eg: Add MEM_WRITE packet support
|
||||
* 2.29.0 - R500 FP16 color clear registers
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 2
|
||||
#define KMS_DRIVER_MINOR 28
|
||||
#define KMS_DRIVER_MINOR 29
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
|
|
@ -84,6 +84,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
|||
rbo->placement.fpfn = 0;
|
||||
rbo->placement.lpfn = 0;
|
||||
rbo->placement.placement = rbo->placements;
|
||||
rbo->placement.busy_placement = rbo->placements;
|
||||
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
||||
rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
|
||||
TTM_PL_FLAG_VRAM;
|
||||
|
@ -104,14 +105,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
|||
if (!c)
|
||||
rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
|
||||
rbo->placement.num_placement = c;
|
||||
|
||||
c = 0;
|
||||
rbo->placement.busy_placement = rbo->busy_placements;
|
||||
if (rbo->rdev->flags & RADEON_IS_AGP) {
|
||||
rbo->busy_placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
|
||||
} else {
|
||||
rbo->busy_placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
|
||||
}
|
||||
rbo->placement.num_busy_placement = c;
|
||||
}
|
||||
|
||||
|
@ -357,6 +350,7 @@ int radeon_bo_list_validate(struct list_head *head)
|
|||
{
|
||||
struct radeon_bo_list *lobj;
|
||||
struct radeon_bo *bo;
|
||||
u32 domain;
|
||||
int r;
|
||||
|
||||
r = ttm_eu_reserve_buffers(head);
|
||||
|
@ -366,9 +360,17 @@ int radeon_bo_list_validate(struct list_head *head)
|
|||
list_for_each_entry(lobj, head, tv.head) {
|
||||
bo = lobj->bo;
|
||||
if (!bo->pin_count) {
|
||||
domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
|
||||
|
||||
retry:
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
r = ttm_bo_validate(&bo->tbo, &bo->placement,
|
||||
true, false);
|
||||
if (unlikely(r)) {
|
||||
if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
domain |= RADEON_GEM_DOMAIN_GTT;
|
||||
goto retry;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -784,6 +784,8 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
|
|||
}
|
||||
seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr);
|
||||
seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr);
|
||||
seq_printf(m, "last semaphore signal addr : 0x%016llx\n", ring->last_semaphore_signal_addr);
|
||||
seq_printf(m, "last semaphore wait addr : 0x%016llx\n", ring->last_semaphore_wait_addr);
|
||||
seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
|
||||
seq_printf(m, "%u dwords in ring\n", count);
|
||||
/* print 8 dw before current rptr as often it's the last executed
|
||||
|
|
|
@ -95,6 +95,10 @@ int radeon_semaphore_sync_rings(struct radeon_device *rdev,
|
|||
/* we assume caller has already allocated space on waiters ring */
|
||||
radeon_semaphore_emit_wait(rdev, waiter, semaphore);
|
||||
|
||||
/* for debugging lockup only, used by sysfs debug files */
|
||||
rdev->ring[signaler].last_semaphore_signal_addr = semaphore->gpu_addr;
|
||||
rdev->ring[waiter].last_semaphore_wait_addr = semaphore->gpu_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -324,6 +324,8 @@ rv515 0x6d40
|
|||
0x46AC US_OUT_FMT_2
|
||||
0x46B0 US_OUT_FMT_3
|
||||
0x46B4 US_W_FMT
|
||||
0x46C0 RB3D_COLOR_CLEAR_VALUE_AR
|
||||
0x46C4 RB3D_COLOR_CLEAR_VALUE_GB
|
||||
0x4BC0 FG_FOG_BLEND
|
||||
0x4BC4 FG_FOG_FACTOR
|
||||
0x4BC8 FG_FOG_COLOR_R
|
||||
|
|
|
@ -2215,6 +2215,12 @@ static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
|
|||
{
|
||||
struct evergreen_mc_save save;
|
||||
|
||||
if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
|
||||
reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE);
|
||||
|
||||
if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
|
||||
reset_mask &= ~RADEON_RESET_DMA;
|
||||
|
||||
if (reset_mask == 0)
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue