u32 res_trk_set_perf_level(u32 req_perf_lvl, u32 *pn_set_perf_lvl, struct vcd_dev_ctxt *dev_ctxt) { u32 vidc_freq = 0; if (!pn_set_perf_lvl || !dev_ctxt) { VCDRES_MSG_ERROR("%s(): NULL pointer! dev_ctxt(%p)\n", __func__, dev_ctxt); return false; } VCDRES_MSG_LOW("%s(), req_perf_lvl = %d", __func__, req_perf_lvl); #ifdef CONFIG_MSM_BUS_SCALING if (!res_trk_update_bus_perf_level(dev_ctxt, req_perf_lvl) < 0) { VCDRES_MSG_ERROR("%s(): update buf perf level failed\n", __func__); return false; } #endif if (dev_ctxt->reqd_perf_lvl + dev_ctxt->curr_perf_lvl == 0) req_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; if (req_perf_lvl <= RESTRK_1080P_VGA_PERF_LEVEL) { vidc_freq = vidc_clk_table[0]; *pn_set_perf_lvl = RESTRK_1080P_VGA_PERF_LEVEL; } else if (req_perf_lvl < RESTRK_1080P_720P_PERF_LEVEL) { vidc_freq = vidc_clk_table[1]; *pn_set_perf_lvl = RESTRK_1080P_720P_PERF_LEVEL; } else if (req_perf_lvl == RESTRK_1080P_720P_PERF_LEVEL){ vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } else if (req_perf_lvl <= RESTRK_1080P_MAX_PERF_LEVEL) { vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } else { vidc_freq = vidc_clk_table[3]; *pn_set_perf_lvl = RESTRK_1080P_TURBO_PERF_LEVEL; } resource_context.perf_level = *pn_set_perf_lvl; VCDRES_MSG_MED("VIDC: vidc_freq = %u, req_perf_lvl = %u\n", vidc_freq, req_perf_lvl); #ifdef USE_RES_TRACKER if (req_perf_lvl != RESTRK_1080P_MIN_PERF_LEVEL) { VCDRES_MSG_MED("%s(): Setting vidc freq to %u\n", __func__, vidc_freq); if (!res_trk_sel_clk_rate(vidc_freq)) { VCDRES_MSG_ERROR("%s(): res_trk_sel_clk_rate FAILED\n", __func__); *pn_set_perf_lvl = 0; return false; } } #endif VCDRES_MSG_MED("%s() set perl level : %d", __func__, *pn_set_perf_lvl); pr_err("NOTE: %s() set perl level : %d", __func__, *pn_set_perf_lvl); return true; }
u32 res_trk_set_perf_level(u32 req_perf_lvl, u32 *pn_set_perf_lvl, struct vcd_clnt_ctxt *cctxt) { u32 vidc_freq = 0; if (!pn_set_perf_lvl) { VCDRES_MSG_ERROR("%s(): pn_perf_lvl is NULL\n", __func__); return false; } VCDRES_MSG_LOW("%s(), req_perf_lvl = %d", __func__, req_perf_lvl); if (cctxt) { if (req_perf_lvl <= RESTRK_1080P_VGA_PERF_LEVEL) { vidc_freq = vidc_clk_table[0]; *pn_set_perf_lvl = RESTRK_1080P_VGA_PERF_LEVEL; } else if (req_perf_lvl <= RESTRK_1080P_720P_PERF_LEVEL) { vidc_freq = vidc_clk_table[1]; *pn_set_perf_lvl = RESTRK_1080P_720P_PERF_LEVEL; } else { vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } resource_context.perf_level = *pn_set_perf_lvl; VCDRES_MSG_HIGH("\n VIDC: vidc_freq = %u, req_perf_lvl = %u", vidc_freq, req_perf_lvl); } else { VCDRES_MSG_HIGH("%s() WARNING:: cctxt is NULL", __func__); return true; } #ifdef USE_RES_TRACKER if (req_perf_lvl != RESTRK_1080P_MIN_PERF_LEVEL) { VCDRES_MSG_HIGH("\n %s(): Setting vidc freq to %u", __func__, vidc_freq); if (!res_trk_sel_clk_rate(vidc_freq)) { VCDRES_MSG_ERROR("%s(): res_trk_sel_clk_rate FAILED\n", __func__); *pn_set_perf_lvl = 0; return false; } } #endif VCDRES_MSG_HIGH("%s() set perl level : %d", __func__, *pn_set_perf_lvl); return true; }
u32 res_trk_set_perf_level(u32 req_perf_lvl, u32 *pn_set_perf_lvl, struct vcd_dev_ctxt *dev_ctxt) { struct vcd_clnt_ctxt *cctxt_itr = NULL; u32 axi_freq = 0, mfc_freq = 0, calc_mfc_freq = 0; u8 enc_clnt_present = false; if (!pn_set_perf_lvl || !dev_ctxt) { VCDRES_MSG_ERROR("%s(): NULL pointer! dev_ctxt(%p)\n", __func__, dev_ctxt); return false; } VCDRES_MSG_LOW("%s(), req_perf_lvl = %d", __func__, req_perf_lvl); calc_mfc_freq = res_trk_convert_perf_lvl_to_freq( (u64)req_perf_lvl); if (calc_mfc_freq < VCD_RESTRK_MIN_FREQ_POINT) calc_mfc_freq = VCD_RESTRK_MIN_FREQ_POINT; else if (calc_mfc_freq > VCD_RESTRK_MAX_FREQ_POINT) calc_mfc_freq = VCD_RESTRK_MAX_FREQ_POINT; cctxt_itr = dev_ctxt->cctxt_list_head; while (cctxt_itr) { VCDRES_MSG_LOW("\n cctxt_itr = %p", cctxt_itr); if (!cctxt_itr->decoding) { VCDRES_MSG_LOW("\n Encoder client"); enc_clnt_present = true; break; } else { VCDRES_MSG_LOW("\n Decoder client"); } cctxt_itr = cctxt_itr->next; } if (enc_clnt_present) { if (req_perf_lvl >= VGA_PERF_LEVEL) { mfc_freq = mfc_clk_freq_table[2]; axi_freq = axi_clk_freq_table_enc[1]; } else { mfc_freq = mfc_clk_freq_table[0]; axi_freq = axi_clk_freq_table_enc[0]; } VCDRES_MSG_MED("\n ENCODER: axi_freq = %u" ", mfc_freq = %u, calc_mfc_freq = %u," " req_perf_lvl = %u", axi_freq, mfc_freq, calc_mfc_freq, req_perf_lvl); } else { if (req_perf_lvl <= QVGA_PERF_LEVEL) { mfc_freq = mfc_clk_freq_table[0]; axi_freq = axi_clk_freq_table_dec[0]; } else { axi_freq = axi_clk_freq_table_dec[0]; if (req_perf_lvl <= VGA_PERF_LEVEL) mfc_freq = mfc_clk_freq_table[0]; else if (req_perf_lvl <= WVGA_PERF_LEVEL) mfc_freq = mfc_clk_freq_table[1]; else { mfc_freq = mfc_clk_freq_table[2]; axi_freq = axi_clk_freq_table_dec[1]; } } VCDRES_MSG_MED("\n DECODER: axi_freq = %u" ", mfc_freq = %u, calc_mfc_freq = %u," " req_perf_lvl = %u", axi_freq, mfc_freq, calc_mfc_freq, req_perf_lvl); } #ifdef AXI_CLK_SCALING if (req_perf_lvl != VCD_RESTRK_MIN_PERF_LEVEL) { VCDRES_MSG_MED("\n %s(): Setting AXI freq to %u", __func__, axi_freq); clk_set_rate(ebi1_clk, axi_freq * 1000); } #endif #ifdef USE_RES_TRACKER if (req_perf_lvl != VCD_RESTRK_MIN_PERF_LEVEL) { VCDRES_MSG_MED("\n %s(): Setting MFC freq to %u", __func__, mfc_freq); if (!res_trk_sel_clk_rate(mfc_freq)) { VCDRES_MSG_ERROR("%s(): res_trk_sel_clk_rate FAILED\n", __func__); *pn_set_perf_lvl = 0; return false; } } #endif *pn_set_perf_lvl = res_trk_convert_freq_to_perf_lvl((u64) mfc_freq); return true; }
u32 res_trk_set_perf_level(u32 req_perf_lvl, u32 *pn_set_perf_lvl, struct vcd_dev_ctxt *dev_ctxt) { u32 vidc_freq = 0; if (!pn_set_perf_lvl || !dev_ctxt) { VCDRES_MSG_ERROR("%s(): NULL pointer! dev_ctxt(%p)\n", __func__, dev_ctxt); return false; } if (dev_ctxt->turbo_mode_set && (req_perf_lvl < RESTRK_1080P_TURBO_PERF_LEVEL)) { VCDRES_MSG_MED("%s(): TURBO MODE!!\n", __func__); return true; } VCDRES_MSG_LOW("%s(), req_perf_lvl = %d", __func__, req_perf_lvl); if (resource_context.vidc_platform_data->disable_turbo && req_perf_lvl > RESTRK_1080P_MAX_PERF_LEVEL) { VCDRES_MSG_ERROR("%s(): Turbo not supported! dev_ctxt(%p)\n", __func__, dev_ctxt); } #ifdef CONFIG_MSM_BUS_SCALING if (!res_trk_update_bus_perf_level(dev_ctxt, req_perf_lvl) < 0) { VCDRES_MSG_ERROR("%s(): update buf perf level failed\n", __func__); return false; } #endif if (dev_ctxt->reqd_perf_lvl + dev_ctxt->curr_perf_lvl == 0) req_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; if (req_perf_lvl <= RESTRK_1080P_VGA_PERF_LEVEL) { vidc_freq = vidc_clk_table[0]; *pn_set_perf_lvl = RESTRK_1080P_VGA_PERF_LEVEL; } else if (req_perf_lvl <= RESTRK_1080P_720P_PERF_LEVEL) { vidc_freq = vidc_clk_table[1]; *pn_set_perf_lvl = RESTRK_1080P_720P_PERF_LEVEL; } else if (req_perf_lvl <= RESTRK_1080P_MAX_PERF_LEVEL) { vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } else { vidc_freq = vidc_clk_table[4]; *pn_set_perf_lvl = RESTRK_1080P_TURBO_PERF_LEVEL; } if (resource_context.vidc_platform_data->disable_turbo && *pn_set_perf_lvl == RESTRK_1080P_TURBO_PERF_LEVEL) { VCDRES_MSG_ERROR("Warning: Turbo mode not supported " " falling back to 1080p clocks\n"); vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } resource_context.perf_level = *pn_set_perf_lvl; VCDRES_MSG_MED("VIDC: vidc_freq = %u, req_perf_lvl = %u\n", vidc_freq, req_perf_lvl); #ifdef USE_RES_TRACKER if (req_perf_lvl != RESTRK_1080P_MIN_PERF_LEVEL) { VCDRES_MSG_MED("%s(): Setting vidc freq to %u\n", __func__, vidc_freq); if (!res_trk_sel_clk_rate(vidc_freq)) { if (vidc_freq == vidc_clk_table[4]) { if (res_trk_sel_clk_rate(vidc_clk_table[3])) goto ret; } VCDRES_MSG_ERROR("%s(): res_trk_sel_clk_rate FAILED\n", __func__); *pn_set_perf_lvl = 0; return false; } } #endif ret: VCDRES_MSG_MED("%s() set perl level : %d", __func__, *pn_set_perf_lvl); return true; }