aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2017-09-20 07:22:01 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 15:14:29 -0400
commitd92cb1629bcc8cdf4d616f144ced399723816ba3 (patch)
tree13942d3f135e7d16e2264cbca26ea4cb571c259f
parentbe49be4085d977af566e8d2f9c52ecc1f31b59ad (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.c42
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h10
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c2
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c2
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 */
454void phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, 454int 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
469int 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
493int 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
471bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr) 507bool 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,
792extern int phm_wait_on_register(struct pp_hwmgr *hwmgr, uint32_t index, 792extern 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
795extern void phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, 795extern 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
801extern int phm_wait_for_register_unequal(struct pp_hwmgr *hwmgr,
802 uint32_t index,
803 uint32_t value, uint32_t mask);
804extern 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
803extern bool phm_cf_want_uvd_power_gating(struct pp_hwmgr *hwmgr); 810extern 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);