Signed-off-by: Rex Zhu <rex....@amd.com>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 57 +++++++++++++++++++++++++++++
 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h   |  8 +++-
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index 1aacda7..7f39ce6 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -443,6 +443,27 @@ uint8_t phm_get_voltage_index(
        return i - 1;
 }
 
+uint8_t phm_get_voltage_id(pp_atomctrl_voltage_table *voltage_table,
+               uint32_t voltage)
+{
+       uint8_t count = (uint8_t) (voltage_table->count);
+       uint8_t i = 0;
+
+       PP_ASSERT_WITH_CODE((NULL != voltage_table),
+               "Voltage Table empty.", return 0;);
+       PP_ASSERT_WITH_CODE((0 != count),
+               "Voltage Table empty.", return 0;);
+
+       for (i = 0; i < count; i++) {
+               /* find first voltage bigger than requested */
+               if (voltage_table->entries[i].value >= voltage)
+                       return i;
+       }
+
+       /* voltage is bigger than max voltage in the table */
+       return i - 1;
+}
+
 uint16_t phm_find_closest_vddci(struct pp_atomctrl_voltage_table *vddci_table, 
uint16_t vddci)
 {
        uint32_t  i;
@@ -676,3 +697,39 @@ int hwmgr_set_user_specify_caps(struct pp_hwmgr *hwmgr)
        return 0;
 }
 
+int phm_add_voltage(struct pp_hwmgr *hwmgr,
+       phm_ppt_v1_voltage_lookup_table *look_up_table,
+       phm_ppt_v1_voltage_lookup_record *record)
+{
+       uint32_t i;
+
+       PP_ASSERT_WITH_CODE((NULL != look_up_table),
+               "Lookup Table empty.", return -EINVAL);
+       PP_ASSERT_WITH_CODE((0 != look_up_table->count),
+               "Lookup Table empty.", return -EINVAL);
+
+       i = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDGFX);
+       PP_ASSERT_WITH_CODE((i >= look_up_table->count),
+               "Lookup Table is full.", return -EINVAL);
+
+       /* This is to avoid entering duplicate calculated records. */
+       for (i = 0; i < look_up_table->count; i++) {
+               if (look_up_table->entries[i].us_vdd == record->us_vdd) {
+                       if (look_up_table->entries[i].us_calculated == 1)
+                               return 0;
+                       break;
+               }
+       }
+
+       look_up_table->entries[i].us_calculated = 1;
+       look_up_table->entries[i].us_vdd = record->us_vdd;
+       look_up_table->entries[i].us_cac_low = record->us_cac_low;
+       look_up_table->entries[i].us_cac_mid = record->us_cac_mid;
+       look_up_table->entries[i].us_cac_high = record->us_cac_high;
+       /* Only increment the count when we're appending, not replacing 
duplicate entry. */
+       if (i == look_up_table->count)
+               look_up_table->count++;
+
+       return 0;
+}
+
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index 2a060f6..c4772d7 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -685,6 +685,8 @@ extern void 
phm_trim_voltage_table_to_fit_state_table(uint32_t max_vol_steps, st
 extern int phm_reset_single_dpm_table(void *table, uint32_t count, int max);
 extern void phm_setup_pcie_table_entry(void *table, uint32_t index, uint32_t 
pcie_gen, uint32_t pcie_lanes);
 extern int32_t phm_get_dpm_level_enable_mask_value(void *table);
+extern uint8_t phm_get_voltage_id(struct pp_atomctrl_voltage_table 
*voltage_table,
+               uint32_t voltage);
 extern uint8_t phm_get_voltage_index(struct phm_ppt_v1_voltage_lookup_table 
*lookup_table, uint16_t voltage);
 extern uint16_t phm_find_closest_vddci(struct pp_atomctrl_voltage_table 
*vddci_table, uint16_t vddci);
 extern int phm_find_boot_level(void *table, uint32_t value, uint32_t 
*boot_level);
@@ -695,6 +697,10 @@ extern int phm_hwmgr_backend_fini(struct pp_hwmgr *hwmgr);
 extern uint32_t phm_get_lowest_enabled_level(struct pp_hwmgr *hwmgr, uint32_t 
mask);
 extern void phm_apply_dal_min_voltage_request(struct pp_hwmgr *hwmgr);
 
+extern int phm_add_voltage(struct pp_hwmgr *hwmgr,
+       phm_ppt_v1_voltage_lookup_table *look_up_table,
+       phm_ppt_v1_voltage_lookup_record *record);
+
 #define PHM_ENTIRE_REGISTER_MASK 0xFFFFFFFFU
 
 #define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
@@ -709,8 +715,6 @@ extern void phm_apply_dal_min_voltage_request(struct 
pp_hwmgr *hwmgr);
         PHM_FIELD_SHIFT(reg, field))
 
 
-
-
 /* Operations on named fields. */
 
 #define PHM_READ_FIELD(device, reg, field)     \
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to