Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-next-2018-06-15' of git://anongit.freedesktop.org/drm/drm

Pull amd drm fixes from Dave Airlie:
"Just a single set of AMD fixes for stuff in -next for -rc1"

* tag 'drm-next-2018-06-15' of git://anongit.freedesktop.org/drm/drm: (47 commits)
drm/amd/powerplay: Set higher SCLK&MCLK frequency than dpm7 in OD (v2)
drm/amd/powerplay: remove uncessary extra gfxoff control call
drm/amdgpu: fix parsing indirect register list v2
drm/amd/include: Update df 3.6 mask and shift definition
drm/amd/pp: Fix OD feature enable failed on Vega10 workstation cards
drm/amd/display: Fix stale buffer object (bo) use
drm/amd/pp: initialize result to before or'ing in data
drm/amd/powerplay: fix wrong clock adjust sequence
drm/amdgpu: Grab/put runtime PM references in atomic_commit_tail()
drm/amd/powerplay: fix missed hwmgr check warning before call gfx_off_control handler
drm/amdgpu: fix CG enabling hang with gfxoff enabled
drm/amdgpu: fix clear_all and replace handling in the VM (v2)
drm/amdgpu: add checking for sos version
drm/amdgpu: fix the missed vcn fw version report
Revert "drm/amdgpu: Add an ATPX quirk for hybrid laptop"
drm/amdgpu/df: fix potential array out-of-bounds read
drm/amdgpu: Fix NULL pointer when load kfd driver with PP block is disabled
drm/gfx9: Update gc goldensetting for vega20.
drm/amd/pp: Allow underclocking when od table is empty in vbios
drm/amdgpu/display: check if ppfuncs exists before using it
...

