VOS_VOID TAF_APS_InitSwitchDdrInfo(VOS_VOID) { TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); PS_MEM_SET(pstSwitchDdrInfo, 0, sizeof(TAF_APS_SWITCH_DDR_RATE_INFO_STRU)); /* APS任务初始化起来后,主卡投票CPU频率到75Mhz */ #if defined(INSTANCE_1) #else /* 从NV中读取流速配置 */ TAF_APS_ReadDsflowRateConfigFromNv(pstSwitchDdrInfo); if (0 != TAF_APS_GET_DFS_PROFILE_NUM()) { /* 发起对DDR调频的投票请求,初始投票在为NV设置的第一个频率 */ if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosRequest(DFS_QOS_ID_DDR_MINFREQ_E, pstSwitchDdrInfo->ulMinBand, (BSP_S32 *)&(pstSwitchDdrInfo->iDfsReqId))) { TAF_APS_DFS_REQUEST_FAIL_CNT(1); return; } TAF_APS_DFS_REQUEST_SUCC_CNT(1); pstSwitchDdrInfo->ulReqValue = pstSwitchDdrInfo->ulMinBand; pstSwitchDdrInfo->ulSetMaxFlag = VOS_FALSE; } #endif return; }
void test_for_v9r1_interface(int inter_id, int request_id, int request_freq, int req_id) { int req_request_id = 0; switch(inter_id) { case 0://request if (PWRCTRL_DfsQosRequest(request_id, (u32)request_freq, &req_request_id)) { cpufreq_err("QosRequest error\n"); } break; case 1://release if (PWRCTRL_DfsQosRelease(request_id, &req_request_id)) { cpufreq_err("QosRelease error\n"); } break; case 2: //update (void)PWRCTRL_DfsQosUpdate(request_id, req_id, (u32)request_freq); break; default: break; } }
void cpufreq_init(void) { /*lint --e{516}*/ u32 i = 0; u32 retValue = 0; ST_PWC_SWITCH_STRU cpufreq_control_nv = {0} ; retValue = bsp_nvm_read(NV_ID_DRV_NV_DFS_SWITCH,(u8*)&g_stDfsSwitch,sizeof(ST_PWC_DFS_STRU)); if (NV_OK != retValue) { cpufreq_err("read nv failed use default value\n"); g_stDfsSwitch.CcpuDownLimit = 60; g_stDfsSwitch.CcpuDownNum = 3; g_stDfsSwitch.CcpuUpLimit = 85; g_stDfsSwitch.CcpuUpNum = 1; g_stDfsSwitch.DFSTimerLen = 400; g_stDfsSwitch.Strategy = 0;/*使用4s检测一次的策略*/ g_stDfsSwitch.DFSDdrUpLimit = 85; g_stDfsSwitch.DFSDdrDownLimit = 60; g_stDfsSwitch.DFSDdrprofile = 5; g_stDfsSwitch.reserved = 0; } retValue = bsp_nvm_read(NV_ID_DRV_NV_PWC_SWITCH,(u8*)&cpufreq_control_nv,sizeof(ST_PWC_SWITCH_STRU)); if (NV_OK == retValue) { g_cpufreq_lock_status_flag = cpufreq_control_nv.dfs; } else { cpufreq_err("read nv failed %d\n", retValue); } memset(&g_stDfsCpuConfigInfo, 0, sizeof(g_stDfsCpuConfigInfo)); memset(&g_stDfsCpuControl, 0, sizeof(g_stDfsCpuControl)); g_stDfsCpuControl.enCurProfile = BALONG_FREQ_MAX; register_icc_for_cpufreq(); cpufreq_table_init(); #ifdef CONFIG_CCORE_PM if (bsp_device_pm_add(&g_cpufreq_dpm_device)) { cpufreq_err("register dpm failed,check it\n"); } #endif /*bit1 使用MS级调频策略*/ if (g_stDfsSwitch.Strategy & 0x1) { g_sem_calccpu_flag = semBCreate(SEM_Q_PRIORITY, SEM_FULL); /*lint !e64 */ if (NULL == g_sem_calccpu_flag) { cpufreq_err("Create g_sem_k3get_volt Failed %d\n", g_sem_calccpu_flag); } } g_stDfsCpuConfigInfo.ulDFSFunEnableFlag = DFS_TRUE; g_stDfsCpuConfigInfo.usProfileDownTime = g_stDfsSwitch.CcpuDownNum; g_stDfsCpuConfigInfo.usProfileUpTime = g_stDfsSwitch.CcpuUpNum; g_stDfsCpuConfigInfo.ulProfileNum = DC_RESV; g_stDfsCpuConfigInfo.ulTimerLen = g_stDfsSwitch.DFSTimerLen; g_test_in_interr_times = g_stDfsSwitch.DFSTimerLen; for (i = 0; i < g_stDfsCpuConfigInfo.ulProfileNum; i++) { g_stDfsCpuConfigInfo.astThresHold[i].usProfileUpLimit = g_stDfsSwitch.CcpuUpLimit; g_stDfsCpuConfigInfo.astThresHold[i].usProfileDownLimit = g_stDfsSwitch.CcpuDownLimit; } INIT_LIST_HEAD(&(g_v9_qos_list.entry)); /*添加DDR调频请求*/ (void)PWRCTRL_DfsQosRequest(DFS_QOS_ID_DDR_MINFREQ, BALONG_DDRFREQUENCY_MIN, &g_ddr_request_id); taskSpawn("dfs_task", 1, 0, 4096, (FUNCPTR)pwrctrl_dfs_mgrmsg_task, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);/*lint !e64 !e119 */ g_cpufreq_start_time = bsp_get_slice_value(); cpufreq_err("cpufreq init ok\n"); return; }