1 /* 2 * Copyright (C) 2004-2010 NXP Software 3 * Copyright (C) 2010 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #include "InstAlloc.h" 19 20 /**************************************************************************************** 21 * Name : InstAlloc_Init() 22 * Input : pms - Pointer to the INST_ALLOC instance 23 StartAddr - Base address of the instance memory 24 * Returns : Error code 25 * Description : Initializes the instance distribution and memory size calculation function 26 * Remarks : 27 ****************************************************************************************/ 28 29 void InstAlloc_Init( INST_ALLOC *pms, 30 void *StartAddr ) 31 { 32 pms->TotalSize = 3; 33 pms->pNextMember = (((uintptr_t)StartAddr + 3) & (uintptr_t)~3); 34 } 35 36 37 /**************************************************************************************** 38 * Name : InstAlloc_AddMember() 39 * Input : pms - Pointer to the INST_ALLOC instance 40 Size - The size in bytes of the new added member 41 * Returns : A pointer to the new added member 42 * Description : Allocates space for a new member in the instance memory and returns 43 a pointer to this new member. The start address of all members will 44 be 32 bit alligned. 45 * Remarks : 46 ****************************************************************************************/ 47 48 void* InstAlloc_AddMember( INST_ALLOC *pms, 49 LVM_UINT32 Size ) 50 { 51 void *NewMemberAddress; /* Variable to temporarily store the return value */ 52 NewMemberAddress = (void*)pms->pNextMember; 53 54 Size = ((Size + 3) & (LVM_UINT32)~3); /* Ceil the size to a multiple of four */ 55 56 pms->TotalSize += Size; 57 pms->pNextMember += Size; 58 59 return(NewMemberAddress); 60 } 61 62 63 /**************************************************************************************** 64 * Name : InstAlloc_GetTotal() 65 * Input : pms - Pointer to the INST_ALLOC instance 66 * Returns : The instance memory size 67 * Description : This functions returns the calculated instance memory size 68 * Remarks : 69 ****************************************************************************************/ 70 71 LVM_UINT32 InstAlloc_GetTotal( INST_ALLOC *pms) 72 { 73 if (pms->TotalSize > 3) 74 { 75 return(pms->TotalSize); 76 } 77 else 78 { 79 return 0; /* No memory added */ 80 } 81 } 82 83 84 void InstAlloc_InitAll( INST_ALLOC *pms, 85 LVM_MemoryTable_st *pMemoryTable) 86 { 87 uintptr_t StartAddr; 88 89 StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress; 90 91 pms[0].TotalSize = 3; 92 pms[0].pNextMember = ((StartAddr + 3) & (uintptr_t)~3); 93 94 95 StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress; 96 97 pms[1].TotalSize = 3; 98 pms[1].pNextMember = ((StartAddr + 3) & (uintptr_t)~3); 99 100 101 StartAddr = (uintptr_t)pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress; 102 103 pms[2].TotalSize = 3; 104 pms[2].pNextMember = ((StartAddr + 3) & (uintptr_t)~3); 105 106 107 StartAddr = (uintptr_t)pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress; 108 109 pms[3].TotalSize = 3; 110 pms[3].pNextMember = ((StartAddr + 3) & (uintptr_t)~3); 111 112 } 113 114 /**************************************************************************************** 115 * Name : InstAlloc_InitAll_NULL() 116 * Input : pms - Pointer to array of four INST_ALLOC instances 117 * Returns : Nothing 118 * Description : This function reserves Size of 3 bytes for all memory regions and 119 * intializes pNextMember for all regions to 0 120 * Remarks : 121 ****************************************************************************************/ 122 123 void InstAlloc_InitAll_NULL( INST_ALLOC *pms) 124 { 125 pms[0].TotalSize = 3; 126 pms[0].pNextMember = 0; 127 128 129 pms[1].TotalSize = 3; 130 pms[1].pNextMember = 0; 131 132 pms[2].TotalSize = 3; 133 pms[2].pNextMember = 0; 134 135 pms[3].TotalSize = 3; 136 pms[3].pNextMember = 0; 137 138 } 139 140 141 void* InstAlloc_AddMemberAll( INST_ALLOC *pms, 142 LVM_UINT32 Size[], 143 LVM_MemoryTable_st *pMemoryTable) 144 { 145 void *NewMemberAddress; /* Variable to temporarily store the return value */ 146 147 /* coverity[returned_pointer] Ignore coverity warning that ptr is not used */ 148 NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]); 149 150 pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_SLOW_DATA]); 151 pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].Type = LVM_PERSISTENT_SLOW_DATA; 152 pMemoryTable->Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL; 153 154 NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]); 155 156 pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_DATA]); 157 pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].Type = LVM_PERSISTENT_FAST_DATA; 158 pMemoryTable->Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL; 159 160 NewMemberAddress = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]); 161 162 pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Size = InstAlloc_GetTotal(&pms[LVM_PERSISTENT_FAST_COEF]); 163 pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].Type = LVM_PERSISTENT_FAST_COEF; 164 pMemoryTable->Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL; 165 166 NewMemberAddress = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]); 167 168 pMemoryTable->Region[LVM_TEMPORARY_FAST].Size = InstAlloc_GetTotal(&pms[LVM_TEMPORARY_FAST]); 169 pMemoryTable->Region[LVM_TEMPORARY_FAST].Type = LVM_TEMPORARY_FAST; 170 pMemoryTable->Region[LVM_TEMPORARY_FAST].pBaseAddress = LVM_NULL; 171 172 return(NewMemberAddress); 173 } 174 175 176 void* InstAlloc_AddMemberAllRet( INST_ALLOC *pms, 177 LVM_UINT32 Size[], 178 void **ptr) 179 { 180 ptr[0] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_SLOW_DATA], Size[LVM_PERSISTENT_SLOW_DATA]); 181 ptr[1] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_DATA], Size[LVM_PERSISTENT_FAST_DATA]); 182 ptr[2] = InstAlloc_AddMember(&pms[LVM_PERSISTENT_FAST_COEF], Size[LVM_PERSISTENT_FAST_COEF]); 183 ptr[3] = InstAlloc_AddMember(&pms[LVM_TEMPORARY_FAST], Size[LVM_TEMPORARY_FAST]); 184 185 return (ptr[0]); 186 } 187