128 lines
3.8 KiB
C
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;
|
||
|
}
|
||
|
|
||
|
|