/** @file\r
\r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
+ The routine procedure for uhci memory allocate/free.\r
\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
- EhciMem.c\r
-\r
-Abstract:\r
-\r
-\r
-Revision History\r
+Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "Uhci.h"\r
\r
\r
-UINTN mUsbHcDebugLevel = DEBUG_INFO;\r
-\r
-\r
/**\r
- Allocate a block of memory to be used by the buffer pool\r
+ Allocate a block of memory to be used by the buffer pool.\r
\r
- @param Pool The buffer pool to allocate memory for\r
- @param Pages How many pages to allocate\r
+ @param Pool The buffer pool to allocate memory for.\r
+ @param Pages How many pages to allocate.\r
\r
- @return The allocated memory block or NULL if failed\r
+ @return The allocated memory block or NULL if failed.\r
\r
**/\r
-STATIC\r
USBHC_MEM_BLOCK *\r
UsbHcAllocMemBlock (\r
IN USBHC_MEM_POOL *Pool,\r
Block->Buf = (UINT8 *) ((UINTN) MappedAddr);\r
Block->Mapping = Mapping;\r
\r
- DEBUG ((mUsbHcDebugLevel, "UsbHcAllocMemBlock: block %x created with buffer %x\n",\r
- Block, Block->Buf));\r
-\r
return Block;\r
\r
FREE_BUFFER:\r
\r
\r
/**\r
- Free the memory block from the memory pool\r
-\r
- @param Pool The memory pool to free the block from\r
- @param Block The memory block to free\r
+ Free the memory block from the memory pool.\r
\r
- @return VOID\r
+ @param Pool The memory pool to free the block from.\r
+ @param Block The memory block to free.\r
\r
**/\r
-STATIC\r
VOID\r
UsbHcFreeMemBlock (\r
IN USBHC_MEM_POOL *Pool,\r
\r
\r
/**\r
- Alloc some memory from the block\r
+ Alloc some memory from the block.\r
\r
- @param Block The memory block to allocate memory from\r
- @param Mem The variable to store the memory allocated\r
- @param Units Number of memory units to allocate\r
+ @param Block The memory block to allocate memory from.\r
+ @param Units Number of memory units to allocate.\r
\r
- @return EFI_SUCCESS : The needed memory is allocated\r
- @return EFI_NOT_FOUND : Can't find the free memory\r
+ @return EFI_SUCCESS The needed memory is allocated.\r
+ @return EFI_NOT_FOUND Can't find the free memory.\r
\r
**/\r
-STATIC\r
VOID *\r
UsbHcAllocMemFromBlock (\r
IN USBHC_MEM_BLOCK *Block,\r
for (Count = 0; Count < Units; Count++) {\r
ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));\r
\r
- Block->Bits[Byte] |= USB_HC_BIT (Bit);\r
+ Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | (UINT8) USB_HC_BIT (Bit));\r
NEXT_BIT (Byte, Bit);\r
}\r
\r
return Block->Buf + (StartByte * 8 + StartBit) * USBHC_MEM_UNIT;\r
}\r
\r
-\r
/**\r
- Insert the memory block to the pool's list of the blocks\r
+ Calculate the corresponding pci bus address according to the Mem parameter.\r
+\r
+ @param Pool The memory pool of the host controller.\r
+ @param Mem The pointer to host memory.\r
+ @param Size The size of the memory region.\r
+\r
+ @return the pci memory address\r
+**/\r
+EFI_PHYSICAL_ADDRESS\r
+UsbHcGetPciAddressForHostMem (\r
+ IN USBHC_MEM_POOL *Pool,\r
+ IN VOID *Mem,\r
+ IN UINTN Size\r
+ )\r
+{\r
+ USBHC_MEM_BLOCK *Head;\r
+ USBHC_MEM_BLOCK *Block;\r
+ UINTN AllocSize;\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
+ UINTN Offset;\r
\r
- @param Head The head of the memory pool's block list\r
- @param Block The memory block to insert\r
+ Head = Pool->Head;\r
+ AllocSize = USBHC_MEM_ROUND (Size);\r
+\r
+ if (Mem == NULL) {\r
+ return 0;\r
+ }\r
\r
- @return VOID\r
+ for (Block = Head; Block != NULL; Block = Block->Next) {\r
+ //\r
+ // scan the memory block list for the memory block that\r
+ // completely contains the allocated memory.\r
+ //\r
+ if ((Block->BufHost <= (UINT8 *) Mem) && (((UINT8 *) Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ ASSERT ((Block != NULL));\r
+ //\r
+ // calculate the pci memory address for host memory address.\r
+ //\r
+ Offset = (UINT8 *)Mem - Block->BufHost;\r
+ PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset);\r
+ return PhyAddr;\r
+}\r
+\r
+/**\r
+ Insert the memory block to the pool's list of the blocks.\r
+\r
+ @param Head The head of the memory pool's block list.\r
+ @param Block The memory block to insert.\r
\r
**/\r
-STATIC\r
VOID\r
UsbHcInsertMemBlockToPool (\r
IN USBHC_MEM_BLOCK *Head,\r
/**\r
Is the memory block empty?\r
\r
- @param Block The memory block to check\r
+ @param Block The memory block to check.\r
\r
- @return TRUE : The memory block is empty\r
- @return FALSE : The memory block isn't empty\r
+ @return TRUE The memory block is empty.\r
+ @return FALSE The memory block isn't empty.\r
\r
**/\r
-STATIC\r
BOOLEAN\r
UsbHcIsMemBlockEmpty (\r
IN USBHC_MEM_BLOCK *Block\r
\r
\r
/**\r
- Unlink the memory block from the pool's list\r
+ Unlink the memory block from the pool's list.\r
\r
- @param Head The block list head of the memory's pool\r
+ @param Head The block list head of the memory's pool.\r
@param BlockToUnlink The memory block to unlink.\r
\r
- @return VOID\r
-\r
**/\r
-STATIC\r
VOID\r
UsbHcUnlinkMemBlock (\r
IN USBHC_MEM_BLOCK *Head,\r
\r
\r
/**\r
- Initialize the memory management pool for the host controller\r
+ Initialize the memory management pool for the host controller.\r
\r
- @param Pool The USB memory pool to initialize\r
- @param PciIo The PciIo that can be used to access the host controller\r
- @param Check4G Whether the host controller requires allocated memory\r
- from one 4G address space.\r
- @param Which4G The 4G memory area each memory allocated should be from\r
+ @param PciIo The PciIo that can be used to access the host controller.\r
+ @param Check4G Whether the host controller requires allocated memory\r
+ from one 4G address space.\r
+ @param Which4G The 4G memory area each memory allocated should be from.\r
\r
- @return EFI_SUCCESS : The memory pool is initialized\r
- @return EFI_OUT_OF_RESOURCE : Fail to init the memory pool\r
+ @return EFI_SUCCESS The memory pool is initialized.\r
+ @return EFI_OUT_OF_RESOURCE Fail to init the memory pool.\r
\r
**/\r
USBHC_MEM_POOL *\r
\r
\r
/**\r
- Release the memory management pool\r
+ Release the memory management pool.\r
\r
- @param Pool The USB memory pool to free\r
+ @param Pool The USB memory pool to free.\r
\r
- @return EFI_SUCCESS : The memory pool is freed\r
- @return EFI_DEVICE_ERROR : Failed to free the memory pool\r
+ @return EFI_SUCCESS The memory pool is freed.\r
+ @return EFI_DEVICE_ERROR Failed to free the memory pool.\r
\r
**/\r
EFI_STATUS\r
Allocate some memory from the host controller's memory pool\r
which can be used to communicate with host controller.\r
\r
- @param Pool The host controller's memory pool\r
- @param Size Size of the memory to allocate\r
+ @param Pool The host controller's memory pool.\r
+ @param Size Size of the memory to allocate.\r
\r
- @return The allocated memory or NULL\r
+ @return The allocated memory or NULL.\r
\r
**/\r
VOID *\r
NewBlock = UsbHcAllocMemBlock (Pool, Pages);\r
\r
if (NewBlock == NULL) {\r
- DEBUG ((mUsbHcDebugLevel, "UsbHcAllocateMem: failed to allocate block\n"));\r
+ DEBUG ((EFI_D_INFO, "UsbHcAllocateMem: failed to allocate block\n"));\r
return NULL;\r
}\r
\r
\r
\r
/**\r
- Free the allocated memory back to the memory pool\r
+ Free the allocated memory back to the memory pool.\r
\r
- @param Pool The memory pool of the host controller\r
- @param Mem The memory to free\r
- @param Size The size of the memory to free\r
-\r
- @return VOID\r
+ @param Pool The memory pool of the host controller.\r
+ @param Mem The memory to free.\r
+ @param Size The size of the memory to free.\r
\r
**/\r
VOID\r
Bit = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8;\r
\r
//\r
- // reset associated bits in bit arry\r
+ // reset associated bits in bit array\r
//\r
for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {\r
ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));\r
// Release the current memory block if it is empty and not the head\r
//\r
if ((Block != Head) && UsbHcIsMemBlockEmpty (Block)) {\r
- DEBUG ((mUsbHcDebugLevel, "UsbHcFreeMem: block %x is empty, recycle\n", Block));\r
-\r
UsbHcUnlinkMemBlock (Head, Block);\r
UsbHcFreeMemBlock (Pool, Block);\r
}\r