12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software 32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project 42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License. 72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at 82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software 122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and 152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License. 162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "InstAlloc.h" 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**************************************************************************************** 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Name : InstAlloc_Init() 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Input : pms - Pointer to the INST_ALLOC instance 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent StartAddr - Base address of the instance memory 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Returns : Error code 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Description : Initializes the instance distribution and memory size calculation function 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Remarks : 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ****************************************************************************************/ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid InstAlloc_Init( INST_ALLOC *pms, 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *StartAddr ) 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms->TotalSize = 3; 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms->pNextMember = (LVM_UINT32)(((LVM_UINT32)StartAddr + 3) & 0xFFFFFFFC);/* This code will fail if the platform address space is more than 32-bits*/ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**************************************************************************************** 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Name : InstAlloc_AddMember() 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Input : pms - Pointer to the INST_ALLOC instance 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Size - The size in bytes of the new added member 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Returns : A pointer to the new added member 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Description : Allocates space for a new member in the instance memory and returns 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent a pointer to this new member. The start address of all members will 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent be 32 bit alligned. 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Remarks : 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ****************************************************************************************/ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid* InstAlloc_AddMember( INST_ALLOC *pms, 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 Size ) 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *NewMemberAddress; /* Variable to temporarily store the return value */ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NewMemberAddress = (void*)pms->pNextMember; 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Size = ((Size + 3) & 0xFFFFFFFC); /* Ceil the size to a multiple of four */ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms->TotalSize += Size; 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms->pNextMember += Size; 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(NewMemberAddress); 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**************************************************************************************** 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Name : InstAlloc_GetTotal() 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Input : pms - Pointer to the INST_ALLOC instance 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Returns : The instance memory size 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Description : This functions returns the calculated instance memory size 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Remarks : 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ****************************************************************************************/ 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_UINT32 InstAlloc_GetTotal( INST_ALLOC *pms) 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pms->TotalSize > 3) 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(pms->TotalSize); 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return 0; /* No memory added */ 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid InstAlloc_InitAll( INST_ALLOC *pms, 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_MemoryTable_st *pMemoryTable) 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 StartAddr; 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent StartAddr = (LVM_UINT32)pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress; 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[0].TotalSize = 3; 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[0].pNextMember = (LVM_UINT32)(((LVM_UINT32)StartAddr + 3) & 0xFFFFFFFC); 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent StartAddr = (LVM_UINT32)pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress; 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[1].TotalSize = 3; 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[1].pNextMember = (LVM_UINT32)(((LVM_UINT32)StartAddr + 3) & 0xFFFFFFFC); 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent StartAddr = (LVM_UINT32)pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress; 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[2].TotalSize = 3; 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[2].pNextMember = (LVM_UINT32)(((LVM_UINT32)StartAddr + 3) & 0xFFFFFFFC); 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent StartAddr = (LVM_UINT32)pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress; 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[3].TotalSize = 3; 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[3].pNextMember = (LVM_UINT32)(((LVM_UINT32)StartAddr + 3) & 0xFFFFFFFC); 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**************************************************************************************** 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Name : InstAlloc_InitAll_NULL() 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Input : pms - Pointer to array of four INST_ALLOC instances 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Returns : Nothing 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Description : This function reserves Size of 3 bytes for all memory regions and 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * intializes pNextMember for all regions to 0 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Remarks : 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ****************************************************************************************/ 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid InstAlloc_InitAll_NULL( INST_ALLOC *pms) 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[0].TotalSize = 3; 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[0].pNextMember = 0; 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[1].TotalSize = 3; 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[1].pNextMember = 0; 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[2].TotalSize = 3; 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[2].pNextMember = 0; 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[3].TotalSize = 3; 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pms[3].pNextMember = 0; 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid* InstAlloc_AddMemberAll( INST_ALLOC *pms, 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 Size[], 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_MemoryTable_st *pMemoryTable) 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *NewMemberAddress; /* Variable to temporarily store the return value */ 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* coverity[returned_pointer] Ignore coverity warning that ptr is not used */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]); 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_SLOW_DATA]); 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Type = LVM_PERSISTENT_SLOW_DATA; 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL; 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]); 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_DATA]); 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Type = LVM_PERSISTENT_FAST_DATA; 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL; 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]); 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_COEF]); 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Type = LVM_PERSISTENT_FAST_COEF; 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL; 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NewMemberAddress = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]); 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_TEMPORARY_FAST].Size = InstAlloc_GetTotal(&pms[LVM_TEMPORARY_FAST]); 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_TEMPORARY_FAST].Type = LVM_TEMPORARY_FAST; 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress = LVM_NULL; 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(NewMemberAddress); 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid* InstAlloc_AddMemberAllRet( INST_ALLOC *pms, 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 Size[], 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void **ptr) 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ptr[0] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]); 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ptr[1] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]); 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ptr[2] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]); 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ptr[3] = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]); 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (ptr[0]); 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 187