diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
30 files changed, 288 insertions, 129 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 104b2e0d893b..b0fc116296cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -233,7 +233,7 @@ enum amdgpu_kiq_irq { | |||
233 | 233 | ||
234 | #define MAX_KIQ_REG_WAIT 5000 /* in usecs, 5ms */ | 234 | #define MAX_KIQ_REG_WAIT 5000 /* in usecs, 5ms */ |
235 | #define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */ | 235 | #define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */ |
236 | #define MAX_KIQ_REG_TRY 20 | 236 | #define MAX_KIQ_REG_TRY 80 /* 20 -> 80 */ |
237 | 237 | ||
238 | int amdgpu_device_ip_set_clockgating_state(void *dev, | 238 | int amdgpu_device_ip_set_clockgating_state(void *dev, |
239 | enum amd_ip_block_type block_type, | 239 | enum amd_ip_block_type block_type, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index c31a8849e9f8..1580ec60b89f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
@@ -501,8 +501,11 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle) | |||
501 | { | 501 | { |
502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; | 502 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; |
503 | 503 | ||
504 | amdgpu_dpm_switch_power_profile(adev, | 504 | if (adev->powerplay.pp_funcs && |
505 | PP_SMC_POWER_PROFILE_COMPUTE, !idle); | 505 | adev->powerplay.pp_funcs->switch_power_profile) |
506 | amdgpu_dpm_switch_power_profile(adev, | ||
507 | PP_SMC_POWER_PROFILE_COMPUTE, | ||
508 | !idle); | ||
506 | } | 509 | } |
507 | 510 | ||
508 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) | 511 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 8816c697b205..387f1cf1dc20 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
@@ -330,7 +330,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
330 | case CHIP_TOPAZ: | 330 | case CHIP_TOPAZ: |
331 | if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) || | 331 | if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) || |
332 | ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) || | 332 | ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) || |
333 | ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87))) { | 333 | ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)) || |
334 | ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD1)) || | ||
335 | ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD3))) { | ||
334 | info->is_kicker = true; | 336 | info->is_kicker = true; |
335 | strcpy(fw_name, "amdgpu/topaz_k_smc.bin"); | 337 | strcpy(fw_name, "amdgpu/topaz_k_smc.bin"); |
336 | } else | 338 | } else |
@@ -351,7 +353,6 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
351 | if (type == CGS_UCODE_ID_SMU) { | 353 | if (type == CGS_UCODE_ID_SMU) { |
352 | if (((adev->pdev->device == 0x67ef) && | 354 | if (((adev->pdev->device == 0x67ef) && |
353 | ((adev->pdev->revision == 0xe0) || | 355 | ((adev->pdev->revision == 0xe0) || |
354 | (adev->pdev->revision == 0xe2) || | ||
355 | (adev->pdev->revision == 0xe5))) || | 356 | (adev->pdev->revision == 0xe5))) || |
356 | ((adev->pdev->device == 0x67ff) && | 357 | ((adev->pdev->device == 0x67ff) && |
357 | ((adev->pdev->revision == 0xcf) || | 358 | ((adev->pdev->revision == 0xcf) || |
@@ -359,8 +360,13 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
359 | (adev->pdev->revision == 0xff)))) { | 360 | (adev->pdev->revision == 0xff)))) { |
360 | info->is_kicker = true; | 361 | info->is_kicker = true; |
361 | strcpy(fw_name, "amdgpu/polaris11_k_smc.bin"); | 362 | strcpy(fw_name, "amdgpu/polaris11_k_smc.bin"); |
362 | } else | 363 | } else if ((adev->pdev->device == 0x67ef) && |
364 | (adev->pdev->revision == 0xe2)) { | ||
365 | info->is_kicker = true; | ||
366 | strcpy(fw_name, "amdgpu/polaris11_k2_smc.bin"); | ||
367 | } else { | ||
363 | strcpy(fw_name, "amdgpu/polaris11_smc.bin"); | 368 | strcpy(fw_name, "amdgpu/polaris11_smc.bin"); |
369 | } | ||
364 | } else if (type == CGS_UCODE_ID_SMU_SK) { | 370 | } else if (type == CGS_UCODE_ID_SMU_SK) { |
365 | strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin"); | 371 | strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin"); |
366 | } | 372 | } |
@@ -375,17 +381,35 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
375 | (adev->pdev->revision == 0xe7) || | 381 | (adev->pdev->revision == 0xe7) || |
376 | (adev->pdev->revision == 0xef))) || | 382 | (adev->pdev->revision == 0xef))) || |
377 | ((adev->pdev->device == 0x6fdf) && | 383 | ((adev->pdev->device == 0x6fdf) && |
378 | (adev->pdev->revision == 0xef))) { | 384 | ((adev->pdev->revision == 0xef) || |
385 | (adev->pdev->revision == 0xff)))) { | ||
379 | info->is_kicker = true; | 386 | info->is_kicker = true; |
380 | strcpy(fw_name, "amdgpu/polaris10_k_smc.bin"); | 387 | strcpy(fw_name, "amdgpu/polaris10_k_smc.bin"); |
381 | } else | 388 | } else if ((adev->pdev->device == 0x67df) && |
389 | ((adev->pdev->revision == 0xe1) || | ||
390 | (adev->pdev->revision == 0xf7))) { | ||
391 | info->is_kicker = true; | ||
392 | strcpy(fw_name, "amdgpu/polaris10_k2_smc.bin"); | ||
393 | } else { | ||
382 | strcpy(fw_name, "amdgpu/polaris10_smc.bin"); | 394 | strcpy(fw_name, "amdgpu/polaris10_smc.bin"); |
395 | } | ||
383 | } else if (type == CGS_UCODE_ID_SMU_SK) { | 396 | } else if (type == CGS_UCODE_ID_SMU_SK) { |
384 | strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin"); | 397 | strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin"); |
385 | } | 398 | } |
386 | break; | 399 | break; |
387 | case CHIP_POLARIS12: | 400 | case CHIP_POLARIS12: |
388 | strcpy(fw_name, "amdgpu/polaris12_smc.bin"); | 401 | if (((adev->pdev->device == 0x6987) && |
402 | ((adev->pdev->revision == 0xc0) || | ||
403 | (adev->pdev->revision == 0xc3))) || | ||
404 | ((adev->pdev->device == 0x6981) && | ||
405 | ((adev->pdev->revision == 0x00) || | ||
406 | (adev->pdev->revision == 0x01) || | ||
407 | (adev->pdev->revision == 0x10)))) { | ||
408 | info->is_kicker = true; | ||
409 | strcpy(fw_name, "amdgpu/polaris12_k_smc.bin"); | ||
410 | } else { | ||
411 | strcpy(fw_name, "amdgpu/polaris12_smc.bin"); | ||
412 | } | ||
389 | break; | 413 | break; |
390 | case CHIP_VEGAM: | 414 | case CHIP_VEGAM: |
391 | strcpy(fw_name, "amdgpu/vegam_smc.bin"); | 415 | strcpy(fw_name, "amdgpu/vegam_smc.bin"); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 663043c8f0f5..0acc8dee2cb8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -124,14 +124,14 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs | |||
124 | goto free_chunk; | 124 | goto free_chunk; |
125 | } | 125 | } |
126 | 126 | ||
127 | mutex_lock(&p->ctx->lock); | ||
128 | |||
127 | /* skip guilty context job */ | 129 | /* skip guilty context job */ |
128 | if (atomic_read(&p->ctx->guilty) == 1) { | 130 | if (atomic_read(&p->ctx->guilty) == 1) { |
129 | ret = -ECANCELED; | 131 | ret = -ECANCELED; |
130 | goto free_chunk; | 132 | goto free_chunk; |
131 | } | 133 | } |
132 | 134 | ||
133 | mutex_lock(&p->ctx->lock); | ||
134 | |||
135 | /* get chunks */ | 135 | /* get chunks */ |
136 | chunk_array_user = u64_to_user_ptr(cs->in.chunks); | 136 | chunk_array_user = u64_to_user_ptr(cs->in.chunks); |
137 | if (copy_from_user(chunk_array, chunk_array_user, | 137 | if (copy_from_user(chunk_array, chunk_array_user, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index f9b54236102d..95f4c4139fc6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |||
@@ -39,6 +39,7 @@ const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = { | |||
39 | [AMDGPU_HW_IP_UVD_ENC] = 1, | 39 | [AMDGPU_HW_IP_UVD_ENC] = 1, |
40 | [AMDGPU_HW_IP_VCN_DEC] = 1, | 40 | [AMDGPU_HW_IP_VCN_DEC] = 1, |
41 | [AMDGPU_HW_IP_VCN_ENC] = 1, | 41 | [AMDGPU_HW_IP_VCN_ENC] = 1, |
42 | [AMDGPU_HW_IP_VCN_JPEG] = 1, | ||
42 | }; | 43 | }; |
43 | 44 | ||
44 | static int amdgput_ctx_total_num_entities(void) | 45 | static int amdgput_ctx_total_num_entities(void) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 6748cd7fc129..686a26de50f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |||
@@ -626,6 +626,13 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev) | |||
626 | "dither", | 626 | "dither", |
627 | amdgpu_dither_enum_list, sz); | 627 | amdgpu_dither_enum_list, sz); |
628 | 628 | ||
629 | if (amdgpu_device_has_dc_support(adev)) { | ||
630 | adev->mode_info.max_bpc_property = | ||
631 | drm_property_create_range(adev->ddev, 0, "max bpc", 8, 16); | ||
632 | if (!adev->mode_info.max_bpc_property) | ||
633 | return -ENOMEM; | ||
634 | } | ||
635 | |||
629 | return 0; | 636 | return 0; |
630 | } | 637 | } |
631 | 638 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 8de55f7f1a3a..74b611e8a1b1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
@@ -872,7 +872,13 @@ static const struct pci_device_id pciidlist[] = { | |||
872 | {0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | 872 | {0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
873 | {0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | 873 | {0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
874 | {0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | 874 | {0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
875 | {0x1002, 0x6869, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
876 | {0x1002, 0x686a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
877 | {0x1002, 0x686b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
875 | {0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | 878 | {0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
879 | {0x1002, 0x686d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
880 | {0x1002, 0x686e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
881 | {0x1002, 0x686f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | ||
876 | {0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, | 882 | {0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
877 | /* Vega 12 */ | 883 | /* Vega 12 */ |
878 | {0x1002, 0x69A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12}, | 884 | {0x1002, 0x69A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12}, |
@@ -885,6 +891,7 @@ static const struct pci_device_id pciidlist[] = { | |||
885 | {0x1002, 0x66A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | 891 | {0x1002, 0x66A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, |
886 | {0x1002, 0x66A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | 892 | {0x1002, 0x66A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, |
887 | {0x1002, 0x66A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | 893 | {0x1002, 0x66A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, |
894 | {0x1002, 0x66A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | ||
888 | {0x1002, 0x66A7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | 895 | {0x1002, 0x66A7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, |
889 | {0x1002, 0x66AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, | 896 | {0x1002, 0x66AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, |
890 | /* Raven */ | 897 | /* Raven */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 81732a84c2ab..8f3d44e5e787 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -467,9 +467,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
467 | if (!info->return_size || !info->return_pointer) | 467 | if (!info->return_size || !info->return_pointer) |
468 | return -EINVAL; | 468 | return -EINVAL; |
469 | 469 | ||
470 | /* Ensure IB tests are run on ring */ | ||
471 | flush_delayed_work(&adev->late_init_work); | ||
472 | |||
473 | switch (info->query) { | 470 | switch (info->query) { |
474 | case AMDGPU_INFO_ACCEL_WORKING: | 471 | case AMDGPU_INFO_ACCEL_WORKING: |
475 | ui32 = adev->accel_working; | 472 | ui32 = adev->accel_working; |
@@ -950,6 +947,9 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
950 | struct amdgpu_fpriv *fpriv; | 947 | struct amdgpu_fpriv *fpriv; |
951 | int r, pasid; | 948 | int r, pasid; |
952 | 949 | ||
950 | /* Ensure IB tests are run on ring */ | ||
951 | flush_delayed_work(&adev->late_init_work); | ||
952 | |||
953 | file_priv->driver_priv = NULL; | 953 | file_priv->driver_priv = NULL; |
954 | 954 | ||
955 | r = pm_runtime_get_sync(dev->dev); | 955 | r = pm_runtime_get_sync(dev->dev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index b9e9e8b02fb7..d1b4d9b6aae0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | |||
@@ -339,6 +339,8 @@ struct amdgpu_mode_info { | |||
339 | struct drm_property *audio_property; | 339 | struct drm_property *audio_property; |
340 | /* FMT dithering */ | 340 | /* FMT dithering */ |
341 | struct drm_property *dither_property; | 341 | struct drm_property *dither_property; |
342 | /* maximum number of bits per channel for monitor color */ | ||
343 | struct drm_property *max_bpc_property; | ||
342 | /* hardcoded DFP edid from BIOS */ | 344 | /* hardcoded DFP edid from BIOS */ |
343 | struct edid *bios_hardcoded_edid; | 345 | struct edid *bios_hardcoded_edid; |
344 | int bios_hardcoded_edid_size; | 346 | int bios_hardcoded_edid_size; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index dad0e2342df9..0877ff9a9594 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -181,7 +181,7 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev, | |||
181 | 181 | ||
182 | if (level == adev->vm_manager.root_level) | 182 | if (level == adev->vm_manager.root_level) |
183 | /* For the root directory */ | 183 | /* For the root directory */ |
184 | return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift; | 184 | return round_up(adev->vm_manager.max_pfn, 1ULL << shift) >> shift; |
185 | else if (level != AMDGPU_VM_PTB) | 185 | else if (level != AMDGPU_VM_PTB) |
186 | /* Everything in between */ | 186 | /* Everything in between */ |
187 | return 512; | 187 | return 512; |
@@ -1656,9 +1656,11 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1656 | if (!amdgpu_vm_pt_descendant(adev, &cursor)) | 1656 | if (!amdgpu_vm_pt_descendant(adev, &cursor)) |
1657 | return -ENOENT; | 1657 | return -ENOENT; |
1658 | continue; | 1658 | continue; |
1659 | } else if (frag >= parent_shift) { | 1659 | } else if (frag >= parent_shift && |
1660 | cursor.level - 1 != adev->vm_manager.root_level) { | ||
1660 | /* If the fragment size is even larger than the parent | 1661 | /* If the fragment size is even larger than the parent |
1661 | * shift we should go up one level and check it again. | 1662 | * shift we should go up one level and check it again |
1663 | * unless one level up is the root level. | ||
1662 | */ | 1664 | */ |
1663 | if (!amdgpu_vm_pt_ancestor(&cursor)) | 1665 | if (!amdgpu_vm_pt_ancestor(&cursor)) |
1664 | return -ENOENT; | 1666 | return -ENOENT; |
@@ -1666,10 +1668,10 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1666 | } | 1668 | } |
1667 | 1669 | ||
1668 | /* Looks good so far, calculate parameters for the update */ | 1670 | /* Looks good so far, calculate parameters for the update */ |
1669 | incr = AMDGPU_GPU_PAGE_SIZE << shift; | 1671 | incr = (uint64_t)AMDGPU_GPU_PAGE_SIZE << shift; |
1670 | mask = amdgpu_vm_entries_mask(adev, cursor.level); | 1672 | mask = amdgpu_vm_entries_mask(adev, cursor.level); |
1671 | pe_start = ((cursor.pfn >> shift) & mask) * 8; | 1673 | pe_start = ((cursor.pfn >> shift) & mask) * 8; |
1672 | entry_end = (mask + 1) << shift; | 1674 | entry_end = (uint64_t)(mask + 1) << shift; |
1673 | entry_end += cursor.pfn & ~(entry_end - 1); | 1675 | entry_end += cursor.pfn & ~(entry_end - 1); |
1674 | entry_end = min(entry_end, end); | 1676 | entry_end = min(entry_end, end); |
1675 | 1677 | ||
@@ -1682,7 +1684,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1682 | flags | AMDGPU_PTE_FRAG(frag)); | 1684 | flags | AMDGPU_PTE_FRAG(frag)); |
1683 | 1685 | ||
1684 | pe_start += nptes * 8; | 1686 | pe_start += nptes * 8; |
1685 | dst += nptes * AMDGPU_GPU_PAGE_SIZE << shift; | 1687 | dst += (uint64_t)nptes * AMDGPU_GPU_PAGE_SIZE << shift; |
1686 | 1688 | ||
1687 | frag_start = upd_end; | 1689 | frag_start = upd_end; |
1688 | if (frag_start >= frag_end) { | 1690 | if (frag_start >= frag_end) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 6d7baf59d6e1..21363b2b2ee5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -2440,12 +2440,13 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev) | |||
2440 | #endif | 2440 | #endif |
2441 | 2441 | ||
2442 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); | 2442 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); |
2443 | udelay(50); | ||
2443 | 2444 | ||
2444 | /* carrizo do enable cp interrupt after cp inited */ | 2445 | /* carrizo do enable cp interrupt after cp inited */ |
2445 | if (!(adev->flags & AMD_IS_APU)) | 2446 | if (!(adev->flags & AMD_IS_APU)) { |
2446 | gfx_v9_0_enable_gui_idle_interrupt(adev, true); | 2447 | gfx_v9_0_enable_gui_idle_interrupt(adev, true); |
2447 | 2448 | udelay(50); | |
2448 | udelay(50); | 2449 | } |
2449 | 2450 | ||
2450 | #ifdef AMDGPU_RLC_DEBUG_RETRY | 2451 | #ifdef AMDGPU_RLC_DEBUG_RETRY |
2451 | /* RLC_GPM_GENERAL_6 : RLC Ucode version */ | 2452 | /* RLC_GPM_GENERAL_6 : RLC Ucode version */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index e1c2b4e9c7b2..73ad02aea2b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -46,6 +46,7 @@ MODULE_FIRMWARE("amdgpu/tahiti_mc.bin"); | |||
46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); | 46 | MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); |
47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); | 47 | MODULE_FIRMWARE("amdgpu/verde_mc.bin"); |
48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); | 48 | MODULE_FIRMWARE("amdgpu/oland_mc.bin"); |
49 | MODULE_FIRMWARE("amdgpu/hainan_mc.bin"); | ||
49 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); | 50 | MODULE_FIRMWARE("amdgpu/si58_mc.bin"); |
50 | 51 | ||
51 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 | 52 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 1d3265c97b70..747c068379dc 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -56,6 +56,9 @@ MODULE_FIRMWARE("amdgpu/tonga_mc.bin"); | |||
56 | MODULE_FIRMWARE("amdgpu/polaris11_mc.bin"); | 56 | MODULE_FIRMWARE("amdgpu/polaris11_mc.bin"); |
57 | MODULE_FIRMWARE("amdgpu/polaris10_mc.bin"); | 57 | MODULE_FIRMWARE("amdgpu/polaris10_mc.bin"); |
58 | MODULE_FIRMWARE("amdgpu/polaris12_mc.bin"); | 58 | MODULE_FIRMWARE("amdgpu/polaris12_mc.bin"); |
59 | MODULE_FIRMWARE("amdgpu/polaris11_k_mc.bin"); | ||
60 | MODULE_FIRMWARE("amdgpu/polaris10_k_mc.bin"); | ||
61 | MODULE_FIRMWARE("amdgpu/polaris12_k_mc.bin"); | ||
59 | 62 | ||
60 | static const u32 golden_settings_tonga_a11[] = | 63 | static const u32 golden_settings_tonga_a11[] = |
61 | { | 64 | { |
@@ -224,13 +227,39 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev) | |||
224 | chip_name = "tonga"; | 227 | chip_name = "tonga"; |
225 | break; | 228 | break; |
226 | case CHIP_POLARIS11: | 229 | case CHIP_POLARIS11: |
227 | chip_name = "polaris11"; | 230 | if (((adev->pdev->device == 0x67ef) && |
231 | ((adev->pdev->revision == 0xe0) || | ||
232 | (adev->pdev->revision == 0xe5))) || | ||
233 | ((adev->pdev->device == 0x67ff) && | ||
234 | ((adev->pdev->revision == 0xcf) || | ||
235 | (adev->pdev->revision == 0xef) || | ||
236 | (adev->pdev->revision == 0xff)))) | ||
237 | chip_name = "polaris11_k"; | ||
238 | else if ((adev->pdev->device == 0x67ef) && | ||
239 | (adev->pdev->revision == 0xe2)) | ||
240 | chip_name = "polaris11_k"; | ||
241 | else | ||
242 | chip_name = "polaris11"; | ||
228 | break; | 243 | break; |
229 | case CHIP_POLARIS10: | 244 | case CHIP_POLARIS10: |
230 | chip_name = "polaris10"; | 245 | if ((adev->pdev->device == 0x67df) && |
246 | ((adev->pdev->revision == 0xe1) || | ||
247 | (adev->pdev->revision == 0xf7))) | ||
248 | chip_name = "polaris10_k"; | ||
249 | else | ||
250 | chip_name = "polaris10"; | ||
231 | break; | 251 | break; |
232 | case CHIP_POLARIS12: | 252 | case CHIP_POLARIS12: |
233 | chip_name = "polaris12"; | 253 | if (((adev->pdev->device == 0x6987) && |
254 | ((adev->pdev->revision == 0xc0) || | ||
255 | (adev->pdev->revision == 0xc3))) || | ||
256 | ((adev->pdev->device == 0x6981) && | ||
257 | ((adev->pdev->revision == 0x00) || | ||
258 | (adev->pdev->revision == 0x01) || | ||
259 | (adev->pdev->revision == 0x10)))) | ||
260 | chip_name = "polaris12_k"; | ||
261 | else | ||
262 | chip_name = "polaris12"; | ||
234 | break; | 263 | break; |
235 | case CHIP_FIJI: | 264 | case CHIP_FIJI: |
236 | case CHIP_CARRIZO: | 265 | case CHIP_CARRIZO: |
@@ -337,7 +366,7 @@ static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev) | |||
337 | const struct mc_firmware_header_v1_0 *hdr; | 366 | const struct mc_firmware_header_v1_0 *hdr; |
338 | const __le32 *fw_data = NULL; | 367 | const __le32 *fw_data = NULL; |
339 | const __le32 *io_mc_regs = NULL; | 368 | const __le32 *io_mc_regs = NULL; |
340 | u32 data, vbios_version; | 369 | u32 data; |
341 | int i, ucode_size, regs_size; | 370 | int i, ucode_size, regs_size; |
342 | 371 | ||
343 | /* Skip MC ucode loading on SR-IOV capable boards. | 372 | /* Skip MC ucode loading on SR-IOV capable boards. |
@@ -348,13 +377,6 @@ static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev) | |||
348 | if (amdgpu_sriov_bios(adev)) | 377 | if (amdgpu_sriov_bios(adev)) |
349 | return 0; | 378 | return 0; |
350 | 379 | ||
351 | WREG32(mmMC_SEQ_IO_DEBUG_INDEX, 0x9F); | ||
352 | data = RREG32(mmMC_SEQ_IO_DEBUG_DATA); | ||
353 | vbios_version = data & 0xf; | ||
354 | |||
355 | if (vbios_version == 0) | ||
356 | return 0; | ||
357 | |||
358 | if (!adev->gmc.fw) | 380 | if (!adev->gmc.fw) |
359 | return -EINVAL; | 381 | return -EINVAL; |
360 | 382 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index bf5e6a413dee..4cc0dcb1a187 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
@@ -65,6 +65,13 @@ | |||
65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba | 65 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL 0x01ba |
66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 | 66 | #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX 0 |
67 | 67 | ||
68 | /* for Vega20 register name change */ | ||
69 | #define mmHDP_MEM_POWER_CTRL 0x00d4 | ||
70 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK 0x00000001L | ||
71 | #define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK 0x00000002L | ||
72 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L | ||
73 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L | ||
74 | #define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 | ||
68 | /* | 75 | /* |
69 | * Indirect registers accessor | 76 | * Indirect registers accessor |
70 | */ | 77 | */ |
@@ -870,15 +877,33 @@ static void soc15_update_hdp_light_sleep(struct amdgpu_device *adev, bool enable | |||
870 | { | 877 | { |
871 | uint32_t def, data; | 878 | uint32_t def, data; |
872 | 879 | ||
873 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | 880 | if (adev->asic_type == CHIP_VEGA20) { |
881 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL)); | ||
874 | 882 | ||
875 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | 883 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) |
876 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 884 | data |= HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | |
877 | else | 885 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | |
878 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | 886 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | |
887 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK; | ||
888 | else | ||
889 | data &= ~(HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | | ||
890 | HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | | ||
891 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | | ||
892 | HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK); | ||
879 | 893 | ||
880 | if (def != data) | 894 | if (def != data) |
881 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | 895 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL), data); |
896 | } else { | ||
897 | def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); | ||
898 | |||
899 | if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) | ||
900 | data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
901 | else | ||
902 | data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; | ||
903 | |||
904 | if (def != data) | ||
905 | WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); | ||
906 | } | ||
882 | } | 907 | } |
883 | 908 | ||
884 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) | 909 | static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) |
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index eae90922fdbe..322e09b5b448 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |||
@@ -48,6 +48,7 @@ static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev); | |||
48 | static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev); | 48 | static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev); |
49 | static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev); | 49 | static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev); |
50 | static void vcn_v1_0_jpeg_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr); | 50 | static void vcn_v1_0_jpeg_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr); |
51 | static int vcn_v1_0_set_powergating_state(void *handle, enum amd_powergating_state state); | ||
51 | 52 | ||
52 | /** | 53 | /** |
53 | * vcn_v1_0_early_init - set function pointers | 54 | * vcn_v1_0_early_init - set function pointers |
@@ -222,7 +223,7 @@ static int vcn_v1_0_hw_fini(void *handle) | |||
222 | struct amdgpu_ring *ring = &adev->vcn.ring_dec; | 223 | struct amdgpu_ring *ring = &adev->vcn.ring_dec; |
223 | 224 | ||
224 | if (RREG32_SOC15(VCN, 0, mmUVD_STATUS)) | 225 | if (RREG32_SOC15(VCN, 0, mmUVD_STATUS)) |
225 | vcn_v1_0_stop(adev); | 226 | vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); |
226 | 227 | ||
227 | ring->ready = false; | 228 | ring->ready = false; |
228 | 229 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index a9f18ea7e354..e4ded890b1cb 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c | |||
@@ -337,12 +337,19 @@ static const struct kfd_deviceid supported_devices[] = { | |||
337 | { 0x6864, &vega10_device_info }, /* Vega10 */ | 337 | { 0x6864, &vega10_device_info }, /* Vega10 */ |
338 | { 0x6867, &vega10_device_info }, /* Vega10 */ | 338 | { 0x6867, &vega10_device_info }, /* Vega10 */ |
339 | { 0x6868, &vega10_device_info }, /* Vega10 */ | 339 | { 0x6868, &vega10_device_info }, /* Vega10 */ |
340 | { 0x6869, &vega10_device_info }, /* Vega10 */ | ||
341 | { 0x686A, &vega10_device_info }, /* Vega10 */ | ||
342 | { 0x686B, &vega10_device_info }, /* Vega10 */ | ||
340 | { 0x686C, &vega10_vf_device_info }, /* Vega10 vf*/ | 343 | { 0x686C, &vega10_vf_device_info }, /* Vega10 vf*/ |
344 | { 0x686D, &vega10_device_info }, /* Vega10 */ | ||
345 | { 0x686E, &vega10_device_info }, /* Vega10 */ | ||
346 | { 0x686F, &vega10_device_info }, /* Vega10 */ | ||
341 | { 0x687F, &vega10_device_info }, /* Vega10 */ | 347 | { 0x687F, &vega10_device_info }, /* Vega10 */ |
342 | { 0x66a0, &vega20_device_info }, /* Vega20 */ | 348 | { 0x66a0, &vega20_device_info }, /* Vega20 */ |
343 | { 0x66a1, &vega20_device_info }, /* Vega20 */ | 349 | { 0x66a1, &vega20_device_info }, /* Vega20 */ |
344 | { 0x66a2, &vega20_device_info }, /* Vega20 */ | 350 | { 0x66a2, &vega20_device_info }, /* Vega20 */ |
345 | { 0x66a3, &vega20_device_info }, /* Vega20 */ | 351 | { 0x66a3, &vega20_device_info }, /* Vega20 */ |
352 | { 0x66a4, &vega20_device_info }, /* Vega20 */ | ||
346 | { 0x66a7, &vega20_device_info }, /* Vega20 */ | 353 | { 0x66a7, &vega20_device_info }, /* Vega20 */ |
347 | { 0x66af, &vega20_device_info } /* Vega20 */ | 354 | { 0x66af, &vega20_device_info } /* Vega20 */ |
348 | }; | 355 | }; |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index c1262f62cd9f..5a6edf65c9ea 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
@@ -2358,8 +2358,15 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode, | |||
2358 | static enum dc_color_depth | 2358 | static enum dc_color_depth |
2359 | convert_color_depth_from_display_info(const struct drm_connector *connector) | 2359 | convert_color_depth_from_display_info(const struct drm_connector *connector) |
2360 | { | 2360 | { |
2361 | struct dm_connector_state *dm_conn_state = | ||
2362 | to_dm_connector_state(connector->state); | ||
2361 | uint32_t bpc = connector->display_info.bpc; | 2363 | uint32_t bpc = connector->display_info.bpc; |
2362 | 2364 | ||
2365 | /* TODO: Remove this when there's support for max_bpc in drm */ | ||
2366 | if (dm_conn_state && bpc > dm_conn_state->max_bpc) | ||
2367 | /* Round down to nearest even number. */ | ||
2368 | bpc = dm_conn_state->max_bpc - (dm_conn_state->max_bpc & 1); | ||
2369 | |||
2363 | switch (bpc) { | 2370 | switch (bpc) { |
2364 | case 0: | 2371 | case 0: |
2365 | /* | 2372 | /* |
@@ -2547,9 +2554,9 @@ static void fill_audio_info(struct audio_info *audio_info, | |||
2547 | 2554 | ||
2548 | cea_revision = drm_connector->display_info.cea_rev; | 2555 | cea_revision = drm_connector->display_info.cea_rev; |
2549 | 2556 | ||
2550 | strncpy(audio_info->display_name, | 2557 | strscpy(audio_info->display_name, |
2551 | edid_caps->display_name, | 2558 | edid_caps->display_name, |
2552 | AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS - 1); | 2559 | AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS); |
2553 | 2560 | ||
2554 | if (cea_revision >= 3) { | 2561 | if (cea_revision >= 3) { |
2555 | audio_info->mode_count = edid_caps->audio_mode_count; | 2562 | audio_info->mode_count = edid_caps->audio_mode_count; |
@@ -2943,6 +2950,9 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector, | |||
2943 | } else if (property == adev->mode_info.underscan_property) { | 2950 | } else if (property == adev->mode_info.underscan_property) { |
2944 | dm_new_state->underscan_enable = val; | 2951 | dm_new_state->underscan_enable = val; |
2945 | ret = 0; | 2952 | ret = 0; |
2953 | } else if (property == adev->mode_info.max_bpc_property) { | ||
2954 | dm_new_state->max_bpc = val; | ||
2955 | ret = 0; | ||
2946 | } | 2956 | } |
2947 | 2957 | ||
2948 | return ret; | 2958 | return ret; |
@@ -2985,6 +2995,9 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, | |||
2985 | } else if (property == adev->mode_info.underscan_property) { | 2995 | } else if (property == adev->mode_info.underscan_property) { |
2986 | *val = dm_state->underscan_enable; | 2996 | *val = dm_state->underscan_enable; |
2987 | ret = 0; | 2997 | ret = 0; |
2998 | } else if (property == adev->mode_info.max_bpc_property) { | ||
2999 | *val = dm_state->max_bpc; | ||
3000 | ret = 0; | ||
2988 | } | 3001 | } |
2989 | return ret; | 3002 | return ret; |
2990 | } | 3003 | } |
@@ -3029,6 +3042,7 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector) | |||
3029 | state->underscan_enable = false; | 3042 | state->underscan_enable = false; |
3030 | state->underscan_hborder = 0; | 3043 | state->underscan_hborder = 0; |
3031 | state->underscan_vborder = 0; | 3044 | state->underscan_vborder = 0; |
3045 | state->max_bpc = 8; | ||
3032 | 3046 | ||
3033 | __drm_atomic_helper_connector_reset(connector, &state->base); | 3047 | __drm_atomic_helper_connector_reset(connector, &state->base); |
3034 | } | 3048 | } |
@@ -3050,6 +3064,7 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector) | |||
3050 | 3064 | ||
3051 | new_state->freesync_capable = state->freesync_capable; | 3065 | new_state->freesync_capable = state->freesync_capable; |
3052 | new_state->freesync_enable = state->freesync_enable; | 3066 | new_state->freesync_enable = state->freesync_enable; |
3067 | new_state->max_bpc = state->max_bpc; | ||
3053 | 3068 | ||
3054 | return &new_state->base; | 3069 | return &new_state->base; |
3055 | } | 3070 | } |
@@ -3637,7 +3652,7 @@ amdgpu_dm_create_common_mode(struct drm_encoder *encoder, | |||
3637 | mode->hdisplay = hdisplay; | 3652 | mode->hdisplay = hdisplay; |
3638 | mode->vdisplay = vdisplay; | 3653 | mode->vdisplay = vdisplay; |
3639 | mode->type &= ~DRM_MODE_TYPE_PREFERRED; | 3654 | mode->type &= ~DRM_MODE_TYPE_PREFERRED; |
3640 | strncpy(mode->name, name, DRM_DISPLAY_MODE_LEN); | 3655 | strscpy(mode->name, name, DRM_DISPLAY_MODE_LEN); |
3641 | 3656 | ||
3642 | return mode; | 3657 | return mode; |
3643 | 3658 | ||
@@ -3795,6 +3810,9 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, | |||
3795 | drm_object_attach_property(&aconnector->base.base, | 3810 | drm_object_attach_property(&aconnector->base.base, |
3796 | adev->mode_info.underscan_vborder_property, | 3811 | adev->mode_info.underscan_vborder_property, |
3797 | 0); | 3812 | 0); |
3813 | drm_object_attach_property(&aconnector->base.base, | ||
3814 | adev->mode_info.max_bpc_property, | ||
3815 | 0); | ||
3798 | 3816 | ||
3799 | } | 3817 | } |
3800 | 3818 | ||
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 924a38a1fc44..6e069d777ab2 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | |||
@@ -204,6 +204,7 @@ struct dm_connector_state { | |||
204 | enum amdgpu_rmx_type scaling; | 204 | enum amdgpu_rmx_type scaling; |
205 | uint8_t underscan_vborder; | 205 | uint8_t underscan_vborder; |
206 | uint8_t underscan_hborder; | 206 | uint8_t underscan_hborder; |
207 | uint8_t max_bpc; | ||
207 | bool underscan_enable; | 208 | bool underscan_enable; |
208 | bool freesync_enable; | 209 | bool freesync_enable; |
209 | bool freesync_capable; | 210 | bool freesync_capable; |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index d02c32a1039c..1b0d209d8367 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | |||
@@ -342,10 +342,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
342 | master->connector_id); | 342 | master->connector_id); |
343 | 343 | ||
344 | aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master); | 344 | aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master); |
345 | drm_connector_attach_encoder(&aconnector->base, | ||
346 | &aconnector->mst_encoder->base); | ||
345 | 347 | ||
346 | /* | ||
347 | * TODO: understand why this one is needed | ||
348 | */ | ||
349 | drm_object_attach_property( | 348 | drm_object_attach_property( |
350 | &connector->base, | 349 | &connector->base, |
351 | dev->mode_config.path_property, | 350 | dev->mode_config.path_property, |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index b459867a05b2..a6bcb90e8419 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | |||
@@ -2512,6 +2512,8 @@ static void pplib_apply_display_requirements( | |||
2512 | dc, | 2512 | dc, |
2513 | context->bw.dce.sclk_khz); | 2513 | context->bw.dce.sclk_khz); |
2514 | 2514 | ||
2515 | pp_display_cfg->min_dcfclock_khz = pp_display_cfg->min_engine_clock_khz; | ||
2516 | |||
2515 | pp_display_cfg->min_engine_clock_deep_sleep_khz | 2517 | pp_display_cfg->min_engine_clock_deep_sleep_khz |
2516 | = context->bw.dce.sclk_deep_sleep_khz; | 2518 | = context->bw.dce.sclk_deep_sleep_khz; |
2517 | 2519 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c index 85119c2bdcc8..a2a7e0e94aa6 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c | |||
@@ -80,7 +80,9 @@ int phm_enable_dynamic_state_management(struct pp_hwmgr *hwmgr) | |||
80 | PHM_FUNC_CHECK(hwmgr); | 80 | PHM_FUNC_CHECK(hwmgr); |
81 | adev = hwmgr->adev; | 81 | adev = hwmgr->adev; |
82 | 82 | ||
83 | if (smum_is_dpm_running(hwmgr) && !amdgpu_passthrough(adev)) { | 83 | /* Skip for suspend/resume case */ |
84 | if (smum_is_dpm_running(hwmgr) && !amdgpu_passthrough(adev) | ||
85 | && adev->in_suspend) { | ||
84 | pr_info("dpm has been enabled\n"); | 86 | pr_info("dpm has been enabled\n"); |
85 | return 0; | 87 | return 0; |
86 | } | 88 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c index 47ac92369739..0173d0480024 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | |||
@@ -352,6 +352,9 @@ int hwmgr_handle_task(struct pp_hwmgr *hwmgr, enum amd_pp_task task_id, | |||
352 | 352 | ||
353 | switch (task_id) { | 353 | switch (task_id) { |
354 | case AMD_PP_TASK_DISPLAY_CONFIG_CHANGE: | 354 | case AMD_PP_TASK_DISPLAY_CONFIG_CHANGE: |
355 | ret = phm_pre_display_configuration_changed(hwmgr); | ||
356 | if (ret) | ||
357 | return ret; | ||
355 | ret = phm_set_cpu_power_state(hwmgr); | 358 | ret = phm_set_cpu_power_state(hwmgr); |
356 | if (ret) | 359 | if (ret) |
357 | return ret; | 360 | return ret; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c index 91ffb7bc4ee7..56437866d120 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c | |||
@@ -265,8 +265,6 @@ int psm_adjust_power_state_dynamic(struct pp_hwmgr *hwmgr, bool skip, | |||
265 | if (skip) | 265 | if (skip) |
266 | return 0; | 266 | return 0; |
267 | 267 | ||
268 | phm_pre_display_configuration_changed(hwmgr); | ||
269 | |||
270 | phm_display_configuration_changed(hwmgr); | 268 | phm_display_configuration_changed(hwmgr); |
271 | 269 | ||
272 | if (hwmgr->ps) | 270 | if (hwmgr->ps) |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index ed35ec0341e6..b61a01f55284 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -3589,8 +3589,10 @@ static int smu7_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, cons | |||
3589 | } | 3589 | } |
3590 | 3590 | ||
3591 | if (i >= sclk_table->count) { | 3591 | if (i >= sclk_table->count) { |
3592 | data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK; | 3592 | if (sclk > sclk_table->dpm_levels[i-1].value) { |
3593 | sclk_table->dpm_levels[i-1].value = sclk; | 3593 | data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK; |
3594 | sclk_table->dpm_levels[i-1].value = sclk; | ||
3595 | } | ||
3594 | } else { | 3596 | } else { |
3595 | /* TODO: Check SCLK in DAL's minimum clocks | 3597 | /* TODO: Check SCLK in DAL's minimum clocks |
3596 | * in case DeepSleep divider update is required. | 3598 | * in case DeepSleep divider update is required. |
@@ -3607,8 +3609,10 @@ static int smu7_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, cons | |||
3607 | } | 3609 | } |
3608 | 3610 | ||
3609 | if (i >= mclk_table->count) { | 3611 | if (i >= mclk_table->count) { |
3610 | data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK; | 3612 | if (mclk > mclk_table->dpm_levels[i-1].value) { |
3611 | mclk_table->dpm_levels[i-1].value = mclk; | 3613 | data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK; |
3614 | mclk_table->dpm_levels[i-1].value = mclk; | ||
3615 | } | ||
3612 | } | 3616 | } |
3613 | 3617 | ||
3614 | if (data->display_timing.num_existing_displays != hwmgr->display_config->num_display) | 3618 | if (data->display_timing.num_existing_displays != hwmgr->display_config->num_display) |
@@ -4525,12 +4529,12 @@ static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
4525 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); | 4529 | struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); |
4526 | struct smu7_single_dpm_table *golden_sclk_table = | 4530 | struct smu7_single_dpm_table *golden_sclk_table = |
4527 | &(data->golden_dpm_table.sclk_table); | 4531 | &(data->golden_dpm_table.sclk_table); |
4528 | int value; | 4532 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
4533 | int golden_value = golden_sclk_table->dpm_levels | ||
4534 | [golden_sclk_table->count - 1].value; | ||
4529 | 4535 | ||
4530 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 4536 | value -= golden_value; |
4531 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 4537 | value = DIV_ROUND_UP(value * 100, golden_value); |
4532 | 100 / | ||
4533 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
4534 | 4538 | ||
4535 | return value; | 4539 | return value; |
4536 | } | 4540 | } |
@@ -4567,12 +4571,12 @@ static int smu7_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
4567 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); | 4571 | struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); |
4568 | struct smu7_single_dpm_table *golden_mclk_table = | 4572 | struct smu7_single_dpm_table *golden_mclk_table = |
4569 | &(data->golden_dpm_table.mclk_table); | 4573 | &(data->golden_dpm_table.mclk_table); |
4570 | int value; | 4574 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
4575 | int golden_value = golden_mclk_table->dpm_levels | ||
4576 | [golden_mclk_table->count - 1].value; | ||
4571 | 4577 | ||
4572 | value = (mclk_table->dpm_levels[mclk_table->count - 1].value - | 4578 | value -= golden_value; |
4573 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * | 4579 | value = DIV_ROUND_UP(value * 100, golden_value); |
4574 | 100 / | ||
4575 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value; | ||
4576 | 4580 | ||
4577 | return value; | 4581 | return value; |
4578 | } | 4582 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 8c4db86bb4b7..79c86247d0ac 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | |||
@@ -3266,8 +3266,10 @@ static int vega10_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, co | |||
3266 | } | 3266 | } |
3267 | 3267 | ||
3268 | if (i >= sclk_table->count) { | 3268 | if (i >= sclk_table->count) { |
3269 | data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_SCLK; | 3269 | if (sclk > sclk_table->dpm_levels[i-1].value) { |
3270 | sclk_table->dpm_levels[i-1].value = sclk; | 3270 | data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_SCLK; |
3271 | sclk_table->dpm_levels[i-1].value = sclk; | ||
3272 | } | ||
3271 | } | 3273 | } |
3272 | 3274 | ||
3273 | for (i = 0; i < mclk_table->count; i++) { | 3275 | for (i = 0; i < mclk_table->count; i++) { |
@@ -3276,8 +3278,10 @@ static int vega10_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, co | |||
3276 | } | 3278 | } |
3277 | 3279 | ||
3278 | if (i >= mclk_table->count) { | 3280 | if (i >= mclk_table->count) { |
3279 | data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_MCLK; | 3281 | if (mclk > mclk_table->dpm_levels[i-1].value) { |
3280 | mclk_table->dpm_levels[i-1].value = mclk; | 3282 | data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_MCLK; |
3283 | mclk_table->dpm_levels[i-1].value = mclk; | ||
3284 | } | ||
3281 | } | 3285 | } |
3282 | 3286 | ||
3283 | if (data->display_timing.num_existing_displays != hwmgr->display_config->num_display) | 3287 | if (data->display_timing.num_existing_displays != hwmgr->display_config->num_display) |
@@ -4522,15 +4526,13 @@ static int vega10_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
4522 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 4526 | struct vega10_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
4523 | struct vega10_single_dpm_table *golden_sclk_table = | 4527 | struct vega10_single_dpm_table *golden_sclk_table = |
4524 | &(data->golden_dpm_table.gfx_table); | 4528 | &(data->golden_dpm_table.gfx_table); |
4525 | int value; | 4529 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
4526 | 4530 | int golden_value = golden_sclk_table->dpm_levels | |
4527 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | ||
4528 | golden_sclk_table->dpm_levels | ||
4529 | [golden_sclk_table->count - 1].value) * | ||
4530 | 100 / | ||
4531 | golden_sclk_table->dpm_levels | ||
4532 | [golden_sclk_table->count - 1].value; | 4531 | [golden_sclk_table->count - 1].value; |
4533 | 4532 | ||
4533 | value -= golden_value; | ||
4534 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
4535 | |||
4534 | return value; | 4536 | return value; |
4535 | } | 4537 | } |
4536 | 4538 | ||
@@ -4575,16 +4577,13 @@ static int vega10_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
4575 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 4577 | struct vega10_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
4576 | struct vega10_single_dpm_table *golden_mclk_table = | 4578 | struct vega10_single_dpm_table *golden_mclk_table = |
4577 | &(data->golden_dpm_table.mem_table); | 4579 | &(data->golden_dpm_table.mem_table); |
4578 | int value; | 4580 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
4579 | 4581 | int golden_value = golden_mclk_table->dpm_levels | |
4580 | value = (mclk_table->dpm_levels | ||
4581 | [mclk_table->count - 1].value - | ||
4582 | golden_mclk_table->dpm_levels | ||
4583 | [golden_mclk_table->count - 1].value) * | ||
4584 | 100 / | ||
4585 | golden_mclk_table->dpm_levels | ||
4586 | [golden_mclk_table->count - 1].value; | 4582 | [golden_mclk_table->count - 1].value; |
4587 | 4583 | ||
4584 | value -= golden_value; | ||
4585 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
4586 | |||
4588 | return value; | 4587 | return value; |
4589 | } | 4588 | } |
4590 | 4589 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c index 74bc37308dc0..54364444ecd1 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | |||
@@ -2243,12 +2243,12 @@ static int vega12_get_sclk_od(struct pp_hwmgr *hwmgr) | |||
2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); | 2243 | struct vega12_single_dpm_table *sclk_table = &(data->dpm_table.gfx_table); |
2244 | struct vega12_single_dpm_table *golden_sclk_table = | 2244 | struct vega12_single_dpm_table *golden_sclk_table = |
2245 | &(data->golden_dpm_table.gfx_table); | 2245 | &(data->golden_dpm_table.gfx_table); |
2246 | int value; | 2246 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
2247 | int golden_value = golden_sclk_table->dpm_levels | ||
2248 | [golden_sclk_table->count - 1].value; | ||
2247 | 2249 | ||
2248 | value = (sclk_table->dpm_levels[sclk_table->count - 1].value - | 2250 | value -= golden_value; |
2249 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * | 2251 | value = DIV_ROUND_UP(value * 100, golden_value); |
2250 | 100 / | ||
2251 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value; | ||
2252 | 2252 | ||
2253 | return value; | 2253 | return value; |
2254 | } | 2254 | } |
@@ -2264,16 +2264,13 @@ static int vega12_get_mclk_od(struct pp_hwmgr *hwmgr) | |||
2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); | 2264 | struct vega12_single_dpm_table *mclk_table = &(data->dpm_table.mem_table); |
2265 | struct vega12_single_dpm_table *golden_mclk_table = | 2265 | struct vega12_single_dpm_table *golden_mclk_table = |
2266 | &(data->golden_dpm_table.mem_table); | 2266 | &(data->golden_dpm_table.mem_table); |
2267 | int value; | 2267 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
2268 | 2268 | int golden_value = golden_mclk_table->dpm_levels | |
2269 | value = (mclk_table->dpm_levels | ||
2270 | [mclk_table->count - 1].value - | ||
2271 | golden_mclk_table->dpm_levels | ||
2272 | [golden_mclk_table->count - 1].value) * | ||
2273 | 100 / | ||
2274 | golden_mclk_table->dpm_levels | ||
2275 | [golden_mclk_table->count - 1].value; | 2269 | [golden_mclk_table->count - 1].value; |
2276 | 2270 | ||
2271 | value -= golden_value; | ||
2272 | value = DIV_ROUND_UP(value * 100, golden_value); | ||
2273 | |||
2277 | return value; | 2274 | return value; |
2278 | } | 2275 | } |
2279 | 2276 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 99861f32b1f9..3b7fce5d7258 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -75,7 +75,17 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 75 | data->phy_clk_quad_eqn_b = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; | 76 | data->phy_clk_quad_eqn_c = PPREGKEY_VEGA20QUADRATICEQUATION_DFLT; |
77 | 77 | ||
78 | data->registry_data.disallowed_features = 0x0; | 78 | /* |
79 | * Disable the following features for now: | ||
80 | * GFXCLK DS | ||
81 | * SOCLK DS | ||
82 | * LCLK DS | ||
83 | * DCEFCLK DS | ||
84 | * FCLK DS | ||
85 | * MP1CLK DS | ||
86 | * MP0CLK DS | ||
87 | */ | ||
88 | data->registry_data.disallowed_features = 0xE0041C00; | ||
79 | data->registry_data.od_state_in_dc_support = 0; | 89 | data->registry_data.od_state_in_dc_support = 0; |
80 | data->registry_data.thermal_support = 1; | 90 | data->registry_data.thermal_support = 1; |
81 | data->registry_data.skip_baco_hardware = 0; | 91 | data->registry_data.skip_baco_hardware = 0; |
@@ -120,7 +130,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr) | |||
120 | data->registry_data.disable_auto_wattman = 1; | 130 | data->registry_data.disable_auto_wattman = 1; |
121 | data->registry_data.auto_wattman_debug = 0; | 131 | data->registry_data.auto_wattman_debug = 0; |
122 | data->registry_data.auto_wattman_sample_period = 100; | 132 | data->registry_data.auto_wattman_sample_period = 100; |
123 | data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD; | 133 | data->registry_data.fclk_gfxclk_ratio = 0; |
124 | data->registry_data.auto_wattman_threshold = 50; | 134 | data->registry_data.auto_wattman_threshold = 50; |
125 | data->registry_data.gfxoff_controlled_by_driver = 1; | 135 | data->registry_data.gfxoff_controlled_by_driver = 1; |
126 | data->gfxoff_allowed = false; | 136 | data->gfxoff_allowed = false; |
@@ -1313,12 +1323,13 @@ static int vega20_get_sclk_od( | |||
1313 | &(data->dpm_table.gfx_table); | 1323 | &(data->dpm_table.gfx_table); |
1314 | struct vega20_single_dpm_table *golden_sclk_table = | 1324 | struct vega20_single_dpm_table *golden_sclk_table = |
1315 | &(data->golden_dpm_table.gfx_table); | 1325 | &(data->golden_dpm_table.gfx_table); |
1316 | int value; | 1326 | int value = sclk_table->dpm_levels[sclk_table->count - 1].value; |
1327 | int golden_value = golden_sclk_table->dpm_levels | ||
1328 | [golden_sclk_table->count - 1].value; | ||
1317 | 1329 | ||
1318 | /* od percentage */ | 1330 | /* od percentage */ |
1319 | value = DIV_ROUND_UP((sclk_table->dpm_levels[sclk_table->count - 1].value - | 1331 | value -= golden_value; |
1320 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value) * 100, | 1332 | value = DIV_ROUND_UP(value * 100, golden_value); |
1321 | golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value); | ||
1322 | 1333 | ||
1323 | return value; | 1334 | return value; |
1324 | } | 1335 | } |
@@ -1358,12 +1369,13 @@ static int vega20_get_mclk_od( | |||
1358 | &(data->dpm_table.mem_table); | 1369 | &(data->dpm_table.mem_table); |
1359 | struct vega20_single_dpm_table *golden_mclk_table = | 1370 | struct vega20_single_dpm_table *golden_mclk_table = |
1360 | &(data->golden_dpm_table.mem_table); | 1371 | &(data->golden_dpm_table.mem_table); |
1361 | int value; | 1372 | int value = mclk_table->dpm_levels[mclk_table->count - 1].value; |
1373 | int golden_value = golden_mclk_table->dpm_levels | ||
1374 | [golden_mclk_table->count - 1].value; | ||
1362 | 1375 | ||
1363 | /* od percentage */ | 1376 | /* od percentage */ |
1364 | value = DIV_ROUND_UP((mclk_table->dpm_levels[mclk_table->count - 1].value - | 1377 | value -= golden_value; |
1365 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value) * 100, | 1378 | value = DIV_ROUND_UP(value * 100, golden_value); |
1366 | golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value); | ||
1367 | 1379 | ||
1368 | return value; | 1380 | return value; |
1369 | } | 1381 | } |
@@ -1648,14 +1660,15 @@ static uint32_t vega20_find_highest_dpm_level( | |||
1648 | return i; | 1660 | return i; |
1649 | } | 1661 | } |
1650 | 1662 | ||
1651 | static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | 1663 | static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr, uint32_t feature_mask) |
1652 | { | 1664 | { |
1653 | struct vega20_hwmgr *data = | 1665 | struct vega20_hwmgr *data = |
1654 | (struct vega20_hwmgr *)(hwmgr->backend); | 1666 | (struct vega20_hwmgr *)(hwmgr->backend); |
1655 | uint32_t min_freq; | 1667 | uint32_t min_freq; |
1656 | int ret = 0; | 1668 | int ret = 0; |
1657 | 1669 | ||
1658 | if (data->smu_features[GNLD_DPM_GFXCLK].enabled) { | 1670 | if (data->smu_features[GNLD_DPM_GFXCLK].enabled && |
1671 | (feature_mask & FEATURE_DPM_GFXCLK_MASK)) { | ||
1659 | min_freq = data->dpm_table.gfx_table.dpm_state.soft_min_level; | 1672 | min_freq = data->dpm_table.gfx_table.dpm_state.soft_min_level; |
1660 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1673 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
1661 | hwmgr, PPSMC_MSG_SetSoftMinByFreq, | 1674 | hwmgr, PPSMC_MSG_SetSoftMinByFreq, |
@@ -1664,7 +1677,8 @@ static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | |||
1664 | return ret); | 1677 | return ret); |
1665 | } | 1678 | } |
1666 | 1679 | ||
1667 | if (data->smu_features[GNLD_DPM_UCLK].enabled) { | 1680 | if (data->smu_features[GNLD_DPM_UCLK].enabled && |
1681 | (feature_mask & FEATURE_DPM_UCLK_MASK)) { | ||
1668 | min_freq = data->dpm_table.mem_table.dpm_state.soft_min_level; | 1682 | min_freq = data->dpm_table.mem_table.dpm_state.soft_min_level; |
1669 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1683 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
1670 | hwmgr, PPSMC_MSG_SetSoftMinByFreq, | 1684 | hwmgr, PPSMC_MSG_SetSoftMinByFreq, |
@@ -1680,7 +1694,8 @@ static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | |||
1680 | return ret); | 1694 | return ret); |
1681 | } | 1695 | } |
1682 | 1696 | ||
1683 | if (data->smu_features[GNLD_DPM_UVD].enabled) { | 1697 | if (data->smu_features[GNLD_DPM_UVD].enabled && |
1698 | (feature_mask & FEATURE_DPM_UVD_MASK)) { | ||
1684 | min_freq = data->dpm_table.vclk_table.dpm_state.soft_min_level; | 1699 | min_freq = data->dpm_table.vclk_table.dpm_state.soft_min_level; |
1685 | 1700 | ||
1686 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1701 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1698,7 +1713,8 @@ static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | |||
1698 | return ret); | 1713 | return ret); |
1699 | } | 1714 | } |
1700 | 1715 | ||
1701 | if (data->smu_features[GNLD_DPM_VCE].enabled) { | 1716 | if (data->smu_features[GNLD_DPM_VCE].enabled && |
1717 | (feature_mask & FEATURE_DPM_VCE_MASK)) { | ||
1702 | min_freq = data->dpm_table.eclk_table.dpm_state.soft_min_level; | 1718 | min_freq = data->dpm_table.eclk_table.dpm_state.soft_min_level; |
1703 | 1719 | ||
1704 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1720 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1708,7 +1724,8 @@ static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | |||
1708 | return ret); | 1724 | return ret); |
1709 | } | 1725 | } |
1710 | 1726 | ||
1711 | if (data->smu_features[GNLD_DPM_SOCCLK].enabled) { | 1727 | if (data->smu_features[GNLD_DPM_SOCCLK].enabled && |
1728 | (feature_mask & FEATURE_DPM_SOCCLK_MASK)) { | ||
1712 | min_freq = data->dpm_table.soc_table.dpm_state.soft_min_level; | 1729 | min_freq = data->dpm_table.soc_table.dpm_state.soft_min_level; |
1713 | 1730 | ||
1714 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1731 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1721,14 +1738,15 @@ static int vega20_upload_dpm_min_level(struct pp_hwmgr *hwmgr) | |||
1721 | return ret; | 1738 | return ret; |
1722 | } | 1739 | } |
1723 | 1740 | ||
1724 | static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr) | 1741 | static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr, uint32_t feature_mask) |
1725 | { | 1742 | { |
1726 | struct vega20_hwmgr *data = | 1743 | struct vega20_hwmgr *data = |
1727 | (struct vega20_hwmgr *)(hwmgr->backend); | 1744 | (struct vega20_hwmgr *)(hwmgr->backend); |
1728 | uint32_t max_freq; | 1745 | uint32_t max_freq; |
1729 | int ret = 0; | 1746 | int ret = 0; |
1730 | 1747 | ||
1731 | if (data->smu_features[GNLD_DPM_GFXCLK].enabled) { | 1748 | if (data->smu_features[GNLD_DPM_GFXCLK].enabled && |
1749 | (feature_mask & FEATURE_DPM_GFXCLK_MASK)) { | ||
1732 | max_freq = data->dpm_table.gfx_table.dpm_state.soft_max_level; | 1750 | max_freq = data->dpm_table.gfx_table.dpm_state.soft_max_level; |
1733 | 1751 | ||
1734 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1752 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1738,7 +1756,8 @@ static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr) | |||
1738 | return ret); | 1756 | return ret); |
1739 | } | 1757 | } |
1740 | 1758 | ||
1741 | if (data->smu_features[GNLD_DPM_UCLK].enabled) { | 1759 | if (data->smu_features[GNLD_DPM_UCLK].enabled && |
1760 | (feature_mask & FEATURE_DPM_UCLK_MASK)) { | ||
1742 | max_freq = data->dpm_table.mem_table.dpm_state.soft_max_level; | 1761 | max_freq = data->dpm_table.mem_table.dpm_state.soft_max_level; |
1743 | 1762 | ||
1744 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1763 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1748,7 +1767,8 @@ static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr) | |||
1748 | return ret); | 1767 | return ret); |
1749 | } | 1768 | } |
1750 | 1769 | ||
1751 | if (data->smu_features[GNLD_DPM_UVD].enabled) { | 1770 | if (data->smu_features[GNLD_DPM_UVD].enabled && |
1771 | (feature_mask & FEATURE_DPM_UVD_MASK)) { | ||
1752 | max_freq = data->dpm_table.vclk_table.dpm_state.soft_max_level; | 1772 | max_freq = data->dpm_table.vclk_table.dpm_state.soft_max_level; |
1753 | 1773 | ||
1754 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1774 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1765,7 +1785,8 @@ static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr) | |||
1765 | return ret); | 1785 | return ret); |
1766 | } | 1786 | } |
1767 | 1787 | ||
1768 | if (data->smu_features[GNLD_DPM_VCE].enabled) { | 1788 | if (data->smu_features[GNLD_DPM_VCE].enabled && |
1789 | (feature_mask & FEATURE_DPM_VCE_MASK)) { | ||
1769 | max_freq = data->dpm_table.eclk_table.dpm_state.soft_max_level; | 1790 | max_freq = data->dpm_table.eclk_table.dpm_state.soft_max_level; |
1770 | 1791 | ||
1771 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1792 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -1775,7 +1796,8 @@ static int vega20_upload_dpm_max_level(struct pp_hwmgr *hwmgr) | |||
1775 | return ret); | 1796 | return ret); |
1776 | } | 1797 | } |
1777 | 1798 | ||
1778 | if (data->smu_features[GNLD_DPM_SOCCLK].enabled) { | 1799 | if (data->smu_features[GNLD_DPM_SOCCLK].enabled && |
1800 | (feature_mask & FEATURE_DPM_SOCCLK_MASK)) { | ||
1779 | max_freq = data->dpm_table.soc_table.dpm_state.soft_max_level; | 1801 | max_freq = data->dpm_table.soc_table.dpm_state.soft_max_level; |
1780 | 1802 | ||
1781 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( | 1803 | PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( |
@@ -2114,12 +2136,12 @@ static int vega20_force_dpm_highest(struct pp_hwmgr *hwmgr) | |||
2114 | data->dpm_table.mem_table.dpm_state.soft_max_level = | 2136 | data->dpm_table.mem_table.dpm_state.soft_max_level = |
2115 | data->dpm_table.mem_table.dpm_levels[soft_level].value; | 2137 | data->dpm_table.mem_table.dpm_levels[soft_level].value; |
2116 | 2138 | ||
2117 | ret = vega20_upload_dpm_min_level(hwmgr); | 2139 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2118 | PP_ASSERT_WITH_CODE(!ret, | 2140 | PP_ASSERT_WITH_CODE(!ret, |
2119 | "Failed to upload boot level to highest!", | 2141 | "Failed to upload boot level to highest!", |
2120 | return ret); | 2142 | return ret); |
2121 | 2143 | ||
2122 | ret = vega20_upload_dpm_max_level(hwmgr); | 2144 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); |
2123 | PP_ASSERT_WITH_CODE(!ret, | 2145 | PP_ASSERT_WITH_CODE(!ret, |
2124 | "Failed to upload dpm max level to highest!", | 2146 | "Failed to upload dpm max level to highest!", |
2125 | return ret); | 2147 | return ret); |
@@ -2146,12 +2168,12 @@ static int vega20_force_dpm_lowest(struct pp_hwmgr *hwmgr) | |||
2146 | data->dpm_table.mem_table.dpm_state.soft_max_level = | 2168 | data->dpm_table.mem_table.dpm_state.soft_max_level = |
2147 | data->dpm_table.mem_table.dpm_levels[soft_level].value; | 2169 | data->dpm_table.mem_table.dpm_levels[soft_level].value; |
2148 | 2170 | ||
2149 | ret = vega20_upload_dpm_min_level(hwmgr); | 2171 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2150 | PP_ASSERT_WITH_CODE(!ret, | 2172 | PP_ASSERT_WITH_CODE(!ret, |
2151 | "Failed to upload boot level to highest!", | 2173 | "Failed to upload boot level to highest!", |
2152 | return ret); | 2174 | return ret); |
2153 | 2175 | ||
2154 | ret = vega20_upload_dpm_max_level(hwmgr); | 2176 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); |
2155 | PP_ASSERT_WITH_CODE(!ret, | 2177 | PP_ASSERT_WITH_CODE(!ret, |
2156 | "Failed to upload dpm max level to highest!", | 2178 | "Failed to upload dpm max level to highest!", |
2157 | return ret); | 2179 | return ret); |
@@ -2164,12 +2186,12 @@ static int vega20_unforce_dpm_levels(struct pp_hwmgr *hwmgr) | |||
2164 | { | 2186 | { |
2165 | int ret = 0; | 2187 | int ret = 0; |
2166 | 2188 | ||
2167 | ret = vega20_upload_dpm_min_level(hwmgr); | 2189 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2168 | PP_ASSERT_WITH_CODE(!ret, | 2190 | PP_ASSERT_WITH_CODE(!ret, |
2169 | "Failed to upload DPM Bootup Levels!", | 2191 | "Failed to upload DPM Bootup Levels!", |
2170 | return ret); | 2192 | return ret); |
2171 | 2193 | ||
2172 | ret = vega20_upload_dpm_max_level(hwmgr); | 2194 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); |
2173 | PP_ASSERT_WITH_CODE(!ret, | 2195 | PP_ASSERT_WITH_CODE(!ret, |
2174 | "Failed to upload DPM Max Levels!", | 2196 | "Failed to upload DPM Max Levels!", |
2175 | return ret); | 2197 | return ret); |
@@ -2227,12 +2249,12 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, | |||
2227 | data->dpm_table.gfx_table.dpm_state.soft_max_level = | 2249 | data->dpm_table.gfx_table.dpm_state.soft_max_level = |
2228 | data->dpm_table.gfx_table.dpm_levels[soft_max_level].value; | 2250 | data->dpm_table.gfx_table.dpm_levels[soft_max_level].value; |
2229 | 2251 | ||
2230 | ret = vega20_upload_dpm_min_level(hwmgr); | 2252 | ret = vega20_upload_dpm_min_level(hwmgr, FEATURE_DPM_GFXCLK_MASK); |
2231 | PP_ASSERT_WITH_CODE(!ret, | 2253 | PP_ASSERT_WITH_CODE(!ret, |
2232 | "Failed to upload boot level to lowest!", | 2254 | "Failed to upload boot level to lowest!", |
2233 | return ret); | 2255 | return ret); |
2234 | 2256 | ||
2235 | ret = vega20_upload_dpm_max_level(hwmgr); | 2257 | ret = vega20_upload_dpm_max_level(hwmgr, FEATURE_DPM_GFXCLK_MASK); |
2236 | PP_ASSERT_WITH_CODE(!ret, | 2258 | PP_ASSERT_WITH_CODE(!ret, |
2237 | "Failed to upload dpm max level to highest!", | 2259 | "Failed to upload dpm max level to highest!", |
2238 | return ret); | 2260 | return ret); |
@@ -2247,12 +2269,12 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, | |||
2247 | data->dpm_table.mem_table.dpm_state.soft_max_level = | 2269 | data->dpm_table.mem_table.dpm_state.soft_max_level = |
2248 | data->dpm_table.mem_table.dpm_levels[soft_max_level].value; | 2270 | data->dpm_table.mem_table.dpm_levels[soft_max_level].value; |
2249 | 2271 | ||
2250 | ret = vega20_upload_dpm_min_level(hwmgr); | 2272 | ret = vega20_upload_dpm_min_level(hwmgr, FEATURE_DPM_UCLK_MASK); |
2251 | PP_ASSERT_WITH_CODE(!ret, | 2273 | PP_ASSERT_WITH_CODE(!ret, |
2252 | "Failed to upload boot level to lowest!", | 2274 | "Failed to upload boot level to lowest!", |
2253 | return ret); | 2275 | return ret); |
2254 | 2276 | ||
2255 | ret = vega20_upload_dpm_max_level(hwmgr); | 2277 | ret = vega20_upload_dpm_max_level(hwmgr, FEATURE_DPM_UCLK_MASK); |
2256 | PP_ASSERT_WITH_CODE(!ret, | 2278 | PP_ASSERT_WITH_CODE(!ret, |
2257 | "Failed to upload dpm max level to highest!", | 2279 | "Failed to upload dpm max level to highest!", |
2258 | return ret); | 2280 | return ret); |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu7_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/smu7_ppsmc.h index 62f36ba2435b..c1a99dfe4913 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/smu7_ppsmc.h +++ b/drivers/gpu/drm/amd/powerplay/inc/smu7_ppsmc.h | |||
@@ -386,6 +386,8 @@ typedef uint16_t PPSMC_Result; | |||
386 | #define PPSMC_MSG_AgmResetPsm ((uint16_t) 0x403) | 386 | #define PPSMC_MSG_AgmResetPsm ((uint16_t) 0x403) |
387 | #define PPSMC_MSG_ReadVftCell ((uint16_t) 0x404) | 387 | #define PPSMC_MSG_ReadVftCell ((uint16_t) 0x404) |
388 | 388 | ||
389 | #define PPSMC_MSG_ApplyAvfsCksOffVoltage ((uint16_t) 0x415) | ||
390 | |||
389 | #define PPSMC_MSG_GFX_CU_PG_ENABLE ((uint16_t) 0x280) | 391 | #define PPSMC_MSG_GFX_CU_PG_ENABLE ((uint16_t) 0x280) |
390 | #define PPSMC_MSG_GFX_CU_PG_DISABLE ((uint16_t) 0x281) | 392 | #define PPSMC_MSG_GFX_CU_PG_DISABLE ((uint16_t) 0x281) |
391 | #define PPSMC_MSG_GetCurrPkgPwr ((uint16_t) 0x282) | 393 | #define PPSMC_MSG_GetCurrPkgPwr ((uint16_t) 0x282) |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c index 872d3824337b..a1e0ac9ae248 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c | |||
@@ -1985,6 +1985,12 @@ int polaris10_thermal_avfs_enable(struct pp_hwmgr *hwmgr) | |||
1985 | 1985 | ||
1986 | smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs); | 1986 | smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs); |
1987 | 1987 | ||
1988 | /* Apply avfs cks-off voltages to avoid the overshoot | ||
1989 | * when switching to the highest sclk frequency | ||
1990 | */ | ||
1991 | if (data->apply_avfs_cks_off_voltage) | ||
1992 | smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ApplyAvfsCksOffVoltage); | ||
1993 | |||
1988 | return 0; | 1994 | return 0; |
1989 | } | 1995 | } |
1990 | 1996 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c index 99d5e4f98f49..a6edd5df33b0 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c | |||
@@ -37,10 +37,13 @@ MODULE_FIRMWARE("amdgpu/fiji_smc.bin"); | |||
37 | MODULE_FIRMWARE("amdgpu/polaris10_smc.bin"); | 37 | MODULE_FIRMWARE("amdgpu/polaris10_smc.bin"); |
38 | MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin"); | 38 | MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin"); |
39 | MODULE_FIRMWARE("amdgpu/polaris10_k_smc.bin"); | 39 | MODULE_FIRMWARE("amdgpu/polaris10_k_smc.bin"); |
40 | MODULE_FIRMWARE("amdgpu/polaris10_k2_smc.bin"); | ||
40 | MODULE_FIRMWARE("amdgpu/polaris11_smc.bin"); | 41 | MODULE_FIRMWARE("amdgpu/polaris11_smc.bin"); |
41 | MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin"); | 42 | MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin"); |
42 | MODULE_FIRMWARE("amdgpu/polaris11_k_smc.bin"); | 43 | MODULE_FIRMWARE("amdgpu/polaris11_k_smc.bin"); |
44 | MODULE_FIRMWARE("amdgpu/polaris11_k2_smc.bin"); | ||
43 | MODULE_FIRMWARE("amdgpu/polaris12_smc.bin"); | 45 | MODULE_FIRMWARE("amdgpu/polaris12_smc.bin"); |
46 | MODULE_FIRMWARE("amdgpu/polaris12_k_smc.bin"); | ||
44 | MODULE_FIRMWARE("amdgpu/vegam_smc.bin"); | 47 | MODULE_FIRMWARE("amdgpu/vegam_smc.bin"); |
45 | MODULE_FIRMWARE("amdgpu/vega10_smc.bin"); | 48 | MODULE_FIRMWARE("amdgpu/vega10_smc.bin"); |
46 | MODULE_FIRMWARE("amdgpu/vega10_acg_smc.bin"); | 49 | MODULE_FIRMWARE("amdgpu/vega10_acg_smc.bin"); |