diff options
author | Dave Airlie <airlied@redhat.com> | 2018-01-24 20:40:54 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-01-24 20:40:54 -0500 |
commit | 22bc72c8075fa350482cdbbd66597d626aa506c8 (patch) | |
tree | 4223a1282a53a07cd87ff0abbe1da5f8f172788d /drivers/gpu/drm/amd/amdgpu | |
parent | 92eb5f0c00b7c11d85ae823a814b2a34dda8a3c4 (diff) | |
parent | 87440329b06720e09c27ad1991204f4f0bd76f83 (diff) |
Merge branch 'drm-next-4.16' of git://people.freedesktop.org/~agd5f/linux into drm-next
A few more fixes for 4.16, nothing major.
A few more fixes for 4.16. This is on top of the pull request from
last week. Most notable change here is a fix to the link order for
the now separate from amdgpu GPU scheduler to fix crashes when the
modules are build into the kernel rather than as modules.
* 'drm-next-4.16' of git://people.freedesktop.org/~agd5f/linux:
drm: fix gpu scheduler link order
drm/amd/display: Demote error print to debug print when ATOM impl missing
drm/amdgpu: Avoid leaking PM domain on driver unbind (v2)
drm/amd/amdgpu: Add Polaris version check
drm/amdgpu: Reenable manual GPU reset from sysfs
drm/amdgpu: disable MMHUB power gating on raven
drm/ttm: Don't unreserve swapped BOs that were previously reserved
drm/ttm: Don't add swapped BOs to swap-LRU list
drm/amdgpu: only check for ECC on Vega10
drm/amd/powerplay: Fix smu_table_entry.handle type
drm/ttm: add VADDR_FLAG_UPDATED_COUNT to correctly update dma_page global count
drm/radeon: fill in rb backend map on evergreen/ni.
drm/amdgpu/gfx9: fix ngg enablement to clear gds reserved memory (v2)
drm/ttm: only free pages rather than update global memory count together
drm/amdgpu: fix CPU based VM updates
drm/amdgpu: fix typo in amdgpu_vce_validate_bo
drm/amdgpu: fix amdgpu_vm_pasid_fault_credit
drm/ttm: check the return value of register_shrinker
drm/radeon: fix sparse warning: Should it be static?
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 17 |
7 files changed, 51 insertions, 29 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 9baf182d5418..00a50cc5ec9a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1874,8 +1874,6 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
1874 | * ignore it */ | 1874 | * ignore it */ |
1875 | vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode); | 1875 | vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode); |
1876 | 1876 | ||
1877 | if (amdgpu_runtime_pm == 1) | ||
1878 | runtime = true; | ||
1879 | if (amdgpu_device_is_px(ddev)) | 1877 | if (amdgpu_device_is_px(ddev)) |
1880 | runtime = true; | 1878 | runtime = true; |
1881 | if (!pci_is_thunderbolt_attached(adev->pdev)) | 1879 | if (!pci_is_thunderbolt_attached(adev->pdev)) |
@@ -2619,7 +2617,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, | |||
2619 | uint64_t reset_flags = 0; | 2617 | uint64_t reset_flags = 0; |
2620 | int i, r, resched; | 2618 | int i, r, resched; |
2621 | 2619 | ||
2622 | if (!amdgpu_device_ip_check_soft_reset(adev)) { | 2620 | if (!force && !amdgpu_device_ip_check_soft_reset(adev)) { |
2623 | DRM_INFO("No hardware hang detected. Did some blocks stall?\n"); | 2621 | DRM_INFO("No hardware hang detected. Did some blocks stall?\n"); |
2624 | return 0; | 2622 | return 0; |
2625 | } | 2623 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 55a726a322e3..d274ae535530 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
@@ -585,8 +585,8 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, | |||
585 | 585 | ||
586 | for (i = 0; i < bo->placement.num_placement; ++i) { | 586 | for (i = 0; i < bo->placement.num_placement; ++i) { |
587 | bo->placements[i].fpfn = max(bo->placements[i].fpfn, fpfn); | 587 | bo->placements[i].fpfn = max(bo->placements[i].fpfn, fpfn); |
588 | bo->placements[i].lpfn = bo->placements[i].fpfn ? | 588 | bo->placements[i].lpfn = bo->placements[i].lpfn ? |
589 | min(bo->placements[i].fpfn, lpfn) : lpfn; | 589 | min(bo->placements[i].lpfn, lpfn) : lpfn; |
590 | } | 590 | } |
591 | return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); | 591 | return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); |
592 | } | 592 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index cd1752b6afa9..6fc16eecf2dc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -970,12 +970,16 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p, | |||
970 | amdgpu_gart_get_vm_pde(p->adev, AMDGPU_VM_PDB0, | 970 | amdgpu_gart_get_vm_pde(p->adev, AMDGPU_VM_PDB0, |
971 | &dst, &flags); | 971 | &dst, &flags); |
972 | 972 | ||
973 | if (parent->base.bo->shadow) { | 973 | if (p->func == amdgpu_vm_cpu_set_ptes) { |
974 | pd_addr = amdgpu_bo_gpu_offset(parent->base.bo->shadow); | 974 | pd_addr = (unsigned long)amdgpu_bo_kptr(parent->base.bo); |
975 | pde = pd_addr + (entry - parent->entries) * 8; | 975 | } else { |
976 | p->func(p, pde, dst, 1, 0, flags); | 976 | if (parent->base.bo->shadow) { |
977 | pd_addr = amdgpu_bo_gpu_offset(parent->base.bo->shadow); | ||
978 | pde = pd_addr + (entry - parent->entries) * 8; | ||
979 | p->func(p, pde, dst, 1, 0, flags); | ||
980 | } | ||
981 | pd_addr = amdgpu_bo_gpu_offset(parent->base.bo); | ||
977 | } | 982 | } |
978 | pd_addr = amdgpu_bo_gpu_offset(parent->base.bo); | ||
979 | pde = pd_addr + (entry - parent->entries) * 8; | 983 | pde = pd_addr + (entry - parent->entries) * 8; |
980 | p->func(p, pde, dst, 1, 0, flags); | 984 | p->func(p, pde, dst, 1, 0, flags); |
981 | } | 985 | } |
@@ -2478,17 +2482,21 @@ bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev, | |||
2478 | 2482 | ||
2479 | spin_lock(&adev->vm_manager.pasid_lock); | 2483 | spin_lock(&adev->vm_manager.pasid_lock); |
2480 | vm = idr_find(&adev->vm_manager.pasid_idr, pasid); | 2484 | vm = idr_find(&adev->vm_manager.pasid_idr, pasid); |
2481 | spin_unlock(&adev->vm_manager.pasid_lock); | 2485 | if (!vm) { |
2482 | if (!vm) | ||
2483 | /* VM not found, can't track fault credit */ | 2486 | /* VM not found, can't track fault credit */ |
2487 | spin_unlock(&adev->vm_manager.pasid_lock); | ||
2484 | return true; | 2488 | return true; |
2489 | } | ||
2485 | 2490 | ||
2486 | /* No lock needed. only accessed by IRQ handler */ | 2491 | /* No lock needed. only accessed by IRQ handler */ |
2487 | if (!vm->fault_credit) | 2492 | if (!vm->fault_credit) { |
2488 | /* Too many faults in this VM */ | 2493 | /* Too many faults in this VM */ |
2494 | spin_unlock(&adev->vm_manager.pasid_lock); | ||
2489 | return false; | 2495 | return false; |
2496 | } | ||
2490 | 2497 | ||
2491 | vm->fault_credit--; | 2498 | vm->fault_credit--; |
2499 | spin_unlock(&adev->vm_manager.pasid_lock); | ||
2492 | return true; | 2500 | return true; |
2493 | } | 2501 | } |
2494 | 2502 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index fc270e2ef91a..c06479615e8a 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -1068,8 +1068,8 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev) | |||
1068 | adev->gfx.ngg.gds_reserve_size = ALIGN(5 * 4, 0x40); | 1068 | adev->gfx.ngg.gds_reserve_size = ALIGN(5 * 4, 0x40); |
1069 | adev->gds.mem.total_size -= adev->gfx.ngg.gds_reserve_size; | 1069 | adev->gds.mem.total_size -= adev->gfx.ngg.gds_reserve_size; |
1070 | adev->gds.mem.gfx_partition_size -= adev->gfx.ngg.gds_reserve_size; | 1070 | adev->gds.mem.gfx_partition_size -= adev->gfx.ngg.gds_reserve_size; |
1071 | adev->gfx.ngg.gds_reserve_addr = SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE); | 1071 | adev->gfx.ngg.gds_reserve_addr = RREG32_SOC15(GC, 0, mmGDS_VMID0_BASE); |
1072 | adev->gfx.ngg.gds_reserve_addr += adev->gds.mem.gfx_partition_size; | 1072 | adev->gfx.ngg.gds_reserve_addr += RREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE); |
1073 | 1073 | ||
1074 | /* Primitive Buffer */ | 1074 | /* Primitive Buffer */ |
1075 | r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_PRIM], | 1075 | r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_PRIM], |
@@ -1181,13 +1181,14 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev) | |||
1181 | 1181 | ||
1182 | amdgpu_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5)); | 1182 | amdgpu_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5)); |
1183 | amdgpu_ring_write(ring, (PACKET3_DMA_DATA_CP_SYNC | | 1183 | amdgpu_ring_write(ring, (PACKET3_DMA_DATA_CP_SYNC | |
1184 | PACKET3_DMA_DATA_DST_SEL(1) | | ||
1184 | PACKET3_DMA_DATA_SRC_SEL(2))); | 1185 | PACKET3_DMA_DATA_SRC_SEL(2))); |
1185 | amdgpu_ring_write(ring, 0); | 1186 | amdgpu_ring_write(ring, 0); |
1186 | amdgpu_ring_write(ring, 0); | 1187 | amdgpu_ring_write(ring, 0); |
1187 | amdgpu_ring_write(ring, adev->gfx.ngg.gds_reserve_addr); | 1188 | amdgpu_ring_write(ring, adev->gfx.ngg.gds_reserve_addr); |
1188 | amdgpu_ring_write(ring, 0); | 1189 | amdgpu_ring_write(ring, 0); |
1189 | amdgpu_ring_write(ring, adev->gfx.ngg.gds_reserve_size); | 1190 | amdgpu_ring_write(ring, PACKET3_DMA_DATA_CMD_RAW_WAIT | |
1190 | 1191 | adev->gfx.ngg.gds_reserve_size); | |
1191 | 1192 | ||
1192 | gfx_v9_0_write_data_to_reg(ring, 0, false, | 1193 | gfx_v9_0_write_data_to_reg(ring, 0, false, |
1193 | SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE), 0); | 1194 | SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE), 0); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index eb8b1bb66389..2719937e09d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -634,14 +634,16 @@ static int gmc_v9_0_late_init(void *handle) | |||
634 | for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) | 634 | for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) |
635 | BUG_ON(vm_inv_eng[i] > 16); | 635 | BUG_ON(vm_inv_eng[i] > 16); |
636 | 636 | ||
637 | r = gmc_v9_0_ecc_available(adev); | 637 | if (adev->asic_type == CHIP_VEGA10) { |
638 | if (r == 1) { | 638 | r = gmc_v9_0_ecc_available(adev); |
639 | DRM_INFO("ECC is active.\n"); | 639 | if (r == 1) { |
640 | } else if (r == 0) { | 640 | DRM_INFO("ECC is active.\n"); |
641 | DRM_INFO("ECC is not present.\n"); | 641 | } else if (r == 0) { |
642 | } else { | 642 | DRM_INFO("ECC is not present.\n"); |
643 | DRM_ERROR("gmc_v9_0_ecc_available() failed. r: %d\n", r); | 643 | } else { |
644 | return r; | 644 | DRM_ERROR("gmc_v9_0_ecc_available() failed. r: %d\n", r); |
645 | return r; | ||
646 | } | ||
645 | } | 647 | } |
646 | 648 | ||
647 | return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); | 649 | return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); |
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 8f2cff7b7e0c..a04a033f57de 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
@@ -666,8 +666,8 @@ static int soc15_common_early_init(void *handle) | |||
666 | AMD_CG_SUPPORT_MC_LS | | 666 | AMD_CG_SUPPORT_MC_LS | |
667 | AMD_CG_SUPPORT_SDMA_MGCG | | 667 | AMD_CG_SUPPORT_SDMA_MGCG | |
668 | AMD_CG_SUPPORT_SDMA_LS; | 668 | AMD_CG_SUPPORT_SDMA_LS; |
669 | adev->pg_flags = AMD_PG_SUPPORT_SDMA | | 669 | adev->pg_flags = AMD_PG_SUPPORT_SDMA; |
670 | AMD_PG_SUPPORT_MMHUB; | 670 | |
671 | adev->external_rev_id = 0x1; | 671 | adev->external_rev_id = 0x1; |
672 | break; | 672 | break; |
673 | default: | 673 | default: |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 59271055a30e..b2bfedaf57f1 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | |||
@@ -37,6 +37,9 @@ | |||
37 | #include "gmc/gmc_8_1_d.h" | 37 | #include "gmc/gmc_8_1_d.h" |
38 | #include "vi.h" | 38 | #include "vi.h" |
39 | 39 | ||
40 | /* Polaris10/11/12 firmware version */ | ||
41 | #define FW_1_130_16 ((1 << 24) | (130 << 16) | (16 << 8)) | ||
42 | |||
40 | static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev); | 43 | static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev); |
41 | static void uvd_v6_0_set_enc_ring_funcs(struct amdgpu_device *adev); | 44 | static void uvd_v6_0_set_enc_ring_funcs(struct amdgpu_device *adev); |
42 | 45 | ||
@@ -58,7 +61,9 @@ static void uvd_v6_0_enable_mgcg(struct amdgpu_device *adev, | |||
58 | */ | 61 | */ |
59 | static inline bool uvd_v6_0_enc_support(struct amdgpu_device *adev) | 62 | static inline bool uvd_v6_0_enc_support(struct amdgpu_device *adev) |
60 | { | 63 | { |
61 | return ((adev->asic_type >= CHIP_POLARIS10) && (adev->asic_type <= CHIP_POLARIS12)); | 64 | return ((adev->asic_type >= CHIP_POLARIS10) && |
65 | (adev->asic_type <= CHIP_POLARIS12) && | ||
66 | (!adev->uvd.fw_version || adev->uvd.fw_version >= FW_1_130_16)); | ||
62 | } | 67 | } |
63 | 68 | ||
64 | /** | 69 | /** |
@@ -411,7 +416,15 @@ static int uvd_v6_0_sw_init(void *handle) | |||
411 | if (r) | 416 | if (r) |
412 | return r; | 417 | return r; |
413 | 418 | ||
414 | if (uvd_v6_0_enc_support(adev)) { | 419 | if (!uvd_v6_0_enc_support(adev)) { |
420 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) | ||
421 | adev->uvd.ring_enc[i].funcs = NULL; | ||
422 | |||
423 | adev->uvd.irq.num_types = 1; | ||
424 | adev->uvd.num_enc_rings = 0; | ||
425 | |||
426 | DRM_INFO("UVD ENC is disabled\n"); | ||
427 | } else { | ||
415 | struct drm_sched_rq *rq; | 428 | struct drm_sched_rq *rq; |
416 | ring = &adev->uvd.ring_enc[0]; | 429 | ring = &adev->uvd.ring_enc[0]; |
417 | rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL]; | 430 | rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL]; |