]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/EhciDxe/UsbHcMem.c
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / EhciDxe / UsbHcMem.c
index 22556e7ef82dadd81619dfa5e2c6087a02535f93..baac29df66419b3f2ba9068edf58542dbf048558 100644 (file)
@@ -1,7 +1,9 @@
 /** @file\r
 \r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+  Routine procedures for memory allocate/free.\r
+\r
+Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>\r
+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
@@ -9,34 +11,21 @@ http://opensource.org/licenses/bsd-license.php
 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
-\r
 **/\r
 \r
 \r
 #include "Ehci.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
@@ -117,9 +106,6 @@ UsbHcAllocMemBlock (
   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
@@ -133,15 +119,12 @@ FREE_BITARRAY:
 \r
 \r
 /**\r
-  Free the memory block from the memory pool\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
-\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
@@ -166,17 +149,15 @@ UsbHcFreeMemBlock (
 \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 The pointer to the allocated memory. If couldn't allocate the needed memory,\r
+          the return value is NULL.\r
 \r
 **/\r
-STATIC\r
 VOID *\r
 UsbHcAllocMemFromBlock (\r
   IN  USBHC_MEM_BLOCK     *Block,\r
@@ -233,24 +214,69 @@ UsbHcAllocMemFromBlock (
   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] | USB_HC_BIT (Bit));\r
     NEXT_BIT (Byte, Bit);\r
   }\r
 \r
-  return Block->Buf + (StartByte * 8 + StartBit) * USBHC_MEM_UNIT;\r
+  return Block->BufHost + (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
+  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
-  @return VOID\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
@@ -266,13 +292,12 @@ UsbHcInsertMemBlockToPool (
 /**\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
+  @retval TRUE    The memory block is empty.\r
+  @retval FALSE   The memory block isn't empty.\r
 \r
 **/\r
-STATIC\r
 BOOLEAN\r
 UsbHcIsMemBlockEmpty (\r
   IN USBHC_MEM_BLOCK     *Block\r
@@ -291,15 +316,12 @@ UsbHcIsMemBlockEmpty (
 \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
@@ -321,16 +343,15 @@ UsbHcUnlinkMemBlock (
 \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
+  @retval EFI_SUCCESS          The memory pool is initialized.\r
+  @retval EFI_OUT_OF_RESOURCE  Fail to init the memory pool.\r
 \r
 **/\r
 USBHC_MEM_POOL *\r
@@ -363,12 +384,12 @@ UsbHcInitMemPool (
 \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
+  @retval EFI_SUCCESS       The memory pool is freed.\r
+  @retval EFI_DEVICE_ERROR  Failed to free the memory pool.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -400,10 +421,10 @@ UsbHcFreeMemPool (
   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
@@ -455,7 +476,7 @@ UsbHcAllocateMem (
   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
@@ -474,13 +495,11 @@ UsbHcAllocateMem (
 \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
@@ -507,12 +526,12 @@ UsbHcFreeMem (
     // scan the memory block list for the memory block that\r
     // completely contains the memory to free.\r
     //\r
-    if ((Block->Buf <= ToFree) && ((ToFree + AllocSize) <= (Block->Buf + Block->BufLen))) {\r
+    if ((Block->BufHost <= ToFree) && ((ToFree + AllocSize) <= (Block->BufHost + Block->BufLen))) {\r
       //\r
       // compute the start byte and bit in the bit array\r
       //\r
-      Byte  = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) / 8;\r
-      Bit   = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8;\r
+      Byte  = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8;\r
+      Bit   = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8;\r
 \r
       //\r
       // reset associated bits in bit arry\r
@@ -539,8 +558,6 @@ UsbHcFreeMem (
   // 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