Home | History | Annotate | Download | only in src
      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