s32 bsp_mem_dump_alloc_list(u32 u32Size, u32 u32PoolType) { u32 u32Item; u32 u32MostUsedItem; void* pCurAddr; u32 u32Num = 0; MEM_ALLOC_INFO* pAllocInfo; if (u32PoolType >= MEM_POOL_MAX) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"invalid pool type:%d\n", u32PoolType); return BSP_ERROR; } pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; MEM_FIND_RIGHT_ITEM(u32Item, u32Size, u32MostUsedItem); if (u32Item >= MEM_ALLOC_LIST_NUM) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"invalid size:%d\n", u32Size); return BSP_ERROR; } bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"dump alloc list beg:\n"); pCurAddr = pAllocInfo->allocList[u32Item]; for (;NULL != pCurAddr; pCurAddr = (void*)MEM_ITEM_NEXT(pCurAddr)) { (void)bsp_mem_dump_block((u32)pCurAddr); u32Num++; } bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"dump alloc list end, num:%d\n", u32Num); return BSP_OK; }
s32 bsp_mem_dump_alloc_list(u32 u32Size, u32 u32PoolType) { u32 u32Item; u32 u32MostUsedItem; void* pCurAddr; u32 u32Num = 0; MEM_ALLOC_INFO* pAllocInfo; if (u32PoolType >= MEM_POOL_MAX) { printk("invalid pool type:%d\n", u32PoolType); return ERROR; } pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; MEM_FIND_RIGHT_ITEM(u32Item, u32Size, u32MostUsedItem); if (u32Item >= MEM_ALLOC_LIST_NUM) { printk("invalid size:%d\n", u32Size); return -1; } printk("dump alloc list beg:\n"); pCurAddr = (void*)PHY_TO_VIRT((unsigned int)pAllocInfo->allocList[u32Item]); for (;NULL != pCurAddr; pCurAddr = (void*)MEM_ITEM_NEXT(pCurAddr)) { (void)bsp_mem_dump_block((u32)pCurAddr); u32Num++; } printk("dump alloc list end, num:%d\n", u32Num); return 0; }
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; }
void bsp_memory_free(u32 u32PoolType, void* pMem, u32 u32Size) { u32 cnt; u32 u32MostUsedItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); #ifdef __BSP_MEM_DEBUG__ /* 判断该节点是否有效 */ if (cnt >= MEM_ALLOC_LIST_NUM) { printk("bsp_pool_alloc Fail, size:%d, line:%d\n", u32Size, __LINE__); return; } #endif MEM_LOCK_BY_TYPE(u32PoolType); /* 将item挂回到链表 */ if (MEM_ICC_AXI_POOL == u32PoolType) { MEM_ITEM_NEXT(pMem) = (u32)(pAllocInfo->allocList[cnt]); pAllocInfo->allocList[cnt] = (void*)(DRV_AXI_VIRT_TO_PHY((u32)pMem)); } else if (MEM_ICC_DDR_POOL == u32PoolType) { MEM_ITEM_NEXT(pMem) = (u32)(pAllocInfo->allocList[cnt]); pAllocInfo->allocList[cnt] = (void *)SHD_DDR_V2P((u32)pMem); } #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum--; pAllocInfo->allocUsedInfoList[cnt].u32TotalFreeNum++; MEM_ITEM_STATUS(pMem) = MEM_FREE; #endif /* Flush Cache */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); MEM_UNLOCK_BY_TYPE(u32PoolType); return; }
STATIC void bsp_memory_free(u32 u32PoolType, void* pMem, u32 u32Size) { u32 cnt; u32 u32MostUsedItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); #ifdef __BSP_MEM_DEBUG__ /* 判断该节点是否有效 */ if (cnt >= MEM_ALLOC_LIST_NUM) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "memPoolAlloc Fail, size:%d, line:%d\n", u32Size, __LINE__); return; } #endif MEM_LOCK_BY_TYPE(u32PoolType);/*lint !e713*/ /* 将item挂回到链表 */ MEM_ITEM_NEXT(pMem) = (u32)pAllocInfo->allocList[cnt]; pAllocInfo->allocList[cnt] = pMem; #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum--; pAllocInfo->allocUsedInfoList[cnt].u32TotalFreeNum++; MEM_ITEM_STATUS(pMem) = MEM_FREE; #endif /* Flush Cache */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); MEM_UNLOCK_BY_TYPE(u32PoolType); return; }