]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/UhciDxe/UsbHcMem.c
Fix a bug that usb keybarod can not work well when it is inserted at a usb 2.0 hub.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UhciDxe / UsbHcMem.c
index 7c598e2bbbcf42116107bb92b0709b6e0ab5b749..074451d9b31d853cef2e2fc4b03d0de61021b06c 100644 (file)
@@ -1,6 +1,8 @@
 /** @file\r
 \r
-Copyright (c) 2007, Intel Corporation\r
+  The routine procedure for uhci memory allocate/free.\r
+\r
+Copyright (c) 2007 - 2010, 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
@@ -9,33 +11,20 @@ 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
 #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
@@ -116,9 +105,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
@@ -132,15 +118,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
@@ -165,17 +148,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 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
@@ -232,24 +213,68 @@ 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] | (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  Head           The head of the memory pool's block list\r
-  @param  Block          The memory block to insert\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 VOID\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
+  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
+/**\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
@@ -265,13 +290,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
+  @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
@@ -290,15 +314,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
@@ -320,16 +341,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
+  @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
@@ -362,12 +382,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
+  @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
@@ -399,10 +419,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
@@ -454,7 +474,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
@@ -473,13 +493,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
@@ -538,8 +556,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