diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni_dma.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_dma.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_trace.h | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si_dpm.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 2 |
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 | ||
| 212 | static 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 | |||
| 212 | static void atombios_blank_crtc(struct drm_crtc *crtc, int state) | 222 | static 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 | ||
| 228 | static void atombios_powergate_crtc(struct drm_crtc *crtc, int state) | 248 | static 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 | */ |
| 2255 | void r600_cp_stop(struct radeon_device *rdev) | 2255 | void 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 | ||
| 872 | struct radeon_vm_manager { | 874 | struct 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 | ||
| 107 | DECLARE_EVENT_CLASS(radeon_fence_request, | 107 | DECLARE_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 | ||
| 126 | DEFINE_EVENT(radeon_fence_request, radeon_fence_emit, | 129 | DEFINE_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 | ||
| 133 | DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_begin, | 136 | DEFINE_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 | ||
| 140 | DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_end, | 143 | DEFINE_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 | ||
| 147 | DECLARE_EVENT_CLASS(radeon_semaphore_request, | 150 | DECLARE_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 | */ |
| 1072 | void r700_cp_stop(struct radeon_device *rdev) | 1072 | void 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 | ||
| 3599 | static void si_enable_spread_spectrum(struct radeon_device *rdev, bool enable) | 3598 | static 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 |
