VOS_VOID TAF_APS_ShowDdrInfo(VOS_VOID) { VOS_UINT32 i; VOS_UINT32 j; TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); vos_printf("request id %d\n", pstSwitchDdrInfo->iDfsReqId); vos_printf("request value %d\n", pstSwitchDdrInfo->ulReqValue); vos_printf("multi dfs flag %d\n", pstSwitchDdrInfo->ulMultiDfsFlg); for (i = 0; i < TAF_NVIM_DIFF_DFS_NUM; i++) { for (j = 0; j < pstSwitchDdrInfo->astDfsConfig[i].ulProfileNum; j++) { vos_printf("rat[%d] profile[%d] ulDlRate %d\n", i, j, pstSwitchDdrInfo->astDfsConfig[i].astProfile[j].ulDlRate); vos_printf("rat[%d] profile[%d] ulUlRate %d\n", i, j, pstSwitchDdrInfo->astDfsConfig[i].astProfile[j].ulUlRate); vos_printf("rat[%d] profile[%d] ulDdrBand %d\n", i, j, pstSwitchDdrInfo->astDfsConfig[i].astProfile[j].ulDdrBand); } } vos_printf("request Suc Count %d\n", pstSwitchDdrInfo->stDfsDebugInfo.ulRequestSucCnt); vos_printf("request fail Count %d\n", pstSwitchDdrInfo->stDfsDebugInfo.ulRequestFailCnt); vos_printf("update Suc Count %d\n", pstSwitchDdrInfo->stDfsDebugInfo.ulUpdateSucCnt); vos_printf("update fail count %d\n", pstSwitchDdrInfo->stDfsDebugInfo.ulUpdateFailCnt); vos_printf("min band %d\n", pstSwitchDdrInfo->ulMinBand); vos_printf("max band %d\n", pstSwitchDdrInfo->ulMaxBand); }
VOS_VOID TAF_APS_ReleaseDfs(VOS_VOID) { #if defined(INSTANCE_1) #else TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); if (0 != TAF_APS_GET_DFS_PROFILE_NUM()) { if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, TAF_APS_GET_DSFLOW_RELEASE_DFS())) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = TAF_APS_GET_DSFLOW_RELEASE_DFS(); pstSwitchDdrInfo->ulSetMaxFlag = VOS_FALSE; TAF_APS_DFS_UPDATE_SUCC_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); DRV_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_DSFLOW); } #endif return; }
VOS_VOID TAF_APS_SetDfsMax(VOS_VOID) { TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; TAF_APS_TIMER_STATUS_ENUM_U8 enTimerStatus; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); /* 调频功能不支持,则什么都不处理 */ if (0 == TAF_APS_GET_DFS_PROFILE_NUM()) { return; } /* 当前流量定时器没有启动,什么都不处理 */ enTimerStatus = TAF_APS_GetTimerStatus(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); if (TAF_APS_TIMER_STATUS_RUNING != enTimerStatus) { return; } /* 已经是最高档位,不再调节 */ if (TAF_APS_GET_DSFLOW_MAX_DDR_BAND() == pstSwitchDdrInfo->ulReqValue) { return; } /* 直接将DDR调到最高一档 */ if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, (BSP_U32)TAF_APS_GET_DSFLOW_MAX_DDR_BAND())) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = TAF_APS_GET_DSFLOW_MAX_DDR_BAND(); pstSwitchDdrInfo->ulSetMaxFlag = VOS_TRUE; TAF_APS_DFS_UPDATE_SUCC_CNT(1); DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_DSFLOW); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; }
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; }
VOS_VOID TAF_APS_SwitchDdrRateByCurrentRate( VOS_UINT32 ulDlRate, VOS_UINT32 ulUlRate ) { #if defined(INSTANCE_1) #else TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; VOS_UINT32 ulReqValue; VOS_UINT32 ulMinDdrFlg; ulReqValue = TAF_APS_GET_DSFLOW_MIN_DDR_BAND(); pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); ulMinDdrFlg = VOS_FALSE; /* 如果有设置过最大频率这本次的调频不再处理 */ if (VOS_TRUE == pstSwitchDdrInfo->ulSetMaxFlag) { pstSwitchDdrInfo->ulSetMaxFlag = VOS_FALSE; return; } /* 目前的DDR调频策略: 下行大于72M, DDR调到533Mhz; 下行小于72M大于36M, 或者上行大于36M, DDR调到360Mhz; 下行小于36M大于2M, 或者上行小于36M大于2M, DDR调到266Mhz; 下行小于2M大于300K, 或者上行小于2M大于300K, DDR调到150Mhz; 上下行都小于300K, DDR调到75Mhz. */ /* 根据当前的上下行速率查找DDR投票请求值 */ if (VOS_TRUE == TAF_APS_GET_MULTI_DFS_SUPPORT_FLG()) { if (VOS_OK != TAF_APS_FindDfsReqValueByRat(&ulReqValue, ulDlRate, ulUlRate)) { return; } } if (VOS_FALSE == TAF_APS_GET_MULTI_DFS_SUPPORT_FLG()) { if (VOS_OK != TAF_APS_FindDfsReqValue(&ulReqValue, ulDlRate, ulUlRate)) { return; } } /* 防止重复投票 */ if (ulReqValue == pstSwitchDdrInfo->ulReqValue) { return; } if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, (BSP_U32)ulReqValue)) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = ulReqValue; TAF_APS_DFS_UPDATE_SUCC_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); ulMinDdrFlg = TAF_APS_CheckIfMinDdrBand(ulReqValue); /* 目前流量统计的时间是1秒,当突然没有流量时,连接态立即进入到IDLE态后,CCPU 进入睡眠后,流量统计定时器不再超时时,DDR之前投票到高频后就无法降到低频, 故增加对CCPU睡眠的投票 */ /* 流速小于300K时释放CCPU睡眠投票,大于300K时阻止CCPU睡眠 */ if (VOS_TRUE == ulMinDdrFlg) { DRV_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_DSFLOW); } else { DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_DSFLOW); } #endif return; }