aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c20
-rw-r--r--drivers/gpu/drm/radeon/cik.c6
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c8
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c4
-rw-r--r--drivers/gpu/drm/radeon/ni.c6
-rw-r--r--drivers/gpu/drm/radeon/ni_dma.c8
-rw-r--r--drivers/gpu/drm/radeon/r600.c29
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c9
-rw-r--r--drivers/gpu/drm/radeon/radeon_trace.h21
-rw-r--r--drivers/gpu/drm/radeon/rv770.c3
-rw-r--r--drivers/gpu/drm/radeon/si.c8
-rw-r--r--drivers/gpu/drm/radeon/si_dpm.c5
-rw-r--r--drivers/gpu/drm/radeon/sid.h2
19 files changed, 102 insertions, 53 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 4cf678306c9c..a9338c85630f 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -209,6 +209,16 @@ static void atombios_enable_crtc_memreq(struct drm_crtc *crtc, int state)
209 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 209 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
210} 210}
211 211
212static const u32 vga_control_regs[6] =
213{
214 AVIVO_D1VGA_CONTROL,
215 AVIVO_D2VGA_CONTROL,
216 EVERGREEN_D3VGA_CONTROL,
217 EVERGREEN_D4VGA_CONTROL,
218 EVERGREEN_D5VGA_CONTROL,
219 EVERGREEN_D6VGA_CONTROL,
220};
221
212static void atombios_blank_crtc(struct drm_crtc *crtc, int state) 222static void atombios_blank_crtc(struct drm_crtc *crtc, int state)
213{ 223{
214 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 224 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
@@ -216,13 +226,23 @@ static void atombios_blank_crtc(struct drm_crtc *crtc, int state)
216 struct radeon_device *rdev = dev->dev_private; 226 struct radeon_device *rdev = dev->dev_private;
217 int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); 227 int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC);
218 BLANK_CRTC_PS_ALLOCATION args; 228 BLANK_CRTC_PS_ALLOCATION args;
229 u32 vga_control = 0;
219 230
220 memset(&args, 0, sizeof(args)); 231 memset(&args, 0, sizeof(args));
221 232
233 if (ASIC_IS_DCE8(rdev)) {
234 vga_control = RREG32(vga_control_regs[radeon_crtc->crtc_id]);
235 WREG32(vga_control_regs[radeon_crtc->crtc_id], vga_control | 1);
236 }
237
222 args.ucCRTC = radeon_crtc->crtc_id; 238 args.ucCRTC = radeon_crtc->crtc_id;
223 args.ucBlanking = state; 239 args.ucBlanking = state;
224 240
225 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 241 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
242
243 if (ASIC_IS_DCE8(rdev)) {
244 WREG32(vga_control_regs[radeon_crtc->crtc_id], vga_control);
245 }
226} 246}
227 247
228static void atombios_powergate_crtc(struct drm_crtc *crtc, int state) 248static void atombios_powergate_crtc(struct drm_crtc *crtc, int state)
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 6ffe824624fb..e6419ca7cd37 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3840,6 +3840,8 @@ static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
3840 if (enable) 3840 if (enable)
3841 WREG32(CP_ME_CNTL, 0); 3841 WREG32(CP_ME_CNTL, 0);
3842 else { 3842 else {
3843 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
3844 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
3843 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT)); 3845 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
3844 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 3846 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3845 } 3847 }
@@ -4038,6 +4040,10 @@ static int cik_cp_gfx_resume(struct radeon_device *rdev)
4038 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 4040 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4039 return r; 4041 return r;
4040 } 4042 }
4043
4044 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4045 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
4046
4041 return 0; 4047 return 0;
4042} 4048}
4043 4049
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index 9abea87a9213..1ecb3f1070e3 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -250,7 +250,9 @@ static void cik_sdma_gfx_stop(struct radeon_device *rdev)
250 u32 rb_cntl, reg_offset; 250 u32 rb_cntl, reg_offset;
251 int i; 251 int i;
252 252
253 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 253 if ((rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX) ||
254 (rdev->asic->copy.copy_ring_index == CAYMAN_RING_TYPE_DMA1_INDEX))
255 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
254 256
255 for (i = 0; i < 2; i++) { 257 for (i = 0; i < 2; i++) {
256 if (i == 0) 258 if (i == 0)
@@ -381,7 +383,9 @@ static int cik_sdma_gfx_resume(struct radeon_device *rdev)
381 } 383 }
382 } 384 }
383 385
384 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 386 if ((rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX) ||
387 (rdev->asic->copy.copy_ring_index == CAYMAN_RING_TYPE_DMA1_INDEX))
388 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
385 389
386 return 0; 390 return 0;
387} 391}
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 4116d0279596..f2b9e21ce4da 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -4348,8 +4348,8 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
4348 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 4348 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4349 } 4349 }
4350 4350
4351 /* only one DAC on DCE6 */ 4351 /* only one DAC on DCE5 */
4352 if (!ASIC_IS_DCE6(rdev)) 4352 if (!ASIC_IS_DCE5(rdev))
4353 WREG32(DACA_AUTODETECT_INT_CONTROL, 0); 4353 WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4354 WREG32(DACB_AUTODETECT_INT_CONTROL, 0); 4354 WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4355 4355
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 647b1d0fa62c..ea932ac66fc6 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1390,7 +1390,8 @@ static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1390 if (enable) 1390 if (enable)
1391 WREG32(CP_ME_CNTL, 0); 1391 WREG32(CP_ME_CNTL, 0);
1392 else { 1392 else {
1393 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 1393 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1394 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1394 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 1395 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1395 WREG32(SCRATCH_UMSK, 0); 1396 WREG32(SCRATCH_UMSK, 0);
1396 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1397 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
@@ -1663,6 +1664,9 @@ static int cayman_cp_resume(struct radeon_device *rdev)
1663 return r; 1664 return r;
1664 } 1665 }
1665 1666
1667 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1668 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1669
1666 return 0; 1670 return 0;
1667} 1671}
1668 1672
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c
index 51424ab79432..7cf96b15377f 100644
--- a/drivers/gpu/drm/radeon/ni_dma.c
+++ b/drivers/gpu/drm/radeon/ni_dma.c
@@ -157,7 +157,9 @@ void cayman_dma_stop(struct radeon_device *rdev)
157{ 157{
158 u32 rb_cntl; 158 u32 rb_cntl;
159 159
160 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 160 if ((rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX) ||
161 (rdev->asic->copy.copy_ring_index == CAYMAN_RING_TYPE_DMA1_INDEX))
162 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
161 163
162 /* dma0 */ 164 /* dma0 */
163 rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 165 rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
@@ -259,7 +261,9 @@ int cayman_dma_resume(struct radeon_device *rdev)
259 } 261 }
260 } 262 }
261 263
262 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 264 if ((rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX) ||
265 (rdev->asic->copy.copy_ring_index == CAYMAN_RING_TYPE_DMA1_INDEX))
266 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
263 267
264 return 0; 268 return 0;
265} 269}
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 3dce370adc1b..56140b4e5bb2 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2254,7 +2254,8 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2254 */ 2254 */
2255void r600_cp_stop(struct radeon_device *rdev) 2255void r600_cp_stop(struct radeon_device *rdev)
2256{ 2256{
2257 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 2257 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
2258 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
2258 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 2259 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
2259 WREG32(SCRATCH_UMSK, 0); 2260 WREG32(SCRATCH_UMSK, 0);
2260 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 2261 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
@@ -2612,6 +2613,10 @@ int r600_cp_resume(struct radeon_device *rdev)
2612 ring->ready = false; 2613 ring->ready = false;
2613 return r; 2614 return r;
2614 } 2615 }
2616
2617 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
2618 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
2619
2615 return 0; 2620 return 0;
2616} 2621}
2617 2622
@@ -2895,12 +2900,6 @@ static int r600_startup(struct radeon_device *rdev)
2895 return r; 2900 return r;
2896 } 2901 }
2897 2902
2898 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2899 if (r) {
2900 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2901 return r;
2902 }
2903
2904 /* Enable IRQ */ 2903 /* Enable IRQ */
2905 if (!rdev->irq.installed) { 2904 if (!rdev->irq.installed) {
2906 r = radeon_irq_kms_init(rdev); 2905 r = radeon_irq_kms_init(rdev);
@@ -2922,12 +2921,6 @@ static int r600_startup(struct radeon_device *rdev)
2922 if (r) 2921 if (r)
2923 return r; 2922 return r;
2924 2923
2925 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2926 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2927 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2928 if (r)
2929 return r;
2930
2931 r = r600_cp_load_microcode(rdev); 2924 r = r600_cp_load_microcode(rdev);
2932 if (r) 2925 if (r)
2933 return r; 2926 return r;
@@ -2935,10 +2928,6 @@ static int r600_startup(struct radeon_device *rdev)
2935 if (r) 2928 if (r)
2936 return r; 2929 return r;
2937 2930
2938 r = r600_dma_resume(rdev);
2939 if (r)
2940 return r;
2941
2942 r = radeon_ib_pool_init(rdev); 2931 r = radeon_ib_pool_init(rdev);
2943 if (r) { 2932 if (r) {
2944 dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 2933 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
@@ -2997,7 +2986,6 @@ int r600_suspend(struct radeon_device *rdev)
2997 radeon_pm_suspend(rdev); 2986 radeon_pm_suspend(rdev);
2998 r600_audio_fini(rdev); 2987 r600_audio_fini(rdev);
2999 r600_cp_stop(rdev); 2988 r600_cp_stop(rdev);
3000 r600_dma_stop(rdev);
3001 r600_irq_suspend(rdev); 2989 r600_irq_suspend(rdev);
3002 radeon_wb_disable(rdev); 2990 radeon_wb_disable(rdev);
3003 r600_pcie_gart_disable(rdev); 2991 r600_pcie_gart_disable(rdev);
@@ -3077,9 +3065,6 @@ int r600_init(struct radeon_device *rdev)
3077 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 3065 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
3078 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 3066 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
3079 3067
3080 rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
3081 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
3082
3083 rdev->ih.ring_obj = NULL; 3068 rdev->ih.ring_obj = NULL;
3084 r600_ih_ring_init(rdev, 64 * 1024); 3069 r600_ih_ring_init(rdev, 64 * 1024);
3085 3070
@@ -3092,7 +3077,6 @@ int r600_init(struct radeon_device *rdev)
3092 if (r) { 3077 if (r) {
3093 dev_err(rdev->dev, "disabling GPU acceleration\n"); 3078 dev_err(rdev->dev, "disabling GPU acceleration\n");
3094 r600_cp_fini(rdev); 3079 r600_cp_fini(rdev);
3095 r600_dma_fini(rdev);
3096 r600_irq_fini(rdev); 3080 r600_irq_fini(rdev);
3097 radeon_wb_fini(rdev); 3081 radeon_wb_fini(rdev);
3098 radeon_ib_pool_fini(rdev); 3082 radeon_ib_pool_fini(rdev);
@@ -3109,7 +3093,6 @@ void r600_fini(struct radeon_device *rdev)
3109 radeon_pm_fini(rdev); 3093 radeon_pm_fini(rdev);
3110 r600_audio_fini(rdev); 3094 r600_audio_fini(rdev);
3111 r600_cp_fini(rdev); 3095 r600_cp_fini(rdev);
3112 r600_dma_fini(rdev);
3113 r600_irq_fini(rdev); 3096 r600_irq_fini(rdev);
3114 radeon_wb_fini(rdev); 3097 radeon_wb_fini(rdev);
3115 radeon_ib_pool_fini(rdev); 3098 radeon_ib_pool_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index 3452c8410bd7..b2d4c91e6272 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -100,7 +100,8 @@ void r600_dma_stop(struct radeon_device *rdev)
100{ 100{
101 u32 rb_cntl = RREG32(DMA_RB_CNTL); 101 u32 rb_cntl = RREG32(DMA_RB_CNTL);
102 102
103 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 103 if (rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX)
104 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
104 105
105 rb_cntl &= ~DMA_RB_ENABLE; 106 rb_cntl &= ~DMA_RB_ENABLE;
106 WREG32(DMA_RB_CNTL, rb_cntl); 107 WREG32(DMA_RB_CNTL, rb_cntl);
@@ -187,7 +188,8 @@ int r600_dma_resume(struct radeon_device *rdev)
187 return r; 188 return r;
188 } 189 }
189 190
190 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 191 if (rdev->asic->copy.copy_ring_index == R600_RING_TYPE_DMA_INDEX)
192 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
191 193
192 return 0; 194 return 0;
193} 195}
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index c5519ca4bbc4..4a8ac1cd6b4c 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -867,6 +867,8 @@ struct radeon_vm {
867 struct radeon_fence *fence; 867 struct radeon_fence *fence;
868 /* last flush or NULL if we still need to flush */ 868 /* last flush or NULL if we still need to flush */
869 struct radeon_fence *last_flush; 869 struct radeon_fence *last_flush;
870 /* last use of vmid */
871 struct radeon_fence *last_id_use;
870}; 872};
871 873
872struct radeon_vm_manager { 874struct radeon_vm_manager {
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index f48bd6dc10cd..30844814c25a 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -3938,6 +3938,10 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
3938 /* tell the bios not to handle mode switching */ 3938 /* tell the bios not to handle mode switching */
3939 bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH; 3939 bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
3940 3940
3941 /* clear the vbios dpms state */
3942 if (ASIC_IS_DCE4(rdev))
3943 bios_2_scratch &= ~ATOM_S2_DEVICE_DPMS_STATE;
3944
3941 if (rdev->family >= CHIP_R600) { 3945 if (rdev->family >= CHIP_R600) {
3942 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); 3946 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3943 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); 3947 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index a8e3342fd4a9..dfb5a1db87d4 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -138,7 +138,7 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
138 p->ring = R600_RING_TYPE_DMA_INDEX; 138 p->ring = R600_RING_TYPE_DMA_INDEX;
139 else 139 else
140 p->ring = CAYMAN_RING_TYPE_DMA1_INDEX; 140 p->ring = CAYMAN_RING_TYPE_DMA1_INDEX;
141 } else if (p->rdev->family >= CHIP_R600) { 141 } else if (p->rdev->family >= CHIP_RV770) {
142 p->ring = R600_RING_TYPE_DMA_INDEX; 142 p->ring = R600_RING_TYPE_DMA_INDEX;
143 } else { 143 } else {
144 return -EINVAL; 144 return -EINVAL;
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 1235a78fbba1..ec8c388eec17 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -405,6 +405,9 @@ static int radeon_pmops_runtime_suspend(struct device *dev)
405 if (radeon_runtime_pm == 0) 405 if (radeon_runtime_pm == 0)
406 return -EINVAL; 406 return -EINVAL;
407 407
408 if (radeon_runtime_pm == -1 && !radeon_is_px())
409 return -EINVAL;
410
408 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 411 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
409 drm_kms_helper_poll_disable(drm_dev); 412 drm_kms_helper_poll_disable(drm_dev);
410 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); 413 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
@@ -427,6 +430,9 @@ static int radeon_pmops_runtime_resume(struct device *dev)
427 if (radeon_runtime_pm == 0) 430 if (radeon_runtime_pm == 0)
428 return -EINVAL; 431 return -EINVAL;
429 432
433 if (radeon_runtime_pm == -1 && !radeon_is_px())
434 return -EINVAL;
435
430 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 436 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
431 437
432 pci_set_power_state(pdev, PCI_D0); 438 pci_set_power_state(pdev, PCI_D0);
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index 866744e47cfa..c37cb79a9489 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -121,7 +121,7 @@ int radeon_fence_emit(struct radeon_device *rdev,
121 (*fence)->seq = ++rdev->fence_drv[ring].sync_seq[ring]; 121 (*fence)->seq = ++rdev->fence_drv[ring].sync_seq[ring];
122 (*fence)->ring = ring; 122 (*fence)->ring = ring;
123 radeon_fence_ring_emit(rdev, ring, *fence); 123 radeon_fence_ring_emit(rdev, ring, *fence);
124 trace_radeon_fence_emit(rdev->ddev, (*fence)->seq); 124 trace_radeon_fence_emit(rdev->ddev, ring, (*fence)->seq);
125 return 0; 125 return 0;
126} 126}
127 127
@@ -313,7 +313,7 @@ static int radeon_fence_wait_seq(struct radeon_device *rdev, u64 *target_seq,
313 continue; 313 continue;
314 314
315 last_seq[i] = atomic64_read(&rdev->fence_drv[i].last_seq); 315 last_seq[i] = atomic64_read(&rdev->fence_drv[i].last_seq);
316 trace_radeon_fence_wait_begin(rdev->ddev, target_seq[i]); 316 trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]);
317 radeon_irq_kms_sw_irq_get(rdev, i); 317 radeon_irq_kms_sw_irq_get(rdev, i);
318 } 318 }
319 319
@@ -332,7 +332,7 @@ static int radeon_fence_wait_seq(struct radeon_device *rdev, u64 *target_seq,
332 continue; 332 continue;
333 333
334 radeon_irq_kms_sw_irq_put(rdev, i); 334 radeon_irq_kms_sw_irq_put(rdev, i);
335 trace_radeon_fence_wait_end(rdev->ddev, target_seq[i]); 335 trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]);
336 } 336 }
337 337
338 if (unlikely(r < 0)) 338 if (unlikely(r < 0))
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 96e440061bdb..a8f9b463bf2a 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -713,7 +713,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
713 unsigned i; 713 unsigned i;
714 714
715 /* check if the id is still valid */ 715 /* check if the id is still valid */
716 if (vm->fence && vm->fence == rdev->vm_manager.active[vm->id]) 716 if (vm->last_id_use && vm->last_id_use == rdev->vm_manager.active[vm->id])
717 return NULL; 717 return NULL;
718 718
719 /* we definately need to flush */ 719 /* we definately need to flush */
@@ -726,6 +726,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
726 if (fence == NULL) { 726 if (fence == NULL) {
727 /* found a free one */ 727 /* found a free one */
728 vm->id = i; 728 vm->id = i;
729 trace_radeon_vm_grab_id(vm->id, ring);
729 return NULL; 730 return NULL;
730 } 731 }
731 732
@@ -769,6 +770,9 @@ void radeon_vm_fence(struct radeon_device *rdev,
769 770
770 radeon_fence_unref(&vm->fence); 771 radeon_fence_unref(&vm->fence);
771 vm->fence = radeon_fence_ref(fence); 772 vm->fence = radeon_fence_ref(fence);
773
774 radeon_fence_unref(&vm->last_id_use);
775 vm->last_id_use = radeon_fence_ref(fence);
772} 776}
773 777
774/** 778/**
@@ -1303,6 +1307,8 @@ void radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
1303{ 1307{
1304 vm->id = 0; 1308 vm->id = 0;
1305 vm->fence = NULL; 1309 vm->fence = NULL;
1310 vm->last_flush = NULL;
1311 vm->last_id_use = NULL;
1306 mutex_init(&vm->mutex); 1312 mutex_init(&vm->mutex);
1307 INIT_LIST_HEAD(&vm->list); 1313 INIT_LIST_HEAD(&vm->list);
1308 INIT_LIST_HEAD(&vm->va); 1314 INIT_LIST_HEAD(&vm->va);
@@ -1341,5 +1347,6 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
1341 } 1347 }
1342 radeon_fence_unref(&vm->fence); 1348 radeon_fence_unref(&vm->fence);
1343 radeon_fence_unref(&vm->last_flush); 1349 radeon_fence_unref(&vm->last_flush);
1350 radeon_fence_unref(&vm->last_id_use);
1344 mutex_unlock(&vm->mutex); 1351 mutex_unlock(&vm->mutex);
1345} 1352}
diff --git a/drivers/gpu/drm/radeon/radeon_trace.h b/drivers/gpu/drm/radeon/radeon_trace.h
index 0473257d4078..f749f2c3bbdb 100644
--- a/drivers/gpu/drm/radeon/radeon_trace.h
+++ b/drivers/gpu/drm/radeon/radeon_trace.h
@@ -106,42 +106,45 @@ TRACE_EVENT(radeon_vm_set_page,
106 106
107DECLARE_EVENT_CLASS(radeon_fence_request, 107DECLARE_EVENT_CLASS(radeon_fence_request,
108 108
109 TP_PROTO(struct drm_device *dev, u32 seqno), 109 TP_PROTO(struct drm_device *dev, int ring, u32 seqno),
110 110
111 TP_ARGS(dev, seqno), 111 TP_ARGS(dev, ring, seqno),
112 112
113 TP_STRUCT__entry( 113 TP_STRUCT__entry(
114 __field(u32, dev) 114 __field(u32, dev)
115 __field(int, ring)
115 __field(u32, seqno) 116 __field(u32, seqno)
116 ), 117 ),
117 118
118 TP_fast_assign( 119 TP_fast_assign(
119 __entry->dev = dev->primary->index; 120 __entry->dev = dev->primary->index;
121 __entry->ring = ring;
120 __entry->seqno = seqno; 122 __entry->seqno = seqno;
121 ), 123 ),
122 124
123 TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) 125 TP_printk("dev=%u, ring=%d, seqno=%u",
126 __entry->dev, __entry->ring, __entry->seqno)
124); 127);
125 128
126DEFINE_EVENT(radeon_fence_request, radeon_fence_emit, 129DEFINE_EVENT(radeon_fence_request, radeon_fence_emit,
127 130
128 TP_PROTO(struct drm_device *dev, u32 seqno), 131 TP_PROTO(struct drm_device *dev, int ring, u32 seqno),
129 132
130 TP_ARGS(dev, seqno) 133 TP_ARGS(dev, ring, seqno)
131); 134);
132 135
133DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_begin, 136DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_begin,
134 137
135 TP_PROTO(struct drm_device *dev, u32 seqno), 138 TP_PROTO(struct drm_device *dev, int ring, u32 seqno),
136 139
137 TP_ARGS(dev, seqno) 140 TP_ARGS(dev, ring, seqno)
138); 141);
139 142
140DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_end, 143DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_end,
141 144
142 TP_PROTO(struct drm_device *dev, u32 seqno), 145 TP_PROTO(struct drm_device *dev, int ring, u32 seqno),
143 146
144 TP_ARGS(dev, seqno) 147 TP_ARGS(dev, ring, seqno)
145); 148);
146 149
147DECLARE_EVENT_CLASS(radeon_semaphore_request, 150DECLARE_EVENT_CLASS(radeon_semaphore_request,
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 18e02889ec7d..6c772e58c784 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -1071,7 +1071,8 @@ static void rv770_mc_program(struct radeon_device *rdev)
1071 */ 1071 */
1072void r700_cp_stop(struct radeon_device *rdev) 1072void r700_cp_stop(struct radeon_device *rdev)
1073{ 1073{
1074 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 1074 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1075 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1075 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 1076 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1076 WREG32(SCRATCH_UMSK, 0); 1077 WREG32(SCRATCH_UMSK, 0);
1077 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 1078 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 07ce58716e44..09ec4f6c53bb 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -3249,7 +3249,8 @@ static void si_cp_enable(struct radeon_device *rdev, bool enable)
3249 if (enable) 3249 if (enable)
3250 WREG32(CP_ME_CNTL, 0); 3250 WREG32(CP_ME_CNTL, 0);
3251 else { 3251 else {
3252 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 3252 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
3253 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
3253 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT)); 3254 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
3254 WREG32(SCRATCH_UMSK, 0); 3255 WREG32(SCRATCH_UMSK, 0);
3255 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 3256 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
@@ -3510,6 +3511,9 @@ static int si_cp_resume(struct radeon_device *rdev)
3510 3511
3511 si_enable_gui_idle_interrupt(rdev, true); 3512 si_enable_gui_idle_interrupt(rdev, true);
3512 3513
3514 if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
3515 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
3516
3513 return 0; 3517 return 0;
3514} 3518}
3515 3519
@@ -5678,7 +5682,7 @@ static void si_disable_interrupt_state(struct radeon_device *rdev)
5678 } 5682 }
5679 5683
5680 if (!ASIC_IS_NODCE(rdev)) { 5684 if (!ASIC_IS_NODCE(rdev)) {
5681 WREG32(DACA_AUTODETECT_INT_CONTROL, 0); 5685 WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
5682 5686
5683 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY; 5687 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5684 WREG32(DC_HPD1_INT_CONTROL, tmp); 5688 WREG32(DC_HPD1_INT_CONTROL, tmp);
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index 36a5da4791ce..0471501338fb 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -3590,10 +3590,9 @@ static void si_program_display_gap(struct radeon_device *rdev)
3590 3590
3591 /* Setting this to false forces the performance state to low if the crtcs are disabled. 3591 /* Setting this to false forces the performance state to low if the crtcs are disabled.
3592 * This can be a problem on PowerXpress systems or if you want to use the card 3592 * This can be a problem on PowerXpress systems or if you want to use the card
3593 * for offscreen rendering or compute if there are no crtcs enabled. Set it to 3593 * for offscreen rendering or compute if there are no crtcs enabled.
3594 * true for now so that performance scales even if the displays are off.
3595 */ 3594 */
3596 si_notify_smc_display_change(rdev, true /*rdev->pm.dpm.new_active_crtc_count > 0*/); 3595 si_notify_smc_display_change(rdev, rdev->pm.dpm.new_active_crtc_count > 0);
3597} 3596}
3598 3597
3599static void si_enable_spread_spectrum(struct radeon_device *rdev, bool enable) 3598static void si_enable_spread_spectrum(struct radeon_device *rdev, bool enable)
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h
index caa3e61a38c2..9239a6d29128 100644
--- a/drivers/gpu/drm/radeon/sid.h
+++ b/drivers/gpu/drm/radeon/sid.h
@@ -822,7 +822,7 @@
822# define GRPH_PFLIP_INT_MASK (1 << 0) 822# define GRPH_PFLIP_INT_MASK (1 << 0)
823# define GRPH_PFLIP_INT_TYPE (1 << 8) 823# define GRPH_PFLIP_INT_TYPE (1 << 8)
824 824
825#define DACA_AUTODETECT_INT_CONTROL 0x66c8 825#define DAC_AUTODETECT_INT_CONTROL 0x67c8
826 826
827#define DC_HPD1_INT_STATUS 0x601c 827#define DC_HPD1_INT_STATUS 0x601c
828#define DC_HPD2_INT_STATUS 0x6028 828#define DC_HPD2_INT_STATUS 0x6028