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
10 changed files with 46 additions and 10 deletions
|
@ -2401,6 +2401,12 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
|
||||||
{
|
{
|
||||||
struct evergreen_mc_save save;
|
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)
|
if (reset_mask == 0)
|
||||||
return 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;
|
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)
|
if (reset_mask == 0)
|
||||||
return 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;
|
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)
|
if (reset_mask == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -324,7 +324,6 @@ struct radeon_bo {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
/* Protected by tbo.reserved */
|
/* Protected by tbo.reserved */
|
||||||
u32 placements[3];
|
u32 placements[3];
|
||||||
u32 busy_placements[3];
|
|
||||||
struct ttm_placement placement;
|
struct ttm_placement placement;
|
||||||
struct ttm_buffer_object tbo;
|
struct ttm_buffer_object tbo;
|
||||||
struct ttm_bo_kmap_obj kmap;
|
struct ttm_bo_kmap_obj kmap;
|
||||||
|
@ -654,6 +653,8 @@ struct radeon_ring {
|
||||||
u32 ptr_reg_mask;
|
u32 ptr_reg_mask;
|
||||||
u32 nop;
|
u32 nop;
|
||||||
u32 idx;
|
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.26.0 - r600-eg: fix htile size computation
|
||||||
* 2.27.0 - r600-SI: Add CS ioctl support for async DMA
|
* 2.27.0 - r600-SI: Add CS ioctl support for async DMA
|
||||||
* 2.28.0 - r600-eg: Add MEM_WRITE packet support
|
* 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_MAJOR 2
|
||||||
#define KMS_DRIVER_MINOR 28
|
#define KMS_DRIVER_MINOR 29
|
||||||
#define KMS_DRIVER_PATCHLEVEL 0
|
#define KMS_DRIVER_PATCHLEVEL 0
|
||||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
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.fpfn = 0;
|
||||||
rbo->placement.lpfn = 0;
|
rbo->placement.lpfn = 0;
|
||||||
rbo->placement.placement = rbo->placements;
|
rbo->placement.placement = rbo->placements;
|
||||||
|
rbo->placement.busy_placement = rbo->placements;
|
||||||
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
||||||
rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
|
rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
|
||||||
TTM_PL_FLAG_VRAM;
|
TTM_PL_FLAG_VRAM;
|
||||||
|
@ -104,14 +105,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
||||||
if (!c)
|
if (!c)
|
||||||
rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
|
rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
|
||||||
rbo->placement.num_placement = c;
|
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;
|
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_list *lobj;
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
|
u32 domain;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = ttm_eu_reserve_buffers(head);
|
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) {
|
list_for_each_entry(lobj, head, tv.head) {
|
||||||
bo = lobj->bo;
|
bo = lobj->bo;
|
||||||
if (!bo->pin_count) {
|
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,
|
r = ttm_bo_validate(&bo->tbo, &bo->placement,
|
||||||
true, false);
|
true, false);
|
||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
|
if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||||
|
domain |= RADEON_GEM_DOMAIN_GTT;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
return r;
|
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 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, "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 free dwords in ring\n", ring->ring_free_dw);
|
||||||
seq_printf(m, "%u dwords in ring\n", count);
|
seq_printf(m, "%u dwords in ring\n", count);
|
||||||
/* print 8 dw before current rptr as often it's the last executed
|
/* 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 */
|
/* we assume caller has already allocated space on waiters ring */
|
||||||
radeon_semaphore_emit_wait(rdev, waiter, semaphore);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -324,6 +324,8 @@ rv515 0x6d40
|
||||||
0x46AC US_OUT_FMT_2
|
0x46AC US_OUT_FMT_2
|
||||||
0x46B0 US_OUT_FMT_3
|
0x46B0 US_OUT_FMT_3
|
||||||
0x46B4 US_W_FMT
|
0x46B4 US_W_FMT
|
||||||
|
0x46C0 RB3D_COLOR_CLEAR_VALUE_AR
|
||||||
|
0x46C4 RB3D_COLOR_CLEAR_VALUE_GB
|
||||||
0x4BC0 FG_FOG_BLEND
|
0x4BC0 FG_FOG_BLEND
|
||||||
0x4BC4 FG_FOG_FACTOR
|
0x4BC4 FG_FOG_FACTOR
|
||||||
0x4BC8 FG_FOG_COLOR_R
|
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;
|
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)
|
if (reset_mask == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue