msm_mmrm: Add registered mmrm client parameters output

if mmrm client was registered, client register will output dyn_pwr,
leak_pwr total pwr, and current Max for mmrm-test-module

Change-Id: I34aeef778f42f106780b72543a3458627ce09935
Signed-off-by: mbao <mbao@codeaurora.org>
This commit is contained in:
mbao
2021-07-06 11:01:34 -07:00
committed by Mahesh Kumar Sharma
parent e1ade39ea4
commit 3b8eae3aa1

View File

@@ -74,18 +74,42 @@ static int mmrm_sw_update_freq(
/* print results */
for (i = 0; i < MMRM_VDD_LEVEL_MAX; i++) {
d_mpr_h("%s: csid(0x%x) corner(%s) clk_rate(%llu) dyn_pwr(%zu) leak_pwr(%zu)\n",
d_mpr_h("%s: csid(0x%x) corner(%s) clk_rate(%llu)\n",
__func__,
tbl_entry->clk_src_id,
cset->corner_tbl[i].name,
tbl_entry->freq[i],
tbl_entry->dyn_pwr[i],
tbl_entry->leak_pwr[i]);
tbl_entry->freq[i]);
}
return rc;
}
static void mmrm_sw_print_client_data(struct mmrm_sw_clk_mgr_info *sinfo,
struct mmrm_sw_clk_client_tbl_entry *tbl_entry)
{
struct mmrm_driver_data *drv_data = (struct mmrm_driver_data *)sinfo->driver_data;
struct mmrm_clk_platform_resources *cres = &drv_data->clk_res;
struct voltage_corner_set *cset = &cres->corner_set;
u32 i, j;
for (i = 0; i < MMRM_VDD_LEVEL_MAX; i++) {
d_mpr_h("%s: csid(0x%x) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) \n",
__func__,
tbl_entry->clk_src_id,
cset->corner_tbl[i].name,
tbl_entry->dyn_pwr[i],
tbl_entry->leak_pwr[i]);
for (j = 0; j < MMRM_VDD_LEVEL_MAX; j++) {
d_mpr_h("%s: csid(0x%x) total_pwr(%zu) cur_ma(%zu)\n",
__func__,
tbl_entry->clk_src_id,
(tbl_entry->dyn_pwr[i] + tbl_entry->leak_pwr[i]),
tbl_entry->current_ma[i][j]);
}
}
}
static int mmrm_sw_update_curr(struct mmrm_sw_clk_mgr_info *sinfo,
struct mmrm_sw_clk_client_tbl_entry *tbl_entry)
{
@@ -96,12 +120,27 @@ static int mmrm_sw_update_curr(struct mmrm_sw_clk_mgr_info *sinfo,
u32 scaling_factor = 0, voltage_factor = 0;
fp_t nom_dyn_pwr, nom_leak_pwr, dyn_sc, leak_sc,
volt, dyn_pwr, leak_pwr, pwr_mw, nom_freq;
u32 c;
struct nom_clk_src_info *nom_tbl_entry = NULL;
nom_dyn_pwr = FP(Q16_INT(tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM]),
Q16_FRAC(tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM]), 100);
for (c = 0; c < sinfo->tot_clk_clients; c++) {
if (tbl_entry->clk_src_id == sinfo->clk_client_tbl[c].clk_src_id) {
nom_tbl_entry = &cres->nom_clk_set.clk_src_tbl[c];
break;
}
}
if (nom_tbl_entry == NULL) {
d_mpr_h("%s: can't find 0x%x clock src ID\n",
__func__,
tbl_entry->clk_src_id);
return -EINVAL;
}
nom_leak_pwr = FP(Q16_INT(tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]),
Q16_FRAC(tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]), 100);
nom_dyn_pwr = FP(Q16_INT(nom_tbl_entry->nom_dyn_pwr),
Q16_FRAC(nom_tbl_entry->nom_dyn_pwr), 100);
nom_leak_pwr = FP(Q16_INT(nom_tbl_entry->nom_leak_pwr),
Q16_FRAC(nom_tbl_entry->nom_leak_pwr), 100);
nom_freq = tbl_entry->freq[MMRM_VDD_LEVEL_NOM];
@@ -123,28 +162,17 @@ static int mmrm_sw_update_curr(struct mmrm_sw_clk_mgr_info *sinfo,
dyn_pwr = fp_mult(pwr_mw, dyn_sc);
leak_pwr = fp_mult(nom_leak_pwr, leak_sc);
tbl_entry->dyn_pwr[i] = fp_round(dyn_pwr);
tbl_entry->leak_pwr[i] = fp_round(leak_pwr);
for (j = 0; j < MMRM_VDD_LEVEL_MAX; j++) {
voltage_factor = cset->corner_tbl[j].volt_factor;
volt = FP(Q16_INT(voltage_factor), Q16_FRAC(voltage_factor), 100);
tbl_entry->current_ma[i][j] = fp_round(fp_div((dyn_pwr+leak_pwr), volt));
d_mpr_h("%s: csid(0x%x) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) ",
__func__,
tbl_entry->clk_src_id,
cset->corner_tbl[i].name,
fp_round(dyn_pwr),
fp_round(leak_pwr));
d_mpr_h("%s: csid(0x%x) tot_pwr(%d)cur_ma(%d)\n",
__func__,
tbl_entry->clk_src_id,
fp_round(dyn_pwr+leak_pwr),
tbl_entry->current_ma[i][j]);
}
}
mmrm_sw_print_client_data(sinfo, tbl_entry);
return 0;
}
@@ -199,6 +227,9 @@ static struct mmrm_client *mmrm_sw_clk_client_register(
d_mpr_h("%s: client csid(0x%x) already registered ref:%d\n",
__func__, tbl_entry->clk_src_id, tbl_entry->ref_count);
clk_client = tbl_entry->client;
mmrm_sw_print_client_data(sinfo, tbl_entry);
goto exit_found;
}