diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 47 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 35 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/kv_dpm.c | 49 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dpm.c | 3 |
12 files changed, 109 insertions, 106 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 502b94fb116a..b6e9df11115d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -1012,13 +1012,9 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
1012 | if (r) | 1012 | if (r) |
1013 | return r; | 1013 | return r; |
1014 | 1014 | ||
1015 | if (chunk_ib->flags & AMDGPU_IB_FLAG_PREAMBLE) { | 1015 | if (chunk_ib->flags & AMDGPU_IB_FLAG_PREAMBLE) |
1016 | parser->job->preamble_status |= AMDGPU_PREAMBLE_IB_PRESENT; | 1016 | parser->job->preamble_status |= |
1017 | if (!parser->ctx->preamble_presented) { | 1017 | AMDGPU_PREAMBLE_IB_PRESENT; |
1018 | parser->job->preamble_status |= AMDGPU_PREAMBLE_IB_PRESENT_FIRST; | ||
1019 | parser->ctx->preamble_presented = true; | ||
1020 | } | ||
1021 | } | ||
1022 | 1018 | ||
1023 | if (parser->ring && parser->ring != ring) | 1019 | if (parser->ring && parser->ring != ring) |
1024 | return -EINVAL; | 1020 | return -EINVAL; |
@@ -1207,26 +1203,24 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, | |||
1207 | 1203 | ||
1208 | int r; | 1204 | int r; |
1209 | 1205 | ||
1206 | job = p->job; | ||
1207 | p->job = NULL; | ||
1208 | |||
1209 | r = drm_sched_job_init(&job->base, entity, p->filp); | ||
1210 | if (r) | ||
1211 | goto error_unlock; | ||
1212 | |||
1213 | /* No memory allocation is allowed while holding the mn lock */ | ||
1210 | amdgpu_mn_lock(p->mn); | 1214 | amdgpu_mn_lock(p->mn); |
1211 | amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { | 1215 | amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { |
1212 | struct amdgpu_bo *bo = e->robj; | 1216 | struct amdgpu_bo *bo = e->robj; |
1213 | 1217 | ||
1214 | if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) { | 1218 | if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) { |
1215 | amdgpu_mn_unlock(p->mn); | 1219 | r = -ERESTARTSYS; |
1216 | return -ERESTARTSYS; | 1220 | goto error_abort; |
1217 | } | 1221 | } |
1218 | } | 1222 | } |
1219 | 1223 | ||
1220 | job = p->job; | ||
1221 | p->job = NULL; | ||
1222 | |||
1223 | r = drm_sched_job_init(&job->base, entity, p->filp); | ||
1224 | if (r) { | ||
1225 | amdgpu_job_free(job); | ||
1226 | amdgpu_mn_unlock(p->mn); | ||
1227 | return r; | ||
1228 | } | ||
1229 | |||
1230 | job->owner = p->filp; | 1224 | job->owner = p->filp; |
1231 | p->fence = dma_fence_get(&job->base.s_fence->finished); | 1225 | p->fence = dma_fence_get(&job->base.s_fence->finished); |
1232 | 1226 | ||
@@ -1241,6 +1235,12 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, | |||
1241 | 1235 | ||
1242 | amdgpu_cs_post_dependencies(p); | 1236 | amdgpu_cs_post_dependencies(p); |
1243 | 1237 | ||
1238 | if ((job->preamble_status & AMDGPU_PREAMBLE_IB_PRESENT) && | ||
1239 | !p->ctx->preamble_presented) { | ||
1240 | job->preamble_status |= AMDGPU_PREAMBLE_IB_PRESENT_FIRST; | ||
1241 | p->ctx->preamble_presented = true; | ||
1242 | } | ||
1243 | |||
1244 | cs->out.handle = seq; | 1244 | cs->out.handle = seq; |
1245 | job->uf_sequence = seq; | 1245 | job->uf_sequence = seq; |
1246 | 1246 | ||
@@ -1258,6 +1258,15 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, | |||
1258 | amdgpu_mn_unlock(p->mn); | 1258 | amdgpu_mn_unlock(p->mn); |
1259 | 1259 | ||
1260 | return 0; | 1260 | return 0; |
1261 | |||
1262 | error_abort: | ||
1263 | dma_fence_put(&job->base.s_fence->finished); | ||
1264 | job->base.s_fence = NULL; | ||
1265 | |||
1266 | error_unlock: | ||
1267 | amdgpu_job_free(job); | ||
1268 | amdgpu_mn_unlock(p->mn); | ||
1269 | return r; | ||
1261 | } | 1270 | } |
1262 | 1271 | ||
1263 | int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | 1272 | int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 5518e623fed2..51b5e977ca88 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -164,8 +164,10 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
164 | return r; | 164 | return r; |
165 | } | 165 | } |
166 | 166 | ||
167 | need_ctx_switch = ring->current_ctx != fence_ctx; | ||
167 | if (ring->funcs->emit_pipeline_sync && job && | 168 | if (ring->funcs->emit_pipeline_sync && job && |
168 | ((tmp = amdgpu_sync_get_fence(&job->sched_sync, NULL)) || | 169 | ((tmp = amdgpu_sync_get_fence(&job->sched_sync, NULL)) || |
170 | (amdgpu_sriov_vf(adev) && need_ctx_switch) || | ||
169 | amdgpu_vm_need_pipeline_sync(ring, job))) { | 171 | amdgpu_vm_need_pipeline_sync(ring, job))) { |
170 | need_pipe_sync = true; | 172 | need_pipe_sync = true; |
171 | dma_fence_put(tmp); | 173 | dma_fence_put(tmp); |
@@ -196,7 +198,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
196 | } | 198 | } |
197 | 199 | ||
198 | skip_preamble = ring->current_ctx == fence_ctx; | 200 | skip_preamble = ring->current_ctx == fence_ctx; |
199 | need_ctx_switch = ring->current_ctx != fence_ctx; | ||
200 | if (job && ring->funcs->emit_cntxcntl) { | 201 | if (job && ring->funcs->emit_cntxcntl) { |
201 | if (need_ctx_switch) | 202 | if (need_ctx_switch) |
202 | status |= AMDGPU_HAVE_CTX_SWITCH; | 203 | status |= AMDGPU_HAVE_CTX_SWITCH; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 8f98629fbe59..7b4e657a95c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -1932,14 +1932,6 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev) | |||
1932 | amdgpu_fence_wait_empty(ring); | 1932 | amdgpu_fence_wait_empty(ring); |
1933 | } | 1933 | } |
1934 | 1934 | ||
1935 | mutex_lock(&adev->pm.mutex); | ||
1936 | /* update battery/ac status */ | ||
1937 | if (power_supply_is_system_supplied() > 0) | ||
1938 | adev->pm.ac_power = true; | ||
1939 | else | ||
1940 | adev->pm.ac_power = false; | ||
1941 | mutex_unlock(&adev->pm.mutex); | ||
1942 | |||
1943 | if (adev->powerplay.pp_funcs->dispatch_tasks) { | 1935 | if (adev->powerplay.pp_funcs->dispatch_tasks) { |
1944 | if (!amdgpu_device_has_dc_support(adev)) { | 1936 | if (!amdgpu_device_has_dc_support(adev)) { |
1945 | mutex_lock(&adev->pm.mutex); | 1937 | mutex_lock(&adev->pm.mutex); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index ece0ac703e27..b17771dd5ce7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -172,6 +172,7 @@ static void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base, | |||
172 | * is validated on next vm use to avoid fault. | 172 | * is validated on next vm use to avoid fault. |
173 | * */ | 173 | * */ |
174 | list_move_tail(&base->vm_status, &vm->evicted); | 174 | list_move_tail(&base->vm_status, &vm->evicted); |
175 | base->moved = true; | ||
175 | } | 176 | } |
176 | 177 | ||
177 | /** | 178 | /** |
@@ -369,7 +370,6 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev, | |||
369 | uint64_t addr; | 370 | uint64_t addr; |
370 | int r; | 371 | int r; |
371 | 372 | ||
372 | addr = amdgpu_bo_gpu_offset(bo); | ||
373 | entries = amdgpu_bo_size(bo) / 8; | 373 | entries = amdgpu_bo_size(bo) / 8; |
374 | 374 | ||
375 | if (pte_support_ats) { | 375 | if (pte_support_ats) { |
@@ -401,6 +401,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev, | |||
401 | if (r) | 401 | if (r) |
402 | goto error; | 402 | goto error; |
403 | 403 | ||
404 | addr = amdgpu_bo_gpu_offset(bo); | ||
404 | if (ats_entries) { | 405 | if (ats_entries) { |
405 | uint64_t ats_value; | 406 | uint64_t ats_value; |
406 | 407 | ||
@@ -2483,28 +2484,52 @@ static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size) | |||
2483 | * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size | 2484 | * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size |
2484 | * | 2485 | * |
2485 | * @adev: amdgpu_device pointer | 2486 | * @adev: amdgpu_device pointer |
2486 | * @vm_size: the default vm size if it's set auto | 2487 | * @min_vm_size: the minimum vm size in GB if it's set auto |
2487 | * @fragment_size_default: Default PTE fragment size | 2488 | * @fragment_size_default: Default PTE fragment size |
2488 | * @max_level: max VMPT level | 2489 | * @max_level: max VMPT level |
2489 | * @max_bits: max address space size in bits | 2490 | * @max_bits: max address space size in bits |
2490 | * | 2491 | * |
2491 | */ | 2492 | */ |
2492 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, | 2493 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size, |
2493 | uint32_t fragment_size_default, unsigned max_level, | 2494 | uint32_t fragment_size_default, unsigned max_level, |
2494 | unsigned max_bits) | 2495 | unsigned max_bits) |
2495 | { | 2496 | { |
2497 | unsigned int max_size = 1 << (max_bits - 30); | ||
2498 | unsigned int vm_size; | ||
2496 | uint64_t tmp; | 2499 | uint64_t tmp; |
2497 | 2500 | ||
2498 | /* adjust vm size first */ | 2501 | /* adjust vm size first */ |
2499 | if (amdgpu_vm_size != -1) { | 2502 | if (amdgpu_vm_size != -1) { |
2500 | unsigned max_size = 1 << (max_bits - 30); | ||
2501 | |||
2502 | vm_size = amdgpu_vm_size; | 2503 | vm_size = amdgpu_vm_size; |
2503 | if (vm_size > max_size) { | 2504 | if (vm_size > max_size) { |
2504 | dev_warn(adev->dev, "VM size (%d) too large, max is %u GB\n", | 2505 | dev_warn(adev->dev, "VM size (%d) too large, max is %u GB\n", |
2505 | amdgpu_vm_size, max_size); | 2506 | amdgpu_vm_size, max_size); |
2506 | vm_size = max_size; | 2507 | vm_size = max_size; |
2507 | } | 2508 | } |
2509 | } else { | ||
2510 | struct sysinfo si; | ||
2511 | unsigned int phys_ram_gb; | ||
2512 | |||
2513 | /* Optimal VM size depends on the amount of physical | ||
2514 | * RAM available. Underlying requirements and | ||
2515 | * assumptions: | ||
2516 | * | ||
2517 | * - Need to map system memory and VRAM from all GPUs | ||
2518 | * - VRAM from other GPUs not known here | ||
2519 | * - Assume VRAM <= system memory | ||
2520 | * - On GFX8 and older, VM space can be segmented for | ||
2521 | * different MTYPEs | ||
2522 | * - Need to allow room for fragmentation, guard pages etc. | ||
2523 | * | ||
2524 | * This adds up to a rough guess of system memory x3. | ||
2525 | * Round up to power of two to maximize the available | ||
2526 | * VM size with the given page table size. | ||
2527 | */ | ||
2528 | si_meminfo(&si); | ||
2529 | phys_ram_gb = ((uint64_t)si.totalram * si.mem_unit + | ||
2530 | (1 << 30) - 1) >> 30; | ||
2531 | vm_size = roundup_pow_of_two( | ||
2532 | min(max(phys_ram_gb * 3, min_vm_size), max_size)); | ||
2508 | } | 2533 | } |
2509 | 2534 | ||
2510 | adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; | 2535 | adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index 67a15d439ac0..9fa9df0c5e7f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | |||
@@ -321,7 +321,7 @@ struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm, | |||
321 | void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket); | 321 | void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket); |
322 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, | 322 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, |
323 | struct amdgpu_bo_va *bo_va); | 323 | struct amdgpu_bo_va *bo_va); |
324 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, | 324 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size, |
325 | uint32_t fragment_size_default, unsigned max_level, | 325 | uint32_t fragment_size_default, unsigned max_level, |
326 | unsigned max_bits); | 326 | unsigned max_bits); |
327 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); | 327 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 5cd45210113f..5a9534a82d40 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -5664,6 +5664,11 @@ static int gfx_v8_0_set_powergating_state(void *handle, | |||
5664 | if (amdgpu_sriov_vf(adev)) | 5664 | if (amdgpu_sriov_vf(adev)) |
5665 | return 0; | 5665 | return 0; |
5666 | 5666 | ||
5667 | if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_SMG | | ||
5668 | AMD_PG_SUPPORT_RLC_SMU_HS | | ||
5669 | AMD_PG_SUPPORT_CP | | ||
5670 | AMD_PG_SUPPORT_GFX_DMG)) | ||
5671 | adev->gfx.rlc.funcs->enter_safe_mode(adev); | ||
5667 | switch (adev->asic_type) { | 5672 | switch (adev->asic_type) { |
5668 | case CHIP_CARRIZO: | 5673 | case CHIP_CARRIZO: |
5669 | case CHIP_STONEY: | 5674 | case CHIP_STONEY: |
@@ -5713,7 +5718,11 @@ static int gfx_v8_0_set_powergating_state(void *handle, | |||
5713 | default: | 5718 | default: |
5714 | break; | 5719 | break; |
5715 | } | 5720 | } |
5716 | 5721 | if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_SMG | | |
5722 | AMD_PG_SUPPORT_RLC_SMU_HS | | ||
5723 | AMD_PG_SUPPORT_CP | | ||
5724 | AMD_PG_SUPPORT_GFX_DMG)) | ||
5725 | adev->gfx.rlc.funcs->exit_safe_mode(adev); | ||
5717 | return 0; | 5726 | return 0; |
5718 | } | 5727 | } |
5719 | 5728 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index 75317f283c69..ad151fefa41f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -632,12 +632,6 @@ static void gmc_v6_0_gart_disable(struct amdgpu_device *adev) | |||
632 | amdgpu_gart_table_vram_unpin(adev); | 632 | amdgpu_gart_table_vram_unpin(adev); |
633 | } | 633 | } |
634 | 634 | ||
635 | static void gmc_v6_0_gart_fini(struct amdgpu_device *adev) | ||
636 | { | ||
637 | amdgpu_gart_table_vram_free(adev); | ||
638 | amdgpu_gart_fini(adev); | ||
639 | } | ||
640 | |||
641 | static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev, | 635 | static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev, |
642 | u32 status, u32 addr, u32 mc_client) | 636 | u32 status, u32 addr, u32 mc_client) |
643 | { | 637 | { |
@@ -935,8 +929,9 @@ static int gmc_v6_0_sw_fini(void *handle) | |||
935 | 929 | ||
936 | amdgpu_gem_force_release(adev); | 930 | amdgpu_gem_force_release(adev); |
937 | amdgpu_vm_manager_fini(adev); | 931 | amdgpu_vm_manager_fini(adev); |
938 | gmc_v6_0_gart_fini(adev); | 932 | amdgpu_gart_table_vram_free(adev); |
939 | amdgpu_bo_fini(adev); | 933 | amdgpu_bo_fini(adev); |
934 | amdgpu_gart_fini(adev); | ||
940 | release_firmware(adev->gmc.fw); | 935 | release_firmware(adev->gmc.fw); |
941 | adev->gmc.fw = NULL; | 936 | adev->gmc.fw = NULL; |
942 | 937 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 36dc367c4b45..f8d8a3a73e42 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -747,19 +747,6 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev) | |||
747 | } | 747 | } |
748 | 748 | ||
749 | /** | 749 | /** |
750 | * gmc_v7_0_gart_fini - vm fini callback | ||
751 | * | ||
752 | * @adev: amdgpu_device pointer | ||
753 | * | ||
754 | * Tears down the driver GART/VM setup (CIK). | ||
755 | */ | ||
756 | static void gmc_v7_0_gart_fini(struct amdgpu_device *adev) | ||
757 | { | ||
758 | amdgpu_gart_table_vram_free(adev); | ||
759 | amdgpu_gart_fini(adev); | ||
760 | } | ||
761 | |||
762 | /** | ||
763 | * gmc_v7_0_vm_decode_fault - print human readable fault info | 750 | * gmc_v7_0_vm_decode_fault - print human readable fault info |
764 | * | 751 | * |
765 | * @adev: amdgpu_device pointer | 752 | * @adev: amdgpu_device pointer |
@@ -1095,8 +1082,9 @@ static int gmc_v7_0_sw_fini(void *handle) | |||
1095 | amdgpu_gem_force_release(adev); | 1082 | amdgpu_gem_force_release(adev); |
1096 | amdgpu_vm_manager_fini(adev); | 1083 | amdgpu_vm_manager_fini(adev); |
1097 | kfree(adev->gmc.vm_fault_info); | 1084 | kfree(adev->gmc.vm_fault_info); |
1098 | gmc_v7_0_gart_fini(adev); | 1085 | amdgpu_gart_table_vram_free(adev); |
1099 | amdgpu_bo_fini(adev); | 1086 | amdgpu_bo_fini(adev); |
1087 | amdgpu_gart_fini(adev); | ||
1100 | release_firmware(adev->gmc.fw); | 1088 | release_firmware(adev->gmc.fw); |
1101 | adev->gmc.fw = NULL; | 1089 | adev->gmc.fw = NULL; |
1102 | 1090 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 70fc97b59b4f..9333109b210d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -969,19 +969,6 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev) | |||
969 | } | 969 | } |
970 | 970 | ||
971 | /** | 971 | /** |
972 | * gmc_v8_0_gart_fini - vm fini callback | ||
973 | * | ||
974 | * @adev: amdgpu_device pointer | ||
975 | * | ||
976 | * Tears down the driver GART/VM setup (CIK). | ||
977 | */ | ||
978 | static void gmc_v8_0_gart_fini(struct amdgpu_device *adev) | ||
979 | { | ||
980 | amdgpu_gart_table_vram_free(adev); | ||
981 | amdgpu_gart_fini(adev); | ||
982 | } | ||
983 | |||
984 | /** | ||
985 | * gmc_v8_0_vm_decode_fault - print human readable fault info | 972 | * gmc_v8_0_vm_decode_fault - print human readable fault info |
986 | * | 973 | * |
987 | * @adev: amdgpu_device pointer | 974 | * @adev: amdgpu_device pointer |
@@ -1199,8 +1186,9 @@ static int gmc_v8_0_sw_fini(void *handle) | |||
1199 | amdgpu_gem_force_release(adev); | 1186 | amdgpu_gem_force_release(adev); |
1200 | amdgpu_vm_manager_fini(adev); | 1187 | amdgpu_vm_manager_fini(adev); |
1201 | kfree(adev->gmc.vm_fault_info); | 1188 | kfree(adev->gmc.vm_fault_info); |
1202 | gmc_v8_0_gart_fini(adev); | 1189 | amdgpu_gart_table_vram_free(adev); |
1203 | amdgpu_bo_fini(adev); | 1190 | amdgpu_bo_fini(adev); |
1191 | amdgpu_gart_fini(adev); | ||
1204 | release_firmware(adev->gmc.fw); | 1192 | release_firmware(adev->gmc.fw); |
1205 | adev->gmc.fw = NULL; | 1193 | adev->gmc.fw = NULL; |
1206 | 1194 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 399a5db27649..72f8018fa2a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -942,26 +942,12 @@ static int gmc_v9_0_sw_init(void *handle) | |||
942 | return 0; | 942 | return 0; |
943 | } | 943 | } |
944 | 944 | ||
945 | /** | ||
946 | * gmc_v9_0_gart_fini - vm fini callback | ||
947 | * | ||
948 | * @adev: amdgpu_device pointer | ||
949 | * | ||
950 | * Tears down the driver GART/VM setup (CIK). | ||
951 | */ | ||
952 | static void gmc_v9_0_gart_fini(struct amdgpu_device *adev) | ||
953 | { | ||
954 | amdgpu_gart_table_vram_free(adev); | ||
955 | amdgpu_gart_fini(adev); | ||
956 | } | ||
957 | |||
958 | static int gmc_v9_0_sw_fini(void *handle) | 945 | static int gmc_v9_0_sw_fini(void *handle) |
959 | { | 946 | { |
960 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 947 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
961 | 948 | ||
962 | amdgpu_gem_force_release(adev); | 949 | amdgpu_gem_force_release(adev); |
963 | amdgpu_vm_manager_fini(adev); | 950 | amdgpu_vm_manager_fini(adev); |
964 | gmc_v9_0_gart_fini(adev); | ||
965 | 951 | ||
966 | /* | 952 | /* |
967 | * TODO: | 953 | * TODO: |
@@ -974,7 +960,9 @@ static int gmc_v9_0_sw_fini(void *handle) | |||
974 | */ | 960 | */ |
975 | amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); | 961 | amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL); |
976 | 962 | ||
963 | amdgpu_gart_table_vram_free(adev); | ||
977 | amdgpu_bo_fini(adev); | 964 | amdgpu_bo_fini(adev); |
965 | amdgpu_gart_fini(adev); | ||
978 | 966 | ||
979 | return 0; | 967 | return 0; |
980 | } | 968 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c index 3f57f6463dc8..cb79a93c2eb7 100644 --- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c | |||
@@ -65,8 +65,6 @@ static int kv_set_thermal_temperature_range(struct amdgpu_device *adev, | |||
65 | int min_temp, int max_temp); | 65 | int min_temp, int max_temp); |
66 | static int kv_init_fps_limits(struct amdgpu_device *adev); | 66 | static int kv_init_fps_limits(struct amdgpu_device *adev); |
67 | 67 | ||
68 | static void kv_dpm_powergate_uvd(void *handle, bool gate); | ||
69 | static void kv_dpm_powergate_vce(struct amdgpu_device *adev, bool gate); | ||
70 | static void kv_dpm_powergate_samu(struct amdgpu_device *adev, bool gate); | 68 | static void kv_dpm_powergate_samu(struct amdgpu_device *adev, bool gate); |
71 | static void kv_dpm_powergate_acp(struct amdgpu_device *adev, bool gate); | 69 | static void kv_dpm_powergate_acp(struct amdgpu_device *adev, bool gate); |
72 | 70 | ||
@@ -1354,8 +1352,6 @@ static int kv_dpm_enable(struct amdgpu_device *adev) | |||
1354 | return ret; | 1352 | return ret; |
1355 | } | 1353 | } |
1356 | 1354 | ||
1357 | kv_update_current_ps(adev, adev->pm.dpm.boot_ps); | ||
1358 | |||
1359 | if (adev->irq.installed && | 1355 | if (adev->irq.installed && |
1360 | amdgpu_is_internal_thermal_sensor(adev->pm.int_thermal_type)) { | 1356 | amdgpu_is_internal_thermal_sensor(adev->pm.int_thermal_type)) { |
1361 | ret = kv_set_thermal_temperature_range(adev, KV_TEMP_RANGE_MIN, KV_TEMP_RANGE_MAX); | 1357 | ret = kv_set_thermal_temperature_range(adev, KV_TEMP_RANGE_MIN, KV_TEMP_RANGE_MAX); |
@@ -1374,6 +1370,8 @@ static int kv_dpm_enable(struct amdgpu_device *adev) | |||
1374 | 1370 | ||
1375 | static void kv_dpm_disable(struct amdgpu_device *adev) | 1371 | static void kv_dpm_disable(struct amdgpu_device *adev) |
1376 | { | 1372 | { |
1373 | struct kv_power_info *pi = kv_get_pi(adev); | ||
1374 | |||
1377 | amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, | 1375 | amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, |
1378 | AMDGPU_THERMAL_IRQ_LOW_TO_HIGH); | 1376 | AMDGPU_THERMAL_IRQ_LOW_TO_HIGH); |
1379 | amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, | 1377 | amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, |
@@ -1387,8 +1385,10 @@ static void kv_dpm_disable(struct amdgpu_device *adev) | |||
1387 | /* powerup blocks */ | 1385 | /* powerup blocks */ |
1388 | kv_dpm_powergate_acp(adev, false); | 1386 | kv_dpm_powergate_acp(adev, false); |
1389 | kv_dpm_powergate_samu(adev, false); | 1387 | kv_dpm_powergate_samu(adev, false); |
1390 | kv_dpm_powergate_vce(adev, false); | 1388 | if (pi->caps_vce_pg) /* power on the VCE block */ |
1391 | kv_dpm_powergate_uvd(adev, false); | 1389 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_VCEPowerON); |
1390 | if (pi->caps_uvd_pg) /* power on the UVD block */ | ||
1391 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_UVDPowerON); | ||
1392 | 1392 | ||
1393 | kv_enable_smc_cac(adev, false); | 1393 | kv_enable_smc_cac(adev, false); |
1394 | kv_enable_didt(adev, false); | 1394 | kv_enable_didt(adev, false); |
@@ -1551,7 +1551,6 @@ static int kv_update_vce_dpm(struct amdgpu_device *adev, | |||
1551 | int ret; | 1551 | int ret; |
1552 | 1552 | ||
1553 | if (amdgpu_new_state->evclk > 0 && amdgpu_current_state->evclk == 0) { | 1553 | if (amdgpu_new_state->evclk > 0 && amdgpu_current_state->evclk == 0) { |
1554 | kv_dpm_powergate_vce(adev, false); | ||
1555 | if (pi->caps_stable_p_state) | 1554 | if (pi->caps_stable_p_state) |
1556 | pi->vce_boot_level = table->count - 1; | 1555 | pi->vce_boot_level = table->count - 1; |
1557 | else | 1556 | else |
@@ -1573,7 +1572,6 @@ static int kv_update_vce_dpm(struct amdgpu_device *adev, | |||
1573 | kv_enable_vce_dpm(adev, true); | 1572 | kv_enable_vce_dpm(adev, true); |
1574 | } else if (amdgpu_new_state->evclk == 0 && amdgpu_current_state->evclk > 0) { | 1573 | } else if (amdgpu_new_state->evclk == 0 && amdgpu_current_state->evclk > 0) { |
1575 | kv_enable_vce_dpm(adev, false); | 1574 | kv_enable_vce_dpm(adev, false); |
1576 | kv_dpm_powergate_vce(adev, true); | ||
1577 | } | 1575 | } |
1578 | 1576 | ||
1579 | return 0; | 1577 | return 0; |
@@ -1702,24 +1700,32 @@ static void kv_dpm_powergate_uvd(void *handle, bool gate) | |||
1702 | } | 1700 | } |
1703 | } | 1701 | } |
1704 | 1702 | ||
1705 | static void kv_dpm_powergate_vce(struct amdgpu_device *adev, bool gate) | 1703 | static void kv_dpm_powergate_vce(void *handle, bool gate) |
1706 | { | 1704 | { |
1705 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
1707 | struct kv_power_info *pi = kv_get_pi(adev); | 1706 | struct kv_power_info *pi = kv_get_pi(adev); |
1708 | 1707 | int ret; | |
1709 | if (pi->vce_power_gated == gate) | ||
1710 | return; | ||
1711 | 1708 | ||
1712 | pi->vce_power_gated = gate; | 1709 | pi->vce_power_gated = gate; |
1713 | 1710 | ||
1714 | if (!pi->caps_vce_pg) | 1711 | if (gate) { |
1715 | return; | 1712 | /* stop the VCE block */ |
1716 | 1713 | ret = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE, | |
1717 | if (gate) | 1714 | AMD_PG_STATE_GATE); |
1718 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_VCEPowerOFF); | 1715 | kv_enable_vce_dpm(adev, false); |
1719 | else | 1716 | if (pi->caps_vce_pg) /* power off the VCE block */ |
1720 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_VCEPowerON); | 1717 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_VCEPowerOFF); |
1718 | } else { | ||
1719 | if (pi->caps_vce_pg) /* power on the VCE block */ | ||
1720 | amdgpu_kv_notify_message_to_smu(adev, PPSMC_MSG_VCEPowerON); | ||
1721 | kv_enable_vce_dpm(adev, true); | ||
1722 | /* re-init the VCE block */ | ||
1723 | ret = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE, | ||
1724 | AMD_PG_STATE_UNGATE); | ||
1725 | } | ||
1721 | } | 1726 | } |
1722 | 1727 | ||
1728 | |||
1723 | static void kv_dpm_powergate_samu(struct amdgpu_device *adev, bool gate) | 1729 | static void kv_dpm_powergate_samu(struct amdgpu_device *adev, bool gate) |
1724 | { | 1730 | { |
1725 | struct kv_power_info *pi = kv_get_pi(adev); | 1731 | struct kv_power_info *pi = kv_get_pi(adev); |
@@ -3061,7 +3067,7 @@ static int kv_dpm_hw_init(void *handle) | |||
3061 | else | 3067 | else |
3062 | adev->pm.dpm_enabled = true; | 3068 | adev->pm.dpm_enabled = true; |
3063 | mutex_unlock(&adev->pm.mutex); | 3069 | mutex_unlock(&adev->pm.mutex); |
3064 | 3070 | amdgpu_pm_compute_clocks(adev); | |
3065 | return ret; | 3071 | return ret; |
3066 | } | 3072 | } |
3067 | 3073 | ||
@@ -3313,6 +3319,9 @@ static int kv_set_powergating_by_smu(void *handle, | |||
3313 | case AMD_IP_BLOCK_TYPE_UVD: | 3319 | case AMD_IP_BLOCK_TYPE_UVD: |
3314 | kv_dpm_powergate_uvd(handle, gate); | 3320 | kv_dpm_powergate_uvd(handle, gate); |
3315 | break; | 3321 | break; |
3322 | case AMD_IP_BLOCK_TYPE_VCE: | ||
3323 | kv_dpm_powergate_vce(handle, gate); | ||
3324 | break; | ||
3316 | default: | 3325 | default: |
3317 | break; | 3326 | break; |
3318 | } | 3327 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index db327b412562..1de96995e690 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c | |||
@@ -6887,7 +6887,6 @@ static int si_dpm_enable(struct amdgpu_device *adev) | |||
6887 | 6887 | ||
6888 | si_enable_auto_throttle_source(adev, AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, true); | 6888 | si_enable_auto_throttle_source(adev, AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, true); |
6889 | si_thermal_start_thermal_controller(adev); | 6889 | si_thermal_start_thermal_controller(adev); |
6890 | ni_update_current_ps(adev, boot_ps); | ||
6891 | 6890 | ||
6892 | return 0; | 6891 | return 0; |
6893 | } | 6892 | } |
@@ -7763,7 +7762,7 @@ static int si_dpm_hw_init(void *handle) | |||
7763 | else | 7762 | else |
7764 | adev->pm.dpm_enabled = true; | 7763 | adev->pm.dpm_enabled = true; |
7765 | mutex_unlock(&adev->pm.mutex); | 7764 | mutex_unlock(&adev->pm.mutex); |
7766 | 7765 | amdgpu_pm_compute_clocks(adev); | |
7767 | return ret; | 7766 | return ret; |
7768 | } | 7767 | } |
7769 | 7768 | ||