+365 -249
+7 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
··· 342 342 mem_info->local_mem_size_public, 343 343 mem_info->local_mem_size_private); 344 344 345 - if (amdgpu_emu_mode == 1) { 346 - mem_info->mem_clk_max = 100; 347 - return; 348 - } 349 - 350 345 if (amdgpu_sriov_vf(adev)) 351 346 mem_info->mem_clk_max = adev->clock.default_mclk / 100; 352 - else 347 + else if (adev->powerplay.pp_funcs) 353 348 mem_info->mem_clk_max = amdgpu_dpm_get_mclk(adev, false) / 100; 349 + else 350 + mem_info->mem_clk_max = 100; 354 351 } 355 352 356 353 uint64_t get_gpu_clock_counter(struct kgd_dev *kgd) ··· 364 367 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 365 368 366 369 /* the sclk is in quantas of 10kHz */ 367 - if (amdgpu_emu_mode == 1) 368 - return 100; 369 - 370 370 if (amdgpu_sriov_vf(adev)) 371 371 return adev->clock.default_sclk / 100; 372 - 373 - return amdgpu_dpm_get_sclk(adev, false) / 100; 372 + else if (adev->powerplay.pp_funcs) 373 + return amdgpu_dpm_get_sclk(adev, false) / 100; 374 + else 375 + return 100; 374 376 } 375 377 376 378 void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info)
-1
drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
··· 569 569 { 0x1002, 0x6900, 0x1002, 0x0124, AMDGPU_PX_QUIRK_FORCE_ATPX }, 570 570 { 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX }, 571 571 { 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX }, 572 - { 0x1002, 0x67DF, 0x1028, 0x0774, AMDGPU_PX_QUIRK_FORCE_ATPX }, 573 572 { 0, 0, 0, 0, 0 }, 574 573 }; 575 574
+23 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 522 522 struct amdgpu_bo_list_entry *e; 523 523 struct list_head duplicates; 524 524 unsigned i, tries = 10; 525 + struct amdgpu_bo *gds; 526 + struct amdgpu_bo *gws; 527 + struct amdgpu_bo *oa; 525 528 int r; 526 529 527 530 INIT_LIST_HEAD(&p->validated); ··· 655 652 656 653 amdgpu_cs_report_moved_bytes(p->adev, p->bytes_moved, 657 654 p->bytes_moved_vis); 655 + 658 656 if (p->bo_list) { 659 - struct amdgpu_bo *gds = p->bo_list->gds_obj; 660 - struct amdgpu_bo *gws = p->bo_list->gws_obj; 661 - struct amdgpu_bo *oa = p->bo_list->oa_obj; 662 657 struct amdgpu_vm *vm = &fpriv->vm; 663 658 unsigned i; 664 659 660 + gds = p->bo_list->gds_obj; 661 + gws = p->bo_list->gws_obj; 662 + oa = p->bo_list->oa_obj; 665 663 for (i = 0; i < p->bo_list->num_entries; i++) { 666 664 struct amdgpu_bo *bo = p->bo_list->array[i].robj; 667 665 668 666 p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo); 669 667 } 668 + } else { 669 + gds = p->adev->gds.gds_gfx_bo; 670 + gws = p->adev->gds.gws_gfx_bo; 671 + oa = p->adev->gds.oa_gfx_bo; 672 + } 670 673 671 - if (gds) { 672 - p->job->gds_base = amdgpu_bo_gpu_offset(gds); 673 - p->job->gds_size = amdgpu_bo_size(gds); 674 - } 675 - if (gws) { 676 - p->job->gws_base = amdgpu_bo_gpu_offset(gws); 677 - p->job->gws_size = amdgpu_bo_size(gws); 678 - } 679 - if (oa) { 680 - p->job->oa_base = amdgpu_bo_gpu_offset(oa); 681 - p->job->oa_size = amdgpu_bo_size(oa); 682 - } 674 + if (gds) { 675 + p->job->gds_base = amdgpu_bo_gpu_offset(gds); 676 + p->job->gds_size = amdgpu_bo_size(gds); 677 + } 678 + if (gws) { 679 + p->job->gws_base = amdgpu_bo_gpu_offset(gws); 680 + p->job->gws_size = amdgpu_bo_size(gws); 681 + } 682 + if (oa) { 683 + p->job->oa_base = amdgpu_bo_gpu_offset(oa); 684 + p->job->oa_size = amdgpu_bo_size(oa); 683 685 } 684 686 685 687 if (!r && p->uf_entry.robj) {
+12
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 1730 1730 } 1731 1731 } 1732 1732 } 1733 + 1734 + if (adev->powerplay.pp_feature & PP_GFXOFF_MASK) { 1735 + /* enable gfx powergating */ 1736 + amdgpu_device_ip_set_powergating_state(adev, 1737 + AMD_IP_BLOCK_TYPE_GFX, 1738 + AMD_PG_STATE_GATE); 1739 + /* enable gfxoff */ 1740 + amdgpu_device_ip_set_powergating_state(adev, 1741 + AMD_IP_BLOCK_TYPE_SMC, 1742 + AMD_PG_STATE_GATE); 1743 + } 1744 + 1733 1745 return 0; 1734 1746 } 1735 1747
+12 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 30 30 #include <drm/drmP.h> 31 31 #include <drm/amdgpu_drm.h> 32 32 #include "amdgpu.h" 33 + #include "amdgpu_display.h" 33 34 34 35 void amdgpu_gem_object_free(struct drm_gem_object *gobj) 35 36 { ··· 236 235 /* create a gem object to contain this object in */ 237 236 if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS | 238 237 AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) { 238 + if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) { 239 + /* if gds bo is created from user space, it must be 240 + * passed to bo list 241 + */ 242 + DRM_ERROR("GDS bo cannot be per-vm-bo\n"); 243 + return -EINVAL; 244 + } 239 245 flags |= AMDGPU_GEM_CREATE_NO_CPU_ACCESS; 240 246 if (args->in.domains == AMDGPU_GEM_DOMAIN_GDS) 241 247 size = size << AMDGPU_GDS_SHIFT; ··· 757 749 struct amdgpu_device *adev = dev->dev_private; 758 750 struct drm_gem_object *gobj; 759 751 uint32_t handle; 752 + u32 domain; 760 753 int r; 761 754 762 755 args->pitch = amdgpu_align_pitch(adev, args->width, 763 756 DIV_ROUND_UP(args->bpp, 8), 0); 764 757 args->size = (u64)args->pitch * args->height; 765 758 args->size = ALIGN(args->size, PAGE_SIZE); 766 - 767 - r = amdgpu_gem_object_create(adev, args->size, 0, 768 - AMDGPU_GEM_DOMAIN_VRAM, 759 + domain = amdgpu_bo_get_preferred_pin_domain(adev, 760 + amdgpu_display_supported_domains(adev)); 761 + r = amdgpu_gem_object_create(adev, args->size, 0, domain, 769 762 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 770 763 false, NULL, &gobj); 771 764 if (r)
+12 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 703 703 /* This assumes only APU display buffers are pinned with (VRAM|GTT). 704 704 * See function amdgpu_display_supported_domains() 705 705 */ 706 - if (domain == (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) { 707 - domain = AMDGPU_GEM_DOMAIN_VRAM; 708 - if (adev->gmc.real_vram_size <= AMDGPU_SG_THRESHOLD) 709 - domain = AMDGPU_GEM_DOMAIN_GTT; 710 - } 706 + domain = amdgpu_bo_get_preferred_pin_domain(adev, domain); 711 707 712 708 if (bo->pin_count) { 713 709 uint32_t mem_type = bo->tbo.mem.mem_type; ··· 1061 1065 !(bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)); 1062 1066 1063 1067 return bo->tbo.offset; 1068 + } 1069 + 1070 + uint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev, 1071 + uint32_t domain) 1072 + { 1073 + if (domain == (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) { 1074 + domain = AMDGPU_GEM_DOMAIN_VRAM; 1075 + if (adev->gmc.real_vram_size <= AMDGPU_SG_THRESHOLD) 1076 + domain = AMDGPU_GEM_DOMAIN_GTT; 1077 + } 1078 + return domain; 1064 1079 }
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 289 289 struct reservation_object *resv, 290 290 struct dma_fence **fence, 291 291 bool direct); 292 - 292 + uint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev, 293 + uint32_t domain); 293 294 294 295 /* 295 296 * sub allocation
+11 -41
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
··· 49 49 50 50 int amdgpu_vcn_sw_init(struct amdgpu_device *adev) 51 51 { 52 - struct amdgpu_ring *ring; 53 - struct drm_sched_rq *rq; 54 52 unsigned long bo_size; 55 53 const char *fw_name; 56 54 const struct common_firmware_header *hdr; ··· 82 84 } 83 85 84 86 hdr = (const struct common_firmware_header *)adev->vcn.fw->data; 87 + adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version); 85 88 family_id = le32_to_cpu(hdr->ucode_version) & 0xff; 86 89 version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff; 87 90 version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff; ··· 101 102 return r; 102 103 } 103 104 104 - ring = &adev->vcn.ring_dec; 105 - rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL]; 106 - r = drm_sched_entity_init(&ring->sched, &adev->vcn.entity_dec, 107 - rq, NULL); 108 - if (r != 0) { 109 - DRM_ERROR("Failed setting up VCN dec run queue.\n"); 110 - return r; 111 - } 112 - 113 - ring = &adev->vcn.ring_enc[0]; 114 - rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL]; 115 - r = drm_sched_entity_init(&ring->sched, &adev->vcn.entity_enc, 116 - rq, NULL); 117 - if (r != 0) { 118 - DRM_ERROR("Failed setting up VCN enc run queue.\n"); 119 - return r; 120 - } 121 - 122 105 return 0; 123 106 } 124 107 ··· 109 128 int i; 110 129 111 130 kfree(adev->vcn.saved_bo); 112 - 113 - drm_sched_entity_fini(&adev->vcn.ring_dec.sched, &adev->vcn.entity_dec); 114 - 115 - drm_sched_entity_fini(&adev->vcn.ring_enc[0].sched, &adev->vcn.entity_enc); 116 131 117 132 amdgpu_bo_free_kernel(&adev->vcn.vcpu_bo, 118 133 &adev->vcn.gpu_addr, ··· 255 278 } 256 279 257 280 static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring, 258 - struct amdgpu_bo *bo, bool direct, 281 + struct amdgpu_bo *bo, 259 282 struct dma_fence **fence) 260 283 { 261 284 struct amdgpu_device *adev = ring->adev; ··· 283 306 } 284 307 ib->length_dw = 16; 285 308 286 - if (direct) { 287 - r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 288 - job->fence = dma_fence_get(f); 289 - if (r) 290 - goto err_free; 309 + r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 310 + job->fence = dma_fence_get(f); 311 + if (r) 312 + goto err_free; 291 313 292 - amdgpu_job_free(job); 293 - } else { 294 - r = amdgpu_job_submit(job, ring, &adev->vcn.entity_dec, 295 - AMDGPU_FENCE_OWNER_UNDEFINED, &f); 296 - if (r) 297 - goto err_free; 298 - } 314 + amdgpu_job_free(job); 299 315 300 316 amdgpu_bo_fence(bo, f, false); 301 317 amdgpu_bo_unreserve(bo); ··· 340 370 for (i = 14; i < 1024; ++i) 341 371 msg[i] = cpu_to_le32(0x0); 342 372 343 - return amdgpu_vcn_dec_send_msg(ring, bo, true, fence); 373 + return amdgpu_vcn_dec_send_msg(ring, bo, fence); 344 374 } 345 375 346 376 static int amdgpu_vcn_dec_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, 347 - bool direct, struct dma_fence **fence) 377 + struct dma_fence **fence) 348 378 { 349 379 struct amdgpu_device *adev = ring->adev; 350 380 struct amdgpu_bo *bo = NULL; ··· 366 396 for (i = 6; i < 1024; ++i) 367 397 msg[i] = cpu_to_le32(0x0); 368 398 369 - return amdgpu_vcn_dec_send_msg(ring, bo, direct, fence); 399 + return amdgpu_vcn_dec_send_msg(ring, bo, fence); 370 400 } 371 401 372 402 int amdgpu_vcn_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout) ··· 380 410 goto error; 381 411 } 382 412 383 - r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, true, &fence); 413 + r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &fence); 384 414 if (r) { 385 415 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r); 386 416 goto error;
-2
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
··· 67 67 struct amdgpu_ring ring_dec; 68 68 struct amdgpu_ring ring_enc[AMDGPU_VCN_MAX_ENC_RINGS]; 69 69 struct amdgpu_irq_src irq; 70 - struct drm_sched_entity entity_dec; 71 - struct drm_sched_entity entity_enc; 72 70 unsigned num_enc_rings; 73 71 }; 74 72
+4 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 2123 2123 before->last = saddr - 1; 2124 2124 before->offset = tmp->offset; 2125 2125 before->flags = tmp->flags; 2126 - list_add(&before->list, &tmp->list); 2126 + before->bo_va = tmp->bo_va; 2127 + list_add(&before->list, &tmp->bo_va->invalids); 2127 2128 } 2128 2129 2129 2130 /* Remember mapping split at the end */ ··· 2134 2133 after->offset = tmp->offset; 2135 2134 after->offset += after->start - tmp->start; 2136 2135 after->flags = tmp->flags; 2137 - list_add(&after->list, &tmp->list); 2136 + after->bo_va = tmp->bo_va; 2137 + list_add(&after->list, &tmp->bo_va->invalids); 2138 2138 } 2139 2139 2140 2140 list_del(&tmp->list);
+1 -1
drivers/gpu/drm/amd/amdgpu/df_v3_6.c
··· 64 64 int fb_channel_number; 65 65 66 66 fb_channel_number = adev->df_funcs->get_fb_channel_number(adev); 67 - if (fb_channel_number > ARRAY_SIZE(df_v3_6_channel_number)) 67 + if (fb_channel_number >= ARRAY_SIZE(df_v3_6_channel_number)) 68 68 fb_channel_number = 0; 69 69 70 70 return df_v3_6_channel_number[fb_channel_number];
+10 -11
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 111 111 112 112 static const struct soc15_reg_golden golden_settings_gc_9_0_vg20[] = 113 113 { 114 + SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0x0f000080, 0x04000080), 114 115 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0x0f000000, 0x0a000000), 115 116 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000), 116 117 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xf3e777ff, 0x22014042), ··· 1838 1837 int indirect_offset, 1839 1838 int list_size, 1840 1839 int *unique_indirect_regs, 1841 - int *unique_indirect_reg_count, 1840 + int unique_indirect_reg_count, 1842 1841 int *indirect_start_offsets, 1843 - int *indirect_start_offsets_count) 1842 + int *indirect_start_offsets_count, 1843 + int max_start_offsets_count) 1844 1844 { 1845 1845 int idx; 1846 1846 1847 1847 for (; indirect_offset < list_size; indirect_offset++) { 1848 + WARN_ON(*indirect_start_offsets_count >= max_start_offsets_count); 1848 1849 indirect_start_offsets[*indirect_start_offsets_count] = indirect_offset; 1849 1850 *indirect_start_offsets_count = *indirect_start_offsets_count + 1; 1850 1851 ··· 1854 1851 indirect_offset += 2; 1855 1852 1856 1853 /* look for the matching indice */ 1857 - for (idx = 0; idx < *unique_indirect_reg_count; idx++) { 1854 + for (idx = 0; idx < unique_indirect_reg_count; idx++) { 1858 1855 if (unique_indirect_regs[idx] == 1859 1856 register_list_format[indirect_offset] || 1860 1857 !unique_indirect_regs[idx]) 1861 1858 break; 1862 1859 } 1863 1860 1864 - BUG_ON(idx >= *unique_indirect_reg_count); 1861 + BUG_ON(idx >= unique_indirect_reg_count); 1865 1862 1866 1863 if (!unique_indirect_regs[idx]) 1867 1864 unique_indirect_regs[idx] = register_list_format[indirect_offset]; ··· 1896 1893 adev->gfx.rlc.reg_list_format_direct_reg_list_length, 1897 1894 adev->gfx.rlc.reg_list_format_size_bytes >> 2, 1898 1895 unique_indirect_regs, 1899 - &unique_indirect_reg_count, 1896 + unique_indirect_reg_count, 1900 1897 indirect_start_offsets, 1901 - &indirect_start_offsets_count); 1898 + &indirect_start_offsets_count, 1899 + ARRAY_SIZE(indirect_start_offsets)); 1902 1900 1903 1901 /* enable auto inc in case it is disabled */ 1904 1902 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL)); ··· 3405 3401 return r; 3406 3402 3407 3403 r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); 3408 - if (r) 3409 - return r; 3410 - 3411 - r = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_GFX, 3412 - AMD_PG_STATE_GATE); 3413 3404 if (r) 3414 3405 return r; 3415 3406
+26 -1
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
··· 47 47 48 48 #define smnMP1_FIRMWARE_FLAGS 0x3010028 49 49 50 + static uint32_t sos_old_versions[] = {1517616, 1510592, 1448594, 1446554}; 51 + 50 52 static int 51 53 psp_v3_1_get_fw_type(struct amdgpu_firmware_info *ucode, enum psp_gfx_fw_type *type) 52 54 { ··· 212 210 return ret; 213 211 } 214 212 213 + static bool psp_v3_1_match_version(struct amdgpu_device *adev, uint32_t ver) 214 + { 215 + int i; 216 + 217 + if (ver == adev->psp.sos_fw_version) 218 + return true; 219 + 220 + /* 221 + * Double check if the latest four legacy versions. 222 + * If yes, it is still the right version. 223 + */ 224 + for (i = 0; i < sizeof(sos_old_versions) / sizeof(uint32_t); i++) { 225 + if (sos_old_versions[i] == adev->psp.sos_fw_version) 226 + return true; 227 + } 228 + 229 + return false; 230 + } 231 + 215 232 static int psp_v3_1_bootloader_load_sos(struct psp_context *psp) 216 233 { 217 234 int ret; 218 235 unsigned int psp_gfxdrv_command_reg = 0; 219 236 struct amdgpu_device *adev = psp->adev; 220 - uint32_t sol_reg; 237 + uint32_t sol_reg, ver; 221 238 222 239 /* Check sOS sign of life register to confirm sys driver and sOS 223 240 * are already been loaded. ··· 268 247 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81), 269 248 RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81), 270 249 0, true); 250 + 251 + ver = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); 252 + if (!psp_v3_1_match_version(adev, ver)) 253 + DRM_WARN("SOS version doesn't match\n"); 271 254 272 255 return ret; 273 256 }
+1
drivers/gpu/drm/amd/amdgpu/soc15.c
··· 685 685 AMD_CG_SUPPORT_BIF_MGCG | 686 686 AMD_CG_SUPPORT_BIF_LS | 687 687 AMD_CG_SUPPORT_HDP_MGCG | 688 + AMD_CG_SUPPORT_HDP_LS | 688 689 AMD_CG_SUPPORT_ROM_MGCG | 689 690 AMD_CG_SUPPORT_VCE_MGCG | 690 691 AMD_CG_SUPPORT_UVD_MGCG;
+2 -2
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
··· 769 769 return 0; 770 770 } 771 771 772 - bool vcn_v1_0_is_idle(void *handle) 772 + static bool vcn_v1_0_is_idle(void *handle) 773 773 { 774 774 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 775 775 776 776 return (RREG32_SOC15(VCN, 0, mmUVD_STATUS) == 0x2); 777 777 } 778 778 779 - int vcn_v1_0_wait_for_idle(void *handle) 779 + static int vcn_v1_0_wait_for_idle(void *handle) 780 780 { 781 781 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 782 782 int ret = 0;
+33 -34
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 46 46 #include <linux/moduleparam.h> 47 47 #include <linux/version.h> 48 48 #include <linux/types.h> 49 + #include <linux/pm_runtime.h> 49 50 50 51 #include <drm/drmP.h> 51 52 #include <drm/drm_atomic.h> ··· 2096 2095 { 2097 2096 uint32_t bpc = connector->display_info.bpc; 2098 2097 2099 - /* Limited color depth to 8bit 2100 - * TODO: Still need to handle deep color 2101 - */ 2102 - if (bpc > 8) 2103 - bpc = 8; 2104 - 2105 2098 switch (bpc) { 2106 2099 case 0: 2107 2100 /* Temporary Work around, DRM don't parse color depth for ··· 2311 2316 } 2312 2317 } 2313 2318 2314 - static int create_fake_sink(struct amdgpu_dm_connector *aconnector) 2319 + static struct dc_sink * 2320 + create_fake_sink(struct amdgpu_dm_connector *aconnector) 2315 2321 { 2316 - struct dc_sink *sink = NULL; 2317 2322 struct dc_sink_init_data sink_init_data = { 0 }; 2318 - 2323 + struct dc_sink *sink = NULL; 2319 2324 sink_init_data.link = aconnector->dc_link; 2320 2325 sink_init_data.sink_signal = aconnector->dc_link->connector_signal; 2321 2326 2322 2327 sink = dc_sink_create(&sink_init_data); 2323 2328 if (!sink) { 2324 2329 DRM_ERROR("Failed to create sink!\n"); 2325 - return -ENOMEM; 2330 + return NULL; 2326 2331 } 2327 - 2328 2332 sink->sink_signal = SIGNAL_TYPE_VIRTUAL; 2329 - aconnector->fake_enable = true; 2330 2333 2331 - aconnector->dc_sink = sink; 2332 - aconnector->dc_link->local_sink = sink; 2333 - 2334 - return 0; 2334 + return sink; 2335 2335 } 2336 2336 2337 2337 static void set_multisync_trigger_params( ··· 2389 2399 struct dc_stream_state *stream = NULL; 2390 2400 struct drm_display_mode mode = *drm_mode; 2391 2401 bool native_mode_found = false; 2392 - 2402 + struct dc_sink *sink = NULL; 2393 2403 if (aconnector == NULL) { 2394 2404 DRM_ERROR("aconnector is NULL!\n"); 2395 2405 return stream; ··· 2407 2417 return stream; 2408 2418 } 2409 2419 2410 - if (create_fake_sink(aconnector)) 2420 + sink = create_fake_sink(aconnector); 2421 + if (!sink) 2411 2422 return stream; 2423 + } else { 2424 + sink = aconnector->dc_sink; 2412 2425 } 2413 2426 2414 - stream = dc_create_stream_for_sink(aconnector->dc_sink); 2427 + stream = dc_create_stream_for_sink(sink); 2415 2428 2416 2429 if (stream == NULL) { 2417 2430 DRM_ERROR("Failed to create stream for sink!\n"); 2418 - return stream; 2431 + goto finish; 2419 2432 } 2420 2433 2421 2434 list_for_each_entry(preferred_mode, &aconnector->base.modes, head) { ··· 2457 2464 fill_audio_info( 2458 2465 &stream->audio_info, 2459 2466 drm_connector, 2460 - aconnector->dc_sink); 2467 + sink); 2461 2468 2462 2469 update_stream_signal(stream); 2463 2470 2464 2471 if (dm_state && dm_state->freesync_capable) 2465 2472 stream->ignore_msa_timing_param = true; 2473 + finish: 2474 + if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL) 2475 + dc_sink_release(sink); 2466 2476 2467 2477 return stream; 2468 2478 } ··· 2710 2714 struct dm_connector_state *state = 2711 2715 to_dm_connector_state(connector->state); 2712 2716 2717 + if (connector->state) 2718 + __drm_atomic_helper_connector_destroy_state(connector->state); 2719 + 2713 2720 kfree(state); 2714 2721 2715 2722 state = kzalloc(sizeof(*state), GFP_KERNEL); ··· 2723 2724 state->underscan_hborder = 0; 2724 2725 state->underscan_vborder = 0; 2725 2726 2726 - connector->state = &state->base; 2727 - connector->state->connector = connector; 2727 + __drm_atomic_helper_connector_reset(connector, &state->base); 2728 2728 } 2729 2729 } 2730 2730 ··· 3081 3083 } 3082 3084 } 3083 3085 3084 - /* It's a hack for s3 since in 4.9 kernel filter out cursor buffer 3085 - * prepare and cleanup in drm_atomic_helper_prepare_planes 3086 - * and drm_atomic_helper_cleanup_planes because fb doens't in s3. 3087 - * IN 4.10 kernel this code should be removed and amdgpu_device_suspend 3088 - * code touching fram buffers should be avoided for DC. 3089 - */ 3090 - if (plane->type == DRM_PLANE_TYPE_CURSOR) { 3091 - struct amdgpu_crtc *acrtc = to_amdgpu_crtc(new_state->crtc); 3092 - 3093 - acrtc->cursor_bo = obj; 3094 - } 3095 3086 return 0; 3096 3087 } 3097 3088 ··· 4268 4281 if (dm_old_crtc_state->stream) 4269 4282 remove_stream(adev, acrtc, dm_old_crtc_state->stream); 4270 4283 4284 + pm_runtime_get_noresume(dev->dev); 4285 + 4271 4286 acrtc->enabled = true; 4272 4287 acrtc->hw_mode = new_crtc_state->mode; 4273 4288 crtc->hwmode = new_crtc_state->mode; ··· 4458 4469 drm_atomic_helper_wait_for_flip_done(dev, state); 4459 4470 4460 4471 drm_atomic_helper_cleanup_planes(dev, state); 4472 + 4473 + /* Finally, drop a runtime PM reference for each newly disabled CRTC, 4474 + * so we can put the GPU into runtime suspend if we're not driving any 4475 + * displays anymore 4476 + */ 4477 + pm_runtime_mark_last_busy(dev->dev); 4478 + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 4479 + if (old_crtc_state->active && !new_crtc_state->active) 4480 + pm_runtime_put_autosuspend(dev->dev); 4481 + } 4461 4482 } 4462 4483 4463 4484
+3
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
··· 555 555 return 0; 556 556 } 557 557 558 + if (acrtc->otg_inst == -1) 559 + return 0; 560 + 558 561 irq_source = dal_irq_type + acrtc->otg_inst; 559 562 560 563 st = (state == AMDGPU_IRQ_STATE_ENABLE);
+43 -2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
··· 234 234 } 235 235 } 236 236 237 + static void pp_to_dc_clock_levels_with_latency( 238 + const struct pp_clock_levels_with_latency *pp_clks, 239 + struct dm_pp_clock_levels_with_latency *clk_level_info, 240 + enum dm_pp_clock_type dc_clk_type) 241 + { 242 + uint32_t i; 243 + 244 + if (pp_clks->num_levels > DM_PP_MAX_CLOCK_LEVELS) { 245 + DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 246 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 247 + pp_clks->num_levels, 248 + DM_PP_MAX_CLOCK_LEVELS); 249 + 250 + clk_level_info->num_levels = DM_PP_MAX_CLOCK_LEVELS; 251 + } else 252 + clk_level_info->num_levels = pp_clks->num_levels; 253 + 254 + DRM_DEBUG("DM_PPLIB: values for %s clock\n", 255 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 256 + 257 + for (i = 0; i < clk_level_info->num_levels; i++) { 258 + DRM_DEBUG("DM_PPLIB:\t %d\n", pp_clks->data[i].clocks_in_khz); 259 + clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz; 260 + clk_level_info->data[i].latency_in_us = pp_clks->data[i].latency_in_us; 261 + } 262 + } 263 + 237 264 bool dm_pp_get_clock_levels_by_type( 238 265 const struct dc_context *ctx, 239 266 enum dm_pp_clock_type clk_type, ··· 338 311 enum dm_pp_clock_type clk_type, 339 312 struct dm_pp_clock_levels_with_latency *clk_level_info) 340 313 { 341 - /* TODO: to be implemented */ 342 - return false; 314 + struct amdgpu_device *adev = ctx->driver_context; 315 + void *pp_handle = adev->powerplay.pp_handle; 316 + struct pp_clock_levels_with_latency pp_clks = { 0 }; 317 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 318 + 319 + if (!pp_funcs || !pp_funcs->get_clock_by_type_with_latency) 320 + return false; 321 + 322 + if (pp_funcs->get_clock_by_type_with_latency(pp_handle, 323 + dc_to_pp_clock_type(clk_type), 324 + &pp_clks)) 325 + return false; 326 + 327 + pp_to_dc_clock_levels_with_latency(&pp_clks, clk_level_info, clk_type); 328 + 329 + return true; 343 330 } 344 331 345 332 bool dm_pp_get_clock_levels_by_type_with_voltage(
+5
drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c
··· 449 449 return min_clamp; 450 450 } 451 451 452 + unsigned int dc_fixpt_u3d19(struct fixed31_32 arg) 453 + { 454 + return ux_dy(arg.value, 3, 19); 455 + } 456 + 452 457 unsigned int dc_fixpt_u2d19(struct fixed31_32 arg) 453 458 { 454 459 return ux_dy(arg.value, 2, 19);
+4 -2
drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
··· 72 72 uint32_t max_retries = 50; 73 73 74 74 /*we need turn on clock before programming AFMT block*/ 75 - REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1); 75 + if (REG(AFMT_CNTL)) 76 + REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1); 76 77 77 78 if (REG(AFMT_VBI_PACKET_CONTROL1)) { 78 79 if (packet_index >= 8) ··· 720 719 const uint32_t *content = 721 720 (const uint32_t *) &info_frame->avi.sb[0]; 722 721 /*we need turn on clock before programming AFMT block*/ 723 - REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1); 722 + if (REG(AFMT_CNTL)) 723 + REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1); 724 724 725 725 REG_WRITE(AFMT_AVI_INFO0, content[0]); 726 726
+4 -4
drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
··· 121 121 frame_count = dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT); 122 122 123 123 124 - for (retry = 100; retry > 0; retry--) { 124 + for (retry = 10000; retry > 0; retry--) { 125 125 if (frame_count != dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT)) 126 126 break; 127 - msleep(1); 127 + udelay(10); 128 128 } 129 129 if (!retry) 130 130 dm_error("Frame count did not increase for 100ms.\n"); ··· 147 147 uint32_t addr = mmFBC_STATUS; 148 148 uint32_t value; 149 149 150 - while (counter < 10) { 150 + while (counter < 1000) { 151 151 value = dm_read_reg(cp110->base.ctx, addr); 152 152 if (get_reg_field_value( 153 153 value, 154 154 FBC_STATUS, 155 155 FBC_ENABLE_STATUS) == enabled) 156 156 break; 157 - msleep(10); 157 + udelay(100); 158 158 counter++; 159 159 } 160 160
+1 -1
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 1004 1004 /*don't free audio if it is from retrain or internal disable stream*/ 1005 1005 if (option == FREE_ACQUIRED_RESOURCE && dc->caps.dynamic_audio == true) { 1006 1006 /*we have to dynamic arbitrate the audio endpoints*/ 1007 - pipe_ctx->stream_res.audio = NULL; 1008 1007 /*we free the resource, need reset is_audio_acquired*/ 1009 1008 update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, pipe_ctx->stream_res.audio, false); 1009 + pipe_ctx->stream_res.audio = NULL; 1010 1010 } 1011 1011 1012 1012 /* TODO: notify audio driver for if audio modes list changed
+1 -2
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
··· 132 132 133 133 #define IDENTITY_RATIO(ratio) (dc_fixpt_u2d19(ratio) == (1 << 19)) 134 134 135 - 136 - bool dpp_get_optimal_number_of_taps( 135 + static bool dpp_get_optimal_number_of_taps( 137 136 struct dpp *dpp, 138 137 struct scaler_data *scl_data, 139 138 const struct scaling_taps *in_taps)
+1 -5
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
··· 1424 1424 enum ipp_degamma_mode mode); 1425 1425 1426 1426 void dpp1_set_degamma_pwl(struct dpp *dpp_base, 1427 - const struct pwl_params *params); 1427 + const struct pwl_params *params); 1428 1428 1429 - bool dpp_get_optimal_number_of_taps( 1430 - struct dpp *dpp, 1431 - struct scaler_data *scl_data, 1432 - const struct scaling_taps *in_taps); 1433 1429 1434 1430 void dpp_read_state(struct dpp *dpp_base, 1435 1431 struct dcn_dpp_state *s);
+4 -4
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c
··· 565 565 uint32_t init_int = 0; 566 566 567 567 REG_SET(SCL_HORZ_FILTER_SCALE_RATIO, 0, 568 - SCL_H_SCALE_RATIO, dc_fixpt_u2d19(data->ratios.horz) << 5); 568 + SCL_H_SCALE_RATIO, dc_fixpt_u3d19(data->ratios.horz) << 5); 569 569 570 570 REG_SET(SCL_VERT_FILTER_SCALE_RATIO, 0, 571 - SCL_V_SCALE_RATIO, dc_fixpt_u2d19(data->ratios.vert) << 5); 571 + SCL_V_SCALE_RATIO, dc_fixpt_u3d19(data->ratios.vert) << 5); 572 572 573 573 REG_SET(SCL_HORZ_FILTER_SCALE_RATIO_C, 0, 574 - SCL_H_SCALE_RATIO_C, dc_fixpt_u2d19(data->ratios.horz_c) << 5); 574 + SCL_H_SCALE_RATIO_C, dc_fixpt_u3d19(data->ratios.horz_c) << 5); 575 575 576 576 REG_SET(SCL_VERT_FILTER_SCALE_RATIO_C, 0, 577 - SCL_V_SCALE_RATIO_C, dc_fixpt_u2d19(data->ratios.vert_c) << 5); 577 + SCL_V_SCALE_RATIO_C, dc_fixpt_u3d19(data->ratios.vert_c) << 5); 578 578 579 579 /* 580 580 * 0.24 format for fraction, first five bits zeroed
+10 -4
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
··· 396 396 if (address->grph_stereo.right_addr.quad_part == 0) 397 397 break; 398 398 399 - REG_UPDATE_4(DCSURF_SURFACE_CONTROL, 399 + REG_UPDATE_8(DCSURF_SURFACE_CONTROL, 400 400 PRIMARY_SURFACE_TMZ, address->tmz_surface, 401 401 PRIMARY_SURFACE_TMZ_C, address->tmz_surface, 402 402 PRIMARY_META_SURFACE_TMZ, address->tmz_surface, 403 - PRIMARY_META_SURFACE_TMZ_C, address->tmz_surface); 403 + PRIMARY_META_SURFACE_TMZ_C, address->tmz_surface, 404 + SECONDARY_SURFACE_TMZ, address->tmz_surface, 405 + SECONDARY_SURFACE_TMZ_C, address->tmz_surface, 406 + SECONDARY_META_SURFACE_TMZ, address->tmz_surface, 407 + SECONDARY_META_SURFACE_TMZ_C, address->tmz_surface); 404 408 405 409 if (address->grph_stereo.right_meta_addr.quad_part != 0) { 406 410 ··· 463 459 uint32_t dcc_ind_64b_blk = independent_64b_blks ? 1 : 0; 464 460 struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 465 461 466 - REG_UPDATE_2(DCSURF_SURFACE_CONTROL, 462 + REG_UPDATE_4(DCSURF_SURFACE_CONTROL, 467 463 PRIMARY_SURFACE_DCC_EN, dcc_en, 468 - PRIMARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk); 464 + PRIMARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk, 465 + SECONDARY_SURFACE_DCC_EN, dcc_en, 466 + SECONDARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk); 469 467 } 470 468 471 469 void hubp1_program_surface_config(
+8
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
··· 312 312 HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, PRIMARY_META_SURFACE_TMZ_C, mask_sh),\ 313 313 HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, PRIMARY_SURFACE_DCC_EN, mask_sh),\ 314 314 HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, PRIMARY_SURFACE_DCC_IND_64B_BLK, mask_sh),\ 315 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_TMZ, mask_sh),\ 316 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_TMZ_C, mask_sh),\ 317 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_META_SURFACE_TMZ, mask_sh),\ 318 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_META_SURFACE_TMZ_C, mask_sh),\ 319 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_DCC_EN, mask_sh),\ 320 + HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_DCC_IND_64B_BLK, mask_sh),\ 315 321 HUBP_SF(HUBPRET0_HUBPRET_CONTROL, DET_BUF_PLANE1_BASE_ADDRESS, mask_sh),\ 316 322 HUBP_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CB_B, mask_sh),\ 317 323 HUBP_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CR_R, mask_sh),\ ··· 495 489 type SECONDARY_META_SURFACE_TMZ_C;\ 496 490 type PRIMARY_SURFACE_DCC_EN;\ 497 491 type PRIMARY_SURFACE_DCC_IND_64B_BLK;\ 492 + type SECONDARY_SURFACE_DCC_EN;\ 493 + type SECONDARY_SURFACE_DCC_IND_64B_BLK;\ 498 494 type DET_BUF_PLANE1_BASE_ADDRESS;\ 499 495 type CROSSBAR_SRC_CB_B;\ 500 496 type CROSSBAR_SRC_CR_R;\
+4
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
··· 319 319 REG_UPDATE(DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, 320 320 DP_COMPONENT_PIXEL_DEPTH_12BPC); 321 321 break; 322 + case COLOR_DEPTH_161616: 323 + REG_UPDATE(DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, 324 + DP_COMPONENT_PIXEL_DEPTH_16BPC); 325 + break; 322 326 default: 323 327 REG_UPDATE(DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, 324 328 DP_COMPONENT_PIXEL_DEPTH_6BPC);
+2
drivers/gpu/drm/amd/display/include/fixed31_32.h
··· 496 496 * fractional 497 497 */ 498 498 499 + unsigned int dc_fixpt_u3d19(struct fixed31_32 arg); 500 + 499 501 unsigned int dc_fixpt_u2d19(struct fixed31_32 arg); 500 502 501 503 unsigned int dc_fixpt_u0d19(struct fixed31_32 arg);
+4 -4
drivers/gpu/drm/amd/include/asic_reg/df/df_3_6_sh_mask.h
··· 36 36 /* DF_CS_AON0_DramBaseAddress0 */ 37 37 #define DF_CS_UMC_AON0_DramBaseAddress0__AddrRngVal__SHIFT 0x0 38 38 #define DF_CS_UMC_AON0_DramBaseAddress0__LgcyMmioHoleEn__SHIFT 0x1 39 - #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvNumChan__SHIFT 0x4 40 - #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvAddrSel__SHIFT 0x8 39 + #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvNumChan__SHIFT 0x2 40 + #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvAddrSel__SHIFT 0x9 41 41 #define DF_CS_UMC_AON0_DramBaseAddress0__DramBaseAddr__SHIFT 0xc 42 42 #define DF_CS_UMC_AON0_DramBaseAddress0__AddrRngVal_MASK 0x00000001L 43 43 #define DF_CS_UMC_AON0_DramBaseAddress0__LgcyMmioHoleEn_MASK 0x00000002L 44 - #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvNumChan_MASK 0x000000F0L 45 - #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvAddrSel_MASK 0x00000700L 44 + #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvNumChan_MASK 0x0000003CL 45 + #define DF_CS_UMC_AON0_DramBaseAddress0__IntLvAddrSel_MASK 0x00000E00L 46 46 #define DF_CS_UMC_AON0_DramBaseAddress0__DramBaseAddr_MASK 0xFFFFF000L 47 47 48 48 #endif
+5 -7
drivers/gpu/drm/amd/include/atomfirmware.h
··· 2026 2026 SMU11_SYSPLL3_1_ID = 6, 2027 2027 }; 2028 2028 2029 - 2030 2029 enum atom_smu11_syspll0_clock_id { 2031 - SMU11_SYSPLL0_SOCCLK_ID = 0, // SOCCLK 2032 - SMU11_SYSPLL0_MP0CLK_ID = 1, // MP0CLK 2033 - SMU11_SYSPLL0_DCLK_ID = 2, // DCLK 2034 - SMU11_SYSPLL0_VCLK_ID = 3, // VCLK 2035 - SMU11_SYSPLL0_ECLK_ID = 4, // ECLK 2030 + SMU11_SYSPLL0_ECLK_ID = 0, // ECLK 2031 + SMU11_SYSPLL0_SOCCLK_ID = 1, // SOCCLK 2032 + SMU11_SYSPLL0_MP0CLK_ID = 2, // MP0CLK 2033 + SMU11_SYSPLL0_DCLK_ID = 3, // DCLK 2034 + SMU11_SYSPLL0_VCLK_ID = 4, // VCLK 2036 2035 SMU11_SYSPLL0_DCEFCLK_ID = 5, // DCEFCLK 2037 2036 }; 2038 - 2039 2037 2040 2038 enum atom_smu11_syspll1_0_clock_id { 2041 2039 SMU11_SYSPLL1_0_UCLKA_ID = 0, // UCLK_a
+1 -9
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
··· 180 180 { 181 181 struct amdgpu_device *adev = handle; 182 182 struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; 183 - int ret; 184 183 185 184 if (hwmgr && hwmgr->pm_en) { 186 185 mutex_lock(&hwmgr->smu_lock); ··· 189 190 } 190 191 if (adev->pm.smu_prv_buffer_size != 0) 191 192 pp_reserve_vram_for_smu(adev); 192 - 193 - if (hwmgr->hwmgr_func->gfx_off_control && 194 - (hwmgr->feature_mask & PP_GFXOFF_MASK)) { 195 - ret = hwmgr->hwmgr_func->gfx_off_control(hwmgr, true); 196 - if (ret) 197 - pr_err("gfx off enabling failed!\n"); 198 - } 199 193 200 194 return 0; 201 195 } ··· 237 245 } 238 246 239 247 if (hwmgr->hwmgr_func->enable_per_cu_power_gating == NULL) { 240 - pr_info("%s was not implemented.\n", __func__); 248 + pr_debug("%s was not implemented.\n", __func__); 241 249 return 0; 242 250 } 243 251
+6 -7
drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c
··· 265 265 if (skip) 266 266 return 0; 267 267 268 - if (!hwmgr->ps) 269 - /* 270 - * for vega12/vega20 which does not support power state manager 271 - * DAL clock limits should also be honoured 272 - */ 273 - phm_apply_clock_adjust_rules(hwmgr); 274 - 275 268 phm_pre_display_configuration_changed(hwmgr); 276 269 277 270 phm_display_configuration_changed(hwmgr); 278 271 279 272 if (hwmgr->ps) 280 273 power_state_management(hwmgr, new_ps); 274 + else 275 + /* 276 + * for vega12/vega20 which does not support power state manager 277 + * DAL clock limits should also be honoured 278 + */ 279 + phm_apply_clock_adjust_rules(hwmgr); 281 280 282 281 phm_notify_smc_display_config_after_ps_adjustment(hwmgr); 283 282
+3 -1
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
··· 496 496 uint32_t ix; 497 497 498 498 parameters.clk_id = id; 499 + parameters.syspll_id = 0; 499 500 parameters.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ; 501 + parameters.dfsdid = 0; 500 502 501 503 ix = GetIndexIntoMasterCmdTable(getsmuclockinfo); 502 504 ··· 507 505 return -EINVAL; 508 506 509 507 output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&parameters; 510 - *frequency = output->atom_smu_outputclkfreq.smu_clock_freq_hz / 10000; 508 + *frequency = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000; 511 509 512 510 return 0; 513 511 }
-6
drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c
··· 870 870 hwmgr->platform_descriptor.maxOverdriveVDDC = 0; 871 871 hwmgr->platform_descriptor.overdriveVDDCStep = 0; 872 872 873 - if (hwmgr->platform_descriptor.overdriveLimit.engineClock == 0 \ 874 - || hwmgr->platform_descriptor.overdriveLimit.memoryClock == 0) { 875 - hwmgr->od_enabled = false; 876 - pr_debug("OverDrive feature not support by VBIOS\n"); 877 - } 878 - 879 873 return 0; 880 874 } 881 875
-6
drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c
··· 1074 1074 powerplay_table, 1075 1075 (const ATOM_FIRMWARE_INFO_V2_1 *)fw_info); 1076 1076 1077 - if (hwmgr->platform_descriptor.overdriveLimit.engineClock == 0 1078 - && hwmgr->platform_descriptor.overdriveLimit.memoryClock == 0) { 1079 - hwmgr->od_enabled = false; 1080 - pr_debug("OverDrive feature not support by VBIOS\n"); 1081 - } 1082 - 1083 1077 return result; 1084 1078 } 1085 1079
+39 -35
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
··· 53 53 54 54 55 55 static int smu10_display_clock_voltage_request(struct pp_hwmgr *hwmgr, 56 - struct pp_display_clock_request *clock_req); 56 + struct pp_display_clock_request *clock_req) 57 + { 58 + struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 59 + enum amd_pp_clock_type clk_type = clock_req->clock_type; 60 + uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; 61 + PPSMC_Msg msg; 57 62 63 + switch (clk_type) { 64 + case amd_pp_dcf_clock: 65 + if (clk_freq == smu10_data->dcf_actual_hard_min_freq) 66 + return 0; 67 + msg = PPSMC_MSG_SetHardMinDcefclkByFreq; 68 + smu10_data->dcf_actual_hard_min_freq = clk_freq; 69 + break; 70 + case amd_pp_soc_clock: 71 + msg = PPSMC_MSG_SetHardMinSocclkByFreq; 72 + break; 73 + case amd_pp_f_clock: 74 + if (clk_freq == smu10_data->f_actual_hard_min_freq) 75 + return 0; 76 + smu10_data->f_actual_hard_min_freq = clk_freq; 77 + msg = PPSMC_MSG_SetHardMinFclkByFreq; 78 + break; 79 + default: 80 + pr_info("[DisplayClockVoltageRequest]Invalid Clock Type!"); 81 + return -EINVAL; 82 + } 83 + smum_send_msg_to_smc_with_parameter(hwmgr, msg, clk_freq); 84 + 85 + return 0; 86 + } 58 87 59 88 static struct smu10_power_state *cast_smu10_ps(struct pp_hw_power_state *hw_ps) 60 89 { ··· 313 284 314 285 static int smu10_disable_dpm_tasks(struct pp_hwmgr *hwmgr) 315 286 { 316 - return smu10_disable_gfx_off(hwmgr); 287 + return 0; 317 288 } 318 289 319 290 static int smu10_enable_gfx_off(struct pp_hwmgr *hwmgr) ··· 328 299 329 300 static int smu10_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 330 301 { 331 - return smu10_enable_gfx_off(hwmgr); 302 + return 0; 332 303 } 333 304 334 305 static int smu10_gfx_off_control(struct pp_hwmgr *hwmgr, bool enable) ··· 1029 1000 case amd_pp_soc_clock: 1030 1001 pclk_vol_table = pinfo->vdd_dep_on_socclk; 1031 1002 break; 1003 + case amd_pp_disp_clock: 1004 + pclk_vol_table = pinfo->vdd_dep_on_dispclk; 1005 + break; 1006 + case amd_pp_phy_clock: 1007 + pclk_vol_table = pinfo->vdd_dep_on_phyclk; 1008 + break; 1032 1009 default: 1033 1010 return -EINVAL; 1034 1011 } ··· 1052 1017 return 0; 1053 1018 } 1054 1019 1055 - static int smu10_display_clock_voltage_request(struct pp_hwmgr *hwmgr, 1056 - struct pp_display_clock_request *clock_req) 1057 - { 1058 - struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 1059 - enum amd_pp_clock_type clk_type = clock_req->clock_type; 1060 - uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; 1061 - PPSMC_Msg msg; 1062 1020 1063 - switch (clk_type) { 1064 - case amd_pp_dcf_clock: 1065 - if (clk_freq == smu10_data->dcf_actual_hard_min_freq) 1066 - return 0; 1067 - msg = PPSMC_MSG_SetHardMinDcefclkByFreq; 1068 - smu10_data->dcf_actual_hard_min_freq = clk_freq; 1069 - break; 1070 - case amd_pp_soc_clock: 1071 - msg = PPSMC_MSG_SetHardMinSocclkByFreq; 1072 - break; 1073 - case amd_pp_f_clock: 1074 - if (clk_freq == smu10_data->f_actual_hard_min_freq) 1075 - return 0; 1076 - smu10_data->f_actual_hard_min_freq = clk_freq; 1077 - msg = PPSMC_MSG_SetHardMinFclkByFreq; 1078 - break; 1079 - default: 1080 - pr_info("[DisplayClockVoltageRequest]Invalid Clock Type!"); 1081 - return -EINVAL; 1082 - } 1083 - 1084 - smum_send_msg_to_smc_with_parameter(hwmgr, msg, clk_freq); 1085 - 1086 - return 0; 1087 - } 1088 1021 1089 1022 static int smu10_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks) 1090 1023 { ··· 1185 1182 .set_mmhub_powergating_by_smu = smu10_set_mmhub_powergating_by_smu, 1186 1183 .smus_notify_pwe = smu10_smus_notify_pwe, 1187 1184 .gfx_off_control = smu10_gfx_off_control, 1185 + .display_clock_voltage_request = smu10_display_clock_voltage_request, 1188 1186 }; 1189 1187 1190 1188 int smu10_init_function_pointers(struct pp_hwmgr *hwmgr)
+9 -3
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 791 791 data->dpm_table.sclk_table.count++; 792 792 } 793 793 } 794 - 794 + if (hwmgr->platform_descriptor.overdriveLimit.engineClock == 0) 795 + hwmgr->platform_descriptor.overdriveLimit.engineClock = dep_sclk_table->entries[i-1].clk; 795 796 /* Initialize Mclk DPM table based on allow Mclk values */ 796 797 data->dpm_table.mclk_table.count = 0; 797 798 for (i = 0; i < dep_mclk_table->count; i++) { ··· 807 806 } 808 807 } 809 808 809 + if (hwmgr->platform_descriptor.overdriveLimit.memoryClock == 0) 810 + hwmgr->platform_descriptor.overdriveLimit.memoryClock = dep_mclk_table->entries[i-1].clk; 810 811 return 0; 811 812 } 812 813 ··· 3755 3752 static int smu7_generate_dpm_level_enable_mask( 3756 3753 struct pp_hwmgr *hwmgr, const void *input) 3757 3754 { 3758 - int result; 3755 + int result = 0; 3759 3756 const struct phm_set_power_state_input *states = 3760 3757 (const struct phm_set_power_state_input *)input; 3761 3758 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 3762 3759 const struct smu7_power_state *smu7_ps = 3763 3760 cast_const_phw_smu7_power_state(states->pnew_state); 3764 3761 3765 - result = smu7_trim_dpm_states(hwmgr, smu7_ps); 3762 + /*skip the trim if od is enabled*/ 3763 + if (!hwmgr->od_enabled) 3764 + result = smu7_trim_dpm_states(hwmgr, smu7_ps); 3765 + 3766 3766 if (result) 3767 3767 return result; 3768 3768
+13 -2
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
··· 321 321 odn_table->min_vddc = dep_table[0]->entries[0].vddc; 322 322 323 323 i = od_table[2]->count - 1; 324 - od_table[2]->entries[i].clk = hwmgr->platform_descriptor.overdriveLimit.memoryClock; 325 - od_table[2]->entries[i].vddc = odn_table->max_vddc; 324 + od_table[2]->entries[i].clk = hwmgr->platform_descriptor.overdriveLimit.memoryClock > od_table[2]->entries[i].clk ? 325 + hwmgr->platform_descriptor.overdriveLimit.memoryClock : 326 + od_table[2]->entries[i].clk; 327 + od_table[2]->entries[i].vddc = odn_table->max_vddc > od_table[2]->entries[i].vddc ? 328 + odn_table->max_vddc : 329 + od_table[2]->entries[i].vddc; 326 330 327 331 return 0; 328 332 } ··· 1315 1311 vega10_setup_default_single_dpm_table(hwmgr, 1316 1312 dpm_table, 1317 1313 dep_gfx_table); 1314 + if (hwmgr->platform_descriptor.overdriveLimit.engineClock == 0) 1315 + hwmgr->platform_descriptor.overdriveLimit.engineClock = 1316 + dpm_table->dpm_levels[dpm_table->count-1].value; 1318 1317 vega10_init_dpm_state(&(dpm_table->dpm_state)); 1319 1318 1320 1319 /* Initialize Mclk DPM table based on allow Mclk values */ ··· 1326 1319 vega10_setup_default_single_dpm_table(hwmgr, 1327 1320 dpm_table, 1328 1321 dep_mclk_table); 1322 + if (hwmgr->platform_descriptor.overdriveLimit.memoryClock == 0) 1323 + hwmgr->platform_descriptor.overdriveLimit.memoryClock = 1324 + dpm_table->dpm_levels[dpm_table->count-1].value; 1325 + 1329 1326 vega10_init_dpm_state(&(dpm_table->dpm_state)); 1330 1327 1331 1328 data->dpm_table.eclk_table.count = 0;
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
··· 1104 1104 for (count = 0; count < num_se; count++) { 1105 1105 data = GRBM_GFX_INDEX__INSTANCE_BROADCAST_WRITES_MASK | GRBM_GFX_INDEX__SH_BROADCAST_WRITES_MASK | ( count << GRBM_GFX_INDEX__SE_INDEX__SHIFT); 1106 1106 WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, data); 1107 - result |= vega10_program_didt_config_registers(hwmgr, PSMSEEDCStallPatternConfig_Vega10, VEGA10_CONFIGREG_DIDT); 1107 + result = vega10_program_didt_config_registers(hwmgr, PSMSEEDCStallPatternConfig_Vega10, VEGA10_CONFIGREG_DIDT); 1108 1108 result |= vega10_program_didt_config_registers(hwmgr, PSMSEEDCStallDelayConfig_Vega10, VEGA10_CONFIGREG_DIDT); 1109 1109 result |= vega10_program_didt_config_registers(hwmgr, PSMSEEDCCtrlResetConfig_Vega10, VEGA10_CONFIGREG_DIDT); 1110 1110 result |= vega10_program_didt_config_registers(hwmgr, PSMSEEDCCtrlConfig_Vega10, VEGA10_CONFIGREG_DIDT);
-6
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
··· 267 267 hwmgr->platform_descriptor.maxOverdriveVDDC = 0; 268 268 hwmgr->platform_descriptor.overdriveVDDCStep = 0; 269 269 270 - if (hwmgr->platform_descriptor.overdriveLimit.engineClock == 0 || 271 - hwmgr->platform_descriptor.overdriveLimit.memoryClock == 0) { 272 - hwmgr->od_enabled = false; 273 - pr_debug("OverDrive feature not support by VBIOS\n"); 274 - } 275 - 276 270 return 0; 277 271 } 278 272
+7 -2
drivers/gpu/drm/scheduler/gpu_scheduler.c
··· 349 349 struct dma_fence * fence = entity->dependency; 350 350 struct drm_sched_fence *s_fence; 351 351 352 - if (fence->context == entity->fence_context) { 353 - /* We can ignore fences from ourself */ 352 + if (fence->context == entity->fence_context || 353 + fence->context == entity->fence_context + 1) { 354 + /* 355 + * Fence is a scheduled/finished fence from a job 356 + * which belongs to the same entity, we can ignore 357 + * fences from ourself 358 + */ 354 359 dma_fence_put(entity->dependency); 355 360 return false; 356 361 }