diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-11-06 19:46:00 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-11-06 19:46:00 -0500 |
| commit | 2730fa0d8d41efb3764ffe1440e29ab544dc9bbe (patch) | |
| tree | 4bd57ffac11170f8916ffae1ba606730d7076675 | |
| parent | ed78bb846e8bc1a8589fa6e0d9bf2b0f518893d5 (diff) | |
| parent | f0d7bfb9407fccb6499ec01c33afe43512a439a2 (diff) | |
Merge branch 'drm-fixes-3.18' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
- fix missing crtc unlock in MC setup
- set optimal CE ram config
- use gart rather than vram for DMA IB tests to avoid coherency issues with HDP
- fix a crasher with laptop mode and TDP scripts
* 'drm-fixes-3.18' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon: add missing crtc unlock when setting up the MC
drm/radeon: use gart for DMA IB tests
drm/radeon: make sure mode init is complete in bandwidth_update
drm/radeon: set correct CE ram size for CIK
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_dma.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs690.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 3 |
9 files changed, 46 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 377afa504d2b..89c01fa6dd8e 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -4313,8 +4313,8 @@ static int cik_cp_gfx_start(struct radeon_device *rdev) | |||
| 4313 | /* init the CE partitions. CE only used for gfx on CIK */ | 4313 | /* init the CE partitions. CE only used for gfx on CIK */ |
| 4314 | radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2)); | 4314 | radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2)); |
| 4315 | radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE)); | 4315 | radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE)); |
| 4316 | radeon_ring_write(ring, 0xc000); | 4316 | radeon_ring_write(ring, 0x8000); |
| 4317 | radeon_ring_write(ring, 0xc000); | 4317 | radeon_ring_write(ring, 0x8000); |
| 4318 | 4318 | ||
| 4319 | /* setup clear context state */ | 4319 | /* setup clear context state */ |
| 4320 | radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); | 4320 | radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
| @@ -9447,6 +9447,9 @@ void dce8_bandwidth_update(struct radeon_device *rdev) | |||
| 9447 | u32 num_heads = 0, lb_size; | 9447 | u32 num_heads = 0, lb_size; |
| 9448 | int i; | 9448 | int i; |
| 9449 | 9449 | ||
| 9450 | if (!rdev->mode_info.mode_config_initialized) | ||
| 9451 | return; | ||
| 9452 | |||
| 9450 | radeon_update_display_priority(rdev); | 9453 | radeon_update_display_priority(rdev); |
| 9451 | 9454 | ||
| 9452 | for (i = 0; i < rdev->num_crtc; i++) { | 9455 | for (i = 0; i < rdev->num_crtc; i++) { |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 4e8432d07f15..d748963af08b 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
| @@ -667,17 +667,20 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 667 | { | 667 | { |
| 668 | struct radeon_ib ib; | 668 | struct radeon_ib ib; |
| 669 | unsigned i; | 669 | unsigned i; |
| 670 | unsigned index; | ||
| 670 | int r; | 671 | int r; |
| 671 | void __iomem *ptr = (void *)rdev->vram_scratch.ptr; | ||
| 672 | u32 tmp = 0; | 672 | u32 tmp = 0; |
| 673 | u64 gpu_addr; | ||
| 673 | 674 | ||
| 674 | if (!ptr) { | 675 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) |
| 675 | DRM_ERROR("invalid vram scratch pointer\n"); | 676 | index = R600_WB_DMA_RING_TEST_OFFSET; |
| 676 | return -EINVAL; | 677 | else |
| 677 | } | 678 | index = CAYMAN_WB_DMA1_RING_TEST_OFFSET; |
| 679 | |||
| 680 | gpu_addr = rdev->wb.gpu_addr + index; | ||
| 678 | 681 | ||
| 679 | tmp = 0xCAFEDEAD; | 682 | tmp = 0xCAFEDEAD; |
| 680 | writel(tmp, ptr); | 683 | rdev->wb.wb[index/4] = cpu_to_le32(tmp); |
| 681 | 684 | ||
| 682 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); | 685 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); |
| 683 | if (r) { | 686 | if (r) { |
| @@ -686,8 +689,8 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 686 | } | 689 | } |
| 687 | 690 | ||
| 688 | ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); | 691 | ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); |
| 689 | ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc; | 692 | ib.ptr[1] = lower_32_bits(gpu_addr); |
| 690 | ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr); | 693 | ib.ptr[2] = upper_32_bits(gpu_addr); |
| 691 | ib.ptr[3] = 1; | 694 | ib.ptr[3] = 1; |
| 692 | ib.ptr[4] = 0xDEADBEEF; | 695 | ib.ptr[4] = 0xDEADBEEF; |
| 693 | ib.length_dw = 5; | 696 | ib.length_dw = 5; |
| @@ -704,7 +707,7 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 704 | return r; | 707 | return r; |
| 705 | } | 708 | } |
| 706 | for (i = 0; i < rdev->usec_timeout; i++) { | 709 | for (i = 0; i < rdev->usec_timeout; i++) { |
| 707 | tmp = readl(ptr); | 710 | tmp = le32_to_cpu(rdev->wb.wb[index/4]); |
| 708 | if (tmp == 0xDEADBEEF) | 711 | if (tmp == 0xDEADBEEF) |
| 709 | break; | 712 | break; |
| 710 | DRM_UDELAY(1); | 713 | DRM_UDELAY(1); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index f37d39d2bbbc..85995b4e3338 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -2345,6 +2345,9 @@ void evergreen_bandwidth_update(struct radeon_device *rdev) | |||
| 2345 | u32 num_heads = 0, lb_size; | 2345 | u32 num_heads = 0, lb_size; |
| 2346 | int i; | 2346 | int i; |
| 2347 | 2347 | ||
| 2348 | if (!rdev->mode_info.mode_config_initialized) | ||
| 2349 | return; | ||
| 2350 | |||
| 2348 | radeon_update_display_priority(rdev); | 2351 | radeon_update_display_priority(rdev); |
| 2349 | 2352 | ||
| 2350 | for (i = 0; i < rdev->num_crtc; i++) { | 2353 | for (i = 0; i < rdev->num_crtc; i++) { |
| @@ -2552,6 +2555,7 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav | |||
| 2552 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); | 2555 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); |
| 2553 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; | 2556 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
| 2554 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); | 2557 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
| 2558 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
| 2555 | } | 2559 | } |
| 2556 | } else { | 2560 | } else { |
| 2557 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); | 2561 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 10f8be0ee173..b53b31a7b76f 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -3207,6 +3207,9 @@ void r100_bandwidth_update(struct radeon_device *rdev) | |||
| 3207 | uint32_t pixel_bytes1 = 0; | 3207 | uint32_t pixel_bytes1 = 0; |
| 3208 | uint32_t pixel_bytes2 = 0; | 3208 | uint32_t pixel_bytes2 = 0; |
| 3209 | 3209 | ||
| 3210 | if (!rdev->mode_info.mode_config_initialized) | ||
| 3211 | return; | ||
| 3212 | |||
| 3210 | radeon_update_display_priority(rdev); | 3213 | radeon_update_display_priority(rdev); |
| 3211 | 3214 | ||
| 3212 | if (rdev->mode_info.crtcs[0]->base.enabled) { | 3215 | if (rdev->mode_info.crtcs[0]->base.enabled) { |
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c index aabc343b9a8f..cf0df45d455e 100644 --- a/drivers/gpu/drm/radeon/r600_dma.c +++ b/drivers/gpu/drm/radeon/r600_dma.c | |||
| @@ -338,17 +338,17 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 338 | { | 338 | { |
| 339 | struct radeon_ib ib; | 339 | struct radeon_ib ib; |
| 340 | unsigned i; | 340 | unsigned i; |
| 341 | unsigned index; | ||
| 341 | int r; | 342 | int r; |
| 342 | void __iomem *ptr = (void *)rdev->vram_scratch.ptr; | ||
| 343 | u32 tmp = 0; | 343 | u32 tmp = 0; |
| 344 | u64 gpu_addr; | ||
| 344 | 345 | ||
| 345 | if (!ptr) { | 346 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) |
| 346 | DRM_ERROR("invalid vram scratch pointer\n"); | 347 | index = R600_WB_DMA_RING_TEST_OFFSET; |
| 347 | return -EINVAL; | 348 | else |
| 348 | } | 349 | index = CAYMAN_WB_DMA1_RING_TEST_OFFSET; |
| 349 | 350 | ||
| 350 | tmp = 0xCAFEDEAD; | 351 | gpu_addr = rdev->wb.gpu_addr + index; |
| 351 | writel(tmp, ptr); | ||
| 352 | 352 | ||
| 353 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); | 353 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); |
| 354 | if (r) { | 354 | if (r) { |
| @@ -357,8 +357,8 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 357 | } | 357 | } |
| 358 | 358 | ||
| 359 | ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1); | 359 | ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1); |
| 360 | ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc; | 360 | ib.ptr[1] = lower_32_bits(gpu_addr); |
| 361 | ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff; | 361 | ib.ptr[2] = upper_32_bits(gpu_addr) & 0xff; |
| 362 | ib.ptr[3] = 0xDEADBEEF; | 362 | ib.ptr[3] = 0xDEADBEEF; |
| 363 | ib.length_dw = 4; | 363 | ib.length_dw = 4; |
| 364 | 364 | ||
| @@ -374,7 +374,7 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
| 374 | return r; | 374 | return r; |
| 375 | } | 375 | } |
| 376 | for (i = 0; i < rdev->usec_timeout; i++) { | 376 | for (i = 0; i < rdev->usec_timeout; i++) { |
| 377 | tmp = readl(ptr); | 377 | tmp = le32_to_cpu(rdev->wb.wb[index/4]); |
| 378 | if (tmp == 0xDEADBEEF) | 378 | if (tmp == 0xDEADBEEF) |
| 379 | break; | 379 | break; |
| 380 | DRM_UDELAY(1); | 380 | DRM_UDELAY(1); |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 5f6db4629aaa..9acb1c3c005b 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -879,6 +879,9 @@ void rs600_bandwidth_update(struct radeon_device *rdev) | |||
| 879 | u32 d1mode_priority_a_cnt, d2mode_priority_a_cnt; | 879 | u32 d1mode_priority_a_cnt, d2mode_priority_a_cnt; |
| 880 | /* FIXME: implement full support */ | 880 | /* FIXME: implement full support */ |
| 881 | 881 | ||
| 882 | if (!rdev->mode_info.mode_config_initialized) | ||
| 883 | return; | ||
| 884 | |||
| 882 | radeon_update_display_priority(rdev); | 885 | radeon_update_display_priority(rdev); |
| 883 | 886 | ||
| 884 | if (rdev->mode_info.crtcs[0]->base.enabled) | 887 | if (rdev->mode_info.crtcs[0]->base.enabled) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 3462b64369bf..0a2d36e81108 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -579,6 +579,9 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 579 | u32 d1mode_priority_a_cnt, d1mode_priority_b_cnt; | 579 | u32 d1mode_priority_a_cnt, d1mode_priority_b_cnt; |
| 580 | u32 d2mode_priority_a_cnt, d2mode_priority_b_cnt; | 580 | u32 d2mode_priority_a_cnt, d2mode_priority_b_cnt; |
| 581 | 581 | ||
| 582 | if (!rdev->mode_info.mode_config_initialized) | ||
| 583 | return; | ||
| 584 | |||
| 582 | radeon_update_display_priority(rdev); | 585 | radeon_update_display_priority(rdev); |
| 583 | 586 | ||
| 584 | if (rdev->mode_info.crtcs[0]->base.enabled) | 587 | if (rdev->mode_info.crtcs[0]->base.enabled) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 8a477bf1fdb3..c55d653aaf5f 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -1277,6 +1277,9 @@ void rv515_bandwidth_update(struct radeon_device *rdev) | |||
| 1277 | struct drm_display_mode *mode0 = NULL; | 1277 | struct drm_display_mode *mode0 = NULL; |
| 1278 | struct drm_display_mode *mode1 = NULL; | 1278 | struct drm_display_mode *mode1 = NULL; |
| 1279 | 1279 | ||
| 1280 | if (!rdev->mode_info.mode_config_initialized) | ||
| 1281 | return; | ||
| 1282 | |||
| 1280 | radeon_update_display_priority(rdev); | 1283 | radeon_update_display_priority(rdev); |
| 1281 | 1284 | ||
| 1282 | if (rdev->mode_info.crtcs[0]->base.enabled) | 1285 | if (rdev->mode_info.crtcs[0]->base.enabled) |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index eeea5b6a1775..7d5083dc4acb 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -2384,6 +2384,9 @@ void dce6_bandwidth_update(struct radeon_device *rdev) | |||
| 2384 | u32 num_heads = 0, lb_size; | 2384 | u32 num_heads = 0, lb_size; |
| 2385 | int i; | 2385 | int i; |
| 2386 | 2386 | ||
| 2387 | if (!rdev->mode_info.mode_config_initialized) | ||
| 2388 | return; | ||
| 2389 | |||
| 2387 | radeon_update_display_priority(rdev); | 2390 | radeon_update_display_priority(rdev); |
| 2388 | 2391 | ||
| 2389 | for (i = 0; i < rdev->num_crtc; i++) { | 2392 | for (i = 0; i < rdev->num_crtc; i++) { |
