yb_arm/app/src/mem_sections.c
2023-07-12 14:14:31 +08:00

128 lines
3.8 KiB
C

// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : mem_section.c
// Author : xianfeng.du
// Created On : 2022-06-25
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "mem_sections.h"
#include "ucp_printf.h"
MEM_SECTION_INFO RFM_IM_SECTION EcsSram = {
.baseAddr = (ECS_SRAM_BASE_ADDR + 0x0),
.currAddr = (ECS_SRAM_BASE_ADDR + 0x0),
.maxSize = ECS_SRAM_SIZE,
.memSectionName = "ECS_SRAM"
};
MEM_SECTION_INFO RFM_IM_SECTION PetSram = {
.baseAddr = (PET_SRAM_BASE_ADDR + 0x0),
.currAddr = (PET_SRAM_BASE_ADDR + 0x0),
.maxSize = PET_SRAM_SIZE,
.memSectionName = "PET_SRAM"
};
MEM_SECTION_INFO RFM_IM_SECTION MsgDdrMem = {
.baseAddr = (UCP_MSG_MEM_BASE_ADDR + 0x0),
.currAddr = (UCP_MSG_MEM_BASE_ADDR + 0x0),
.maxSize = UCP_MSG_MEM_SIZE,
.memSectionName = "MSG_DDR_MEM"
};
void memSectionInit(MEM_SECTION_INFO* memSecInfo, uint64_t baseAddr, uint32_t maxSize, char* memSectionName)
{
UCP_PRINT_LOG("[memSectionInit]: 0x%lx, 0x%lx, %u, %s", (uint64_t)memSecInfo, baseAddr, maxSize, memSectionName);
memSecInfo->baseAddr = baseAddr;
memSecInfo->maxSize = maxSize;
memSecInfo->memSectionName = memSectionName;
memSecInfo->currAddr = baseAddr;
}
void memSectionReset(MEM_SECTION_INFO* memSecInfo)
{
memSecInfo->currAddr = memSecInfo->baseAddr;
}
void memSectionAllocPrint(MEM_SECTION_INFO* memSecInfo, uint32_t allocSize, char* varString)
{
#if (UCP_PRINT_LEVEL & PRINT_DEBUG)
char* pMemSectionName = (char*)&memSecInfo->memSectionName[0];
#endif
UCP_PRINT_DEBUG("Memory Section - [%s]: Base Address: [0x%lx]; Maximum Size: [%8u]\n",
pMemSectionName,
memSecInfo->baseAddr,
memSecInfo->maxSize);
UCP_PRINT_DEBUG("Memory Section - [%s]: Variable Name: [%s]; Allocated Address: [0x%lx]; Allocated Size: [%6u]\n",
pMemSectionName,
varString,
memSecInfo->currAddr,
allocSize);
}
void* memSectionAlloc(MEM_SECTION_INFO* memSecInfo, uint32_t allocSize, uint32_t allocAlign, char* varString)
{
void* ret;
uint64_t baseAddr = memSecInfo->baseAddr;
uint64_t currAddr = ((memSecInfo->currAddr + (allocAlign - 1)) / allocAlign) * allocAlign;
uint32_t maxSize = memSecInfo->maxSize;
uint8_t* p = (uint8_t *)baseAddr;
uint32_t offset = currAddr - baseAddr;
if ((offset + allocSize) <= maxSize) {
ret = (void*)&p[offset];
memSecInfo->currAddr = currAddr;
/* disable as default since it cost much time. Could be enabled when needed. */
memSectionAllocPrint(memSecInfo, allocSize, varString);
memSecInfo->currAddr = currAddr + allocSize;
} else {
UCP_PRINT_ERROR("Memory Section - [%s]: Base Address: [0x%lx]; Maximum Size: [%8u]",
memSecInfo->memSectionName,
baseAddr,
maxSize);
UCP_PRINT_ERROR("Memory Section - [%s]: Variable Name: [%s]; Allocated Address: [0x%lx]; Allocated Size: [%6u]",
memSecInfo->memSectionName,
varString,
currAddr,
allocSize);
UCP_PRINT_ERROR("Can't allocate %u bytes in Memory Section - [%s] for Variable - [%s]!", allocSize, memSecInfo->memSectionName, varString);
ret = NULL;
}
return ret;
}
/*MEM_SECTION_INFO* GetEcsSramSection()
{
return (MEM_SECTION_INFO*)&EcsSram;
}*/
MEM_SECTION_INFO* GetPetSramSection()
{
return (MEM_SECTION_INFO*)&PetSram;
}
MEM_SECTION_INFO* GetMsgDdrSection()
{
return (MEM_SECTION_INFO*)&MsgDdrMem;
}