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

Merge branch 'drm-next-4.19' of git://people.freedesktop.org/~agd5f/linux into drm-next

More features for 4.19:
- Use core pcie functionality rather than duplicating our own for pcie
gens and lanes
- Scheduler function naming cleanups
- More documentation
- Reworked DC/Powerplay interfaces to improve power savings
- Initial stutter mode support for RV (power feature)
- Vega12 powerplay updates
- GFXOFF fixes
- Misc fixes

Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180705221447.2807-1-alexander.deucher@amd.com

+4243 -2887
+12
Documentation/gpu/amdgpu.rst
··· 5 5 The drm/amdgpu driver supports all AMD Radeon GPUs based on the Graphics Core 6 6 Next (GCN) architecture. 7 7 8 + Module Parameters 9 + ================= 10 + 11 + The amdgpu driver supports the following module parameters: 12 + 13 + .. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 14 + 8 15 Core Driver Infrastructure 9 16 ========================== 10 17 ··· 122 115 .. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c 123 116 :doc: pp_power_profile_mode 124 117 118 + busy_percent 119 + ~~~~~~~~~~~~ 120 + 121 + .. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c 122 + :doc: busy_percent
+16 -39
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 190 190 struct amdgpu_irq_src; 191 191 struct amdgpu_fpriv; 192 192 struct amdgpu_bo_va_mapping; 193 + struct amdgpu_atif; 193 194 194 195 enum amdgpu_cp_irq { 195 196 AMDGPU_CP_IRQ_GFX_EOP = 0, ··· 684 683 int amdgpu_ctx_wait_prev_fence(struct amdgpu_ctx *ctx, unsigned ring_id); 685 684 686 685 void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr); 687 - void amdgpu_ctx_mgr_entity_cleanup(struct amdgpu_ctx_mgr *mgr); 688 686 void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr); 687 + void amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr); 689 688 void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr); 690 689 691 690 ··· 931 930 bool init; 932 931 }; 933 932 933 + struct sq_work { 934 + struct work_struct work; 935 + unsigned ih_data; 936 + }; 937 + 934 938 struct amdgpu_gfx { 935 939 struct mutex gpu_clock_mutex; 936 940 struct amdgpu_gfx_config config; ··· 976 970 struct amdgpu_irq_src priv_inst_irq; 977 971 struct amdgpu_irq_src cp_ecc_error_irq; 978 972 struct amdgpu_irq_src sq_irq; 973 + struct sq_work sq_work; 974 + 979 975 /* gfx status */ 980 976 uint32_t gfx_current_status; 981 977 /* ce ram size*/ ··· 1279 1271 /* 1280 1272 * ACPI 1281 1273 */ 1282 - struct amdgpu_atif_notification_cfg { 1283 - bool enabled; 1284 - int command_code; 1285 - }; 1286 - 1287 - struct amdgpu_atif_notifications { 1288 - bool display_switch; 1289 - bool expansion_mode_change; 1290 - bool thermal_state; 1291 - bool forced_power_state; 1292 - bool system_power_state; 1293 - bool display_conf_change; 1294 - bool px_gfx_switch; 1295 - bool brightness_change; 1296 - bool dgpu_display_event; 1297 - }; 1298 - 1299 - struct amdgpu_atif_functions { 1300 - bool system_params; 1301 - bool sbios_requests; 1302 - bool select_active_disp; 1303 - bool lid_state; 1304 - bool get_tv_standard; 1305 - bool set_tv_standard; 1306 - bool get_panel_expansion_mode; 1307 - bool set_panel_expansion_mode; 1308 - bool temperature_change; 1309 - bool graphics_device_types; 1310 - }; 1311 - 1312 - struct amdgpu_atif { 1313 - struct amdgpu_atif_notifications notifications; 1314 - struct amdgpu_atif_functions functions; 1315 - struct amdgpu_atif_notification_cfg notification_cfg; 1316 - struct amdgpu_encoder *encoder_for_bl; 1317 - }; 1318 - 1319 1274 struct amdgpu_atcs_functions { 1320 1275 bool get_ext_state; 1321 1276 bool pcie_perf_req; ··· 1439 1468 #if defined(CONFIG_DEBUG_FS) 1440 1469 struct dentry *debugfs_regs[AMDGPU_DEBUGFS_MAX_COMPONENTS]; 1441 1470 #endif 1442 - struct amdgpu_atif atif; 1471 + struct amdgpu_atif *atif; 1443 1472 struct amdgpu_atcs atcs; 1444 1473 struct mutex srbm_mutex; 1445 1474 /* GRBM index mutex. Protects concurrent access to GRBM index */ ··· 1865 1894 static inline bool amdgpu_is_atpx_hybrid(void) { return false; } 1866 1895 static inline bool amdgpu_atpx_dgpu_req_power_for_displays(void) { return false; } 1867 1896 static inline bool amdgpu_has_atpx(void) { return false; } 1897 + #endif 1898 + 1899 + #if defined(CONFIG_VGA_SWITCHEROO) && defined(CONFIG_ACPI) 1900 + void *amdgpu_atpx_get_dhandle(void); 1901 + #else 1902 + static inline void *amdgpu_atpx_get_dhandle(void) { return NULL; } 1868 1903 #endif 1869 1904 1870 1905 /*
+111 -26
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
··· 34 34 #include "amd_acpi.h" 35 35 #include "atom.h" 36 36 37 + struct amdgpu_atif_notification_cfg { 38 + bool enabled; 39 + int command_code; 40 + }; 41 + 42 + struct amdgpu_atif_notifications { 43 + bool display_switch; 44 + bool expansion_mode_change; 45 + bool thermal_state; 46 + bool forced_power_state; 47 + bool system_power_state; 48 + bool display_conf_change; 49 + bool px_gfx_switch; 50 + bool brightness_change; 51 + bool dgpu_display_event; 52 + }; 53 + 54 + struct amdgpu_atif_functions { 55 + bool system_params; 56 + bool sbios_requests; 57 + bool select_active_disp; 58 + bool lid_state; 59 + bool get_tv_standard; 60 + bool set_tv_standard; 61 + bool get_panel_expansion_mode; 62 + bool set_panel_expansion_mode; 63 + bool temperature_change; 64 + bool graphics_device_types; 65 + }; 66 + 67 + struct amdgpu_atif { 68 + acpi_handle handle; 69 + 70 + struct amdgpu_atif_notifications notifications; 71 + struct amdgpu_atif_functions functions; 72 + struct amdgpu_atif_notification_cfg notification_cfg; 73 + struct amdgpu_encoder *encoder_for_bl; 74 + }; 75 + 37 76 /* Call the ATIF method 38 77 */ 39 78 /** ··· 85 46 * Executes the requested ATIF function (all asics). 86 47 * Returns a pointer to the acpi output buffer. 87 48 */ 88 - static union acpi_object *amdgpu_atif_call(acpi_handle handle, int function, 89 - struct acpi_buffer *params) 49 + static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif, 50 + int function, 51 + struct acpi_buffer *params) 90 52 { 91 53 acpi_status status; 92 54 union acpi_object atif_arg_elements[2]; ··· 110 70 atif_arg_elements[1].integer.value = 0; 111 71 } 112 72 113 - status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer); 73 + status = acpi_evaluate_object(atif->handle, NULL, &atif_arg, 74 + &buffer); 114 75 115 76 /* Fail only if calling the method fails and ATIF is supported */ 116 77 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { ··· 182 141 * (all asics). 183 142 * returns 0 on success, error on failure. 184 143 */ 185 - static int amdgpu_atif_verify_interface(acpi_handle handle, 186 - struct amdgpu_atif *atif) 144 + static int amdgpu_atif_verify_interface(struct amdgpu_atif *atif) 187 145 { 188 146 union acpi_object *info; 189 147 struct atif_verify_interface output; 190 148 size_t size; 191 149 int err = 0; 192 150 193 - info = amdgpu_atif_call(handle, ATIF_FUNCTION_VERIFY_INTERFACE, NULL); 151 + info = amdgpu_atif_call(atif, ATIF_FUNCTION_VERIFY_INTERFACE, NULL); 194 152 if (!info) 195 153 return -EIO; 196 154 ··· 216 176 return err; 217 177 } 218 178 179 + static acpi_handle amdgpu_atif_probe_handle(acpi_handle dhandle) 180 + { 181 + acpi_handle handle = NULL; 182 + char acpi_method_name[255] = { 0 }; 183 + struct acpi_buffer buffer = { sizeof(acpi_method_name), acpi_method_name }; 184 + acpi_status status; 185 + 186 + /* For PX/HG systems, ATIF and ATPX are in the iGPU's namespace, on dGPU only 187 + * systems, ATIF is in the dGPU's namespace. 188 + */ 189 + status = acpi_get_handle(dhandle, "ATIF", &handle); 190 + if (ACPI_SUCCESS(status)) 191 + goto out; 192 + 193 + if (amdgpu_has_atpx()) { 194 + status = acpi_get_handle(amdgpu_atpx_get_dhandle(), "ATIF", 195 + &handle); 196 + if (ACPI_SUCCESS(status)) 197 + goto out; 198 + } 199 + 200 + DRM_DEBUG_DRIVER("No ATIF handle found\n"); 201 + return NULL; 202 + out: 203 + acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); 204 + DRM_DEBUG_DRIVER("Found ATIF handle %s\n", acpi_method_name); 205 + return handle; 206 + } 207 + 219 208 /** 220 209 * amdgpu_atif_get_notification_params - determine notify configuration 221 210 * ··· 257 188 * where n is specified in the result if a notifier is used. 258 189 * Returns 0 on success, error on failure. 259 190 */ 260 - static int amdgpu_atif_get_notification_params(acpi_handle handle, 261 - struct amdgpu_atif_notification_cfg *n) 191 + static int amdgpu_atif_get_notification_params(struct amdgpu_atif *atif) 262 192 { 263 193 union acpi_object *info; 194 + struct amdgpu_atif_notification_cfg *n = &atif->notification_cfg; 264 195 struct atif_system_params params; 265 196 size_t size; 266 197 int err = 0; 267 198 268 - info = amdgpu_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, NULL); 199 + info = amdgpu_atif_call(atif, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, 200 + NULL); 269 201 if (!info) { 270 202 err = -EIO; 271 203 goto out; ··· 320 250 * (all asics). 321 251 * Returns 0 on success, error on failure. 322 252 */ 323 - static int amdgpu_atif_get_sbios_requests(acpi_handle handle, 324 - struct atif_sbios_requests *req) 253 + static int amdgpu_atif_get_sbios_requests(struct amdgpu_atif *atif, 254 + struct atif_sbios_requests *req) 325 255 { 326 256 union acpi_object *info; 327 257 size_t size; 328 258 int count = 0; 329 259 330 - info = amdgpu_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, NULL); 260 + info = amdgpu_atif_call(atif, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, 261 + NULL); 331 262 if (!info) 332 263 return -EIO; 333 264 ··· 361 290 * Returns NOTIFY code 362 291 */ 363 292 static int amdgpu_atif_handler(struct amdgpu_device *adev, 364 - struct acpi_bus_event *event) 293 + struct acpi_bus_event *event) 365 294 { 366 - struct amdgpu_atif *atif = &adev->atif; 295 + struct amdgpu_atif *atif = adev->atif; 367 296 struct atif_sbios_requests req; 368 - acpi_handle handle; 369 297 int count; 370 298 371 299 DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n", ··· 373 303 if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) 374 304 return NOTIFY_DONE; 375 305 376 - if (!atif->notification_cfg.enabled || 306 + if (!atif || 307 + !atif->notification_cfg.enabled || 377 308 event->type != atif->notification_cfg.command_code) 378 309 /* Not our event */ 379 310 return NOTIFY_DONE; 380 311 381 312 /* Check pending SBIOS requests */ 382 - handle = ACPI_HANDLE(&adev->pdev->dev); 383 - count = amdgpu_atif_get_sbios_requests(handle, &req); 313 + count = amdgpu_atif_get_sbios_requests(atif, &req); 384 314 385 315 if (count <= 0) 386 316 return NOTIFY_DONE; ··· 711 641 */ 712 642 int amdgpu_acpi_init(struct amdgpu_device *adev) 713 643 { 714 - acpi_handle handle; 715 - struct amdgpu_atif *atif = &adev->atif; 644 + acpi_handle handle, atif_handle; 645 + struct amdgpu_atif *atif; 716 646 struct amdgpu_atcs *atcs = &adev->atcs; 717 647 int ret; 718 648 ··· 728 658 DRM_DEBUG_DRIVER("Call to ATCS verify_interface failed: %d\n", ret); 729 659 } 730 660 731 - /* Call the ATIF method */ 732 - ret = amdgpu_atif_verify_interface(handle, atif); 733 - if (ret) { 734 - DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret); 661 + /* Probe for ATIF, and initialize it if found */ 662 + atif_handle = amdgpu_atif_probe_handle(handle); 663 + if (!atif_handle) 664 + goto out; 665 + 666 + atif = kzalloc(sizeof(*atif), GFP_KERNEL); 667 + if (!atif) { 668 + DRM_WARN("Not enough memory to initialize ATIF\n"); 735 669 goto out; 736 670 } 671 + atif->handle = atif_handle; 672 + 673 + /* Call the ATIF method */ 674 + ret = amdgpu_atif_verify_interface(atif); 675 + if (ret) { 676 + DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret); 677 + kfree(atif); 678 + goto out; 679 + } 680 + adev->atif = atif; 737 681 738 682 if (atif->notifications.brightness_change) { 739 683 struct drm_encoder *tmp; ··· 777 693 } 778 694 779 695 if (atif->functions.system_params) { 780 - ret = amdgpu_atif_get_notification_params(handle, 781 - &atif->notification_cfg); 696 + ret = amdgpu_atif_get_notification_params(atif); 782 697 if (ret) { 783 698 DRM_DEBUG_DRIVER("Call to GET_SYSTEM_PARAMS failed: %d\n", 784 699 ret); ··· 803 720 void amdgpu_acpi_fini(struct amdgpu_device *adev) 804 721 { 805 722 unregister_acpi_notifier(&adev->acpi_nb); 723 + if (adev->atif) 724 + kfree(adev->atif); 806 725 }
+8 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
··· 32 32 bool switch_start; 33 33 bool switch_end; 34 34 bool disp_connectors_mapping; 35 - bool disp_detetion_ports; 35 + bool disp_detection_ports; 36 36 }; 37 37 38 38 struct amdgpu_atpx { ··· 89 89 bool amdgpu_atpx_dgpu_req_power_for_displays(void) { 90 90 return amdgpu_atpx_priv.atpx.dgpu_req_power_for_displays; 91 91 } 92 + 93 + #if defined(CONFIG_ACPI) 94 + void *amdgpu_atpx_get_dhandle(void) { 95 + return amdgpu_atpx_priv.dhandle; 96 + } 97 + #endif 92 98 93 99 /** 94 100 * amdgpu_atpx_call - call an ATPX method ··· 162 156 f->switch_start = mask & ATPX_GRAPHICS_DEVICE_SWITCH_START_NOTIFICATION_SUPPORTED; 163 157 f->switch_end = mask & ATPX_GRAPHICS_DEVICE_SWITCH_END_NOTIFICATION_SUPPORTED; 164 158 f->disp_connectors_mapping = mask & ATPX_GET_DISPLAY_CONNECTORS_MAPPING_SUPPORTED; 165 - f->disp_detetion_ports = mask & ATPX_GET_DISPLAY_DETECTION_PORTS_SUPPORTED; 159 + f->disp_detection_ports = mask & ATPX_GET_DISPLAY_DETECTION_PORTS_SUPPORTED; 166 160 } 167 161 168 162 /**
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
··· 314 314 (adev->pdev->revision == 0x81) || 315 315 (adev->pdev->device == 0x665f)) { 316 316 info->is_kicker = true; 317 - strcpy(fw_name, "radeon/bonaire_k_smc.bin"); 317 + strcpy(fw_name, "amdgpu/bonaire_k_smc.bin"); 318 318 } else { 319 - strcpy(fw_name, "radeon/bonaire_smc.bin"); 319 + strcpy(fw_name, "amdgpu/bonaire_smc.bin"); 320 320 } 321 321 break; 322 322 case CHIP_HAWAII: 323 323 if (adev->pdev->revision == 0x80) { 324 324 info->is_kicker = true; 325 - strcpy(fw_name, "radeon/hawaii_k_smc.bin"); 325 + strcpy(fw_name, "amdgpu/hawaii_k_smc.bin"); 326 326 } else { 327 - strcpy(fw_name, "radeon/hawaii_smc.bin"); 327 + strcpy(fw_name, "amdgpu/hawaii_smc.bin"); 328 328 } 329 329 break; 330 330 case CHIP_TOPAZ:
+7 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 104 104 105 105 failed: 106 106 for (j = 0; j < i; j++) 107 - drm_sched_entity_fini(&adev->rings[j]->sched, 107 + drm_sched_entity_destroy(&adev->rings[j]->sched, 108 108 &ctx->rings[j].entity); 109 109 kfree(ctx->fences); 110 110 ctx->fences = NULL; ··· 178 178 if (ctx->adev->rings[i] == &ctx->adev->gfx.kiq.ring) 179 179 continue; 180 180 181 - drm_sched_entity_fini(&ctx->adev->rings[i]->sched, 181 + drm_sched_entity_destroy(&ctx->adev->rings[i]->sched, 182 182 &ctx->rings[i].entity); 183 183 } 184 184 ··· 444 444 idr_init(&mgr->ctx_handles); 445 445 } 446 446 447 - void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr) 447 + void amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr) 448 448 { 449 449 struct amdgpu_ctx *ctx; 450 450 struct idr *idp; ··· 466 466 if (ctx->adev->rings[i] == &ctx->adev->gfx.kiq.ring) 467 467 continue; 468 468 469 - max_wait = drm_sched_entity_do_release(&ctx->adev->rings[i]->sched, 469 + max_wait = drm_sched_entity_flush(&ctx->adev->rings[i]->sched, 470 470 &ctx->rings[i].entity, max_wait); 471 471 } 472 472 } 473 473 mutex_unlock(&mgr->lock); 474 474 } 475 475 476 - void amdgpu_ctx_mgr_entity_cleanup(struct amdgpu_ctx_mgr *mgr) 476 + void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr) 477 477 { 478 478 struct amdgpu_ctx *ctx; 479 479 struct idr *idp; ··· 492 492 continue; 493 493 494 494 if (kref_read(&ctx->refcount) == 1) 495 - drm_sched_entity_cleanup(&ctx->adev->rings[i]->sched, 495 + drm_sched_entity_fini(&ctx->adev->rings[i]->sched, 496 496 &ctx->rings[i].entity); 497 497 else 498 498 DRM_ERROR("ctx %p is still alive\n", ctx); ··· 506 506 struct idr *idp; 507 507 uint32_t id; 508 508 509 - amdgpu_ctx_mgr_entity_cleanup(mgr); 509 + amdgpu_ctx_mgr_entity_fini(mgr); 510 510 511 511 idp = &mgr->ctx_handles; 512 512
+111 -54
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 1076 1076 /** 1077 1077 * amdgpu_device_ip_set_clockgating_state - set the CG state 1078 1078 * 1079 - * @adev: amdgpu_device pointer 1079 + * @dev: amdgpu_device pointer 1080 1080 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.) 1081 1081 * @state: clockgating state (gate or ungate) 1082 1082 * ··· 1110 1110 /** 1111 1111 * amdgpu_device_ip_set_powergating_state - set the PG state 1112 1112 * 1113 - * @adev: amdgpu_device pointer 1113 + * @dev: amdgpu_device pointer 1114 1114 * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.) 1115 1115 * @state: powergating state (gate or ungate) 1116 1116 * ··· 1221 1221 * amdgpu_device_ip_get_ip_block - get a hw IP pointer 1222 1222 * 1223 1223 * @adev: amdgpu_device pointer 1224 - * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.) 1224 + * @type: Type of hardware IP (SMU, GFX, UVD, etc.) 1225 1225 * 1226 1226 * Returns a pointer to the hardware IP block structure 1227 1227 * if it exists for the asic, otherwise NULL. ··· 1707 1707 if (amdgpu_emu_mode == 1) 1708 1708 return 0; 1709 1709 1710 - r = amdgpu_ib_ring_tests(adev); 1711 - if (r) 1712 - DRM_ERROR("ib ring test failed (%d).\n", r); 1713 - 1714 1710 for (i = 0; i < adev->num_ip_blocks; i++) { 1715 1711 if (!adev->ip_blocks[i].status.valid) 1716 1712 continue; ··· 1726 1730 } 1727 1731 } 1728 1732 1729 - if (adev->powerplay.pp_feature & PP_GFXOFF_MASK) { 1730 - /* enable gfx powergating */ 1731 - amdgpu_device_ip_set_powergating_state(adev, 1732 - AMD_IP_BLOCK_TYPE_GFX, 1733 - AMD_PG_STATE_GATE); 1734 - /* enable gfxoff */ 1735 - amdgpu_device_ip_set_powergating_state(adev, 1736 - AMD_IP_BLOCK_TYPE_SMC, 1737 - AMD_PG_STATE_GATE); 1738 - } 1733 + return 0; 1734 + } 1739 1735 1736 + static int amdgpu_device_ip_late_set_pg_state(struct amdgpu_device *adev) 1737 + { 1738 + int i = 0, r; 1739 + 1740 + if (amdgpu_emu_mode == 1) 1741 + return 0; 1742 + 1743 + for (i = 0; i < adev->num_ip_blocks; i++) { 1744 + if (!adev->ip_blocks[i].status.valid) 1745 + continue; 1746 + /* skip CG for VCE/UVD, it's handled specially */ 1747 + if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD && 1748 + adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE && 1749 + adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCN && 1750 + adev->ip_blocks[i].version->funcs->set_powergating_state) { 1751 + /* enable powergating to save power */ 1752 + r = adev->ip_blocks[i].version->funcs->set_powergating_state((void *)adev, 1753 + AMD_PG_STATE_GATE); 1754 + if (r) { 1755 + DRM_ERROR("set_powergating_state(gate) of IP block <%s> failed %d\n", 1756 + adev->ip_blocks[i].version->funcs->name, r); 1757 + return r; 1758 + } 1759 + } 1760 + } 1740 1761 return 0; 1741 1762 } 1742 1763 ··· 1786 1773 adev->ip_blocks[i].status.late_initialized = true; 1787 1774 } 1788 1775 } 1776 + 1777 + amdgpu_device_ip_late_set_cg_state(adev); 1778 + amdgpu_device_ip_late_set_pg_state(adev); 1789 1779 1790 1780 queue_delayed_work(system_wq, &adev->late_init_work, 1791 1781 msecs_to_jiffies(AMDGPU_RESUME_MS)); ··· 1828 1812 adev->ip_blocks[i].version->funcs->name, r); 1829 1813 return r; 1830 1814 } 1815 + if (adev->powerplay.pp_funcs->set_powergating_by_smu) 1816 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false); 1831 1817 r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev); 1832 1818 /* XXX handle errors */ 1833 1819 if (r) { ··· 1918 1900 { 1919 1901 struct amdgpu_device *adev = 1920 1902 container_of(work, struct amdgpu_device, late_init_work.work); 1921 - amdgpu_device_ip_late_set_cg_state(adev); 1903 + int r; 1904 + 1905 + r = amdgpu_ib_ring_tests(adev); 1906 + if (r) 1907 + DRM_ERROR("ib ring test failed (%d).\n", r); 1922 1908 } 1923 1909 1924 1910 /** ··· 1943 1921 if (amdgpu_sriov_vf(adev)) 1944 1922 amdgpu_virt_request_full_gpu(adev, false); 1945 1923 1946 - /* ungate SMC block powergating */ 1947 - if (adev->powerplay.pp_feature & PP_GFXOFF_MASK) 1948 - amdgpu_device_ip_set_powergating_state(adev, 1949 - AMD_IP_BLOCK_TYPE_SMC, 1950 - AMD_PG_STATE_UNGATE); 1951 - 1952 1924 /* ungate SMC block first */ 1953 1925 r = amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC, 1954 1926 AMD_CG_STATE_UNGATE); 1955 1927 if (r) { 1956 1928 DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n", r); 1957 1929 } 1930 + 1931 + /* call smu to disable gfx off feature first when suspend */ 1932 + if (adev->powerplay.pp_funcs->set_powergating_by_smu) 1933 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false); 1958 1934 1959 1935 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1960 1936 if (!adev->ip_blocks[i].status.valid) ··· 2229 2209 * amdgpu_device_init - initialize the driver 2230 2210 * 2231 2211 * @adev: amdgpu_device pointer 2232 - * @pdev: drm dev pointer 2212 + * @ddev: drm dev pointer 2233 2213 * @pdev: pci dev pointer 2234 2214 * @flags: driver flags 2235 2215 * ··· 2602 2582 /** 2603 2583 * amdgpu_device_suspend - initiate device suspend 2604 2584 * 2605 - * @pdev: drm dev pointer 2606 - * @state: suspend state 2585 + * @dev: drm dev pointer 2586 + * @suspend: suspend state 2587 + * @fbcon : notify the fbdev of suspend 2607 2588 * 2608 2589 * Puts the hw in the suspend state (all asics). 2609 2590 * Returns 0 for success or an error on failure. ··· 2702 2681 /** 2703 2682 * amdgpu_device_resume - initiate device resume 2704 2683 * 2705 - * @pdev: drm dev pointer 2684 + * @dev: drm dev pointer 2685 + * @resume: resume state 2686 + * @fbcon : notify the fbdev of resume 2706 2687 * 2707 2688 * Bring the hw back to operating state (all asics). 2708 2689 * Returns 0 for success or an error on failure. ··· 3167 3144 * amdgpu_device_reset_sriov - reset ASIC for SR-IOV vf 3168 3145 * 3169 3146 * @adev: amdgpu device pointer 3147 + * @from_hypervisor: request from hypervisor 3170 3148 * 3171 3149 * do VF FLR and reinitialize Asic 3172 3150 * return 0 means successed otherwise failed ··· 3215 3191 * 3216 3192 * @adev: amdgpu device pointer 3217 3193 * @job: which job trigger hang 3218 - * @force forces reset regardless of amdgpu_gpu_recovery 3194 + * @force: forces reset regardless of amdgpu_gpu_recovery 3219 3195 * 3220 3196 * Attempt to reset the GPU if it has hung (all asics). 3221 3197 * Returns 0 for success or an error on failure. ··· 3315 3291 */ 3316 3292 static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) 3317 3293 { 3318 - u32 mask; 3319 - int ret; 3294 + struct pci_dev *pdev; 3295 + enum pci_bus_speed speed_cap; 3296 + enum pcie_link_width link_width; 3320 3297 3321 3298 if (amdgpu_pcie_gen_cap) 3322 3299 adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap; ··· 3335 3310 } 3336 3311 3337 3312 if (adev->pm.pcie_gen_mask == 0) { 3338 - ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); 3339 - if (!ret) { 3340 - adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3313 + /* asic caps */ 3314 + pdev = adev->pdev; 3315 + speed_cap = pcie_get_speed_cap(pdev); 3316 + if (speed_cap == PCI_SPEED_UNKNOWN) { 3317 + adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3341 3318 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | 3342 3319 CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3); 3343 - 3344 - if (mask & DRM_PCIE_SPEED_25) 3345 - adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1; 3346 - if (mask & DRM_PCIE_SPEED_50) 3347 - adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2; 3348 - if (mask & DRM_PCIE_SPEED_80) 3349 - adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3; 3350 3320 } else { 3351 - adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK; 3321 + if (speed_cap == PCIE_SPEED_16_0GT) 3322 + adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3323 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | 3324 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 | 3325 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4); 3326 + else if (speed_cap == PCIE_SPEED_8_0GT) 3327 + adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3328 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | 3329 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3); 3330 + else if (speed_cap == PCIE_SPEED_5_0GT) 3331 + adev->pm.pcie_gen_mask |= (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3332 + CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2); 3333 + else 3334 + adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1; 3335 + } 3336 + /* platform caps */ 3337 + pdev = adev->ddev->pdev->bus->self; 3338 + speed_cap = pcie_get_speed_cap(pdev); 3339 + if (speed_cap == PCI_SPEED_UNKNOWN) { 3340 + adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3341 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); 3342 + } else { 3343 + if (speed_cap == PCIE_SPEED_16_0GT) 3344 + adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3345 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | 3346 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 | 3347 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4); 3348 + else if (speed_cap == PCIE_SPEED_8_0GT) 3349 + adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3350 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | 3351 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3); 3352 + else if (speed_cap == PCIE_SPEED_5_0GT) 3353 + adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | 3354 + CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); 3355 + else 3356 + adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1; 3357 + 3352 3358 } 3353 3359 } 3354 3360 if (adev->pm.pcie_mlw_mask == 0) { 3355 - ret = drm_pcie_get_max_link_width(adev->ddev, &mask); 3356 - if (!ret) { 3357 - switch (mask) { 3358 - case 32: 3361 + pdev = adev->ddev->pdev->bus->self; 3362 + link_width = pcie_get_width_cap(pdev); 3363 + if (link_width == PCIE_LNK_WIDTH_UNKNOWN) { 3364 + adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK; 3365 + } else { 3366 + switch (link_width) { 3367 + case PCIE_LNK_X32: 3359 3368 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | 3360 3369 CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | 3361 3370 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | ··· 3398 3339 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3399 3340 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3400 3341 break; 3401 - case 16: 3342 + case PCIE_LNK_X16: 3402 3343 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | 3403 3344 CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | 3404 3345 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | ··· 3406 3347 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3407 3348 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3408 3349 break; 3409 - case 12: 3350 + case PCIE_LNK_X12: 3410 3351 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | 3411 3352 CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | 3412 3353 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | 3413 3354 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3414 3355 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3415 3356 break; 3416 - case 8: 3357 + case PCIE_LNK_X8: 3417 3358 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | 3418 3359 CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | 3419 3360 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3420 3361 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3421 3362 break; 3422 - case 4: 3363 + case PCIE_LNK_X4: 3423 3364 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | 3424 3365 CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3425 3366 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3426 3367 break; 3427 - case 2: 3368 + case PCIE_LNK_X2: 3428 3369 adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | 3429 3370 CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); 3430 3371 break; 3431 - case 1: 3372 + case PCIE_LNK_X1: 3432 3373 adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1; 3433 3374 break; 3434 3375 default: 3435 3376 break; 3436 3377 } 3437 - } else { 3438 - adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK; 3439 3378 } 3440 3379 } 3441 3380 }
+5 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
··· 28 28 #include "amdgpu_i2c.h" 29 29 #include "amdgpu_dpm.h" 30 30 #include "atom.h" 31 + #include "amd_pcie.h" 31 32 32 33 void amdgpu_dpm_print_class_info(u32 class, u32 class2) 33 34 { ··· 937 936 case AMDGPU_PCIE_GEN3: 938 937 return AMDGPU_PCIE_GEN3; 939 938 default: 940 - if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == AMDGPU_PCIE_GEN3)) 939 + if ((sys_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) && 940 + (default_gen == AMDGPU_PCIE_GEN3)) 941 941 return AMDGPU_PCIE_GEN3; 942 - else if ((sys_mask & DRM_PCIE_SPEED_50) && (default_gen == AMDGPU_PCIE_GEN2)) 942 + else if ((sys_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) && 943 + (default_gen == AMDGPU_PCIE_GEN2)) 943 944 return AMDGPU_PCIE_GEN2; 944 945 else 945 946 return AMDGPU_PCIE_GEN1;
+4 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
··· 287 287 #define amdgpu_dpm_force_performance_level(adev, l) \ 288 288 ((adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l))) 289 289 290 - #define amdgpu_dpm_powergate_uvd(adev, g) \ 291 - ((adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g))) 292 - 293 - #define amdgpu_dpm_powergate_vce(adev, g) \ 294 - ((adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g))) 295 - 296 290 #define amdgpu_dpm_get_current_power_state(adev) \ 297 291 ((adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle)) 298 292 ··· 341 347 ((adev)->powerplay.pp_funcs->set_clockgating_by_smu(\ 342 348 (adev)->powerplay.pp_handle, msg_id)) 343 349 350 + #define amdgpu_dpm_set_powergating_by_smu(adev, block_type, gate) \ 351 + ((adev)->powerplay.pp_funcs->set_powergating_by_smu(\ 352 + (adev)->powerplay.pp_handle, block_type, gate)) 353 + 344 354 #define amdgpu_dpm_get_power_profile_mode(adev, buf) \ 345 355 ((adev)->powerplay.pp_funcs->get_power_profile_mode(\ 346 356 (adev)->powerplay.pp_handle, buf)) ··· 356 358 #define amdgpu_dpm_odn_edit_dpm_table(adev, type, parameter, size) \ 357 359 ((adev)->powerplay.pp_funcs->odn_edit_dpm_table(\ 358 360 (adev)->powerplay.pp_handle, type, parameter, size)) 359 - 360 - #define amdgpu_dpm_set_mmhub_powergating_by_smu(adev) \ 361 - ((adev)->powerplay.pp_funcs->set_mmhub_powergating_by_smu( \ 362 - (adev)->powerplay.pp_handle)) 363 361 364 362 struct amdgpu_dpm { 365 363 struct amdgpu_ps *ps;
+230 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 1 - /** 2 - * \file amdgpu_drv.c 3 - * AMD Amdgpu driver 4 - * 5 - * \author Gareth Hughes <gareth@valinux.com> 6 - */ 7 - 8 1 /* 9 2 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 10 3 * All Rights Reserved. ··· 115 122 uint amdgpu_sdma_phase_quantum = 32; 116 123 char *amdgpu_disable_cu = NULL; 117 124 char *amdgpu_virtual_display = NULL; 118 - uint amdgpu_pp_feature_mask = 0xffff3fff; /* gfxoff (bit 15) disabled by default */ 125 + /* OverDrive(bit 14),gfxoff(bit 15),stutter mode(bit 17) disabled by default*/ 126 + uint amdgpu_pp_feature_mask = 0xfffd3fff; 119 127 int amdgpu_ngg = 0; 120 128 int amdgpu_prim_buf_per_se = 0; 121 129 int amdgpu_pos_buf_per_se = 0; ··· 129 135 int amdgpu_emu_mode = 0; 130 136 uint amdgpu_smu_memory_pool_size = 0; 131 137 138 + /** 139 + * DOC: vramlimit (int) 140 + * Restrict the total amount of VRAM in MiB for testing. The default is 0 (Use full VRAM). 141 + */ 132 142 MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); 133 143 module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); 134 144 145 + /** 146 + * DOC: vis_vramlimit (int) 147 + * Restrict the amount of CPU visible VRAM in MiB for testing. The default is 0 (Use full CPU visible VRAM). 148 + */ 135 149 MODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes"); 136 150 module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444); 137 151 152 + /** 153 + * DOC: gartsize (uint) 154 + * Restrict the size of GART in Mib (32, 64, etc.) for testing. The default is -1 (The size depends on asic). 155 + */ 138 156 MODULE_PARM_DESC(gartsize, "Size of GART to setup in megabytes (32, 64, etc., -1=auto)"); 139 157 module_param_named(gartsize, amdgpu_gart_size, uint, 0600); 140 158 159 + /** 160 + * DOC: gttsize (int) 161 + * Restrict the size of GTT domain in MiB for testing. The default is -1 (It's VRAM size if 3GB < VRAM < 3/4 RAM, 162 + * otherwise 3/4 RAM size). 163 + */ 141 164 MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)"); 142 165 module_param_named(gttsize, amdgpu_gtt_size, int, 0600); 143 166 167 + /** 168 + * DOC: moverate (int) 169 + * Set maximum buffer migration rate in MB/s. The default is -1 (8 MB/s). 170 + */ 144 171 MODULE_PARM_DESC(moverate, "Maximum buffer migration rate in MB/s. (32, 64, etc., -1=auto, 0=1=disabled)"); 145 172 module_param_named(moverate, amdgpu_moverate, int, 0600); 146 173 174 + /** 175 + * DOC: benchmark (int) 176 + * Run benchmarks. The default is 0 (Skip benchmarks). 177 + */ 147 178 MODULE_PARM_DESC(benchmark, "Run benchmark"); 148 179 module_param_named(benchmark, amdgpu_benchmarking, int, 0444); 149 180 181 + /** 182 + * DOC: test (int) 183 + * Test BO GTT->VRAM and VRAM->GTT GPU copies. The default is 0 (Skip test, only set 1 to run test). 184 + */ 150 185 MODULE_PARM_DESC(test, "Run tests"); 151 186 module_param_named(test, amdgpu_testing, int, 0444); 152 187 188 + /** 189 + * DOC: audio (int) 190 + * Set HDMI/DPAudio. Only affects non-DC display handling. The default is -1 (Enabled), set 0 to disabled it. 191 + */ 153 192 MODULE_PARM_DESC(audio, "Audio enable (-1 = auto, 0 = disable, 1 = enable)"); 154 193 module_param_named(audio, amdgpu_audio, int, 0444); 155 194 195 + /** 196 + * DOC: disp_priority (int) 197 + * Set display Priority (1 = normal, 2 = high). Only affects non-DC display handling. The default is 0 (auto). 198 + */ 156 199 MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); 157 200 module_param_named(disp_priority, amdgpu_disp_priority, int, 0444); 158 201 202 + /** 203 + * DOC: hw_i2c (int) 204 + * To enable hw i2c engine. Only affects non-DC display handling. The default is 0 (Disabled). 205 + */ 159 206 MODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)"); 160 207 module_param_named(hw_i2c, amdgpu_hw_i2c, int, 0444); 161 208 209 + /** 210 + * DOC: pcie_gen2 (int) 211 + * To disable PCIE Gen2/3 mode (0 = disable, 1 = enable). The default is -1 (auto, enabled). 212 + */ 162 213 MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable)"); 163 214 module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444); 164 215 216 + /** 217 + * DOC: msi (int) 218 + * To disable Message Signaled Interrupts (MSI) functionality (1 = enable, 0 = disable). The default is -1 (auto, enabled). 219 + */ 165 220 MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)"); 166 221 module_param_named(msi, amdgpu_msi, int, 0444); 167 222 223 + /** 224 + * DOC: lockup_timeout (int) 225 + * Set GPU scheduler timeout value in ms. Value 0 is invalidated, will be adjusted to 10000. 226 + * Negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET). The default is 10000. 227 + */ 168 228 MODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms > 0 (default 10000)"); 169 229 module_param_named(lockup_timeout, amdgpu_lockup_timeout, int, 0444); 170 230 231 + /** 232 + * DOC: dpm (int) 233 + * Override for dynamic power management setting (1 = enable, 0 = disable). The default is -1 (auto). 234 + */ 171 235 MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)"); 172 236 module_param_named(dpm, amdgpu_dpm, int, 0444); 173 237 238 + /** 239 + * DOC: fw_load_type (int) 240 + * Set different firmware loading type for debugging (0 = direct, 1 = SMU, 2 = PSP). The default is -1 (auto). 241 + */ 174 242 MODULE_PARM_DESC(fw_load_type, "firmware loading type (0 = direct, 1 = SMU, 2 = PSP, -1 = auto)"); 175 243 module_param_named(fw_load_type, amdgpu_fw_load_type, int, 0444); 176 244 245 + /** 246 + * DOC: aspm (int) 247 + * To disable ASPM (1 = enable, 0 = disable). The default is -1 (auto, enabled). 248 + */ 177 249 MODULE_PARM_DESC(aspm, "ASPM support (1 = enable, 0 = disable, -1 = auto)"); 178 250 module_param_named(aspm, amdgpu_aspm, int, 0444); 179 251 252 + /** 253 + * DOC: runpm (int) 254 + * Override for runtime power management control for dGPUs in PX/HG laptops. The amdgpu driver can dynamically power down 255 + * the dGPU on PX/HG laptops when it is idle. The default is -1 (auto enable). Setting the value to 0 disables this functionality. 256 + */ 180 257 MODULE_PARM_DESC(runpm, "PX runtime pm (1 = force enable, 0 = disable, -1 = PX only default)"); 181 258 module_param_named(runpm, amdgpu_runtime_pm, int, 0444); 182 259 260 + /** 261 + * DOC: ip_block_mask (uint) 262 + * Override what IP blocks are enabled on the GPU. Each GPU is a collection of IP blocks (gfx, display, video, etc.). 263 + * Use this parameter to disable specific blocks. Note that the IP blocks do not have a fixed index. Some asics may not have 264 + * some IPs or may include multiple instances of an IP so the ordering various from asic to asic. See the driver output in 265 + * the kernel log for the list of IPs on the asic. The default is 0xffffffff (enable all blocks on a device). 266 + */ 183 267 MODULE_PARM_DESC(ip_block_mask, "IP Block Mask (all blocks enabled (default))"); 184 268 module_param_named(ip_block_mask, amdgpu_ip_block_mask, uint, 0444); 185 269 270 + /** 271 + * DOC: bapm (int) 272 + * Bidirectional Application Power Management (BAPM) used to dynamically share TDP between CPU and GPU. Set value 0 to disable it. 273 + * The default -1 (auto, enabled) 274 + */ 186 275 MODULE_PARM_DESC(bapm, "BAPM support (1 = enable, 0 = disable, -1 = auto)"); 187 276 module_param_named(bapm, amdgpu_bapm, int, 0444); 188 277 278 + /** 279 + * DOC: deep_color (int) 280 + * Set 1 to enable Deep Color support. Only affects non-DC display handling. The default is 0 (disabled). 281 + */ 189 282 MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))"); 190 283 module_param_named(deep_color, amdgpu_deep_color, int, 0444); 191 284 285 + /** 286 + * DOC: vm_size (int) 287 + * Override the size of the GPU's per client virtual address space in GiB. The default is -1 (automatic for each asic). 288 + */ 192 289 MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 64GB)"); 193 290 module_param_named(vm_size, amdgpu_vm_size, int, 0444); 194 291 292 + /** 293 + * DOC: vm_fragment_size (int) 294 + * Override VM fragment size in bits (4, 5, etc. 4 = 64K, 9 = 2M). The default is -1 (automatic for each asic). 295 + */ 195 296 MODULE_PARM_DESC(vm_fragment_size, "VM fragment size in bits (4, 5, etc. 4 = 64K (default), Max 9 = 2M)"); 196 297 module_param_named(vm_fragment_size, amdgpu_vm_fragment_size, int, 0444); 197 298 299 + /** 300 + * DOC: vm_block_size (int) 301 + * Override VM page table size in bits (default depending on vm_size and hw setup). The default is -1 (automatic for each asic). 302 + */ 198 303 MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)"); 199 304 module_param_named(vm_block_size, amdgpu_vm_block_size, int, 0444); 200 305 306 + /** 307 + * DOC: vm_fault_stop (int) 308 + * Stop on VM fault for debugging (0 = never, 1 = print first, 2 = always). The default is 0 (No stop). 309 + */ 201 310 MODULE_PARM_DESC(vm_fault_stop, "Stop on VM fault (0 = never (default), 1 = print first, 2 = always)"); 202 311 module_param_named(vm_fault_stop, amdgpu_vm_fault_stop, int, 0444); 203 312 313 + /** 314 + * DOC: vm_debug (int) 315 + * Debug VM handling (0 = disabled, 1 = enabled). The default is 0 (Disabled). 316 + */ 204 317 MODULE_PARM_DESC(vm_debug, "Debug VM handling (0 = disabled (default), 1 = enabled)"); 205 318 module_param_named(vm_debug, amdgpu_vm_debug, int, 0644); 206 319 320 + /** 321 + * DOC: vm_update_mode (int) 322 + * Override VM update mode. VM updated by using CPU (0 = never, 1 = Graphics only, 2 = Compute only, 3 = Both). The default 323 + * is -1 (Only in large BAR(LB) systems Compute VM tables will be updated by CPU, otherwise 0, never). 324 + */ 207 325 MODULE_PARM_DESC(vm_update_mode, "VM update using CPU (0 = never (default except for large BAR(LB)), 1 = Graphics only, 2 = Compute only (default for LB), 3 = Both"); 208 326 module_param_named(vm_update_mode, amdgpu_vm_update_mode, int, 0444); 209 327 328 + /** 329 + * DOC: vram_page_split (int) 330 + * Override the number of pages after we split VRAM allocations (default 512, -1 = disable). The default is 512. 331 + */ 210 332 MODULE_PARM_DESC(vram_page_split, "Number of pages after we split VRAM allocations (default 512, -1 = disable)"); 211 333 module_param_named(vram_page_split, amdgpu_vram_page_split, int, 0444); 212 334 335 + /** 336 + * DOC: exp_hw_support (int) 337 + * Enable experimental hw support (1 = enable). The default is 0 (disabled). 338 + */ 213 339 MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); 214 340 module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); 215 341 342 + /** 343 + * DOC: dc (int) 344 + * Disable/Enable Display Core driver for debugging (1 = enable, 0 = disable). The default is -1 (automatic for each asic). 345 + */ 216 346 MODULE_PARM_DESC(dc, "Display Core driver (1 = enable, 0 = disable, -1 = auto (default))"); 217 347 module_param_named(dc, amdgpu_dc, int, 0444); 218 348 219 349 MODULE_PARM_DESC(dc_log, "Display Core Log Level (0 = minimal (default), 1 = chatty"); 220 350 module_param_named(dc_log, amdgpu_dc_log, int, 0444); 221 351 352 + /** 353 + * DOC: sched_jobs (int) 354 + * Override the max number of jobs supported in the sw queue. The default is 32. 355 + */ 222 356 MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 32)"); 223 357 module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444); 224 358 359 + /** 360 + * DOC: sched_hw_submission (int) 361 + * Override the max number of HW submissions. The default is 2. 362 + */ 225 363 MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); 226 364 module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); 227 365 366 + /** 367 + * DOC: ppfeaturemask (uint) 368 + * Override power features enabled. See enum PP_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h. 369 + * The default is the current set of stable power features. 370 + */ 228 371 MODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))"); 229 372 module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, uint, 0444); 230 373 ··· 371 240 MODULE_PARM_DESC(direct_gma_size, "Direct GMA size in megabytes (max 96MB)"); 372 241 module_param_named(direct_gma_size, amdgpu_direct_gma_size, int, 0444); 373 242 243 + /** 244 + * DOC: pcie_gen_cap (uint) 245 + * Override PCIE gen speed capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h. 246 + * The default is 0 (automatic for each asic). 247 + */ 374 248 MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))"); 375 249 module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444); 376 250 251 + /** 252 + * DOC: pcie_lane_cap (uint) 253 + * Override PCIE lanes capabilities. See the CAIL flags in drivers/gpu/drm/amd/include/amd_pcie.h. 254 + * The default is 0 (automatic for each asic). 255 + */ 377 256 MODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))"); 378 257 module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444); 379 258 259 + /** 260 + * DOC: cg_mask (uint) 261 + * Override Clockgating features enabled on GPU (0 = disable clock gating). See the AMD_CG_SUPPORT flags in 262 + * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffff (all enabled). 263 + */ 380 264 MODULE_PARM_DESC(cg_mask, "Clockgating flags mask (0 = disable clock gating)"); 381 265 module_param_named(cg_mask, amdgpu_cg_mask, uint, 0444); 382 266 267 + /** 268 + * DOC: pg_mask (uint) 269 + * Override Powergating features enabled on GPU (0 = disable power gating). See the AMD_PG_SUPPORT flags in 270 + * drivers/gpu/drm/amd/include/amd_shared.h. The default is 0xffffffff (all enabled). 271 + */ 383 272 MODULE_PARM_DESC(pg_mask, "Powergating flags mask (0 = disable power gating)"); 384 273 module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444); 385 274 275 + /** 276 + * DOC: sdma_phase_quantum (uint) 277 + * Override SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change). The default is 32. 278 + */ 386 279 MODULE_PARM_DESC(sdma_phase_quantum, "SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change (default 32))"); 387 280 module_param_named(sdma_phase_quantum, amdgpu_sdma_phase_quantum, uint, 0444); 388 281 282 + /** 283 + * DOC: disable_cu (charp) 284 + * Set to disable CUs (It's set like se.sh.cu,...). The default is NULL. 285 + */ 389 286 MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)"); 390 287 module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444); 391 288 289 + /** 290 + * DOC: virtual_display (charp) 291 + * Set to enable virtual display feature. This feature provides a virtual display hardware on headless boards 292 + * or in virtualized environments. It will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x. It's the pci address of 293 + * the device, plus the number of crtcs to expose. E.g., 0000:26:00.0,4 would enable 4 virtual crtcs on the pci 294 + * device at 26:00.0. The default is NULL. 295 + */ 392 296 MODULE_PARM_DESC(virtual_display, 393 297 "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)"); 394 298 module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444); 395 299 300 + /** 301 + * DOC: ngg (int) 302 + * Set to enable Next Generation Graphics (1 = enable). The default is 0 (disabled). 303 + */ 396 304 MODULE_PARM_DESC(ngg, "Next Generation Graphics (1 = enable, 0 = disable(default depending on gfx))"); 397 305 module_param_named(ngg, amdgpu_ngg, int, 0444); 398 306 307 + /** 308 + * DOC: prim_buf_per_se (int) 309 + * Override the size of Primitive Buffer per Shader Engine in Byte. The default is 0 (depending on gfx). 310 + */ 399 311 MODULE_PARM_DESC(prim_buf_per_se, "the size of Primitive Buffer per Shader Engine (default depending on gfx)"); 400 312 module_param_named(prim_buf_per_se, amdgpu_prim_buf_per_se, int, 0444); 401 313 314 + /** 315 + * DOC: pos_buf_per_se (int) 316 + * Override the size of Position Buffer per Shader Engine in Byte. The default is 0 (depending on gfx). 317 + */ 402 318 MODULE_PARM_DESC(pos_buf_per_se, "the size of Position Buffer per Shader Engine (default depending on gfx)"); 403 319 module_param_named(pos_buf_per_se, amdgpu_pos_buf_per_se, int, 0444); 404 320 321 + /** 322 + * DOC: cntl_sb_buf_per_se (int) 323 + * Override the size of Control Sideband per Shader Engine in Byte. The default is 0 (depending on gfx). 324 + */ 405 325 MODULE_PARM_DESC(cntl_sb_buf_per_se, "the size of Control Sideband per Shader Engine (default depending on gfx)"); 406 326 module_param_named(cntl_sb_buf_per_se, amdgpu_cntl_sb_buf_per_se, int, 0444); 407 327 328 + /** 329 + * DOC: param_buf_per_se (int) 330 + * Override the size of Off-Chip Pramater Cache per Shader Engine in Byte. The default is 0 (depending on gfx). 331 + */ 408 332 MODULE_PARM_DESC(param_buf_per_se, "the size of Off-Chip Pramater Cache per Shader Engine (default depending on gfx)"); 409 333 module_param_named(param_buf_per_se, amdgpu_param_buf_per_se, int, 0444); 410 334 335 + /** 336 + * DOC: job_hang_limit (int) 337 + * Set how much time allow a job hang and not drop it. The default is 0. 338 + */ 411 339 MODULE_PARM_DESC(job_hang_limit, "how much time allow a job hang and not drop it (default 0)"); 412 340 module_param_named(job_hang_limit, amdgpu_job_hang_limit, int ,0444); 413 341 342 + /** 343 + * DOC: lbpw (int) 344 + * Override Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable). The default is -1 (auto, enabled). 345 + */ 414 346 MODULE_PARM_DESC(lbpw, "Load Balancing Per Watt (LBPW) support (1 = enable, 0 = disable, -1 = auto)"); 415 347 module_param_named(lbpw, amdgpu_lbpw, int, 0444); 416 348 417 349 MODULE_PARM_DESC(compute_multipipe, "Force compute queues to be spread across pipes (1 = enable, 0 = disable, -1 = auto)"); 418 350 module_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444); 419 351 352 + /** 353 + * DOC: gpu_recovery (int) 354 + * Set to enable GPU recovery mechanism (1 = enable, 0 = disable). The default is -1 (auto, disabled except SRIOV). 355 + */ 420 356 MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto)"); 421 357 module_param_named(gpu_recovery, amdgpu_gpu_recovery, int, 0444); 422 358 359 + /** 360 + * DOC: emu_mode (int) 361 + * Set value 1 to enable emulation mode. This is only needed when running on an emulator. The default is 0 (disabled). 362 + */ 423 363 MODULE_PARM_DESC(emu_mode, "Emulation mode, (1 = enable, 0 = disable)"); 424 364 module_param_named(emu_mode, amdgpu_emu_mode, int, 0444); 425 365 366 + /** 367 + * DOC: si_support (int) 368 + * Set SI support driver. This parameter works after set config CONFIG_DRM_AMDGPU_SI. For SI asic, when radeon driver is enabled, 369 + * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available, 370 + * otherwise using amdgpu driver. 371 + */ 426 372 #ifdef CONFIG_DRM_AMDGPU_SI 427 373 428 374 #if defined(CONFIG_DRM_RADEON) || defined(CONFIG_DRM_RADEON_MODULE) ··· 513 305 module_param_named(si_support, amdgpu_si_support, int, 0444); 514 306 #endif 515 307 308 + /** 309 + * DOC: cik_support (int) 310 + * Set CIK support driver. This parameter works after set config CONFIG_DRM_AMDGPU_CIK. For CIK asic, when radeon driver is enabled, 311 + * set value 0 to use radeon driver, while set value 1 to use amdgpu driver. The default is using radeon driver when it available, 312 + * otherwise using amdgpu driver. 313 + */ 516 314 #ifdef CONFIG_DRM_AMDGPU_CIK 517 315 518 316 #if defined(CONFIG_DRM_RADEON) || defined(CONFIG_DRM_RADEON_MODULE) ··· 532 318 module_param_named(cik_support, amdgpu_cik_support, int, 0444); 533 319 #endif 534 320 321 + /** 322 + * DOC: smu_memory_pool_size (uint) 323 + * It is used to reserve gtt for smu debug usage, setting value 0 to disable it. The actual size is value * 256MiB. 324 + * E.g. 0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte. The default is 0 (disabled). 325 + */ 535 326 MODULE_PARM_DESC(smu_memory_pool_size, 536 327 "reserve gtt for smu debug usage, 0 = disable," 537 328 "0x1 = 256Mbyte, 0x2 = 512Mbyte, 0x4 = 1 Gbyte, 0x8 = 2GByte"); ··· 883 664 err_pci: 884 665 pci_disable_device(pdev); 885 666 err_free: 886 - drm_dev_unref(dev); 667 + drm_dev_put(dev); 887 668 return ret; 888 669 } 889 670 ··· 893 674 struct drm_device *dev = pci_get_drvdata(pdev); 894 675 895 676 drm_dev_unregister(dev); 896 - drm_dev_unref(dev); 677 + drm_dev_put(dev); 897 678 pci_disable_device(pdev); 898 679 pci_set_drvdata(pdev, NULL); 899 680 } ··· 1079 860 struct drm_file *file_priv = f->private_data; 1080 861 struct amdgpu_fpriv *fpriv = file_priv->driver_priv; 1081 862 1082 - amdgpu_ctx_mgr_entity_fini(&fpriv->ctx_mgr); 863 + amdgpu_ctx_mgr_entity_flush(&fpriv->ctx_mgr); 1083 864 1084 865 return 0; 1085 866 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
··· 146 146 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 147 147 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | 148 148 AMDGPU_GEM_CREATE_VRAM_CLEARED, 149 - true, NULL, &gobj); 149 + ttm_bo_type_kernel, NULL, &gobj); 150 150 if (ret) { 151 151 pr_err("failed to allocate framebuffer (%d)\n", aligned_size); 152 152 return -ENOMEM;
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
··· 234 234 } 235 235 236 236 t = offset / AMDGPU_GPU_PAGE_SIZE; 237 - p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 237 + p = t / AMDGPU_GPU_PAGES_IN_CPU_PAGE; 238 238 for (i = 0; i < pages; i++, p++) { 239 239 #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS 240 240 adev->gart.pages[p] = NULL; ··· 243 243 if (!adev->gart.ptr) 244 244 continue; 245 245 246 - for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 246 + for (j = 0; j < AMDGPU_GPU_PAGES_IN_CPU_PAGE; j++, t++) { 247 247 amdgpu_gmc_set_pte_pde(adev, adev->gart.ptr, 248 248 t, page_base, flags); 249 249 page_base += AMDGPU_GPU_PAGE_SIZE; ··· 282 282 283 283 for (i = 0; i < pages; i++) { 284 284 page_base = dma_addr[i]; 285 - for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 285 + for (j = 0; j < AMDGPU_GPU_PAGES_IN_CPU_PAGE; j++, t++) { 286 286 amdgpu_gmc_set_pte_pde(adev, dst, t, page_base, flags); 287 287 page_base += AMDGPU_GPU_PAGE_SIZE; 288 288 } ··· 319 319 320 320 #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS 321 321 t = offset / AMDGPU_GPU_PAGE_SIZE; 322 - p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 322 + p = t / AMDGPU_GPU_PAGES_IN_CPU_PAGE; 323 323 for (i = 0; i < pages; i++, p++) 324 324 adev->gart.pages[p] = pagelist ? pagelist[i] : NULL; 325 325 #endif
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
··· 37 37 #define AMDGPU_GPU_PAGE_SHIFT 12 38 38 #define AMDGPU_GPU_PAGE_ALIGN(a) (((a) + AMDGPU_GPU_PAGE_MASK) & ~AMDGPU_GPU_PAGE_MASK) 39 39 40 + #define AMDGPU_GPU_PAGES_IN_CPU_PAGE (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE) 41 + 40 42 struct amdgpu_gart { 41 43 u64 table_addr; 42 44 struct amdgpu_bo *robj;
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 265 265 266 266 r = amdgpu_gem_object_create(adev, size, args->in.alignment, 267 267 (u32)(0xffffffff & args->in.domains), 268 - flags, false, resv, &gobj); 268 + flags, ttm_bo_type_device, resv, &gobj); 269 269 if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) { 270 270 if (!r) { 271 271 struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj); ··· 317 317 318 318 /* create a gem object to contain this object in */ 319 319 r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU, 320 - 0, 0, NULL, &gobj); 320 + 0, ttm_bo_type_device, NULL, &gobj); 321 321 if (r) 322 322 return r; 323 323 ··· 766 766 amdgpu_display_supported_domains(adev)); 767 767 r = amdgpu_gem_object_create(adev, args->size, 0, domain, 768 768 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 769 - false, NULL, &gobj); 769 + ttm_bo_type_device, NULL, &gobj); 770 770 if (r) 771 771 return -ENOMEM; 772 772
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
··· 231 231 if (ib->flags & AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE) 232 232 fence_flags |= AMDGPU_FENCE_FLAG_TC_WB_ONLY; 233 233 234 + /* wrap the last IB with fence */ 235 + if (job && job->uf_addr) { 236 + amdgpu_ring_emit_fence(ring, job->uf_addr, job->uf_sequence, 237 + fence_flags | AMDGPU_FENCE_FLAG_64BIT); 238 + } 239 + 234 240 r = amdgpu_fence_emit(ring, f, fence_flags); 235 241 if (r) { 236 242 dev_err(adev->dev, "failed to emit fence (%d)\n", r); ··· 248 242 249 243 if (ring->funcs->insert_end) 250 244 ring->funcs->insert_end(ring); 251 - 252 - /* wrap the last IB with fence */ 253 - if (job && job->uf_addr) { 254 - amdgpu_ring_emit_fence(ring, job->uf_addr, job->uf_sequence, 255 - fence_flags | AMDGPU_FENCE_FLAG_64BIT); 256 - } 257 245 258 246 if (patch_offset != ~0 && ring->funcs->patch_cond_exec) 259 247 amdgpu_ring_patch_cond_exec(ring, patch_offset);
-5
drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
··· 578 578 list_add_tail(&id_mgr->ids[j].list, &id_mgr->ids_lru); 579 579 } 580 580 } 581 - 582 - adev->vm_manager.fence_context = 583 - dma_fence_context_alloc(AMDGPU_MAX_RINGS); 584 - for (i = 0; i < AMDGPU_MAX_RINGS; ++i) 585 - adev->vm_manager.seqno[i] = 0; 586 581 } 587 582 588 583 /**
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
··· 58 58 * 59 59 * @adev: amdgpu device pointer 60 60 * @mm: process address space 61 - * @mn: MMU notifier structur 61 + * @mn: MMU notifier structure 62 + * @type: type of MMU notifier 62 63 * @work: destruction work item 63 64 * @node: hash table node to find structure by adev and mn 64 65 * @lock: rw semaphore protecting the notifier nodes ··· 267 266 * amdgpu_mn_invalidate_range_start_hsa - callback to notify about mm change 268 267 * 269 268 * @mn: our notifier 270 - * @mn: the mm this callback is about 269 + * @mm: the mm this callback is about 271 270 * @start: start of updated range 272 271 * @end: end of updated range 273 272 *
+45 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 918 918 return -EINVAL; 919 919 } 920 920 921 + /** 922 + * DOC: busy_percent 923 + * 924 + * The amdgpu driver provides a sysfs API for reading how busy the GPU 925 + * is as a percentage. The file gpu_busy_percent is used for this. 926 + * The SMU firmware computes a percentage of load based on the 927 + * aggregate activity level in the IP cores. 928 + */ 929 + static ssize_t amdgpu_get_busy_percent(struct device *dev, 930 + struct device_attribute *attr, 931 + char *buf) 932 + { 933 + struct drm_device *ddev = dev_get_drvdata(dev); 934 + struct amdgpu_device *adev = ddev->dev_private; 935 + int r, value, size = sizeof(value); 936 + 937 + /* sanity check PP is enabled */ 938 + if (!(adev->powerplay.pp_funcs && 939 + adev->powerplay.pp_funcs->read_sensor)) 940 + return -EINVAL; 941 + 942 + /* read the IP busy sensor */ 943 + r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_LOAD, 944 + (void *)&value, &size); 945 + if (r) 946 + return r; 947 + 948 + return snprintf(buf, PAGE_SIZE, "%d\n", value); 949 + } 950 + 921 951 static DEVICE_ATTR(power_dpm_state, S_IRUGO | S_IWUSR, amdgpu_get_dpm_state, amdgpu_set_dpm_state); 922 952 static DEVICE_ATTR(power_dpm_force_performance_level, S_IRUGO | S_IWUSR, 923 953 amdgpu_get_dpm_forced_performance_level, ··· 981 951 static DEVICE_ATTR(pp_od_clk_voltage, S_IRUGO | S_IWUSR, 982 952 amdgpu_get_pp_od_clk_voltage, 983 953 amdgpu_set_pp_od_clk_voltage); 954 + static DEVICE_ATTR(gpu_busy_percent, S_IRUGO, 955 + amdgpu_get_busy_percent, NULL); 984 956 985 957 static ssize_t amdgpu_hwmon_show_temp(struct device *dev, 986 958 struct device_attribute *attr, ··· 1729 1697 1730 1698 void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable) 1731 1699 { 1732 - if (adev->powerplay.pp_funcs->powergate_uvd) { 1700 + if (adev->powerplay.pp_funcs->set_powergating_by_smu) { 1733 1701 /* enable/disable UVD */ 1734 1702 mutex_lock(&adev->pm.mutex); 1735 - amdgpu_dpm_powergate_uvd(adev, !enable); 1703 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable); 1736 1704 mutex_unlock(&adev->pm.mutex); 1737 1705 } else { 1738 1706 if (enable) { ··· 1751 1719 1752 1720 void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable) 1753 1721 { 1754 - if (adev->powerplay.pp_funcs->powergate_vce) { 1722 + if (adev->powerplay.pp_funcs->set_powergating_by_smu) { 1755 1723 /* enable/disable VCE */ 1756 1724 mutex_lock(&adev->pm.mutex); 1757 - amdgpu_dpm_powergate_vce(adev, !enable); 1725 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable); 1758 1726 mutex_unlock(&adev->pm.mutex); 1759 1727 } else { 1760 1728 if (enable) { ··· 1886 1854 "pp_od_clk_voltage\n"); 1887 1855 return ret; 1888 1856 } 1857 + ret = device_create_file(adev->dev, 1858 + &dev_attr_gpu_busy_percent); 1859 + if (ret) { 1860 + DRM_ERROR("failed to create device file " 1861 + "gpu_busy_level\n"); 1862 + return ret; 1863 + } 1889 1864 ret = amdgpu_debugfs_pm_init(adev); 1890 1865 if (ret) { 1891 1866 DRM_ERROR("Failed to register debugfs file for dpm!\n"); ··· 1928 1889 &dev_attr_pp_power_profile_mode); 1929 1890 device_remove_file(adev->dev, 1930 1891 &dev_attr_pp_od_clk_voltage); 1892 + device_remove_file(adev->dev, &dev_attr_gpu_busy_percent); 1931 1893 } 1932 1894 1933 1895 void amdgpu_pm_compute_clocks(struct amdgpu_device *adev) ··· 1959 1919 if (!amdgpu_device_has_dc_support(adev)) { 1960 1920 mutex_lock(&adev->pm.mutex); 1961 1921 amdgpu_dpm_get_active_displays(adev); 1962 - adev->pm.pm_display_cfg.num_display = adev->pm.dpm.new_active_crtcs; 1922 + adev->pm.pm_display_cfg.num_display = adev->pm.dpm.new_active_crtc_count; 1963 1923 adev->pm.pm_display_cfg.vrefresh = amdgpu_dpm_get_vrefresh(adev); 1964 1924 adev->pm.pm_display_cfg.min_vblank_time = amdgpu_dpm_get_vblank_time(adev); 1965 1925 /* we have issues with mclk switching with refresh rates over 120 hz on the non-DC code. */
-1
drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
··· 191 191 /** 192 192 * amdgpu_gem_map_attach - &dma_buf_ops.attach implementation 193 193 * @dma_buf: shared DMA buffer 194 - * @target_dev: target device 195 194 * @attach: DMA-buf attachment 196 195 * 197 196 * Makes sure that the shared DMA buffer can be accessed by the target device.
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 1 2 /* 2 3 * Copyright 2009 VMware, Inc. 3 4 *
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 162 162 static void amdgpu_ttm_global_fini(struct amdgpu_device *adev) 163 163 { 164 164 if (adev->mman.mem_global_referenced) { 165 - drm_sched_entity_fini(adev->mman.entity.sched, 165 + drm_sched_entity_destroy(adev->mman.entity.sched, 166 166 &adev->mman.entity); 167 167 mutex_destroy(&adev->mman.gtt_window_lock); 168 168 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 53 53 54 54 /* Firmware Names */ 55 55 #ifdef CONFIG_DRM_AMDGPU_CIK 56 - #define FIRMWARE_BONAIRE "radeon/bonaire_uvd.bin" 57 - #define FIRMWARE_KABINI "radeon/kabini_uvd.bin" 58 - #define FIRMWARE_KAVERI "radeon/kaveri_uvd.bin" 59 - #define FIRMWARE_HAWAII "radeon/hawaii_uvd.bin" 60 - #define FIRMWARE_MULLINS "radeon/mullins_uvd.bin" 56 + #define FIRMWARE_BONAIRE "amdgpu/bonaire_uvd.bin" 57 + #define FIRMWARE_KABINI "amdgpu/kabini_uvd.bin" 58 + #define FIRMWARE_KAVERI "amdgpu/kaveri_uvd.bin" 59 + #define FIRMWARE_HAWAII "amdgpu/hawaii_uvd.bin" 60 + #define FIRMWARE_MULLINS "amdgpu/mullins_uvd.bin" 61 61 #endif 62 62 #define FIRMWARE_TONGA "amdgpu/tonga_uvd.bin" 63 63 #define FIRMWARE_CARRIZO "amdgpu/carrizo_uvd.bin" ··· 309 309 for (j = 0; j < adev->uvd.num_uvd_inst; ++j) { 310 310 kfree(adev->uvd.inst[j].saved_bo); 311 311 312 - drm_sched_entity_fini(&adev->uvd.inst[j].ring.sched, &adev->uvd.inst[j].entity); 312 + drm_sched_entity_destroy(&adev->uvd.inst[j].ring.sched, &adev->uvd.inst[j].entity); 313 313 314 314 amdgpu_bo_free_kernel(&adev->uvd.inst[j].vcpu_bo, 315 315 &adev->uvd.inst[j].gpu_addr,
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 40 40 41 41 /* Firmware Names */ 42 42 #ifdef CONFIG_DRM_AMDGPU_CIK 43 - #define FIRMWARE_BONAIRE "radeon/bonaire_vce.bin" 44 - #define FIRMWARE_KABINI "radeon/kabini_vce.bin" 45 - #define FIRMWARE_KAVERI "radeon/kaveri_vce.bin" 46 - #define FIRMWARE_HAWAII "radeon/hawaii_vce.bin" 47 - #define FIRMWARE_MULLINS "radeon/mullins_vce.bin" 43 + #define FIRMWARE_BONAIRE "amdgpu/bonaire_vce.bin" 44 + #define FIRMWARE_KABINI "amdgpu/kabini_vce.bin" 45 + #define FIRMWARE_KAVERI "amdgpu/kaveri_vce.bin" 46 + #define FIRMWARE_HAWAII "amdgpu/hawaii_vce.bin" 47 + #define FIRMWARE_MULLINS "amdgpu/mullins_vce.bin" 48 48 #endif 49 49 #define FIRMWARE_TONGA "amdgpu/tonga_vce.bin" 50 50 #define FIRMWARE_CARRIZO "amdgpu/carrizo_vce.bin" ··· 222 222 if (adev->vce.vcpu_bo == NULL) 223 223 return 0; 224 224 225 - drm_sched_entity_fini(&adev->vce.ring[0].sched, &adev->vce.entity); 225 + drm_sched_entity_destroy(&adev->vce.ring[0].sched, &adev->vce.entity); 226 226 227 227 amdgpu_bo_free_kernel(&adev->vce.vcpu_bo, &adev->vce.gpu_addr, 228 228 (void **)&adev->vce.cpu_addr);
+7 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 1082 1082 struct amdgpu_vm_bo_base, 1083 1083 vm_status); 1084 1084 bo_base->moved = false; 1085 - list_move(&bo_base->vm_status, &vm->idle); 1085 + list_del_init(&bo_base->vm_status); 1086 1086 1087 1087 bo = bo_base->bo->parent; 1088 1088 if (!bo) ··· 1567 1567 if (nodes) { 1568 1568 addr = nodes->start << PAGE_SHIFT; 1569 1569 max_entries = (nodes->size - pfn) * 1570 - (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 1570 + AMDGPU_GPU_PAGES_IN_CPU_PAGE; 1571 1571 } else { 1572 1572 addr = 0; 1573 1573 max_entries = S64_MAX; ··· 1578 1578 1579 1579 max_entries = min(max_entries, 16ull * 1024ull); 1580 1580 for (count = 1; 1581 - count < max_entries / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 1581 + count < max_entries / AMDGPU_GPU_PAGES_IN_CPU_PAGE; 1582 1582 ++count) { 1583 1583 uint64_t idx = pfn + count; 1584 1584 ··· 1592 1592 dma_addr = pages_addr; 1593 1593 } else { 1594 1594 addr = pages_addr[pfn]; 1595 - max_entries = count * (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 1595 + max_entries = count * AMDGPU_GPU_PAGES_IN_CPU_PAGE; 1596 1596 } 1597 1597 1598 1598 } else if (flags & AMDGPU_PTE_VALID) { ··· 1607 1607 if (r) 1608 1608 return r; 1609 1609 1610 - pfn += (last - start + 1) / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 1610 + pfn += (last - start + 1) / AMDGPU_GPU_PAGES_IN_CPU_PAGE; 1611 1611 if (nodes && nodes->size == pfn) { 1612 1612 pfn = 0; 1613 1613 ++nodes; ··· 2643 2643 vm->root.base.bo = NULL; 2644 2644 2645 2645 error_free_sched_entity: 2646 - drm_sched_entity_fini(&ring->sched, &vm->entity); 2646 + drm_sched_entity_destroy(&ring->sched, &vm->entity); 2647 2647 2648 2648 return r; 2649 2649 } ··· 2780 2780 spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags); 2781 2781 } 2782 2782 2783 - drm_sched_entity_fini(vm->entity.sched, &vm->entity); 2783 + drm_sched_entity_destroy(vm->entity.sched, &vm->entity); 2784 2784 2785 2785 if (!RB_EMPTY_ROOT(&vm->va.rb_root)) { 2786 2786 dev_err(adev->dev, "still active bo inside vm\n");
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
··· 112 112 unsigned pages = mem->num_pages; 113 113 u64 usage = 0; 114 114 115 - if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size) 115 + if (amdgpu_gmc_vram_full_visible(&adev->gmc)) 116 116 return 0; 117 117 118 118 if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
+1 -1
drivers/gpu/drm/amd/amdgpu/atom.c
··· 1221 1221 ectx.abort = false; 1222 1222 ectx.last_jump = 0; 1223 1223 if (ws) 1224 - ectx.ws = kcalloc(4, ws, GFP_ATOMIC); 1224 + ectx.ws = kcalloc(4, ws, GFP_KERNEL); 1225 1225 else 1226 1226 ectx.ws = NULL; 1227 1227
+20 -8
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
··· 49 49 #include "gmc/gmc_7_1_d.h" 50 50 #include "gmc/gmc_7_1_sh_mask.h" 51 51 52 - MODULE_FIRMWARE("radeon/bonaire_smc.bin"); 53 - MODULE_FIRMWARE("radeon/bonaire_k_smc.bin"); 54 - MODULE_FIRMWARE("radeon/hawaii_smc.bin"); 55 - MODULE_FIRMWARE("radeon/hawaii_k_smc.bin"); 52 + MODULE_FIRMWARE("amdgpu/bonaire_smc.bin"); 53 + MODULE_FIRMWARE("amdgpu/bonaire_k_smc.bin"); 54 + MODULE_FIRMWARE("amdgpu/hawaii_smc.bin"); 55 + MODULE_FIRMWARE("amdgpu/hawaii_k_smc.bin"); 56 56 57 57 #define MC_CG_ARB_FREQ_F0 0x0a 58 58 #define MC_CG_ARB_FREQ_F1 0x0b ··· 5815 5815 default: BUG(); 5816 5816 } 5817 5817 5818 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 5818 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_smc.bin", chip_name); 5819 5819 err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 5820 5820 if (err) 5821 5821 goto out; ··· 5846 5846 adev->pm.dpm.priv = pi; 5847 5847 5848 5848 pi->sys_pcie_mask = 5849 - (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) >> 5850 - CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT; 5849 + adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK; 5851 5850 5852 5851 pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID; 5853 5852 ··· 6766 6767 } 6767 6768 } 6768 6769 6770 + static int ci_set_powergating_by_smu(void *handle, 6771 + uint32_t block_type, bool gate) 6772 + { 6773 + switch (block_type) { 6774 + case AMD_IP_BLOCK_TYPE_UVD: 6775 + ci_dpm_powergate_uvd(handle, gate); 6776 + break; 6777 + default: 6778 + break; 6779 + } 6780 + return 0; 6781 + } 6782 + 6769 6783 static const struct amd_ip_funcs ci_dpm_ip_funcs = { 6770 6784 .name = "ci_dpm", 6771 6785 .early_init = ci_dpm_early_init, ··· 6816 6804 .debugfs_print_current_performance_level = &ci_dpm_debugfs_print_current_performance_level, 6817 6805 .force_performance_level = &ci_dpm_force_performance_level, 6818 6806 .vblank_too_short = &ci_dpm_vblank_too_short, 6819 - .powergate_uvd = &ci_dpm_powergate_uvd, 6807 + .set_powergating_by_smu = &ci_set_powergating_by_smu, 6820 6808 .set_fan_control_mode = &ci_dpm_set_fan_control_mode, 6821 6809 .get_fan_control_mode = &ci_dpm_get_fan_control_mode, 6822 6810 .set_fan_speed_percent = &ci_dpm_set_fan_speed_percent,
+18 -18
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 54 54 static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev); 55 55 static int cik_sdma_soft_reset(void *handle); 56 56 57 - MODULE_FIRMWARE("radeon/bonaire_sdma.bin"); 58 - MODULE_FIRMWARE("radeon/bonaire_sdma1.bin"); 59 - MODULE_FIRMWARE("radeon/hawaii_sdma.bin"); 60 - MODULE_FIRMWARE("radeon/hawaii_sdma1.bin"); 61 - MODULE_FIRMWARE("radeon/kaveri_sdma.bin"); 62 - MODULE_FIRMWARE("radeon/kaveri_sdma1.bin"); 63 - MODULE_FIRMWARE("radeon/kabini_sdma.bin"); 64 - MODULE_FIRMWARE("radeon/kabini_sdma1.bin"); 65 - MODULE_FIRMWARE("radeon/mullins_sdma.bin"); 66 - MODULE_FIRMWARE("radeon/mullins_sdma1.bin"); 57 + MODULE_FIRMWARE("amdgpu/bonaire_sdma.bin"); 58 + MODULE_FIRMWARE("amdgpu/bonaire_sdma1.bin"); 59 + MODULE_FIRMWARE("amdgpu/hawaii_sdma.bin"); 60 + MODULE_FIRMWARE("amdgpu/hawaii_sdma1.bin"); 61 + MODULE_FIRMWARE("amdgpu/kaveri_sdma.bin"); 62 + MODULE_FIRMWARE("amdgpu/kaveri_sdma1.bin"); 63 + MODULE_FIRMWARE("amdgpu/kabini_sdma.bin"); 64 + MODULE_FIRMWARE("amdgpu/kabini_sdma1.bin"); 65 + MODULE_FIRMWARE("amdgpu/mullins_sdma.bin"); 66 + MODULE_FIRMWARE("amdgpu/mullins_sdma1.bin"); 67 67 68 68 u32 amdgpu_cik_gpu_check_soft_reset(struct amdgpu_device *adev); 69 69 ··· 132 132 133 133 for (i = 0; i < adev->sdma.num_instances; i++) { 134 134 if (i == 0) 135 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name); 135 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 136 136 else 137 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma1.bin", chip_name); 137 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 138 138 err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev); 139 139 if (err) 140 140 goto out; ··· 177 177 static uint64_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring) 178 178 { 179 179 struct amdgpu_device *adev = ring->adev; 180 - u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 181 180 182 - return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) & 0x3fffc) >> 2; 181 + return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) & 0x3fffc) >> 2; 183 182 } 184 183 185 184 /** ··· 191 192 static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring) 192 193 { 193 194 struct amdgpu_device *adev = ring->adev; 194 - u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 195 195 196 - WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], 196 + WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], 197 197 (lower_32_bits(ring->wptr) << 2) & 0x3fffc); 198 198 } 199 199 ··· 246 248 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ 247 249 u32 ref_and_mask; 248 250 249 - if (ring == &ring->adev->sdma.instance[0].ring) 251 + if (ring->me == 0) 250 252 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA0_MASK; 251 253 else 252 254 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA1_MASK; ··· 1288 1290 { 1289 1291 int i; 1290 1292 1291 - for (i = 0; i < adev->sdma.num_instances; i++) 1293 + for (i = 0; i < adev->sdma.num_instances; i++) { 1292 1294 adev->sdma.instance[i].ring.funcs = &cik_sdma_ring_funcs; 1295 + adev->sdma.instance[i].ring.me = i; 1296 + } 1293 1297 } 1294 1298 1295 1299 static const struct amdgpu_irq_src_funcs cik_sdma_trap_irq_funcs = {
+24 -24
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
··· 44 44 static void gfx_v6_0_set_irq_funcs(struct amdgpu_device *adev); 45 45 static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev); 46 46 47 - MODULE_FIRMWARE("radeon/tahiti_pfp.bin"); 48 - MODULE_FIRMWARE("radeon/tahiti_me.bin"); 49 - MODULE_FIRMWARE("radeon/tahiti_ce.bin"); 50 - MODULE_FIRMWARE("radeon/tahiti_rlc.bin"); 47 + MODULE_FIRMWARE("amdgpu/tahiti_pfp.bin"); 48 + MODULE_FIRMWARE("amdgpu/tahiti_me.bin"); 49 + MODULE_FIRMWARE("amdgpu/tahiti_ce.bin"); 50 + MODULE_FIRMWARE("amdgpu/tahiti_rlc.bin"); 51 51 52 - MODULE_FIRMWARE("radeon/pitcairn_pfp.bin"); 53 - MODULE_FIRMWARE("radeon/pitcairn_me.bin"); 54 - MODULE_FIRMWARE("radeon/pitcairn_ce.bin"); 55 - MODULE_FIRMWARE("radeon/pitcairn_rlc.bin"); 52 + MODULE_FIRMWARE("amdgpu/pitcairn_pfp.bin"); 53 + MODULE_FIRMWARE("amdgpu/pitcairn_me.bin"); 54 + MODULE_FIRMWARE("amdgpu/pitcairn_ce.bin"); 55 + MODULE_FIRMWARE("amdgpu/pitcairn_rlc.bin"); 56 56 57 - MODULE_FIRMWARE("radeon/verde_pfp.bin"); 58 - MODULE_FIRMWARE("radeon/verde_me.bin"); 59 - MODULE_FIRMWARE("radeon/verde_ce.bin"); 60 - MODULE_FIRMWARE("radeon/verde_rlc.bin"); 57 + MODULE_FIRMWARE("amdgpu/verde_pfp.bin"); 58 + MODULE_FIRMWARE("amdgpu/verde_me.bin"); 59 + MODULE_FIRMWARE("amdgpu/verde_ce.bin"); 60 + MODULE_FIRMWARE("amdgpu/verde_rlc.bin"); 61 61 62 - MODULE_FIRMWARE("radeon/oland_pfp.bin"); 63 - MODULE_FIRMWARE("radeon/oland_me.bin"); 64 - MODULE_FIRMWARE("radeon/oland_ce.bin"); 65 - MODULE_FIRMWARE("radeon/oland_rlc.bin"); 62 + MODULE_FIRMWARE("amdgpu/oland_pfp.bin"); 63 + MODULE_FIRMWARE("amdgpu/oland_me.bin"); 64 + MODULE_FIRMWARE("amdgpu/oland_ce.bin"); 65 + MODULE_FIRMWARE("amdgpu/oland_rlc.bin"); 66 66 67 - MODULE_FIRMWARE("radeon/hainan_pfp.bin"); 68 - MODULE_FIRMWARE("radeon/hainan_me.bin"); 69 - MODULE_FIRMWARE("radeon/hainan_ce.bin"); 70 - MODULE_FIRMWARE("radeon/hainan_rlc.bin"); 67 + MODULE_FIRMWARE("amdgpu/hainan_pfp.bin"); 68 + MODULE_FIRMWARE("amdgpu/hainan_me.bin"); 69 + MODULE_FIRMWARE("amdgpu/hainan_ce.bin"); 70 + MODULE_FIRMWARE("amdgpu/hainan_rlc.bin"); 71 71 72 72 static u32 gfx_v6_0_get_csb_size(struct amdgpu_device *adev); 73 73 static void gfx_v6_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer); ··· 335 335 default: BUG(); 336 336 } 337 337 338 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 338 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 339 339 err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 340 340 if (err) 341 341 goto out; ··· 346 346 adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); 347 347 adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 348 348 349 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 349 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 350 350 err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 351 351 if (err) 352 352 goto out; ··· 357 357 adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); 358 358 adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 359 359 360 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 360 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 361 361 err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 362 362 if (err) 363 363 goto out; ··· 368 368 adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); 369 369 adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 370 370 371 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); 371 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 372 372 err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 373 373 if (err) 374 374 goto out;
+32 -32
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 57 57 static void gfx_v7_0_set_irq_funcs(struct amdgpu_device *adev); 58 58 static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev); 59 59 60 - MODULE_FIRMWARE("radeon/bonaire_pfp.bin"); 61 - MODULE_FIRMWARE("radeon/bonaire_me.bin"); 62 - MODULE_FIRMWARE("radeon/bonaire_ce.bin"); 63 - MODULE_FIRMWARE("radeon/bonaire_rlc.bin"); 64 - MODULE_FIRMWARE("radeon/bonaire_mec.bin"); 60 + MODULE_FIRMWARE("amdgpu/bonaire_pfp.bin"); 61 + MODULE_FIRMWARE("amdgpu/bonaire_me.bin"); 62 + MODULE_FIRMWARE("amdgpu/bonaire_ce.bin"); 63 + MODULE_FIRMWARE("amdgpu/bonaire_rlc.bin"); 64 + MODULE_FIRMWARE("amdgpu/bonaire_mec.bin"); 65 65 66 - MODULE_FIRMWARE("radeon/hawaii_pfp.bin"); 67 - MODULE_FIRMWARE("radeon/hawaii_me.bin"); 68 - MODULE_FIRMWARE("radeon/hawaii_ce.bin"); 69 - MODULE_FIRMWARE("radeon/hawaii_rlc.bin"); 70 - MODULE_FIRMWARE("radeon/hawaii_mec.bin"); 66 + MODULE_FIRMWARE("amdgpu/hawaii_pfp.bin"); 67 + MODULE_FIRMWARE("amdgpu/hawaii_me.bin"); 68 + MODULE_FIRMWARE("amdgpu/hawaii_ce.bin"); 69 + MODULE_FIRMWARE("amdgpu/hawaii_rlc.bin"); 70 + MODULE_FIRMWARE("amdgpu/hawaii_mec.bin"); 71 71 72 - MODULE_FIRMWARE("radeon/kaveri_pfp.bin"); 73 - MODULE_FIRMWARE("radeon/kaveri_me.bin"); 74 - MODULE_FIRMWARE("radeon/kaveri_ce.bin"); 75 - MODULE_FIRMWARE("radeon/kaveri_rlc.bin"); 76 - MODULE_FIRMWARE("radeon/kaveri_mec.bin"); 77 - MODULE_FIRMWARE("radeon/kaveri_mec2.bin"); 72 + MODULE_FIRMWARE("amdgpu/kaveri_pfp.bin"); 73 + MODULE_FIRMWARE("amdgpu/kaveri_me.bin"); 74 + MODULE_FIRMWARE("amdgpu/kaveri_ce.bin"); 75 + MODULE_FIRMWARE("amdgpu/kaveri_rlc.bin"); 76 + MODULE_FIRMWARE("amdgpu/kaveri_mec.bin"); 77 + MODULE_FIRMWARE("amdgpu/kaveri_mec2.bin"); 78 78 79 - MODULE_FIRMWARE("radeon/kabini_pfp.bin"); 80 - MODULE_FIRMWARE("radeon/kabini_me.bin"); 81 - MODULE_FIRMWARE("radeon/kabini_ce.bin"); 82 - MODULE_FIRMWARE("radeon/kabini_rlc.bin"); 83 - MODULE_FIRMWARE("radeon/kabini_mec.bin"); 79 + MODULE_FIRMWARE("amdgpu/kabini_pfp.bin"); 80 + MODULE_FIRMWARE("amdgpu/kabini_me.bin"); 81 + MODULE_FIRMWARE("amdgpu/kabini_ce.bin"); 82 + MODULE_FIRMWARE("amdgpu/kabini_rlc.bin"); 83 + MODULE_FIRMWARE("amdgpu/kabini_mec.bin"); 84 84 85 - MODULE_FIRMWARE("radeon/mullins_pfp.bin"); 86 - MODULE_FIRMWARE("radeon/mullins_me.bin"); 87 - MODULE_FIRMWARE("radeon/mullins_ce.bin"); 88 - MODULE_FIRMWARE("radeon/mullins_rlc.bin"); 89 - MODULE_FIRMWARE("radeon/mullins_mec.bin"); 85 + MODULE_FIRMWARE("amdgpu/mullins_pfp.bin"); 86 + MODULE_FIRMWARE("amdgpu/mullins_me.bin"); 87 + MODULE_FIRMWARE("amdgpu/mullins_ce.bin"); 88 + MODULE_FIRMWARE("amdgpu/mullins_rlc.bin"); 89 + MODULE_FIRMWARE("amdgpu/mullins_mec.bin"); 90 90 91 91 static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] = 92 92 { ··· 925 925 default: BUG(); 926 926 } 927 927 928 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 928 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); 929 929 err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); 930 930 if (err) 931 931 goto out; ··· 933 933 if (err) 934 934 goto out; 935 935 936 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 936 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); 937 937 err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); 938 938 if (err) 939 939 goto out; ··· 941 941 if (err) 942 942 goto out; 943 943 944 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 944 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); 945 945 err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); 946 946 if (err) 947 947 goto out; ··· 949 949 if (err) 950 950 goto out; 951 951 952 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name); 952 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); 953 953 err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); 954 954 if (err) 955 955 goto out; ··· 958 958 goto out; 959 959 960 960 if (adev->asic_type == CHIP_KAVERI) { 961 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", chip_name); 961 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 962 962 err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 963 963 if (err) 964 964 goto out; ··· 967 967 goto out; 968 968 } 969 969 970 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); 970 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 971 971 err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); 972 972 if (err) 973 973 goto out;
+87 -33
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 704 704 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200, 705 705 }; 706 706 707 + 708 + static const char * const sq_edc_source_names[] = { 709 + "SQ_EDC_INFO_SOURCE_INVALID: No EDC error has occurred", 710 + "SQ_EDC_INFO_SOURCE_INST: EDC source is Instruction Fetch", 711 + "SQ_EDC_INFO_SOURCE_SGPR: EDC source is SGPR or SQC data return", 712 + "SQ_EDC_INFO_SOURCE_VGPR: EDC source is VGPR", 713 + "SQ_EDC_INFO_SOURCE_LDS: EDC source is LDS", 714 + "SQ_EDC_INFO_SOURCE_GDS: EDC source is GDS", 715 + "SQ_EDC_INFO_SOURCE_TA: EDC source is TA", 716 + }; 717 + 707 718 static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev); 708 719 static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev); 709 720 static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev); ··· 2017 2006 return 0; 2018 2007 } 2019 2008 2009 + static void gfx_v8_0_sq_irq_work_func(struct work_struct *work); 2010 + 2020 2011 static int gfx_v8_0_sw_init(void *handle) 2021 2012 { 2022 2013 int i, j, k, r, ring_id; ··· 2081 2068 DRM_ERROR("amdgpu_irq_add() for SQ failed: %d\n", r); 2082 2069 return r; 2083 2070 } 2071 + 2072 + INIT_WORK(&adev->gfx.sq_work.work, gfx_v8_0_sq_irq_work_func); 2084 2073 2085 2074 adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE; 2086 2075 ··· 5596 5581 return r; 5597 5582 } 5598 5583 5599 - amdgpu_device_ip_set_powergating_state(adev, 5600 - AMD_IP_BLOCK_TYPE_GFX, 5601 - AMD_PG_STATE_GATE); 5602 - 5603 5584 return 0; 5604 5585 } 5605 5586 5606 5587 static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev, 5607 5588 bool enable) 5608 5589 { 5609 - if ((adev->asic_type == CHIP_POLARIS11) || 5590 + if (((adev->asic_type == CHIP_POLARIS11) || 5610 5591 (adev->asic_type == CHIP_POLARIS12) || 5611 - (adev->asic_type == CHIP_VEGAM)) 5592 + (adev->asic_type == CHIP_VEGAM)) && 5593 + adev->powerplay.pp_funcs->set_powergating_by_smu) 5612 5594 /* Send msg to SMU via Powerplay */ 5613 - amdgpu_device_ip_set_powergating_state(adev, 5614 - AMD_IP_BLOCK_TYPE_SMC, 5615 - enable ? 5616 - AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE); 5595 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, enable); 5617 5596 5618 5597 WREG32_FIELD(RLC_PG_CNTL, STATIC_PER_CU_PG_ENABLE, enable ? 1 : 0); 5619 5598 } ··· 6964 6955 return 0; 6965 6956 } 6966 6957 6967 - static int gfx_v8_0_sq_irq(struct amdgpu_device *adev, 6968 - struct amdgpu_irq_src *source, 6969 - struct amdgpu_iv_entry *entry) 6958 + static void gfx_v8_0_parse_sq_irq(struct amdgpu_device *adev, unsigned ih_data) 6970 6959 { 6971 - u8 enc, se_id; 6960 + u32 enc, se_id, sh_id, cu_id; 6972 6961 char type[20]; 6962 + int sq_edc_source = -1; 6973 6963 6974 - /* Parse all fields according to SQ_INTERRUPT* registers */ 6975 - enc = (entry->src_data[0] >> 26) & 0x3; 6976 - se_id = (entry->src_data[0] >> 24) & 0x3; 6964 + enc = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_CMN, ENCODING); 6965 + se_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_CMN, SE_ID); 6977 6966 6978 6967 switch (enc) { 6979 6968 case 0: ··· 6981 6974 "reg_timestamp %d, thread_trace_buff_full %d," 6982 6975 "wlt %d, thread_trace %d.\n", 6983 6976 se_id, 6984 - (entry->src_data[0] >> 7) & 0x1, 6985 - (entry->src_data[0] >> 6) & 0x1, 6986 - (entry->src_data[0] >> 5) & 0x1, 6987 - (entry->src_data[0] >> 4) & 0x1, 6988 - (entry->src_data[0] >> 3) & 0x1, 6989 - (entry->src_data[0] >> 2) & 0x1, 6990 - (entry->src_data[0] >> 1) & 0x1, 6991 - entry->src_data[0] & 0x1 6977 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, IMMED_OVERFLOW), 6978 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, HOST_REG_OVERFLOW), 6979 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, HOST_CMD_OVERFLOW), 6980 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, CMD_TIMESTAMP), 6981 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, REG_TIMESTAMP), 6982 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, THREAD_TRACE_BUF_FULL), 6983 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, WLT), 6984 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_AUTO, THREAD_TRACE) 6992 6985 ); 6993 6986 break; 6994 6987 case 1: 6995 6988 case 2: 6989 + 6990 + cu_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, CU_ID); 6991 + sh_id = REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, SH_ID); 6992 + 6993 + /* 6994 + * This function can be called either directly from ISR 6995 + * or from BH in which case we can access SQ_EDC_INFO 6996 + * instance 6997 + */ 6998 + if (in_task()) { 6999 + mutex_lock(&adev->grbm_idx_mutex); 7000 + gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id); 7001 + 7002 + sq_edc_source = REG_GET_FIELD(RREG32(mmSQ_EDC_INFO), SQ_EDC_INFO, SOURCE); 7003 + 7004 + gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 7005 + mutex_unlock(&adev->grbm_idx_mutex); 7006 + } 6996 7007 6997 7008 if (enc == 1) 6998 7009 sprintf(type, "instruction intr"); ··· 7019 6994 7020 6995 DRM_INFO( 7021 6996 "SQ %s detected: " 7022 - "se_id %d, cu_id %d, simd_id %d, wave_id %d, vm_id %d\n", 7023 - type, se_id, 7024 - (entry->src_data[0] >> 20) & 0xf, 7025 - (entry->src_data[0] >> 18) & 0x3, 7026 - (entry->src_data[0] >> 14) & 0xf, 7027 - (entry->src_data[0] >> 10) & 0xf 7028 - ); 6997 + "se_id %d, sh_id %d, cu_id %d, simd_id %d, wave_id %d, vm_id %d " 6998 + "trap %s, sq_ed_info.source %s.\n", 6999 + type, se_id, sh_id, cu_id, 7000 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, SIMD_ID), 7001 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, WAVE_ID), 7002 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, VM_ID), 7003 + REG_GET_FIELD(ih_data, SQ_INTERRUPT_WORD_WAVE, PRIV) ? "true" : "false", 7004 + (sq_edc_source != -1) ? sq_edc_source_names[sq_edc_source] : "unavailable" 7005 + ); 7029 7006 break; 7030 7007 default: 7031 7008 DRM_ERROR("SQ invalid encoding type\n."); 7032 - return -EINVAL; 7009 + } 7010 + } 7011 + 7012 + static void gfx_v8_0_sq_irq_work_func(struct work_struct *work) 7013 + { 7014 + 7015 + struct amdgpu_device *adev = container_of(work, struct amdgpu_device, gfx.sq_work.work); 7016 + struct sq_work *sq_work = container_of(work, struct sq_work, work); 7017 + 7018 + gfx_v8_0_parse_sq_irq(adev, sq_work->ih_data); 7019 + } 7020 + 7021 + static int gfx_v8_0_sq_irq(struct amdgpu_device *adev, 7022 + struct amdgpu_irq_src *source, 7023 + struct amdgpu_iv_entry *entry) 7024 + { 7025 + unsigned ih_data = entry->src_data[0]; 7026 + 7027 + /* 7028 + * Try to submit work so SQ_EDC_INFO can be accessed from 7029 + * BH. If previous work submission hasn't finished yet 7030 + * just print whatever info is possible directly from the ISR. 7031 + */ 7032 + if (work_pending(&adev->gfx.sq_work.work)) { 7033 + gfx_v8_0_parse_sq_irq(adev, ih_data); 7034 + } else { 7035 + adev->gfx.sq_work.ih_data = ih_data; 7036 + schedule_work(&adev->gfx.sq_work.work); 7033 7037 } 7034 7038 7035 7039 return 0;
+4
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 3714 3714 3715 3715 /* update mgcg state */ 3716 3716 gfx_v9_0_update_gfx_mg_power_gating(adev, enable); 3717 + 3718 + /* set gfx off through smu */ 3719 + if (enable && adev->powerplay.pp_funcs->set_powergating_by_smu) 3720 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true); 3717 3721 break; 3718 3722 default: 3719 3723 break;
+7 -7
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
··· 41 41 static void gmc_v6_0_set_irq_funcs(struct amdgpu_device *adev); 42 42 static int gmc_v6_0_wait_for_idle(void *handle); 43 43 44 - MODULE_FIRMWARE("radeon/tahiti_mc.bin"); 45 - MODULE_FIRMWARE("radeon/pitcairn_mc.bin"); 46 - MODULE_FIRMWARE("radeon/verde_mc.bin"); 47 - MODULE_FIRMWARE("radeon/oland_mc.bin"); 48 - MODULE_FIRMWARE("radeon/si58_mc.bin"); 44 + MODULE_FIRMWARE("amdgpu/tahiti_mc.bin"); 45 + MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin"); 46 + MODULE_FIRMWARE("amdgpu/verde_mc.bin"); 47 + MODULE_FIRMWARE("amdgpu/oland_mc.bin"); 48 + MODULE_FIRMWARE("amdgpu/si58_mc.bin"); 49 49 50 50 #define MC_SEQ_MISC0__MT__MASK 0xf0000000 51 51 #define MC_SEQ_MISC0__MT__GDDR1 0x10000000 ··· 134 134 is_58_fw = true; 135 135 136 136 if (is_58_fw) 137 - snprintf(fw_name, sizeof(fw_name), "radeon/si58_mc.bin"); 137 + snprintf(fw_name, sizeof(fw_name), "amdgpu/si58_mc.bin"); 138 138 else 139 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 139 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 140 140 err = request_firmware(&adev->gmc.fw, fw_name, adev->dev); 141 141 if (err) 142 142 goto out;
+3 -6
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 47 47 static void gmc_v7_0_set_irq_funcs(struct amdgpu_device *adev); 48 48 static int gmc_v7_0_wait_for_idle(void *handle); 49 49 50 - MODULE_FIRMWARE("radeon/bonaire_mc.bin"); 51 - MODULE_FIRMWARE("radeon/hawaii_mc.bin"); 50 + MODULE_FIRMWARE("amdgpu/bonaire_mc.bin"); 51 + MODULE_FIRMWARE("amdgpu/hawaii_mc.bin"); 52 52 MODULE_FIRMWARE("amdgpu/topaz_mc.bin"); 53 53 54 54 static const u32 golden_settings_iceland_a11[] = ··· 147 147 default: BUG(); 148 148 } 149 149 150 - if (adev->asic_type == CHIP_TOPAZ) 151 - snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 152 - else 153 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 150 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 154 151 155 152 err = request_firmware(&adev->gmc.fw, fw_name, adev->dev); 156 153 if (err)
+14 -1
drivers/gpu/drm/amd/amdgpu/kv_dpm.c
··· 3306 3306 } 3307 3307 } 3308 3308 3309 + static int kv_set_powergating_by_smu(void *handle, 3310 + uint32_t block_type, bool gate) 3311 + { 3312 + switch (block_type) { 3313 + case AMD_IP_BLOCK_TYPE_UVD: 3314 + kv_dpm_powergate_uvd(handle, gate); 3315 + break; 3316 + default: 3317 + break; 3318 + } 3319 + return 0; 3320 + } 3321 + 3309 3322 static const struct amd_ip_funcs kv_dpm_ip_funcs = { 3310 3323 .name = "kv_dpm", 3311 3324 .early_init = kv_dpm_early_init, ··· 3355 3342 .print_power_state = &kv_dpm_print_power_state, 3356 3343 .debugfs_print_current_performance_level = &kv_dpm_debugfs_print_current_performance_level, 3357 3344 .force_performance_level = &kv_dpm_force_performance_level, 3358 - .powergate_uvd = &kv_dpm_powergate_uvd, 3345 + .set_powergating_by_smu = kv_set_powergating_by_smu, 3359 3346 .enable_bapm = &kv_dpm_enable_bapm, 3360 3347 .get_vce_clock_state = amdgpu_get_vce_clock_state, 3361 3348 .check_state_equal = kv_check_state_equal,
+2 -2
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 471 471 RENG_EXECUTE_ON_REG_UPDATE, 1); 472 472 WREG32_SOC15(MMHUB, 0, mmPCTL1_RENG_EXECUTE, pctl1_reng_execute); 473 473 474 - if (adev->powerplay.pp_funcs->set_mmhub_powergating_by_smu) 475 - amdgpu_dpm_set_mmhub_powergating_by_smu(adev); 474 + if (adev->powerplay.pp_funcs->set_powergating_by_smu) 475 + amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GMC, true); 476 476 477 477 } else { 478 478 pctl0_reng_execute = REG_SET_FIELD(pctl0_reng_execute,
+6 -6
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 202 202 static uint64_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring) 203 203 { 204 204 struct amdgpu_device *adev = ring->adev; 205 - int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 206 - u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; 205 + u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) >> 2; 207 206 208 207 return wptr; 209 208 } ··· 217 218 static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring) 218 219 { 219 220 struct amdgpu_device *adev = ring->adev; 220 - int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 221 221 222 - WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], lower_32_bits(ring->wptr) << 2); 222 + WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], lower_32_bits(ring->wptr) << 2); 223 223 } 224 224 225 225 static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) ··· 271 273 { 272 274 u32 ref_and_mask = 0; 273 275 274 - if (ring == &ring->adev->sdma.instance[0].ring) 276 + if (ring->me == 0) 275 277 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); 276 278 else 277 279 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); ··· 1211 1213 { 1212 1214 int i; 1213 1215 1214 - for (i = 0; i < adev->sdma.num_instances; i++) 1216 + for (i = 0; i < adev->sdma.num_instances; i++) { 1215 1217 adev->sdma.instance[i].ring.funcs = &sdma_v2_4_ring_funcs; 1218 + adev->sdma.instance[i].ring.me = i; 1219 + } 1216 1220 } 1217 1221 1218 1222 static const struct amdgpu_irq_src_funcs sdma_v2_4_trap_irq_funcs = {
+6 -8
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
··· 365 365 /* XXX check if swapping is necessary on BE */ 366 366 wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2; 367 367 } else { 368 - int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 369 - 370 - wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; 368 + wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me]) >> 2; 371 369 } 372 370 373 371 return wptr; ··· 392 394 393 395 WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2)); 394 396 } else { 395 - int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 396 - 397 - WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], lower_32_bits(ring->wptr) << 2); 397 + WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[ring->me], lower_32_bits(ring->wptr) << 2); 398 398 } 399 399 } 400 400 ··· 446 450 { 447 451 u32 ref_and_mask = 0; 448 452 449 - if (ring == &ring->adev->sdma.instance[0].ring) 453 + if (ring->me == 0) 450 454 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); 451 455 else 452 456 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); ··· 1651 1655 { 1652 1656 int i; 1653 1657 1654 - for (i = 0; i < adev->sdma.num_instances; i++) 1658 + for (i = 0; i < adev->sdma.num_instances; i++) { 1655 1659 adev->sdma.instance[i].ring.funcs = &sdma_v3_0_ring_funcs; 1660 + adev->sdma.instance[i].ring.me = i; 1661 + } 1656 1662 } 1657 1663 1658 1664 static const struct amdgpu_irq_src_funcs sdma_v3_0_trap_irq_funcs = {
+11 -12
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 296 296 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); 297 297 } else { 298 298 u32 lowbit, highbit; 299 - int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 300 299 301 - lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR)) >> 2; 302 - highbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; 300 + lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)) >> 2; 301 + highbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; 303 302 304 303 DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", 305 - me, highbit, lowbit); 304 + ring->me, highbit, lowbit); 306 305 wptr = highbit; 307 306 wptr = wptr << 32; 308 307 wptr |= lowbit; ··· 338 339 ring->doorbell_index, ring->wptr << 2); 339 340 WDOORBELL64(ring->doorbell_index, ring->wptr << 2); 340 341 } else { 341 - int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 342 - 343 342 DRM_DEBUG("Not using doorbell -- " 344 343 "mmSDMA%i_GFX_RB_WPTR == 0x%08x " 345 344 "mmSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n", 346 - me, 345 + ring->me, 347 346 lower_32_bits(ring->wptr << 2), 348 - me, 347 + ring->me, 349 348 upper_32_bits(ring->wptr << 2)); 350 - WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); 351 - WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); 349 + WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); 350 + WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); 352 351 } 353 352 } 354 353 ··· 427 430 u32 ref_and_mask = 0; 428 431 const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio_funcs->hdp_flush_reg; 429 432 430 - if (ring == &ring->adev->sdma.instance[0].ring) 433 + if (ring->me == 0) 431 434 ref_and_mask = nbio_hf_reg->ref_and_mask_sdma0; 432 435 else 433 436 ref_and_mask = nbio_hf_reg->ref_and_mask_sdma1; ··· 1648 1651 { 1649 1652 int i; 1650 1653 1651 - for (i = 0; i < adev->sdma.num_instances; i++) 1654 + for (i = 0; i < adev->sdma.num_instances; i++) { 1652 1655 adev->sdma.instance[i].ring.funcs = &sdma_v4_0_ring_funcs; 1656 + adev->sdma.instance[i].ring.me = i; 1657 + } 1653 1658 } 1654 1659 1655 1660 static const struct amdgpu_irq_src_funcs sdma_v4_0_trap_irq_funcs = {
+12 -13
drivers/gpu/drm/amd/amdgpu/si_dpm.c
··· 56 56 57 57 #define BIOS_SCRATCH_4 0x5cd 58 58 59 - MODULE_FIRMWARE("radeon/tahiti_smc.bin"); 60 - MODULE_FIRMWARE("radeon/pitcairn_smc.bin"); 61 - MODULE_FIRMWARE("radeon/pitcairn_k_smc.bin"); 62 - MODULE_FIRMWARE("radeon/verde_smc.bin"); 63 - MODULE_FIRMWARE("radeon/verde_k_smc.bin"); 64 - MODULE_FIRMWARE("radeon/oland_smc.bin"); 65 - MODULE_FIRMWARE("radeon/oland_k_smc.bin"); 66 - MODULE_FIRMWARE("radeon/hainan_smc.bin"); 67 - MODULE_FIRMWARE("radeon/hainan_k_smc.bin"); 68 - MODULE_FIRMWARE("radeon/banks_k_2_smc.bin"); 59 + MODULE_FIRMWARE("amdgpu/tahiti_smc.bin"); 60 + MODULE_FIRMWARE("amdgpu/pitcairn_smc.bin"); 61 + MODULE_FIRMWARE("amdgpu/pitcairn_k_smc.bin"); 62 + MODULE_FIRMWARE("amdgpu/verde_smc.bin"); 63 + MODULE_FIRMWARE("amdgpu/verde_k_smc.bin"); 64 + MODULE_FIRMWARE("amdgpu/oland_smc.bin"); 65 + MODULE_FIRMWARE("amdgpu/oland_k_smc.bin"); 66 + MODULE_FIRMWARE("amdgpu/hainan_smc.bin"); 67 + MODULE_FIRMWARE("amdgpu/hainan_k_smc.bin"); 68 + MODULE_FIRMWARE("amdgpu/banks_k_2_smc.bin"); 69 69 70 70 static const struct amd_pm_funcs si_dpm_funcs; 71 71 ··· 7318 7318 pi = &eg_pi->rv7xx; 7319 7319 7320 7320 si_pi->sys_pcie_mask = 7321 - (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) >> 7322 - CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT; 7321 + adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK; 7323 7322 si_pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID; 7324 7323 si_pi->boot_pcie_gen = si_get_current_pcie_speed(adev); 7325 7324 ··· 7666 7667 default: BUG(); 7667 7668 } 7668 7669 7669 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 7670 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_smc.bin", chip_name); 7670 7671 err = request_firmware(&adev->pm.fw, fw_name, adev->dev); 7671 7672 if (err) 7672 7673 goto out;
+2 -3
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 470 470 return r; 471 471 472 472 if (uvd_v6_0_enc_support(adev)) { 473 - drm_sched_entity_fini(&adev->uvd.inst->ring_enc[0].sched, &adev->uvd.inst->entity_enc); 473 + drm_sched_entity_destroy(&adev->uvd.inst->ring_enc[0].sched, &adev->uvd.inst->entity_enc); 474 474 475 475 for (i = 0; i < adev->uvd.num_enc_rings; ++i) 476 476 amdgpu_ring_fini(&adev->uvd.inst->ring_enc[i]); ··· 1569 1569 static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = { 1570 1570 .type = AMDGPU_RING_TYPE_UVD, 1571 1571 .align_mask = 0xf, 1572 - .nop = PACKET0(mmUVD_NO_OP, 0), 1573 1572 .support_64bit_ptrs = false, 1574 1573 .get_rptr = uvd_v6_0_ring_get_rptr, 1575 1574 .get_wptr = uvd_v6_0_ring_get_wptr, ··· 1586 1587 .emit_hdp_flush = uvd_v6_0_ring_emit_hdp_flush, 1587 1588 .test_ring = uvd_v6_0_ring_test_ring, 1588 1589 .test_ib = amdgpu_uvd_ring_test_ib, 1589 - .insert_nop = amdgpu_ring_insert_nop, 1590 + .insert_nop = uvd_v6_0_ring_insert_nop, 1590 1591 .pad_ib = amdgpu_ring_generic_pad_ib, 1591 1592 .begin_use = amdgpu_uvd_ring_begin_use, 1592 1593 .end_use = amdgpu_uvd_ring_end_use,
+1 -1
drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
··· 491 491 return r; 492 492 493 493 for (j = 0; j < adev->uvd.num_uvd_inst; ++j) { 494 - drm_sched_entity_fini(&adev->uvd.inst[j].ring_enc[0].sched, &adev->uvd.inst[j].entity_enc); 494 + drm_sched_entity_destroy(&adev->uvd.inst[j].ring_enc[0].sched, &adev->uvd.inst[j].entity_enc); 495 495 496 496 for (i = 0; i < adev->uvd.num_enc_rings; ++i) 497 497 amdgpu_ring_fini(&adev->uvd.inst[j].ring_enc[i]);
+6 -4
drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
··· 56 56 { 57 57 struct amdgpu_device *adev = ring->adev; 58 58 59 - if (ring == &adev->vce.ring[0]) 59 + if (ring->me == 0) 60 60 return RREG32(mmVCE_RB_RPTR); 61 61 else 62 62 return RREG32(mmVCE_RB_RPTR2); ··· 73 73 { 74 74 struct amdgpu_device *adev = ring->adev; 75 75 76 - if (ring == &adev->vce.ring[0]) 76 + if (ring->me == 0) 77 77 return RREG32(mmVCE_RB_WPTR); 78 78 else 79 79 return RREG32(mmVCE_RB_WPTR2); ··· 90 90 { 91 91 struct amdgpu_device *adev = ring->adev; 92 92 93 - if (ring == &adev->vce.ring[0]) 93 + if (ring->me == 0) 94 94 WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); 95 95 else 96 96 WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); ··· 627 627 { 628 628 int i; 629 629 630 - for (i = 0; i < adev->vce.num_rings; i++) 630 + for (i = 0; i < adev->vce.num_rings; i++) { 631 631 adev->vce.ring[i].funcs = &vce_v2_0_ring_funcs; 632 + adev->vce.ring[i].me = i; 633 + } 632 634 } 633 635 634 636 static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = {
+14 -10
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
··· 86 86 else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 87 87 WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 88 88 89 - if (ring == &adev->vce.ring[0]) 89 + if (ring->me == 0) 90 90 v = RREG32(mmVCE_RB_RPTR); 91 - else if (ring == &adev->vce.ring[1]) 91 + else if (ring->me == 1) 92 92 v = RREG32(mmVCE_RB_RPTR2); 93 93 else 94 94 v = RREG32(mmVCE_RB_RPTR3); ··· 118 118 else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 119 119 WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 120 120 121 - if (ring == &adev->vce.ring[0]) 121 + if (ring->me == 0) 122 122 v = RREG32(mmVCE_RB_WPTR); 123 - else if (ring == &adev->vce.ring[1]) 123 + else if (ring->me == 1) 124 124 v = RREG32(mmVCE_RB_WPTR2); 125 125 else 126 126 v = RREG32(mmVCE_RB_WPTR3); ··· 149 149 else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 150 150 WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 151 151 152 - if (ring == &adev->vce.ring[0]) 152 + if (ring->me == 0) 153 153 WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); 154 - else if (ring == &adev->vce.ring[1]) 154 + else if (ring->me == 1) 155 155 WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); 156 156 else 157 157 WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); ··· 900 900 .emit_frame_size = 901 901 4 + /* vce_v3_0_emit_pipeline_sync */ 902 902 6, /* amdgpu_vce_ring_emit_fence x1 no user fence */ 903 - .emit_ib_size = 5, /* vce_v3_0_ring_emit_ib */ 903 + .emit_ib_size = 4, /* amdgpu_vce_ring_emit_ib */ 904 904 .emit_ib = amdgpu_vce_ring_emit_ib, 905 905 .emit_fence = amdgpu_vce_ring_emit_fence, 906 906 .test_ring = amdgpu_vce_ring_test_ring, ··· 924 924 6 + /* vce_v3_0_emit_vm_flush */ 925 925 4 + /* vce_v3_0_emit_pipeline_sync */ 926 926 6 + 6, /* amdgpu_vce_ring_emit_fence x2 vm fence */ 927 - .emit_ib_size = 4, /* amdgpu_vce_ring_emit_ib */ 927 + .emit_ib_size = 5, /* vce_v3_0_ring_emit_ib */ 928 928 .emit_ib = vce_v3_0_ring_emit_ib, 929 929 .emit_vm_flush = vce_v3_0_emit_vm_flush, 930 930 .emit_pipeline_sync = vce_v3_0_emit_pipeline_sync, ··· 942 942 int i; 943 943 944 944 if (adev->asic_type >= CHIP_STONEY) { 945 - for (i = 0; i < adev->vce.num_rings; i++) 945 + for (i = 0; i < adev->vce.num_rings; i++) { 946 946 adev->vce.ring[i].funcs = &vce_v3_0_ring_vm_funcs; 947 + adev->vce.ring[i].me = i; 948 + } 947 949 DRM_INFO("VCE enabled in VM mode\n"); 948 950 } else { 949 - for (i = 0; i < adev->vce.num_rings; i++) 951 + for (i = 0; i < adev->vce.num_rings; i++) { 950 952 adev->vce.ring[i].funcs = &vce_v3_0_ring_phys_funcs; 953 + adev->vce.ring[i].me = i; 954 + } 951 955 DRM_INFO("VCE enabled in physical mode\n"); 952 956 } 953 957 }
+9 -7
drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
··· 60 60 { 61 61 struct amdgpu_device *adev = ring->adev; 62 62 63 - if (ring == &adev->vce.ring[0]) 63 + if (ring->me == 0) 64 64 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR)); 65 - else if (ring == &adev->vce.ring[1]) 65 + else if (ring->me == 1) 66 66 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR2)); 67 67 else 68 68 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR3)); ··· 82 82 if (ring->use_doorbell) 83 83 return adev->wb.wb[ring->wptr_offs]; 84 84 85 - if (ring == &adev->vce.ring[0]) 85 + if (ring->me == 0) 86 86 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR)); 87 - else if (ring == &adev->vce.ring[1]) 87 + else if (ring->me == 1) 88 88 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR2)); 89 89 else 90 90 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR3)); ··· 108 108 return; 109 109 } 110 110 111 - if (ring == &adev->vce.ring[0]) 111 + if (ring->me == 0) 112 112 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR), 113 113 lower_32_bits(ring->wptr)); 114 - else if (ring == &adev->vce.ring[1]) 114 + else if (ring->me == 1) 115 115 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR2), 116 116 lower_32_bits(ring->wptr)); 117 117 else ··· 1088 1088 { 1089 1089 int i; 1090 1090 1091 - for (i = 0; i < adev->vce.num_rings; i++) 1091 + for (i = 0; i < adev->vce.num_rings; i++) { 1092 1092 adev->vce.ring[i].funcs = &vce_v4_0_ring_vm_funcs; 1093 + adev->vce.ring[i].me = i; 1094 + } 1093 1095 DRM_INFO("VCE enabled in VM mode\n"); 1094 1096 } 1095 1097
+2 -2
drivers/gpu/drm/amd/display/amdgpu_dm/Makefile
··· 28 28 AMDGPUDM = amdgpu_dm.o amdgpu_dm_irq.o amdgpu_dm_mst_types.o amdgpu_dm_color.o 29 29 30 30 ifneq ($(CONFIG_DRM_AMD_DC),) 31 - AMDGPUDM += amdgpu_dm_services.o amdgpu_dm_helpers.o 31 + AMDGPUDM += amdgpu_dm_services.o amdgpu_dm_helpers.o amdgpu_dm_pp_smu.o 32 32 endif 33 33 34 34 ifneq ($(CONFIG_DEBUG_FS),) 35 - AMDGPUDM += amdgpu_dm_crc.o 35 + AMDGPUDM += amdgpu_dm_crc.o amdgpu_dm_debugfs.o 36 36 endif 37 37 38 38 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc
+58 -3
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 39 39 #include "dm_helpers.h" 40 40 #include "dm_services_types.h" 41 41 #include "amdgpu_dm_mst_types.h" 42 + #if defined(CONFIG_DEBUG_FS) 43 + #include "amdgpu_dm_debugfs.h" 44 + #endif 42 45 43 46 #include "ivsrcid/ivsrcid_vislands30.h" 44 47 ··· 1535 1532 /* 1536 1533 * Temporary disable until pplib/smu interaction is implemented 1537 1534 */ 1538 - dm->dc->debug.disable_stutter = true; 1535 + dm->dc->debug.disable_stutter = amdgpu_pp_feature_mask & PP_STUTTER_MODE ? false : true; 1539 1536 break; 1540 1537 #endif 1541 1538 default: ··· 2176 2173 return color_space; 2177 2174 } 2178 2175 2176 + static void reduce_mode_colour_depth(struct dc_crtc_timing *timing_out) 2177 + { 2178 + if (timing_out->display_color_depth <= COLOR_DEPTH_888) 2179 + return; 2180 + 2181 + timing_out->display_color_depth--; 2182 + } 2183 + 2184 + static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_out, 2185 + const struct drm_display_info *info) 2186 + { 2187 + int normalized_clk; 2188 + if (timing_out->display_color_depth <= COLOR_DEPTH_888) 2189 + return; 2190 + do { 2191 + normalized_clk = timing_out->pix_clk_khz; 2192 + /* YCbCr 4:2:0 requires additional adjustment of 1/2 */ 2193 + if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420) 2194 + normalized_clk /= 2; 2195 + /* Adjusting pix clock following on HDMI spec based on colour depth */ 2196 + switch (timing_out->display_color_depth) { 2197 + case COLOR_DEPTH_101010: 2198 + normalized_clk = (normalized_clk * 30) / 24; 2199 + break; 2200 + case COLOR_DEPTH_121212: 2201 + normalized_clk = (normalized_clk * 36) / 24; 2202 + break; 2203 + case COLOR_DEPTH_161616: 2204 + normalized_clk = (normalized_clk * 48) / 24; 2205 + break; 2206 + default: 2207 + return; 2208 + } 2209 + if (normalized_clk <= info->max_tmds_clock) 2210 + return; 2211 + reduce_mode_colour_depth(timing_out); 2212 + 2213 + } while (timing_out->display_color_depth > COLOR_DEPTH_888); 2214 + 2215 + } 2179 2216 /*****************************************************************************/ 2180 2217 2181 2218 static void ··· 2224 2181 const struct drm_connector *connector) 2225 2182 { 2226 2183 struct dc_crtc_timing *timing_out = &stream->timing; 2184 + const struct drm_display_info *info = &connector->display_info; 2227 2185 2228 2186 memset(timing_out, 0, sizeof(struct dc_crtc_timing)); 2229 2187 ··· 2233 2189 timing_out->v_border_top = 0; 2234 2190 timing_out->v_border_bottom = 0; 2235 2191 /* TODO: un-hardcode */ 2236 - 2237 - if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB444) 2192 + if (drm_mode_is_420_only(info, mode_in) 2193 + && stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) 2194 + timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; 2195 + else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB444) 2238 2196 && stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) 2239 2197 timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444; 2240 2198 else ··· 2272 2226 2273 2227 stream->out_transfer_func->type = TF_TYPE_PREDEFINED; 2274 2228 stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB; 2229 + if (stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) 2230 + adjust_colour_depth_from_display_info(timing_out, info); 2275 2231 } 2276 2232 2277 2233 static void fill_audio_info(struct audio_info *audio_info, ··· 3667 3619 &aconnector->base, &aencoder->base); 3668 3620 3669 3621 drm_connector_register(&aconnector->base); 3622 + #if defined(CONFIG_DEBUG_FS) 3623 + res = connector_debugfs_init(aconnector); 3624 + if (res) { 3625 + DRM_ERROR("Failed to create debugfs for connector"); 3626 + goto out_free; 3627 + } 3628 + #endif 3670 3629 3671 3630 if (connector_type == DRM_MODE_CONNECTOR_DisplayPort 3672 3631 || connector_type == DRM_MODE_CONNECTOR_eDP)
+170
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
··· 1 + /* 2 + * Copyright 2018 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + * 24 + */ 25 + 26 + #include <linux/debugfs.h> 27 + 28 + #include "dc.h" 29 + #include "dc_link.h" 30 + 31 + #include "amdgpu.h" 32 + #include "amdgpu_dm.h" 33 + #include "amdgpu_dm_debugfs.h" 34 + 35 + static ssize_t dp_link_rate_debugfs_read(struct file *f, char __user *buf, 36 + size_t size, loff_t *pos) 37 + { 38 + /* TODO: create method to read link rate */ 39 + return 1; 40 + } 41 + 42 + static ssize_t dp_link_rate_debugfs_write(struct file *f, const char __user *buf, 43 + size_t size, loff_t *pos) 44 + { 45 + /* TODO: create method to write link rate */ 46 + return 1; 47 + } 48 + 49 + static ssize_t dp_lane_count_debugfs_read(struct file *f, char __user *buf, 50 + size_t size, loff_t *pos) 51 + { 52 + /* TODO: create method to read lane count */ 53 + return 1; 54 + } 55 + 56 + static ssize_t dp_lane_count_debugfs_write(struct file *f, const char __user *buf, 57 + size_t size, loff_t *pos) 58 + { 59 + /* TODO: create method to write lane count */ 60 + return 1; 61 + } 62 + 63 + static ssize_t dp_voltage_swing_debugfs_read(struct file *f, char __user *buf, 64 + size_t size, loff_t *pos) 65 + { 66 + /* TODO: create method to read voltage swing */ 67 + return 1; 68 + } 69 + 70 + static ssize_t dp_voltage_swing_debugfs_write(struct file *f, const char __user *buf, 71 + size_t size, loff_t *pos) 72 + { 73 + /* TODO: create method to write voltage swing */ 74 + return 1; 75 + } 76 + 77 + static ssize_t dp_pre_emphasis_debugfs_read(struct file *f, char __user *buf, 78 + size_t size, loff_t *pos) 79 + { 80 + /* TODO: create method to read pre-emphasis */ 81 + return 1; 82 + } 83 + 84 + static ssize_t dp_pre_emphasis_debugfs_write(struct file *f, const char __user *buf, 85 + size_t size, loff_t *pos) 86 + { 87 + /* TODO: create method to write pre-emphasis */ 88 + return 1; 89 + } 90 + 91 + static ssize_t dp_phy_test_pattern_debugfs_read(struct file *f, char __user *buf, 92 + size_t size, loff_t *pos) 93 + { 94 + /* TODO: create method to read PHY test pattern */ 95 + return 1; 96 + } 97 + 98 + static ssize_t dp_phy_test_pattern_debugfs_write(struct file *f, const char __user *buf, 99 + size_t size, loff_t *pos) 100 + { 101 + /* TODO: create method to write PHY test pattern */ 102 + return 1; 103 + } 104 + 105 + static const struct file_operations dp_link_rate_fops = { 106 + .owner = THIS_MODULE, 107 + .read = dp_link_rate_debugfs_read, 108 + .write = dp_link_rate_debugfs_write, 109 + .llseek = default_llseek 110 + }; 111 + 112 + static const struct file_operations dp_lane_count_fops = { 113 + .owner = THIS_MODULE, 114 + .read = dp_lane_count_debugfs_read, 115 + .write = dp_lane_count_debugfs_write, 116 + .llseek = default_llseek 117 + }; 118 + 119 + static const struct file_operations dp_voltage_swing_fops = { 120 + .owner = THIS_MODULE, 121 + .read = dp_voltage_swing_debugfs_read, 122 + .write = dp_voltage_swing_debugfs_write, 123 + .llseek = default_llseek 124 + }; 125 + 126 + static const struct file_operations dp_pre_emphasis_fops = { 127 + .owner = THIS_MODULE, 128 + .read = dp_pre_emphasis_debugfs_read, 129 + .write = dp_pre_emphasis_debugfs_write, 130 + .llseek = default_llseek 131 + }; 132 + 133 + static const struct file_operations dp_phy_test_pattern_fops = { 134 + .owner = THIS_MODULE, 135 + .read = dp_phy_test_pattern_debugfs_read, 136 + .write = dp_phy_test_pattern_debugfs_write, 137 + .llseek = default_llseek 138 + }; 139 + 140 + static const struct { 141 + char *name; 142 + const struct file_operations *fops; 143 + } dp_debugfs_entries[] = { 144 + {"link_rate", &dp_link_rate_fops}, 145 + {"lane_count", &dp_lane_count_fops}, 146 + {"voltage_swing", &dp_voltage_swing_fops}, 147 + {"pre_emphasis", &dp_pre_emphasis_fops}, 148 + {"phy_test_pattern", &dp_phy_test_pattern_fops} 149 + }; 150 + 151 + int connector_debugfs_init(struct amdgpu_dm_connector *connector) 152 + { 153 + int i; 154 + struct dentry *ent, *dir = connector->base.debugfs_entry; 155 + 156 + if (connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) { 157 + for (i = 0; i < ARRAY_SIZE(dp_debugfs_entries); i++) { 158 + ent = debugfs_create_file(dp_debugfs_entries[i].name, 159 + 0644, 160 + dir, 161 + connector, 162 + dp_debugfs_entries[i].fops); 163 + if (IS_ERR(ent)) 164 + return PTR_ERR(ent); 165 + } 166 + } 167 + 168 + return 0; 169 + } 170 +
+535
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
··· 1 + /* 2 + * Copyright 2018 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + */ 24 + #include <linux/string.h> 25 + #include <linux/acpi.h> 26 + 27 + #include <drm/drmP.h> 28 + #include <drm/drm_crtc_helper.h> 29 + #include <drm/amdgpu_drm.h> 30 + #include "dm_services.h" 31 + #include "amdgpu.h" 32 + #include "amdgpu_dm.h" 33 + #include "amdgpu_dm_irq.h" 34 + #include "amdgpu_pm.h" 35 + #include "dm_pp_smu.h" 36 + 37 + 38 + bool dm_pp_apply_display_requirements( 39 + const struct dc_context *ctx, 40 + const struct dm_pp_display_configuration *pp_display_cfg) 41 + { 42 + struct amdgpu_device *adev = ctx->driver_context; 43 + int i; 44 + 45 + if (adev->pm.dpm_enabled) { 46 + 47 + memset(&adev->pm.pm_display_cfg, 0, 48 + sizeof(adev->pm.pm_display_cfg)); 49 + 50 + adev->pm.pm_display_cfg.cpu_cc6_disable = 51 + pp_display_cfg->cpu_cc6_disable; 52 + 53 + adev->pm.pm_display_cfg.cpu_pstate_disable = 54 + pp_display_cfg->cpu_pstate_disable; 55 + 56 + adev->pm.pm_display_cfg.cpu_pstate_separation_time = 57 + pp_display_cfg->cpu_pstate_separation_time; 58 + 59 + adev->pm.pm_display_cfg.nb_pstate_switch_disable = 60 + pp_display_cfg->nb_pstate_switch_disable; 61 + 62 + adev->pm.pm_display_cfg.num_display = 63 + pp_display_cfg->display_count; 64 + adev->pm.pm_display_cfg.num_path_including_non_display = 65 + pp_display_cfg->display_count; 66 + 67 + adev->pm.pm_display_cfg.min_core_set_clock = 68 + pp_display_cfg->min_engine_clock_khz/10; 69 + adev->pm.pm_display_cfg.min_core_set_clock_in_sr = 70 + pp_display_cfg->min_engine_clock_deep_sleep_khz/10; 71 + adev->pm.pm_display_cfg.min_mem_set_clock = 72 + pp_display_cfg->min_memory_clock_khz/10; 73 + 74 + adev->pm.pm_display_cfg.min_dcef_deep_sleep_set_clk = 75 + pp_display_cfg->min_engine_clock_deep_sleep_khz/10; 76 + adev->pm.pm_display_cfg.min_dcef_set_clk = 77 + pp_display_cfg->min_dcfclock_khz/10; 78 + 79 + adev->pm.pm_display_cfg.multi_monitor_in_sync = 80 + pp_display_cfg->all_displays_in_sync; 81 + adev->pm.pm_display_cfg.min_vblank_time = 82 + pp_display_cfg->avail_mclk_switch_time_us; 83 + 84 + adev->pm.pm_display_cfg.display_clk = 85 + pp_display_cfg->disp_clk_khz/10; 86 + 87 + adev->pm.pm_display_cfg.dce_tolerable_mclk_in_active_latency = 88 + pp_display_cfg->avail_mclk_switch_time_in_disp_active_us; 89 + 90 + adev->pm.pm_display_cfg.crtc_index = pp_display_cfg->crtc_index; 91 + adev->pm.pm_display_cfg.line_time_in_us = 92 + pp_display_cfg->line_time_in_us; 93 + 94 + adev->pm.pm_display_cfg.vrefresh = pp_display_cfg->disp_configs[0].v_refresh; 95 + adev->pm.pm_display_cfg.crossfire_display_index = -1; 96 + adev->pm.pm_display_cfg.min_bus_bandwidth = 0; 97 + 98 + for (i = 0; i < pp_display_cfg->display_count; i++) { 99 + const struct dm_pp_single_disp_config *dc_cfg = 100 + &pp_display_cfg->disp_configs[i]; 101 + adev->pm.pm_display_cfg.displays[i].controller_id = dc_cfg->pipe_idx + 1; 102 + } 103 + 104 + /* TODO: complete implementation of 105 + * pp_display_configuration_change(). 106 + * Follow example of: 107 + * PHM_StoreDALConfigurationData - powerplay\hwmgr\hardwaremanager.c 108 + * PP_IRI_DisplayConfigurationChange - powerplay\eventmgr\iri.c */ 109 + if (adev->powerplay.pp_funcs->display_configuration_change) 110 + adev->powerplay.pp_funcs->display_configuration_change( 111 + adev->powerplay.pp_handle, 112 + &adev->pm.pm_display_cfg); 113 + 114 + /* TODO: replace by a separate call to 'apply display cfg'? */ 115 + amdgpu_pm_compute_clocks(adev); 116 + } 117 + 118 + return true; 119 + } 120 + 121 + static void get_default_clock_levels( 122 + enum dm_pp_clock_type clk_type, 123 + struct dm_pp_clock_levels *clks) 124 + { 125 + uint32_t disp_clks_in_khz[6] = { 126 + 300000, 400000, 496560, 626090, 685720, 757900 }; 127 + uint32_t sclks_in_khz[6] = { 128 + 300000, 360000, 423530, 514290, 626090, 720000 }; 129 + uint32_t mclks_in_khz[2] = { 333000, 800000 }; 130 + 131 + switch (clk_type) { 132 + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 133 + clks->num_levels = 6; 134 + memmove(clks->clocks_in_khz, disp_clks_in_khz, 135 + sizeof(disp_clks_in_khz)); 136 + break; 137 + case DM_PP_CLOCK_TYPE_ENGINE_CLK: 138 + clks->num_levels = 6; 139 + memmove(clks->clocks_in_khz, sclks_in_khz, 140 + sizeof(sclks_in_khz)); 141 + break; 142 + case DM_PP_CLOCK_TYPE_MEMORY_CLK: 143 + clks->num_levels = 2; 144 + memmove(clks->clocks_in_khz, mclks_in_khz, 145 + sizeof(mclks_in_khz)); 146 + break; 147 + default: 148 + clks->num_levels = 0; 149 + break; 150 + } 151 + } 152 + 153 + static enum amd_pp_clock_type dc_to_pp_clock_type( 154 + enum dm_pp_clock_type dm_pp_clk_type) 155 + { 156 + enum amd_pp_clock_type amd_pp_clk_type = 0; 157 + 158 + switch (dm_pp_clk_type) { 159 + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 160 + amd_pp_clk_type = amd_pp_disp_clock; 161 + break; 162 + case DM_PP_CLOCK_TYPE_ENGINE_CLK: 163 + amd_pp_clk_type = amd_pp_sys_clock; 164 + break; 165 + case DM_PP_CLOCK_TYPE_MEMORY_CLK: 166 + amd_pp_clk_type = amd_pp_mem_clock; 167 + break; 168 + case DM_PP_CLOCK_TYPE_DCEFCLK: 169 + amd_pp_clk_type = amd_pp_dcef_clock; 170 + break; 171 + case DM_PP_CLOCK_TYPE_DCFCLK: 172 + amd_pp_clk_type = amd_pp_dcf_clock; 173 + break; 174 + case DM_PP_CLOCK_TYPE_PIXELCLK: 175 + amd_pp_clk_type = amd_pp_pixel_clock; 176 + break; 177 + case DM_PP_CLOCK_TYPE_FCLK: 178 + amd_pp_clk_type = amd_pp_f_clock; 179 + break; 180 + case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: 181 + amd_pp_clk_type = amd_pp_phy_clock; 182 + break; 183 + case DM_PP_CLOCK_TYPE_DPPCLK: 184 + amd_pp_clk_type = amd_pp_dpp_clock; 185 + break; 186 + default: 187 + DRM_ERROR("DM_PPLIB: invalid clock type: %d!\n", 188 + dm_pp_clk_type); 189 + break; 190 + } 191 + 192 + return amd_pp_clk_type; 193 + } 194 + 195 + static void pp_to_dc_clock_levels( 196 + const struct amd_pp_clocks *pp_clks, 197 + struct dm_pp_clock_levels *dc_clks, 198 + enum dm_pp_clock_type dc_clk_type) 199 + { 200 + uint32_t i; 201 + 202 + if (pp_clks->count > DM_PP_MAX_CLOCK_LEVELS) { 203 + DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 204 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 205 + pp_clks->count, 206 + DM_PP_MAX_CLOCK_LEVELS); 207 + 208 + dc_clks->num_levels = DM_PP_MAX_CLOCK_LEVELS; 209 + } else 210 + dc_clks->num_levels = pp_clks->count; 211 + 212 + DRM_INFO("DM_PPLIB: values for %s clock\n", 213 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 214 + 215 + for (i = 0; i < dc_clks->num_levels; i++) { 216 + DRM_INFO("DM_PPLIB:\t %d\n", pp_clks->clock[i]); 217 + dc_clks->clocks_in_khz[i] = pp_clks->clock[i]; 218 + } 219 + } 220 + 221 + static void pp_to_dc_clock_levels_with_latency( 222 + const struct pp_clock_levels_with_latency *pp_clks, 223 + struct dm_pp_clock_levels_with_latency *clk_level_info, 224 + enum dm_pp_clock_type dc_clk_type) 225 + { 226 + uint32_t i; 227 + 228 + if (pp_clks->num_levels > DM_PP_MAX_CLOCK_LEVELS) { 229 + DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 230 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 231 + pp_clks->num_levels, 232 + DM_PP_MAX_CLOCK_LEVELS); 233 + 234 + clk_level_info->num_levels = DM_PP_MAX_CLOCK_LEVELS; 235 + } else 236 + clk_level_info->num_levels = pp_clks->num_levels; 237 + 238 + DRM_DEBUG("DM_PPLIB: values for %s clock\n", 239 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 240 + 241 + for (i = 0; i < clk_level_info->num_levels; i++) { 242 + DRM_DEBUG("DM_PPLIB:\t %d in kHz\n", pp_clks->data[i].clocks_in_khz); 243 + clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz; 244 + clk_level_info->data[i].latency_in_us = pp_clks->data[i].latency_in_us; 245 + } 246 + } 247 + 248 + static void pp_to_dc_clock_levels_with_voltage( 249 + const struct pp_clock_levels_with_voltage *pp_clks, 250 + struct dm_pp_clock_levels_with_voltage *clk_level_info, 251 + enum dm_pp_clock_type dc_clk_type) 252 + { 253 + uint32_t i; 254 + 255 + if (pp_clks->num_levels > DM_PP_MAX_CLOCK_LEVELS) { 256 + DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 257 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 258 + pp_clks->num_levels, 259 + DM_PP_MAX_CLOCK_LEVELS); 260 + 261 + clk_level_info->num_levels = DM_PP_MAX_CLOCK_LEVELS; 262 + } else 263 + clk_level_info->num_levels = pp_clks->num_levels; 264 + 265 + DRM_INFO("DM_PPLIB: values for %s clock\n", 266 + DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 267 + 268 + for (i = 0; i < clk_level_info->num_levels; i++) { 269 + DRM_INFO("DM_PPLIB:\t %d in kHz\n", pp_clks->data[i].clocks_in_khz); 270 + clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz; 271 + clk_level_info->data[i].voltage_in_mv = pp_clks->data[i].voltage_in_mv; 272 + } 273 + } 274 + 275 + bool dm_pp_get_clock_levels_by_type( 276 + const struct dc_context *ctx, 277 + enum dm_pp_clock_type clk_type, 278 + struct dm_pp_clock_levels *dc_clks) 279 + { 280 + struct amdgpu_device *adev = ctx->driver_context; 281 + void *pp_handle = adev->powerplay.pp_handle; 282 + struct amd_pp_clocks pp_clks = { 0 }; 283 + struct amd_pp_simple_clock_info validation_clks = { 0 }; 284 + uint32_t i; 285 + 286 + if (adev->powerplay.pp_funcs->get_clock_by_type) { 287 + if (adev->powerplay.pp_funcs->get_clock_by_type(pp_handle, 288 + dc_to_pp_clock_type(clk_type), &pp_clks)) { 289 + /* Error in pplib. Provide default values. */ 290 + get_default_clock_levels(clk_type, dc_clks); 291 + return true; 292 + } 293 + } 294 + 295 + pp_to_dc_clock_levels(&pp_clks, dc_clks, clk_type); 296 + 297 + if (adev->powerplay.pp_funcs->get_display_mode_validation_clocks) { 298 + if (adev->powerplay.pp_funcs->get_display_mode_validation_clocks( 299 + pp_handle, &validation_clks)) { 300 + /* Error in pplib. Provide default values. */ 301 + DRM_INFO("DM_PPLIB: Warning: using default validation clocks!\n"); 302 + validation_clks.engine_max_clock = 72000; 303 + validation_clks.memory_max_clock = 80000; 304 + validation_clks.level = 0; 305 + } 306 + } 307 + 308 + DRM_INFO("DM_PPLIB: Validation clocks:\n"); 309 + DRM_INFO("DM_PPLIB: engine_max_clock: %d\n", 310 + validation_clks.engine_max_clock); 311 + DRM_INFO("DM_PPLIB: memory_max_clock: %d\n", 312 + validation_clks.memory_max_clock); 313 + DRM_INFO("DM_PPLIB: level : %d\n", 314 + validation_clks.level); 315 + 316 + /* Translate 10 kHz to kHz. */ 317 + validation_clks.engine_max_clock *= 10; 318 + validation_clks.memory_max_clock *= 10; 319 + 320 + /* Determine the highest non-boosted level from the Validation Clocks */ 321 + if (clk_type == DM_PP_CLOCK_TYPE_ENGINE_CLK) { 322 + for (i = 0; i < dc_clks->num_levels; i++) { 323 + if (dc_clks->clocks_in_khz[i] > validation_clks.engine_max_clock) { 324 + /* This clock is higher the validation clock. 325 + * Than means the previous one is the highest 326 + * non-boosted one. */ 327 + DRM_INFO("DM_PPLIB: reducing engine clock level from %d to %d\n", 328 + dc_clks->num_levels, i); 329 + dc_clks->num_levels = i > 0 ? i : 1; 330 + break; 331 + } 332 + } 333 + } else if (clk_type == DM_PP_CLOCK_TYPE_MEMORY_CLK) { 334 + for (i = 0; i < dc_clks->num_levels; i++) { 335 + if (dc_clks->clocks_in_khz[i] > validation_clks.memory_max_clock) { 336 + DRM_INFO("DM_PPLIB: reducing memory clock level from %d to %d\n", 337 + dc_clks->num_levels, i); 338 + dc_clks->num_levels = i > 0 ? i : 1; 339 + break; 340 + } 341 + } 342 + } 343 + 344 + return true; 345 + } 346 + 347 + bool dm_pp_get_clock_levels_by_type_with_latency( 348 + const struct dc_context *ctx, 349 + enum dm_pp_clock_type clk_type, 350 + struct dm_pp_clock_levels_with_latency *clk_level_info) 351 + { 352 + struct amdgpu_device *adev = ctx->driver_context; 353 + void *pp_handle = adev->powerplay.pp_handle; 354 + struct pp_clock_levels_with_latency pp_clks = { 0 }; 355 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 356 + 357 + if (!pp_funcs || !pp_funcs->get_clock_by_type_with_latency) 358 + return false; 359 + 360 + if (pp_funcs->get_clock_by_type_with_latency(pp_handle, 361 + dc_to_pp_clock_type(clk_type), 362 + &pp_clks)) 363 + return false; 364 + 365 + pp_to_dc_clock_levels_with_latency(&pp_clks, clk_level_info, clk_type); 366 + 367 + return true; 368 + } 369 + 370 + bool dm_pp_get_clock_levels_by_type_with_voltage( 371 + const struct dc_context *ctx, 372 + enum dm_pp_clock_type clk_type, 373 + struct dm_pp_clock_levels_with_voltage *clk_level_info) 374 + { 375 + struct amdgpu_device *adev = ctx->driver_context; 376 + void *pp_handle = adev->powerplay.pp_handle; 377 + struct pp_clock_levels_with_voltage pp_clk_info = {0}; 378 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 379 + 380 + if (pp_funcs->get_clock_by_type_with_voltage(pp_handle, 381 + dc_to_pp_clock_type(clk_type), 382 + &pp_clk_info)) 383 + return false; 384 + 385 + pp_to_dc_clock_levels_with_voltage(&pp_clk_info, clk_level_info, clk_type); 386 + 387 + return true; 388 + } 389 + 390 + bool dm_pp_notify_wm_clock_changes( 391 + const struct dc_context *ctx, 392 + struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges) 393 + { 394 + /* TODO: to be implemented */ 395 + return false; 396 + } 397 + 398 + bool dm_pp_apply_power_level_change_request( 399 + const struct dc_context *ctx, 400 + struct dm_pp_power_level_change_request *level_change_req) 401 + { 402 + /* TODO: to be implemented */ 403 + return false; 404 + } 405 + 406 + bool dm_pp_apply_clock_for_voltage_request( 407 + const struct dc_context *ctx, 408 + struct dm_pp_clock_for_voltage_req *clock_for_voltage_req) 409 + { 410 + struct amdgpu_device *adev = ctx->driver_context; 411 + struct pp_display_clock_request pp_clock_request = {0}; 412 + int ret = 0; 413 + 414 + pp_clock_request.clock_type = dc_to_pp_clock_type(clock_for_voltage_req->clk_type); 415 + pp_clock_request.clock_freq_in_khz = clock_for_voltage_req->clocks_in_khz; 416 + 417 + if (!pp_clock_request.clock_type) 418 + return false; 419 + 420 + if (adev->powerplay.pp_funcs->display_clock_voltage_request) 421 + ret = adev->powerplay.pp_funcs->display_clock_voltage_request( 422 + adev->powerplay.pp_handle, 423 + &pp_clock_request); 424 + if (ret) 425 + return false; 426 + return true; 427 + } 428 + 429 + bool dm_pp_get_static_clocks( 430 + const struct dc_context *ctx, 431 + struct dm_pp_static_clock_info *static_clk_info) 432 + { 433 + struct amdgpu_device *adev = ctx->driver_context; 434 + struct amd_pp_clock_info pp_clk_info = {0}; 435 + int ret = 0; 436 + 437 + if (adev->powerplay.pp_funcs->get_current_clocks) 438 + ret = adev->powerplay.pp_funcs->get_current_clocks( 439 + adev->powerplay.pp_handle, 440 + &pp_clk_info); 441 + if (ret) 442 + return false; 443 + 444 + static_clk_info->max_clocks_state = pp_clk_info.max_clocks_state; 445 + static_clk_info->max_mclk_khz = pp_clk_info.max_memory_clock; 446 + static_clk_info->max_sclk_khz = pp_clk_info.max_engine_clock; 447 + 448 + return true; 449 + } 450 + 451 + void pp_rv_set_display_requirement(struct pp_smu *pp, 452 + struct pp_smu_display_requirement_rv *req) 453 + { 454 + struct dc_context *ctx = pp->ctx; 455 + struct amdgpu_device *adev = ctx->driver_context; 456 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 457 + 458 + if (!pp_funcs || !pp_funcs->display_configuration_changed) 459 + return; 460 + 461 + amdgpu_dpm_display_configuration_changed(adev); 462 + } 463 + 464 + void pp_rv_set_wm_ranges(struct pp_smu *pp, 465 + struct pp_smu_wm_range_sets *ranges) 466 + { 467 + struct dc_context *ctx = pp->ctx; 468 + struct amdgpu_device *adev = ctx->driver_context; 469 + void *pp_handle = adev->powerplay.pp_handle; 470 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 471 + struct dm_pp_wm_sets_with_clock_ranges_soc15 wm_with_clock_ranges; 472 + struct dm_pp_clock_range_for_dmif_wm_set_soc15 *wm_dce_clocks = wm_with_clock_ranges.wm_dmif_clocks_ranges; 473 + struct dm_pp_clock_range_for_mcif_wm_set_soc15 *wm_soc_clocks = wm_with_clock_ranges.wm_mcif_clocks_ranges; 474 + int32_t i; 475 + 476 + wm_with_clock_ranges.num_wm_dmif_sets = ranges->num_reader_wm_sets; 477 + wm_with_clock_ranges.num_wm_mcif_sets = ranges->num_writer_wm_sets; 478 + 479 + for (i = 0; i < wm_with_clock_ranges.num_wm_dmif_sets; i++) { 480 + if (ranges->reader_wm_sets[i].wm_inst > 3) 481 + wm_dce_clocks[i].wm_set_id = WM_SET_A; 482 + else 483 + wm_dce_clocks[i].wm_set_id = 484 + ranges->reader_wm_sets[i].wm_inst; 485 + wm_dce_clocks[i].wm_max_dcfclk_clk_in_khz = 486 + ranges->reader_wm_sets[i].max_drain_clk_khz; 487 + wm_dce_clocks[i].wm_min_dcfclk_clk_in_khz = 488 + ranges->reader_wm_sets[i].min_drain_clk_khz; 489 + wm_dce_clocks[i].wm_max_mem_clk_in_khz = 490 + ranges->reader_wm_sets[i].max_fill_clk_khz; 491 + wm_dce_clocks[i].wm_min_mem_clk_in_khz = 492 + ranges->reader_wm_sets[i].min_fill_clk_khz; 493 + } 494 + 495 + for (i = 0; i < wm_with_clock_ranges.num_wm_mcif_sets; i++) { 496 + if (ranges->writer_wm_sets[i].wm_inst > 3) 497 + wm_soc_clocks[i].wm_set_id = WM_SET_A; 498 + else 499 + wm_soc_clocks[i].wm_set_id = 500 + ranges->writer_wm_sets[i].wm_inst; 501 + wm_soc_clocks[i].wm_max_socclk_clk_in_khz = 502 + ranges->writer_wm_sets[i].max_fill_clk_khz; 503 + wm_soc_clocks[i].wm_min_socclk_clk_in_khz = 504 + ranges->writer_wm_sets[i].min_fill_clk_khz; 505 + wm_soc_clocks[i].wm_max_mem_clk_in_khz = 506 + ranges->writer_wm_sets[i].max_drain_clk_khz; 507 + wm_soc_clocks[i].wm_min_mem_clk_in_khz = 508 + ranges->writer_wm_sets[i].min_drain_clk_khz; 509 + } 510 + 511 + pp_funcs->set_watermarks_for_clocks_ranges(pp_handle, &wm_with_clock_ranges); 512 + } 513 + 514 + void pp_rv_set_pme_wa_enable(struct pp_smu *pp) 515 + { 516 + struct dc_context *ctx = pp->ctx; 517 + struct amdgpu_device *adev = ctx->driver_context; 518 + void *pp_handle = adev->powerplay.pp_handle; 519 + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 520 + 521 + if (!pp_funcs || !pp_funcs->notify_smu_enable_pwe) 522 + return; 523 + 524 + pp_funcs->notify_smu_enable_pwe(pp_handle); 525 + } 526 + 527 + void dm_pp_get_funcs_rv( 528 + struct dc_context *ctx, 529 + struct pp_smu_funcs_rv *funcs) 530 + { 531 + funcs->pp_smu.ctx = ctx; 532 + funcs->set_display_requirement = pp_rv_set_display_requirement; 533 + funcs->set_wm_ranges = pp_rv_set_wm_ranges; 534 + funcs->set_pme_wa_enable = pp_rv_set_pme_wa_enable; 535 + }
+2 -322
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
··· 35 35 #include "amdgpu_dm_irq.h" 36 36 #include "amdgpu_pm.h" 37 37 38 + 39 + 38 40 unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx, 39 41 unsigned long long current_time_stamp, 40 42 unsigned long long last_time_stamp) ··· 74 72 75 73 /**** power component interfaces ****/ 76 74 77 - bool dm_pp_apply_display_requirements( 78 - const struct dc_context *ctx, 79 - const struct dm_pp_display_configuration *pp_display_cfg) 80 - { 81 - struct amdgpu_device *adev = ctx->driver_context; 82 75 83 - if (adev->pm.dpm_enabled) { 84 - 85 - memset(&adev->pm.pm_display_cfg, 0, 86 - sizeof(adev->pm.pm_display_cfg)); 87 - 88 - adev->pm.pm_display_cfg.cpu_cc6_disable = 89 - pp_display_cfg->cpu_cc6_disable; 90 - 91 - adev->pm.pm_display_cfg.cpu_pstate_disable = 92 - pp_display_cfg->cpu_pstate_disable; 93 - 94 - adev->pm.pm_display_cfg.cpu_pstate_separation_time = 95 - pp_display_cfg->cpu_pstate_separation_time; 96 - 97 - adev->pm.pm_display_cfg.nb_pstate_switch_disable = 98 - pp_display_cfg->nb_pstate_switch_disable; 99 - 100 - adev->pm.pm_display_cfg.num_display = 101 - pp_display_cfg->display_count; 102 - adev->pm.pm_display_cfg.num_path_including_non_display = 103 - pp_display_cfg->display_count; 104 - 105 - adev->pm.pm_display_cfg.min_core_set_clock = 106 - pp_display_cfg->min_engine_clock_khz/10; 107 - adev->pm.pm_display_cfg.min_core_set_clock_in_sr = 108 - pp_display_cfg->min_engine_clock_deep_sleep_khz/10; 109 - adev->pm.pm_display_cfg.min_mem_set_clock = 110 - pp_display_cfg->min_memory_clock_khz/10; 111 - 112 - adev->pm.pm_display_cfg.multi_monitor_in_sync = 113 - pp_display_cfg->all_displays_in_sync; 114 - adev->pm.pm_display_cfg.min_vblank_time = 115 - pp_display_cfg->avail_mclk_switch_time_us; 116 - 117 - adev->pm.pm_display_cfg.display_clk = 118 - pp_display_cfg->disp_clk_khz/10; 119 - 120 - adev->pm.pm_display_cfg.dce_tolerable_mclk_in_active_latency = 121 - pp_display_cfg->avail_mclk_switch_time_in_disp_active_us; 122 - 123 - adev->pm.pm_display_cfg.crtc_index = pp_display_cfg->crtc_index; 124 - adev->pm.pm_display_cfg.line_time_in_us = 125 - pp_display_cfg->line_time_in_us; 126 - 127 - adev->pm.pm_display_cfg.vrefresh = pp_display_cfg->disp_configs[0].v_refresh; 128 - adev->pm.pm_display_cfg.crossfire_display_index = -1; 129 - adev->pm.pm_display_cfg.min_bus_bandwidth = 0; 130 - 131 - /* TODO: complete implementation of 132 - * pp_display_configuration_change(). 133 - * Follow example of: 134 - * PHM_StoreDALConfigurationData - powerplay\hwmgr\hardwaremanager.c 135 - * PP_IRI_DisplayConfigurationChange - powerplay\eventmgr\iri.c */ 136 - if (adev->powerplay.pp_funcs->display_configuration_change) 137 - adev->powerplay.pp_funcs->display_configuration_change( 138 - adev->powerplay.pp_handle, 139 - &adev->pm.pm_display_cfg); 140 - 141 - /* TODO: replace by a separate call to 'apply display cfg'? */ 142 - amdgpu_pm_compute_clocks(adev); 143 - } 144 - 145 - return true; 146 - } 147 - 148 - static void get_default_clock_levels( 149 - enum dm_pp_clock_type clk_type, 150 - struct dm_pp_clock_levels *clks) 151 - { 152 - uint32_t disp_clks_in_khz[6] = { 153 - 300000, 400000, 496560, 626090, 685720, 757900 }; 154 - uint32_t sclks_in_khz[6] = { 155 - 300000, 360000, 423530, 514290, 626090, 720000 }; 156 - uint32_t mclks_in_khz[2] = { 333000, 800000 }; 157 - 158 - switch (clk_type) { 159 - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 160 - clks->num_levels = 6; 161 - memmove(clks->clocks_in_khz, disp_clks_in_khz, 162 - sizeof(disp_clks_in_khz)); 163 - break; 164 - case DM_PP_CLOCK_TYPE_ENGINE_CLK: 165 - clks->num_levels = 6; 166 - memmove(clks->clocks_in_khz, sclks_in_khz, 167 - sizeof(sclks_in_khz)); 168 - break; 169 - case DM_PP_CLOCK_TYPE_MEMORY_CLK: 170 - clks->num_levels = 2; 171 - memmove(clks->clocks_in_khz, mclks_in_khz, 172 - sizeof(mclks_in_khz)); 173 - break; 174 - default: 175 - clks->num_levels = 0; 176 - break; 177 - } 178 - } 179 - 180 - static enum amd_pp_clock_type dc_to_pp_clock_type( 181 - enum dm_pp_clock_type dm_pp_clk_type) 182 - { 183 - enum amd_pp_clock_type amd_pp_clk_type = 0; 184 - 185 - switch (dm_pp_clk_type) { 186 - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 187 - amd_pp_clk_type = amd_pp_disp_clock; 188 - break; 189 - case DM_PP_CLOCK_TYPE_ENGINE_CLK: 190 - amd_pp_clk_type = amd_pp_sys_clock; 191 - break; 192 - case DM_PP_CLOCK_TYPE_MEMORY_CLK: 193 - amd_pp_clk_type = amd_pp_mem_clock; 194 - break; 195 - default: 196 - DRM_ERROR("DM_PPLIB: invalid clock type: %d!\n", 197 - dm_pp_clk_type); 198 - break; 199 - } 200 - 201 - return amd_pp_clk_type; 202 - } 203 - 204 - static void pp_to_dc_clock_levels( 205 - const struct amd_pp_clocks *pp_clks, 206 - struct dm_pp_clock_levels *dc_clks, 207 - enum dm_pp_clock_type dc_clk_type) 208 - { 209 - uint32_t i; 210 - 211 - if (pp_clks->count > DM_PP_MAX_CLOCK_LEVELS) { 212 - DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 213 - DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 214 - pp_clks->count, 215 - DM_PP_MAX_CLOCK_LEVELS); 216 - 217 - dc_clks->num_levels = DM_PP_MAX_CLOCK_LEVELS; 218 - } else 219 - dc_clks->num_levels = pp_clks->count; 220 - 221 - DRM_INFO("DM_PPLIB: values for %s clock\n", 222 - DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 223 - 224 - for (i = 0; i < dc_clks->num_levels; i++) { 225 - DRM_INFO("DM_PPLIB:\t %d\n", pp_clks->clock[i]); 226 - /* translate 10kHz to kHz */ 227 - dc_clks->clocks_in_khz[i] = pp_clks->clock[i] * 10; 228 - } 229 - } 230 - 231 - static void pp_to_dc_clock_levels_with_latency( 232 - const struct pp_clock_levels_with_latency *pp_clks, 233 - struct dm_pp_clock_levels_with_latency *clk_level_info, 234 - enum dm_pp_clock_type dc_clk_type) 235 - { 236 - uint32_t i; 237 - 238 - if (pp_clks->num_levels > DM_PP_MAX_CLOCK_LEVELS) { 239 - DRM_INFO("DM_PPLIB: Warning: %s clock: number of levels %d exceeds maximum of %d!\n", 240 - DC_DECODE_PP_CLOCK_TYPE(dc_clk_type), 241 - pp_clks->num_levels, 242 - DM_PP_MAX_CLOCK_LEVELS); 243 - 244 - clk_level_info->num_levels = DM_PP_MAX_CLOCK_LEVELS; 245 - } else 246 - clk_level_info->num_levels = pp_clks->num_levels; 247 - 248 - DRM_DEBUG("DM_PPLIB: values for %s clock\n", 249 - DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 250 - 251 - for (i = 0; i < clk_level_info->num_levels; i++) { 252 - DRM_DEBUG("DM_PPLIB:\t %d\n", pp_clks->data[i].clocks_in_khz); 253 - clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz; 254 - clk_level_info->data[i].latency_in_us = pp_clks->data[i].latency_in_us; 255 - } 256 - } 257 - 258 - bool dm_pp_get_clock_levels_by_type( 259 - const struct dc_context *ctx, 260 - enum dm_pp_clock_type clk_type, 261 - struct dm_pp_clock_levels *dc_clks) 262 - { 263 - struct amdgpu_device *adev = ctx->driver_context; 264 - void *pp_handle = adev->powerplay.pp_handle; 265 - struct amd_pp_clocks pp_clks = { 0 }; 266 - struct amd_pp_simple_clock_info validation_clks = { 0 }; 267 - uint32_t i; 268 - 269 - if (adev->powerplay.pp_funcs->get_clock_by_type) { 270 - if (adev->powerplay.pp_funcs->get_clock_by_type(pp_handle, 271 - dc_to_pp_clock_type(clk_type), &pp_clks)) { 272 - /* Error in pplib. Provide default values. */ 273 - get_default_clock_levels(clk_type, dc_clks); 274 - return true; 275 - } 276 - } 277 - 278 - pp_to_dc_clock_levels(&pp_clks, dc_clks, clk_type); 279 - 280 - if (adev->powerplay.pp_funcs->get_display_mode_validation_clocks) { 281 - if (adev->powerplay.pp_funcs->get_display_mode_validation_clocks( 282 - pp_handle, &validation_clks)) { 283 - /* Error in pplib. Provide default values. */ 284 - DRM_INFO("DM_PPLIB: Warning: using default validation clocks!\n"); 285 - validation_clks.engine_max_clock = 72000; 286 - validation_clks.memory_max_clock = 80000; 287 - validation_clks.level = 0; 288 - } 289 - } 290 - 291 - DRM_INFO("DM_PPLIB: Validation clocks:\n"); 292 - DRM_INFO("DM_PPLIB: engine_max_clock: %d\n", 293 - validation_clks.engine_max_clock); 294 - DRM_INFO("DM_PPLIB: memory_max_clock: %d\n", 295 - validation_clks.memory_max_clock); 296 - DRM_INFO("DM_PPLIB: level : %d\n", 297 - validation_clks.level); 298 - 299 - /* Translate 10 kHz to kHz. */ 300 - validation_clks.engine_max_clock *= 10; 301 - validation_clks.memory_max_clock *= 10; 302 - 303 - /* Determine the highest non-boosted level from the Validation Clocks */ 304 - if (clk_type == DM_PP_CLOCK_TYPE_ENGINE_CLK) { 305 - for (i = 0; i < dc_clks->num_levels; i++) { 306 - if (dc_clks->clocks_in_khz[i] > validation_clks.engine_max_clock) { 307 - /* This clock is higher the validation clock. 308 - * Than means the previous one is the highest 309 - * non-boosted one. */ 310 - DRM_INFO("DM_PPLIB: reducing engine clock level from %d to %d\n", 311 - dc_clks->num_levels, i); 312 - dc_clks->num_levels = i > 0 ? i : 1; 313 - break; 314 - } 315 - } 316 - } else if (clk_type == DM_PP_CLOCK_TYPE_MEMORY_CLK) { 317 - for (i = 0; i < dc_clks->num_levels; i++) { 318 - if (dc_clks->clocks_in_khz[i] > validation_clks.memory_max_clock) { 319 - DRM_INFO("DM_PPLIB: reducing memory clock level from %d to %d\n", 320 - dc_clks->num_levels, i); 321 - dc_clks->num_levels = i > 0 ? i : 1; 322 - break; 323 - } 324 - } 325 - } 326 - 327 - return true; 328 - } 329 - 330 - bool dm_pp_get_clock_levels_by_type_with_latency( 331 - const struct dc_context *ctx, 332 - enum dm_pp_clock_type clk_type, 333 - struct dm_pp_clock_levels_with_latency *clk_level_info) 334 - { 335 - struct amdgpu_device *adev = ctx->driver_context; 336 - void *pp_handle = adev->powerplay.pp_handle; 337 - struct pp_clock_levels_with_latency pp_clks = { 0 }; 338 - const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 339 - 340 - if (!pp_funcs || !pp_funcs->get_clock_by_type_with_latency) 341 - return false; 342 - 343 - if (pp_funcs->get_clock_by_type_with_latency(pp_handle, 344 - dc_to_pp_clock_type(clk_type), 345 - &pp_clks)) 346 - return false; 347 - 348 - pp_to_dc_clock_levels_with_latency(&pp_clks, clk_level_info, clk_type); 349 - 350 - return true; 351 - } 352 - 353 - bool dm_pp_get_clock_levels_by_type_with_voltage( 354 - const struct dc_context *ctx, 355 - enum dm_pp_clock_type clk_type, 356 - struct dm_pp_clock_levels_with_voltage *clk_level_info) 357 - { 358 - /* TODO: to be implemented */ 359 - return false; 360 - } 361 - 362 - bool dm_pp_notify_wm_clock_changes( 363 - const struct dc_context *ctx, 364 - struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges) 365 - { 366 - /* TODO: to be implemented */ 367 - return false; 368 - } 369 - 370 - bool dm_pp_apply_power_level_change_request( 371 - const struct dc_context *ctx, 372 - struct dm_pp_power_level_change_request *level_change_req) 373 - { 374 - /* TODO: to be implemented */ 375 - return false; 376 - } 377 - 378 - bool dm_pp_apply_clock_for_voltage_request( 379 - const struct dc_context *ctx, 380 - struct dm_pp_clock_for_voltage_req *clock_for_voltage_req) 381 - { 382 - /* TODO: to be implemented */ 383 - return false; 384 - } 385 - 386 - bool dm_pp_get_static_clocks( 387 - const struct dc_context *ctx, 388 - struct dm_pp_static_clock_info *static_clk_info) 389 - { 390 - /* TODO: to be implemented */ 391 - return false; 392 - } 393 - 394 - void dm_pp_get_funcs_rv( 395 - struct dc_context *ctx, 396 - struct pp_smu_funcs_rv *funcs) 397 - {} 398 - 399 - /**** end of power component interfaces ****/
+196
drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
··· 3762 3762 return NULL; 3763 3763 } 3764 3764 3765 + enum bp_result update_slot_layout_info( 3766 + struct dc_bios *dcb, 3767 + unsigned int i, 3768 + struct slot_layout_info *slot_layout_info, 3769 + unsigned int record_offset) 3770 + { 3771 + unsigned int j; 3772 + struct bios_parser *bp; 3773 + ATOM_BRACKET_LAYOUT_RECORD *record; 3774 + ATOM_COMMON_RECORD_HEADER *record_header; 3775 + enum bp_result result = BP_RESULT_NORECORD; 3776 + 3777 + bp = BP_FROM_DCB(dcb); 3778 + record = NULL; 3779 + record_header = NULL; 3780 + 3781 + for (;;) { 3782 + 3783 + record_header = (ATOM_COMMON_RECORD_HEADER *) 3784 + GET_IMAGE(ATOM_COMMON_RECORD_HEADER, record_offset); 3785 + if (record_header == NULL) { 3786 + result = BP_RESULT_BADBIOSTABLE; 3787 + break; 3788 + } 3789 + 3790 + /* the end of the list */ 3791 + if (record_header->ucRecordType == 0xff || 3792 + record_header->ucRecordSize == 0) { 3793 + break; 3794 + } 3795 + 3796 + if (record_header->ucRecordType == 3797 + ATOM_BRACKET_LAYOUT_RECORD_TYPE && 3798 + sizeof(ATOM_BRACKET_LAYOUT_RECORD) 3799 + <= record_header->ucRecordSize) { 3800 + record = (ATOM_BRACKET_LAYOUT_RECORD *) 3801 + (record_header); 3802 + result = BP_RESULT_OK; 3803 + break; 3804 + } 3805 + 3806 + record_offset += record_header->ucRecordSize; 3807 + } 3808 + 3809 + /* return if the record not found */ 3810 + if (result != BP_RESULT_OK) 3811 + return result; 3812 + 3813 + /* get slot sizes */ 3814 + slot_layout_info->length = record->ucLength; 3815 + slot_layout_info->width = record->ucWidth; 3816 + 3817 + /* get info for each connector in the slot */ 3818 + slot_layout_info->num_of_connectors = record->ucConnNum; 3819 + for (j = 0; j < slot_layout_info->num_of_connectors; ++j) { 3820 + slot_layout_info->connectors[j].connector_type = 3821 + (enum connector_layout_type) 3822 + (record->asConnInfo[j].ucConnectorType); 3823 + switch (record->asConnInfo[j].ucConnectorType) { 3824 + case CONNECTOR_TYPE_DVI_D: 3825 + slot_layout_info->connectors[j].connector_type = 3826 + CONNECTOR_LAYOUT_TYPE_DVI_D; 3827 + slot_layout_info->connectors[j].length = 3828 + CONNECTOR_SIZE_DVI; 3829 + break; 3830 + 3831 + case CONNECTOR_TYPE_HDMI: 3832 + slot_layout_info->connectors[j].connector_type = 3833 + CONNECTOR_LAYOUT_TYPE_HDMI; 3834 + slot_layout_info->connectors[j].length = 3835 + CONNECTOR_SIZE_HDMI; 3836 + break; 3837 + 3838 + case CONNECTOR_TYPE_DISPLAY_PORT: 3839 + slot_layout_info->connectors[j].connector_type = 3840 + CONNECTOR_LAYOUT_TYPE_DP; 3841 + slot_layout_info->connectors[j].length = 3842 + CONNECTOR_SIZE_DP; 3843 + break; 3844 + 3845 + case CONNECTOR_TYPE_MINI_DISPLAY_PORT: 3846 + slot_layout_info->connectors[j].connector_type = 3847 + CONNECTOR_LAYOUT_TYPE_MINI_DP; 3848 + slot_layout_info->connectors[j].length = 3849 + CONNECTOR_SIZE_MINI_DP; 3850 + break; 3851 + 3852 + default: 3853 + slot_layout_info->connectors[j].connector_type = 3854 + CONNECTOR_LAYOUT_TYPE_UNKNOWN; 3855 + slot_layout_info->connectors[j].length = 3856 + CONNECTOR_SIZE_UNKNOWN; 3857 + } 3858 + 3859 + slot_layout_info->connectors[j].position = 3860 + record->asConnInfo[j].ucPosition; 3861 + slot_layout_info->connectors[j].connector_id = 3862 + object_id_from_bios_object_id( 3863 + record->asConnInfo[j].usConnectorObjectId); 3864 + } 3865 + return result; 3866 + } 3867 + 3868 + 3869 + enum bp_result get_bracket_layout_record( 3870 + struct dc_bios *dcb, 3871 + unsigned int bracket_layout_id, 3872 + struct slot_layout_info *slot_layout_info) 3873 + { 3874 + unsigned int i; 3875 + unsigned int record_offset; 3876 + struct bios_parser *bp; 3877 + enum bp_result result; 3878 + ATOM_OBJECT *object; 3879 + ATOM_OBJECT_TABLE *object_table; 3880 + unsigned int genericTableOffset; 3881 + 3882 + bp = BP_FROM_DCB(dcb); 3883 + object = NULL; 3884 + if (slot_layout_info == NULL) { 3885 + DC_LOG_DETECTION_EDID_PARSER("Invalid slot_layout_info\n"); 3886 + return BP_RESULT_BADINPUT; 3887 + } 3888 + 3889 + 3890 + genericTableOffset = bp->object_info_tbl_offset + 3891 + bp->object_info_tbl.v1_3->usMiscObjectTableOffset; 3892 + object_table = (ATOM_OBJECT_TABLE *) 3893 + GET_IMAGE(ATOM_OBJECT_TABLE, genericTableOffset); 3894 + if (!object_table) 3895 + return BP_RESULT_FAILURE; 3896 + 3897 + result = BP_RESULT_NORECORD; 3898 + for (i = 0; i < object_table->ucNumberOfObjects; ++i) { 3899 + 3900 + if (bracket_layout_id == 3901 + object_table->asObjects[i].usObjectID) { 3902 + 3903 + object = &object_table->asObjects[i]; 3904 + record_offset = object->usRecordOffset + 3905 + bp->object_info_tbl_offset; 3906 + 3907 + result = update_slot_layout_info(dcb, i, 3908 + slot_layout_info, record_offset); 3909 + break; 3910 + } 3911 + } 3912 + return result; 3913 + } 3914 + 3915 + static enum bp_result bios_get_board_layout_info( 3916 + struct dc_bios *dcb, 3917 + struct board_layout_info *board_layout_info) 3918 + { 3919 + unsigned int i; 3920 + struct bios_parser *bp; 3921 + enum bp_result record_result; 3922 + 3923 + const unsigned int slot_index_to_vbios_id[MAX_BOARD_SLOTS] = { 3924 + GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1, 3925 + GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2, 3926 + 0, 0 3927 + }; 3928 + 3929 + bp = BP_FROM_DCB(dcb); 3930 + if (board_layout_info == NULL) { 3931 + DC_LOG_DETECTION_EDID_PARSER("Invalid board_layout_info\n"); 3932 + return BP_RESULT_BADINPUT; 3933 + } 3934 + 3935 + board_layout_info->num_of_slots = 0; 3936 + 3937 + for (i = 0; i < MAX_BOARD_SLOTS; ++i) { 3938 + record_result = get_bracket_layout_record(dcb, 3939 + slot_index_to_vbios_id[i], 3940 + &board_layout_info->slots[i]); 3941 + 3942 + if (record_result == BP_RESULT_NORECORD && i > 0) 3943 + break; /* no more slots present in bios */ 3944 + else if (record_result != BP_RESULT_OK) 3945 + return record_result; /* fail */ 3946 + 3947 + ++board_layout_info->num_of_slots; 3948 + } 3949 + 3950 + /* all data is valid */ 3951 + board_layout_info->is_number_of_slots_valid = 1; 3952 + board_layout_info->is_slots_size_valid = 1; 3953 + board_layout_info->is_connector_offsets_valid = 1; 3954 + board_layout_info->is_connector_lengths_valid = 1; 3955 + 3956 + return BP_RESULT_OK; 3957 + } 3958 + 3765 3959 /******************************************************************************/ 3766 3960 3767 3961 static const struct dc_vbios_funcs vbios_funcs = { ··· 4030 3836 .post_init = bios_parser_post_init, /* patch vbios table for mxm module by reading i2c */ 4031 3837 4032 3838 .bios_parser_destroy = bios_parser_destroy, 3839 + 3840 + .get_board_layout_info = bios_get_board_layout_info, 4033 3841 }; 4034 3842 4035 3843 static bool bios_parser_construct(
+217 -1
drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
··· 43 43 #include "bios_parser_interface.h" 44 44 45 45 #include "bios_parser_common.h" 46 + 47 + /* Temporarily add in defines until ObjectID.h patch is updated in a few days */ 48 + #ifndef GENERIC_OBJECT_ID_BRACKET_LAYOUT 49 + #define GENERIC_OBJECT_ID_BRACKET_LAYOUT 0x05 50 + #endif /* GENERIC_OBJECT_ID_BRACKET_LAYOUT */ 51 + 52 + #ifndef GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 53 + #define GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 \ 54 + (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 55 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 56 + GENERIC_OBJECT_ID_BRACKET_LAYOUT << OBJECT_ID_SHIFT) 57 + #endif /* GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 */ 58 + 59 + #ifndef GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 60 + #define GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 \ 61 + (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 62 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 63 + GENERIC_OBJECT_ID_BRACKET_LAYOUT << OBJECT_ID_SHIFT) 64 + #endif /* GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 */ 65 + 66 + #define DC_LOGGER \ 67 + bp->base.ctx->logger 68 + 46 69 #define LAST_RECORD_TYPE 0xff 47 70 #define SMU9_SYSPLL0_ID 0 48 71 ··· 108 85 #define BIOS_IMAGE_SIZE_UNIT 512 109 86 110 87 #define DATA_TABLES(table) (bp->master_data_tbl->listOfdatatables.table) 111 - 112 88 113 89 static void destruct(struct bios_parser *bp) 114 90 { ··· 1876 1854 return NULL; 1877 1855 } 1878 1856 1857 + static enum bp_result update_slot_layout_info( 1858 + struct dc_bios *dcb, 1859 + unsigned int i, 1860 + struct slot_layout_info *slot_layout_info) 1861 + { 1862 + unsigned int record_offset; 1863 + unsigned int j; 1864 + struct atom_display_object_path_v2 *object; 1865 + struct atom_bracket_layout_record *record; 1866 + struct atom_common_record_header *record_header; 1867 + enum bp_result result; 1868 + struct bios_parser *bp; 1869 + struct object_info_table *tbl; 1870 + struct display_object_info_table_v1_4 *v1_4; 1871 + 1872 + record = NULL; 1873 + record_header = NULL; 1874 + result = BP_RESULT_NORECORD; 1875 + 1876 + bp = BP_FROM_DCB(dcb); 1877 + tbl = &bp->object_info_tbl; 1878 + v1_4 = tbl->v1_4; 1879 + 1880 + object = &v1_4->display_path[i]; 1881 + record_offset = (unsigned int) 1882 + (object->disp_recordoffset) + 1883 + (unsigned int)(bp->object_info_tbl_offset); 1884 + 1885 + for (;;) { 1886 + 1887 + record_header = (struct atom_common_record_header *) 1888 + GET_IMAGE(struct atom_common_record_header, 1889 + record_offset); 1890 + if (record_header == NULL) { 1891 + result = BP_RESULT_BADBIOSTABLE; 1892 + break; 1893 + } 1894 + 1895 + /* the end of the list */ 1896 + if (record_header->record_type == 0xff || 1897 + record_header->record_size == 0) { 1898 + break; 1899 + } 1900 + 1901 + if (record_header->record_type == 1902 + ATOM_BRACKET_LAYOUT_RECORD_TYPE && 1903 + sizeof(struct atom_bracket_layout_record) 1904 + <= record_header->record_size) { 1905 + record = (struct atom_bracket_layout_record *) 1906 + (record_header); 1907 + result = BP_RESULT_OK; 1908 + break; 1909 + } 1910 + 1911 + record_offset += record_header->record_size; 1912 + } 1913 + 1914 + /* return if the record not found */ 1915 + if (result != BP_RESULT_OK) 1916 + return result; 1917 + 1918 + /* get slot sizes */ 1919 + slot_layout_info->length = record->bracketlen; 1920 + slot_layout_info->width = record->bracketwidth; 1921 + 1922 + /* get info for each connector in the slot */ 1923 + slot_layout_info->num_of_connectors = record->conn_num; 1924 + for (j = 0; j < slot_layout_info->num_of_connectors; ++j) { 1925 + slot_layout_info->connectors[j].connector_type = 1926 + (enum connector_layout_type) 1927 + (record->conn_info[j].connector_type); 1928 + switch (record->conn_info[j].connector_type) { 1929 + case CONNECTOR_TYPE_DVI_D: 1930 + slot_layout_info->connectors[j].connector_type = 1931 + CONNECTOR_LAYOUT_TYPE_DVI_D; 1932 + slot_layout_info->connectors[j].length = 1933 + CONNECTOR_SIZE_DVI; 1934 + break; 1935 + 1936 + case CONNECTOR_TYPE_HDMI: 1937 + slot_layout_info->connectors[j].connector_type = 1938 + CONNECTOR_LAYOUT_TYPE_HDMI; 1939 + slot_layout_info->connectors[j].length = 1940 + CONNECTOR_SIZE_HDMI; 1941 + break; 1942 + 1943 + case CONNECTOR_TYPE_DISPLAY_PORT: 1944 + slot_layout_info->connectors[j].connector_type = 1945 + CONNECTOR_LAYOUT_TYPE_DP; 1946 + slot_layout_info->connectors[j].length = 1947 + CONNECTOR_SIZE_DP; 1948 + break; 1949 + 1950 + case CONNECTOR_TYPE_MINI_DISPLAY_PORT: 1951 + slot_layout_info->connectors[j].connector_type = 1952 + CONNECTOR_LAYOUT_TYPE_MINI_DP; 1953 + slot_layout_info->connectors[j].length = 1954 + CONNECTOR_SIZE_MINI_DP; 1955 + break; 1956 + 1957 + default: 1958 + slot_layout_info->connectors[j].connector_type = 1959 + CONNECTOR_LAYOUT_TYPE_UNKNOWN; 1960 + slot_layout_info->connectors[j].length = 1961 + CONNECTOR_SIZE_UNKNOWN; 1962 + } 1963 + 1964 + slot_layout_info->connectors[j].position = 1965 + record->conn_info[j].position; 1966 + slot_layout_info->connectors[j].connector_id = 1967 + object_id_from_bios_object_id( 1968 + record->conn_info[j].connectorobjid); 1969 + } 1970 + return result; 1971 + } 1972 + 1973 + 1974 + static enum bp_result get_bracket_layout_record( 1975 + struct dc_bios *dcb, 1976 + unsigned int bracket_layout_id, 1977 + struct slot_layout_info *slot_layout_info) 1978 + { 1979 + unsigned int i; 1980 + struct bios_parser *bp = BP_FROM_DCB(dcb); 1981 + enum bp_result result; 1982 + struct object_info_table *tbl; 1983 + struct display_object_info_table_v1_4 *v1_4; 1984 + 1985 + if (slot_layout_info == NULL) { 1986 + DC_LOG_DETECTION_EDID_PARSER("Invalid slot_layout_info\n"); 1987 + return BP_RESULT_BADINPUT; 1988 + } 1989 + tbl = &bp->object_info_tbl; 1990 + v1_4 = tbl->v1_4; 1991 + 1992 + result = BP_RESULT_NORECORD; 1993 + for (i = 0; i < v1_4->number_of_path; ++i) { 1994 + 1995 + if (bracket_layout_id == 1996 + v1_4->display_path[i].display_objid) { 1997 + result = update_slot_layout_info(dcb, i, 1998 + slot_layout_info); 1999 + break; 2000 + } 2001 + } 2002 + return result; 2003 + } 2004 + 2005 + static enum bp_result bios_get_board_layout_info( 2006 + struct dc_bios *dcb, 2007 + struct board_layout_info *board_layout_info) 2008 + { 2009 + unsigned int i; 2010 + struct bios_parser *bp; 2011 + enum bp_result record_result; 2012 + 2013 + const unsigned int slot_index_to_vbios_id[MAX_BOARD_SLOTS] = { 2014 + GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1, 2015 + GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2, 2016 + 0, 0 2017 + }; 2018 + 2019 + bp = BP_FROM_DCB(dcb); 2020 + if (board_layout_info == NULL) { 2021 + DC_LOG_DETECTION_EDID_PARSER("Invalid board_layout_info\n"); 2022 + return BP_RESULT_BADINPUT; 2023 + } 2024 + 2025 + board_layout_info->num_of_slots = 0; 2026 + 2027 + for (i = 0; i < MAX_BOARD_SLOTS; ++i) { 2028 + record_result = get_bracket_layout_record(dcb, 2029 + slot_index_to_vbios_id[i], 2030 + &board_layout_info->slots[i]); 2031 + 2032 + if (record_result == BP_RESULT_NORECORD && i > 0) 2033 + break; /* no more slots present in bios */ 2034 + else if (record_result != BP_RESULT_OK) 2035 + return record_result; /* fail */ 2036 + 2037 + ++board_layout_info->num_of_slots; 2038 + } 2039 + 2040 + /* all data is valid */ 2041 + board_layout_info->is_number_of_slots_valid = 1; 2042 + board_layout_info->is_slots_size_valid = 1; 2043 + board_layout_info->is_connector_offsets_valid = 1; 2044 + board_layout_info->is_connector_lengths_valid = 1; 2045 + 2046 + return BP_RESULT_OK; 2047 + } 2048 + 1879 2049 static const struct dc_vbios_funcs vbios_funcs = { 1880 2050 .get_connectors_number = bios_parser_get_connectors_number, 1881 2051 ··· 2139 1925 .bios_parser_destroy = firmware_parser_destroy, 2140 1926 2141 1927 .get_smu_clock_info = bios_parser_get_smu_clock_info, 1928 + 1929 + .get_board_layout_info = bios_get_board_layout_info, 2142 1930 }; 2143 1931 2144 1932 static bool bios_parser_construct(
+17 -29
drivers/gpu/drm/amd/display/dc/bios/command_table2.c
··· 59 59 bios_cmd_table_para_revision(bp->base.ctx->driver_context, \ 60 60 GET_INDEX_INTO_MASTER_TABLE(command, fname)) 61 61 62 - static void init_dig_encoder_control(struct bios_parser *bp); 63 - static void init_transmitter_control(struct bios_parser *bp); 64 - static void init_set_pixel_clock(struct bios_parser *bp); 65 62 66 - static void init_set_crtc_timing(struct bios_parser *bp); 67 - 68 - static void init_select_crtc_source(struct bios_parser *bp); 69 - static void init_enable_crtc(struct bios_parser *bp); 70 - 71 - static void init_external_encoder_control(struct bios_parser *bp); 72 - static void init_enable_disp_power_gating(struct bios_parser *bp); 73 - static void init_set_dce_clock(struct bios_parser *bp); 74 - static void init_get_smu_clock_info(struct bios_parser *bp); 75 - 76 - void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp) 77 - { 78 - init_dig_encoder_control(bp); 79 - init_transmitter_control(bp); 80 - init_set_pixel_clock(bp); 81 - 82 - init_set_crtc_timing(bp); 83 - 84 - init_select_crtc_source(bp); 85 - init_enable_crtc(bp); 86 - 87 - init_external_encoder_control(bp); 88 - init_enable_disp_power_gating(bp); 89 - init_set_dce_clock(bp); 90 - init_get_smu_clock_info(bp); 91 - } 92 63 93 64 static uint32_t bios_cmd_table_para_revision(void *dev, 94 65 uint32_t index) ··· 800 829 return 0; 801 830 } 802 831 832 + void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp) 833 + { 834 + init_dig_encoder_control(bp); 835 + init_transmitter_control(bp); 836 + init_set_pixel_clock(bp); 837 + 838 + init_set_crtc_timing(bp); 839 + 840 + init_select_crtc_source(bp); 841 + init_enable_crtc(bp); 842 + 843 + init_external_encoder_control(bp); 844 + init_enable_disp_power_gating(bp); 845 + init_set_dce_clock(bp); 846 + init_get_smu_clock_info(bp); 847 + 848 + }
+86 -108
drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
··· 31 31 32 32 #include "resource.h" 33 33 #include "dcn10/dcn10_resource.h" 34 + #include "dcn10/dcn10_hubbub.h" 35 + 34 36 #include "dcn_calc_math.h" 35 37 36 38 #define DC_LOGGER \ ··· 425 423 int total_flip_bytes = 0; 426 424 int i; 427 425 426 + memset(dlg_regs, 0, sizeof(*dlg_regs)); 427 + memset(ttu_regs, 0, sizeof(*ttu_regs)); 428 + memset(rq_regs, 0, sizeof(*rq_regs)); 429 + 428 430 for (i = 0; i < number_of_planes; i++) { 429 431 total_active_bw += v->read_bandwidth[i]; 430 432 total_prefetch_bw += v->prefetch_bandwidth[i]; ··· 507 501 resource_build_scaling_params(secondary_pipe); 508 502 } 509 503 504 + #if 0 510 505 static void calc_wm_sets_and_perf_params( 511 506 struct dc_state *context, 512 507 struct dcn_bw_internal_vars *v) ··· 589 582 if (v->voltage_level >= 3) 590 583 context->bw.dcn.watermarks.d = context->bw.dcn.watermarks.a; 591 584 } 585 + #endif 592 586 593 587 static bool dcn_bw_apply_registry_override(struct dc *dc) 594 588 { ··· 891 883 ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dc_fixpt_one.value 892 884 || v->scaler_rec_out_width[input_idx] == v->viewport_height[input_idx]); 893 885 } 894 - v->dcc_enable[input_idx] = pipe->plane_state->dcc.enable ? dcn_bw_yes : dcn_bw_no; 886 + 887 + if (dc->debug.optimized_watermark) { 888 + /* 889 + * this method requires us to always re-calculate watermark when dcc change 890 + * between flip. 891 + */ 892 + v->dcc_enable[input_idx] = pipe->plane_state->dcc.enable ? dcn_bw_yes : dcn_bw_no; 893 + } else { 894 + /* 895 + * allow us to disable dcc on the fly without re-calculating WM 896 + * 897 + * extra overhead for DCC is quite small. for 1080p WM without 898 + * DCC is only 0.417us lower (urgent goes from 6.979us to 6.562us) 899 + */ 900 + unsigned int bpe; 901 + 902 + v->dcc_enable[input_idx] = dc->res_pool->hubbub->funcs->dcc_support_pixel_format( 903 + pipe->plane_state->format, &bpe) ? dcn_bw_yes : dcn_bw_no; 904 + } 905 + 895 906 v->source_pixel_format[input_idx] = tl_pixel_format_to_bw_defs( 896 907 pipe->plane_state->format); 897 908 v->source_surface_mode[input_idx] = tl_sw_mode_to_bw_defs( ··· 1003 976 bw_consumed = v->fabric_and_dram_bandwidth; 1004 977 1005 978 display_pipe_configuration(v); 1006 - calc_wm_sets_and_perf_params(context, v); 1007 - context->bw.dcn.calc_clk.fclk_khz = (int)(bw_consumed * 1000000 / 979 + /*calc_wm_sets_and_perf_params(context, v);*/ 980 + /* Only 1 set is used by dcn since no noticeable 981 + * performance improvement was measured and due to hw bug DEGVIDCN10-254 982 + */ 983 + dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation(v); 984 + 985 + context->bw.dcn.watermarks.a.cstate_pstate.cstate_exit_ns = 986 + v->stutter_exit_watermark * 1000; 987 + context->bw.dcn.watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns = 988 + v->stutter_enter_plus_exit_watermark * 1000; 989 + context->bw.dcn.watermarks.a.cstate_pstate.pstate_change_ns = 990 + v->dram_clock_change_watermark * 1000; 991 + context->bw.dcn.watermarks.a.pte_meta_urgent_ns = v->ptemeta_urgent_watermark * 1000; 992 + context->bw.dcn.watermarks.a.urgent_ns = v->urgent_watermark * 1000; 993 + context->bw.dcn.watermarks.b = context->bw.dcn.watermarks.a; 994 + context->bw.dcn.watermarks.c = context->bw.dcn.watermarks.a; 995 + context->bw.dcn.watermarks.d = context->bw.dcn.watermarks.a; 996 + 997 + context->bw.dcn.clk.fclk_khz = (int)(bw_consumed * 1000000 / 1008 998 (ddr4_dram_factor_single_Channel * v->number_of_channels)); 1009 999 if (bw_consumed == v->fabric_and_dram_bandwidth_vmin0p65) { 1010 - context->bw.dcn.calc_clk.fclk_khz = (int)(bw_consumed * 1000000 / 32); 1000 + context->bw.dcn.clk.fclk_khz = (int)(bw_consumed * 1000000 / 32); 1011 1001 } 1012 1002 1013 - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz = (int)(v->dcf_clk_deep_sleep * 1000); 1014 - context->bw.dcn.calc_clk.dcfclk_khz = (int)(v->dcfclk * 1000); 1003 + context->bw.dcn.clk.dcfclk_deep_sleep_khz = (int)(v->dcf_clk_deep_sleep * 1000); 1004 + context->bw.dcn.clk.dcfclk_khz = (int)(v->dcfclk * 1000); 1015 1005 1016 - context->bw.dcn.calc_clk.dispclk_khz = (int)(v->dispclk * 1000); 1006 + context->bw.dcn.clk.dispclk_khz = (int)(v->dispclk * 1000); 1017 1007 if (dc->debug.max_disp_clk == true) 1018 - context->bw.dcn.calc_clk.dispclk_khz = (int)(dc->dcn_soc->max_dispclk_vmax0p9 * 1000); 1008 + context->bw.dcn.clk.dispclk_khz = (int)(dc->dcn_soc->max_dispclk_vmax0p9 * 1000); 1019 1009 1020 - if (context->bw.dcn.calc_clk.dispclk_khz < 1010 + if (context->bw.dcn.clk.dispclk_khz < 1021 1011 dc->debug.min_disp_clk_khz) { 1022 - context->bw.dcn.calc_clk.dispclk_khz = 1012 + context->bw.dcn.clk.dispclk_khz = 1023 1013 dc->debug.min_disp_clk_khz; 1024 1014 } 1025 1015 1026 - context->bw.dcn.calc_clk.dppclk_khz = context->bw.dcn.calc_clk.dispclk_khz / v->dispclk_dppclk_ratio; 1027 - 1016 + context->bw.dcn.clk.dppclk_khz = context->bw.dcn.clk.dispclk_khz / v->dispclk_dppclk_ratio; 1017 + context->bw.dcn.clk.phyclk_khz = v->phyclk_per_state[v->voltage_level]; 1028 1018 switch (v->voltage_level) { 1029 1019 case 0: 1030 - context->bw.dcn.calc_clk.max_supported_dppclk_khz = 1020 + context->bw.dcn.clk.max_supported_dppclk_khz = 1031 1021 (int)(dc->dcn_soc->max_dppclk_vmin0p65 * 1000); 1032 1022 break; 1033 1023 case 1: 1034 - context->bw.dcn.calc_clk.max_supported_dppclk_khz = 1024 + context->bw.dcn.clk.max_supported_dppclk_khz = 1035 1025 (int)(dc->dcn_soc->max_dppclk_vmid0p72 * 1000); 1036 1026 break; 1037 1027 case 2: 1038 - context->bw.dcn.calc_clk.max_supported_dppclk_khz = 1028 + context->bw.dcn.clk.max_supported_dppclk_khz = 1039 1029 (int)(dc->dcn_soc->max_dppclk_vnom0p8 * 1000); 1040 1030 break; 1041 1031 default: 1042 - context->bw.dcn.calc_clk.max_supported_dppclk_khz = 1032 + context->bw.dcn.clk.max_supported_dppclk_khz = 1043 1033 (int)(dc->dcn_soc->max_dppclk_vmax0p9 * 1000); 1044 1034 break; 1045 1035 } ··· 1269 1225 1270 1226 unsigned int dcn_find_dcfclk_suits_all( 1271 1227 const struct dc *dc, 1272 - struct clocks_value *clocks) 1228 + struct dc_clocks *clocks) 1273 1229 { 1274 1230 unsigned vdd_level, vdd_level_temp; 1275 1231 unsigned dcf_clk; 1276 1232 1277 1233 /*find a common supported voltage level*/ 1278 1234 vdd_level = dcn_find_normalized_clock_vdd_Level( 1279 - dc, DM_PP_CLOCK_TYPE_DISPLAY_CLK, clocks->dispclk_in_khz); 1235 + dc, DM_PP_CLOCK_TYPE_DISPLAY_CLK, clocks->dispclk_khz); 1280 1236 vdd_level_temp = dcn_find_normalized_clock_vdd_Level( 1281 - dc, DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, clocks->phyclk_in_khz); 1237 + dc, DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, clocks->phyclk_khz); 1282 1238 1283 1239 vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); 1284 1240 vdd_level_temp = dcn_find_normalized_clock_vdd_Level( 1285 - dc, DM_PP_CLOCK_TYPE_DPPCLK, clocks->dppclk_in_khz); 1241 + dc, DM_PP_CLOCK_TYPE_DPPCLK, clocks->dppclk_khz); 1286 1242 vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); 1287 1243 1288 1244 vdd_level_temp = dcn_find_normalized_clock_vdd_Level( 1289 - dc, DM_PP_CLOCK_TYPE_MEMORY_CLK, clocks->dcfclock_in_khz); 1245 + dc, DM_PP_CLOCK_TYPE_MEMORY_CLK, clocks->fclk_khz); 1290 1246 vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); 1291 1247 vdd_level_temp = dcn_find_normalized_clock_vdd_Level( 1292 - dc, DM_PP_CLOCK_TYPE_DCFCLK, clocks->dcfclock_in_khz); 1248 + dc, DM_PP_CLOCK_TYPE_DCFCLK, clocks->dcfclk_khz); 1293 1249 1294 1250 /*find that level conresponding dcfclk*/ 1295 1251 vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); ··· 1375 1331 { 1376 1332 struct pp_smu_funcs_rv *pp = dc->res_pool->pp_smu; 1377 1333 struct pp_smu_wm_range_sets ranges = {0}; 1378 - int max_fclk_khz, nom_fclk_khz, mid_fclk_khz, min_fclk_khz; 1379 - int max_dcfclk_khz, min_dcfclk_khz; 1380 - int socclk_khz; 1334 + int min_fclk_khz, min_dcfclk_khz, socclk_khz; 1381 1335 const int overdrive = 5000000; /* 5 GHz to cover Overdrive */ 1382 - unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc->number_of_channels); 1383 1336 1384 1337 if (!pp->set_wm_ranges) 1385 1338 return; 1386 1339 1387 1340 kernel_fpu_begin(); 1388 - max_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 * 1000000 / factor; 1389 - nom_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 * 1000000 / factor; 1390 - mid_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 * 1000000 / factor; 1391 1341 min_fclk_khz = dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 * 1000000 / 32; 1392 - max_dcfclk_khz = dc->dcn_soc->dcfclkv_max0p9 * 1000; 1393 1342 min_dcfclk_khz = dc->dcn_soc->dcfclkv_min0p65 * 1000; 1394 1343 socclk_khz = dc->dcn_soc->socclk * 1000; 1395 1344 kernel_fpu_end(); ··· 1390 1353 /* Now notify PPLib/SMU about which Watermarks sets they should select 1391 1354 * depending on DPM state they are in. And update BW MGR GFX Engine and 1392 1355 * Memory clock member variables for Watermarks calculations for each 1393 - * Watermark Set 1356 + * Watermark Set. Only one watermark set for dcn1 due to hw bug DEGVIDCN10-254. 1394 1357 */ 1395 1358 /* SOCCLK does not affect anytihng but writeback for DCN so for now we dont 1396 1359 * care what the value is, hence min to overdrive level 1397 1360 */ 1398 - ranges.num_reader_wm_sets = WM_COUNT; 1399 - ranges.num_writer_wm_sets = WM_COUNT; 1361 + ranges.num_reader_wm_sets = WM_SET_COUNT; 1362 + ranges.num_writer_wm_sets = WM_SET_COUNT; 1400 1363 ranges.reader_wm_sets[0].wm_inst = WM_A; 1401 1364 ranges.reader_wm_sets[0].min_drain_clk_khz = min_dcfclk_khz; 1402 - ranges.reader_wm_sets[0].max_drain_clk_khz = max_dcfclk_khz; 1365 + ranges.reader_wm_sets[0].max_drain_clk_khz = overdrive; 1403 1366 ranges.reader_wm_sets[0].min_fill_clk_khz = min_fclk_khz; 1404 - ranges.reader_wm_sets[0].max_fill_clk_khz = min_fclk_khz; 1367 + ranges.reader_wm_sets[0].max_fill_clk_khz = overdrive; 1405 1368 ranges.writer_wm_sets[0].wm_inst = WM_A; 1406 1369 ranges.writer_wm_sets[0].min_fill_clk_khz = socclk_khz; 1407 1370 ranges.writer_wm_sets[0].max_fill_clk_khz = overdrive; 1408 1371 ranges.writer_wm_sets[0].min_drain_clk_khz = min_fclk_khz; 1409 - ranges.writer_wm_sets[0].max_drain_clk_khz = min_fclk_khz; 1410 - 1411 - ranges.reader_wm_sets[1].wm_inst = WM_B; 1412 - ranges.reader_wm_sets[1].min_drain_clk_khz = min_fclk_khz; 1413 - ranges.reader_wm_sets[1].max_drain_clk_khz = max_dcfclk_khz; 1414 - ranges.reader_wm_sets[1].min_fill_clk_khz = mid_fclk_khz; 1415 - ranges.reader_wm_sets[1].max_fill_clk_khz = mid_fclk_khz; 1416 - ranges.writer_wm_sets[1].wm_inst = WM_B; 1417 - ranges.writer_wm_sets[1].min_fill_clk_khz = socclk_khz; 1418 - ranges.writer_wm_sets[1].max_fill_clk_khz = overdrive; 1419 - ranges.writer_wm_sets[1].min_drain_clk_khz = mid_fclk_khz; 1420 - ranges.writer_wm_sets[1].max_drain_clk_khz = mid_fclk_khz; 1421 - 1422 - 1423 - ranges.reader_wm_sets[2].wm_inst = WM_C; 1424 - ranges.reader_wm_sets[2].min_drain_clk_khz = min_fclk_khz; 1425 - ranges.reader_wm_sets[2].max_drain_clk_khz = max_dcfclk_khz; 1426 - ranges.reader_wm_sets[2].min_fill_clk_khz = nom_fclk_khz; 1427 - ranges.reader_wm_sets[2].max_fill_clk_khz = nom_fclk_khz; 1428 - ranges.writer_wm_sets[2].wm_inst = WM_C; 1429 - ranges.writer_wm_sets[2].min_fill_clk_khz = socclk_khz; 1430 - ranges.writer_wm_sets[2].max_fill_clk_khz = overdrive; 1431 - ranges.writer_wm_sets[2].min_drain_clk_khz = nom_fclk_khz; 1432 - ranges.writer_wm_sets[2].max_drain_clk_khz = nom_fclk_khz; 1433 - 1434 - ranges.reader_wm_sets[3].wm_inst = WM_D; 1435 - ranges.reader_wm_sets[3].min_drain_clk_khz = min_fclk_khz; 1436 - ranges.reader_wm_sets[3].max_drain_clk_khz = max_dcfclk_khz; 1437 - ranges.reader_wm_sets[3].min_fill_clk_khz = max_fclk_khz; 1438 - ranges.reader_wm_sets[3].max_fill_clk_khz = max_fclk_khz; 1439 - ranges.writer_wm_sets[3].wm_inst = WM_D; 1440 - ranges.writer_wm_sets[3].min_fill_clk_khz = socclk_khz; 1441 - ranges.writer_wm_sets[3].max_fill_clk_khz = overdrive; 1442 - ranges.writer_wm_sets[3].min_drain_clk_khz = max_fclk_khz; 1443 - ranges.writer_wm_sets[3].max_drain_clk_khz = max_fclk_khz; 1372 + ranges.writer_wm_sets[0].max_drain_clk_khz = overdrive; 1444 1373 1445 1374 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE) { 1446 1375 ranges.reader_wm_sets[0].wm_inst = WM_A; 1447 1376 ranges.reader_wm_sets[0].min_drain_clk_khz = 300000; 1448 - ranges.reader_wm_sets[0].max_drain_clk_khz = 654000; 1377 + ranges.reader_wm_sets[0].max_drain_clk_khz = 5000000; 1449 1378 ranges.reader_wm_sets[0].min_fill_clk_khz = 800000; 1450 - ranges.reader_wm_sets[0].max_fill_clk_khz = 800000; 1379 + ranges.reader_wm_sets[0].max_fill_clk_khz = 5000000; 1451 1380 ranges.writer_wm_sets[0].wm_inst = WM_A; 1452 1381 ranges.writer_wm_sets[0].min_fill_clk_khz = 200000; 1453 - ranges.writer_wm_sets[0].max_fill_clk_khz = 757000; 1382 + ranges.writer_wm_sets[0].max_fill_clk_khz = 5000000; 1454 1383 ranges.writer_wm_sets[0].min_drain_clk_khz = 800000; 1455 - ranges.writer_wm_sets[0].max_drain_clk_khz = 800000; 1456 - 1457 - ranges.reader_wm_sets[1].wm_inst = WM_B; 1458 - ranges.reader_wm_sets[1].min_drain_clk_khz = 300000; 1459 - ranges.reader_wm_sets[1].max_drain_clk_khz = 654000; 1460 - ranges.reader_wm_sets[1].min_fill_clk_khz = 933000; 1461 - ranges.reader_wm_sets[1].max_fill_clk_khz = 933000; 1462 - ranges.writer_wm_sets[1].wm_inst = WM_B; 1463 - ranges.writer_wm_sets[1].min_fill_clk_khz = 200000; 1464 - ranges.writer_wm_sets[1].max_fill_clk_khz = 757000; 1465 - ranges.writer_wm_sets[1].min_drain_clk_khz = 933000; 1466 - ranges.writer_wm_sets[1].max_drain_clk_khz = 933000; 1467 - 1468 - 1469 - ranges.reader_wm_sets[2].wm_inst = WM_C; 1470 - ranges.reader_wm_sets[2].min_drain_clk_khz = 300000; 1471 - ranges.reader_wm_sets[2].max_drain_clk_khz = 654000; 1472 - ranges.reader_wm_sets[2].min_fill_clk_khz = 1067000; 1473 - ranges.reader_wm_sets[2].max_fill_clk_khz = 1067000; 1474 - ranges.writer_wm_sets[2].wm_inst = WM_C; 1475 - ranges.writer_wm_sets[2].min_fill_clk_khz = 200000; 1476 - ranges.writer_wm_sets[2].max_fill_clk_khz = 757000; 1477 - ranges.writer_wm_sets[2].min_drain_clk_khz = 1067000; 1478 - ranges.writer_wm_sets[2].max_drain_clk_khz = 1067000; 1479 - 1480 - ranges.reader_wm_sets[3].wm_inst = WM_D; 1481 - ranges.reader_wm_sets[3].min_drain_clk_khz = 300000; 1482 - ranges.reader_wm_sets[3].max_drain_clk_khz = 654000; 1483 - ranges.reader_wm_sets[3].min_fill_clk_khz = 1200000; 1484 - ranges.reader_wm_sets[3].max_fill_clk_khz = 1200000; 1485 - ranges.writer_wm_sets[3].wm_inst = WM_D; 1486 - ranges.writer_wm_sets[3].min_fill_clk_khz = 200000; 1487 - ranges.writer_wm_sets[3].max_fill_clk_khz = 757000; 1488 - ranges.writer_wm_sets[3].min_drain_clk_khz = 1200000; 1489 - ranges.writer_wm_sets[3].max_drain_clk_khz = 1200000; 1384 + ranges.writer_wm_sets[0].max_drain_clk_khz = 5000000; 1490 1385 } 1386 + 1387 + ranges.reader_wm_sets[1] = ranges.writer_wm_sets[0]; 1388 + ranges.reader_wm_sets[1].wm_inst = WM_B; 1389 + 1390 + ranges.reader_wm_sets[2] = ranges.writer_wm_sets[0]; 1391 + ranges.reader_wm_sets[2].wm_inst = WM_C; 1392 + 1393 + ranges.reader_wm_sets[3] = ranges.writer_wm_sets[0]; 1394 + ranges.reader_wm_sets[3].wm_inst = WM_D; 1491 1395 1492 1396 /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */ 1493 1397 pp->set_wm_ranges(&pp->pp_smu, &ranges);
-5
drivers/gpu/drm/amd/display/dc/core/dc.c
··· 944 944 945 945 dc->optimized_required = false; 946 946 947 - /* 3rd param should be true, temp w/a for RV*/ 948 - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) 949 - dc->hwss.set_bandwidth(dc, context, dc->ctx->dce_version < DCN_VERSION_1_0); 950 - #else 951 947 dc->hwss.set_bandwidth(dc, context, true); 952 - #endif 953 948 return true; 954 949 } 955 950
+12 -12
drivers/gpu/drm/amd/display/dc/core/dc_debug.c
··· 352 352 DC_LOGGER_INIT(dc->ctx->logger); 353 353 CLOCK_TRACE("Current: dispclk_khz:%d max_dppclk_khz:%d dcfclk_khz:%d\n" 354 354 "dcfclk_deep_sleep_khz:%d fclk_khz:%d socclk_khz:%d\n", 355 - context->bw.dcn.calc_clk.dispclk_khz, 356 - context->bw.dcn.calc_clk.dppclk_khz, 357 - context->bw.dcn.calc_clk.dcfclk_khz, 358 - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz, 359 - context->bw.dcn.calc_clk.fclk_khz, 360 - context->bw.dcn.calc_clk.socclk_khz); 355 + context->bw.dcn.clk.dispclk_khz, 356 + context->bw.dcn.clk.dppclk_khz, 357 + context->bw.dcn.clk.dcfclk_khz, 358 + context->bw.dcn.clk.dcfclk_deep_sleep_khz, 359 + context->bw.dcn.clk.fclk_khz, 360 + context->bw.dcn.clk.socclk_khz); 361 361 CLOCK_TRACE("Calculated: dispclk_khz:%d max_dppclk_khz:%d dcfclk_khz:%d\n" 362 362 "dcfclk_deep_sleep_khz:%d fclk_khz:%d socclk_khz:%d\n", 363 - context->bw.dcn.calc_clk.dispclk_khz, 364 - context->bw.dcn.calc_clk.dppclk_khz, 365 - context->bw.dcn.calc_clk.dcfclk_khz, 366 - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz, 367 - context->bw.dcn.calc_clk.fclk_khz, 368 - context->bw.dcn.calc_clk.socclk_khz); 363 + context->bw.dcn.clk.dispclk_khz, 364 + context->bw.dcn.clk.dppclk_khz, 365 + context->bw.dcn.clk.dcfclk_khz, 366 + context->bw.dcn.clk.dcfclk_deep_sleep_khz, 367 + context->bw.dcn.clk.fclk_khz, 368 + context->bw.dcn.clk.socclk_khz); 369 369 #endif 370 370 }
+12 -24
drivers/gpu/drm/amd/display/dc/core/dc_link.c
··· 33 33 #include "dc_link_dp.h" 34 34 #include "dc_link_ddc.h" 35 35 #include "link_hwss.h" 36 + #include "opp.h" 36 37 37 38 #include "link_encoder.h" 38 39 #include "hw_sequencer.h" ··· 1285 1284 max_link_rate = LINK_RATE_HIGH3; 1286 1285 1287 1286 if (link_settings.link_rate == max_link_rate) { 1288 - if (state->dis_clk->funcs->set_min_clocks_state) { 1289 - if (state->dis_clk->cur_min_clks_state < DM_PP_CLOCKS_STATE_NOMINAL) 1290 - state->dis_clk->funcs->set_min_clocks_state( 1291 - state->dis_clk, DM_PP_CLOCKS_STATE_NOMINAL); 1292 - } else { 1293 - uint32_t dp_phyclk_in_khz; 1294 - const struct clocks_value clocks_value = 1295 - state->dis_clk->cur_clocks_value; 1287 + struct dc_clocks clocks = state->bw.dcn.clk; 1296 1288 1297 - /* 27mhz = 27000000hz= 27000khz */ 1298 - dp_phyclk_in_khz = link_settings.link_rate * 27000; 1289 + /* dce/dcn compat, do not update dispclk */ 1290 + clocks.dispclk_khz = 0; 1291 + /* 27mhz = 27000000hz= 27000khz */ 1292 + clocks.phyclk_khz = link_settings.link_rate * 27000; 1299 1293 1300 - if (((clocks_value.max_non_dp_phyclk_in_khz != 0) && 1301 - (dp_phyclk_in_khz > clocks_value.max_non_dp_phyclk_in_khz)) || 1302 - (dp_phyclk_in_khz > clocks_value.max_dp_phyclk_in_khz)) { 1303 - state->dis_clk->funcs->apply_clock_voltage_request( 1304 - state->dis_clk, 1305 - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, 1306 - dp_phyclk_in_khz, 1307 - false, 1308 - true); 1309 - } 1310 - } 1294 + state->dis_clk->funcs->update_clocks( 1295 + state->dis_clk, &clocks, false); 1311 1296 } 1312 1297 1313 1298 dp_enable_link_phy( ··· 2383 2396 core_dc->hwss.enable_audio_stream(pipe_ctx); 2384 2397 2385 2398 /* turn off otg test pattern if enable */ 2386 - pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, 2387 - CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, 2388 - COLOR_DEPTH_UNDEFINED); 2399 + if (pipe_ctx->stream_res.tg->funcs->set_test_pattern) 2400 + pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, 2401 + CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, 2402 + COLOR_DEPTH_UNDEFINED); 2389 2403 2390 2404 core_dc->hwss.enable_stream(pipe_ctx); 2391 2405
+1 -1
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
··· 1948 1948 const struct dc *dc, 1949 1949 struct dc_state *dst_ctx) 1950 1950 { 1951 - dst_ctx->dis_clk = dc->res_pool->display_clock; 1951 + dst_ctx->dis_clk = dc->res_pool->dccg; 1952 1952 } 1953 1953 1954 1954 enum dc_status dc_validate_global_state(
+7 -1
drivers/gpu/drm/amd/display/dc/dc.h
··· 38 38 #include "inc/compressor.h" 39 39 #include "dml/display_mode_lib.h" 40 40 41 - #define DC_VER "3.1.47" 41 + #define DC_VER "3.1.52" 42 42 43 43 #define MAX_SURFACES 3 44 44 #define MAX_STREAMS 6 ··· 186 186 WM_REPORT_OVERRIDE = 1, 187 187 }; 188 188 189 + /* 190 + * For any clocks that may differ per pipe 191 + * only the max is stored in this structure 192 + */ 189 193 struct dc_clocks { 190 194 int dispclk_khz; 191 195 int max_supported_dppclk_khz; ··· 198 194 int socclk_khz; 199 195 int dcfclk_deep_sleep_khz; 200 196 int fclk_khz; 197 + int phyclk_khz; 201 198 }; 202 199 203 200 struct dc_debug { ··· 233 228 int urgent_latency_ns; 234 229 int percent_of_ideal_drambw; 235 230 int dram_clock_change_latency_ns; 231 + bool optimized_watermark; 236 232 int always_scale; 237 233 bool disable_pplib_clock_request; 238 234 bool disable_clock_gate;
+4
drivers/gpu/drm/amd/display/dc/dc_bios_types.h
··· 198 198 void (*post_init)(struct dc_bios *bios); 199 199 200 200 void (*bios_parser_destroy)(struct dc_bios **dcb); 201 + 202 + enum bp_result (*get_board_layout_info)( 203 + struct dc_bios *dcb, 204 + struct board_layout_info *board_layout_info); 201 205 }; 202 206 203 207 struct bios_registers {
+1
drivers/gpu/drm/amd/display/dc/dc_hw_types.h
··· 199 199 SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb, 200 200 SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr, 201 201 SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb, 202 + SURFACE_PIXEL_FORMAT_SUBSAMPLE_END, 202 203 SURFACE_PIXEL_FORMAT_INVALID 203 204 204 205 /*grow 444 video here if necessary */
+5 -5
drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
··· 133 133 uint64_t feedback_divider; 134 134 135 135 feedback_divider = 136 - (uint64_t)(target_pix_clk_khz * ref_divider * post_divider); 136 + (uint64_t)target_pix_clk_khz * ref_divider * post_divider; 137 137 feedback_divider *= 10; 138 138 /* additional factor, since we divide by 10 afterwards */ 139 139 feedback_divider *= (uint64_t)(calc_pll_cs->fract_fb_divider_factor); ··· 145 145 * of fractional feedback decimal point and the fractional FB Divider precision 146 146 * is 2 then the equation becomes (ullfeedbackDivider + 5*100) / (10*100))*/ 147 147 148 - feedback_divider += (uint64_t) 149 - (5 * calc_pll_cs->fract_fb_divider_precision_factor); 148 + feedback_divider += 5ULL * 149 + calc_pll_cs->fract_fb_divider_precision_factor; 150 150 feedback_divider = 151 151 div_u64(feedback_divider, 152 152 calc_pll_cs->fract_fb_divider_precision_factor * 10); ··· 203 203 &fract_feedback_divider); 204 204 205 205 /*Actual calculated value*/ 206 - actual_calc_clk_khz = (uint64_t)(feedback_divider * 207 - calc_pll_cs->fract_fb_divider_factor) + 206 + actual_calc_clk_khz = (uint64_t)feedback_divider * 207 + calc_pll_cs->fract_fb_divider_factor + 208 208 fract_feedback_divider; 209 209 actual_calc_clk_khz *= calc_pll_cs->ref_freq_khz; 210 210 actual_calc_clk_khz =
+387 -351
drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
··· 38 38 #include "dal_asic_id.h" 39 39 40 40 #define TO_DCE_CLOCKS(clocks)\ 41 - container_of(clocks, struct dce_disp_clk, base) 41 + container_of(clocks, struct dce_dccg, base) 42 42 43 43 #define REG(reg) \ 44 44 (clk_dce->regs->reg) ··· 101 101 /*ClocksStatePerformance*/ 102 102 { .display_clk_khz = 1133000, .pixel_clk_khz = 600000 } }; 103 103 104 - /* Starting point for each divider range.*/ 105 - enum dce_divider_range_start { 106 - DIVIDER_RANGE_01_START = 200, /* 2.00*/ 107 - DIVIDER_RANGE_02_START = 1600, /* 16.00*/ 108 - DIVIDER_RANGE_03_START = 3200, /* 32.00*/ 109 - DIVIDER_RANGE_SCALE_FACTOR = 100 /* Results are scaled up by 100.*/ 104 + /* Starting DID for each range */ 105 + enum dentist_base_divider_id { 106 + DENTIST_BASE_DID_1 = 0x08, 107 + DENTIST_BASE_DID_2 = 0x40, 108 + DENTIST_BASE_DID_3 = 0x60, 109 + DENTIST_MAX_DID = 0x80 110 110 }; 111 111 112 - /* Ranges for divider identifiers (Divider ID or DID) 113 - mmDENTIST_DISPCLK_CNTL.DENTIST_DISPCLK_WDIVIDER*/ 114 - enum dce_divider_id_register_setting { 115 - DIVIDER_RANGE_01_BASE_DIVIDER_ID = 0X08, 116 - DIVIDER_RANGE_02_BASE_DIVIDER_ID = 0X40, 117 - DIVIDER_RANGE_03_BASE_DIVIDER_ID = 0X60, 118 - DIVIDER_RANGE_MAX_DIVIDER_ID = 0X80 112 + /* Starting point and step size for each divider range.*/ 113 + enum dentist_divider_range { 114 + DENTIST_DIVIDER_RANGE_1_START = 8, /* 2.00 */ 115 + DENTIST_DIVIDER_RANGE_1_STEP = 1, /* 0.25 */ 116 + DENTIST_DIVIDER_RANGE_2_START = 64, /* 16.00 */ 117 + DENTIST_DIVIDER_RANGE_2_STEP = 2, /* 0.50 */ 118 + DENTIST_DIVIDER_RANGE_3_START = 128, /* 32.00 */ 119 + DENTIST_DIVIDER_RANGE_3_STEP = 4, /* 1.00 */ 120 + DENTIST_DIVIDER_RANGE_SCALE_FACTOR = 4 119 121 }; 120 122 121 - /* Step size between each divider within a range. 122 - Incrementing the DENTIST_DISPCLK_WDIVIDER by one 123 - will increment the divider by this much.*/ 124 - enum dce_divider_range_step_size { 125 - DIVIDER_RANGE_01_STEP_SIZE = 25, /* 0.25*/ 126 - DIVIDER_RANGE_02_STEP_SIZE = 50, /* 0.50*/ 127 - DIVIDER_RANGE_03_STEP_SIZE = 100 /* 1.00 */ 128 - }; 129 - 130 - static bool dce_divider_range_construct( 131 - struct dce_divider_range *div_range, 132 - int range_start, 133 - int range_step, 134 - int did_min, 135 - int did_max) 123 + static int dentist_get_divider_from_did(int did) 136 124 { 137 - div_range->div_range_start = range_start; 138 - div_range->div_range_step = range_step; 139 - div_range->did_min = did_min; 140 - div_range->did_max = did_max; 125 + if (did < DENTIST_BASE_DID_1) 126 + did = DENTIST_BASE_DID_1; 127 + if (did > DENTIST_MAX_DID) 128 + did = DENTIST_MAX_DID; 141 129 142 - if (div_range->div_range_step == 0) { 143 - div_range->div_range_step = 1; 144 - /*div_range_step cannot be zero*/ 145 - BREAK_TO_DEBUGGER(); 130 + if (did < DENTIST_BASE_DID_2) { 131 + return DENTIST_DIVIDER_RANGE_1_START + DENTIST_DIVIDER_RANGE_1_STEP 132 + * (did - DENTIST_BASE_DID_1); 133 + } else if (did < DENTIST_BASE_DID_3) { 134 + return DENTIST_DIVIDER_RANGE_2_START + DENTIST_DIVIDER_RANGE_2_STEP 135 + * (did - DENTIST_BASE_DID_2); 136 + } else { 137 + return DENTIST_DIVIDER_RANGE_3_START + DENTIST_DIVIDER_RANGE_3_STEP 138 + * (did - DENTIST_BASE_DID_3); 146 139 } 147 - /* Calculate this based on the other inputs.*/ 148 - /* See DividerRange.h for explanation of */ 149 - /* the relationship between divider id (DID) and a divider.*/ 150 - /* Number of Divider IDs = (Maximum Divider ID - Minimum Divider ID)*/ 151 - /* Maximum divider identified in this range = 152 - * (Number of Divider IDs)*Step size between dividers 153 - * + The start of this range.*/ 154 - div_range->div_range_end = (did_max - did_min) * range_step 155 - + range_start; 156 - return true; 157 140 } 158 141 159 - static int dce_divider_range_calc_divider( 160 - struct dce_divider_range *div_range, 161 - int did) 142 + /* SW will adjust DP REF Clock average value for all purposes 143 + * (DP DTO / DP Audio DTO and DP GTC) 144 + if clock is spread for all cases: 145 + -if SS enabled on DP Ref clock and HW de-spreading enabled with SW 146 + calculations for DS_INCR/DS_MODULO (this is planned to be default case) 147 + -if SS enabled on DP Ref clock and HW de-spreading enabled with HW 148 + calculations (not planned to be used, but average clock should still 149 + be valid) 150 + -if SS enabled on DP Ref clock and HW de-spreading disabled 151 + (should not be case with CIK) then SW should program all rates 152 + generated according to average value (case as with previous ASICs) 153 + */ 154 + static int dccg_adjust_dp_ref_freq_for_ss(struct dce_dccg *clk_dce, int dp_ref_clk_khz) 162 155 { 163 - /* Is this DID within our range?*/ 164 - if ((did < div_range->did_min) || (did >= div_range->did_max)) 165 - return INVALID_DIVIDER; 156 + if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) { 157 + struct fixed31_32 ss_percentage = dc_fixpt_div_int( 158 + dc_fixpt_from_fraction(clk_dce->dprefclk_ss_percentage, 159 + clk_dce->dprefclk_ss_divider), 200); 160 + struct fixed31_32 adj_dp_ref_clk_khz; 166 161 167 - return ((did - div_range->did_min) * div_range->div_range_step) 168 - + div_range->div_range_start; 169 - 170 - } 171 - 172 - static int dce_divider_range_get_divider( 173 - struct dce_divider_range *div_range, 174 - int ranges_num, 175 - int did) 176 - { 177 - int div = INVALID_DIVIDER; 178 - int i; 179 - 180 - for (i = 0; i < ranges_num; i++) { 181 - /* Calculate divider with given divider ID*/ 182 - div = dce_divider_range_calc_divider(&div_range[i], did); 183 - /* Found a valid return divider*/ 184 - if (div != INVALID_DIVIDER) 185 - break; 162 + ss_percentage = dc_fixpt_sub(dc_fixpt_one, ss_percentage); 163 + adj_dp_ref_clk_khz = dc_fixpt_mul_int(ss_percentage, dp_ref_clk_khz); 164 + dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz); 186 165 } 187 - return div; 166 + return dp_ref_clk_khz; 188 167 } 189 168 190 - static int dce_clocks_get_dp_ref_freq(struct display_clock *clk) 169 + static int dce_get_dp_ref_freq_khz(struct dccg *clk) 191 170 { 192 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 171 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 193 172 int dprefclk_wdivider; 194 173 int dprefclk_src_sel; 195 174 int dp_ref_clk_khz = 600000; 196 - int target_div = INVALID_DIVIDER; 175 + int target_div; 197 176 198 177 /* ASSERT DP Reference Clock source is from DFS*/ 199 178 REG_GET(DPREFCLK_CNTL, DPREFCLK_SRC_SEL, &dprefclk_src_sel); ··· 183 204 REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DPREFCLK_WDIVIDER, &dprefclk_wdivider); 184 205 185 206 /* Convert DENTIST_DPREFCLK_WDIVIDERto actual divider*/ 186 - target_div = dce_divider_range_get_divider( 187 - clk_dce->divider_ranges, 188 - DIVIDER_RANGE_MAX, 189 - dprefclk_wdivider); 207 + target_div = dentist_get_divider_from_did(dprefclk_wdivider); 190 208 191 - if (target_div != INVALID_DIVIDER) { 192 - /* Calculate the current DFS clock, in kHz.*/ 193 - dp_ref_clk_khz = (DIVIDER_RANGE_SCALE_FACTOR 194 - * clk_dce->dentist_vco_freq_khz) / target_div; 195 - } 209 + /* Calculate the current DFS clock, in kHz.*/ 210 + dp_ref_clk_khz = (DENTIST_DIVIDER_RANGE_SCALE_FACTOR 211 + * clk_dce->dentist_vco_freq_khz) / target_div; 196 212 197 - /* SW will adjust DP REF Clock average value for all purposes 198 - * (DP DTO / DP Audio DTO and DP GTC) 199 - if clock is spread for all cases: 200 - -if SS enabled on DP Ref clock and HW de-spreading enabled with SW 201 - calculations for DS_INCR/DS_MODULO (this is planned to be default case) 202 - -if SS enabled on DP Ref clock and HW de-spreading enabled with HW 203 - calculations (not planned to be used, but average clock should still 204 - be valid) 205 - -if SS enabled on DP Ref clock and HW de-spreading disabled 206 - (should not be case with CIK) then SW should program all rates 207 - generated according to average value (case as with previous ASICs) 208 - */ 209 - if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) { 210 - struct fixed31_32 ss_percentage = dc_fixpt_div_int( 211 - dc_fixpt_from_fraction( 212 - clk_dce->dprefclk_ss_percentage, 213 - clk_dce->dprefclk_ss_divider), 200); 214 - struct fixed31_32 adj_dp_ref_clk_khz; 215 - 216 - ss_percentage = dc_fixpt_sub(dc_fixpt_one, 217 - ss_percentage); 218 - adj_dp_ref_clk_khz = 219 - dc_fixpt_mul_int( 220 - ss_percentage, 221 - dp_ref_clk_khz); 222 - dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz); 223 - } 224 - 225 - return dp_ref_clk_khz; 213 + return dccg_adjust_dp_ref_freq_for_ss(clk_dce, dp_ref_clk_khz); 226 214 } 227 215 228 - /* TODO: This is DCN DPREFCLK: it could be program by DENTIST by VBIOS 229 - * or CLK0_CLK11 by SMU. For DCE120, it is wlays 600Mhz. Will re-visit 230 - * clock implementation 231 - */ 232 - static int dce_clocks_get_dp_ref_freq_wrkaround(struct display_clock *clk) 216 + static int dce12_get_dp_ref_freq_khz(struct dccg *clk) 233 217 { 234 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 235 - int dp_ref_clk_khz = 600000; 218 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 236 219 237 - if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) { 238 - struct fixed31_32 ss_percentage = dc_fixpt_div_int( 239 - dc_fixpt_from_fraction( 240 - clk_dce->dprefclk_ss_percentage, 241 - clk_dce->dprefclk_ss_divider), 200); 242 - struct fixed31_32 adj_dp_ref_clk_khz; 243 - 244 - ss_percentage = dc_fixpt_sub(dc_fixpt_one, 245 - ss_percentage); 246 - adj_dp_ref_clk_khz = 247 - dc_fixpt_mul_int( 248 - ss_percentage, 249 - dp_ref_clk_khz); 250 - dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz); 251 - } 252 - 253 - return dp_ref_clk_khz; 220 + return dccg_adjust_dp_ref_freq_for_ss(clk_dce, 600000); 254 221 } 222 + 255 223 static enum dm_pp_clocks_state dce_get_required_clocks_state( 256 - struct display_clock *clk, 257 - struct state_dependent_clocks *req_clocks) 224 + struct dccg *clk, 225 + struct dc_clocks *req_clocks) 258 226 { 259 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 227 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 260 228 int i; 261 229 enum dm_pp_clocks_state low_req_clk; 262 230 ··· 212 286 * all required clocks 213 287 */ 214 288 for (i = clk->max_clks_state; i >= DM_PP_CLOCKS_STATE_ULTRA_LOW; i--) 215 - if (req_clocks->display_clk_khz > 289 + if (req_clocks->dispclk_khz > 216 290 clk_dce->max_clks_by_state[i].display_clk_khz 217 - || req_clocks->pixel_clk_khz > 291 + || req_clocks->phyclk_khz > 218 292 clk_dce->max_clks_by_state[i].pixel_clk_khz) 219 293 break; 220 294 221 295 low_req_clk = i + 1; 222 296 if (low_req_clk > clk->max_clks_state) { 223 - DC_LOG_WARNING("%s: clocks unsupported disp_clk %d pix_clk %d", 224 - __func__, 225 - req_clocks->display_clk_khz, 226 - req_clocks->pixel_clk_khz); 227 - low_req_clk = DM_PP_CLOCKS_STATE_INVALID; 297 + /* set max clock state for high phyclock, invalid on exceeding display clock */ 298 + if (clk_dce->max_clks_by_state[clk->max_clks_state].display_clk_khz 299 + < req_clocks->dispclk_khz) 300 + low_req_clk = DM_PP_CLOCKS_STATE_INVALID; 301 + else 302 + low_req_clk = clk->max_clks_state; 228 303 } 229 304 230 305 return low_req_clk; 231 306 } 232 307 233 - static bool dce_clock_set_min_clocks_state( 234 - struct display_clock *clk, 235 - enum dm_pp_clocks_state clocks_state) 236 - { 237 - struct dm_pp_power_level_change_request level_change_req = { 238 - clocks_state }; 239 - 240 - if (clocks_state > clk->max_clks_state) { 241 - /*Requested state exceeds max supported state.*/ 242 - DC_LOG_WARNING("Requested state exceeds max supported state"); 243 - return false; 244 - } else if (clocks_state == clk->cur_min_clks_state) { 245 - /*if we're trying to set the same state, we can just return 246 - * since nothing needs to be done*/ 247 - return true; 248 - } 249 - 250 - /* get max clock state from PPLIB */ 251 - if (dm_pp_apply_power_level_change_request(clk->ctx, &level_change_req)) 252 - clk->cur_min_clks_state = clocks_state; 253 - 254 - return true; 255 - } 256 - 257 308 static int dce_set_clock( 258 - struct display_clock *clk, 309 + struct dccg *clk, 259 310 int requested_clk_khz) 260 311 { 261 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 312 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 262 313 struct bp_pixel_clock_parameters pxl_clk_params = { 0 }; 263 314 struct dc_bios *bp = clk->ctx->dc_bios; 264 315 int actual_clock = requested_clk_khz; ··· 267 364 } 268 365 269 366 static int dce_psr_set_clock( 270 - struct display_clock *clk, 367 + struct dccg *clk, 271 368 int requested_clk_khz) 272 369 { 273 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 370 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 274 371 struct dc_context *ctx = clk_dce->base.ctx; 275 372 struct dc *core_dc = ctx->dc; 276 373 struct dmcu *dmcu = core_dc->res_pool->dmcu; ··· 283 380 } 284 381 285 382 static int dce112_set_clock( 286 - struct display_clock *clk, 383 + struct dccg *clk, 287 384 int requested_clk_khz) 288 385 { 289 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(clk); 386 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk); 290 387 struct bp_set_dce_clock_parameters dce_clk_params; 291 388 struct dc_bios *bp = clk->ctx->dc_bios; 292 389 struct dc *core_dc = clk->ctx->dc; ··· 335 432 return actual_clock; 336 433 } 337 434 338 - static void dce_clock_read_integrated_info(struct dce_disp_clk *clk_dce) 435 + static void dce_clock_read_integrated_info(struct dce_dccg *clk_dce) 339 436 { 340 437 struct dc_debug *debug = &clk_dce->base.ctx->dc->debug; 341 438 struct dc_bios *bp = clk_dce->base.ctx->dc_bios; ··· 391 488 if (!debug->disable_dfs_bypass && bp->integrated_info) 392 489 if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE) 393 490 clk_dce->dfs_bypass_enabled = true; 394 - 395 - clk_dce->use_max_disp_clk = debug->max_disp_clk; 396 491 } 397 492 398 - static void dce_clock_read_ss_info(struct dce_disp_clk *clk_dce) 493 + static void dce_clock_read_ss_info(struct dce_dccg *clk_dce) 399 494 { 400 495 struct dc_bios *bp = clk_dce->base.ctx->dc_bios; 401 496 int ss_info_num = bp->funcs->get_ss_entry_number( ··· 449 548 } 450 549 } 451 550 452 - static bool dce_apply_clock_voltage_request( 453 - struct display_clock *clk, 454 - enum dm_pp_clock_type clocks_type, 455 - int clocks_in_khz, 456 - bool pre_mode_set, 457 - bool update_dp_phyclk) 551 + static inline bool should_set_clock(bool safe_to_lower, int calc_clk, int cur_clk) 458 552 { 459 - bool send_request = false; 460 - struct dm_pp_clock_for_voltage_req clock_voltage_req = {0}; 461 - 462 - switch (clocks_type) { 463 - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 464 - case DM_PP_CLOCK_TYPE_PIXELCLK: 465 - case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: 466 - break; 467 - default: 468 - BREAK_TO_DEBUGGER(); 469 - return false; 470 - } 471 - 472 - clock_voltage_req.clk_type = clocks_type; 473 - clock_voltage_req.clocks_in_khz = clocks_in_khz; 474 - 475 - /* to pplib */ 476 - if (pre_mode_set) { 477 - switch (clocks_type) { 478 - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 479 - if (clocks_in_khz > clk->cur_clocks_value.dispclk_in_khz) { 480 - clk->cur_clocks_value.dispclk_notify_pplib_done = true; 481 - send_request = true; 482 - } else 483 - clk->cur_clocks_value.dispclk_notify_pplib_done = false; 484 - /* no matter incrase or decrase clock, update current clock value */ 485 - clk->cur_clocks_value.dispclk_in_khz = clocks_in_khz; 486 - break; 487 - case DM_PP_CLOCK_TYPE_PIXELCLK: 488 - if (clocks_in_khz > clk->cur_clocks_value.max_pixelclk_in_khz) { 489 - clk->cur_clocks_value.pixelclk_notify_pplib_done = true; 490 - send_request = true; 491 - } else 492 - clk->cur_clocks_value.pixelclk_notify_pplib_done = false; 493 - /* no matter incrase or decrase clock, update current clock value */ 494 - clk->cur_clocks_value.max_pixelclk_in_khz = clocks_in_khz; 495 - break; 496 - case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: 497 - if (clocks_in_khz > clk->cur_clocks_value.max_non_dp_phyclk_in_khz) { 498 - clk->cur_clocks_value.phyclk_notigy_pplib_done = true; 499 - send_request = true; 500 - } else 501 - clk->cur_clocks_value.phyclk_notigy_pplib_done = false; 502 - /* no matter incrase or decrase clock, update current clock value */ 503 - clk->cur_clocks_value.max_non_dp_phyclk_in_khz = clocks_in_khz; 504 - break; 505 - default: 506 - ASSERT(0); 507 - break; 508 - } 509 - 510 - } else { 511 - switch (clocks_type) { 512 - case DM_PP_CLOCK_TYPE_DISPLAY_CLK: 513 - if (!clk->cur_clocks_value.dispclk_notify_pplib_done) 514 - send_request = true; 515 - break; 516 - case DM_PP_CLOCK_TYPE_PIXELCLK: 517 - if (!clk->cur_clocks_value.pixelclk_notify_pplib_done) 518 - send_request = true; 519 - break; 520 - case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: 521 - if (!clk->cur_clocks_value.phyclk_notigy_pplib_done) 522 - send_request = true; 523 - break; 524 - default: 525 - ASSERT(0); 526 - break; 527 - } 528 - } 529 - if (send_request) { 530 - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) 531 - if (clk->ctx->dce_version >= DCN_VERSION_1_0) { 532 - struct dc *core_dc = clk->ctx->dc; 533 - /*use dcfclk request voltage*/ 534 - clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; 535 - clock_voltage_req.clocks_in_khz = 536 - dcn_find_dcfclk_suits_all(core_dc, &clk->cur_clocks_value); 537 - } 538 - #endif 539 - dm_pp_apply_clock_for_voltage_request( 540 - clk->ctx, &clock_voltage_req); 541 - } 542 - if (update_dp_phyclk && (clocks_in_khz > 543 - clk->cur_clocks_value.max_dp_phyclk_in_khz)) 544 - clk->cur_clocks_value.max_dp_phyclk_in_khz = clocks_in_khz; 545 - 546 - return true; 553 + return ((safe_to_lower && calc_clk < cur_clk) || calc_clk > cur_clk); 547 554 } 548 555 556 + static void dce12_update_clocks(struct dccg *dccg, 557 + struct dc_clocks *new_clocks, 558 + bool safe_to_lower) 559 + { 560 + struct dm_pp_clock_for_voltage_req clock_voltage_req = {0}; 561 + 562 + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 563 + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK; 564 + clock_voltage_req.clocks_in_khz = new_clocks->dispclk_khz; 565 + dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz); 566 + dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 567 + 568 + dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 569 + } 570 + 571 + if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) { 572 + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAYPHYCLK; 573 + clock_voltage_req.clocks_in_khz = new_clocks->phyclk_khz; 574 + dccg->clks.phyclk_khz = new_clocks->phyclk_khz; 575 + 576 + dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 577 + } 578 + } 579 + 580 + #ifdef CONFIG_DRM_AMD_DC_DCN1_0 581 + static int dcn1_determine_dppclk_threshold(struct dccg *dccg, struct dc_clocks *new_clocks) 582 + { 583 + bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz; 584 + bool dispclk_increase = new_clocks->dispclk_khz > dccg->clks.dispclk_khz; 585 + int disp_clk_threshold = new_clocks->max_supported_dppclk_khz; 586 + bool cur_dpp_div = dccg->clks.dispclk_khz > dccg->clks.dppclk_khz; 587 + 588 + /* increase clock, looking for div is 0 for current, request div is 1*/ 589 + if (dispclk_increase) { 590 + /* already divided by 2, no need to reach target clk with 2 steps*/ 591 + if (cur_dpp_div) 592 + return new_clocks->dispclk_khz; 593 + 594 + /* request disp clk is lower than maximum supported dpp clk, 595 + * no need to reach target clk with two steps. 596 + */ 597 + if (new_clocks->dispclk_khz <= disp_clk_threshold) 598 + return new_clocks->dispclk_khz; 599 + 600 + /* target dpp clk not request divided by 2, still within threshold */ 601 + if (!request_dpp_div) 602 + return new_clocks->dispclk_khz; 603 + 604 + } else { 605 + /* decrease clock, looking for current dppclk divided by 2, 606 + * request dppclk not divided by 2. 607 + */ 608 + 609 + /* current dpp clk not divided by 2, no need to ramp*/ 610 + if (!cur_dpp_div) 611 + return new_clocks->dispclk_khz; 612 + 613 + /* current disp clk is lower than current maximum dpp clk, 614 + * no need to ramp 615 + */ 616 + if (dccg->clks.dispclk_khz <= disp_clk_threshold) 617 + return new_clocks->dispclk_khz; 618 + 619 + /* request dpp clk need to be divided by 2 */ 620 + if (request_dpp_div) 621 + return new_clocks->dispclk_khz; 622 + } 623 + 624 + return disp_clk_threshold; 625 + } 626 + 627 + static void dcn1_ramp_up_dispclk_with_dpp(struct dccg *dccg, struct dc_clocks *new_clocks) 628 + { 629 + struct dc *dc = dccg->ctx->dc; 630 + int dispclk_to_dpp_threshold = dcn1_determine_dppclk_threshold(dccg, new_clocks); 631 + bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz; 632 + int i; 633 + 634 + /* set disp clk to dpp clk threshold */ 635 + dccg->funcs->set_dispclk(dccg, dispclk_to_dpp_threshold); 636 + 637 + /* update request dpp clk division option */ 638 + for (i = 0; i < dc->res_pool->pipe_count; i++) { 639 + struct pipe_ctx *pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; 640 + 641 + if (!pipe_ctx->plane_state) 642 + continue; 643 + 644 + pipe_ctx->plane_res.dpp->funcs->dpp_dppclk_control( 645 + pipe_ctx->plane_res.dpp, 646 + request_dpp_div, 647 + true); 648 + } 649 + 650 + /* If target clk not same as dppclk threshold, set to target clock */ 651 + if (dispclk_to_dpp_threshold != new_clocks->dispclk_khz) 652 + dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz); 653 + 654 + dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 655 + dccg->clks.dppclk_khz = new_clocks->dppclk_khz; 656 + dccg->clks.max_supported_dppclk_khz = new_clocks->max_supported_dppclk_khz; 657 + } 658 + 659 + static void dcn1_update_clocks(struct dccg *dccg, 660 + struct dc_clocks *new_clocks, 661 + bool safe_to_lower) 662 + { 663 + struct dc *dc = dccg->ctx->dc; 664 + struct pp_smu_display_requirement_rv *smu_req_cur = 665 + &dc->res_pool->pp_smu_req; 666 + struct pp_smu_display_requirement_rv smu_req = *smu_req_cur; 667 + struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu; 668 + struct dm_pp_clock_for_voltage_req clock_voltage_req = {0}; 669 + bool send_request_to_increase = false; 670 + bool send_request_to_lower = false; 671 + 672 + if (new_clocks->phyclk_khz) 673 + smu_req.display_count = 1; 674 + else 675 + smu_req.display_count = 0; 676 + 677 + if (new_clocks->dispclk_khz > dccg->clks.dispclk_khz 678 + || new_clocks->phyclk_khz > dccg->clks.phyclk_khz 679 + || new_clocks->fclk_khz > dccg->clks.fclk_khz 680 + || new_clocks->dcfclk_khz > dccg->clks.dcfclk_khz) 681 + send_request_to_increase = true; 682 + 683 + if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) { 684 + dccg->clks.phyclk_khz = new_clocks->phyclk_khz; 685 + 686 + send_request_to_lower = true; 687 + } 688 + 689 + if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, dccg->clks.fclk_khz)) { 690 + dccg->clks.fclk_khz = new_clocks->fclk_khz; 691 + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_FCLK; 692 + clock_voltage_req.clocks_in_khz = new_clocks->fclk_khz; 693 + smu_req.hard_min_fclk_khz = new_clocks->fclk_khz; 694 + 695 + dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 696 + send_request_to_lower = true; 697 + } 698 + 699 + if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, dccg->clks.dcfclk_khz)) { 700 + dccg->clks.dcfclk_khz = new_clocks->dcfclk_khz; 701 + smu_req.hard_min_dcefclk_khz = new_clocks->dcfclk_khz; 702 + 703 + send_request_to_lower = true; 704 + } 705 + 706 + if (should_set_clock(safe_to_lower, 707 + new_clocks->dcfclk_deep_sleep_khz, dccg->clks.dcfclk_deep_sleep_khz)) { 708 + dccg->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz; 709 + smu_req.min_deep_sleep_dcefclk_mhz = new_clocks->dcfclk_deep_sleep_khz; 710 + 711 + send_request_to_lower = true; 712 + } 713 + 714 + /* make sure dcf clk is before dpp clk to 715 + * make sure we have enough voltage to run dpp clk 716 + */ 717 + if (send_request_to_increase) { 718 + /*use dcfclk to request voltage*/ 719 + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; 720 + clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks); 721 + dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 722 + if (pp_smu->set_display_requirement) 723 + pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req); 724 + } 725 + 726 + /* dcn1 dppclk is tied to dispclk */ 727 + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 728 + dcn1_ramp_up_dispclk_with_dpp(dccg, new_clocks); 729 + dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 730 + 731 + send_request_to_lower = true; 732 + } 733 + 734 + if (!send_request_to_increase && send_request_to_lower) { 735 + /*use dcfclk to request voltage*/ 736 + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; 737 + clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks); 738 + dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 739 + if (pp_smu->set_display_requirement) 740 + pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req); 741 + } 742 + 743 + 744 + *smu_req_cur = smu_req; 745 + } 746 + #endif 747 + 748 + static void dce_update_clocks(struct dccg *dccg, 749 + struct dc_clocks *new_clocks, 750 + bool safe_to_lower) 751 + { 752 + struct dm_pp_power_level_change_request level_change_req; 753 + 754 + level_change_req.power_level = dce_get_required_clocks_state(dccg, new_clocks); 755 + /* get max clock state from PPLIB */ 756 + if ((level_change_req.power_level < dccg->cur_min_clks_state && safe_to_lower) 757 + || level_change_req.power_level > dccg->cur_min_clks_state) { 758 + if (dm_pp_apply_power_level_change_request(dccg->ctx, &level_change_req)) 759 + dccg->cur_min_clks_state = level_change_req.power_level; 760 + } 761 + 762 + if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 763 + dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz); 764 + dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 765 + } 766 + } 767 + 768 + #ifdef CONFIG_DRM_AMD_DC_DCN1_0 769 + static const struct display_clock_funcs dcn1_funcs = { 770 + .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz, 771 + .set_dispclk = dce112_set_clock, 772 + .update_clocks = dcn1_update_clocks 773 + }; 774 + #endif 549 775 550 776 static const struct display_clock_funcs dce120_funcs = { 551 - .get_dp_ref_clk_frequency = dce_clocks_get_dp_ref_freq_wrkaround, 552 - .apply_clock_voltage_request = dce_apply_clock_voltage_request, 553 - .set_clock = dce112_set_clock 777 + .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz, 778 + .set_dispclk = dce112_set_clock, 779 + .update_clocks = dce12_update_clocks 554 780 }; 555 781 556 782 static const struct display_clock_funcs dce112_funcs = { 557 - .get_dp_ref_clk_frequency = dce_clocks_get_dp_ref_freq, 558 - .get_required_clocks_state = dce_get_required_clocks_state, 559 - .set_min_clocks_state = dce_clock_set_min_clocks_state, 560 - .set_clock = dce112_set_clock 783 + .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz, 784 + .set_dispclk = dce112_set_clock, 785 + .update_clocks = dce_update_clocks 561 786 }; 562 787 563 788 static const struct display_clock_funcs dce110_funcs = { 564 - .get_dp_ref_clk_frequency = dce_clocks_get_dp_ref_freq, 565 - .get_required_clocks_state = dce_get_required_clocks_state, 566 - .set_min_clocks_state = dce_clock_set_min_clocks_state, 567 - .set_clock = dce_psr_set_clock 789 + .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz, 790 + .set_dispclk = dce_psr_set_clock, 791 + .update_clocks = dce_update_clocks 568 792 }; 569 793 570 794 static const struct display_clock_funcs dce_funcs = { 571 - .get_dp_ref_clk_frequency = dce_clocks_get_dp_ref_freq, 572 - .get_required_clocks_state = dce_get_required_clocks_state, 573 - .set_min_clocks_state = dce_clock_set_min_clocks_state, 574 - .set_clock = dce_set_clock 795 + .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz, 796 + .set_dispclk = dce_set_clock, 797 + .update_clocks = dce_update_clocks 575 798 }; 576 799 577 - static void dce_disp_clk_construct( 578 - struct dce_disp_clk *clk_dce, 800 + static void dce_dccg_construct( 801 + struct dce_dccg *clk_dce, 579 802 struct dc_context *ctx, 580 - const struct dce_disp_clk_registers *regs, 581 - const struct dce_disp_clk_shift *clk_shift, 582 - const struct dce_disp_clk_mask *clk_mask) 803 + const struct dccg_registers *regs, 804 + const struct dccg_shift *clk_shift, 805 + const struct dccg_mask *clk_mask) 583 806 { 584 - struct display_clock *base = &clk_dce->base; 807 + struct dccg *base = &clk_dce->base; 585 808 586 809 base->ctx = ctx; 587 810 base->funcs = &dce_funcs; ··· 725 700 726 701 dce_clock_read_integrated_info(clk_dce); 727 702 dce_clock_read_ss_info(clk_dce); 728 - 729 - dce_divider_range_construct( 730 - &clk_dce->divider_ranges[DIVIDER_RANGE_01], 731 - DIVIDER_RANGE_01_START, 732 - DIVIDER_RANGE_01_STEP_SIZE, 733 - DIVIDER_RANGE_01_BASE_DIVIDER_ID, 734 - DIVIDER_RANGE_02_BASE_DIVIDER_ID); 735 - dce_divider_range_construct( 736 - &clk_dce->divider_ranges[DIVIDER_RANGE_02], 737 - DIVIDER_RANGE_02_START, 738 - DIVIDER_RANGE_02_STEP_SIZE, 739 - DIVIDER_RANGE_02_BASE_DIVIDER_ID, 740 - DIVIDER_RANGE_03_BASE_DIVIDER_ID); 741 - dce_divider_range_construct( 742 - &clk_dce->divider_ranges[DIVIDER_RANGE_03], 743 - DIVIDER_RANGE_03_START, 744 - DIVIDER_RANGE_03_STEP_SIZE, 745 - DIVIDER_RANGE_03_BASE_DIVIDER_ID, 746 - DIVIDER_RANGE_MAX_DIVIDER_ID); 747 703 } 748 704 749 - struct display_clock *dce_disp_clk_create( 705 + struct dccg *dce_dccg_create( 750 706 struct dc_context *ctx, 751 - const struct dce_disp_clk_registers *regs, 752 - const struct dce_disp_clk_shift *clk_shift, 753 - const struct dce_disp_clk_mask *clk_mask) 707 + const struct dccg_registers *regs, 708 + const struct dccg_shift *clk_shift, 709 + const struct dccg_mask *clk_mask) 754 710 { 755 - struct dce_disp_clk *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 711 + struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 756 712 757 713 if (clk_dce == NULL) { 758 714 BREAK_TO_DEBUGGER(); ··· 744 738 dce80_max_clks_by_state, 745 739 sizeof(dce80_max_clks_by_state)); 746 740 747 - dce_disp_clk_construct( 741 + dce_dccg_construct( 748 742 clk_dce, ctx, regs, clk_shift, clk_mask); 749 743 750 744 return &clk_dce->base; 751 745 } 752 746 753 - struct display_clock *dce110_disp_clk_create( 747 + struct dccg *dce110_dccg_create( 754 748 struct dc_context *ctx, 755 - const struct dce_disp_clk_registers *regs, 756 - const struct dce_disp_clk_shift *clk_shift, 757 - const struct dce_disp_clk_mask *clk_mask) 749 + const struct dccg_registers *regs, 750 + const struct dccg_shift *clk_shift, 751 + const struct dccg_mask *clk_mask) 758 752 { 759 - struct dce_disp_clk *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 753 + struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 760 754 761 755 if (clk_dce == NULL) { 762 756 BREAK_TO_DEBUGGER(); ··· 767 761 dce110_max_clks_by_state, 768 762 sizeof(dce110_max_clks_by_state)); 769 763 770 - dce_disp_clk_construct( 764 + dce_dccg_construct( 771 765 clk_dce, ctx, regs, clk_shift, clk_mask); 772 766 773 767 clk_dce->base.funcs = &dce110_funcs; ··· 775 769 return &clk_dce->base; 776 770 } 777 771 778 - struct display_clock *dce112_disp_clk_create( 772 + struct dccg *dce112_dccg_create( 779 773 struct dc_context *ctx, 780 - const struct dce_disp_clk_registers *regs, 781 - const struct dce_disp_clk_shift *clk_shift, 782 - const struct dce_disp_clk_mask *clk_mask) 774 + const struct dccg_registers *regs, 775 + const struct dccg_shift *clk_shift, 776 + const struct dccg_mask *clk_mask) 783 777 { 784 - struct dce_disp_clk *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 778 + struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 785 779 786 780 if (clk_dce == NULL) { 787 781 BREAK_TO_DEBUGGER(); ··· 792 786 dce112_max_clks_by_state, 793 787 sizeof(dce112_max_clks_by_state)); 794 788 795 - dce_disp_clk_construct( 789 + dce_dccg_construct( 796 790 clk_dce, ctx, regs, clk_shift, clk_mask); 797 791 798 792 clk_dce->base.funcs = &dce112_funcs; ··· 800 794 return &clk_dce->base; 801 795 } 802 796 803 - struct display_clock *dce120_disp_clk_create(struct dc_context *ctx) 797 + struct dccg *dce120_dccg_create(struct dc_context *ctx) 804 798 { 805 - struct dce_disp_clk *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 806 - struct dm_pp_clock_levels_with_voltage clk_level_info = {0}; 799 + struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 807 800 808 801 if (clk_dce == NULL) { 809 802 BREAK_TO_DEBUGGER(); ··· 813 808 dce120_max_clks_by_state, 814 809 sizeof(dce120_max_clks_by_state)); 815 810 816 - dce_disp_clk_construct( 811 + dce_dccg_construct( 817 812 clk_dce, ctx, NULL, NULL, NULL); 818 813 819 814 clk_dce->base.funcs = &dce120_funcs; 820 815 821 - /* new in dce120 */ 822 - if (!ctx->dc->debug.disable_pplib_clock_request && 823 - dm_pp_get_clock_levels_by_type_with_voltage( 824 - ctx, DM_PP_CLOCK_TYPE_DISPLAY_CLK, &clk_level_info) 825 - && clk_level_info.num_levels) 826 - clk_dce->max_displ_clk_in_khz = 827 - clk_level_info.data[clk_level_info.num_levels - 1].clocks_in_khz; 828 - else 829 - clk_dce->max_displ_clk_in_khz = 1133000; 830 - 831 816 return &clk_dce->base; 832 817 } 833 818 834 - void dce_disp_clk_destroy(struct display_clock **disp_clk) 819 + #ifdef CONFIG_DRM_AMD_DC_DCN1_0 820 + struct dccg *dcn1_dccg_create(struct dc_context *ctx) 835 821 { 836 - struct dce_disp_clk *clk_dce = TO_DCE_CLOCKS(*disp_clk); 822 + struct dc_debug *debug = &ctx->dc->debug; 823 + struct dc_bios *bp = ctx->dc_bios; 824 + struct dc_firmware_info fw_info = { { 0 } }; 825 + struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL); 826 + 827 + if (clk_dce == NULL) { 828 + BREAK_TO_DEBUGGER(); 829 + return NULL; 830 + } 831 + 832 + clk_dce->base.ctx = ctx; 833 + clk_dce->base.funcs = &dcn1_funcs; 834 + 835 + clk_dce->dfs_bypass_disp_clk = 0; 836 + 837 + clk_dce->dprefclk_ss_percentage = 0; 838 + clk_dce->dprefclk_ss_divider = 1000; 839 + clk_dce->ss_on_dprefclk = false; 840 + 841 + if (bp->integrated_info) 842 + clk_dce->dentist_vco_freq_khz = bp->integrated_info->dentist_vco_freq; 843 + if (clk_dce->dentist_vco_freq_khz == 0) { 844 + bp->funcs->get_firmware_info(bp, &fw_info); 845 + clk_dce->dentist_vco_freq_khz = fw_info.smu_gpu_pll_output_freq; 846 + if (clk_dce->dentist_vco_freq_khz == 0) 847 + clk_dce->dentist_vco_freq_khz = 3600000; 848 + } 849 + 850 + if (!debug->disable_dfs_bypass && bp->integrated_info) 851 + if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE) 852 + clk_dce->dfs_bypass_enabled = true; 853 + 854 + dce_clock_read_ss_info(clk_dce); 855 + 856 + return &clk_dce->base; 857 + } 858 + #endif 859 + 860 + void dce_dccg_destroy(struct dccg **dccg) 861 + { 862 + struct dce_dccg *clk_dce = TO_DCE_CLOCKS(*dccg); 837 863 838 864 kfree(clk_dce); 839 - *disp_clk = NULL; 865 + *dccg = NULL; 840 866 }
+40 -53
drivers/gpu/drm/amd/display/dc/dce/dce_clocks.h
··· 33 33 .DPREFCLK_CNTL = mmDPREFCLK_CNTL, \ 34 34 .DENTIST_DISPCLK_CNTL = mmDENTIST_DISPCLK_CNTL 35 35 36 + #define CLK_COMMON_REG_LIST_DCN_BASE() \ 37 + SR(DENTIST_DISPCLK_CNTL) 38 + 36 39 #define CLK_SF(reg_name, field_name, post_fix)\ 37 40 .field_name = reg_name ## __ ## field_name ## post_fix 38 41 ··· 43 40 CLK_SF(DPREFCLK_CNTL, DPREFCLK_SRC_SEL, mask_sh), \ 44 41 CLK_SF(DENTIST_DISPCLK_CNTL, DENTIST_DPREFCLK_WDIVIDER, mask_sh) 45 42 43 + #define CLK_COMMON_MASK_SH_LIST_DCN_COMMON_BASE(mask_sh) \ 44 + CLK_SF(DENTIST_DISPCLK_CNTL, DENTIST_DPPCLK_WDIVIDER, mask_sh),\ 45 + CLK_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, mask_sh),\ 46 + CLK_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, mask_sh),\ 47 + CLK_SF(DENTIST_DISPCLK_CNTL, DENTIST_DPPCLK_CHG_DONE, mask_sh) 48 + 46 49 #define CLK_REG_FIELD_LIST(type) \ 47 50 type DPREFCLK_SRC_SEL; \ 48 - type DENTIST_DPREFCLK_WDIVIDER; 51 + type DENTIST_DPREFCLK_WDIVIDER; \ 52 + type DENTIST_DISPCLK_WDIVIDER; \ 53 + type DENTIST_DPPCLK_WDIVIDER; \ 54 + type DENTIST_DISPCLK_CHG_DONE; \ 55 + type DENTIST_DPPCLK_CHG_DONE; 49 56 50 - struct dce_disp_clk_shift { 57 + struct dccg_shift { 51 58 CLK_REG_FIELD_LIST(uint8_t) 52 59 }; 53 60 54 - struct dce_disp_clk_mask { 61 + struct dccg_mask { 55 62 CLK_REG_FIELD_LIST(uint32_t) 56 63 }; 57 64 58 - struct dce_disp_clk_registers { 65 + struct dccg_registers { 59 66 uint32_t DPREFCLK_CNTL; 60 67 uint32_t DENTIST_DISPCLK_CNTL; 61 68 }; 62 69 63 - /* Array identifiers and count for the divider ranges.*/ 64 - enum dce_divider_range_count { 65 - DIVIDER_RANGE_01 = 0, 66 - DIVIDER_RANGE_02, 67 - DIVIDER_RANGE_03, 68 - DIVIDER_RANGE_MAX /* == 3*/ 69 - }; 70 - 71 - enum dce_divider_error_types { 72 - INVALID_DID = 0, 73 - INVALID_DIVIDER = 1 74 - }; 75 - 76 - struct dce_divider_range { 77 - int div_range_start; 78 - /* The end of this range of dividers.*/ 79 - int div_range_end; 80 - /* The distance between each divider in this range.*/ 81 - int div_range_step; 82 - /* The divider id for the lowest divider.*/ 83 - int did_min; 84 - /* The divider id for the highest divider.*/ 85 - int did_max; 86 - }; 87 - 88 - struct dce_disp_clk { 89 - struct display_clock base; 90 - const struct dce_disp_clk_registers *regs; 91 - const struct dce_disp_clk_shift *clk_shift; 92 - const struct dce_disp_clk_mask *clk_mask; 70 + struct dce_dccg { 71 + struct dccg base; 72 + const struct dccg_registers *regs; 73 + const struct dccg_shift *clk_shift; 74 + const struct dccg_mask *clk_mask; 93 75 94 76 struct state_dependent_clocks max_clks_by_state[DM_PP_CLOCKS_MAX_STATES]; 95 - struct dce_divider_range divider_ranges[DIVIDER_RANGE_MAX]; 96 77 97 - bool use_max_disp_clk; 98 78 int dentist_vco_freq_khz; 99 79 100 80 /* Cache the status of DFS-bypass feature*/ ··· 92 106 int dprefclk_ss_percentage; 93 107 /* DPREFCLK SS percentage Divider (100 or 1000) */ 94 108 int dprefclk_ss_divider; 95 - 96 - /* max disp_clk from PPLIB for max validation display clock*/ 97 - int max_displ_clk_in_khz; 98 109 }; 99 110 100 111 101 - struct display_clock *dce_disp_clk_create( 112 + struct dccg *dce_dccg_create( 102 113 struct dc_context *ctx, 103 - const struct dce_disp_clk_registers *regs, 104 - const struct dce_disp_clk_shift *clk_shift, 105 - const struct dce_disp_clk_mask *clk_mask); 114 + const struct dccg_registers *regs, 115 + const struct dccg_shift *clk_shift, 116 + const struct dccg_mask *clk_mask); 106 117 107 - struct display_clock *dce110_disp_clk_create( 118 + struct dccg *dce110_dccg_create( 108 119 struct dc_context *ctx, 109 - const struct dce_disp_clk_registers *regs, 110 - const struct dce_disp_clk_shift *clk_shift, 111 - const struct dce_disp_clk_mask *clk_mask); 120 + const struct dccg_registers *regs, 121 + const struct dccg_shift *clk_shift, 122 + const struct dccg_mask *clk_mask); 112 123 113 - struct display_clock *dce112_disp_clk_create( 124 + struct dccg *dce112_dccg_create( 114 125 struct dc_context *ctx, 115 - const struct dce_disp_clk_registers *regs, 116 - const struct dce_disp_clk_shift *clk_shift, 117 - const struct dce_disp_clk_mask *clk_mask); 126 + const struct dccg_registers *regs, 127 + const struct dccg_shift *clk_shift, 128 + const struct dccg_mask *clk_mask); 118 129 119 - struct display_clock *dce120_disp_clk_create(struct dc_context *ctx); 130 + struct dccg *dce120_dccg_create(struct dc_context *ctx); 120 131 121 - void dce_disp_clk_destroy(struct display_clock **disp_clk); 132 + #ifdef CONFIG_DRM_AMD_DC_DCN1_0 133 + struct dccg *dcn1_dccg_create(struct dc_context *ctx); 134 + #endif 135 + 136 + void dce_dccg_destroy(struct dccg **dccg); 122 137 123 138 #endif /* _DCE_CLOCKS_H_ */
-3
drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
··· 249 249 uint32_t DISPCLK_FREQ_CHANGE_CNTL; 250 250 uint32_t RBBMIF_TIMEOUT_DIS; 251 251 uint32_t RBBMIF_TIMEOUT_DIS_2; 252 - uint32_t DENTIST_DISPCLK_CNTL; 253 252 uint32_t DCHUBBUB_CRC_CTRL; 254 253 uint32_t DPP_TOP0_DPP_CRC_CTRL; 255 254 uint32_t DPP_TOP0_DPP_CRC_VAL_R_G; ··· 495 496 type DOMAIN7_PGFSM_PWR_STATUS; \ 496 497 type DCFCLK_GATE_DIS; \ 497 498 type DCHUBBUB_GLOBAL_TIMER_REFDIV; \ 498 - type DENTIST_DPPCLK_WDIVIDER; \ 499 - type DENTIST_DISPCLK_WDIVIDER; \ 500 499 type VGA_TEST_ENABLE; \ 501 500 type VGA_TEST_RENDER_START; \ 502 501 type D1VGA_MODE_ENABLE; \
+43 -6
drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
··· 125 125 dc->prev_display_config = *pp_display_cfg; 126 126 } 127 127 128 + /* unit: in_khz before mode set, get pixel clock from context. ASIC register 129 + * may not be programmed yet 130 + */ 131 + static uint32_t get_max_pixel_clock_for_all_paths( 132 + struct dc *dc, 133 + struct dc_state *context) 134 + { 135 + uint32_t max_pix_clk = 0; 136 + int i; 137 + 138 + for (i = 0; i < MAX_PIPES; i++) { 139 + struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; 140 + 141 + if (pipe_ctx->stream == NULL) 142 + continue; 143 + 144 + /* do not check under lay */ 145 + if (pipe_ctx->top_pipe) 146 + continue; 147 + 148 + if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk > max_pix_clk) 149 + max_pix_clk = 150 + pipe_ctx->stream_res.pix_clk_params.requested_pix_clk; 151 + } 152 + 153 + if (max_pix_clk == 0) 154 + ASSERT(0); 155 + 156 + return max_pix_clk; 157 + } 158 + 128 159 void dce100_set_bandwidth( 129 160 struct dc *dc, 130 161 struct dc_state *context, 131 162 bool decrease_allowed) 132 163 { 133 - if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_state->bw.dce.dispclk_khz) { 134 - dc->res_pool->display_clock->funcs->set_clock( 135 - dc->res_pool->display_clock, 136 - context->bw.dce.dispclk_khz * 115 / 100); 137 - dc->current_state->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; 138 - } 164 + struct dc_clocks req_clks; 165 + 166 + req_clks.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100; 167 + req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context); 168 + 169 + dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool); 170 + 171 + dc->res_pool->dccg->funcs->update_clocks( 172 + dc->res_pool->dccg, 173 + &req_clks, 174 + decrease_allowed); 175 + 139 176 dce100_pplib_apply_display_requirements(dc, context); 140 177 } 141 178
+8 -8
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
··· 135 135 .reg_name = mm ## block ## id ## _ ## reg_name 136 136 137 137 138 - static const struct dce_disp_clk_registers disp_clk_regs = { 138 + static const struct dccg_registers disp_clk_regs = { 139 139 CLK_COMMON_REG_LIST_DCE_BASE() 140 140 }; 141 141 142 - static const struct dce_disp_clk_shift disp_clk_shift = { 142 + static const struct dccg_shift disp_clk_shift = { 143 143 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 144 144 }; 145 145 146 - static const struct dce_disp_clk_mask disp_clk_mask = { 146 + static const struct dccg_mask disp_clk_mask = { 147 147 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 148 148 }; 149 149 ··· 644 644 dce_aud_destroy(&pool->base.audios[i]); 645 645 } 646 646 647 - if (pool->base.display_clock != NULL) 648 - dce_disp_clk_destroy(&pool->base.display_clock); 647 + if (pool->base.dccg != NULL) 648 + dce_dccg_destroy(&pool->base.dccg); 649 649 650 650 if (pool->base.abm != NULL) 651 651 dce_abm_destroy(&pool->base.abm); ··· 817 817 } 818 818 } 819 819 820 - pool->base.display_clock = dce_disp_clk_create(ctx, 820 + pool->base.dccg = dce_dccg_create(ctx, 821 821 &disp_clk_regs, 822 822 &disp_clk_shift, 823 823 &disp_clk_mask); 824 - if (pool->base.display_clock == NULL) { 824 + if (pool->base.dccg == NULL) { 825 825 dm_error("DC: failed to create display clock!\n"); 826 826 BREAK_TO_DEBUGGER(); 827 827 goto res_create_fail; ··· 851 851 * max_clock_state 852 852 */ 853 853 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 854 - pool->base.display_clock->max_clks_state = 854 + pool->base.dccg->max_clks_state = 855 855 static_clk_info.max_clocks_state; 856 856 { 857 857 struct irq_service_init_data init_data;
+2 -2
drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
··· 143 143 struct dce110_compressor *cp110, 144 144 bool enabled) 145 145 { 146 - uint16_t counter = 0; 146 + uint32_t counter = 0; 147 147 uint32_t addr = mmFBC_STATUS; 148 148 uint32_t value; 149 149 ··· 158 158 counter++; 159 159 } 160 160 161 - if (counter == 10) { 161 + if (counter == 1000) { 162 162 DC_LOG_WARNING("%s: wait counter exceeded, changes to HW not applied", 163 163 __func__); 164 164 } else {
+19 -156
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 1475 1475 { 1476 1476 int i; 1477 1477 1478 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 1478 + for (i = 0; i < dc->res_pool->timing_generator_count; i++) { 1479 1479 dc->res_pool->timing_generators[i]->funcs->disable_crtc( 1480 1480 dc->res_pool->timing_generators[i]); 1481 1481 } ··· 1515 1515 struct timing_generator *tg; 1516 1516 struct dc_context *ctx = dc->ctx; 1517 1517 1518 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 1518 + for (i = 0; i < dc->res_pool->timing_generator_count; i++) { 1519 1519 tg = dc->res_pool->timing_generators[i]; 1520 1520 1521 1521 if (tg->funcs->disable_vga) 1522 1522 tg->funcs->disable_vga(tg); 1523 - 1523 + } 1524 + for (i = 0; i < dc->res_pool->pipe_count; i++) { 1524 1525 /* Enable CLOCK gating for each pipe BEFORE controller 1525 1526 * powergating. */ 1526 1527 enable_display_pipe_clock_gating(ctx, ··· 1664 1663 } 1665 1664 } 1666 1665 1667 - static void set_safe_displaymarks( 1666 + void dce110_set_safe_displaymarks( 1668 1667 struct resource_context *res_ctx, 1669 1668 const struct resource_pool *pool) 1670 1669 { ··· 1756 1755 } 1757 1756 1758 1757 /* unit: in_khz before mode set, get pixel clock from context. ASIC register 1759 - * may not be programmed yet. 1760 - * TODO: after mode set, pre_mode_set = false, 1761 - * may read PLL register to get pixel clock 1758 + * may not be programmed yet 1762 1759 */ 1763 1760 static uint32_t get_max_pixel_clock_for_all_paths( 1764 1761 struct dc *dc, 1765 - struct dc_state *context, 1766 - bool pre_mode_set) 1762 + struct dc_state *context) 1767 1763 { 1768 1764 uint32_t max_pix_clk = 0; 1769 1765 int i; 1770 - 1771 - if (!pre_mode_set) { 1772 - /* TODO: read ASIC register to get pixel clock */ 1773 - ASSERT(0); 1774 - } 1775 1766 1776 1767 for (i = 0; i < MAX_PIPES; i++) { 1777 1768 struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; ··· 1780 1787 pipe_ctx->stream_res.pix_clk_params.requested_pix_clk; 1781 1788 } 1782 1789 1783 - if (max_pix_clk == 0) 1784 - ASSERT(0); 1785 - 1786 1790 return max_pix_clk; 1787 - } 1788 - 1789 - /* 1790 - * Find clock state based on clock requested. if clock value is 0, simply 1791 - * set clock state as requested without finding clock state by clock value 1792 - */ 1793 - 1794 - static void apply_min_clocks( 1795 - struct dc *dc, 1796 - struct dc_state *context, 1797 - enum dm_pp_clocks_state *clocks_state, 1798 - bool pre_mode_set) 1799 - { 1800 - struct state_dependent_clocks req_clocks = {0}; 1801 - 1802 - if (!pre_mode_set) { 1803 - /* set clock_state without verification */ 1804 - if (context->dis_clk->funcs->set_min_clocks_state) { 1805 - context->dis_clk->funcs->set_min_clocks_state( 1806 - context->dis_clk, *clocks_state); 1807 - return; 1808 - } 1809 - 1810 - /* TODO: This is incorrect. Figure out how to fix. */ 1811 - context->dis_clk->funcs->apply_clock_voltage_request( 1812 - context->dis_clk, 1813 - DM_PP_CLOCK_TYPE_DISPLAY_CLK, 1814 - context->dis_clk->cur_clocks_value.dispclk_in_khz, 1815 - pre_mode_set, 1816 - false); 1817 - 1818 - context->dis_clk->funcs->apply_clock_voltage_request( 1819 - context->dis_clk, 1820 - DM_PP_CLOCK_TYPE_PIXELCLK, 1821 - context->dis_clk->cur_clocks_value.max_pixelclk_in_khz, 1822 - pre_mode_set, 1823 - false); 1824 - 1825 - context->dis_clk->funcs->apply_clock_voltage_request( 1826 - context->dis_clk, 1827 - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, 1828 - context->dis_clk->cur_clocks_value.max_non_dp_phyclk_in_khz, 1829 - pre_mode_set, 1830 - false); 1831 - return; 1832 - } 1833 - 1834 - /* get the required state based on state dependent clocks: 1835 - * display clock and pixel clock 1836 - */ 1837 - req_clocks.display_clk_khz = context->bw.dce.dispclk_khz; 1838 - 1839 - req_clocks.pixel_clk_khz = get_max_pixel_clock_for_all_paths( 1840 - dc, context, true); 1841 - 1842 - if (context->dis_clk->funcs->get_required_clocks_state) { 1843 - *clocks_state = context->dis_clk->funcs->get_required_clocks_state( 1844 - context->dis_clk, &req_clocks); 1845 - context->dis_clk->funcs->set_min_clocks_state( 1846 - context->dis_clk, *clocks_state); 1847 - } else { 1848 - context->dis_clk->funcs->apply_clock_voltage_request( 1849 - context->dis_clk, 1850 - DM_PP_CLOCK_TYPE_DISPLAY_CLK, 1851 - req_clocks.display_clk_khz, 1852 - pre_mode_set, 1853 - false); 1854 - 1855 - context->dis_clk->funcs->apply_clock_voltage_request( 1856 - context->dis_clk, 1857 - DM_PP_CLOCK_TYPE_PIXELCLK, 1858 - req_clocks.pixel_clk_khz, 1859 - pre_mode_set, 1860 - false); 1861 - 1862 - context->dis_clk->funcs->apply_clock_voltage_request( 1863 - context->dis_clk, 1864 - DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, 1865 - req_clocks.pixel_clk_khz, 1866 - pre_mode_set, 1867 - false); 1868 - } 1869 1791 } 1870 1792 1871 1793 /* ··· 2001 2093 struct dc_bios *dcb = dc->ctx->dc_bios; 2002 2094 enum dc_status status; 2003 2095 int i; 2004 - enum dm_pp_clocks_state clocks_state = DM_PP_CLOCKS_STATE_INVALID; 2005 2096 2006 2097 /* Reset old context */ 2007 2098 /* look up the targets that have been removed since last commit */ ··· 2034 2127 PIPE_GATING_CONTROL_DISABLE); 2035 2128 } 2036 2129 2037 - set_safe_displaymarks(&context->res_ctx, dc->res_pool); 2038 - 2039 2130 if (dc->fbc_compressor) 2040 2131 dc->fbc_compressor->funcs->disable_fbc(dc->fbc_compressor); 2041 - 2042 - /*TODO: when pplib works*/ 2043 - apply_min_clocks(dc, context, &clocks_state, true); 2044 - 2045 - #if defined(CONFIG_DRM_AMD_DC_DCN1_0) 2046 - if (dc->ctx->dce_version >= DCN_VERSION_1_0) { 2047 - if (context->bw.dcn.calc_clk.fclk_khz 2048 - > dc->current_state->bw.dcn.cur_clk.fclk_khz) { 2049 - struct dm_pp_clock_for_voltage_req clock; 2050 - 2051 - clock.clk_type = DM_PP_CLOCK_TYPE_FCLK; 2052 - clock.clocks_in_khz = context->bw.dcn.calc_clk.fclk_khz; 2053 - dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); 2054 - dc->current_state->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; 2055 - context->bw.dcn.cur_clk.fclk_khz = clock.clocks_in_khz; 2056 - } 2057 - if (context->bw.dcn.calc_clk.dcfclk_khz 2058 - > dc->current_state->bw.dcn.cur_clk.dcfclk_khz) { 2059 - struct dm_pp_clock_for_voltage_req clock; 2060 - 2061 - clock.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; 2062 - clock.clocks_in_khz = context->bw.dcn.calc_clk.dcfclk_khz; 2063 - dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); 2064 - dc->current_state->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; 2065 - context->bw.dcn.cur_clk.dcfclk_khz = clock.clocks_in_khz; 2066 - } 2067 - if (context->bw.dcn.calc_clk.dispclk_khz 2068 - > dc->current_state->bw.dcn.cur_clk.dispclk_khz) { 2069 - dc->res_pool->display_clock->funcs->set_clock( 2070 - dc->res_pool->display_clock, 2071 - context->bw.dcn.calc_clk.dispclk_khz); 2072 - dc->current_state->bw.dcn.cur_clk.dispclk_khz = 2073 - context->bw.dcn.calc_clk.dispclk_khz; 2074 - context->bw.dcn.cur_clk.dispclk_khz = 2075 - context->bw.dcn.calc_clk.dispclk_khz; 2076 - } 2077 - } else 2078 - #endif 2079 - if (context->bw.dce.dispclk_khz 2080 - > dc->current_state->bw.dce.dispclk_khz) { 2081 - dc->res_pool->display_clock->funcs->set_clock( 2082 - dc->res_pool->display_clock, 2083 - context->bw.dce.dispclk_khz * 115 / 100); 2084 - } 2085 2132 2086 2133 dce110_setup_audio_dto(dc, context); 2087 2134 ··· 2064 2203 if (DC_OK != status) 2065 2204 return status; 2066 2205 } 2067 - 2068 - /* to save power */ 2069 - apply_min_clocks(dc, context, &clocks_state, false); 2070 2206 2071 2207 dcb->funcs->set_scratch_critical_state(dcb, false); 2072 2208 ··· 2552 2694 struct dc_state *context, 2553 2695 bool decrease_allowed) 2554 2696 { 2555 - dce110_set_displaymarks(dc, context); 2697 + struct dc_clocks req_clks; 2556 2698 2557 - if (decrease_allowed || context->bw.dce.dispclk_khz > dc->current_state->bw.dce.dispclk_khz) { 2558 - dc->res_pool->display_clock->funcs->set_clock( 2559 - dc->res_pool->display_clock, 2560 - context->bw.dce.dispclk_khz * 115 / 100); 2561 - dc->current_state->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz; 2562 - } 2699 + req_clks.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100; 2700 + req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context); 2563 2701 2702 + if (decrease_allowed) 2703 + dce110_set_displaymarks(dc, context); 2704 + else 2705 + dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool); 2706 + 2707 + dc->res_pool->dccg->funcs->update_clocks( 2708 + dc->res_pool->dccg, 2709 + &req_clks, 2710 + decrease_allowed); 2564 2711 pplib_apply_display_requirements(dc, context); 2565 2712 } 2566 2713
+4
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
··· 60 60 61 61 void dce110_power_down(struct dc *dc); 62 62 63 + void dce110_set_safe_displaymarks( 64 + struct resource_context *res_ctx, 65 + const struct resource_pool *pool); 66 + 63 67 void dce110_fill_display_configs( 64 68 const struct dc_state *context, 65 69 struct dm_pp_display_configuration *pp_display_cfg);
+8 -8
drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
··· 146 146 #define SRI(reg_name, block, id)\ 147 147 .reg_name = mm ## block ## id ## _ ## reg_name 148 148 149 - static const struct dce_disp_clk_registers disp_clk_regs = { 149 + static const struct dccg_registers disp_clk_regs = { 150 150 CLK_COMMON_REG_LIST_DCE_BASE() 151 151 }; 152 152 153 - static const struct dce_disp_clk_shift disp_clk_shift = { 153 + static const struct dccg_shift disp_clk_shift = { 154 154 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 155 155 }; 156 156 157 - static const struct dce_disp_clk_mask disp_clk_mask = { 157 + static const struct dccg_mask disp_clk_mask = { 158 158 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 159 159 }; 160 160 ··· 679 679 if (pool->base.dmcu != NULL) 680 680 dce_dmcu_destroy(&pool->base.dmcu); 681 681 682 - if (pool->base.display_clock != NULL) 683 - dce_disp_clk_destroy(&pool->base.display_clock); 682 + if (pool->base.dccg != NULL) 683 + dce_dccg_destroy(&pool->base.dccg); 684 684 685 685 if (pool->base.irqs != NULL) { 686 686 dal_irq_service_destroy(&pool->base.irqs); ··· 1179 1179 } 1180 1180 } 1181 1181 1182 - pool->base.display_clock = dce110_disp_clk_create(ctx, 1182 + pool->base.dccg = dce110_dccg_create(ctx, 1183 1183 &disp_clk_regs, 1184 1184 &disp_clk_shift, 1185 1185 &disp_clk_mask); 1186 - if (pool->base.display_clock == NULL) { 1186 + if (pool->base.dccg == NULL) { 1187 1187 dm_error("DC: failed to create display clock!\n"); 1188 1188 BREAK_TO_DEBUGGER(); 1189 1189 goto res_create_fail; ··· 1213 1213 * max_clock_state 1214 1214 */ 1215 1215 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1216 - pool->base.display_clock->max_clks_state = 1216 + pool->base.dccg->max_clks_state = 1217 1217 static_clk_info.max_clocks_state; 1218 1218 1219 1219 {
+12 -12
drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
··· 146 146 .reg_name = mm ## block ## id ## _ ## reg_name 147 147 148 148 149 - static const struct dce_disp_clk_registers disp_clk_regs = { 149 + static const struct dccg_registers disp_clk_regs = { 150 150 CLK_COMMON_REG_LIST_DCE_BASE() 151 151 }; 152 152 153 - static const struct dce_disp_clk_shift disp_clk_shift = { 153 + static const struct dccg_shift disp_clk_shift = { 154 154 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 155 155 }; 156 156 157 - static const struct dce_disp_clk_mask disp_clk_mask = { 157 + static const struct dccg_mask disp_clk_mask = { 158 158 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 159 159 }; 160 160 ··· 668 668 if (pool->base.dmcu != NULL) 669 669 dce_dmcu_destroy(&pool->base.dmcu); 670 670 671 - if (pool->base.display_clock != NULL) 672 - dce_disp_clk_destroy(&pool->base.display_clock); 671 + if (pool->base.dccg != NULL) 672 + dce_dccg_destroy(&pool->base.dccg); 673 673 674 674 if (pool->base.irqs != NULL) { 675 675 dal_irq_service_destroy(&pool->base.irqs); ··· 1000 1000 eng_clks.data[0].clocks_in_khz; 1001 1001 clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz = 1002 1002 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1; 1003 - clk_ranges.wm_clk_ranges[0].wm_min_memg_clk_in_khz = 1003 + clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz = 1004 1004 mem_clks.data[0].clocks_in_khz; 1005 1005 clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz = 1006 1006 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1; ··· 1010 1010 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz; 1011 1011 /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */ 1012 1012 clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000; 1013 - clk_ranges.wm_clk_ranges[1].wm_min_memg_clk_in_khz = 1013 + clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz = 1014 1014 mem_clks.data[0].clocks_in_khz; 1015 1015 clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz = 1016 1016 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1; ··· 1020 1020 eng_clks.data[0].clocks_in_khz; 1021 1021 clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz = 1022 1022 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1; 1023 - clk_ranges.wm_clk_ranges[2].wm_min_memg_clk_in_khz = 1023 + clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz = 1024 1024 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz; 1025 1025 /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */ 1026 1026 clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000; ··· 1030 1030 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz; 1031 1031 /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */ 1032 1032 clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000; 1033 - clk_ranges.wm_clk_ranges[3].wm_min_memg_clk_in_khz = 1033 + clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz = 1034 1034 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz; 1035 1035 /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */ 1036 1036 clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000; ··· 1124 1124 } 1125 1125 } 1126 1126 1127 - pool->base.display_clock = dce112_disp_clk_create(ctx, 1127 + pool->base.dccg = dce112_dccg_create(ctx, 1128 1128 &disp_clk_regs, 1129 1129 &disp_clk_shift, 1130 1130 &disp_clk_mask); 1131 - if (pool->base.display_clock == NULL) { 1131 + if (pool->base.dccg == NULL) { 1132 1132 dm_error("DC: failed to create display clock!\n"); 1133 1133 BREAK_TO_DEBUGGER(); 1134 1134 goto res_create_fail; ··· 1158 1158 * max_clock_state 1159 1159 */ 1160 1160 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1161 - pool->base.display_clock->max_clks_state = 1161 + pool->base.dccg->max_clks_state = 1162 1162 static_clk_info.max_clocks_state; 1163 1163 1164 1164 {
+10 -10
drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
··· 494 494 if (pool->base.dmcu != NULL) 495 495 dce_dmcu_destroy(&pool->base.dmcu); 496 496 497 - if (pool->base.display_clock != NULL) 498 - dce_disp_clk_destroy(&pool->base.display_clock); 497 + if (pool->base.dccg != NULL) 498 + dce_dccg_destroy(&pool->base.dccg); 499 499 } 500 500 501 501 static void read_dce_straps( ··· 775 775 eng_clks.data[0].clocks_in_khz; 776 776 clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz = 777 777 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1; 778 - clk_ranges.wm_clk_ranges[0].wm_min_memg_clk_in_khz = 778 + clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz = 779 779 mem_clks.data[0].clocks_in_khz; 780 780 clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz = 781 781 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1; ··· 785 785 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz; 786 786 /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */ 787 787 clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000; 788 - clk_ranges.wm_clk_ranges[1].wm_min_memg_clk_in_khz = 788 + clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz = 789 789 mem_clks.data[0].clocks_in_khz; 790 790 clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz = 791 791 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1; ··· 795 795 eng_clks.data[0].clocks_in_khz; 796 796 clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz = 797 797 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1; 798 - clk_ranges.wm_clk_ranges[2].wm_min_memg_clk_in_khz = 798 + clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz = 799 799 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz; 800 800 /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */ 801 801 clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000; ··· 805 805 eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz; 806 806 /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */ 807 807 clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000; 808 - clk_ranges.wm_clk_ranges[3].wm_min_memg_clk_in_khz = 808 + clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz = 809 809 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz; 810 810 /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */ 811 811 clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000; ··· 894 894 } 895 895 } 896 896 897 - pool->base.display_clock = dce120_disp_clk_create(ctx); 898 - if (pool->base.display_clock == NULL) { 897 + pool->base.dccg = dce120_dccg_create(ctx); 898 + if (pool->base.dccg == NULL) { 899 899 dm_error("DC: failed to create display clock!\n"); 900 900 BREAK_TO_DEBUGGER(); 901 - goto disp_clk_create_fail; 901 + goto dccg_create_fail; 902 902 } 903 903 904 904 pool->base.dmcu = dce_dmcu_create(ctx, ··· 1011 1011 1012 1012 irqs_create_fail: 1013 1013 controller_create_fail: 1014 - disp_clk_create_fail: 1014 + dccg_create_fail: 1015 1015 clk_src_create_fail: 1016 1016 res_create_fail: 1017 1017
+14 -14
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
··· 153 153 .reg_name = mm ## block ## id ## _ ## reg_name 154 154 155 155 156 - static const struct dce_disp_clk_registers disp_clk_regs = { 156 + static const struct dccg_registers disp_clk_regs = { 157 157 CLK_COMMON_REG_LIST_DCE_BASE() 158 158 }; 159 159 160 - static const struct dce_disp_clk_shift disp_clk_shift = { 160 + static const struct dccg_shift disp_clk_shift = { 161 161 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 162 162 }; 163 163 164 - static const struct dce_disp_clk_mask disp_clk_mask = { 164 + static const struct dccg_mask disp_clk_mask = { 165 165 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 166 166 }; 167 167 ··· 683 683 } 684 684 } 685 685 686 - if (pool->base.display_clock != NULL) 687 - dce_disp_clk_destroy(&pool->base.display_clock); 686 + if (pool->base.dccg != NULL) 687 + dce_dccg_destroy(&pool->base.dccg); 688 688 689 689 if (pool->base.irqs != NULL) { 690 690 dal_irq_service_destroy(&pool->base.irqs); ··· 822 822 } 823 823 } 824 824 825 - pool->base.display_clock = dce_disp_clk_create(ctx, 825 + pool->base.dccg = dce_dccg_create(ctx, 826 826 &disp_clk_regs, 827 827 &disp_clk_shift, 828 828 &disp_clk_mask); 829 - if (pool->base.display_clock == NULL) { 829 + if (pool->base.dccg == NULL) { 830 830 dm_error("DC: failed to create display clock!\n"); 831 831 BREAK_TO_DEBUGGER(); 832 832 goto res_create_fail; ··· 852 852 goto res_create_fail; 853 853 } 854 854 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 855 - pool->base.display_clock->max_clks_state = 855 + pool->base.dccg->max_clks_state = 856 856 static_clk_info.max_clocks_state; 857 857 858 858 { ··· 1006 1006 } 1007 1007 } 1008 1008 1009 - pool->base.display_clock = dce_disp_clk_create(ctx, 1009 + pool->base.dccg = dce_dccg_create(ctx, 1010 1010 &disp_clk_regs, 1011 1011 &disp_clk_shift, 1012 1012 &disp_clk_mask); 1013 - if (pool->base.display_clock == NULL) { 1013 + if (pool->base.dccg == NULL) { 1014 1014 dm_error("DC: failed to create display clock!\n"); 1015 1015 BREAK_TO_DEBUGGER(); 1016 1016 goto res_create_fail; ··· 1037 1037 } 1038 1038 1039 1039 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1040 - pool->base.display_clock->max_clks_state = 1040 + pool->base.dccg->max_clks_state = 1041 1041 static_clk_info.max_clocks_state; 1042 1042 1043 1043 { ··· 1187 1187 } 1188 1188 } 1189 1189 1190 - pool->base.display_clock = dce_disp_clk_create(ctx, 1190 + pool->base.dccg = dce_dccg_create(ctx, 1191 1191 &disp_clk_regs, 1192 1192 &disp_clk_shift, 1193 1193 &disp_clk_mask); 1194 - if (pool->base.display_clock == NULL) { 1194 + if (pool->base.dccg == NULL) { 1195 1195 dm_error("DC: failed to create display clock!\n"); 1196 1196 BREAK_TO_DEBUGGER(); 1197 1197 goto res_create_fail; ··· 1218 1218 } 1219 1219 1220 1220 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1221 - pool->base.display_clock->max_clks_state = 1221 + pool->base.dccg->max_clks_state = 1222 1222 static_clk_info.max_clocks_state; 1223 1223 1224 1224 {
+3 -3
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
··· 145 145 pixel_width = scl_data->viewport.width; 146 146 147 147 /* Some ASICs does not support FP16 scaling, so we reject modes require this*/ 148 - if (scl_data->viewport.width != scl_data->h_active && 149 - scl_data->viewport.height != scl_data->v_active && 148 + if (scl_data->format == PIXEL_FORMAT_FP16 && 150 149 dpp->caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT && 151 - scl_data->format == PIXEL_FORMAT_FP16) 150 + scl_data->ratios.horz.value != dc_fixpt_one.value && 151 + scl_data->ratios.vert.value != dc_fixpt_one.value) 152 152 return false; 153 153 154 154 if (scl_data->viewport.width > scl_data->h_active &&
+229 -149
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
··· 190 190 } 191 191 192 192 193 + void hubbub1_wm_change_req_wa(struct hubbub *hubbub) 194 + { 195 + REG_UPDATE_SEQ(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, 196 + DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0, 1); 197 + } 198 + 193 199 void hubbub1_program_watermarks( 194 200 struct hubbub *hubbub, 195 201 struct dcn_watermark_set *watermarks, 196 - unsigned int refclk_mhz) 202 + unsigned int refclk_mhz, 203 + bool safe_to_lower) 197 204 { 198 205 uint32_t force_en = hubbub->ctx->dc->debug.disable_stutter ? 1 : 0; 199 206 /* ··· 209 202 */ 210 203 uint32_t prog_wm_value; 211 204 212 - REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, 213 - DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0); 214 205 215 206 /* Repeat for water mark set A, B, C and D. */ 216 207 /* clock state A */ 217 - prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, 218 - refclk_mhz, 0x1fffff); 219 - REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); 208 + if (safe_to_lower || watermarks->a.urgent_ns > hubbub->watermarks.a.urgent_ns) { 209 + hubbub->watermarks.a.urgent_ns = watermarks->a.urgent_ns; 210 + prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, 211 + refclk_mhz, 0x1fffff); 212 + REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); 220 213 221 - DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n" 222 - "HW register value = 0x%x\n", 223 - watermarks->a.urgent_ns, prog_wm_value); 214 + DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n" 215 + "HW register value = 0x%x\n", 216 + watermarks->a.urgent_ns, prog_wm_value); 217 + } 224 218 225 - prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns, 226 - refclk_mhz, 0x1fffff); 227 - REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value); 228 - DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n" 229 - "HW register value = 0x%x\n", 230 - watermarks->a.pte_meta_urgent_ns, prog_wm_value); 219 + if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) { 220 + hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns; 221 + prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns, 222 + refclk_mhz, 0x1fffff); 223 + REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value); 224 + DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n" 225 + "HW register value = 0x%x\n", 226 + watermarks->a.pte_meta_urgent_ns, prog_wm_value); 227 + } 231 228 232 229 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) { 233 - prog_wm_value = convert_and_clamp( 234 - watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, 235 - refclk_mhz, 0x1fffff); 236 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); 237 - DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" 238 - "HW register value = 0x%x\n", 239 - watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 230 + if (safe_to_lower || watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns 231 + > hubbub->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns) { 232 + hubbub->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns = 233 + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns; 234 + prog_wm_value = convert_and_clamp( 235 + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, 236 + refclk_mhz, 0x1fffff); 237 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); 238 + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" 239 + "HW register value = 0x%x\n", 240 + watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 241 + } 240 242 241 - 242 - prog_wm_value = convert_and_clamp( 243 - watermarks->a.cstate_pstate.cstate_exit_ns, 244 - refclk_mhz, 0x1fffff); 245 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); 246 - DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n" 247 - "HW register value = 0x%x\n", 248 - watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value); 243 + if (safe_to_lower || watermarks->a.cstate_pstate.cstate_exit_ns 244 + > hubbub->watermarks.a.cstate_pstate.cstate_exit_ns) { 245 + hubbub->watermarks.a.cstate_pstate.cstate_exit_ns = 246 + watermarks->a.cstate_pstate.cstate_exit_ns; 247 + prog_wm_value = convert_and_clamp( 248 + watermarks->a.cstate_pstate.cstate_exit_ns, 249 + refclk_mhz, 0x1fffff); 250 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); 251 + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n" 252 + "HW register value = 0x%x\n", 253 + watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value); 254 + } 249 255 } 250 256 251 - prog_wm_value = convert_and_clamp( 252 - watermarks->a.cstate_pstate.pstate_change_ns, 253 - refclk_mhz, 0x1fffff); 254 - REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); 255 - DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" 256 - "HW register value = 0x%x\n\n", 257 - watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value); 258 - 257 + if (safe_to_lower || watermarks->a.cstate_pstate.pstate_change_ns 258 + > hubbub->watermarks.a.cstate_pstate.pstate_change_ns) { 259 + hubbub->watermarks.a.cstate_pstate.pstate_change_ns = 260 + watermarks->a.cstate_pstate.pstate_change_ns; 261 + prog_wm_value = convert_and_clamp( 262 + watermarks->a.cstate_pstate.pstate_change_ns, 263 + refclk_mhz, 0x1fffff); 264 + REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); 265 + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" 266 + "HW register value = 0x%x\n\n", 267 + watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value); 268 + } 259 269 260 270 /* clock state B */ 261 - prog_wm_value = convert_and_clamp( 262 - watermarks->b.urgent_ns, refclk_mhz, 0x1fffff); 263 - REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); 264 - DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n" 265 - "HW register value = 0x%x\n", 266 - watermarks->b.urgent_ns, prog_wm_value); 271 + if (safe_to_lower || watermarks->b.urgent_ns > hubbub->watermarks.b.urgent_ns) { 272 + hubbub->watermarks.b.urgent_ns = watermarks->b.urgent_ns; 273 + prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns, 274 + refclk_mhz, 0x1fffff); 275 + REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); 267 276 277 + DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n" 278 + "HW register value = 0x%x\n", 279 + watermarks->b.urgent_ns, prog_wm_value); 280 + } 268 281 269 - prog_wm_value = convert_and_clamp( 270 - watermarks->b.pte_meta_urgent_ns, 271 - refclk_mhz, 0x1fffff); 272 - REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value); 273 - DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n" 274 - "HW register value = 0x%x\n", 275 - watermarks->b.pte_meta_urgent_ns, prog_wm_value); 276 - 282 + if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) { 283 + hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns; 284 + prog_wm_value = convert_and_clamp(watermarks->b.pte_meta_urgent_ns, 285 + refclk_mhz, 0x1fffff); 286 + REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value); 287 + DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n" 288 + "HW register value = 0x%x\n", 289 + watermarks->b.pte_meta_urgent_ns, prog_wm_value); 290 + } 277 291 278 292 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) { 279 - prog_wm_value = convert_and_clamp( 280 - watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, 281 - refclk_mhz, 0x1fffff); 282 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); 283 - DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_B calculated =%d\n" 284 - "HW register value = 0x%x\n", 285 - watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 293 + if (safe_to_lower || watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns 294 + > hubbub->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns) { 295 + hubbub->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns = 296 + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns; 297 + prog_wm_value = convert_and_clamp( 298 + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, 299 + refclk_mhz, 0x1fffff); 300 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); 301 + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_B calculated =%d\n" 302 + "HW register value = 0x%x\n", 303 + watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 304 + } 286 305 287 - 288 - prog_wm_value = convert_and_clamp( 289 - watermarks->b.cstate_pstate.cstate_exit_ns, 290 - refclk_mhz, 0x1fffff); 291 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); 292 - DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n" 293 - "HW register value = 0x%x\n", 294 - watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value); 306 + if (safe_to_lower || watermarks->b.cstate_pstate.cstate_exit_ns 307 + > hubbub->watermarks.b.cstate_pstate.cstate_exit_ns) { 308 + hubbub->watermarks.b.cstate_pstate.cstate_exit_ns = 309 + watermarks->b.cstate_pstate.cstate_exit_ns; 310 + prog_wm_value = convert_and_clamp( 311 + watermarks->b.cstate_pstate.cstate_exit_ns, 312 + refclk_mhz, 0x1fffff); 313 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); 314 + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n" 315 + "HW register value = 0x%x\n", 316 + watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value); 317 + } 295 318 } 296 319 297 - prog_wm_value = convert_and_clamp( 298 - watermarks->b.cstate_pstate.pstate_change_ns, 299 - refclk_mhz, 0x1fffff); 300 - REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); 301 - DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n\n" 302 - "HW register value = 0x%x\n", 303 - watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value); 320 + if (safe_to_lower || watermarks->b.cstate_pstate.pstate_change_ns 321 + > hubbub->watermarks.b.cstate_pstate.pstate_change_ns) { 322 + hubbub->watermarks.b.cstate_pstate.pstate_change_ns = 323 + watermarks->b.cstate_pstate.pstate_change_ns; 324 + prog_wm_value = convert_and_clamp( 325 + watermarks->b.cstate_pstate.pstate_change_ns, 326 + refclk_mhz, 0x1fffff); 327 + REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); 328 + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n" 329 + "HW register value = 0x%x\n\n", 330 + watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value); 331 + } 304 332 305 333 /* clock state C */ 306 - prog_wm_value = convert_and_clamp( 307 - watermarks->c.urgent_ns, refclk_mhz, 0x1fffff); 308 - REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); 309 - DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n" 310 - "HW register value = 0x%x\n", 311 - watermarks->c.urgent_ns, prog_wm_value); 334 + if (safe_to_lower || watermarks->c.urgent_ns > hubbub->watermarks.c.urgent_ns) { 335 + hubbub->watermarks.c.urgent_ns = watermarks->c.urgent_ns; 336 + prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns, 337 + refclk_mhz, 0x1fffff); 338 + REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); 312 339 340 + DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n" 341 + "HW register value = 0x%x\n", 342 + watermarks->c.urgent_ns, prog_wm_value); 343 + } 313 344 314 - prog_wm_value = convert_and_clamp( 315 - watermarks->c.pte_meta_urgent_ns, 316 - refclk_mhz, 0x1fffff); 317 - REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value); 318 - DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n" 319 - "HW register value = 0x%x\n", 320 - watermarks->c.pte_meta_urgent_ns, prog_wm_value); 321 - 345 + if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) { 346 + hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns; 347 + prog_wm_value = convert_and_clamp(watermarks->c.pte_meta_urgent_ns, 348 + refclk_mhz, 0x1fffff); 349 + REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value); 350 + DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n" 351 + "HW register value = 0x%x\n", 352 + watermarks->c.pte_meta_urgent_ns, prog_wm_value); 353 + } 322 354 323 355 if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) { 324 - prog_wm_value = convert_and_clamp( 325 - watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, 326 - refclk_mhz, 0x1fffff); 327 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); 328 - DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_C calculated =%d\n" 329 - "HW register value = 0x%x\n", 330 - watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 356 + if (safe_to_lower || watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns 357 + > hubbub->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns) { 358 + hubbub->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns = 359 + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns; 360 + prog_wm_value = convert_and_clamp( 361 + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, 362 + refclk_mhz, 0x1fffff); 363 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); 364 + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_C calculated =%d\n" 365 + "HW register value = 0x%x\n", 366 + watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 367 + } 331 368 332 - 333 - prog_wm_value = convert_and_clamp( 334 - watermarks->c.cstate_pstate.cstate_exit_ns, 335 - refclk_mhz, 0x1fffff); 336 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); 337 - DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n" 338 - "HW register value = 0x%x\n", 339 - watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value); 369 + if (safe_to_lower || watermarks->c.cstate_pstate.cstate_exit_ns 370 + > hubbub->watermarks.c.cstate_pstate.cstate_exit_ns) { 371 + hubbub->watermarks.c.cstate_pstate.cstate_exit_ns = 372 + watermarks->c.cstate_pstate.cstate_exit_ns; 373 + prog_wm_value = convert_and_clamp( 374 + watermarks->c.cstate_pstate.cstate_exit_ns, 375 + refclk_mhz, 0x1fffff); 376 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); 377 + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n" 378 + "HW register value = 0x%x\n", 379 + watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value); 380 + } 340 381 } 341 382 342 - prog_wm_value = convert_and_clamp( 343 - watermarks->c.cstate_pstate.pstate_change_ns, 344 - refclk_mhz, 0x1fffff); 345 - REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); 346 - DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n\n" 347 - "HW register value = 0x%x\n", 348 - watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value); 383 + if (safe_to_lower || watermarks->c.cstate_pstate.pstate_change_ns 384 + > hubbub->watermarks.c.cstate_pstate.pstate_change_ns) { 385 + hubbub->watermarks.c.cstate_pstate.pstate_change_ns = 386 + watermarks->c.cstate_pstate.pstate_change_ns; 387 + prog_wm_value = convert_and_clamp( 388 + watermarks->c.cstate_pstate.pstate_change_ns, 389 + refclk_mhz, 0x1fffff); 390 + REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); 391 + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n" 392 + "HW register value = 0x%x\n\n", 393 + watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value); 394 + } 349 395 350 396 /* clock state D */ 351 - prog_wm_value = convert_and_clamp( 352 - watermarks->d.urgent_ns, refclk_mhz, 0x1fffff); 353 - REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); 354 - DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n" 355 - "HW register value = 0x%x\n", 356 - watermarks->d.urgent_ns, prog_wm_value); 357 - 358 - prog_wm_value = convert_and_clamp( 359 - watermarks->d.pte_meta_urgent_ns, 360 - refclk_mhz, 0x1fffff); 361 - REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value); 362 - DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n" 363 - "HW register value = 0x%x\n", 364 - watermarks->d.pte_meta_urgent_ns, prog_wm_value); 365 - 366 - 367 - if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) { 368 - prog_wm_value = convert_and_clamp( 369 - watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, 397 + if (safe_to_lower || watermarks->d.urgent_ns > hubbub->watermarks.d.urgent_ns) { 398 + hubbub->watermarks.d.urgent_ns = watermarks->d.urgent_ns; 399 + prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns, 370 400 refclk_mhz, 0x1fffff); 371 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); 372 - DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_D calculated =%d\n" 373 - "HW register value = 0x%x\n", 374 - watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 401 + REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); 375 402 376 - 377 - prog_wm_value = convert_and_clamp( 378 - watermarks->d.cstate_pstate.cstate_exit_ns, 379 - refclk_mhz, 0x1fffff); 380 - REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); 381 - DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n" 403 + DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n" 382 404 "HW register value = 0x%x\n", 383 - watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value); 405 + watermarks->d.urgent_ns, prog_wm_value); 384 406 } 385 407 408 + if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) { 409 + hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns; 410 + prog_wm_value = convert_and_clamp(watermarks->d.pte_meta_urgent_ns, 411 + refclk_mhz, 0x1fffff); 412 + REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value); 413 + DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n" 414 + "HW register value = 0x%x\n", 415 + watermarks->d.pte_meta_urgent_ns, prog_wm_value); 416 + } 386 417 387 - prog_wm_value = convert_and_clamp( 388 - watermarks->d.cstate_pstate.pstate_change_ns, 389 - refclk_mhz, 0x1fffff); 390 - REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); 391 - DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" 392 - "HW register value = 0x%x\n\n", 393 - watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value); 418 + if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) { 419 + if (safe_to_lower || watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns 420 + > hubbub->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns) { 421 + hubbub->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns = 422 + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns; 423 + prog_wm_value = convert_and_clamp( 424 + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, 425 + refclk_mhz, 0x1fffff); 426 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); 427 + DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_D calculated =%d\n" 428 + "HW register value = 0x%x\n", 429 + watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); 430 + } 394 431 395 - REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, 396 - DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1); 432 + if (safe_to_lower || watermarks->d.cstate_pstate.cstate_exit_ns 433 + > hubbub->watermarks.d.cstate_pstate.cstate_exit_ns) { 434 + hubbub->watermarks.d.cstate_pstate.cstate_exit_ns = 435 + watermarks->d.cstate_pstate.cstate_exit_ns; 436 + prog_wm_value = convert_and_clamp( 437 + watermarks->d.cstate_pstate.cstate_exit_ns, 438 + refclk_mhz, 0x1fffff); 439 + REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); 440 + DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n" 441 + "HW register value = 0x%x\n", 442 + watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value); 443 + } 444 + } 445 + 446 + if (safe_to_lower || watermarks->d.cstate_pstate.pstate_change_ns 447 + > hubbub->watermarks.d.cstate_pstate.pstate_change_ns) { 448 + hubbub->watermarks.d.cstate_pstate.pstate_change_ns = 449 + watermarks->d.cstate_pstate.pstate_change_ns; 450 + prog_wm_value = convert_and_clamp( 451 + watermarks->d.cstate_pstate.pstate_change_ns, 452 + refclk_mhz, 0x1fffff); 453 + REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); 454 + DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" 455 + "HW register value = 0x%x\n\n", 456 + watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value); 457 + } 397 458 398 459 REG_UPDATE(DCHUBBUB_ARB_SAT_LEVEL, 399 460 DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz); ··· 483 408 struct hubbub *hubbub, 484 409 struct dchub_init_data *dh_data) 485 410 { 411 + if (REG(DCHUBBUB_SDPIF_FB_TOP) == 0) { 412 + ASSERT(false); 413 + /*should not come here*/ 414 + return; 415 + } 486 416 /* TODO: port code from dal2 */ 487 417 switch (dh_data->fb_mode) { 488 418 case FRAME_BUFFER_MODE_ZFB_ONLY:
+5 -1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
··· 185 185 const struct dcn_hubbub_shift *shifts; 186 186 const struct dcn_hubbub_mask *masks; 187 187 unsigned int debug_test_index_pstate; 188 + struct dcn_watermark_set watermarks; 188 189 }; 189 190 190 191 void hubbub1_update_dchub( ··· 195 194 bool hubbub1_verify_allow_pstate_change_high( 196 195 struct hubbub *hubbub); 197 196 197 + void hubbub1_wm_change_req_wa(struct hubbub *hubbub); 198 + 198 199 void hubbub1_program_watermarks( 199 200 struct hubbub *hubbub, 200 201 struct dcn_watermark_set *watermarks, 201 - unsigned int refclk_mhz); 202 + unsigned int refclk_mhz, 203 + bool safe_to_lower); 202 204 203 205 void hubbub1_toggle_watermark_change_req( 204 206 struct hubbub *hubbub);
+1 -1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
··· 166 166 /* Program data and meta surface pitch (calculation from addrlib) 167 167 * 444 or 420 luma 168 168 */ 169 - if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) { 169 + if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN && format < SURFACE_PIXEL_FORMAT_SUBSAMPLE_END) { 170 170 ASSERT(plane_size->video.chroma_pitch != 0); 171 171 /* Chroma pitch zero can cause system hang! */ 172 172
+61 -260
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
··· 337 337 338 338 DTN_INFO("\nCALCULATED Clocks: dcfclk_khz:%d dcfclk_deep_sleep_khz:%d dispclk_khz:%d\n" 339 339 "dppclk_khz:%d max_supported_dppclk_khz:%d fclk_khz:%d socclk_khz:%d\n\n", 340 - dc->current_state->bw.dcn.calc_clk.dcfclk_khz, 341 - dc->current_state->bw.dcn.calc_clk.dcfclk_deep_sleep_khz, 342 - dc->current_state->bw.dcn.calc_clk.dispclk_khz, 343 - dc->current_state->bw.dcn.calc_clk.dppclk_khz, 344 - dc->current_state->bw.dcn.calc_clk.max_supported_dppclk_khz, 345 - dc->current_state->bw.dcn.calc_clk.fclk_khz, 346 - dc->current_state->bw.dcn.calc_clk.socclk_khz); 340 + dc->current_state->bw.dcn.clk.dcfclk_khz, 341 + dc->current_state->bw.dcn.clk.dcfclk_deep_sleep_khz, 342 + dc->current_state->bw.dcn.clk.dispclk_khz, 343 + dc->current_state->bw.dcn.clk.dppclk_khz, 344 + dc->current_state->bw.dcn.clk.max_supported_dppclk_khz, 345 + dc->current_state->bw.dcn.clk.fclk_khz, 346 + dc->current_state->bw.dcn.clk.socclk_khz); 347 347 348 348 log_mpc_crc(dc); 349 349 ··· 415 415 416 416 if (hws->ctx->dc->debug.disable_dpp_power_gate) 417 417 return; 418 + if (REG(DOMAIN1_PG_CONFIG) == 0) 419 + return; 418 420 419 421 switch (dpp_inst) { 420 422 case 0: /* DPP0 */ ··· 466 464 uint32_t pwr_status = power_on ? 0 : 2; 467 465 468 466 if (hws->ctx->dc->debug.disable_hubp_power_gate) 467 + return; 468 + if (REG(DOMAIN0_PG_CONFIG) == 0) 469 469 return; 470 470 471 471 switch (hubp_inst) { ··· 869 865 return; 870 866 871 867 mpc->funcs->remove_mpcc(mpc, mpc_tree_params, mpcc_to_remove); 872 - opp->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = true; 868 + if (opp != NULL) 869 + opp->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = true; 873 870 874 871 dc->optimized_required = true; 875 872 ··· 1015 1010 /* Reset all MPCC muxes */ 1016 1011 dc->res_pool->mpc->funcs->mpc_init(dc->res_pool->mpc); 1017 1012 1018 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 1013 + for (i = 0; i < dc->res_pool->timing_generator_count; i++) { 1019 1014 struct timing_generator *tg = dc->res_pool->timing_generators[i]; 1020 1015 struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; 1021 1016 struct hubp *hubp = dc->res_pool->hubps[i]; ··· 1348 1343 1349 1344 DC_SYNC_INFO("Setting up\n"); 1350 1345 for (i = 0; i < group_size; i++) 1351 - grouped_pipes[i]->stream_res.tg->funcs->enable_crtc_reset( 1352 - grouped_pipes[i]->stream_res.tg, 1353 - grouped_pipes[i]->stream->triggered_crtc_reset.event_source->status.primary_otg_inst, 1354 - &grouped_pipes[i]->stream->triggered_crtc_reset); 1346 + if (grouped_pipes[i]->stream_res.tg->funcs->enable_crtc_reset) 1347 + grouped_pipes[i]->stream_res.tg->funcs->enable_crtc_reset( 1348 + grouped_pipes[i]->stream_res.tg, 1349 + grouped_pipes[i]->stream->triggered_crtc_reset.event_source->status.primary_otg_inst, 1350 + &grouped_pipes[i]->stream->triggered_crtc_reset); 1355 1351 1356 1352 DC_SYNC_INFO("Waiting for trigger\n"); 1357 1353 ··· 1958 1952 * divided by 2 1959 1953 */ 1960 1954 if (plane_state->update_flags.bits.full_update) { 1961 - bool should_divided_by_2 = context->bw.dcn.calc_clk.dppclk_khz <= 1962 - context->bw.dcn.cur_clk.dispclk_khz / 2; 1955 + bool should_divided_by_2 = context->bw.dcn.clk.dppclk_khz <= 1956 + dc->res_pool->dccg->clks.dispclk_khz / 2; 1963 1957 1964 1958 dpp->funcs->dpp_dppclk_control( 1965 1959 dpp, 1966 1960 should_divided_by_2, 1967 1961 true); 1968 1962 1969 - dc->current_state->bw.dcn.cur_clk.dppclk_khz = 1970 - should_divided_by_2 ? 1971 - context->bw.dcn.cur_clk.dispclk_khz / 2 : 1972 - context->bw.dcn.cur_clk.dispclk_khz; 1963 + dc->res_pool->dccg->clks.dppclk_khz = should_divided_by_2 ? 1964 + dc->res_pool->dccg->clks.dispclk_khz / 2 : 1965 + dc->res_pool->dccg->clks.dispclk_khz; 1973 1966 } 1974 1967 1975 1968 /* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG ··· 2158 2153 { 2159 2154 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; 2160 2155 2161 - pp_display_cfg->min_engine_clock_khz = context->bw.dcn.cur_clk.dcfclk_khz; 2162 - pp_display_cfg->min_memory_clock_khz = context->bw.dcn.cur_clk.fclk_khz; 2163 - pp_display_cfg->min_engine_clock_deep_sleep_khz = context->bw.dcn.cur_clk.dcfclk_deep_sleep_khz; 2164 - pp_display_cfg->min_dcfc_deep_sleep_clock_khz = context->bw.dcn.cur_clk.dcfclk_deep_sleep_khz; 2165 - pp_display_cfg->min_dcfclock_khz = context->bw.dcn.cur_clk.dcfclk_khz; 2166 - pp_display_cfg->disp_clk_khz = context->bw.dcn.cur_clk.dispclk_khz; 2156 + pp_display_cfg->min_engine_clock_khz = dc->res_pool->dccg->clks.dcfclk_khz; 2157 + pp_display_cfg->min_memory_clock_khz = dc->res_pool->dccg->clks.fclk_khz; 2158 + pp_display_cfg->min_engine_clock_deep_sleep_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz; 2159 + pp_display_cfg->min_dcfc_deep_sleep_clock_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz; 2160 + pp_display_cfg->min_dcfclock_khz = dc->res_pool->dccg->clks.dcfclk_khz; 2161 + pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz; 2167 2162 dce110_fill_display_configs(context, pp_display_cfg); 2168 2163 2169 2164 if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof( ··· 2225 2220 int i; 2226 2221 struct timing_generator *tg; 2227 2222 bool removed_pipe[4] = { false }; 2228 - unsigned int ref_clk_mhz = dc->res_pool->ref_clock_inKhz/1000; 2229 - bool program_water_mark = false; 2230 2223 struct pipe_ctx *top_pipe_to_program = 2231 2224 find_top_pipe_for_stream(dc, context, stream); 2232 2225 DC_LOGGER_INIT(dc->ctx->logger); ··· 2272 2269 hwss1_plane_atomic_disconnect(dc, old_pipe_ctx); 2273 2270 removed_pipe[i] = true; 2274 2271 2275 - DC_LOG_DC( 2276 - "Reset mpcc for pipe %d\n", 2272 + DC_LOG_DC("Reset mpcc for pipe %d\n", 2277 2273 old_pipe_ctx->pipe_idx); 2278 2274 } 2279 2275 } ··· 2285 2283 if (num_planes == 0) 2286 2284 false_optc_underflow_wa(dc, stream, tg); 2287 2285 2288 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 2289 - struct pipe_ctx *old_pipe_ctx = 2290 - &dc->current_state->res_ctx.pipe_ctx[i]; 2291 - struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; 2292 - 2293 - if (pipe_ctx->stream == stream && 2294 - pipe_ctx->plane_state && 2295 - pipe_ctx->plane_state->update_flags.bits.full_update) 2296 - program_water_mark = true; 2297 - 2286 + for (i = 0; i < dc->res_pool->pipe_count; i++) 2298 2287 if (removed_pipe[i]) 2299 - dcn10_disable_plane(dc, old_pipe_ctx); 2300 - } 2288 + dcn10_disable_plane(dc, &dc->current_state->res_ctx.pipe_ctx[i]); 2301 2289 2302 - if (program_water_mark) { 2303 - if (dc->debug.sanity_checks) { 2304 - /* pstate stuck check after watermark update */ 2305 - dcn10_verify_allow_pstate_change_high(dc); 2306 - } 2307 - 2308 - /* watermark is for all pipes */ 2309 - hubbub1_program_watermarks(dc->res_pool->hubbub, 2310 - &context->bw.dcn.watermarks, ref_clk_mhz); 2311 - 2312 - if (dc->debug.sanity_checks) { 2313 - /* pstate stuck check after watermark update */ 2314 - dcn10_verify_allow_pstate_change_high(dc); 2315 - } 2316 - } 2317 - /* DC_LOG_BANDWIDTH_CALCS(dc->ctx->logger, 2318 - "\n============== Watermark parameters ==============\n" 2319 - "a.urgent_ns: %d \n" 2320 - "a.cstate_enter_plus_exit: %d \n" 2321 - "a.cstate_exit: %d \n" 2322 - "a.pstate_change: %d \n" 2323 - "a.pte_meta_urgent: %d \n" 2324 - "b.urgent_ns: %d \n" 2325 - "b.cstate_enter_plus_exit: %d \n" 2326 - "b.cstate_exit: %d \n" 2327 - "b.pstate_change: %d \n" 2328 - "b.pte_meta_urgent: %d \n", 2329 - context->bw.dcn.watermarks.a.urgent_ns, 2330 - context->bw.dcn.watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns, 2331 - context->bw.dcn.watermarks.a.cstate_pstate.cstate_exit_ns, 2332 - context->bw.dcn.watermarks.a.cstate_pstate.pstate_change_ns, 2333 - context->bw.dcn.watermarks.a.pte_meta_urgent_ns, 2334 - context->bw.dcn.watermarks.b.urgent_ns, 2335 - context->bw.dcn.watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns, 2336 - context->bw.dcn.watermarks.b.cstate_pstate.cstate_exit_ns, 2337 - context->bw.dcn.watermarks.b.cstate_pstate.pstate_change_ns, 2338 - context->bw.dcn.watermarks.b.pte_meta_urgent_ns 2339 - ); 2340 - DC_LOG_BANDWIDTH_CALCS(dc->ctx->logger, 2341 - "\nc.urgent_ns: %d \n" 2342 - "c.cstate_enter_plus_exit: %d \n" 2343 - "c.cstate_exit: %d \n" 2344 - "c.pstate_change: %d \n" 2345 - "c.pte_meta_urgent: %d \n" 2346 - "d.urgent_ns: %d \n" 2347 - "d.cstate_enter_plus_exit: %d \n" 2348 - "d.cstate_exit: %d \n" 2349 - "d.pstate_change: %d \n" 2350 - "d.pte_meta_urgent: %d \n" 2351 - "========================================================\n", 2352 - context->bw.dcn.watermarks.c.urgent_ns, 2353 - context->bw.dcn.watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns, 2354 - context->bw.dcn.watermarks.c.cstate_pstate.cstate_exit_ns, 2355 - context->bw.dcn.watermarks.c.cstate_pstate.pstate_change_ns, 2356 - context->bw.dcn.watermarks.c.pte_meta_urgent_ns, 2357 - context->bw.dcn.watermarks.d.urgent_ns, 2358 - context->bw.dcn.watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns, 2359 - context->bw.dcn.watermarks.d.cstate_pstate.cstate_exit_ns, 2360 - context->bw.dcn.watermarks.d.cstate_pstate.pstate_change_ns, 2361 - context->bw.dcn.watermarks.d.pte_meta_urgent_ns 2362 - ); 2363 - */ 2364 - } 2365 - 2366 - static inline bool should_set_clock(bool decrease_allowed, int calc_clk, int cur_clk) 2367 - { 2368 - return ((decrease_allowed && calc_clk < cur_clk) || calc_clk > cur_clk); 2369 - } 2370 - 2371 - static int determine_dppclk_threshold(struct dc *dc, struct dc_state *context) 2372 - { 2373 - bool request_dpp_div = context->bw.dcn.calc_clk.dispclk_khz > 2374 - context->bw.dcn.calc_clk.dppclk_khz; 2375 - bool dispclk_increase = context->bw.dcn.calc_clk.dispclk_khz > 2376 - context->bw.dcn.cur_clk.dispclk_khz; 2377 - int disp_clk_threshold = context->bw.dcn.calc_clk.max_supported_dppclk_khz; 2378 - bool cur_dpp_div = context->bw.dcn.cur_clk.dispclk_khz > 2379 - context->bw.dcn.cur_clk.dppclk_khz; 2380 - 2381 - /* increase clock, looking for div is 0 for current, request div is 1*/ 2382 - if (dispclk_increase) { 2383 - /* already divided by 2, no need to reach target clk with 2 steps*/ 2384 - if (cur_dpp_div) 2385 - return context->bw.dcn.calc_clk.dispclk_khz; 2386 - 2387 - /* request disp clk is lower than maximum supported dpp clk, 2388 - * no need to reach target clk with two steps. 2389 - */ 2390 - if (context->bw.dcn.calc_clk.dispclk_khz <= disp_clk_threshold) 2391 - return context->bw.dcn.calc_clk.dispclk_khz; 2392 - 2393 - /* target dpp clk not request divided by 2, still within threshold */ 2394 - if (!request_dpp_div) 2395 - return context->bw.dcn.calc_clk.dispclk_khz; 2396 - 2397 - } else { 2398 - /* decrease clock, looking for current dppclk divided by 2, 2399 - * request dppclk not divided by 2. 2400 - */ 2401 - 2402 - /* current dpp clk not divided by 2, no need to ramp*/ 2403 - if (!cur_dpp_div) 2404 - return context->bw.dcn.calc_clk.dispclk_khz; 2405 - 2406 - /* current disp clk is lower than current maximum dpp clk, 2407 - * no need to ramp 2408 - */ 2409 - if (context->bw.dcn.cur_clk.dispclk_khz <= disp_clk_threshold) 2410 - return context->bw.dcn.calc_clk.dispclk_khz; 2411 - 2412 - /* request dpp clk need to be divided by 2 */ 2413 - if (request_dpp_div) 2414 - return context->bw.dcn.calc_clk.dispclk_khz; 2415 - } 2416 - 2417 - return disp_clk_threshold; 2418 - } 2419 - 2420 - static void ramp_up_dispclk_with_dpp(struct dc *dc, struct dc_state *context) 2421 - { 2422 - int i; 2423 - bool request_dpp_div = context->bw.dcn.calc_clk.dispclk_khz > 2424 - context->bw.dcn.calc_clk.dppclk_khz; 2425 - 2426 - int dispclk_to_dpp_threshold = determine_dppclk_threshold(dc, context); 2427 - 2428 - /* set disp clk to dpp clk threshold */ 2429 - dc->res_pool->display_clock->funcs->set_clock( 2430 - dc->res_pool->display_clock, 2431 - dispclk_to_dpp_threshold); 2432 - 2433 - /* update request dpp clk division option */ 2434 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 2435 - struct pipe_ctx *pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; 2436 - 2437 - if (!pipe_ctx->plane_state) 2438 - continue; 2439 - 2440 - pipe_ctx->plane_res.dpp->funcs->dpp_dppclk_control( 2441 - pipe_ctx->plane_res.dpp, 2442 - request_dpp_div, 2443 - true); 2444 - } 2445 - 2446 - /* If target clk not same as dppclk threshold, set to target clock */ 2447 - if (dispclk_to_dpp_threshold != context->bw.dcn.calc_clk.dispclk_khz) { 2448 - dc->res_pool->display_clock->funcs->set_clock( 2449 - dc->res_pool->display_clock, 2450 - context->bw.dcn.calc_clk.dispclk_khz); 2451 - } 2452 - 2453 - context->bw.dcn.cur_clk.dispclk_khz = 2454 - context->bw.dcn.calc_clk.dispclk_khz; 2455 - context->bw.dcn.cur_clk.dppclk_khz = 2456 - context->bw.dcn.calc_clk.dppclk_khz; 2457 - context->bw.dcn.cur_clk.max_supported_dppclk_khz = 2458 - context->bw.dcn.calc_clk.max_supported_dppclk_khz; 2290 + if (dc->hwseq->wa.DEGVIDCN10_254) 2291 + hubbub1_wm_change_req_wa(dc->res_pool->hubbub); 2459 2292 } 2460 2293 2461 2294 static void dcn10_set_bandwidth( 2462 2295 struct dc *dc, 2463 2296 struct dc_state *context, 2464 - bool decrease_allowed) 2297 + bool safe_to_lower) 2465 2298 { 2466 - struct pp_smu_display_requirement_rv *smu_req_cur = 2467 - &dc->res_pool->pp_smu_req; 2468 - struct pp_smu_display_requirement_rv smu_req = *smu_req_cur; 2469 - struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu; 2470 - 2471 - if (dc->debug.sanity_checks) { 2299 + if (dc->debug.sanity_checks) 2472 2300 dcn10_verify_allow_pstate_change_high(dc); 2301 + 2302 + if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { 2303 + if (context->stream_count == 0) 2304 + context->bw.dcn.clk.phyclk_khz = 0; 2305 + 2306 + dc->res_pool->dccg->funcs->update_clocks( 2307 + dc->res_pool->dccg, 2308 + &context->bw.dcn.clk, 2309 + safe_to_lower); 2310 + 2311 + dcn10_pplib_apply_display_requirements(dc, context); 2473 2312 } 2474 2313 2475 - if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) 2476 - return; 2314 + hubbub1_program_watermarks(dc->res_pool->hubbub, 2315 + &context->bw.dcn.watermarks, 2316 + dc->res_pool->ref_clock_inKhz / 1000, 2317 + true); 2477 2318 2478 - if (should_set_clock( 2479 - decrease_allowed, 2480 - context->bw.dcn.calc_clk.dcfclk_khz, 2481 - dc->current_state->bw.dcn.cur_clk.dcfclk_khz)) { 2482 - context->bw.dcn.cur_clk.dcfclk_khz = 2483 - context->bw.dcn.calc_clk.dcfclk_khz; 2484 - smu_req.hard_min_dcefclk_khz = 2485 - context->bw.dcn.calc_clk.dcfclk_khz; 2486 - } 2487 - 2488 - if (should_set_clock( 2489 - decrease_allowed, 2490 - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz, 2491 - dc->current_state->bw.dcn.cur_clk.dcfclk_deep_sleep_khz)) { 2492 - context->bw.dcn.cur_clk.dcfclk_deep_sleep_khz = 2493 - context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz; 2494 - } 2495 - 2496 - if (should_set_clock( 2497 - decrease_allowed, 2498 - context->bw.dcn.calc_clk.fclk_khz, 2499 - dc->current_state->bw.dcn.cur_clk.fclk_khz)) { 2500 - context->bw.dcn.cur_clk.fclk_khz = 2501 - context->bw.dcn.calc_clk.fclk_khz; 2502 - smu_req.hard_min_fclk_khz = context->bw.dcn.calc_clk.fclk_khz; 2503 - } 2504 - 2505 - smu_req.display_count = context->stream_count; 2506 - 2507 - if (pp_smu->set_display_requirement) 2508 - pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req); 2509 - 2510 - *smu_req_cur = smu_req; 2511 - 2512 - /* make sure dcf clk is before dpp clk to 2513 - * make sure we have enough voltage to run dpp clk 2514 - */ 2515 - if (should_set_clock( 2516 - decrease_allowed, 2517 - context->bw.dcn.calc_clk.dispclk_khz, 2518 - dc->current_state->bw.dcn.cur_clk.dispclk_khz)) { 2519 - 2520 - ramp_up_dispclk_with_dpp(dc, context); 2521 - } 2522 - 2523 - dcn10_pplib_apply_display_requirements(dc, context); 2524 - 2525 - if (dc->debug.sanity_checks) { 2319 + if (dc->debug.sanity_checks) 2526 2320 dcn10_verify_allow_pstate_change_high(dc); 2527 - } 2528 - 2529 - /* need to fix this function. not doing the right thing here */ 2530 2321 } 2531 2322 2532 2323 static void set_drr(struct pipe_ctx **pipe_ctx, ··· 2502 2707 2503 2708 static void dcn10_update_dchub(struct dce_hwseq *hws, struct dchub_init_data *dh_data) 2504 2709 { 2505 - if (hws->ctx->dc->res_pool->hubbub != NULL) 2506 - hubbub1_update_dchub(hws->ctx->dc->res_pool->hubbub, dh_data); 2710 + if (hws->ctx->dc->res_pool->hubbub != NULL) { 2711 + struct hubp *hubp = hws->ctx->dc->res_pool->hubps[0]; 2712 + 2713 + if (hubp->funcs->hubp_update_dchub) 2714 + hubp->funcs->hubp_update_dchub(hubp, dh_data); 2715 + else 2716 + hubbub1_update_dchub(hws->ctx->dc->res_pool->hubbub, dh_data); 2717 + } 2507 2718 } 2508 2719 2509 2720 static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
+69 -7
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
··· 65 65 #include "dce/dce_abm.h" 66 66 #include "dce/dce_dmcu.h" 67 67 68 + const struct _vcs_dpi_ip_params_st dcn1_0_ip = { 69 + .rob_buffer_size_kbytes = 64, 70 + .det_buffer_size_kbytes = 164, 71 + .dpte_buffer_size_in_pte_reqs = 42, 72 + .dpp_output_buffer_pixels = 2560, 73 + .opp_output_buffer_lines = 1, 74 + .pixel_chunk_size_kbytes = 8, 75 + .pte_enable = 1, 76 + .pte_chunk_size_kbytes = 2, 77 + .meta_chunk_size_kbytes = 2, 78 + .writeback_chunk_size_kbytes = 2, 79 + .line_buffer_size_bits = 589824, 80 + .max_line_buffer_lines = 12, 81 + .IsLineBufferBppFixed = 0, 82 + .LineBufferFixedBpp = -1, 83 + .writeback_luma_buffer_size_kbytes = 12, 84 + .writeback_chroma_buffer_size_kbytes = 8, 85 + .max_num_dpp = 4, 86 + .max_num_wb = 2, 87 + .max_dchub_pscl_bw_pix_per_clk = 4, 88 + .max_pscl_lb_bw_pix_per_clk = 2, 89 + .max_lb_vscl_bw_pix_per_clk = 4, 90 + .max_vscl_hscl_bw_pix_per_clk = 4, 91 + .max_hscl_ratio = 4, 92 + .max_vscl_ratio = 4, 93 + .hscl_mults = 4, 94 + .vscl_mults = 4, 95 + .max_hscl_taps = 8, 96 + .max_vscl_taps = 8, 97 + .dispclk_ramp_margin_percent = 1, 98 + .underscan_factor = 1.10, 99 + .min_vblank_lines = 14, 100 + .dppclk_delay_subtotal = 90, 101 + .dispclk_delay_subtotal = 42, 102 + .dcfclk_cstate_latency = 10, 103 + .max_inter_dcn_tile_repeaters = 8, 104 + .can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one = 0, 105 + .bug_forcing_LC_req_same_size_fixed = 0, 106 + }; 107 + 108 + const struct _vcs_dpi_soc_bounding_box_st dcn1_0_soc = { 109 + .sr_exit_time_us = 9.0, 110 + .sr_enter_plus_exit_time_us = 11.0, 111 + .urgent_latency_us = 4.0, 112 + .writeback_latency_us = 12.0, 113 + .ideal_dram_bw_after_urgent_percent = 80.0, 114 + .max_request_size_bytes = 256, 115 + .downspread_percent = 0.5, 116 + .dram_page_open_time_ns = 50.0, 117 + .dram_rw_turnaround_time_ns = 17.5, 118 + .dram_return_buffer_per_channel_bytes = 8192, 119 + .round_trip_ping_latency_dcfclk_cycles = 128, 120 + .urgent_out_of_order_return_per_channel_bytes = 256, 121 + .channel_interleave_bytes = 256, 122 + .num_banks = 8, 123 + .num_chans = 2, 124 + .vmm_page_size_bytes = 4096, 125 + .dram_clock_change_latency_us = 17.0, 126 + .writeback_dram_clock_change_latency_us = 23.0, 127 + .return_bus_width_bytes = 64, 128 + }; 129 + 68 130 #ifndef mmDP0_DP_DPHY_INTERNAL_CTRL 69 131 #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x210f 70 132 #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX 2 ··· 499 437 */ 500 438 .min_disp_clk_khz = 100000, 501 439 502 - .disable_pplib_clock_request = true, 440 + .disable_pplib_clock_request = false, 503 441 .disable_pplib_wm_range = false, 504 442 .pplib_wm_report_mode = WM_REPORT_DEFAULT, 505 443 .pipe_split_policy = MPC_SPLIT_AVOID_MULT_DISP, ··· 743 681 hws->masks = &hwseq_mask; 744 682 hws->wa.DEGVIDCN10_253 = true; 745 683 hws->wa.false_optc_underflow = true; 684 + hws->wa.DEGVIDCN10_254 = true; 746 685 } 747 686 return hws; 748 687 } ··· 854 791 if (pool->base.dmcu != NULL) 855 792 dce_dmcu_destroy(&pool->base.dmcu); 856 793 857 - if (pool->base.display_clock != NULL) 858 - dce_disp_clk_destroy(&pool->base.display_clock); 794 + if (pool->base.dccg != NULL) 795 + dce_dccg_destroy(&pool->base.dccg); 859 796 860 797 kfree(pool->base.pp_smu); 861 798 } ··· 1068 1005 1069 1006 ctx->dc_bios->regs = &bios_regs; 1070 1007 1071 - pool->base.res_cap = &res_cap; 1072 - 1008 + pool->base.res_cap = &res_cap; 1073 1009 pool->base.funcs = &dcn10_res_pool_funcs; 1074 1010 1075 1011 /* ··· 1134 1072 } 1135 1073 } 1136 1074 1137 - pool->base.display_clock = dce120_disp_clk_create(ctx); 1138 - if (pool->base.display_clock == NULL) { 1075 + pool->base.dccg = dcn1_dccg_create(ctx); 1076 + if (pool->base.dccg == NULL) { 1139 1077 dm_error("DC: failed to create display clock!\n"); 1140 1078 BREAK_TO_DEBUGGER(); 1141 1079 goto fail;
+3 -3
drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
··· 40 40 WM_B, 41 41 WM_C, 42 42 WM_D, 43 - WM_COUNT, 43 + WM_SET_COUNT, 44 44 }; 45 45 46 46 struct pp_smu_wm_set_range { ··· 53 53 54 54 struct pp_smu_wm_range_sets { 55 55 uint32_t num_reader_wm_sets; 56 - struct pp_smu_wm_set_range reader_wm_sets[WM_COUNT]; 56 + struct pp_smu_wm_set_range reader_wm_sets[WM_SET_COUNT]; 57 57 58 58 uint32_t num_writer_wm_sets; 59 - struct pp_smu_wm_set_range writer_wm_sets[WM_COUNT]; 59 + struct pp_smu_wm_set_range writer_wm_sets[WM_SET_COUNT]; 60 60 }; 61 61 62 62 struct pp_smu_display_requirement_rv {
+3 -3
drivers/gpu/drm/amd/display/dc/dm_services_types.h
··· 137 137 enum dm_pp_wm_set_id wm_set_id; 138 138 uint32_t wm_min_eng_clk_in_khz; 139 139 uint32_t wm_max_eng_clk_in_khz; 140 - uint32_t wm_min_memg_clk_in_khz; 140 + uint32_t wm_min_mem_clk_in_khz; 141 141 uint32_t wm_max_mem_clk_in_khz; 142 142 }; 143 143 ··· 150 150 enum dm_pp_wm_set_id wm_set_id; 151 151 uint32_t wm_min_dcfclk_clk_in_khz; 152 152 uint32_t wm_max_dcfclk_clk_in_khz; 153 - uint32_t wm_min_memg_clk_in_khz; 153 + uint32_t wm_min_mem_clk_in_khz; 154 154 uint32_t wm_max_mem_clk_in_khz; 155 155 }; 156 156 ··· 158 158 enum dm_pp_wm_set_id wm_set_id; 159 159 uint32_t wm_min_socclk_clk_in_khz; 160 160 uint32_t wm_max_socclk_clk_in_khz; 161 - uint32_t wm_min_memg_clk_in_khz; 161 + uint32_t wm_min_mem_clk_in_khz; 162 162 uint32_t wm_max_mem_clk_in_khz; 163 163 }; 164 164
+1 -2
drivers/gpu/drm/amd/display/dc/dml/Makefile
··· 36 36 CFLAGS_display_pipe_clocks.o := $(dml_ccflags) 37 37 CFLAGS_dml1_display_rq_dlg_calc.o := $(dml_ccflags) 38 38 CFLAGS_display_rq_dlg_helpers.o := $(dml_ccflags) 39 - CFLAGS_soc_bounding_box.o := $(dml_ccflags) 40 39 CFLAGS_dml_common_defs.o := $(dml_ccflags) 41 40 42 41 DML = display_mode_lib.o display_rq_dlg_helpers.o dml1_display_rq_dlg_calc.o \ 43 - soc_bounding_box.o dml_common_defs.o 42 + dml_common_defs.o 44 43 45 44 AMD_DAL_DML = $(addprefix $(AMDDALPATH)/dc/dml/,$(DML)) 46 45
+2 -61
drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c
··· 26 26 #include "display_mode_lib.h" 27 27 #include "dc_features.h" 28 28 29 - static const struct _vcs_dpi_ip_params_st dcn1_0_ip = { 30 - .rob_buffer_size_kbytes = 64, 31 - .det_buffer_size_kbytes = 164, 32 - .dpte_buffer_size_in_pte_reqs = 42, 33 - .dpp_output_buffer_pixels = 2560, 34 - .opp_output_buffer_lines = 1, 35 - .pixel_chunk_size_kbytes = 8, 36 - .pte_enable = 1, 37 - .pte_chunk_size_kbytes = 2, 38 - .meta_chunk_size_kbytes = 2, 39 - .writeback_chunk_size_kbytes = 2, 40 - .line_buffer_size_bits = 589824, 41 - .max_line_buffer_lines = 12, 42 - .IsLineBufferBppFixed = 0, 43 - .LineBufferFixedBpp = -1, 44 - .writeback_luma_buffer_size_kbytes = 12, 45 - .writeback_chroma_buffer_size_kbytes = 8, 46 - .max_num_dpp = 4, 47 - .max_num_wb = 2, 48 - .max_dchub_pscl_bw_pix_per_clk = 4, 49 - .max_pscl_lb_bw_pix_per_clk = 2, 50 - .max_lb_vscl_bw_pix_per_clk = 4, 51 - .max_vscl_hscl_bw_pix_per_clk = 4, 52 - .max_hscl_ratio = 4, 53 - .max_vscl_ratio = 4, 54 - .hscl_mults = 4, 55 - .vscl_mults = 4, 56 - .max_hscl_taps = 8, 57 - .max_vscl_taps = 8, 58 - .dispclk_ramp_margin_percent = 1, 59 - .underscan_factor = 1.10, 60 - .min_vblank_lines = 14, 61 - .dppclk_delay_subtotal = 90, 62 - .dispclk_delay_subtotal = 42, 63 - .dcfclk_cstate_latency = 10, 64 - .max_inter_dcn_tile_repeaters = 8, 65 - .can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one = 0, 66 - .bug_forcing_LC_req_same_size_fixed = 0, 67 - }; 68 - 69 - static const struct _vcs_dpi_soc_bounding_box_st dcn1_0_soc = { 70 - .sr_exit_time_us = 9.0, 71 - .sr_enter_plus_exit_time_us = 11.0, 72 - .urgent_latency_us = 4.0, 73 - .writeback_latency_us = 12.0, 74 - .ideal_dram_bw_after_urgent_percent = 80.0, 75 - .max_request_size_bytes = 256, 76 - .downspread_percent = 0.5, 77 - .dram_page_open_time_ns = 50.0, 78 - .dram_rw_turnaround_time_ns = 17.5, 79 - .dram_return_buffer_per_channel_bytes = 8192, 80 - .round_trip_ping_latency_dcfclk_cycles = 128, 81 - .urgent_out_of_order_return_per_channel_bytes = 256, 82 - .channel_interleave_bytes = 256, 83 - .num_banks = 8, 84 - .num_chans = 2, 85 - .vmm_page_size_bytes = 4096, 86 - .dram_clock_change_latency_us = 17.0, 87 - .writeback_dram_clock_change_latency_us = 23.0, 88 - .return_bus_width_bytes = 64, 89 - }; 29 + extern const struct _vcs_dpi_ip_params_st dcn1_0_ip; 30 + extern const struct _vcs_dpi_soc_bounding_box_st dcn1_0_soc; 90 31 91 32 static void set_soc_bounding_box(struct _vcs_dpi_soc_bounding_box_st *soc, enum dml_project project) 92 33 {
-1
drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h
··· 27 27 28 28 29 29 #include "dml_common_defs.h" 30 - #include "soc_bounding_box.h" 31 30 #include "dml1_display_rq_dlg_calc.h" 32 31 33 32 enum dml_project {
+1 -2
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
··· 64 64 double dscclk_mhz; 65 65 double dcfclk_mhz; 66 66 double socclk_mhz; 67 - double dram_speed_mhz; 67 + double dram_speed_mts; 68 68 double fabricclk_mhz; 69 69 double dispclk_mhz; 70 - double dram_bw_per_chan_gbps; 71 70 double phyclk_mhz; 72 71 double dppclk_mhz; 73 72 };
-79
drivers/gpu/drm/amd/display/dc/dml/soc_bounding_box.c
··· 1 - /* 2 - * Copyright 2017 Advanced Micro Devices, Inc. 3 - * 4 - * Permission is hereby granted, free of charge, to any person obtaining a 5 - * copy of this software and associated documentation files (the "Software"), 6 - * to deal in the Software without restriction, including without limitation 7 - * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 - * and/or sell copies of the Software, and to permit persons to whom the 9 - * Software is furnished to do so, subject to the following conditions: 10 - * 11 - * The above copyright notice and this permission notice shall be included in 12 - * all copies or substantial portions of the Software. 13 - * 14 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 - * OTHER DEALINGS IN THE SOFTWARE. 21 - * 22 - * Authors: AMD 23 - * 24 - */ 25 - #include "soc_bounding_box.h" 26 - #include "display_mode_lib.h" 27 - #include "dc_features.h" 28 - 29 - #include "dml_inline_defs.h" 30 - 31 - /* 32 - * NOTE: 33 - * This file is gcc-parseable HW gospel, coming straight from HW engineers. 34 - * 35 - * It doesn't adhere to Linux kernel style and sometimes will do things in odd 36 - * ways. Unless there is something clearly wrong with it the code should 37 - * remain as-is as it provides us with a guarantee from HW that it is correct. 38 - */ 39 - 40 - void dml_socbb_set_latencies(soc_bounding_box_st *to_box, soc_bounding_box_st *from_box) 41 - { 42 - to_box->dram_clock_change_latency_us = from_box->dram_clock_change_latency_us; 43 - to_box->sr_exit_time_us = from_box->sr_exit_time_us; 44 - to_box->sr_enter_plus_exit_time_us = from_box->sr_enter_plus_exit_time_us; 45 - to_box->urgent_latency_us = from_box->urgent_latency_us; 46 - to_box->writeback_latency_us = from_box->writeback_latency_us; 47 - } 48 - 49 - voltage_scaling_st dml_socbb_voltage_scaling( 50 - const soc_bounding_box_st *soc, 51 - enum voltage_state voltage) 52 - { 53 - const voltage_scaling_st *voltage_state; 54 - const voltage_scaling_st * const voltage_end = soc->clock_limits + DC__VOLTAGE_STATES; 55 - 56 - for (voltage_state = soc->clock_limits; 57 - voltage_state < voltage_end && voltage_state->state != voltage; 58 - voltage_state++) { 59 - } 60 - 61 - if (voltage_state < voltage_end) 62 - return *voltage_state; 63 - return soc->clock_limits[DC__VOLTAGE_STATES - 1]; 64 - } 65 - 66 - double dml_socbb_return_bw_mhz(soc_bounding_box_st *box, enum voltage_state voltage) 67 - { 68 - double return_bw; 69 - 70 - voltage_scaling_st state = dml_socbb_voltage_scaling(box, voltage); 71 - 72 - return_bw = dml_min((double) box->return_bus_width_bytes * state.dcfclk_mhz, 73 - state.dram_bw_per_chan_gbps * 1000.0 * (double) box->num_chans 74 - * box->ideal_dram_bw_after_urgent_percent / 100.0); 75 - 76 - return_bw = dml_min((double) box->return_bus_width_bytes * state.fabricclk_mhz, return_bw); 77 - 78 - return return_bw; 79 - }
+6 -7
drivers/gpu/drm/amd/display/dc/dml/soc_bounding_box.h drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h
··· 1 1 /* 2 - * Copyright 2017 Advanced Micro Devices, Inc. 2 + * Copyright 2018 Advanced Micro Devices, Inc. 3 3 * 4 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 5 * copy of this software and associated documentation files (the "Software"), ··· 23 23 * 24 24 */ 25 25 26 - #ifndef __SOC_BOUNDING_BOX_H__ 27 - #define __SOC_BOUNDING_BOX_H__ 26 + #ifndef __AMDGPU_DM_DEBUGFS_H__ 27 + #define __AMDGPU_DM_DEBUGFS_H__ 28 28 29 - #include "dml_common_defs.h" 29 + #include "amdgpu.h" 30 + #include "amdgpu_dm.h" 30 31 31 - void dml_socbb_set_latencies(soc_bounding_box_st *to_box, soc_bounding_box_st *from_box); 32 - voltage_scaling_st dml_socbb_voltage_scaling(const soc_bounding_box_st *box, enum voltage_state voltage); 33 - double dml_socbb_return_bw_mhz(soc_bounding_box_st *box, enum voltage_state voltage); 32 + int connector_debugfs_init(struct amdgpu_dm_connector *connector); 34 33 35 34 #endif
+3 -4
drivers/gpu/drm/amd/display/dc/inc/core_types.h
··· 163 163 unsigned int audio_count; 164 164 struct audio_support audio_support; 165 165 166 - struct display_clock *display_clock; 166 + struct dccg *dccg; 167 167 struct irq_service *irqs; 168 168 169 169 struct abm *abm; ··· 256 256 }; 257 257 258 258 struct dcn_bw_output { 259 - struct dc_clocks cur_clk; 260 - struct dc_clocks calc_clk; 259 + struct dc_clocks clk; 261 260 struct dcn_watermark_set watermarks; 262 261 }; 263 262 ··· 281 282 struct dcn_bw_internal_vars dcn_bw_vars; 282 283 #endif 283 284 284 - struct display_clock *dis_clk; 285 + struct dccg *dis_clk; 285 286 286 287 struct kref refcount; 287 288 };
+1 -1
drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h
··· 625 625 626 626 unsigned int dcn_find_dcfclk_suits_all( 627 627 const struct dc *dc, 628 - struct clocks_value *clocks); 628 + struct dc_clocks *clocks); 629 629 630 630 void dcn_bw_update_from_pplib(struct dc *dc); 631 631 void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc);
+8 -35
drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h
··· 27 27 #define __DISPLAY_CLOCK_H__ 28 28 29 29 #include "dm_services_types.h" 30 - 31 - 32 - struct clocks_value { 33 - int dispclk_in_khz; 34 - int max_pixelclk_in_khz; 35 - int max_non_dp_phyclk_in_khz; 36 - int max_dp_phyclk_in_khz; 37 - bool dispclk_notify_pplib_done; 38 - bool pixelclk_notify_pplib_done; 39 - bool phyclk_notigy_pplib_done; 40 - int dcfclock_in_khz; 41 - int dppclk_in_khz; 42 - int mclk_in_khz; 43 - int phyclk_in_khz; 44 - int common_vdd_level; 45 - }; 46 - 30 + #include "dc.h" 47 31 48 32 /* Structure containing all state-dependent clocks 49 33 * (dependent on "enum clocks_state") */ ··· 36 52 int pixel_clk_khz; 37 53 }; 38 54 39 - struct display_clock { 55 + struct dccg { 40 56 struct dc_context *ctx; 41 57 const struct display_clock_funcs *funcs; 42 58 43 59 enum dm_pp_clocks_state max_clks_state; 44 60 enum dm_pp_clocks_state cur_min_clks_state; 45 - struct clocks_value cur_clocks_value; 61 + struct dc_clocks clks; 46 62 }; 47 63 48 64 struct display_clock_funcs { 49 - int (*set_clock)(struct display_clock *disp_clk, 65 + void (*update_clocks)(struct dccg *dccg, 66 + struct dc_clocks *new_clocks, 67 + bool safe_to_lower); 68 + int (*set_dispclk)(struct dccg *dccg, 50 69 int requested_clock_khz); 51 70 52 - enum dm_pp_clocks_state (*get_required_clocks_state)( 53 - struct display_clock *disp_clk, 54 - struct state_dependent_clocks *req_clocks); 55 - 56 - bool (*set_min_clocks_state)(struct display_clock *disp_clk, 57 - enum dm_pp_clocks_state dm_pp_clocks_state); 58 - 59 - int (*get_dp_ref_clk_frequency)(struct display_clock *disp_clk); 60 - 61 - bool (*apply_clock_voltage_request)( 62 - struct display_clock *disp_clk, 63 - enum dm_pp_clock_type clocks_type, 64 - int clocks_in_khz, 65 - bool pre_mode_set, 66 - bool update_dp_phyclk); 71 + int (*get_dp_ref_clk_frequency)(struct dccg *dccg); 67 72 }; 68 73 69 74 #endif /* __DISPLAY_CLOCK_H__ */
+2 -1
drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
··· 44 44 bool blnd_crtc_trigger; 45 45 bool DEGVIDCN10_253; 46 46 bool false_optc_underflow; 47 + bool DEGVIDCN10_254; 47 48 }; 48 49 49 50 struct hwseq_wa_state { ··· 172 171 void (*set_bandwidth)( 173 172 struct dc *dc, 174 173 struct dc_state *context, 175 - bool decrease_allowed); 174 + bool safe_to_lower); 176 175 177 176 void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes, 178 177 int vmin, int vmax);
+1 -1
drivers/gpu/drm/amd/display/dc/irq/irq_service.c
··· 78 78 struct irq_service *irq_service, 79 79 enum dc_irq_source source) 80 80 { 81 - if (source > DAL_IRQ_SOURCES_NUMBER || source < DC_IRQ_SOURCE_INVALID) 81 + if (source >= DAL_IRQ_SOURCES_NUMBER || source < DC_IRQ_SOURCE_INVALID) 82 82 return NULL; 83 83 84 84 return &irq_service->info[source];
+46
drivers/gpu/drm/amd/display/include/grph_object_defs.h
··· 37 37 * ******************************************************************** 38 38 */ 39 39 40 + #define MAX_CONNECTOR_NUMBER_PER_SLOT (16) 41 + #define MAX_BOARD_SLOTS (4) 42 + #define INVALID_CONNECTOR_INDEX ((unsigned int)(-1)) 43 + 40 44 /* HPD unit id - HW direct translation */ 41 45 enum hpd_source_id { 42 46 HPD_SOURCEID1 = 0, ··· 140 136 SYNC_SOURCE_DUAL_GPU_PIN 141 137 }; 142 138 139 + /* connector sizes in millimeters - from BiosParserTypes.hpp */ 140 + #define CONNECTOR_SIZE_DVI 40 141 + #define CONNECTOR_SIZE_VGA 32 142 + #define CONNECTOR_SIZE_HDMI 16 143 + #define CONNECTOR_SIZE_DP 16 144 + #define CONNECTOR_SIZE_MINI_DP 9 145 + #define CONNECTOR_SIZE_UNKNOWN 30 143 146 147 + enum connector_layout_type { 148 + CONNECTOR_LAYOUT_TYPE_UNKNOWN, 149 + CONNECTOR_LAYOUT_TYPE_DVI_D, 150 + CONNECTOR_LAYOUT_TYPE_DVI_I, 151 + CONNECTOR_LAYOUT_TYPE_VGA, 152 + CONNECTOR_LAYOUT_TYPE_HDMI, 153 + CONNECTOR_LAYOUT_TYPE_DP, 154 + CONNECTOR_LAYOUT_TYPE_MINI_DP, 155 + }; 156 + struct connector_layout_info { 157 + struct graphics_object_id connector_id; 158 + enum connector_layout_type connector_type; 159 + unsigned int length; 160 + unsigned int position; /* offset in mm from right side of the board */ 161 + }; 162 + 163 + /* length and width in mm */ 164 + struct slot_layout_info { 165 + unsigned int length; 166 + unsigned int width; 167 + unsigned int num_of_connectors; 168 + struct connector_layout_info connectors[MAX_CONNECTOR_NUMBER_PER_SLOT]; 169 + }; 170 + 171 + struct board_layout_info { 172 + unsigned int num_of_slots; 173 + 174 + /* indicates valid information in bracket layout structure. */ 175 + unsigned int is_number_of_slots_valid : 1; 176 + unsigned int is_slots_size_valid : 1; 177 + unsigned int is_connector_offsets_valid : 1; 178 + unsigned int is_connector_lengths_valid : 1; 179 + 180 + struct slot_layout_info slots[MAX_BOARD_SLOTS]; 181 + }; 144 182 #endif
+16
drivers/gpu/drm/amd/display/include/grph_object_id.h
··· 197 197 TRANSMITTER_COLOR_DEPTH_48 /* 16 bits */ 198 198 }; 199 199 200 + enum dp_alt_mode { 201 + DP_Alt_mode__Unknown = 0, 202 + DP_Alt_mode__Connect, 203 + DP_Alt_mode__NoConnect, 204 + }; 200 205 /* 201 206 ***************************************************************************** 202 207 * graphics_object_id struct ··· 291 286 if (id.type == OBJECT_TYPE_ENGINE) 292 287 return (enum engine_id) id.id; 293 288 return ENGINE_ID_UNKNOWN; 289 + } 290 + 291 + static inline bool dal_graphics_object_id_equal( 292 + struct graphics_object_id id_1, 293 + struct graphics_object_id id_2) 294 + { 295 + if ((id_1.id == id_2.id) && (id_1.enum_id == id_2.enum_id) && 296 + (id_1.type == id_2.type)) { 297 + return true; 298 + } 299 + return false; 294 300 } 295 301 #endif
+4 -4
drivers/gpu/drm/amd/display/modules/color/color_gamma.c
··· 1723 1723 kvfree(rgb_regamma); 1724 1724 } else if (trans == TRANSFER_FUNCTION_HLG || 1725 1725 trans == TRANSFER_FUNCTION_HLG12) { 1726 - rgb_regamma = kvzalloc(sizeof(*rgb_regamma) * 1727 - (MAX_HW_POINTS + _EXTRA_POINTS), 1726 + rgb_regamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS, 1727 + sizeof(*rgb_regamma), 1728 1728 GFP_KERNEL); 1729 1729 if (!rgb_regamma) 1730 1730 goto rgb_regamma_alloc_fail; ··· 1802 1802 kvfree(rgb_degamma); 1803 1803 } else if (trans == TRANSFER_FUNCTION_HLG || 1804 1804 trans == TRANSFER_FUNCTION_HLG12) { 1805 - rgb_degamma = kvzalloc(sizeof(*rgb_degamma) * 1806 - (MAX_HW_POINTS + _EXTRA_POINTS), 1805 + rgb_degamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS, 1806 + sizeof(*rgb_degamma), 1807 1807 GFP_KERNEL); 1808 1808 if (!rgb_degamma) 1809 1809 goto rgb_degamma_alloc_fail;
+2
drivers/gpu/drm/amd/include/amd_pcie.h
··· 27 27 #define CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 0x00010000 28 28 #define CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 0x00020000 29 29 #define CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 0x00040000 30 + #define CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4 0x00080000 30 31 #define CAIL_PCIE_LINK_SPEED_SUPPORT_MASK 0xFFFF0000 31 32 #define CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT 16 32 33 ··· 35 34 #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 0x00000001 36 35 #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 0x00000002 37 36 #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3 0x00000004 37 + #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN4 0x00000008 38 38 #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_MASK 0x0000FFFF 39 39 #define CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_SHIFT 0 40 40
+28 -18
drivers/gpu/drm/amd/include/amd_shared.h
··· 128 128 PP_OVERDRIVE_MASK = 0x4000, 129 129 PP_GFXOFF_MASK = 0x8000, 130 130 PP_ACG_MASK = 0x10000, 131 + PP_STUTTER_MODE = 0x20000, 131 132 }; 132 133 134 + /** 135 + * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks 136 + */ 133 137 struct amd_ip_funcs { 134 - /* Name of IP block */ 138 + /** @name: Name of IP block */ 135 139 char *name; 136 - /* sets up early driver state (pre sw_init), does not configure hw - Optional */ 140 + /** 141 + * @early_init: 142 + * 143 + * sets up early driver state (pre sw_init), 144 + * does not configure hw - Optional 145 + */ 137 146 int (*early_init)(void *handle); 138 - /* sets up late driver/hw state (post hw_init) - Optional */ 147 + /** @late_init: sets up late driver/hw state (post hw_init) - Optional */ 139 148 int (*late_init)(void *handle); 140 - /* sets up driver state, does not configure hw */ 149 + /** @sw_init: sets up driver state, does not configure hw */ 141 150 int (*sw_init)(void *handle); 142 - /* tears down driver state, does not configure hw */ 151 + /** @sw_fini: tears down driver state, does not configure hw */ 143 152 int (*sw_fini)(void *handle); 144 - /* sets up the hw state */ 153 + /** @hw_init: sets up the hw state */ 145 154 int (*hw_init)(void *handle); 146 - /* tears down the hw state */ 155 + /** @hw_fini: tears down the hw state */ 147 156 int (*hw_fini)(void *handle); 157 + /** @late_fini: final cleanup */ 148 158 void (*late_fini)(void *handle); 149 - /* handles IP specific hw/sw changes for suspend */ 159 + /** @suspend: handles IP specific hw/sw changes for suspend */ 150 160 int (*suspend)(void *handle); 151 - /* handles IP specific hw/sw changes for resume */ 161 + /** @resume: handles IP specific hw/sw changes for resume */ 152 162 int (*resume)(void *handle); 153 - /* returns current IP block idle status */ 163 + /** @is_idle: returns current IP block idle status */ 154 164 bool (*is_idle)(void *handle); 155 - /* poll for idle */ 165 + /** @wait_for_idle: poll for idle */ 156 166 int (*wait_for_idle)(void *handle); 157 - /* check soft reset the IP block */ 167 + /** @check_soft_reset: check soft reset the IP block */ 158 168 bool (*check_soft_reset)(void *handle); 159 - /* pre soft reset the IP block */ 169 + /** @pre_soft_reset: pre soft reset the IP block */ 160 170 int (*pre_soft_reset)(void *handle); 161 - /* soft reset the IP block */ 171 + /** @soft_reset: soft reset the IP block */ 162 172 int (*soft_reset)(void *handle); 163 - /* post soft reset the IP block */ 173 + /** @post_soft_reset: post soft reset the IP block */ 164 174 int (*post_soft_reset)(void *handle); 165 - /* enable/disable cg for the IP block */ 175 + /** @set_clockgating_state: enable/disable cg for the IP block */ 166 176 int (*set_clockgating_state)(void *handle, 167 177 enum amd_clockgating_state state); 168 - /* enable/disable pg for the IP block */ 178 + /** @set_powergating_state: enable/disable pg for the IP block */ 169 179 int (*set_powergating_state)(void *handle, 170 180 enum amd_powergating_state state); 171 - /* get current clockgating status */ 181 + /** @get_clockgating_state: get current clockgating status */ 172 182 void (*get_clockgating_state)(void *handle, u32 *flags); 173 183 }; 174 184
+4 -1
drivers/gpu/drm/amd/include/atomfirmware.h
··· 1433 1433 uint8_t acggfxclkspreadpercent; 1434 1434 uint16_t acggfxclkspreadfreq; 1435 1435 1436 - uint32_t boardreserved[10]; 1436 + uint8_t Vr2_I2C_address; 1437 + uint8_t padding_vr2[3]; 1438 + 1439 + uint32_t boardreserved[9]; 1437 1440 }; 1438 1441 1439 1442 /*
+2 -35
drivers/gpu/drm/amd/include/dm_pp_interface.h
··· 23 23 #ifndef _DM_PP_INTERFACE_ 24 24 #define _DM_PP_INTERFACE_ 25 25 26 + #include "dm_services_types.h" 27 + 26 28 #define PP_MAX_CLOCK_LEVELS 16 27 29 28 30 enum amd_pp_display_config_type{ ··· 189 187 struct pp_display_clock_request { 190 188 enum amd_pp_clock_type clock_type; 191 189 uint32_t clock_freq_in_khz; 192 - }; 193 - 194 - #define PP_MAX_WM_SETS 4 195 - 196 - enum pp_wm_set_id { 197 - DC_WM_SET_A = 0, 198 - DC_WM_SET_B, 199 - DC_WM_SET_C, 200 - DC_WM_SET_D, 201 - DC_WM_SET_INVALID = 0xffff, 202 - }; 203 - 204 - struct pp_wm_set_with_dmif_clock_range_soc15 { 205 - enum pp_wm_set_id wm_set_id; 206 - uint32_t wm_min_dcefclk_in_khz; 207 - uint32_t wm_max_dcefclk_in_khz; 208 - uint32_t wm_min_memclk_in_khz; 209 - uint32_t wm_max_memclk_in_khz; 210 - }; 211 - 212 - struct pp_wm_set_with_mcif_clock_range_soc15 { 213 - enum pp_wm_set_id wm_set_id; 214 - uint32_t wm_min_socclk_in_khz; 215 - uint32_t wm_max_socclk_in_khz; 216 - uint32_t wm_min_memclk_in_khz; 217 - uint32_t wm_max_memclk_in_khz; 218 - }; 219 - 220 - struct pp_wm_sets_with_clock_ranges_soc15 { 221 - uint32_t num_wm_sets_dmif; 222 - uint32_t num_wm_sets_mcif; 223 - struct pp_wm_set_with_dmif_clock_range_soc15 224 - wm_sets_dmif[PP_MAX_WM_SETS]; 225 - struct pp_wm_set_with_mcif_clock_range_soc15 226 - wm_sets_mcif[PP_MAX_WM_SETS]; 227 190 }; 228 191 229 192 #endif /* _DM_PP_INTERFACE_ */
+7 -8
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 192 192 struct amd_pp_display_configuration; 193 193 struct amd_pp_clock_info; 194 194 struct pp_display_clock_request; 195 - struct pp_wm_sets_with_clock_ranges_soc15; 196 195 struct pp_clock_levels_with_voltage; 197 196 struct pp_clock_levels_with_latency; 198 197 struct amd_pp_clocks; ··· 231 232 void (*debugfs_print_current_performance_level)(void *handle, struct seq_file *m); 232 233 int (*switch_power_profile)(void *handle, enum PP_SMC_POWER_PROFILE type, bool en); 233 234 /* export to amdgpu */ 234 - void (*powergate_uvd)(void *handle, bool gate); 235 - void (*powergate_vce)(void *handle, bool gate); 236 235 struct amd_vce_state *(*get_vce_clock_state)(void *handle, u32 idx); 237 236 int (*dispatch_tasks)(void *handle, enum amd_pp_task task_id, 238 237 enum amd_pm_state_type *user_state); 239 238 int (*load_firmware)(void *handle); 240 239 int (*wait_for_fw_loading_complete)(void *handle); 240 + int (*set_powergating_by_smu)(void *handle, 241 + uint32_t block_type, bool gate); 241 242 int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id); 242 243 int (*set_power_limit)(void *handle, uint32_t n); 243 244 int (*get_power_limit)(void *handle, uint32_t *limit, bool default_limit); 245 + int (*get_power_profile_mode)(void *handle, char *buf); 246 + int (*set_power_profile_mode)(void *handle, long *input, uint32_t size); 247 + int (*odn_edit_dpm_table)(void *handle, uint32_t type, long *input, uint32_t size); 244 248 /* export to DC */ 245 249 u32 (*get_sclk)(void *handle, bool low); 246 250 u32 (*get_mclk)(void *handle, bool low); ··· 263 261 enum amd_pp_clock_type type, 264 262 struct pp_clock_levels_with_voltage *clocks); 265 263 int (*set_watermarks_for_clocks_ranges)(void *handle, 266 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); 264 + void *clock_ranges); 267 265 int (*display_clock_voltage_request)(void *handle, 268 266 struct pp_display_clock_request *clock); 269 267 int (*get_display_mode_validation_clocks)(void *handle, 270 268 struct amd_pp_simple_clock_info *clocks); 271 - int (*get_power_profile_mode)(void *handle, char *buf); 272 - int (*set_power_profile_mode)(void *handle, long *input, uint32_t size); 273 - int (*odn_edit_dpm_table)(void *handle, uint32_t type, long *input, uint32_t size); 274 - int (*set_mmhub_powergating_by_smu)(void *handle); 269 + int (*notify_smu_enable_pwe)(void *handle); 275 270 }; 276 271 277 272 #endif
+68 -32
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
··· 221 221 static int pp_set_powergating_state(void *handle, 222 222 enum amd_powergating_state state) 223 223 { 224 - struct amdgpu_device *adev = handle; 225 - struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; 226 - int ret; 227 - 228 - if (!hwmgr || !hwmgr->pm_en) 229 - return 0; 230 - 231 - if (hwmgr->hwmgr_func->gfx_off_control) { 232 - /* Enable/disable GFX off through SMU */ 233 - ret = hwmgr->hwmgr_func->gfx_off_control(hwmgr, 234 - state == AMD_PG_STATE_GATE); 235 - if (ret) 236 - pr_err("gfx off control failed!\n"); 237 - } 238 - 239 - if (hwmgr->hwmgr_func->enable_per_cu_power_gating == NULL) { 240 - pr_debug("%s was not implemented.\n", __func__); 241 - return 0; 242 - } 243 - 244 - /* Enable/disable GFX per cu powergating through SMU */ 245 - return hwmgr->hwmgr_func->enable_per_cu_power_gating(hwmgr, 246 - state == AMD_PG_STATE_GATE); 224 + return 0; 247 225 } 248 226 249 227 static int pp_suspend(void *handle) ··· 1096 1118 } 1097 1119 1098 1120 static int pp_set_watermarks_for_clocks_ranges(void *handle, 1099 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 1121 + void *clock_ranges) 1100 1122 { 1101 1123 struct pp_hwmgr *hwmgr = handle; 1102 1124 int ret = 0; 1103 1125 1104 - if (!hwmgr || !hwmgr->pm_en ||!wm_with_clock_ranges) 1126 + if (!hwmgr || !hwmgr->pm_en || !clock_ranges) 1105 1127 return -EINVAL; 1106 1128 1107 1129 mutex_lock(&hwmgr->smu_lock); 1108 1130 ret = phm_set_watermarks_for_clocks_ranges(hwmgr, 1109 - wm_with_clock_ranges); 1131 + clock_ranges); 1110 1132 mutex_unlock(&hwmgr->smu_lock); 1111 1133 1112 1134 return ret; ··· 1146 1168 return ret; 1147 1169 } 1148 1170 1149 - static int pp_set_mmhub_powergating_by_smu(void *handle) 1171 + static int pp_dpm_powergate_mmhub(void *handle) 1150 1172 { 1151 1173 struct pp_hwmgr *hwmgr = handle; 1152 1174 1153 1175 if (!hwmgr || !hwmgr->pm_en) 1154 1176 return -EINVAL; 1155 1177 1156 - if (hwmgr->hwmgr_func->set_mmhub_powergating_by_smu == NULL) { 1178 + if (hwmgr->hwmgr_func->powergate_mmhub == NULL) { 1157 1179 pr_info("%s was not implemented.\n", __func__); 1158 1180 return 0; 1159 1181 } 1160 1182 1161 - return hwmgr->hwmgr_func->set_mmhub_powergating_by_smu(hwmgr); 1183 + return hwmgr->hwmgr_func->powergate_mmhub(hwmgr); 1184 + } 1185 + 1186 + static int pp_dpm_powergate_gfx(void *handle, bool gate) 1187 + { 1188 + struct pp_hwmgr *hwmgr = handle; 1189 + 1190 + if (!hwmgr || !hwmgr->pm_en) 1191 + return 0; 1192 + 1193 + if (hwmgr->hwmgr_func->powergate_gfx == NULL) { 1194 + pr_info("%s was not implemented.\n", __func__); 1195 + return 0; 1196 + } 1197 + 1198 + return hwmgr->hwmgr_func->powergate_gfx(hwmgr, gate); 1199 + } 1200 + 1201 + static int pp_set_powergating_by_smu(void *handle, 1202 + uint32_t block_type, bool gate) 1203 + { 1204 + int ret = 0; 1205 + 1206 + switch (block_type) { 1207 + case AMD_IP_BLOCK_TYPE_UVD: 1208 + case AMD_IP_BLOCK_TYPE_VCN: 1209 + pp_dpm_powergate_uvd(handle, gate); 1210 + break; 1211 + case AMD_IP_BLOCK_TYPE_VCE: 1212 + pp_dpm_powergate_vce(handle, gate); 1213 + break; 1214 + case AMD_IP_BLOCK_TYPE_GMC: 1215 + pp_dpm_powergate_mmhub(handle); 1216 + break; 1217 + case AMD_IP_BLOCK_TYPE_GFX: 1218 + ret = pp_dpm_powergate_gfx(handle, gate); 1219 + break; 1220 + default: 1221 + break; 1222 + } 1223 + return ret; 1224 + } 1225 + 1226 + static int pp_notify_smu_enable_pwe(void *handle) 1227 + { 1228 + struct pp_hwmgr *hwmgr = handle; 1229 + 1230 + if (!hwmgr || !hwmgr->pm_en) 1231 + return -EINVAL;; 1232 + 1233 + if (hwmgr->hwmgr_func->smus_notify_pwe == NULL) { 1234 + pr_info("%s was not implemented.\n", __func__); 1235 + return -EINVAL;; 1236 + } 1237 + 1238 + mutex_lock(&hwmgr->smu_lock); 1239 + hwmgr->hwmgr_func->smus_notify_pwe(hwmgr); 1240 + mutex_unlock(&hwmgr->smu_lock); 1241 + 1242 + return 0; 1162 1243 } 1163 1244 1164 1245 static const struct amd_pm_funcs pp_dpm_funcs = { ··· 1226 1189 .force_performance_level = pp_dpm_force_performance_level, 1227 1190 .get_performance_level = pp_dpm_get_performance_level, 1228 1191 .get_current_power_state = pp_dpm_get_current_power_state, 1229 - .powergate_vce = pp_dpm_powergate_vce, 1230 - .powergate_uvd = pp_dpm_powergate_uvd, 1231 1192 .dispatch_tasks = pp_dpm_dispatch_tasks, 1232 1193 .set_fan_control_mode = pp_dpm_set_fan_control_mode, 1233 1194 .get_fan_control_mode = pp_dpm_get_fan_control_mode, ··· 1245 1210 .get_vce_clock_state = pp_dpm_get_vce_clock_state, 1246 1211 .switch_power_profile = pp_dpm_switch_power_profile, 1247 1212 .set_clockgating_by_smu = pp_set_clockgating_by_smu, 1213 + .set_powergating_by_smu = pp_set_powergating_by_smu, 1248 1214 .get_power_profile_mode = pp_get_power_profile_mode, 1249 1215 .set_power_profile_mode = pp_set_power_profile_mode, 1250 1216 .odn_edit_dpm_table = pp_odn_edit_dpm_table, ··· 1263 1227 .set_watermarks_for_clocks_ranges = pp_set_watermarks_for_clocks_ranges, 1264 1228 .display_clock_voltage_request = pp_display_clock_voltage_request, 1265 1229 .get_display_mode_validation_clocks = pp_get_display_mode_validation_clocks, 1266 - .set_mmhub_powergating_by_smu = pp_set_mmhub_powergating_by_smu, 1230 + .notify_smu_enable_pwe = pp_notify_smu_enable_pwe, 1267 1231 };
+2 -2
drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
··· 435 435 } 436 436 437 437 int phm_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr, 438 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 438 + void *clock_ranges) 439 439 { 440 440 PHM_FUNC_CHECK(hwmgr); 441 441 ··· 443 443 return -EINVAL; 444 444 445 445 return hwmgr->hwmgr_func->set_watermarks_for_clocks_ranges(hwmgr, 446 - wm_with_clock_ranges); 446 + clock_ranges); 447 447 } 448 448 449 449 int phm_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
+4 -4
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c
··· 1544 1544 switch (hwmgr->chip_id) { 1545 1545 case CHIP_TONGA: 1546 1546 case CHIP_FIJI: 1547 - *max_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_3 *)profile)->ulMaxVddc/4); 1548 - *min_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_3 *)profile)->ulMinVddc/4); 1547 + *max_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_3 *)profile)->ulMaxVddc) / 4; 1548 + *min_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_3 *)profile)->ulMinVddc) / 4; 1549 1549 return; 1550 1550 case CHIP_POLARIS11: 1551 1551 case CHIP_POLARIS10: 1552 1552 case CHIP_POLARIS12: 1553 - *max_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_6 *)profile)->ulMaxVddc/100); 1554 - *min_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_6 *)profile)->ulMinVddc/100); 1553 + *max_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_6 *)profile)->ulMaxVddc) / 100; 1554 + *min_vddc = le32_to_cpu(((ATOM_ASIC_PROFILING_INFO_V3_6 *)profile)->ulMinVddc) / 100; 1555 1555 return; 1556 1556 default: 1557 1557 break;
+84 -12
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
··· 512 512 return 0; 513 513 } 514 514 515 + static void pp_atomfwctrl_copy_vbios_bootup_values_3_2(struct pp_hwmgr *hwmgr, 516 + struct pp_atomfwctrl_bios_boot_up_values *boot_values, 517 + struct atom_firmware_info_v3_2 *fw_info) 518 + { 519 + uint32_t frequency = 0; 520 + 521 + boot_values->ulRevision = fw_info->firmware_revision; 522 + boot_values->ulGfxClk = fw_info->bootup_sclk_in10khz; 523 + boot_values->ulUClk = fw_info->bootup_mclk_in10khz; 524 + boot_values->usVddc = fw_info->bootup_vddc_mv; 525 + boot_values->usVddci = fw_info->bootup_vddci_mv; 526 + boot_values->usMvddc = fw_info->bootup_mvddc_mv; 527 + boot_values->usVddGfx = fw_info->bootup_vddgfx_mv; 528 + boot_values->ucCoolingID = fw_info->coolingsolution_id; 529 + boot_values->ulSocClk = 0; 530 + boot_values->ulDCEFClk = 0; 531 + 532 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_SOCCLK_ID, &frequency)) 533 + boot_values->ulSocClk = frequency; 534 + 535 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_DCEFCLK_ID, &frequency)) 536 + boot_values->ulDCEFClk = frequency; 537 + 538 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_ECLK_ID, &frequency)) 539 + boot_values->ulEClk = frequency; 540 + 541 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_VCLK_ID, &frequency)) 542 + boot_values->ulVClk = frequency; 543 + 544 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_DCLK_ID, &frequency)) 545 + boot_values->ulDClk = frequency; 546 + } 547 + 548 + static void pp_atomfwctrl_copy_vbios_bootup_values_3_1(struct pp_hwmgr *hwmgr, 549 + struct pp_atomfwctrl_bios_boot_up_values *boot_values, 550 + struct atom_firmware_info_v3_1 *fw_info) 551 + { 552 + uint32_t frequency = 0; 553 + 554 + boot_values->ulRevision = fw_info->firmware_revision; 555 + boot_values->ulGfxClk = fw_info->bootup_sclk_in10khz; 556 + boot_values->ulUClk = fw_info->bootup_mclk_in10khz; 557 + boot_values->usVddc = fw_info->bootup_vddc_mv; 558 + boot_values->usVddci = fw_info->bootup_vddci_mv; 559 + boot_values->usMvddc = fw_info->bootup_mvddc_mv; 560 + boot_values->usVddGfx = fw_info->bootup_vddgfx_mv; 561 + boot_values->ucCoolingID = fw_info->coolingsolution_id; 562 + boot_values->ulSocClk = 0; 563 + boot_values->ulDCEFClk = 0; 564 + 565 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_SOCCLK_ID, &frequency)) 566 + boot_values->ulSocClk = frequency; 567 + 568 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_DCEFCLK_ID, &frequency)) 569 + boot_values->ulDCEFClk = frequency; 570 + 571 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_ECLK_ID, &frequency)) 572 + boot_values->ulEClk = frequency; 573 + 574 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_VCLK_ID, &frequency)) 575 + boot_values->ulVClk = frequency; 576 + 577 + if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_DCLK_ID, &frequency)) 578 + boot_values->ulDClk = frequency; 579 + } 580 + 515 581 int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr, 516 582 struct pp_atomfwctrl_bios_boot_up_values *boot_values) 517 583 { 518 - struct atom_firmware_info_v3_1 *info = NULL; 584 + struct atom_firmware_info_v3_2 *fwinfo_3_2; 585 + struct atom_firmware_info_v3_1 *fwinfo_3_1; 586 + struct atom_common_table_header *info = NULL; 519 587 uint16_t ix; 520 588 521 589 ix = GetIndexIntoMasterDataTable(firmwareinfo); 522 - info = (struct atom_firmware_info_v3_1 *) 590 + info = (struct atom_common_table_header *) 523 591 smu_atom_get_data_table(hwmgr->adev, 524 592 ix, NULL, NULL, NULL); 525 593 ··· 596 528 return -EINVAL; 597 529 } 598 530 599 - boot_values->ulRevision = info->firmware_revision; 600 - boot_values->ulGfxClk = info->bootup_sclk_in10khz; 601 - boot_values->ulUClk = info->bootup_mclk_in10khz; 602 - boot_values->usVddc = info->bootup_vddc_mv; 603 - boot_values->usVddci = info->bootup_vddci_mv; 604 - boot_values->usMvddc = info->bootup_mvddc_mv; 605 - boot_values->usVddGfx = info->bootup_vddgfx_mv; 606 - boot_values->ucCoolingID = info->coolingsolution_id; 607 - boot_values->ulSocClk = 0; 608 - boot_values->ulDCEFClk = 0; 531 + if ((info->format_revision == 3) && (info->content_revision == 2)) { 532 + fwinfo_3_2 = (struct atom_firmware_info_v3_2 *)info; 533 + pp_atomfwctrl_copy_vbios_bootup_values_3_2(hwmgr, 534 + boot_values, fwinfo_3_2); 535 + } else if ((info->format_revision == 3) && (info->content_revision == 1)) { 536 + fwinfo_3_1 = (struct atom_firmware_info_v3_1 *)info; 537 + pp_atomfwctrl_copy_vbios_bootup_values_3_1(hwmgr, 538 + boot_values, fwinfo_3_1); 539 + } else { 540 + pr_info("Fw info table revision does not match!"); 541 + return -EINVAL; 542 + } 609 543 610 544 return 0; 611 545 } ··· 698 628 param->acggfxclkspreadenabled = info->acggfxclkspreadenabled; 699 629 param->acggfxclkspreadpercent = info->acggfxclkspreadpercent; 700 630 param->acggfxclkspreadfreq = info->acggfxclkspreadfreq; 631 + 632 + param->Vr2_I2C_address = info->Vr2_I2C_address; 701 633 702 634 return 0; 703 635 }
+5
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
··· 136 136 uint32_t ulUClk; 137 137 uint32_t ulSocClk; 138 138 uint32_t ulDCEFClk; 139 + uint32_t ulEClk; 140 + uint32_t ulVClk; 141 + uint32_t ulDClk; 139 142 uint16_t usVddc; 140 143 uint16_t usVddci; 141 144 uint16_t usMvddc; ··· 210 207 uint8_t acggfxclkspreadenabled; 211 208 uint8_t acggfxclkspreadpercent; 212 209 uint16_t acggfxclkspreadfreq; 210 + 211 + uint8_t Vr2_I2C_address; 213 212 }; 214 213 215 214 int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr,
+4 -4
drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c
··· 183 183 ATOM_Tonga_Voltage_Lookup_Record, 184 184 entries, vddc_lookup_pp_tables, i); 185 185 record->us_calculated = 0; 186 - record->us_vdd = atom_record->usVdd; 187 - record->us_cac_low = atom_record->usCACLow; 188 - record->us_cac_mid = atom_record->usCACMid; 189 - record->us_cac_high = atom_record->usCACHigh; 186 + record->us_vdd = le16_to_cpu(atom_record->usVdd); 187 + record->us_cac_low = le16_to_cpu(atom_record->usCACLow); 188 + record->us_cac_mid = le16_to_cpu(atom_record->usCACMid); 189 + record->us_cac_high = le16_to_cpu(atom_record->usCACHigh); 190 190 } 191 191 192 192 *lookup_table = table;
+7 -5
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
··· 993 993 994 994 clocks->num_levels = 0; 995 995 for (i = 0; i < pclk_vol_table->count; i++) { 996 - clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk; 996 + clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk * 10; 997 997 clocks->data[i].latency_in_us = latency_required ? 998 998 smu10_get_mem_latency(hwmgr, 999 999 pclk_vol_table->entries[i].clk) : ··· 1044 1044 1045 1045 clocks->num_levels = 0; 1046 1046 for (i = 0; i < pclk_vol_table->count; i++) { 1047 - clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk; 1047 + clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk * 10; 1048 1048 clocks->data[i].voltage_in_mv = pclk_vol_table->entries[i].vol; 1049 1049 clocks->num_levels++; 1050 1050 } ··· 1108 1108 } 1109 1109 1110 1110 static int smu10_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr, 1111 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 1111 + void *clock_ranges) 1112 1112 { 1113 1113 struct smu10_hwmgr *data = hwmgr->backend; 1114 + struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges = clock_ranges; 1114 1115 Watermarks_t *table = &(data->water_marks_table); 1115 1116 int result = 0; 1116 1117 ··· 1127 1126 return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_SetRccPfcPmeRestoreRegister); 1128 1127 } 1129 1128 1130 - static int smu10_set_mmhub_powergating_by_smu(struct pp_hwmgr *hwmgr) 1129 + static int smu10_powergate_mmhub(struct pp_hwmgr *hwmgr) 1131 1130 { 1132 1131 return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PowerGateMmHub); 1133 1132 } ··· 1183 1182 .asic_setup = smu10_setup_asic_task, 1184 1183 .power_state_set = smu10_set_power_state_tasks, 1185 1184 .dynamic_state_management_disable = smu10_disable_dpm_tasks, 1186 - .set_mmhub_powergating_by_smu = smu10_set_mmhub_powergating_by_smu, 1185 + .powergate_mmhub = smu10_powergate_mmhub, 1187 1186 .smus_notify_pwe = smu10_smus_notify_pwe, 1188 1187 .gfx_off_control = smu10_gfx_off_control, 1189 1188 .display_clock_voltage_request = smu10_display_clock_voltage_request, 1189 + .powergate_gfx = smu10_gfx_off_control, 1190 1190 }; 1191 1191 1192 1192 int smu10_init_function_pointers(struct pp_hwmgr *hwmgr)
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c
··· 416 416 * Powerplay will only control the static per CU Power Gating. 417 417 * Dynamic per CU Power Gating will be done in gfx. 418 418 */ 419 - int smu7_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable) 419 + int smu7_powergate_gfx(struct pp_hwmgr *hwmgr, bool enable) 420 420 { 421 421 struct amdgpu_device *adev = hwmgr->adev; 422 422
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.h
··· 33 33 int smu7_disable_clock_power_gating(struct pp_hwmgr *hwmgr); 34 34 int smu7_update_clock_gatings(struct pp_hwmgr *hwmgr, 35 35 const uint32_t *msg_id); 36 - int smu7_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable); 36 + int smu7_powergate_gfx(struct pp_hwmgr *hwmgr, bool enable); 37 37 38 38 #endif
+3 -3
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 1578 1578 data->current_profile_setting.sclk_up_hyst = 0; 1579 1579 data->current_profile_setting.sclk_down_hyst = 100; 1580 1580 data->current_profile_setting.sclk_activity = SMU7_SCLK_TARGETACTIVITY_DFLT; 1581 - data->current_profile_setting.bupdate_sclk = 1; 1581 + data->current_profile_setting.bupdate_mclk = 1; 1582 1582 data->current_profile_setting.mclk_up_hyst = 0; 1583 1583 data->current_profile_setting.mclk_down_hyst = 100; 1584 1584 data->current_profile_setting.mclk_activity = SMU7_MCLK_TARGETACTIVITY_DFLT; ··· 3183 3183 performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap, 3184 3184 state_entry->ucPCIEGenLow); 3185 3185 performance_level->pcie_lane = get_pcie_lane_support(data->pcie_lane_cap, 3186 - state_entry->ucPCIELaneHigh); 3186 + state_entry->ucPCIELaneLow); 3187 3187 3188 3188 performance_level = &(smu7_power_state->performance_levels 3189 3189 [smu7_power_state->performance_level_count++]); ··· 5044 5044 .get_fan_control_mode = smu7_get_fan_control_mode, 5045 5045 .force_clock_level = smu7_force_clock_level, 5046 5046 .print_clock_levels = smu7_print_clock_levels, 5047 - .enable_per_cu_power_gating = smu7_enable_per_cu_power_gating, 5047 + .powergate_gfx = smu7_powergate_gfx, 5048 5048 .get_sclk_od = smu7_get_sclk_od, 5049 5049 .set_sclk_od = smu7_set_sclk_od, 5050 5050 .get_mclk_od = smu7_get_mclk_od,
+21 -21
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
··· 652 652 } 653 653 654 654 int smu_set_watermarks_for_clocks_ranges(void *wt_table, 655 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 655 + struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 656 656 { 657 657 uint32_t i; 658 658 struct watermarks *table = wt_table; ··· 660 660 if (!table || !wm_with_clock_ranges) 661 661 return -EINVAL; 662 662 663 - if (wm_with_clock_ranges->num_wm_sets_dmif > 4 || wm_with_clock_ranges->num_wm_sets_mcif > 4) 663 + if (wm_with_clock_ranges->num_wm_dmif_sets > 4 || wm_with_clock_ranges->num_wm_mcif_sets > 4) 664 664 return -EINVAL; 665 665 666 - for (i = 0; i < wm_with_clock_ranges->num_wm_sets_dmif; i++) { 666 + for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) { 667 667 table->WatermarkRow[1][i].MinClock = 668 668 cpu_to_le16((uint16_t) 669 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_min_dcefclk_in_khz) / 670 - 100); 669 + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz) / 670 + 1000); 671 671 table->WatermarkRow[1][i].MaxClock = 672 672 cpu_to_le16((uint16_t) 673 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_max_dcefclk_in_khz) / 673 + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz) / 674 674 100); 675 675 table->WatermarkRow[1][i].MinUclk = 676 676 cpu_to_le16((uint16_t) 677 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_min_memclk_in_khz) / 678 - 100); 677 + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz) / 678 + 1000); 679 679 table->WatermarkRow[1][i].MaxUclk = 680 680 cpu_to_le16((uint16_t) 681 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_max_memclk_in_khz) / 682 - 100); 681 + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz) / 682 + 1000); 683 683 table->WatermarkRow[1][i].WmSetting = (uint8_t) 684 - wm_with_clock_ranges->wm_sets_dmif[i].wm_set_id; 684 + wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id; 685 685 } 686 686 687 - for (i = 0; i < wm_with_clock_ranges->num_wm_sets_mcif; i++) { 687 + for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) { 688 688 table->WatermarkRow[0][i].MinClock = 689 689 cpu_to_le16((uint16_t) 690 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_min_socclk_in_khz) / 691 - 100); 690 + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz) / 691 + 1000); 692 692 table->WatermarkRow[0][i].MaxClock = 693 693 cpu_to_le16((uint16_t) 694 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_max_socclk_in_khz) / 695 - 100); 694 + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz) / 695 + 1000); 696 696 table->WatermarkRow[0][i].MinUclk = 697 697 cpu_to_le16((uint16_t) 698 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_min_memclk_in_khz) / 699 - 100); 698 + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz) / 699 + 1000); 700 700 table->WatermarkRow[0][i].MaxUclk = 701 701 cpu_to_le16((uint16_t) 702 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_max_memclk_in_khz) / 703 - 100); 702 + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz) / 703 + 1000); 704 704 table->WatermarkRow[0][i].WmSetting = (uint8_t) 705 - wm_with_clock_ranges->wm_sets_mcif[i].wm_set_id; 705 + wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; 706 706 } 707 707 return 0; 708 708 }
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h
··· 107 107 struct phm_ppt_v1_clock_voltage_dependency_table *dep_table); 108 108 109 109 int smu_set_watermarks_for_clocks_ranges(void *wt_table, 110 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); 110 + struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); 111 111 112 112 #define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT 113 113 #define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK
+18 -38
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
··· 55 55 56 56 static const uint32_t channel_number[] = {1, 2, 0, 4, 0, 8, 0, 16, 2}; 57 57 58 - #define MEM_FREQ_LOW_LATENCY 25000 59 - #define MEM_FREQ_HIGH_LATENCY 80000 60 - #define MEM_LATENCY_HIGH 245 61 - #define MEM_LATENCY_LOW 35 62 - #define MEM_LATENCY_ERR 0xFFFF 63 - 64 58 #define mmDF_CS_AON0_DramBaseAddress0 0x0044 65 59 #define mmDF_CS_AON0_DramBaseAddress0_BASE_IDX 0 66 60 ··· 3217 3223 /* Find the lowest MCLK frequency that is within 3218 3224 * the tolerable latency defined in DAL 3219 3225 */ 3220 - latency = 0; 3226 + latency = hwmgr->display_config->dce_tolerable_mclk_in_active_latency; 3221 3227 for (i = 0; i < data->mclk_latency_table.count; i++) { 3222 3228 if ((data->mclk_latency_table.entries[i].latency <= latency) && 3223 3229 (data->mclk_latency_table.entries[i].frequency >= ··· 4058 4064 table_info->vdd_dep_on_sclk; 4059 4065 uint32_t i; 4060 4066 4067 + clocks->num_levels = 0; 4061 4068 for (i = 0; i < dep_table->count; i++) { 4062 4069 if (dep_table->entries[i].clk) { 4063 4070 clocks->data[clocks->num_levels].clocks_in_khz = 4064 - dep_table->entries[i].clk; 4071 + dep_table->entries[i].clk * 10; 4065 4072 clocks->num_levels++; 4066 4073 } 4067 4074 } 4068 4075 4069 - } 4070 - 4071 - static uint32_t vega10_get_mem_latency(struct pp_hwmgr *hwmgr, 4072 - uint32_t clock) 4073 - { 4074 - if (clock >= MEM_FREQ_LOW_LATENCY && 4075 - clock < MEM_FREQ_HIGH_LATENCY) 4076 - return MEM_LATENCY_HIGH; 4077 - else if (clock >= MEM_FREQ_HIGH_LATENCY) 4078 - return MEM_LATENCY_LOW; 4079 - else 4080 - return MEM_LATENCY_ERR; 4081 4076 } 4082 4077 4083 4078 static void vega10_get_memclocks(struct pp_hwmgr *hwmgr, ··· 4077 4094 struct phm_ppt_v1_clock_voltage_dependency_table *dep_table = 4078 4095 table_info->vdd_dep_on_mclk; 4079 4096 struct vega10_hwmgr *data = hwmgr->backend; 4097 + uint32_t j = 0; 4080 4098 uint32_t i; 4081 - 4082 - clocks->num_levels = 0; 4083 - data->mclk_latency_table.count = 0; 4084 4099 4085 4100 for (i = 0; i < dep_table->count; i++) { 4086 4101 if (dep_table->entries[i].clk) { 4087 - clocks->data[clocks->num_levels].clocks_in_khz = 4088 - data->mclk_latency_table.entries 4089 - [data->mclk_latency_table.count].frequency = 4090 - dep_table->entries[i].clk; 4091 - clocks->data[clocks->num_levels].latency_in_us = 4092 - data->mclk_latency_table.entries 4093 - [data->mclk_latency_table.count].latency = 4094 - vega10_get_mem_latency(hwmgr, 4095 - dep_table->entries[i].clk); 4096 - clocks->num_levels++; 4097 - data->mclk_latency_table.count++; 4102 + 4103 + clocks->data[j].clocks_in_khz = 4104 + dep_table->entries[i].clk * 10; 4105 + data->mclk_latency_table.entries[j].frequency = 4106 + dep_table->entries[i].clk; 4107 + clocks->data[j].latency_in_us = 4108 + data->mclk_latency_table.entries[j].latency = 25; 4109 + j++; 4098 4110 } 4099 4111 } 4112 + clocks->num_levels = data->mclk_latency_table.count = j; 4100 4113 } 4101 4114 4102 4115 static void vega10_get_dcefclocks(struct pp_hwmgr *hwmgr, ··· 4105 4126 uint32_t i; 4106 4127 4107 4128 for (i = 0; i < dep_table->count; i++) { 4108 - clocks->data[i].clocks_in_khz = dep_table->entries[i].clk; 4129 + clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10; 4109 4130 clocks->data[i].latency_in_us = 0; 4110 4131 clocks->num_levels++; 4111 4132 } ··· 4121 4142 uint32_t i; 4122 4143 4123 4144 for (i = 0; i < dep_table->count; i++) { 4124 - clocks->data[i].clocks_in_khz = dep_table->entries[i].clk; 4145 + clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10; 4125 4146 clocks->data[i].latency_in_us = 0; 4126 4147 clocks->num_levels++; 4127 4148 } ··· 4181 4202 } 4182 4203 4183 4204 for (i = 0; i < dep_table->count; i++) { 4184 - clocks->data[i].clocks_in_khz = dep_table->entries[i].clk; 4205 + clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10; 4185 4206 clocks->data[i].voltage_in_mv = (uint32_t)(table_info->vddc_lookup_table-> 4186 4207 entries[dep_table->entries[i].vddInd].us_vdd); 4187 4208 clocks->num_levels++; ··· 4194 4215 } 4195 4216 4196 4217 static int vega10_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr, 4197 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 4218 + void *clock_range) 4198 4219 { 4199 4220 struct vega10_hwmgr *data = hwmgr->backend; 4221 + struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges = clock_range; 4200 4222 Watermarks_t *table = &(data->smc_state_table.water_marks_table); 4201 4223 int result = 0; 4202 4224
+651 -404
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
··· 81 81 82 82 data->registry_data.disallowed_features = 0x0; 83 83 data->registry_data.od_state_in_dc_support = 0; 84 + data->registry_data.thermal_support = 1; 84 85 data->registry_data.skip_baco_hardware = 0; 85 86 86 87 data->registry_data.log_avfs_param = 0; ··· 454 453 */ 455 454 static void vega12_init_dpm_state(struct vega12_dpm_state *dpm_state) 456 455 { 457 - dpm_state->soft_min_level = 0xff; 458 - dpm_state->soft_max_level = 0xff; 459 - dpm_state->hard_min_level = 0xff; 460 - dpm_state->hard_max_level = 0xff; 456 + dpm_state->soft_min_level = 0x0; 457 + dpm_state->soft_max_level = 0xffff; 458 + dpm_state->hard_min_level = 0x0; 459 + dpm_state->hard_max_level = 0xffff; 461 460 } 462 461 463 - static int vega12_get_number_dpm_level(struct pp_hwmgr *hwmgr, 464 - PPCLK_e clkID, uint32_t *num_dpm_level) 462 + static int vega12_get_number_of_dpm_level(struct pp_hwmgr *hwmgr, 463 + PPCLK_e clk_id, uint32_t *num_of_levels) 465 464 { 466 - int result; 467 - /* 468 - * SMU expects the Clock ID to be in the top 16 bits. 469 - * Lower 16 bits specify the level however 0xFF is a 470 - * special argument the returns the total number of levels 471 - */ 472 - PP_ASSERT_WITH_CODE(smum_send_msg_to_smc_with_parameter(hwmgr, 473 - PPSMC_MSG_GetDpmFreqByIndex, (clkID << 16 | 0xFF)) == 0, 474 - "[GetNumberDpmLevel] Failed to get DPM levels from SMU for CLKID!", 475 - return -EINVAL); 465 + int ret = 0; 476 466 477 - result = vega12_read_arg_from_smc(hwmgr, num_dpm_level); 467 + ret = smum_send_msg_to_smc_with_parameter(hwmgr, 468 + PPSMC_MSG_GetDpmFreqByIndex, 469 + (clk_id << 16 | 0xFF)); 470 + PP_ASSERT_WITH_CODE(!ret, 471 + "[GetNumOfDpmLevel] failed to get dpm levels!", 472 + return ret); 478 473 479 - PP_ASSERT_WITH_CODE(*num_dpm_level < MAX_REGULAR_DPM_NUMBER, 480 - "[GetNumberDPMLevel] Number of DPM levels is greater than limit", 481 - return -EINVAL); 474 + vega12_read_arg_from_smc(hwmgr, num_of_levels); 475 + PP_ASSERT_WITH_CODE(*num_of_levels > 0, 476 + "[GetNumOfDpmLevel] number of clk levels is invalid!", 477 + return -EINVAL); 482 478 483 - PP_ASSERT_WITH_CODE(*num_dpm_level != 0, 484 - "[GetNumberDPMLevel] Number of CLK Levels is zero!", 485 - return -EINVAL); 486 - 487 - return result; 479 + return ret; 488 480 } 489 481 490 482 static int vega12_get_dpm_frequency_by_index(struct pp_hwmgr *hwmgr, ··· 503 509 return result; 504 510 } 505 511 512 + static int vega12_setup_single_dpm_table(struct pp_hwmgr *hwmgr, 513 + struct vega12_single_dpm_table *dpm_table, PPCLK_e clk_id) 514 + { 515 + int ret = 0; 516 + uint32_t i, num_of_levels, clk; 517 + 518 + ret = vega12_get_number_of_dpm_level(hwmgr, clk_id, &num_of_levels); 519 + PP_ASSERT_WITH_CODE(!ret, 520 + "[SetupSingleDpmTable] failed to get clk levels!", 521 + return ret); 522 + 523 + dpm_table->count = num_of_levels; 524 + 525 + for (i = 0; i < num_of_levels; i++) { 526 + ret = vega12_get_dpm_frequency_by_index(hwmgr, clk_id, i, &clk); 527 + PP_ASSERT_WITH_CODE(!ret, 528 + "[SetupSingleDpmTable] failed to get clk of specific level!", 529 + return ret); 530 + dpm_table->dpm_levels[i].value = clk; 531 + dpm_table->dpm_levels[i].enabled = true; 532 + } 533 + 534 + return ret; 535 + } 536 + 506 537 /* 507 538 * This function is to initialize all DPM state tables 508 539 * for SMU based on the dependency table. ··· 538 519 */ 539 520 static int vega12_setup_default_dpm_tables(struct pp_hwmgr *hwmgr) 540 521 { 541 - uint32_t num_levels, i, clock; 542 522 543 523 struct vega12_hwmgr *data = 544 524 (struct vega12_hwmgr *)(hwmgr->backend); 545 - 546 525 struct vega12_single_dpm_table *dpm_table; 526 + int ret = 0; 547 527 548 528 memset(&data->dpm_table, 0, sizeof(data->dpm_table)); 549 529 550 - /* Initialize Sclk DPM and SOC DPM table based on allow Sclk values */ 530 + /* socclk */ 551 531 dpm_table = &(data->dpm_table.soc_table); 552 - 553 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_SOCCLK, 554 - &num_levels) == 0, 555 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for SOCCLK!", 556 - return -EINVAL); 557 - 558 - dpm_table->count = num_levels; 559 - 560 - for (i = 0; i < num_levels; i++) { 561 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 562 - PPCLK_SOCCLK, i, &clock) == 0, 563 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for SOCCLK!", 564 - return -EINVAL); 565 - 566 - dpm_table->dpm_levels[i].value = clock; 567 - dpm_table->dpm_levels[i].enabled = true; 532 + if (data->smu_features[GNLD_DPM_SOCCLK].enabled) { 533 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_SOCCLK); 534 + PP_ASSERT_WITH_CODE(!ret, 535 + "[SetupDefaultDpmTable] failed to get socclk dpm levels!", 536 + return ret); 537 + } else { 538 + dpm_table->count = 1; 539 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.soc_clock / 100; 568 540 } 569 - 570 541 vega12_init_dpm_state(&(dpm_table->dpm_state)); 571 542 543 + /* gfxclk */ 572 544 dpm_table = &(data->dpm_table.gfx_table); 573 - 574 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_GFXCLK, 575 - &num_levels) == 0, 576 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for GFXCLK!", 577 - return -EINVAL); 578 - 579 - dpm_table->count = num_levels; 580 - for (i = 0; i < num_levels; i++) { 581 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 582 - PPCLK_GFXCLK, i, &clock) == 0, 583 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for GFXCLK!", 584 - return -EINVAL); 585 - 586 - dpm_table->dpm_levels[i].value = clock; 587 - dpm_table->dpm_levels[i].enabled = true; 545 + if (data->smu_features[GNLD_DPM_GFXCLK].enabled) { 546 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_GFXCLK); 547 + PP_ASSERT_WITH_CODE(!ret, 548 + "[SetupDefaultDpmTable] failed to get gfxclk dpm levels!", 549 + return ret); 550 + } else { 551 + dpm_table->count = 1; 552 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.gfx_clock / 100; 588 553 } 589 - 590 554 vega12_init_dpm_state(&(dpm_table->dpm_state)); 591 - /* Initialize Mclk DPM table based on allow Mclk values */ 555 + 556 + /* memclk */ 592 557 dpm_table = &(data->dpm_table.mem_table); 593 - 594 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_UCLK, 595 - &num_levels) == 0, 596 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for UCLK!", 597 - return -EINVAL); 598 - 599 - dpm_table->count = num_levels; 600 - 601 - for (i = 0; i < num_levels; i++) { 602 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 603 - PPCLK_UCLK, i, &clock) == 0, 604 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for UCLK!", 605 - return -EINVAL); 606 - 607 - dpm_table->dpm_levels[i].value = clock; 608 - dpm_table->dpm_levels[i].enabled = true; 558 + if (data->smu_features[GNLD_DPM_UCLK].enabled) { 559 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_UCLK); 560 + PP_ASSERT_WITH_CODE(!ret, 561 + "[SetupDefaultDpmTable] failed to get memclk dpm levels!", 562 + return ret); 563 + } else { 564 + dpm_table->count = 1; 565 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.mem_clock / 100; 609 566 } 610 - 611 567 vega12_init_dpm_state(&(dpm_table->dpm_state)); 612 568 569 + /* eclk */ 613 570 dpm_table = &(data->dpm_table.eclk_table); 614 - 615 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_ECLK, 616 - &num_levels) == 0, 617 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for ECLK!", 618 - return -EINVAL); 619 - 620 - dpm_table->count = num_levels; 621 - 622 - for (i = 0; i < num_levels; i++) { 623 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 624 - PPCLK_ECLK, i, &clock) == 0, 625 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for ECLK!", 626 - return -EINVAL); 627 - 628 - dpm_table->dpm_levels[i].value = clock; 629 - dpm_table->dpm_levels[i].enabled = true; 571 + if (data->smu_features[GNLD_DPM_VCE].enabled) { 572 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_ECLK); 573 + PP_ASSERT_WITH_CODE(!ret, 574 + "[SetupDefaultDpmTable] failed to get eclk dpm levels!", 575 + return ret); 576 + } else { 577 + dpm_table->count = 1; 578 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.eclock / 100; 630 579 } 631 - 632 580 vega12_init_dpm_state(&(dpm_table->dpm_state)); 633 581 582 + /* vclk */ 634 583 dpm_table = &(data->dpm_table.vclk_table); 635 - 636 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_VCLK, 637 - &num_levels) == 0, 638 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for VCLK!", 639 - return -EINVAL); 640 - 641 - dpm_table->count = num_levels; 642 - 643 - for (i = 0; i < num_levels; i++) { 644 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 645 - PPCLK_VCLK, i, &clock) == 0, 646 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for VCLK!", 647 - return -EINVAL); 648 - 649 - dpm_table->dpm_levels[i].value = clock; 650 - dpm_table->dpm_levels[i].enabled = true; 584 + if (data->smu_features[GNLD_DPM_UVD].enabled) { 585 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_VCLK); 586 + PP_ASSERT_WITH_CODE(!ret, 587 + "[SetupDefaultDpmTable] failed to get vclk dpm levels!", 588 + return ret); 589 + } else { 590 + dpm_table->count = 1; 591 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.vclock / 100; 651 592 } 652 - 653 593 vega12_init_dpm_state(&(dpm_table->dpm_state)); 654 594 595 + /* dclk */ 655 596 dpm_table = &(data->dpm_table.dclk_table); 656 - 657 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, PPCLK_DCLK, 658 - &num_levels) == 0, 659 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DCLK!", 660 - return -EINVAL); 661 - 662 - dpm_table->count = num_levels; 663 - 664 - for (i = 0; i < num_levels; i++) { 665 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 666 - PPCLK_DCLK, i, &clock) == 0, 667 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DCLK!", 668 - return -EINVAL); 669 - 670 - dpm_table->dpm_levels[i].value = clock; 671 - dpm_table->dpm_levels[i].enabled = true; 597 + if (data->smu_features[GNLD_DPM_UVD].enabled) { 598 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_DCLK); 599 + PP_ASSERT_WITH_CODE(!ret, 600 + "[SetupDefaultDpmTable] failed to get dclk dpm levels!", 601 + return ret); 602 + } else { 603 + dpm_table->count = 1; 604 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.dclock / 100; 672 605 } 673 - 674 606 vega12_init_dpm_state(&(dpm_table->dpm_state)); 675 607 676 - /* Assume there is no headless Vega12 for now */ 608 + /* dcefclk */ 677 609 dpm_table = &(data->dpm_table.dcef_table); 678 - 679 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, 680 - PPCLK_DCEFCLK, &num_levels) == 0, 681 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DCEFCLK!", 682 - return -EINVAL); 683 - 684 - dpm_table->count = num_levels; 685 - 686 - for (i = 0; i < num_levels; i++) { 687 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 688 - PPCLK_DCEFCLK, i, &clock) == 0, 689 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DCEFCLK!", 690 - return -EINVAL); 691 - 692 - dpm_table->dpm_levels[i].value = clock; 693 - dpm_table->dpm_levels[i].enabled = true; 610 + if (data->smu_features[GNLD_DPM_DCEFCLK].enabled) { 611 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_DCEFCLK); 612 + PP_ASSERT_WITH_CODE(!ret, 613 + "[SetupDefaultDpmTable] failed to get dcefclk dpm levels!", 614 + return ret); 615 + } else { 616 + dpm_table->count = 1; 617 + dpm_table->dpm_levels[0].value = data->vbios_boot_state.dcef_clock / 100; 694 618 } 695 - 696 619 vega12_init_dpm_state(&(dpm_table->dpm_state)); 697 620 621 + /* pixclk */ 698 622 dpm_table = &(data->dpm_table.pixel_table); 699 - 700 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, 701 - PPCLK_PIXCLK, &num_levels) == 0, 702 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for PIXCLK!", 703 - return -EINVAL); 704 - 705 - dpm_table->count = num_levels; 706 - 707 - for (i = 0; i < num_levels; i++) { 708 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 709 - PPCLK_PIXCLK, i, &clock) == 0, 710 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for PIXCLK!", 711 - return -EINVAL); 712 - 713 - dpm_table->dpm_levels[i].value = clock; 714 - dpm_table->dpm_levels[i].enabled = true; 715 - } 716 - 623 + if (data->smu_features[GNLD_DPM_DCEFCLK].enabled) { 624 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_PIXCLK); 625 + PP_ASSERT_WITH_CODE(!ret, 626 + "[SetupDefaultDpmTable] failed to get pixclk dpm levels!", 627 + return ret); 628 + } else 629 + dpm_table->count = 0; 717 630 vega12_init_dpm_state(&(dpm_table->dpm_state)); 718 631 632 + /* dispclk */ 719 633 dpm_table = &(data->dpm_table.display_table); 720 - 721 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, 722 - PPCLK_DISPCLK, &num_levels) == 0, 723 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DISPCLK!", 724 - return -EINVAL); 725 - 726 - dpm_table->count = num_levels; 727 - 728 - for (i = 0; i < num_levels; i++) { 729 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 730 - PPCLK_DISPCLK, i, &clock) == 0, 731 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for DISPCLK!", 732 - return -EINVAL); 733 - 734 - dpm_table->dpm_levels[i].value = clock; 735 - dpm_table->dpm_levels[i].enabled = true; 736 - } 737 - 634 + if (data->smu_features[GNLD_DPM_DCEFCLK].enabled) { 635 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_DISPCLK); 636 + PP_ASSERT_WITH_CODE(!ret, 637 + "[SetupDefaultDpmTable] failed to get dispclk dpm levels!", 638 + return ret); 639 + } else 640 + dpm_table->count = 0; 738 641 vega12_init_dpm_state(&(dpm_table->dpm_state)); 739 642 643 + /* phyclk */ 740 644 dpm_table = &(data->dpm_table.phy_table); 741 - 742 - PP_ASSERT_WITH_CODE(vega12_get_number_dpm_level(hwmgr, 743 - PPCLK_PHYCLK, &num_levels) == 0, 744 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for PHYCLK!", 745 - return -EINVAL); 746 - 747 - dpm_table->count = num_levels; 748 - 749 - for (i = 0; i < num_levels; i++) { 750 - PP_ASSERT_WITH_CODE(vega12_get_dpm_frequency_by_index(hwmgr, 751 - PPCLK_PHYCLK, i, &clock) == 0, 752 - "[SetupDefaultDPMTables] Failed to get DPM levels from SMU for PHYCLK!", 753 - return -EINVAL); 754 - 755 - dpm_table->dpm_levels[i].value = clock; 756 - dpm_table->dpm_levels[i].enabled = true; 757 - } 758 - 645 + if (data->smu_features[GNLD_DPM_DCEFCLK].enabled) { 646 + ret = vega12_setup_single_dpm_table(hwmgr, dpm_table, PPCLK_PHYCLK); 647 + PP_ASSERT_WITH_CODE(!ret, 648 + "[SetupDefaultDpmTable] failed to get phyclk dpm levels!", 649 + return ret); 650 + } else 651 + dpm_table->count = 0; 759 652 vega12_init_dpm_state(&(dpm_table->dpm_state)); 760 653 761 654 /* save a copy of the default DPM table */ ··· 734 803 data->vbios_boot_state.soc_clock = boot_up_values.ulSocClk; 735 804 data->vbios_boot_state.dcef_clock = boot_up_values.ulDCEFClk; 736 805 data->vbios_boot_state.uc_cooling_id = boot_up_values.ucCoolingID; 806 + data->vbios_boot_state.eclock = boot_up_values.ulEClk; 807 + data->vbios_boot_state.dclock = boot_up_values.ulDClk; 808 + data->vbios_boot_state.vclock = boot_up_values.ulVClk; 737 809 smum_send_msg_to_smc_with_parameter(hwmgr, 738 810 PPSMC_MSG_SetMinDeepSleepDcefclk, 739 811 (uint32_t)(data->vbios_boot_state.dcef_clock / 100)); ··· 778 844 return 0; 779 845 } 780 846 847 + static void vega12_init_powergate_state(struct pp_hwmgr *hwmgr) 848 + { 849 + struct vega12_hwmgr *data = 850 + (struct vega12_hwmgr *)(hwmgr->backend); 851 + 852 + data->uvd_power_gated = true; 853 + data->vce_power_gated = true; 854 + 855 + if (data->smu_features[GNLD_DPM_UVD].enabled) 856 + data->uvd_power_gated = false; 857 + 858 + if (data->smu_features[GNLD_DPM_VCE].enabled) 859 + data->vce_power_gated = false; 860 + } 861 + 781 862 static int vega12_enable_all_smu_features(struct pp_hwmgr *hwmgr) 782 863 { 783 864 struct vega12_hwmgr *data = ··· 811 862 enabled = (features_enabled & data->smu_features[i].smu_feature_bitmap) ? true : false; 812 863 data->smu_features[i].enabled = enabled; 813 864 data->smu_features[i].supported = enabled; 814 - PP_ASSERT( 815 - !data->smu_features[i].allowed || enabled, 816 - "[EnableAllSMUFeatures] Enabled feature is different from allowed, expected disabled!"); 817 865 } 818 866 } 867 + 868 + vega12_init_powergate_state(hwmgr); 819 869 820 870 return 0; 821 871 } ··· 871 923 return result; 872 924 } 873 925 926 + static int vega12_get_all_clock_ranges_helper(struct pp_hwmgr *hwmgr, 927 + PPCLK_e clkid, struct vega12_clock_range *clock) 928 + { 929 + /* AC Max */ 930 + PP_ASSERT_WITH_CODE( 931 + smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMaxDpmFreq, (clkid << 16)) == 0, 932 + "[GetClockRanges] Failed to get max ac clock from SMC!", 933 + return -EINVAL); 934 + vega12_read_arg_from_smc(hwmgr, &(clock->ACMax)); 935 + 936 + /* AC Min */ 937 + PP_ASSERT_WITH_CODE( 938 + smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMinDpmFreq, (clkid << 16)) == 0, 939 + "[GetClockRanges] Failed to get min ac clock from SMC!", 940 + return -EINVAL); 941 + vega12_read_arg_from_smc(hwmgr, &(clock->ACMin)); 942 + 943 + /* DC Max */ 944 + PP_ASSERT_WITH_CODE( 945 + smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetDcModeMaxDpmFreq, (clkid << 16)) == 0, 946 + "[GetClockRanges] Failed to get max dc clock from SMC!", 947 + return -EINVAL); 948 + vega12_read_arg_from_smc(hwmgr, &(clock->DCMax)); 949 + 950 + return 0; 951 + } 952 + 953 + static int vega12_get_all_clock_ranges(struct pp_hwmgr *hwmgr) 954 + { 955 + struct vega12_hwmgr *data = 956 + (struct vega12_hwmgr *)(hwmgr->backend); 957 + uint32_t i; 958 + 959 + for (i = 0; i < PPCLK_COUNT; i++) 960 + PP_ASSERT_WITH_CODE(!vega12_get_all_clock_ranges_helper(hwmgr, 961 + i, &(data->clk_range[i])), 962 + "Failed to get clk range from SMC!", 963 + return -EINVAL); 964 + 965 + return 0; 966 + } 967 + 874 968 static int vega12_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 875 969 { 876 970 int tmp_result, result = 0; ··· 939 949 PP_ASSERT_WITH_CODE(!tmp_result, 940 950 "Failed to power control set level!", 941 951 result = tmp_result); 952 + 953 + result = vega12_get_all_clock_ranges(hwmgr); 954 + PP_ASSERT_WITH_CODE(!result, 955 + "Failed to get all clock ranges!", 956 + return result); 942 957 943 958 result = vega12_odn_initialize_default_settings(hwmgr); 944 959 PP_ASSERT_WITH_CODE(!result, ··· 973 978 break; 974 979 } 975 980 981 + if (i >= table->count) { 982 + i = 0; 983 + table->dpm_levels[i].enabled = true; 984 + } 985 + 976 986 return i; 977 987 } 978 988 979 989 static uint32_t vega12_find_highest_dpm_level( 980 990 struct vega12_single_dpm_table *table) 981 991 { 982 - uint32_t i = 0; 992 + int32_t i = 0; 993 + PP_ASSERT_WITH_CODE(table->count <= MAX_REGULAR_DPM_NUMBER, 994 + "[FindHighestDPMLevel] DPM Table has too many entries!", 995 + return MAX_REGULAR_DPM_NUMBER - 1); 983 996 984 - if (table->count <= MAX_REGULAR_DPM_NUMBER) { 985 - for (i = table->count; i > 0; i--) { 986 - if (table->dpm_levels[i - 1].enabled) 987 - return i - 1; 988 - } 989 - } else { 990 - pr_info("DPM Table Has Too Many Entries!"); 991 - return MAX_REGULAR_DPM_NUMBER - 1; 997 + for (i = table->count - 1; i >= 0; i--) { 998 + if (table->dpm_levels[i].enabled) 999 + break; 992 1000 } 993 1001 994 - return i; 1002 + if (i < 0) { 1003 + i = 0; 1004 + table->dpm_levels[i].enabled = true; 1005 + } 1006 + 1007 + return (uint32_t)i; 995 1008 } 996 1009 997 1010 static int vega12_upload_dpm_min_level(struct pp_hwmgr *hwmgr) 998 1011 { 999 1012 struct vega12_hwmgr *data = hwmgr->backend; 1000 - if (data->smc_state_table.gfx_boot_level != 1001 - data->dpm_table.gfx_table.dpm_state.soft_min_level) { 1002 - smum_send_msg_to_smc_with_parameter(hwmgr, 1003 - PPSMC_MSG_SetSoftMinByFreq, 1004 - PPCLK_GFXCLK<<16 | data->dpm_table.gfx_table.dpm_levels[data->smc_state_table.gfx_boot_level].value); 1005 - data->dpm_table.gfx_table.dpm_state.soft_min_level = 1006 - data->smc_state_table.gfx_boot_level; 1013 + uint32_t min_freq; 1014 + int ret = 0; 1015 + 1016 + if (data->smu_features[GNLD_DPM_GFXCLK].enabled) { 1017 + min_freq = data->dpm_table.gfx_table.dpm_state.soft_min_level; 1018 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1019 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1020 + (PPCLK_GFXCLK << 16) | (min_freq & 0xffff))), 1021 + "Failed to set soft min gfxclk !", 1022 + return ret); 1007 1023 } 1008 1024 1009 - if (data->smc_state_table.mem_boot_level != 1010 - data->dpm_table.mem_table.dpm_state.soft_min_level) { 1011 - smum_send_msg_to_smc_with_parameter(hwmgr, 1012 - PPSMC_MSG_SetSoftMinByFreq, 1013 - PPCLK_UCLK<<16 | data->dpm_table.mem_table.dpm_levels[data->smc_state_table.mem_boot_level].value); 1014 - data->dpm_table.mem_table.dpm_state.soft_min_level = 1015 - data->smc_state_table.mem_boot_level; 1025 + if (data->smu_features[GNLD_DPM_UCLK].enabled) { 1026 + min_freq = data->dpm_table.mem_table.dpm_state.soft_min_level; 1027 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1028 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1029 + (PPCLK_UCLK << 16) | (min_freq & 0xffff))), 1030 + "Failed to set soft min memclk !", 1031 + return ret); 1032 + 1033 + min_freq = data->dpm_table.mem_table.dpm_state.hard_min_level; 1034 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1035 + hwmgr, PPSMC_MSG_SetHardMinByFreq, 1036 + (PPCLK_UCLK << 16) | (min_freq & 0xffff))), 1037 + "Failed to set hard min memclk !", 1038 + return ret); 1016 1039 } 1017 1040 1018 - return 0; 1041 + if (data->smu_features[GNLD_DPM_UVD].enabled) { 1042 + min_freq = data->dpm_table.vclk_table.dpm_state.soft_min_level; 1043 + 1044 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1045 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1046 + (PPCLK_VCLK << 16) | (min_freq & 0xffff))), 1047 + "Failed to set soft min vclk!", 1048 + return ret); 1049 + 1050 + min_freq = data->dpm_table.dclk_table.dpm_state.soft_min_level; 1051 + 1052 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1053 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1054 + (PPCLK_DCLK << 16) | (min_freq & 0xffff))), 1055 + "Failed to set soft min dclk!", 1056 + return ret); 1057 + } 1058 + 1059 + if (data->smu_features[GNLD_DPM_VCE].enabled) { 1060 + min_freq = data->dpm_table.eclk_table.dpm_state.soft_min_level; 1061 + 1062 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1063 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1064 + (PPCLK_ECLK << 16) | (min_freq & 0xffff))), 1065 + "Failed to set soft min eclk!", 1066 + return ret); 1067 + } 1068 + 1069 + if (data->smu_features[GNLD_DPM_SOCCLK].enabled) { 1070 + min_freq = data->dpm_table.soc_table.dpm_state.soft_min_level; 1071 + 1072 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1073 + hwmgr, PPSMC_MSG_SetSoftMinByFreq, 1074 + (PPCLK_SOCCLK << 16) | (min_freq & 0xffff))), 1075 + "Failed to set soft min socclk!", 1076 + return ret); 1077 + } 1078 + 1079 + return ret; 1019 1080 1020 1081 } 1021 1082 1022 1083 static int vega12_upload_dpm_max_level(struct pp_hwmgr *hwmgr) 1023 1084 { 1024 1085 struct vega12_hwmgr *data = hwmgr->backend; 1025 - if (data->smc_state_table.gfx_max_level != 1026 - data->dpm_table.gfx_table.dpm_state.soft_max_level) { 1027 - smum_send_msg_to_smc_with_parameter(hwmgr, 1028 - PPSMC_MSG_SetSoftMaxByFreq, 1029 - /* plus the vale by 1 to align the resolution */ 1030 - PPCLK_GFXCLK<<16 | (data->dpm_table.gfx_table.dpm_levels[data->smc_state_table.gfx_max_level].value + 1)); 1031 - data->dpm_table.gfx_table.dpm_state.soft_max_level = 1032 - data->smc_state_table.gfx_max_level; 1086 + uint32_t max_freq; 1087 + int ret = 0; 1088 + 1089 + if (data->smu_features[GNLD_DPM_GFXCLK].enabled) { 1090 + max_freq = data->dpm_table.gfx_table.dpm_state.soft_max_level; 1091 + 1092 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1093 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1094 + (PPCLK_GFXCLK << 16) | (max_freq & 0xffff))), 1095 + "Failed to set soft max gfxclk!", 1096 + return ret); 1033 1097 } 1034 1098 1035 - if (data->smc_state_table.mem_max_level != 1036 - data->dpm_table.mem_table.dpm_state.soft_max_level) { 1037 - smum_send_msg_to_smc_with_parameter(hwmgr, 1038 - PPSMC_MSG_SetSoftMaxByFreq, 1039 - /* plus the vale by 1 to align the resolution */ 1040 - PPCLK_UCLK<<16 | (data->dpm_table.mem_table.dpm_levels[data->smc_state_table.mem_max_level].value + 1)); 1041 - data->dpm_table.mem_table.dpm_state.soft_max_level = 1042 - data->smc_state_table.mem_max_level; 1099 + if (data->smu_features[GNLD_DPM_UCLK].enabled) { 1100 + max_freq = data->dpm_table.mem_table.dpm_state.soft_max_level; 1101 + 1102 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1103 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1104 + (PPCLK_UCLK << 16) | (max_freq & 0xffff))), 1105 + "Failed to set soft max memclk!", 1106 + return ret); 1043 1107 } 1044 1108 1045 - return 0; 1109 + if (data->smu_features[GNLD_DPM_UVD].enabled) { 1110 + max_freq = data->dpm_table.vclk_table.dpm_state.soft_max_level; 1111 + 1112 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1113 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1114 + (PPCLK_VCLK << 16) | (max_freq & 0xffff))), 1115 + "Failed to set soft max vclk!", 1116 + return ret); 1117 + 1118 + max_freq = data->dpm_table.dclk_table.dpm_state.soft_max_level; 1119 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1120 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1121 + (PPCLK_DCLK << 16) | (max_freq & 0xffff))), 1122 + "Failed to set soft max dclk!", 1123 + return ret); 1124 + } 1125 + 1126 + if (data->smu_features[GNLD_DPM_VCE].enabled) { 1127 + max_freq = data->dpm_table.eclk_table.dpm_state.soft_max_level; 1128 + 1129 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1130 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1131 + (PPCLK_ECLK << 16) | (max_freq & 0xffff))), 1132 + "Failed to set soft max eclk!", 1133 + return ret); 1134 + } 1135 + 1136 + if (data->smu_features[GNLD_DPM_SOCCLK].enabled) { 1137 + max_freq = data->dpm_table.soc_table.dpm_state.soft_max_level; 1138 + 1139 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter( 1140 + hwmgr, PPSMC_MSG_SetSoftMaxByFreq, 1141 + (PPCLK_SOCCLK << 16) | (max_freq & 0xffff))), 1142 + "Failed to set soft max socclk!", 1143 + return ret); 1144 + } 1145 + 1146 + return ret; 1046 1147 } 1047 1148 1048 1149 int vega12_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable) ··· 1227 1136 1228 1137 *gfx_freq = 0; 1229 1138 1230 - PP_ASSERT_WITH_CODE( 1231 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK << 16)) == 0, 1139 + PP_ASSERT_WITH_CODE(smum_send_msg_to_smc_with_parameter(hwmgr, 1140 + PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK << 16)) == 0, 1232 1141 "[GetCurrentGfxClkFreq] Attempt to get Current GFXCLK Frequency Failed!", 1233 1142 return -1); 1234 1143 PP_ASSERT_WITH_CODE( ··· 1397 1306 (struct vega12_hwmgr *)(hwmgr->backend); 1398 1307 struct PP_Clocks min_clocks = {0}; 1399 1308 struct pp_display_clock_request clock_req; 1400 - uint32_t clk_request; 1401 1309 1402 - if (hwmgr->display_config->num_display > 1) 1310 + if ((hwmgr->display_config->num_display > 1) && 1311 + !hwmgr->display_config->multi_monitor_in_sync) 1403 1312 vega12_notify_smc_display_change(hwmgr, false); 1404 1313 else 1405 1314 vega12_notify_smc_display_change(hwmgr, true); ··· 1424 1333 } 1425 1334 } 1426 1335 1427 - if (data->smu_features[GNLD_DPM_UCLK].enabled) { 1428 - clk_request = (PPCLK_UCLK << 16) | (min_clocks.memoryClock) / 100; 1429 - PP_ASSERT_WITH_CODE( 1430 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetHardMinByFreq, clk_request) == 0, 1431 - "[PhwVega12_NotifySMCDisplayConfigAfterPowerStateAdjustment] Attempt to set UCLK HardMin Failed!", 1432 - return -1); 1433 - data->dpm_table.mem_table.dpm_state.hard_min_level = min_clocks.memoryClock; 1434 - } 1435 - 1436 1336 return 0; 1437 1337 } 1438 1338 ··· 1432 1350 struct vega12_hwmgr *data = 1433 1351 (struct vega12_hwmgr *)(hwmgr->backend); 1434 1352 1435 - data->smc_state_table.gfx_boot_level = 1436 - data->smc_state_table.gfx_max_level = 1437 - vega12_find_highest_dpm_level(&(data->dpm_table.gfx_table)); 1438 - data->smc_state_table.mem_boot_level = 1439 - data->smc_state_table.mem_max_level = 1440 - vega12_find_highest_dpm_level(&(data->dpm_table.mem_table)); 1353 + uint32_t soft_level; 1354 + 1355 + soft_level = vega12_find_highest_dpm_level(&(data->dpm_table.gfx_table)); 1356 + 1357 + data->dpm_table.gfx_table.dpm_state.soft_min_level = 1358 + data->dpm_table.gfx_table.dpm_state.soft_max_level = 1359 + data->dpm_table.gfx_table.dpm_levels[soft_level].value; 1360 + 1361 + soft_level = vega12_find_highest_dpm_level(&(data->dpm_table.mem_table)); 1362 + 1363 + data->dpm_table.mem_table.dpm_state.soft_min_level = 1364 + data->dpm_table.mem_table.dpm_state.soft_max_level = 1365 + data->dpm_table.mem_table.dpm_levels[soft_level].value; 1441 1366 1442 1367 PP_ASSERT_WITH_CODE(!vega12_upload_dpm_min_level(hwmgr), 1443 1368 "Failed to upload boot level to highest!", ··· 1461 1372 { 1462 1373 struct vega12_hwmgr *data = 1463 1374 (struct vega12_hwmgr *)(hwmgr->backend); 1375 + uint32_t soft_level; 1464 1376 1465 - data->smc_state_table.gfx_boot_level = 1466 - data->smc_state_table.gfx_max_level = 1467 - vega12_find_lowest_dpm_level(&(data->dpm_table.gfx_table)); 1468 - data->smc_state_table.mem_boot_level = 1469 - data->smc_state_table.mem_max_level = 1470 - vega12_find_lowest_dpm_level(&(data->dpm_table.mem_table)); 1377 + soft_level = vega12_find_lowest_dpm_level(&(data->dpm_table.gfx_table)); 1378 + 1379 + data->dpm_table.gfx_table.dpm_state.soft_min_level = 1380 + data->dpm_table.gfx_table.dpm_state.soft_max_level = 1381 + data->dpm_table.gfx_table.dpm_levels[soft_level].value; 1382 + 1383 + soft_level = vega12_find_lowest_dpm_level(&(data->dpm_table.mem_table)); 1384 + 1385 + data->dpm_table.mem_table.dpm_state.soft_min_level = 1386 + data->dpm_table.mem_table.dpm_state.soft_max_level = 1387 + data->dpm_table.mem_table.dpm_levels[soft_level].value; 1471 1388 1472 1389 PP_ASSERT_WITH_CODE(!vega12_upload_dpm_min_level(hwmgr), 1473 1390 "Failed to upload boot level to highest!", ··· 1489 1394 1490 1395 static int vega12_unforce_dpm_levels(struct pp_hwmgr *hwmgr) 1491 1396 { 1492 - struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1493 - 1494 - data->smc_state_table.gfx_boot_level = 1495 - vega12_find_lowest_dpm_level(&(data->dpm_table.gfx_table)); 1496 - data->smc_state_table.gfx_max_level = 1497 - vega12_find_highest_dpm_level(&(data->dpm_table.gfx_table)); 1498 - data->smc_state_table.mem_boot_level = 1499 - vega12_find_lowest_dpm_level(&(data->dpm_table.mem_table)); 1500 - data->smc_state_table.mem_max_level = 1501 - vega12_find_highest_dpm_level(&(data->dpm_table.mem_table)); 1502 - 1503 1397 PP_ASSERT_WITH_CODE(!vega12_upload_dpm_min_level(hwmgr), 1504 1398 "Failed to upload DPM Bootup Levels!", 1505 1399 return -1); ··· 1496 1412 PP_ASSERT_WITH_CODE(!vega12_upload_dpm_max_level(hwmgr), 1497 1413 "Failed to upload DPM Max Levels!", 1498 1414 return -1); 1415 + 1499 1416 return 0; 1500 1417 } 1501 1418 1502 - #if 0 1503 1419 static int vega12_get_profiling_clk_mask(struct pp_hwmgr *hwmgr, enum amd_dpm_forced_level level, 1504 1420 uint32_t *sclk_mask, uint32_t *mclk_mask, uint32_t *soc_mask) 1505 1421 { 1506 - struct phm_ppt_v2_information *table_info = 1507 - (struct phm_ppt_v2_information *)(hwmgr->pptable); 1422 + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1423 + struct vega12_single_dpm_table *gfx_dpm_table = &(data->dpm_table.gfx_table); 1424 + struct vega12_single_dpm_table *mem_dpm_table = &(data->dpm_table.mem_table); 1425 + struct vega12_single_dpm_table *soc_dpm_table = &(data->dpm_table.soc_table); 1508 1426 1509 - if (table_info->vdd_dep_on_sclk->count > VEGA12_UMD_PSTATE_GFXCLK_LEVEL && 1510 - table_info->vdd_dep_on_socclk->count > VEGA12_UMD_PSTATE_SOCCLK_LEVEL && 1511 - table_info->vdd_dep_on_mclk->count > VEGA12_UMD_PSTATE_MCLK_LEVEL) { 1427 + *sclk_mask = 0; 1428 + *mclk_mask = 0; 1429 + *soc_mask = 0; 1430 + 1431 + if (gfx_dpm_table->count > VEGA12_UMD_PSTATE_GFXCLK_LEVEL && 1432 + mem_dpm_table->count > VEGA12_UMD_PSTATE_MCLK_LEVEL && 1433 + soc_dpm_table->count > VEGA12_UMD_PSTATE_SOCCLK_LEVEL) { 1512 1434 *sclk_mask = VEGA12_UMD_PSTATE_GFXCLK_LEVEL; 1513 - *soc_mask = VEGA12_UMD_PSTATE_SOCCLK_LEVEL; 1514 1435 *mclk_mask = VEGA12_UMD_PSTATE_MCLK_LEVEL; 1436 + *soc_mask = VEGA12_UMD_PSTATE_SOCCLK_LEVEL; 1515 1437 } 1516 1438 1517 1439 if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) { ··· 1525 1435 } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) { 1526 1436 *mclk_mask = 0; 1527 1437 } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 1528 - *sclk_mask = table_info->vdd_dep_on_sclk->count - 1; 1529 - *soc_mask = table_info->vdd_dep_on_socclk->count - 1; 1530 - *mclk_mask = table_info->vdd_dep_on_mclk->count - 1; 1438 + *sclk_mask = gfx_dpm_table->count - 1; 1439 + *mclk_mask = mem_dpm_table->count - 1; 1440 + *soc_mask = soc_dpm_table->count - 1; 1531 1441 } 1442 + 1532 1443 return 0; 1533 1444 } 1534 - #endif 1535 1445 1536 1446 static void vega12_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode) 1537 1447 { ··· 1555 1465 enum amd_dpm_forced_level level) 1556 1466 { 1557 1467 int ret = 0; 1558 - #if 0 1559 1468 uint32_t sclk_mask = 0; 1560 1469 uint32_t mclk_mask = 0; 1561 1470 uint32_t soc_mask = 0; 1562 - #endif 1563 1471 1564 1472 switch (level) { 1565 1473 case AMD_DPM_FORCED_LEVEL_HIGH: ··· 1573 1485 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK: 1574 1486 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK: 1575 1487 case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: 1576 - #if 0 1577 1488 ret = vega12_get_profiling_clk_mask(hwmgr, level, &sclk_mask, &mclk_mask, &soc_mask); 1578 1489 if (ret) 1579 1490 return ret; 1580 - vega12_force_clock_level(hwmgr, PP_SCLK, 1<<sclk_mask); 1581 - vega12_force_clock_level(hwmgr, PP_MCLK, 1<<mclk_mask); 1582 - #endif 1491 + vega12_force_clock_level(hwmgr, PP_SCLK, 1 << sclk_mask); 1492 + vega12_force_clock_level(hwmgr, PP_MCLK, 1 << mclk_mask); 1583 1493 break; 1584 1494 case AMD_DPM_FORCED_LEVEL_MANUAL: 1585 1495 case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT: 1586 1496 default: 1587 1497 break; 1588 1498 } 1589 - #if 0 1590 - if (!ret) { 1591 - if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK && hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) 1592 - vega12_set_fan_control_mode(hwmgr, AMD_FAN_CTRL_NONE); 1593 - else if (level != AMD_DPM_FORCED_LEVEL_PROFILE_PEAK && hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) 1594 - vega12_set_fan_control_mode(hwmgr, AMD_FAN_CTRL_AUTO); 1595 - } 1596 - #endif 1499 + 1597 1500 return ret; 1598 1501 } 1599 1502 ··· 1618 1539 PPCLK_e clock_select, 1619 1540 bool max) 1620 1541 { 1621 - int result; 1622 - *clock = 0; 1542 + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1623 1543 1624 - if (max) { 1625 - PP_ASSERT_WITH_CODE( 1626 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMaxDpmFreq, (clock_select << 16)) == 0, 1627 - "[GetClockRanges] Failed to get max clock from SMC!", 1628 - return -1); 1629 - result = vega12_read_arg_from_smc(hwmgr, clock); 1630 - } else { 1631 - PP_ASSERT_WITH_CODE( 1632 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMinDpmFreq, (clock_select << 16)) == 0, 1633 - "[GetClockRanges] Failed to get min clock from SMC!", 1634 - return -1); 1635 - result = vega12_read_arg_from_smc(hwmgr, clock); 1636 - } 1544 + if (max) 1545 + *clock = data->clk_range[clock_select].ACMax; 1546 + else 1547 + *clock = data->clk_range[clock_select].ACMin; 1637 1548 1638 - return result; 1549 + return 0; 1639 1550 } 1640 1551 1641 1552 static int vega12_get_sclks(struct pp_hwmgr *hwmgr, ··· 1640 1571 return -1; 1641 1572 1642 1573 dpm_table = &(data->dpm_table.gfx_table); 1643 - ucount = (dpm_table->count > VG12_PSUEDO_NUM_GFXCLK_DPM_LEVELS) ? 1644 - VG12_PSUEDO_NUM_GFXCLK_DPM_LEVELS : dpm_table->count; 1574 + ucount = (dpm_table->count > MAX_NUM_CLOCKS) ? 1575 + MAX_NUM_CLOCKS : dpm_table->count; 1645 1576 1646 1577 for (i = 0; i < ucount; i++) { 1647 1578 clocks->data[i].clocks_in_khz = 1648 - dpm_table->dpm_levels[i].value * 100; 1579 + dpm_table->dpm_levels[i].value * 1000; 1649 1580 1650 1581 clocks->data[i].latency_in_us = 0; 1651 1582 } ··· 1672 1603 return -1; 1673 1604 1674 1605 dpm_table = &(data->dpm_table.mem_table); 1675 - ucount = (dpm_table->count > VG12_PSUEDO_NUM_UCLK_DPM_LEVELS) ? 1676 - VG12_PSUEDO_NUM_UCLK_DPM_LEVELS : dpm_table->count; 1606 + ucount = (dpm_table->count > MAX_NUM_CLOCKS) ? 1607 + MAX_NUM_CLOCKS : dpm_table->count; 1677 1608 1678 1609 for (i = 0; i < ucount; i++) { 1679 - clocks->data[i].clocks_in_khz = 1680 - dpm_table->dpm_levels[i].value * 100; 1681 - 1610 + clocks->data[i].clocks_in_khz = dpm_table->dpm_levels[i].value * 1000; 1611 + data->mclk_latency_table.entries[i].frequency = dpm_table->dpm_levels[i].value * 100; 1682 1612 clocks->data[i].latency_in_us = 1683 1613 data->mclk_latency_table.entries[i].latency = 1684 1614 vega12_get_mem_latency(hwmgr, dpm_table->dpm_levels[i].value); ··· 1701 1633 1702 1634 1703 1635 dpm_table = &(data->dpm_table.dcef_table); 1704 - ucount = (dpm_table->count > VG12_PSUEDO_NUM_DCEFCLK_DPM_LEVELS) ? 1705 - VG12_PSUEDO_NUM_DCEFCLK_DPM_LEVELS : dpm_table->count; 1636 + ucount = (dpm_table->count > MAX_NUM_CLOCKS) ? 1637 + MAX_NUM_CLOCKS : dpm_table->count; 1706 1638 1707 1639 for (i = 0; i < ucount; i++) { 1708 1640 clocks->data[i].clocks_in_khz = 1709 - dpm_table->dpm_levels[i].value * 100; 1641 + dpm_table->dpm_levels[i].value * 1000; 1710 1642 1711 1643 clocks->data[i].latency_in_us = 0; 1712 1644 } ··· 1729 1661 1730 1662 1731 1663 dpm_table = &(data->dpm_table.soc_table); 1732 - ucount = (dpm_table->count > VG12_PSUEDO_NUM_SOCCLK_DPM_LEVELS) ? 1733 - VG12_PSUEDO_NUM_SOCCLK_DPM_LEVELS : dpm_table->count; 1664 + ucount = (dpm_table->count > MAX_NUM_CLOCKS) ? 1665 + MAX_NUM_CLOCKS : dpm_table->count; 1734 1666 1735 1667 for (i = 0; i < ucount; i++) { 1736 1668 clocks->data[i].clocks_in_khz = 1737 - dpm_table->dpm_levels[i].value * 100; 1669 + dpm_table->dpm_levels[i].value * 1000; 1738 1670 1739 1671 clocks->data[i].latency_in_us = 0; 1740 1672 } ··· 1781 1713 } 1782 1714 1783 1715 static int vega12_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr, 1784 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges) 1716 + void *clock_ranges) 1785 1717 { 1786 1718 struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1787 1719 Watermarks_t *table = &(data->smc_state_table.water_marks_table); 1788 - int result = 0; 1789 - uint32_t i; 1720 + struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges = clock_ranges; 1790 1721 1791 1722 if (!data->registry_data.disable_water_mark && 1792 1723 data->smu_features[GNLD_DPM_DCEFCLK].supported && 1793 1724 data->smu_features[GNLD_DPM_SOCCLK].supported) { 1794 - for (i = 0; i < wm_with_clock_ranges->num_wm_sets_dmif; i++) { 1795 - table->WatermarkRow[WM_DCEFCLK][i].MinClock = 1796 - cpu_to_le16((uint16_t) 1797 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_min_dcefclk_in_khz) / 1798 - 100); 1799 - table->WatermarkRow[WM_DCEFCLK][i].MaxClock = 1800 - cpu_to_le16((uint16_t) 1801 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_max_dcefclk_in_khz) / 1802 - 100); 1803 - table->WatermarkRow[WM_DCEFCLK][i].MinUclk = 1804 - cpu_to_le16((uint16_t) 1805 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_min_memclk_in_khz) / 1806 - 100); 1807 - table->WatermarkRow[WM_DCEFCLK][i].MaxUclk = 1808 - cpu_to_le16((uint16_t) 1809 - (wm_with_clock_ranges->wm_sets_dmif[i].wm_max_memclk_in_khz) / 1810 - 100); 1811 - table->WatermarkRow[WM_DCEFCLK][i].WmSetting = (uint8_t) 1812 - wm_with_clock_ranges->wm_sets_dmif[i].wm_set_id; 1813 - } 1814 - 1815 - for (i = 0; i < wm_with_clock_ranges->num_wm_sets_mcif; i++) { 1816 - table->WatermarkRow[WM_SOCCLK][i].MinClock = 1817 - cpu_to_le16((uint16_t) 1818 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_min_socclk_in_khz) / 1819 - 100); 1820 - table->WatermarkRow[WM_SOCCLK][i].MaxClock = 1821 - cpu_to_le16((uint16_t) 1822 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_max_socclk_in_khz) / 1823 - 100); 1824 - table->WatermarkRow[WM_SOCCLK][i].MinUclk = 1825 - cpu_to_le16((uint16_t) 1826 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_min_memclk_in_khz) / 1827 - 100); 1828 - table->WatermarkRow[WM_SOCCLK][i].MaxUclk = 1829 - cpu_to_le16((uint16_t) 1830 - (wm_with_clock_ranges->wm_sets_mcif[i].wm_max_memclk_in_khz) / 1831 - 100); 1832 - table->WatermarkRow[WM_SOCCLK][i].WmSetting = (uint8_t) 1833 - wm_with_clock_ranges->wm_sets_mcif[i].wm_set_id; 1834 - } 1725 + smu_set_watermarks_for_clocks_ranges(table, wm_with_clock_ranges); 1835 1726 data->water_marks_bitmap |= WaterMarksExist; 1836 1727 data->water_marks_bitmap &= ~WaterMarksLoaded; 1837 1728 } 1838 1729 1839 - return result; 1730 + return 0; 1840 1731 } 1841 1732 1842 1733 static int vega12_force_clock_level(struct pp_hwmgr *hwmgr, 1843 1734 enum pp_clock_type type, uint32_t mask) 1844 1735 { 1845 1736 struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1846 - 1847 - if (hwmgr->request_dpm_level & (AMD_DPM_FORCED_LEVEL_AUTO | 1848 - AMD_DPM_FORCED_LEVEL_LOW | 1849 - AMD_DPM_FORCED_LEVEL_HIGH)) 1850 - return -EINVAL; 1737 + uint32_t soft_min_level, soft_max_level; 1738 + int ret = 0; 1851 1739 1852 1740 switch (type) { 1853 1741 case PP_SCLK: 1854 - data->smc_state_table.gfx_boot_level = mask ? (ffs(mask) - 1) : 0; 1855 - data->smc_state_table.gfx_max_level = mask ? (fls(mask) - 1) : 0; 1742 + soft_min_level = mask ? (ffs(mask) - 1) : 0; 1743 + soft_max_level = mask ? (fls(mask) - 1) : 0; 1856 1744 1857 - PP_ASSERT_WITH_CODE(!vega12_upload_dpm_min_level(hwmgr), 1745 + data->dpm_table.gfx_table.dpm_state.soft_min_level = 1746 + data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; 1747 + data->dpm_table.gfx_table.dpm_state.soft_max_level = 1748 + data->dpm_table.gfx_table.dpm_levels[soft_max_level].value; 1749 + 1750 + ret = vega12_upload_dpm_min_level(hwmgr); 1751 + PP_ASSERT_WITH_CODE(!ret, 1858 1752 "Failed to upload boot level to lowest!", 1859 - return -EINVAL); 1753 + return ret); 1860 1754 1861 - PP_ASSERT_WITH_CODE(!vega12_upload_dpm_max_level(hwmgr), 1755 + ret = vega12_upload_dpm_max_level(hwmgr); 1756 + PP_ASSERT_WITH_CODE(!ret, 1862 1757 "Failed to upload dpm max level to highest!", 1863 - return -EINVAL); 1758 + return ret); 1864 1759 break; 1865 1760 1866 1761 case PP_MCLK: 1867 - data->smc_state_table.mem_boot_level = mask ? (ffs(mask) - 1) : 0; 1868 - data->smc_state_table.mem_max_level = mask ? (fls(mask) - 1) : 0; 1762 + soft_min_level = mask ? (ffs(mask) - 1) : 0; 1763 + soft_max_level = mask ? (fls(mask) - 1) : 0; 1869 1764 1870 - PP_ASSERT_WITH_CODE(!vega12_upload_dpm_min_level(hwmgr), 1765 + data->dpm_table.mem_table.dpm_state.soft_min_level = 1766 + data->dpm_table.mem_table.dpm_levels[soft_min_level].value; 1767 + data->dpm_table.mem_table.dpm_state.soft_max_level = 1768 + data->dpm_table.mem_table.dpm_levels[soft_max_level].value; 1769 + 1770 + ret = vega12_upload_dpm_min_level(hwmgr); 1771 + PP_ASSERT_WITH_CODE(!ret, 1871 1772 "Failed to upload boot level to lowest!", 1872 - return -EINVAL); 1773 + return ret); 1873 1774 1874 - PP_ASSERT_WITH_CODE(!vega12_upload_dpm_max_level(hwmgr), 1775 + ret = vega12_upload_dpm_max_level(hwmgr); 1776 + PP_ASSERT_WITH_CODE(!ret, 1875 1777 "Failed to upload dpm max level to highest!", 1876 - return -EINVAL); 1778 + return ret); 1877 1779 1878 1780 break; 1879 1781 ··· 1876 1838 return -1); 1877 1839 for (i = 0; i < clocks.num_levels; i++) 1878 1840 size += sprintf(buf + size, "%d: %uMhz %s\n", 1879 - i, clocks.data[i].clocks_in_khz / 100, 1880 - (clocks.data[i].clocks_in_khz == now) ? "*" : ""); 1841 + i, clocks.data[i].clocks_in_khz / 1000, 1842 + (clocks.data[i].clocks_in_khz / 1000 == now) ? "*" : ""); 1881 1843 break; 1882 1844 1883 1845 case PP_MCLK: ··· 1892 1854 return -1); 1893 1855 for (i = 0; i < clocks.num_levels; i++) 1894 1856 size += sprintf(buf + size, "%d: %uMhz %s\n", 1895 - i, clocks.data[i].clocks_in_khz / 100, 1896 - (clocks.data[i].clocks_in_khz == now) ? "*" : ""); 1857 + i, clocks.data[i].clocks_in_khz / 1000, 1858 + (clocks.data[i].clocks_in_khz / 1000 == now) ? "*" : ""); 1897 1859 break; 1898 1860 1899 1861 case PP_PCIE: ··· 1903 1865 break; 1904 1866 } 1905 1867 return size; 1868 + } 1869 + 1870 + static int vega12_apply_clocks_adjust_rules(struct pp_hwmgr *hwmgr) 1871 + { 1872 + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1873 + struct vega12_single_dpm_table *dpm_table; 1874 + bool vblank_too_short = false; 1875 + bool disable_mclk_switching; 1876 + uint32_t i, latency; 1877 + 1878 + disable_mclk_switching = ((1 < hwmgr->display_config->num_display) && 1879 + !hwmgr->display_config->multi_monitor_in_sync) || 1880 + vblank_too_short; 1881 + latency = hwmgr->display_config->dce_tolerable_mclk_in_active_latency; 1882 + 1883 + /* gfxclk */ 1884 + dpm_table = &(data->dpm_table.gfx_table); 1885 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1886 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1887 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 1888 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1889 + 1890 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 1891 + if (VEGA12_UMD_PSTATE_GFXCLK_LEVEL < dpm_table->count) { 1892 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_GFXCLK_LEVEL].value; 1893 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_GFXCLK_LEVEL].value; 1894 + } 1895 + 1896 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) { 1897 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1898 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[0].value; 1899 + } 1900 + 1901 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 1902 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1903 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1904 + } 1905 + } 1906 + 1907 + /* memclk */ 1908 + dpm_table = &(data->dpm_table.mem_table); 1909 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1910 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1911 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 1912 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1913 + 1914 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 1915 + if (VEGA12_UMD_PSTATE_MCLK_LEVEL < dpm_table->count) { 1916 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_MCLK_LEVEL].value; 1917 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_MCLK_LEVEL].value; 1918 + } 1919 + 1920 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) { 1921 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1922 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[0].value; 1923 + } 1924 + 1925 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 1926 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1927 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1928 + } 1929 + } 1930 + 1931 + /* honour DAL's UCLK Hardmin */ 1932 + if (dpm_table->dpm_state.hard_min_level < (hwmgr->display_config->min_mem_set_clock / 100)) 1933 + dpm_table->dpm_state.hard_min_level = hwmgr->display_config->min_mem_set_clock / 100; 1934 + 1935 + /* Hardmin is dependent on displayconfig */ 1936 + if (disable_mclk_switching) { 1937 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1938 + for (i = 0; i < data->mclk_latency_table.count - 1; i++) { 1939 + if (data->mclk_latency_table.entries[i].latency <= latency) { 1940 + if (dpm_table->dpm_levels[i].value >= (hwmgr->display_config->min_mem_set_clock / 100)) { 1941 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[i].value; 1942 + break; 1943 + } 1944 + } 1945 + } 1946 + } 1947 + 1948 + if (hwmgr->display_config->nb_pstate_switch_disable) 1949 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1950 + 1951 + /* vclk */ 1952 + dpm_table = &(data->dpm_table.vclk_table); 1953 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1954 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1955 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 1956 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1957 + 1958 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 1959 + if (VEGA12_UMD_PSTATE_UVDCLK_LEVEL < dpm_table->count) { 1960 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_UVDCLK_LEVEL].value; 1961 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_UVDCLK_LEVEL].value; 1962 + } 1963 + 1964 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 1965 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1966 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1967 + } 1968 + } 1969 + 1970 + /* dclk */ 1971 + dpm_table = &(data->dpm_table.dclk_table); 1972 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1973 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1974 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 1975 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1976 + 1977 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 1978 + if (VEGA12_UMD_PSTATE_UVDCLK_LEVEL < dpm_table->count) { 1979 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_UVDCLK_LEVEL].value; 1980 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_UVDCLK_LEVEL].value; 1981 + } 1982 + 1983 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 1984 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1985 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1986 + } 1987 + } 1988 + 1989 + /* socclk */ 1990 + dpm_table = &(data->dpm_table.soc_table); 1991 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 1992 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1993 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 1994 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 1995 + 1996 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 1997 + if (VEGA12_UMD_PSTATE_SOCCLK_LEVEL < dpm_table->count) { 1998 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_SOCCLK_LEVEL].value; 1999 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_SOCCLK_LEVEL].value; 2000 + } 2001 + 2002 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 2003 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2004 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2005 + } 2006 + } 2007 + 2008 + /* eclk */ 2009 + dpm_table = &(data->dpm_table.eclk_table); 2010 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value; 2011 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2012 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value; 2013 + dpm_table->dpm_state.hard_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2014 + 2015 + if (PP_CAP(PHM_PlatformCaps_UMDPState)) { 2016 + if (VEGA12_UMD_PSTATE_VCEMCLK_LEVEL < dpm_table->count) { 2017 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_VCEMCLK_LEVEL].value; 2018 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[VEGA12_UMD_PSTATE_VCEMCLK_LEVEL].value; 2019 + } 2020 + 2021 + if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) { 2022 + dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2023 + dpm_table->dpm_state.soft_max_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2024 + } 2025 + } 2026 + 2027 + return 0; 2028 + } 2029 + 2030 + static int vega12_set_uclk_to_highest_dpm_level(struct pp_hwmgr *hwmgr, 2031 + struct vega12_single_dpm_table *dpm_table) 2032 + { 2033 + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 2034 + int ret = 0; 2035 + 2036 + if (data->smu_features[GNLD_DPM_UCLK].enabled) { 2037 + PP_ASSERT_WITH_CODE(dpm_table->count > 0, 2038 + "[SetUclkToHightestDpmLevel] Dpm table has no entry!", 2039 + return -EINVAL); 2040 + PP_ASSERT_WITH_CODE(dpm_table->count <= NUM_UCLK_DPM_LEVELS, 2041 + "[SetUclkToHightestDpmLevel] Dpm table has too many entries!", 2042 + return -EINVAL); 2043 + 2044 + dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value; 2045 + PP_ASSERT_WITH_CODE(!(ret = smum_send_msg_to_smc_with_parameter(hwmgr, 2046 + PPSMC_MSG_SetHardMinByFreq, 2047 + (PPCLK_UCLK << 16 ) | dpm_table->dpm_state.hard_min_level)), 2048 + "[SetUclkToHightestDpmLevel] Set hard min uclk failed!", 2049 + return ret); 2050 + } 2051 + 2052 + return ret; 2053 + } 2054 + 2055 + static int vega12_pre_display_configuration_changed_task(struct pp_hwmgr *hwmgr) 2056 + { 2057 + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 2058 + int ret = 0; 2059 + 2060 + smum_send_msg_to_smc_with_parameter(hwmgr, 2061 + PPSMC_MSG_NumOfDisplays, 0); 2062 + 2063 + ret = vega12_set_uclk_to_highest_dpm_level(hwmgr, 2064 + &data->dpm_table.mem_table); 2065 + 2066 + return ret; 1906 2067 } 1907 2068 1908 2069 static int vega12_display_configuration_changed_task(struct pp_hwmgr *hwmgr) ··· 2148 1911 { 2149 1912 struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 2150 1913 1914 + if (data->vce_power_gated == bgate) 1915 + return; 1916 + 2151 1917 data->vce_power_gated = bgate; 2152 1918 vega12_enable_disable_vce_dpm(hwmgr, !bgate); 2153 1919 } ··· 2158 1918 static void vega12_power_gate_uvd(struct pp_hwmgr *hwmgr, bool bgate) 2159 1919 { 2160 1920 struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); 1921 + 1922 + if (data->uvd_power_gated == bgate) 1923 + return; 2161 1924 2162 1925 data->uvd_power_gated = bgate; 2163 1926 vega12_enable_disable_uvd_dpm(hwmgr, !bgate); ··· 2356 2113 .display_clock_voltage_request = vega12_display_clock_voltage_request, 2357 2114 .force_clock_level = vega12_force_clock_level, 2358 2115 .print_clock_levels = vega12_print_clock_levels, 2116 + .apply_clocks_adjust_rules = 2117 + vega12_apply_clocks_adjust_rules, 2118 + .pre_display_config_changed = 2119 + vega12_pre_display_configuration_changed_task, 2359 2120 .display_config_changed = vega12_display_configuration_changed_task, 2360 2121 .powergate_uvd = vega12_power_gate_uvd, 2361 2122 .powergate_vce = vega12_power_gate_vce,
+13
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
··· 167 167 uint32_t mem_clock; 168 168 uint32_t soc_clock; 169 169 uint32_t dcef_clock; 170 + uint32_t eclock; 171 + uint32_t dclock; 172 + uint32_t vclock; 170 173 }; 171 174 172 175 #define DPMTABLE_OD_UPDATE_SCLK 0x00000001 ··· 304 301 bool force_fan_pwm; 305 302 }; 306 303 304 + struct vega12_clock_range { 305 + uint32_t ACMax; 306 + uint32_t ACMin; 307 + uint32_t DCMax; 308 + }; 309 + 307 310 struct vega12_hwmgr { 308 311 struct vega12_dpm_table dpm_table; 309 312 struct vega12_dpm_table golden_dpm_table; ··· 391 382 uint32_t smu_version; 392 383 struct smu_features smu_features[GNLD_FEATURES_MAX]; 393 384 struct vega12_smc_state_table smc_state_table; 385 + 386 + struct vega12_clock_range clk_range[PPCLK_COUNT]; 394 387 }; 395 388 396 389 #define VEGA12_DPM2_NEAR_TDP_DEC 10 ··· 443 432 #define VEGA12_UMD_PSTATE_GFXCLK_LEVEL 0x3 444 433 #define VEGA12_UMD_PSTATE_SOCCLK_LEVEL 0x3 445 434 #define VEGA12_UMD_PSTATE_MCLK_LEVEL 0x2 435 + #define VEGA12_UMD_PSTATE_UVDCLK_LEVEL 0x3 436 + #define VEGA12_UMD_PSTATE_VCEMCLK_LEVEL 0x3 446 437 447 438 int vega12_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable); 448 439
+1 -5
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_processpptables.c
··· 224 224 ppsmc_pptable->AcgGfxclkSpreadPercent = smc_dpm_table.acggfxclkspreadpercent; 225 225 ppsmc_pptable->AcgGfxclkSpreadFreq = smc_dpm_table.acggfxclkspreadfreq; 226 226 227 - /* 0xFFFF will disable the ACG feature */ 228 - if (!(hwmgr->feature_mask & PP_ACG_MASK)) { 229 - ppsmc_pptable->AcgThresholdFreqHigh = 0xFFFF; 230 - ppsmc_pptable->AcgThresholdFreqLow = 0xFFFF; 231 - } 227 + ppsmc_pptable->Vr2_I2C_address = smc_dpm_table.Vr2_I2C_address; 232 228 233 229 return 0; 234 230 }
+1 -1
drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
··· 455 455 enum amd_pp_clock_type type, 456 456 struct pp_clock_levels_with_voltage *clocks); 457 457 extern int phm_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr, 458 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); 458 + void *clock_ranges); 459 459 extern int phm_display_clock_voltage_request(struct pp_hwmgr *hwmgr, 460 460 struct pp_display_clock_request *clock); 461 461
+3 -4
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
··· 293 293 int (*get_clock_by_type_with_voltage)(struct pp_hwmgr *hwmgr, 294 294 enum amd_pp_clock_type type, 295 295 struct pp_clock_levels_with_voltage *clocks); 296 - int (*set_watermarks_for_clocks_ranges)(struct pp_hwmgr *hwmgr, 297 - struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); 296 + int (*set_watermarks_for_clocks_ranges)(struct pp_hwmgr *hwmgr, void *clock_ranges); 298 297 int (*display_clock_voltage_request)(struct pp_hwmgr *hwmgr, 299 298 struct pp_display_clock_request *clock); 300 299 int (*get_max_high_clocks)(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); ··· 301 302 int (*power_off_asic)(struct pp_hwmgr *hwmgr); 302 303 int (*force_clock_level)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, uint32_t mask); 303 304 int (*print_clock_levels)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, char *buf); 304 - int (*enable_per_cu_power_gating)(struct pp_hwmgr *hwmgr, bool enable); 305 + int (*powergate_gfx)(struct pp_hwmgr *hwmgr, bool enable); 305 306 int (*get_sclk_od)(struct pp_hwmgr *hwmgr); 306 307 int (*set_sclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 307 308 int (*get_mclk_od)(struct pp_hwmgr *hwmgr); ··· 326 327 enum PP_OD_DPM_TABLE_COMMAND type, 327 328 long *input, uint32_t size); 328 329 int (*set_power_limit)(struct pp_hwmgr *hwmgr, uint32_t n); 329 - int (*set_mmhub_powergating_by_smu)(struct pp_hwmgr *hwmgr); 330 + int (*powergate_mmhub)(struct pp_hwmgr *hwmgr); 330 331 int (*smus_notify_pwe)(struct pp_hwmgr *hwmgr); 331 332 }; 332 333
+13 -10
drivers/gpu/drm/amd/powerplay/inc/vega12/smu9_driver_if.h
··· 412 412 QuadraticInt_t ReservedEquation2; 413 413 QuadraticInt_t ReservedEquation3; 414 414 415 - uint16_t MinVoltageUlvGfx; 416 - uint16_t MinVoltageUlvSoc; 415 + uint16_t MinVoltageUlvGfx; 416 + uint16_t MinVoltageUlvSoc; 417 417 418 - uint32_t Reserved[14]; 418 + uint32_t Reserved[14]; 419 419 420 420 421 421 ··· 483 483 uint8_t padding8_4; 484 484 485 485 486 - uint8_t PllGfxclkSpreadEnabled; 487 - uint8_t PllGfxclkSpreadPercent; 488 - uint16_t PllGfxclkSpreadFreq; 486 + uint8_t PllGfxclkSpreadEnabled; 487 + uint8_t PllGfxclkSpreadPercent; 488 + uint16_t PllGfxclkSpreadFreq; 489 489 490 490 uint8_t UclkSpreadEnabled; 491 491 uint8_t UclkSpreadPercent; ··· 495 495 uint8_t SocclkSpreadPercent; 496 496 uint16_t SocclkSpreadFreq; 497 497 498 - uint8_t AcgGfxclkSpreadEnabled; 499 - uint8_t AcgGfxclkSpreadPercent; 500 - uint16_t AcgGfxclkSpreadFreq; 498 + uint8_t AcgGfxclkSpreadEnabled; 499 + uint8_t AcgGfxclkSpreadPercent; 500 + uint16_t AcgGfxclkSpreadFreq; 501 501 502 - uint32_t BoardReserved[10]; 502 + uint8_t Vr2_I2C_address; 503 + uint8_t padding_vr2[3]; 504 + 505 + uint32_t BoardReserved[9]; 503 506 504 507 505 508 uint32_t MmHubPadding[7];
-58
drivers/gpu/drm/drm_pci.c
··· 326 326 } 327 327 EXPORT_SYMBOL(drm_legacy_pci_init); 328 328 329 - int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *mask) 330 - { 331 - struct pci_dev *root; 332 - u32 lnkcap, lnkcap2; 333 - 334 - *mask = 0; 335 - if (!dev->pdev) 336 - return -EINVAL; 337 - 338 - root = dev->pdev->bus->self; 339 - 340 - /* we've been informed via and serverworks don't make the cut */ 341 - if (root->vendor == PCI_VENDOR_ID_VIA || 342 - root->vendor == PCI_VENDOR_ID_SERVERWORKS) 343 - return -EINVAL; 344 - 345 - pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap); 346 - pcie_capability_read_dword(root, PCI_EXP_LNKCAP2, &lnkcap2); 347 - 348 - if (lnkcap2) { /* PCIe r3.0-compliant */ 349 - if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_2_5GB) 350 - *mask |= DRM_PCIE_SPEED_25; 351 - if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_5_0GB) 352 - *mask |= DRM_PCIE_SPEED_50; 353 - if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB) 354 - *mask |= DRM_PCIE_SPEED_80; 355 - } else { /* pre-r3.0 */ 356 - if (lnkcap & PCI_EXP_LNKCAP_SLS_2_5GB) 357 - *mask |= DRM_PCIE_SPEED_25; 358 - if (lnkcap & PCI_EXP_LNKCAP_SLS_5_0GB) 359 - *mask |= (DRM_PCIE_SPEED_25 | DRM_PCIE_SPEED_50); 360 - } 361 - 362 - DRM_INFO("probing gen 2 caps for device %x:%x = %x/%x\n", root->vendor, root->device, lnkcap, lnkcap2); 363 - return 0; 364 - } 365 - EXPORT_SYMBOL(drm_pcie_get_speed_cap_mask); 366 - 367 - int drm_pcie_get_max_link_width(struct drm_device *dev, u32 *mlw) 368 - { 369 - struct pci_dev *root; 370 - u32 lnkcap; 371 - 372 - *mlw = 0; 373 - if (!dev->pdev) 374 - return -EINVAL; 375 - 376 - root = dev->pdev->bus->self; 377 - 378 - pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap); 379 - 380 - *mlw = (lnkcap & PCI_EXP_LNKCAP_MLW) >> 4; 381 - 382 - DRM_INFO("probing mlw for device %x:%x = %x\n", root->vendor, root->device, lnkcap); 383 - return 0; 384 - } 385 - EXPORT_SYMBOL(drm_pcie_get_max_link_width); 386 - 387 329 #else 388 330 389 331 void drm_pci_agp_destroy(struct drm_device *dev) {}
+2 -2
drivers/gpu/drm/etnaviv/etnaviv_drv.c
··· 78 78 gpu->lastctx = NULL; 79 79 mutex_unlock(&gpu->lock); 80 80 81 - drm_sched_entity_fini(&gpu->sched, 82 - &ctx->sched_entity[i]); 81 + drm_sched_entity_destroy(&gpu->sched, 82 + &ctx->sched_entity[i]); 83 83 } 84 84 } 85 85
+15 -5
drivers/gpu/drm/radeon/ci_dpm.c
··· 5676 5676 u16 data_offset, size; 5677 5677 u8 frev, crev; 5678 5678 struct ci_power_info *pi; 5679 + enum pci_bus_speed speed_cap; 5680 + struct pci_dev *root = rdev->pdev->bus->self; 5679 5681 int ret; 5680 - u32 mask; 5681 5682 5682 5683 pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL); 5683 5684 if (pi == NULL) 5684 5685 return -ENOMEM; 5685 5686 rdev->pm.dpm.priv = pi; 5686 5687 5687 - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); 5688 - if (ret) 5688 + speed_cap = pcie_get_speed_cap(root); 5689 + if (speed_cap == PCI_SPEED_UNKNOWN) { 5689 5690 pi->sys_pcie_mask = 0; 5690 - else 5691 - pi->sys_pcie_mask = mask; 5691 + } else { 5692 + if (speed_cap == PCIE_SPEED_8_0GT) 5693 + pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 5694 + RADEON_PCIE_SPEED_50 | 5695 + RADEON_PCIE_SPEED_80; 5696 + else if (speed_cap == PCIE_SPEED_5_0GT) 5697 + pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 5698 + RADEON_PCIE_SPEED_50; 5699 + else 5700 + pi->sys_pcie_mask = RADEON_PCIE_SPEED_25; 5701 + } 5692 5702 pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID; 5693 5703 5694 5704 pi->pcie_gen_performance.max = RADEON_PCIE_GEN1;
+12 -10
drivers/gpu/drm/radeon/cik.c
··· 9499 9499 static void cik_pcie_gen3_enable(struct radeon_device *rdev) 9500 9500 { 9501 9501 struct pci_dev *root = rdev->pdev->bus->self; 9502 + enum pci_bus_speed speed_cap; 9502 9503 int bridge_pos, gpu_pos; 9503 - u32 speed_cntl, mask, current_data_rate; 9504 - int ret, i; 9504 + u32 speed_cntl, current_data_rate; 9505 + int i; 9505 9506 u16 tmp16; 9506 9507 9507 9508 if (pci_is_root_bus(rdev->pdev->bus)) ··· 9517 9516 if (!(rdev->flags & RADEON_IS_PCIE)) 9518 9517 return; 9519 9518 9520 - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); 9521 - if (ret != 0) 9519 + speed_cap = pcie_get_speed_cap(root); 9520 + if (speed_cap == PCI_SPEED_UNKNOWN) 9522 9521 return; 9523 9522 9524 - if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80))) 9523 + if ((speed_cap != PCIE_SPEED_8_0GT) && 9524 + (speed_cap != PCIE_SPEED_5_0GT)) 9525 9525 return; 9526 9526 9527 9527 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 9528 9528 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >> 9529 9529 LC_CURRENT_DATA_RATE_SHIFT; 9530 - if (mask & DRM_PCIE_SPEED_80) { 9530 + if (speed_cap == PCIE_SPEED_8_0GT) { 9531 9531 if (current_data_rate == 2) { 9532 9532 DRM_INFO("PCIE gen 3 link speeds already enabled\n"); 9533 9533 return; 9534 9534 } 9535 9535 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n"); 9536 - } else if (mask & DRM_PCIE_SPEED_50) { 9536 + } else if (speed_cap == PCIE_SPEED_5_0GT) { 9537 9537 if (current_data_rate == 1) { 9538 9538 DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 9539 9539 return; ··· 9550 9548 if (!gpu_pos) 9551 9549 return; 9552 9550 9553 - if (mask & DRM_PCIE_SPEED_80) { 9551 + if (speed_cap == PCIE_SPEED_8_0GT) { 9554 9552 /* re-try equalization if gen3 is not already enabled */ 9555 9553 if (current_data_rate != 2) { 9556 9554 u16 bridge_cfg, gpu_cfg; ··· 9638 9636 9639 9637 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); 9640 9638 tmp16 &= ~0xf; 9641 - if (mask & DRM_PCIE_SPEED_80) 9639 + if (speed_cap == PCIE_SPEED_8_0GT) 9642 9640 tmp16 |= 3; /* gen3 */ 9643 - else if (mask & DRM_PCIE_SPEED_50) 9641 + else if (speed_cap == PCIE_SPEED_5_0GT) 9644 9642 tmp16 |= 2; /* gen2 */ 9645 9643 else 9646 9644 tmp16 |= 1; /* gen1 */
+2 -2
drivers/gpu/drm/radeon/r600_dpm.c
··· 1327 1327 case RADEON_PCIE_GEN3: 1328 1328 return RADEON_PCIE_GEN3; 1329 1329 default: 1330 - if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == RADEON_PCIE_GEN3)) 1330 + if ((sys_mask & RADEON_PCIE_SPEED_80) && (default_gen == RADEON_PCIE_GEN3)) 1331 1331 return RADEON_PCIE_GEN3; 1332 - else if ((sys_mask & DRM_PCIE_SPEED_50) && (default_gen == RADEON_PCIE_GEN2)) 1332 + else if ((sys_mask & RADEON_PCIE_SPEED_50) && (default_gen == RADEON_PCIE_GEN2)) 1333 1333 return RADEON_PCIE_GEN2; 1334 1334 else 1335 1335 return RADEON_PCIE_GEN1;
+4
drivers/gpu/drm/radeon/radeon.h
··· 1653 1653 struct radeon_dpm dpm; 1654 1654 }; 1655 1655 1656 + #define RADEON_PCIE_SPEED_25 1 1657 + #define RADEON_PCIE_SPEED_50 2 1658 + #define RADEON_PCIE_SPEED_80 4 1659 + 1656 1660 int radeon_pm_get_type_index(struct radeon_device *rdev, 1657 1661 enum radeon_pm_state_type ps_type, 1658 1662 int instance);
+1
drivers/gpu/drm/radeon/radeon_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 1 2 /* 2 3 * Copyright 2009 VMware, Inc. 3 4 *
+12 -10
drivers/gpu/drm/radeon/si.c
··· 7082 7082 static void si_pcie_gen3_enable(struct radeon_device *rdev) 7083 7083 { 7084 7084 struct pci_dev *root = rdev->pdev->bus->self; 7085 + enum pci_bus_speed speed_cap; 7085 7086 int bridge_pos, gpu_pos; 7086 - u32 speed_cntl, mask, current_data_rate; 7087 - int ret, i; 7087 + u32 speed_cntl, current_data_rate; 7088 + int i; 7088 7089 u16 tmp16; 7089 7090 7090 7091 if (pci_is_root_bus(rdev->pdev->bus)) ··· 7100 7099 if (!(rdev->flags & RADEON_IS_PCIE)) 7101 7100 return; 7102 7101 7103 - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); 7104 - if (ret != 0) 7102 + speed_cap = pcie_get_speed_cap(root); 7103 + if (speed_cap == PCI_SPEED_UNKNOWN) 7105 7104 return; 7106 7105 7107 - if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80))) 7106 + if ((speed_cap != PCIE_SPEED_8_0GT) && 7107 + (speed_cap != PCIE_SPEED_5_0GT)) 7108 7108 return; 7109 7109 7110 7110 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 7111 7111 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >> 7112 7112 LC_CURRENT_DATA_RATE_SHIFT; 7113 - if (mask & DRM_PCIE_SPEED_80) { 7113 + if (speed_cap == PCIE_SPEED_8_0GT) { 7114 7114 if (current_data_rate == 2) { 7115 7115 DRM_INFO("PCIE gen 3 link speeds already enabled\n"); 7116 7116 return; 7117 7117 } 7118 7118 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n"); 7119 - } else if (mask & DRM_PCIE_SPEED_50) { 7119 + } else if (speed_cap == PCIE_SPEED_5_0GT) { 7120 7120 if (current_data_rate == 1) { 7121 7121 DRM_INFO("PCIE gen 2 link speeds already enabled\n"); 7122 7122 return; ··· 7133 7131 if (!gpu_pos) 7134 7132 return; 7135 7133 7136 - if (mask & DRM_PCIE_SPEED_80) { 7134 + if (speed_cap == PCIE_SPEED_8_0GT) { 7137 7135 /* re-try equalization if gen3 is not already enabled */ 7138 7136 if (current_data_rate != 2) { 7139 7137 u16 bridge_cfg, gpu_cfg; ··· 7221 7219 7222 7220 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16); 7223 7221 tmp16 &= ~0xf; 7224 - if (mask & DRM_PCIE_SPEED_80) 7222 + if (speed_cap == PCIE_SPEED_8_0GT) 7225 7223 tmp16 |= 3; /* gen3 */ 7226 - else if (mask & DRM_PCIE_SPEED_50) 7224 + else if (speed_cap == PCIE_SPEED_5_0GT) 7227 7225 tmp16 |= 2; /* gen2 */ 7228 7226 else 7229 7227 tmp16 |= 1; /* gen1 */
+15 -5
drivers/gpu/drm/radeon/si_dpm.c
··· 6899 6899 struct ni_power_info *ni_pi; 6900 6900 struct si_power_info *si_pi; 6901 6901 struct atom_clock_dividers dividers; 6902 + enum pci_bus_speed speed_cap; 6903 + struct pci_dev *root = rdev->pdev->bus->self; 6902 6904 int ret; 6903 - u32 mask; 6904 6905 6905 6906 si_pi = kzalloc(sizeof(struct si_power_info), GFP_KERNEL); 6906 6907 if (si_pi == NULL) ··· 6911 6910 eg_pi = &ni_pi->eg; 6912 6911 pi = &eg_pi->rv7xx; 6913 6912 6914 - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); 6915 - if (ret) 6913 + speed_cap = pcie_get_speed_cap(root); 6914 + if (speed_cap == PCI_SPEED_UNKNOWN) { 6916 6915 si_pi->sys_pcie_mask = 0; 6917 - else 6918 - si_pi->sys_pcie_mask = mask; 6916 + } else { 6917 + if (speed_cap == PCIE_SPEED_8_0GT) 6918 + si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 6919 + RADEON_PCIE_SPEED_50 | 6920 + RADEON_PCIE_SPEED_80; 6921 + else if (speed_cap == PCIE_SPEED_5_0GT) 6922 + si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 6923 + RADEON_PCIE_SPEED_50; 6924 + else 6925 + si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25; 6926 + } 6919 6927 si_pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID; 6920 6928 si_pi->boot_pcie_gen = si_get_current_pcie_speed(rdev); 6921 6929
+9 -9
drivers/gpu/drm/scheduler/gpu_scheduler.c
··· 256 256 257 257 258 258 /** 259 - * drm_sched_entity_do_release - Destroy a context entity 259 + * drm_sched_entity_flush - Flush a context entity 260 260 * 261 261 * @sched: scheduler instance 262 262 * @entity: scheduler entity ··· 267 267 * 268 268 * Returns the remaining time in jiffies left from the input timeout 269 269 */ 270 - long drm_sched_entity_do_release(struct drm_gpu_scheduler *sched, 270 + long drm_sched_entity_flush(struct drm_gpu_scheduler *sched, 271 271 struct drm_sched_entity *entity, long timeout) 272 272 { 273 273 long ret = timeout; ··· 294 294 295 295 return ret; 296 296 } 297 - EXPORT_SYMBOL(drm_sched_entity_do_release); 297 + EXPORT_SYMBOL(drm_sched_entity_flush); 298 298 299 299 /** 300 300 * drm_sched_entity_cleanup - Destroy a context entity ··· 306 306 * entity and signals all jobs with an error code if the process was killed. 307 307 * 308 308 */ 309 - void drm_sched_entity_cleanup(struct drm_gpu_scheduler *sched, 309 + void drm_sched_entity_fini(struct drm_gpu_scheduler *sched, 310 310 struct drm_sched_entity *entity) 311 311 { 312 312 ··· 357 357 dma_fence_put(entity->last_scheduled); 358 358 entity->last_scheduled = NULL; 359 359 } 360 - EXPORT_SYMBOL(drm_sched_entity_cleanup); 360 + EXPORT_SYMBOL(drm_sched_entity_fini); 361 361 362 362 /** 363 363 * drm_sched_entity_fini - Destroy a context entity ··· 367 367 * 368 368 * Calls drm_sched_entity_do_release() and drm_sched_entity_cleanup() 369 369 */ 370 - void drm_sched_entity_fini(struct drm_gpu_scheduler *sched, 370 + void drm_sched_entity_destroy(struct drm_gpu_scheduler *sched, 371 371 struct drm_sched_entity *entity) 372 372 { 373 - drm_sched_entity_do_release(sched, entity, MAX_WAIT_SCHED_ENTITY_Q_EMPTY); 374 - drm_sched_entity_cleanup(sched, entity); 373 + drm_sched_entity_flush(sched, entity, MAX_WAIT_SCHED_ENTITY_Q_EMPTY); 374 + drm_sched_entity_fini(sched, entity); 375 375 } 376 - EXPORT_SYMBOL(drm_sched_entity_fini); 376 + EXPORT_SYMBOL(drm_sched_entity_destroy); 377 377 378 378 static void drm_sched_entity_wakeup(struct dma_fence *f, struct dma_fence_cb *cb) 379 379 {
+1 -1
drivers/gpu/drm/v3d/v3d_drv.c
··· 151 151 enum v3d_queue q; 152 152 153 153 for (q = 0; q < V3D_MAX_QUEUES; q++) { 154 - drm_sched_entity_fini(&v3d->queue[q].sched, 154 + drm_sched_entity_destroy(&v3d->queue[q].sched, 155 155 &v3d_priv->sched_entity[q]); 156 156 } 157 157
+2
drivers/pci/pci.c
··· 5222 5222 5223 5223 return PCI_SPEED_UNKNOWN; 5224 5224 } 5225 + EXPORT_SYMBOL(pcie_get_speed_cap); 5225 5226 5226 5227 /** 5227 5228 * pcie_get_width_cap - query for the PCI device's link width capability ··· 5241 5240 5242 5241 return PCIE_LNK_WIDTH_UNKNOWN; 5243 5242 } 5243 + EXPORT_SYMBOL(pcie_get_width_cap); 5244 5244 5245 5245 /** 5246 5246 * pcie_bandwidth_capable - calculate a PCI device's link bandwidth capability
-7
include/drm/drm_pci.h
··· 58 58 } 59 59 #endif 60 60 61 - #define DRM_PCIE_SPEED_25 1 62 - #define DRM_PCIE_SPEED_50 2 63 - #define DRM_PCIE_SPEED_80 4 64 - 65 - int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask); 66 - int drm_pcie_get_max_link_width(struct drm_device *dev, u32 *mlw); 67 - 68 61 #endif /* _DRM_PCI_H_ */
+3 -3
include/drm/gpu_scheduler.h
··· 284 284 struct drm_sched_entity *entity, 285 285 struct drm_sched_rq *rq, 286 286 atomic_t *guilty); 287 - long drm_sched_entity_do_release(struct drm_gpu_scheduler *sched, 287 + long drm_sched_entity_flush(struct drm_gpu_scheduler *sched, 288 288 struct drm_sched_entity *entity, long timeout); 289 - void drm_sched_entity_cleanup(struct drm_gpu_scheduler *sched, 290 - struct drm_sched_entity *entity); 291 289 void drm_sched_entity_fini(struct drm_gpu_scheduler *sched, 290 + struct drm_sched_entity *entity); 291 + void drm_sched_entity_destroy(struct drm_gpu_scheduler *sched, 292 292 struct drm_sched_entity *entity); 293 293 void drm_sched_entity_push_job(struct drm_sched_job *sched_job, 294 294 struct drm_sched_entity *entity);
+3
include/linux/pci.h
··· 261 261 PCI_SPEED_UNKNOWN = 0xff, 262 262 }; 263 263 264 + enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev); 265 + enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev); 266 + 264 267 struct pci_cap_saved_data { 265 268 u16 cap_nr; 266 269 bool cap_extended;