diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2017-09-20 07:22:01 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 15:14:29 -0400 |
commit | d92cb1629bcc8cdf4d616f144ced399723816ba3 (patch) | |
tree | 13942d3f135e7d16e2264cbca26ea4cb571c259f | |
parent | be49be4085d977af566e8d2f9c52ecc1f31b59ad (diff) |
drm/amd/powerplay: add new helper functions in hwmgr.h
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 42 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c | 2 |
5 files changed, 50 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c index 9c1479dcf79c..73969f35846c 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | |||
@@ -451,7 +451,7 @@ int phm_wait_on_register(struct pp_hwmgr *hwmgr, uint32_t index, | |||
451 | * reached the given value.The indirect space is described by giving | 451 | * reached the given value.The indirect space is described by giving |
452 | * the memory-mapped index of the indirect index register. | 452 | * the memory-mapped index of the indirect index register. |
453 | */ | 453 | */ |
454 | void phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, | 454 | int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, |
455 | uint32_t indirect_port, | 455 | uint32_t indirect_port, |
456 | uint32_t index, | 456 | uint32_t index, |
457 | uint32_t value, | 457 | uint32_t value, |
@@ -459,14 +459,50 @@ void phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, | |||
459 | { | 459 | { |
460 | if (hwmgr == NULL || hwmgr->device == NULL) { | 460 | if (hwmgr == NULL || hwmgr->device == NULL) { |
461 | pr_err("Invalid Hardware Manager!"); | 461 | pr_err("Invalid Hardware Manager!"); |
462 | return; | 462 | return -EINVAL; |
463 | } | 463 | } |
464 | 464 | ||
465 | cgs_write_register(hwmgr->device, indirect_port, index); | 465 | cgs_write_register(hwmgr->device, indirect_port, index); |
466 | phm_wait_on_register(hwmgr, indirect_port + 1, mask, value); | 466 | return phm_wait_on_register(hwmgr, indirect_port + 1, mask, value); |
467 | } | 467 | } |
468 | 468 | ||
469 | int phm_wait_for_register_unequal(struct pp_hwmgr *hwmgr, | ||
470 | uint32_t index, | ||
471 | uint32_t value, uint32_t mask) | ||
472 | { | ||
473 | uint32_t i; | ||
474 | uint32_t cur_value; | ||
469 | 475 | ||
476 | if (hwmgr == NULL || hwmgr->device == NULL) | ||
477 | return -EINVAL; | ||
478 | |||
479 | for (i = 0; i < hwmgr->usec_timeout; i++) { | ||
480 | cur_value = cgs_read_register(hwmgr->device, | ||
481 | index); | ||
482 | if ((cur_value & mask) != (value & mask)) | ||
483 | break; | ||
484 | udelay(1); | ||
485 | } | ||
486 | |||
487 | /* timeout means wrong logic */ | ||
488 | if (i == hwmgr->usec_timeout) | ||
489 | return -ETIME; | ||
490 | return 0; | ||
491 | } | ||
492 | |||
493 | int phm_wait_for_indirect_register_unequal(struct pp_hwmgr *hwmgr, | ||
494 | uint32_t indirect_port, | ||
495 | uint32_t index, | ||
496 | uint32_t value, | ||
497 | uint32_t mask) | ||
498 | { | ||
499 | if (hwmgr == NULL || hwmgr->device == NULL) | ||
500 | return -EINVAL; | ||
501 | |||
502 | cgs_write_register(hwmgr->device, indirect_port, index); | ||
503 | return phm_wait_for_register_unequal(hwmgr, indirect_port + 1, | ||
504 | value, mask); | ||
505 | } | ||
470 | 506 | ||
471 | bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr) | 507 | bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr) |
472 | { | 508 | { |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h index 859cca496b44..1c605f966b5f 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | |||
@@ -792,12 +792,19 @@ extern int hwmgr_handle_task(struct pp_instance *handle, | |||
792 | extern int phm_wait_on_register(struct pp_hwmgr *hwmgr, uint32_t index, | 792 | extern int phm_wait_on_register(struct pp_hwmgr *hwmgr, uint32_t index, |
793 | uint32_t value, uint32_t mask); | 793 | uint32_t value, uint32_t mask); |
794 | 794 | ||
795 | extern void phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, | 795 | extern int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, |
796 | uint32_t indirect_port, | 796 | uint32_t indirect_port, |
797 | uint32_t index, | 797 | uint32_t index, |
798 | uint32_t value, | 798 | uint32_t value, |
799 | uint32_t mask); | 799 | uint32_t mask); |
800 | 800 | ||
801 | extern int phm_wait_for_register_unequal(struct pp_hwmgr *hwmgr, | ||
802 | uint32_t index, | ||
803 | uint32_t value, uint32_t mask); | ||
804 | extern int phm_wait_for_indirect_register_unequal( | ||
805 | struct pp_hwmgr *hwmgr, | ||
806 | uint32_t indirect_port, uint32_t index, | ||
807 | uint32_t value, uint32_t mask); | ||
801 | 808 | ||
802 | 809 | ||
803 | extern bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr); | 810 | extern bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr); |
@@ -882,5 +889,4 @@ extern int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_t | |||
882 | PHM_WAIT_INDIRECT_REGISTER(hwmgr, port, reg, (fieldval) \ | 889 | PHM_WAIT_INDIRECT_REGISTER(hwmgr, port, reg, (fieldval) \ |
883 | << PHM_FIELD_SHIFT(reg, field), PHM_FIELD_MASK(reg, field)) | 890 | << PHM_FIELD_SHIFT(reg, field), PHM_FIELD_MASK(reg, field)) |
884 | 891 | ||
885 | |||
886 | #endif /* _HWMGR_H_ */ | 892 | #endif /* _HWMGR_H_ */ |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c index f9afe88569d1..b98ade676d12 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c | |||
@@ -79,7 +79,7 @@ static uint32_t rv_wait_for_response(struct pp_hwmgr *hwmgr) | |||
79 | reg = soc15_get_register_offset(MP1_HWID, 0, | 79 | reg = soc15_get_register_offset(MP1_HWID, 0, |
80 | mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90); | 80 | mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90); |
81 | 81 | ||
82 | smum_wait_for_register_unequal(hwmgr, reg, | 82 | phm_wait_for_register_unequal(hwmgr, reg, |
83 | 0, MP1_C2PMSG_90__CONTENT_MASK); | 83 | 0, MP1_C2PMSG_90__CONTENT_MASK); |
84 | 84 | ||
85 | return cgs_read_register(hwmgr->device, reg); | 85 | return cgs_read_register(hwmgr->device, reg); |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c index 412cf6f74f67..bb26906edb86 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | |||
@@ -487,11 +487,10 @@ int smu7_check_fw_load_finish(struct pp_hwmgr *hwmgr, uint32_t fw_type) | |||
487 | uint32_t fw_mask = smu7_get_mask_for_firmware_type(fw_type); | 487 | uint32_t fw_mask = smu7_get_mask_for_firmware_type(fw_type); |
488 | uint32_t ret; | 488 | uint32_t ret; |
489 | 489 | ||
490 | ret = smum_wait_on_indirect_register(hwmgr, mmSMC_IND_INDEX_11, | 490 | ret = phm_wait_on_indirect_register(hwmgr, mmSMC_IND_INDEX_11, |
491 | smu_data->soft_regs_start + smum_get_offsetof(hwmgr, | 491 | smu_data->soft_regs_start + smum_get_offsetof(hwmgr, |
492 | SMU_SoftRegisters, UcodeLoadStatus), | 492 | SMU_SoftRegisters, UcodeLoadStatus), |
493 | fw_mask, fw_mask); | 493 | fw_mask, fw_mask); |
494 | |||
495 | return ret; | 494 | return ret; |
496 | } | 495 | } |
497 | 496 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c index 4cb5d3460fef..2f979fb86824 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c | |||
@@ -90,7 +90,7 @@ static uint32_t vega10_wait_for_response(struct pp_hwmgr *hwmgr) | |||
90 | reg = soc15_get_register_offset(MP1_HWID, 0, | 90 | reg = soc15_get_register_offset(MP1_HWID, 0, |
91 | mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90); | 91 | mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90); |
92 | 92 | ||
93 | smum_wait_for_register_unequal(hwmgr, reg, | 93 | phm_wait_for_register_unequal(hwmgr, reg, |
94 | 0, MP1_C2PMSG_90__CONTENT_MASK); | 94 | 0, MP1_C2PMSG_90__CONTENT_MASK); |
95 | 95 | ||
96 | return cgs_read_register(hwmgr->device, reg); | 96 | return cgs_read_register(hwmgr->device, reg); |