/*
* Copyright (C) 2004-2010 NXP Software
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "InstAlloc.h"
/****************************************************************************************
* Name : InstAlloc_Init()
* Input : pms - Pointer to the INST_ALLOC instance
StartAddr - Base address of the instance memory
* Returns : Error code
* Description : Initializes the instance distribution and memory size calculation function
* Remarks :
****************************************************************************************/
void InstAlloc_Init( INST_ALLOC *pms,
void *StartAddr )
{
pms->TotalSize = 3;
pms->pNextMember = (((uintptr_t)StartAddr + 3) & (uintptr_t)~3);
}
/****************************************************************************************
* Name : InstAlloc_AddMember()
* Input : pms - Pointer to the INST_ALLOC instance
Size - The size in bytes of the new added member
* Returns : A pointer to the new added member
* Description : Allocates space for a new member in the instance memory and returns
a pointer to this new member. The start address of all members will
be 32 bit alligned.
* Remarks :
****************************************************************************************/
void* InstAlloc_AddMember( INST_ALLOC *pms,
LVM_UINT32 Size )
{
void *NewMemberAddress; /* Variable to temporarily store the return value */
NewMemberAddress = (void*)pms->pNextMember;
Size = ((Size + 3) & (LVM_UINT32)~3); /* Ceil the size to a multiple of four */
pms->TotalSize += Size;
pms->pNextMember += Size;
return(NewMemberAddress);
}
/****************************************************************************************
* Name : InstAlloc_GetTotal()
* Input : pms - Pointer to the INST_ALLOC instance
* Returns : The instance memory size
* Description : This functions returns the calculated instance memory size
* Remarks :
****************************************************************************************/
LVM_UINT32 InstAlloc_GetTotal( INST_ALLOC *pms)
{
if (pms->TotalSize > 3)
{
return(pms->TotalSize);
}
else
{
return 0; /* No memory added */
}
}
void InstAlloc_InitAll( INST_ALLOC *pms,
LVM_MemoryTable_st *pMemoryTable)
{
uintptr_t StartAddr;
StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress;
pms[0].TotalSize = 3;
pms[0].pNextMember = ((StartAddr + 3) & (uintptr_t)~3);
StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress;
pms[1].TotalSize = 3;
pms[1].pNextMember = ((StartAddr + 3) & (uintptr_t)~3);
StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress;
pms[2].TotalSize = 3;
pms[2].pNextMember = ((StartAddr + 3) & (uintptr_t)~3);
StartAddr = (uintptr_t)pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress;
pms[3].TotalSize = 3;
pms[3].pNextMember = ((StartAddr + 3) & (uintptr_t)~3);
}
/****************************************************************************************
* Name : InstAlloc_InitAll_NULL()
* Input : pms - Pointer to array of four INST_ALLOC instances
* Returns : Nothing
* Description : This function reserves Size of 3 bytes for all memory regions and
* intializes pNextMember for all regions to 0
* Remarks :
****************************************************************************************/
void InstAlloc_InitAll_NULL( INST_ALLOC *pms)
{
pms[0].TotalSize = 3;
pms[0].pNextMember = 0;
pms[1].TotalSize = 3;
pms[1].pNextMember = 0;
pms[2].TotalSize = 3;
pms[2].pNextMember = 0;
pms[3].TotalSize = 3;
pms[3].pNextMember = 0;
}
void* InstAlloc_AddMemberAll( INST_ALLOC *pms,
LVM_UINT32 Size[],
LVM_MemoryTable_st *pMemoryTable)
{
void *NewMemberAddress; /* Variable to temporarily store the return value */
/* coverity[returned_pointer] Ignore coverity warning that ptr is not used */
NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]);
pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_SLOW_DATA]);
pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Type = LVM_PERSISTENT_SLOW_DATA;
pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL;
NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]);
pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_DATA]);
pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Type = LVM_PERSISTENT_FAST_DATA;
pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL;
NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]);
pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_COEF]);
pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Type = LVM_PERSISTENT_FAST_COEF;
pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL;
NewMemberAddress = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]);
pMemoryTable->Region[LVM_TEMPORARY_FAST].Size = InstAlloc_GetTotal(&pms[LVM_TEMPORARY_FAST]);
pMemoryTable->Region[LVM_TEMPORARY_FAST].Type = LVM_TEMPORARY_FAST;
pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress = LVM_NULL;
return(NewMemberAddress);
}
void* InstAlloc_AddMemberAllRet( INST_ALLOC *pms,
LVM_UINT32 Size[],
void **ptr)
{
ptr[0] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]);
ptr[1] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]);
ptr[2] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]);
ptr[3] = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]);
return (ptr[0]);
}