diff options
author | Dave Airlie <airlied@redhat.com> | 2017-02-23 17:35:23 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-02-23 17:35:23 -0500 |
commit | 1e8ad3d8da4763b238d09244d4d1177aa640c0d3 (patch) | |
tree | 726ad9e44d1ae8bd550c983b58b7697ef1c67c66 /drivers/gpu | |
parent | 894ebc414d4688da732a185954ca23c5d11900d0 (diff) | |
parent | 187368a5c7ad6c41159b85025a87d6d136eb8d4b (diff) |
Merge branch 'drm-next-4.11' of git://people.freedesktop.org/~agd5f/linux into drm-next
Some ttm/amd fixes.
* 'drm-next-4.11' of git://people.freedesktop.org/~agd5f/linux:
drm/amd/powerplay: fix PSI feature on Polars12.
drm/amdgpu: refuse to reserve io mem for split VRAM buffers
drm/ttm: fix use-after-free races in vm fault handling
drm/amd/amdgpu: post card if there is real hw resetting performed
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vi.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_vm.c | 12 |
12 files changed, 71 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index e9af03113fc3..c1b913541739 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1482,6 +1482,9 @@ struct amdgpu_device { | |||
1482 | spinlock_t gtt_list_lock; | 1482 | spinlock_t gtt_list_lock; |
1483 | struct list_head gtt_list; | 1483 | struct list_head gtt_list; |
1484 | 1484 | ||
1485 | /* record hw reset is performed */ | ||
1486 | bool has_hw_reset; | ||
1487 | |||
1485 | }; | 1488 | }; |
1486 | 1489 | ||
1487 | static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) | 1490 | static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) |
@@ -1700,7 +1703,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) | |||
1700 | int amdgpu_gpu_reset(struct amdgpu_device *adev); | 1703 | int amdgpu_gpu_reset(struct amdgpu_device *adev); |
1701 | bool amdgpu_need_backup(struct amdgpu_device *adev); | 1704 | bool amdgpu_need_backup(struct amdgpu_device *adev); |
1702 | void amdgpu_pci_config_reset(struct amdgpu_device *adev); | 1705 | void amdgpu_pci_config_reset(struct amdgpu_device *adev); |
1703 | bool amdgpu_card_posted(struct amdgpu_device *adev); | 1706 | bool amdgpu_need_post(struct amdgpu_device *adev); |
1704 | void amdgpu_update_display_priority(struct amdgpu_device *adev); | 1707 | void amdgpu_update_display_priority(struct amdgpu_device *adev); |
1705 | 1708 | ||
1706 | int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data); | 1709 | int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c index d9def01f276e..821f7cc2051f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | |||
@@ -100,7 +100,7 @@ static bool igp_read_bios_from_vram(struct amdgpu_device *adev) | |||
100 | resource_size_t size = 256 * 1024; /* ??? */ | 100 | resource_size_t size = 256 * 1024; /* ??? */ |
101 | 101 | ||
102 | if (!(adev->flags & AMD_IS_APU)) | 102 | if (!(adev->flags & AMD_IS_APU)) |
103 | if (!amdgpu_card_posted(adev)) | 103 | if (amdgpu_need_post(adev)) |
104 | return false; | 104 | return false; |
105 | 105 | ||
106 | adev->bios = NULL; | 106 | adev->bios = NULL; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 944ba0d3874a..6abb238b25c9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -619,25 +619,29 @@ void amdgpu_gtt_location(struct amdgpu_device *adev, struct amdgpu_mc *mc) | |||
619 | * GPU helpers function. | 619 | * GPU helpers function. |
620 | */ | 620 | */ |
621 | /** | 621 | /** |
622 | * amdgpu_card_posted - check if the hw has already been initialized | 622 | * amdgpu_need_post - check if the hw need post or not |
623 | * | 623 | * |
624 | * @adev: amdgpu_device pointer | 624 | * @adev: amdgpu_device pointer |
625 | * | 625 | * |
626 | * Check if the asic has been initialized (all asics). | 626 | * Check if the asic has been initialized (all asics) at driver startup |
627 | * Used at driver startup. | 627 | * or post is needed if hw reset is performed. |
628 | * Returns true if initialized or false if not. | 628 | * Returns true if need or false if not. |
629 | */ | 629 | */ |
630 | bool amdgpu_card_posted(struct amdgpu_device *adev) | 630 | bool amdgpu_need_post(struct amdgpu_device *adev) |
631 | { | 631 | { |
632 | uint32_t reg; | 632 | uint32_t reg; |
633 | 633 | ||
634 | if (adev->has_hw_reset) { | ||
635 | adev->has_hw_reset = false; | ||
636 | return true; | ||
637 | } | ||
634 | /* then check MEM_SIZE, in case the crtcs are off */ | 638 | /* then check MEM_SIZE, in case the crtcs are off */ |
635 | reg = RREG32(mmCONFIG_MEMSIZE); | 639 | reg = RREG32(mmCONFIG_MEMSIZE); |
636 | 640 | ||
637 | if (reg) | 641 | if (reg) |
638 | return true; | 642 | return false; |
639 | 643 | ||
640 | return false; | 644 | return true; |
641 | 645 | ||
642 | } | 646 | } |
643 | 647 | ||
@@ -665,7 +669,7 @@ static bool amdgpu_vpost_needed(struct amdgpu_device *adev) | |||
665 | return true; | 669 | return true; |
666 | } | 670 | } |
667 | } | 671 | } |
668 | return !amdgpu_card_posted(adev); | 672 | return amdgpu_need_post(adev); |
669 | } | 673 | } |
670 | 674 | ||
671 | /** | 675 | /** |
@@ -2071,7 +2075,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon) | |||
2071 | amdgpu_atombios_scratch_regs_restore(adev); | 2075 | amdgpu_atombios_scratch_regs_restore(adev); |
2072 | 2076 | ||
2073 | /* post card */ | 2077 | /* post card */ |
2074 | if (!amdgpu_card_posted(adev) || !resume) { | 2078 | if (amdgpu_need_post(adev)) { |
2075 | r = amdgpu_atom_asic_init(adev->mode_info.atom_context); | 2079 | r = amdgpu_atom_asic_init(adev->mode_info.atom_context); |
2076 | if (r) | 2080 | if (r) |
2077 | DRM_ERROR("amdgpu asic init failed\n"); | 2081 | DRM_ERROR("amdgpu asic init failed\n"); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 1154b0a8881d..4c6094eefc51 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -529,6 +529,9 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_ | |||
529 | case TTM_PL_TT: | 529 | case TTM_PL_TT: |
530 | break; | 530 | break; |
531 | case TTM_PL_VRAM: | 531 | case TTM_PL_VRAM: |
532 | if (mem->start == AMDGPU_BO_INVALID_OFFSET) | ||
533 | return -EINVAL; | ||
534 | |||
532 | mem->bus.offset = mem->start << PAGE_SHIFT; | 535 | mem->bus.offset = mem->start << PAGE_SHIFT; |
533 | /* check if it's visible */ | 536 | /* check if it's visible */ |
534 | if ((mem->bus.offset + mem->bus.size) > adev->mc.visible_vram_size) | 537 | if ((mem->bus.offset + mem->bus.size) > adev->mc.visible_vram_size) |
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 7c39b538dc0e..c4d4b35e54ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c | |||
@@ -1176,6 +1176,7 @@ static int cik_gpu_pci_config_reset(struct amdgpu_device *adev) | |||
1176 | if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { | 1176 | if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { |
1177 | /* enable BM */ | 1177 | /* enable BM */ |
1178 | pci_set_master(adev->pdev); | 1178 | pci_set_master(adev->pdev); |
1179 | adev->has_hw_reset = true; | ||
1179 | r = 0; | 1180 | r = 0; |
1180 | break; | 1181 | break; |
1181 | } | 1182 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 4922fff08c3c..50bdb24ef8d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c | |||
@@ -721,6 +721,7 @@ static int vi_gpu_pci_config_reset(struct amdgpu_device *adev) | |||
721 | if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { | 721 | if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { |
722 | /* enable BM */ | 722 | /* enable BM */ |
723 | pci_set_master(adev->pdev); | 723 | pci_set_master(adev->pdev); |
724 | adev->has_hw_reset = true; | ||
724 | return 0; | 725 | return 0; |
725 | } | 726 | } |
726 | udelay(1); | 727 | udelay(1); |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c index 4b0a94cc995e..953e0c9ad7cd 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c | |||
@@ -1396,3 +1396,25 @@ int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, | |||
1396 | 1396 | ||
1397 | return 0; | 1397 | return 0; |
1398 | } | 1398 | } |
1399 | |||
1400 | int atomctrl_get_svi2_info(struct pp_hwmgr *hwmgr, uint8_t voltage_type, | ||
1401 | uint8_t *svd_gpio_id, uint8_t *svc_gpio_id, | ||
1402 | uint16_t *load_line) | ||
1403 | { | ||
1404 | ATOM_VOLTAGE_OBJECT_INFO_V3_1 *voltage_info = | ||
1405 | (ATOM_VOLTAGE_OBJECT_INFO_V3_1 *)get_voltage_info_table(hwmgr->device); | ||
1406 | |||
1407 | const ATOM_VOLTAGE_OBJECT_V3 *voltage_object; | ||
1408 | |||
1409 | PP_ASSERT_WITH_CODE((NULL != voltage_info), | ||
1410 | "Could not find Voltage Table in BIOS.", return -EINVAL); | ||
1411 | |||
1412 | voltage_object = atomctrl_lookup_voltage_type_v3 | ||
1413 | (voltage_info, voltage_type, VOLTAGE_OBJ_SVID2); | ||
1414 | |||
1415 | *svd_gpio_id = voltage_object->asSVID2Obj.ucSVDGpioId; | ||
1416 | *svc_gpio_id = voltage_object->asSVID2Obj.ucSVCGpioId; | ||
1417 | *load_line = voltage_object->asSVID2Obj.usLoadLine_PSI; | ||
1418 | |||
1419 | return 0; | ||
1420 | } | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h index fc898afce002..e9fe2e84006b 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h | |||
@@ -311,5 +311,8 @@ extern int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_a | |||
311 | 311 | ||
312 | extern int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param); | 312 | extern int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param); |
313 | 313 | ||
314 | extern int atomctrl_get_svi2_info(struct pp_hwmgr *hwmgr, uint8_t voltage_type, | ||
315 | uint8_t *svd_gpio_id, uint8_t *svc_gpio_id, | ||
316 | uint16_t *load_line); | ||
314 | #endif | 317 | #endif |
315 | 318 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index b1de9e8ccdbc..f75ee33ec5bb 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -1383,6 +1383,15 @@ static void smu7_init_dpm_defaults(struct pp_hwmgr *hwmgr) | |||
1383 | data->force_pcie_gen = PP_PCIEGenInvalid; | 1383 | data->force_pcie_gen = PP_PCIEGenInvalid; |
1384 | data->ulv_supported = hwmgr->feature_mask & PP_ULV_MASK ? true : false; | 1384 | data->ulv_supported = hwmgr->feature_mask & PP_ULV_MASK ? true : false; |
1385 | 1385 | ||
1386 | if (hwmgr->chip_id == CHIP_POLARIS12 || hwmgr->smumgr->is_kicker) { | ||
1387 | uint8_t tmp1, tmp2; | ||
1388 | uint16_t tmp3 = 0; | ||
1389 | atomctrl_get_svi2_info(hwmgr, VOLTAGE_TYPE_VDDC, &tmp1, &tmp2, | ||
1390 | &tmp3); | ||
1391 | tmp3 = (tmp3 >> 5) & 0x3; | ||
1392 | data->vddc_phase_shed_control = ((tmp3 << 1) | (tmp3 >> 1)) & 0x3; | ||
1393 | } | ||
1394 | |||
1386 | data->fast_watermark_threshold = 100; | 1395 | data->fast_watermark_threshold = 100; |
1387 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, | 1396 | if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr, |
1388 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) | 1397 | VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2)) |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h index 27e7f76ad8a6..f221e17b67e7 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h | |||
@@ -268,7 +268,7 @@ struct smu7_hwmgr { | |||
268 | uint32_t fast_watermark_threshold; | 268 | uint32_t fast_watermark_threshold; |
269 | 269 | ||
270 | /* ---- Phase Shedding ---- */ | 270 | /* ---- Phase Shedding ---- */ |
271 | bool vddc_phase_shed_control; | 271 | uint8_t vddc_phase_shed_control; |
272 | 272 | ||
273 | /* ---- DI/DT ---- */ | 273 | /* ---- DI/DT ---- */ |
274 | struct smu7_display_timing display_timing; | 274 | struct smu7_display_timing display_timing; |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c index c6c3c5751ac7..80e2329a1b9e 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c | |||
@@ -503,7 +503,7 @@ static int polaris10_populate_ulv_level(struct pp_hwmgr *hwmgr, | |||
503 | state->VddcOffsetVid = (uint8_t)(table_info->us_ulv_voltage_offset * | 503 | state->VddcOffsetVid = (uint8_t)(table_info->us_ulv_voltage_offset * |
504 | VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1); | 504 | VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1); |
505 | 505 | ||
506 | if (smumgr->is_kicker) | 506 | if (smumgr->chip_id == CHIP_POLARIS12 || smumgr->is_kicker) |
507 | state->VddcPhase = data->vddc_phase_shed_control ^ 0x3; | 507 | state->VddcPhase = data->vddc_phase_shed_control ^ 0x3; |
508 | else | 508 | else |
509 | state->VddcPhase = (data->vddc_phase_shed_control) ? 0 : 1; | 509 | state->VddcPhase = (data->vddc_phase_shed_control) ? 0 : 1; |
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index 68ef993ab431..88169141bef5 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c | |||
@@ -66,8 +66,11 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo, | |||
66 | if (vmf->flags & FAULT_FLAG_RETRY_NOWAIT) | 66 | if (vmf->flags & FAULT_FLAG_RETRY_NOWAIT) |
67 | goto out_unlock; | 67 | goto out_unlock; |
68 | 68 | ||
69 | ttm_bo_reference(bo); | ||
69 | up_read(&vma->vm_mm->mmap_sem); | 70 | up_read(&vma->vm_mm->mmap_sem); |
70 | (void) dma_fence_wait(bo->moving, true); | 71 | (void) dma_fence_wait(bo->moving, true); |
72 | ttm_bo_unreserve(bo); | ||
73 | ttm_bo_unref(&bo); | ||
71 | goto out_unlock; | 74 | goto out_unlock; |
72 | } | 75 | } |
73 | 76 | ||
@@ -120,8 +123,10 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
120 | 123 | ||
121 | if (vmf->flags & FAULT_FLAG_ALLOW_RETRY) { | 124 | if (vmf->flags & FAULT_FLAG_ALLOW_RETRY) { |
122 | if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { | 125 | if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { |
126 | ttm_bo_reference(bo); | ||
123 | up_read(&vma->vm_mm->mmap_sem); | 127 | up_read(&vma->vm_mm->mmap_sem); |
124 | (void) ttm_bo_wait_unreserved(bo); | 128 | (void) ttm_bo_wait_unreserved(bo); |
129 | ttm_bo_unref(&bo); | ||
125 | } | 130 | } |
126 | 131 | ||
127 | return VM_FAULT_RETRY; | 132 | return VM_FAULT_RETRY; |
@@ -166,6 +171,13 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
166 | ret = ttm_bo_vm_fault_idle(bo, vma, vmf); | 171 | ret = ttm_bo_vm_fault_idle(bo, vma, vmf); |
167 | if (unlikely(ret != 0)) { | 172 | if (unlikely(ret != 0)) { |
168 | retval = ret; | 173 | retval = ret; |
174 | |||
175 | if (retval == VM_FAULT_RETRY && | ||
176 | !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { | ||
177 | /* The BO has already been unreserved. */ | ||
178 | return retval; | ||
179 | } | ||
180 | |||
169 | goto out_unlock; | 181 | goto out_unlock; |
170 | } | 182 | } |
171 | 183 | ||