/** Release the memory management pool. @param Pool The memory pool to free. @retval EFI_DEVICE_ERROR Fail to free the memory pool. @retval EFI_SUCCESS The memory pool is freed. **/ EFI_STATUS UfsPeimFreeMemPool ( IN UFS_PEIM_MEM_POOL *Pool ) { UFS_PEIM_MEM_BLOCK *Block; ASSERT (Pool->Head != NULL); // // Unlink all the memory blocks from the pool, then free them. // for (Block = Pool->Head->Next; Block != NULL; Block = Pool->Head->Next) { UfsPeimFreeMemBlock (Pool, Block); } UfsPeimFreeMemBlock (Pool, Pool->Head); return EFI_SUCCESS; }
/** Free the allocated memory back to the memory pool. @param Pool The memory pool of the host controller. @param Mem The memory to free. @param Size The size of the memory to free. **/ VOID UfsPeimFreeMem ( IN UFS_PEIM_MEM_POOL *Pool, IN VOID *Mem, IN UINTN Size ) { UFS_PEIM_MEM_BLOCK *Head; UFS_PEIM_MEM_BLOCK *Block; UINT8 *ToFree; UINTN AllocSize; UINTN Byte; UINTN Bit; UINTN Count; Head = Pool->Head; AllocSize = UFS_PEIM_MEM_ROUND (Size); ToFree = (UINT8 *) Mem; for (Block = Head; Block != NULL; Block = Block->Next) { // // scan the memory block list for the memory block that // completely contains the memory to free. // if ((Block->Buf <= ToFree) && ((ToFree + AllocSize) <= (Block->Buf + Block->BufLen))) { // // compute the start byte and bit in the bit array // Byte = ((ToFree - Block->Buf) / UFS_PEIM_MEM_UNIT) / 8; Bit = ((ToFree - Block->Buf) / UFS_PEIM_MEM_UNIT) % 8; // // reset associated bits in bit arry // for (Count = 0; Count < (AllocSize / UFS_PEIM_MEM_UNIT); Count++) { ASSERT (UFS_PEIM_MEM_BIT_IS_SET (Block->Bits[Byte], Bit)); Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ UFS_PEIM_MEM_BIT (Bit)); UFS_PEIM_NEXT_BIT (Byte, Bit); } break; } } // // If Block == NULL, it means that the current memory isn't // in the host controller's pool. This is critical because // the caller has passed in a wrong memory point // ASSERT (Block != NULL); // // Release the current memory block if it is empty and not the head // if ((Block != Head) && UfsPeimIsMemBlockEmpty (Block)) { UfsPeimFreeMemBlock (Pool, Block); } return ; }