static int sunxi_cpu_budget_vftable_init(void) { script_item_u val; script_item_value_type_e type; struct cpufreq_dvfs_s *ptable; unsigned int * plen; unsigned int freq,volt; int i,j,k,ret = -1; char tbl_name[]="dvfs_table"; char name[16] = {0}; unsigned int vf_table_type = 0; type = script_get_item("dvfs_table", "vf_table_count", &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { pr_info("%s: support only one vf_table\n", __func__); sprintf(tbl_name, "%s", "dvfs_table"); } else { vf_table_type = sunxi_get_soc_bin(); sprintf(tbl_name, "%s%d", "vf_table", vf_table_type); } for(k=0;k<2;k++) { ptable = k?&c1_vftable_syscfg[0]:&c0_vftable_syscfg[1]; plen = k?&c1_table_length:&c0_table_length; #if defined(CONFIG_ARCH_SUN9IW1) if (hmp_cluster0_is_big) { if (k == 0) sprintf(name, "B_LV_count"); else sprintf(name, "L_LV_count"); } else { if (k == 0) sprintf(name, "L_LV_count"); else sprintf(name, "B_LV_count"); } #elif defined(CONFIG_ARCH_SUN8IW5) || defined(CONFIG_ARCH_SUN8IW6) if (k == 0) sprintf(name, "L_LV_count"); else sprintf(name, "B_LV_count"); #endif type = script_get_item(tbl_name, name, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { pr_err("fetch %s from sysconfig failed\n",name); goto fail; } *plen = val.val; if(*plen >= 16){ pr_err("%s from sysconfig is out of bounder\n",name); goto fail; } for (i = 1,j=0; i <= *plen ; i++) { #if defined(CONFIG_ARCH_SUN9IW1) if (hmp_cluster0_is_big) { if (k == 0) sprintf(name, "B_LV%d_freq", i); else sprintf(name, "L_LV%d_freq", i); } else { if (k == 0) sprintf(name, "L_LV%d_freq", i); else sprintf(name, "B_LV%d_freq", i); } #elif defined(CONFIG_ARCH_SUN8IW5) || defined(CONFIG_ARCH_SUN8IW6) if (k == 0) sprintf(name, "L_LV%d_freq", i); else sprintf(name, "B_LV%d_freq", i); #endif type = script_get_item(tbl_name, name, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { pr_err("get C%d_LV%d_freq from sysconfig failed\n", k,i); goto fail; } freq = val.val; #if defined(CONFIG_ARCH_SUN9IW1) if (hmp_cluster0_is_big) { if (k == 0) sprintf(name, "B_LV%d_volt", i); else sprintf(name, "L_LV%d_volt", i); } else { if (k == 0) sprintf(name, "L_LV%d_volt", i); else sprintf(name, "B_LV%d_volt", i); } #elif defined(CONFIG_ARCH_SUN8IW5) || defined(CONFIG_ARCH_SUN8IW6) if (k == 0) sprintf(name, "L_LV%d_volt", i); else sprintf(name, "B_LV%d_volt", i); #endif type = script_get_item(tbl_name, name, &val); if (SCIRPT_ITEM_VALUE_TYPE_INT != type) { pr_err("get C%d_LV%d_volt from sysconfig failed\n", k,i); goto fail; } volt = val.val; if(freq) { ptable[j].freq = freq / 1000; ptable[j].volt = volt; j++; } } *plen = j; } return 0; fail: return ret; }
static IMG_VOID ParseFex(IMG_VOID) { int value; int i; char mainkey[9] = {0}; char tfx_name[10] = {0}; sprintf(mainkey, "%s%d", "gpu_sgx544_", sunxi_get_soc_bin()); value = GetParaFromFex(mainkey, "normal_vol", 0); if(value > 0) { vf_data.normal.vol = value; } value = GetParaFromFex(mainkey, "normal_freq", 0); if(value > 0) { vf_data.normal.freq = value; } value = GetParaFromFex(mainkey, "extreme_vol", 0); if(value > 0) { vf_data.extreme.vol = value; } value = GetParaFromFex(mainkey, "extreme_freq", 0); if(value > 0) { vf_data.extreme.freq = value; } value = GetParaFromFex(mainkey, "scene_ctrl_status", 1); if(value != -1) { private_data.scene_ctrl_status = value; } value = GetParaFromFex(mainkey, "temp_ctrl_status", 1); if(value != -1) { private_data.tempctrl_data.temp_ctrl_status = value; } #ifdef CONFIG_CPU_BUDGET_THERMAL value = GetParaFromFex(mainkey, "tft_count", sizeof(tf_table)/sizeof(tf_table[0])); if(value > 0) { if(value < private_data.tempctrl_data.count) { private_data.tempctrl_data.count = value; } for(i = 0; i < private_data.tempctrl_data.count; i++) { sprintf(tfx_name, "tf%d_temp",i); value = GetParaFromFex(mainkey, tfx_name, 0); if(value != -1) { tf_table[i].temp = value; } sprintf(tfx_name, "tf%d_freq",i); value = GetParaFromFex(mainkey, tfx_name, 0); if(value != -1) { tf_table[i].freq = value; } } } #endif /* CONFIG_CPU_BUDGET_THERMAL */ }