u8* bsp_memory_alloc(u32 u32PoolType, u32 u32Size) { u32 cnt; void *pItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32 u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); /* 如果没有找到则直接返回失败 */ if (cnt >= MEM_ALLOC_LIST_NUM) { printk( "Invalid malloc size:%d, line:%d\n", u32Size, __LINE__); return NULL; } /* 更新size为列表中的size */ u32Size = MEM_GET_ALLOC_SIZE(cnt); /*lint -save -e718 -e746*/ MEM_LOCK_BY_TYPE(u32PoolType); /*lint -restore*/ pItem = bsp_get_item(pAllocInfo, cnt, u32PoolType, u32Size); if (NULL != pItem) { #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum++; pAllocInfo->allocUsedInfoList[cnt].u32TotalMallocNum++; if (pAllocInfo->allocUsedInfoList[cnt].u32CurNum > pAllocInfo->allocUsedInfoList[cnt].u32MaxNum) { pAllocInfo->allocUsedInfoList[cnt].u32MaxNum = pAllocInfo->allocUsedInfoList[cnt].u32CurNum; } MEM_ITEM_STATUS(pItem) = MEM_ALLOC; #endif /* 多核要 Flush Cache, 确保管理信息写入 */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pItem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); } MEM_UNLOCK_BY_TYPE(u32PoolType); return pItem; }
s32 bsp_mem_info(u32 u32MemType) { u32 u32Item; MEM_ALLOC_INFO* pAllocInfo; if (u32MemType >= MEM_POOL_MAX) { printk("invalid pool type:%d\n", u32MemType); return ERROR; } pAllocInfo = MEM_GET_ALLOC_INFO(u32MemType); printk("Dump Mem (%s):\n", g_memPoolName[u32MemType]); printk("================================\n"); printk("mem pool info:\n"); printk("--------------------------------\n"); printk("Base Addr: 0x%x\n", pAllocInfo->memPoolInfo.u32BaseAddr); printk("Total Size: %d(0x%x)\n", pAllocInfo->memPoolInfo.u32Size, pAllocInfo->memPoolInfo.u32Size); printk("Left Size: %d(0x%x)\n", pAllocInfo->memPoolInfo.u32Left, pAllocInfo->memPoolInfo.u32Left); printk("Cur Pos Addr: 0x%x\n", pAllocInfo->memPoolInfo.u32CurPosAddr); printk("Mgr Size: %d\n", pAllocInfo->memPoolInfo.u32MgrSize); printk("Most Used Item: %d\n", pAllocInfo->mostUsedItem); printk("Alloc Fail Count: %d\n", pAllocInfo->u32AllocFailCnt); printk("\n"); printk("================================\n"); printk("mem list used info:\n"); printk("--------------------------------\n"); for (u32Item = 0; u32Item < MEM_ALLOC_LIST_NUM; u32Item++) { printk("+-- dump size:%d list info:\n", MEM_GET_ALLOC_SIZE(u32Item)); printk("|-- cur alloc num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32CurNum); printk("|-- max alloc num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32MaxNum); if(u32MemType== MEM_ICC_DDR_POOL) { printk("|-- min num line: %d\n", sg_AllocMinNum[u32Item]); printk("|-- max num line: %d\n", sg_AllocMaxNum[u32Item]); } printk("|-- total alloc num:%d\n", pAllocInfo->allocUsedInfoList[u32Item].u32TotalMallocNum); printk("|-- total free num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32TotalFreeNum); printk("+-- \n"); } printk("================================\n"); return 0; }
s32 bsp_set_most_used_size(u32 u32Size, u32 u32PoolType) { u32 u32Item; if (u32PoolType != MEM_ICC_DDR_POOL) { return ERROR; } for ((u32Item) = 0; (u32Item) < MEM_ALLOC_LIST_NUM && u32Size > MEM_GET_ALLOC_SIZE(u32Item); (u32Item)++) ; if (u32Item >= MEM_ALLOC_LIST_NUM) { printk("invalid size:%d, line:%d\n", u32Size, __LINE__); return ERROR; } /* 设置时要设置 MostItem - 1, 方便查找 */ MEM_GET_ALLOC_INFO(u32PoolType)->mostUsedItem = (u32Item == 0) ? (0) : (u32Item-1); return OK; }
s32 bsp_mem_info(u32 u32MemType) { u32 u32Item; MEM_ALLOC_INFO* pAllocInfo; if (u32MemType >= MEM_POOL_MAX) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"invalid pool type:%d\n", u32MemType); return BSP_ERROR; } //for (u32MemType = MEM_NORM_DDR_POOL; u32MemType < MEM_POOL_MAX; u32MemType++) { pAllocInfo = MEM_GET_ALLOC_INFO(u32MemType); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Dump Mem (%s):\n", g_memPoolName[u32MemType]); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"mem pool info:\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"--------------------------------\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Base Addr: 0x%x\n", pAllocInfo->memPoolInfo.u32BaseAddr); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Total Size: %d(0x%x)\n", pAllocInfo->memPoolInfo.u32Size, pAllocInfo->memPoolInfo.u32Size); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Left Size: %d(0x%x)\n", pAllocInfo->memPoolInfo.u32Left, pAllocInfo->memPoolInfo.u32Left); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Cur Pos Addr: 0x%x\n", pAllocInfo->memPoolInfo.u32CurPosAddr); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Mgr Size: %d\n", pAllocInfo->memPoolInfo.u32MgrSize); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Most Used Item: %d\n", pAllocInfo->mostUsedItem); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"Alloc Fail Count: %d\n", pAllocInfo->u32AllocFailCnt); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"mem list used info:\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"--------------------------------\n"); for (u32Item = 0; u32Item < MEM_ALLOC_LIST_NUM; u32Item++) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"+-- dump size:%d list info:\n", MEM_GET_ALLOC_SIZE(u32Item)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- cur alloc num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32CurNum); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- max alloc num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32MaxNum); if(u32MemType== MEM_ICC_DDR_POOL) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- min num line: %d\n", sg_AllocMinNum[u32Item]); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- max num line: %d\n", sg_AllocMaxNum[u32Item]); } bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- total alloc num:%d\n", pAllocInfo->allocUsedInfoList[u32Item].u32TotalMallocNum); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"|-- total free num: %d\n", pAllocInfo->allocUsedInfoList[u32Item].u32TotalFreeNum); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"+-- \n"); } bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); } return BSP_OK; }