summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-02-23 17:35:23 -0500
committerDave Airlie <airlied@redhat.com>2017-02-23 17:35:23 -0500
commit1e8ad3d8da4763b238d09244d4d1177aa640c0d3 (patch)
tree726ad9e44d1ae8bd550c983b58b7697ef1c67c66 /drivers/gpu
parent894ebc414d4688da732a185954ca23c5d11900d0 (diff)
parent187368a5c7ad6c41159b85025a87d6d136eb8d4b (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.h5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c22
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h3
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c9
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c2
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_vm.c12
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
1487static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) 1490static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)
@@ -1700,7 +1703,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
1700int amdgpu_gpu_reset(struct amdgpu_device *adev); 1703int amdgpu_gpu_reset(struct amdgpu_device *adev);
1701bool amdgpu_need_backup(struct amdgpu_device *adev); 1704bool amdgpu_need_backup(struct amdgpu_device *adev);
1702void amdgpu_pci_config_reset(struct amdgpu_device *adev); 1705void amdgpu_pci_config_reset(struct amdgpu_device *adev);
1703bool amdgpu_card_posted(struct amdgpu_device *adev); 1706bool amdgpu_need_post(struct amdgpu_device *adev);
1704void amdgpu_update_display_priority(struct amdgpu_device *adev); 1707void amdgpu_update_display_priority(struct amdgpu_device *adev);
1705 1708
1706int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data); 1709int 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 */
630bool amdgpu_card_posted(struct amdgpu_device *adev) 630bool 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
1400int 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
312extern int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param); 312extern int atomctrl_get_avfs_information(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl__avfs_parameters *param);
313 313
314extern 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