const u8 *get_sr_vlt_table(u32 silicon_type, int freq_id) { u32 *vlt_table; int i; int ret; u32 vddvar_adj; u32 vlt; u32 vddvar_a9_min = avs_get_vddvar_a9_vlt_min(); u32 vddvar_min = avs_get_vddvar_vlt_min(); u32 min_vlt_table[] = { INIT_A9_VLT_TABLE(vddvar_a9_min, vddvar_a9_min, vddvar_a9_min, vddvar_a9_min, vddvar_a9_min), INIT_OTHER_VLT_TABLE(vddvar_min, vddvar_min, vddvar_min, vddvar_min), INIT_LPM_VLT_IDS(MSR_RETN_VAL, MSR_RETN_VAL, MSR_RETN_VAL), INIT_UNUSED_VLT_IDS(MSR_RETN_VAL) }; pr_info("%s silicon_type = %d, freq_id = %d\n", __func__, silicon_type, freq_id); if (silicon_type >= SILICON_TYPE_MAX || freq_id >= A9_FREQ_MAX) BUG(); switch (freq_id) { case A9_FREQ_1000_MHZ: vlt_table = pmu_vlt_table_1g[silicon_type]; vddvar_adj = DEFAULT_AGING_MARGIN_1G; break; case A9_FREQ_1200_MHZ: vlt_table = pmu_vlt_table_1200m[silicon_type]; vddvar_adj = DEFAULT_AGING_MARGIN_1200M; break; case A9_FREQ_1500_MHZ: /* Right now 1.5Ghz table hasn't been defined */ default: BUG(); } ret = avs_get_vddvar_aging_margin(silicon_type, freq_id); if (ret >= 0) vddvar_adj = (u32)ret; for (i = 0; i < ACTIVE_VOLTAGE_OFFSET; i++) vlt_id_table[i] = bcmpmu_rgltr_get_volt_id(vlt_table[i]); for (i = ACTIVE_VOLTAGE_OFFSET; i < SR_VLT_LUT_SIZE; i++) { vlt = vlt_table[i] + vddvar_adj; vlt_id_table[i] = bcmpmu_rgltr_get_volt_id(max(vlt, min_vlt_table[i])); } return vlt_id_table; }
int get_vddvar_retn_vlt_id(void) { u32 ret_vlt = MSR_RETN_VAL; /* Right now the retn value is same for all the silicon types In case tomorrow if it changes, we will modify the retn value returned accordingly */ #ifdef CONFIG_KONA_AVS u32 min = avs_get_vddvar_ret_vlt_min(); u32 silicon_type = avs_get_silicon_type(); switch (silicon_type) { case SILICON_TYPE_SLOW: ret_vlt = max(ret_vlt, min); break; case SILICON_TYPE_TYP_SLOW: ret_vlt = max(ret_vlt, min); break; case SILICON_TYPE_TYPICAL: ret_vlt = max(ret_vlt, min); break; case SILICON_TYPE_TYP_FAST: ret_vlt = max(ret_vlt, min); break; case SILICON_TYPE_FAST: ret_vlt = max(ret_vlt, min); break; default: BUG(); } #endif pr_info("MSR retention_voltage: %umV\n", ret_vlt); return bcmpmu_rgltr_get_volt_id(ret_vlt); }
int get_vddfix_vlt_adj(u32 vddfix_vlt) { int voltage = bcmpmu_rgltr_get_volt_val(vddfix_vlt); int adj_val, silicon_type = SILICON_TYPE_SLOW; u32 ddr_freq, ddr_freq_id; /* Convert uV to mV */ voltage = voltage/1000; ddr_freq = kona_memc_get_ddr_clk_freq(); if (ddr_freq < 400000000) ddr_freq_id = DDR_FREQ_400M; else ddr_freq_id = DDR_FREQ_450M; #ifdef CONFIG_KONA_AVS adj_val = avs_get_vddfix_adj(ddr_freq_id); if (adj_val == 0) { if (ddr_freq_id == DDR_FREQ_450M) { silicon_type = avs_get_silicon_type(); voltage = sdsr1_active_voltage_450m[silicon_type]; } else voltage = DEFAULT_VDDFIX_VOLTAGE; } else voltage = DEFAULT_VDDFIX_VOLTAGE + adj_val; #else if (ddr_freq_id == DDR_FREQ_450M) voltage = sdsr1_active_voltage_450m[silicon_type]; else voltage = DEFAULT_VDDFIX_VOLTAGE; #endif pr_info("SDSR1 active voltage: %dmV\n", voltage); return bcmpmu_rgltr_get_volt_id(voltage); }
u8 *get_sr_vlt_table(u32 silicon_type, int freq_id) { u32 *vlt_table; int i; u32 vlt_adj, temp; pr_info("%s silicon_type = %d, freq_id = %d\n", __func__, silicon_type, freq_id); if (silicon_type > SILICON_TYPE_MAX || freq_id > A9_FREQ_MAX) BUG(); switch (freq_id) { case A9_FREQ_1000_MHZ: vlt_table = pmu_vlt_table_1g[silicon_type]; vlt_adj = DEFAULT_AGING_MARGIN_1G; break; case A9_FREQ_1200_MHZ: vlt_table = pmu_vlt_table_1200m[silicon_type]; vlt_adj = DEFAULT_AGING_MARGIN_1200M; break; case A9_FREQ_1400_MHZ: default: BUG(); } for (i = 0; i < SR_VLT_LUT_SIZE; i++) { temp = vlt_table[i] + vlt_adj; vlt_id_table[i] = bcmpmu_rgltr_get_volt_id(temp); volt_dbg_log.pwr_mgr_volt_tbl[i] = vlt_id_table[i]; } volt_dbg_log.si_type = silicon_type; return vlt_id_table; }
int get_vddfix_vlt_adj(u32 vddfix_vlt) { int voltage = bcmpmu_rgltr_get_volt_val(vddfix_vlt); /* Convert uV to mV */ voltage = voltage/1000; #ifdef CONFIG_KONA_AVS voltage += avs_get_vddfix_adj(); #endif pr_info("SDSR1 active voltage: %dmV\n", voltage); return bcmpmu_rgltr_get_volt_id(voltage); }
int get_vddfix_retn_vlt_id(u32 reg_val) { int vddfix_ret = reg_val; #ifdef CONFIG_KONA_AVS u32 vlt = SDSR1_RETN_VAL; u32 vddfix_min = avs_get_vddfix_ret_vlt_min(); vlt = max(vlt, vddfix_min); vddfix_ret = bcmpmu_rgltr_get_volt_id(vlt); pr_info("SDSR1(AVS) min retn voltage: %dmV, curr val: %umV\n", vlt, bcmpmu_rgltr_get_volt_val(reg_val)/1000); BUG_ON(vddfix_ret < 0); #endif return vddfix_ret; }
const u8 *get_sr_vlt_table(u32 silicon_type, int freq_id) { u32 *vlt_table; int i; pr_info("%s silicon_type = %d, freq_id = %d\n", __func__, silicon_type, freq_id); if (silicon_type > SILICON_TYPE_MAX || freq_id > A9_FREQ_MAX) BUG(); switch (freq_id) { case A9_FREQ_1000_MHZ: vlt_table = pmu_vlt_table_1g[silicon_type]; break; case A9_FREQ_1200_MHZ: vlt_table = pmu_vlt_table_1200m[silicon_type]; break; case A9_FREQ_1500_MHZ: default: BUG(); } for (i = 0; i < SR_VLT_LUT_SIZE; i++) vlt_id_table[i] = bcmpmu_rgltr_get_volt_id(vlt_table[i]); return vlt_id_table; }