/** Initialize the memory management pool for the host controller. @return Pointer to the allocated memory pool or NULL if failed. **/ USBHC_MEM_POOL * UsbHcInitMemPool ( VOID ) { USBHC_MEM_POOL *Pool; UINTN PageNumber; EFI_STATUS Status; EFI_PHYSICAL_ADDRESS TempPtr; PageNumber = EFI_SIZE_TO_PAGES (sizeof (USBHC_MEM_POOL)); Status = PeiServicesAllocatePages ( EfiBootServicesData, PageNumber, &TempPtr ); if (EFI_ERROR (Status)) { return NULL; } ZeroMem ((VOID *) (UINTN) TempPtr, EFI_PAGES_TO_SIZE (PageNumber)); Pool = (USBHC_MEM_POOL *) ((UINTN) TempPtr); Pool->Head = UsbHcAllocMemBlock (USBHC_MEM_DEFAULT_PAGES); if (Pool->Head == NULL) { // // No free memory in PEI. // Pool = NULL; } return Pool; }
/** Initialize the memory management pool for the host controller. @param PciIo The PciIo that can be used to access the host controller. @param Check4G Whether the host controller requires allocated memory from one 4G address space. @param Which4G The 4G memory area each memory allocated should be from. @return EFI_SUCCESS The memory pool is initialized. @return EFI_OUT_OF_RESOURCE Fail to init the memory pool. **/ USBHC_MEM_POOL * UsbHcInitMemPool ( IN EFI_PCI_IO_PROTOCOL *PciIo, IN BOOLEAN Check4G, IN UINT32 Which4G ) { USBHC_MEM_POOL *Pool; Pool = AllocatePool (sizeof (USBHC_MEM_POOL)); if (Pool == NULL) { return Pool; } Pool->PciIo = PciIo; Pool->Check4G = Check4G; Pool->Which4G = Which4G; Pool->Head = UsbHcAllocMemBlock (Pool, USBHC_MEM_DEFAULT_PAGES); if (Pool->Head == NULL) { gBS->FreePool (Pool); Pool = NULL; } return Pool; }
/** Initialize the memory management pool for the host controller. @param PciIo The PciIo that can be used to access the host controller. @param Check4G Whether the host controller requires allocated memory from one 4G address space. @param Which4G The 4G memory area each memory allocated should be from. @retval EFI_SUCCESS The memory pool is initialized. @retval EFI_OUT_OF_RESOURCE Fail to init the memory pool. **/ USBHC_MEM_POOL * UsbHcInitMemPool ( IN BOOLEAN Check4G, IN UINT32 Which4G ) { USBHC_MEM_POOL *Pool; UINTN PageNumber; EFI_STATUS Status; EFI_PHYSICAL_ADDRESS TempPtr; PageNumber = sizeof(USBHC_MEM_POOL)/PAGESIZE +1; Status = PeiServicesAllocatePages ( EfiBootServicesCode, PageNumber, &TempPtr ); if (EFI_ERROR (Status)) { return NULL; } ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE); Pool = (USBHC_MEM_POOL *) ((UINTN) TempPtr); Pool->Check4G = Check4G; Pool->Which4G = Which4G; Pool->Head = UsbHcAllocMemBlock (Pool, USBHC_MEM_DEFAULT_PAGES); if (Pool->Head == NULL) { Pool = NULL; } return Pool; }
/** Initialize the memory management pool for the host controller. @param PciIo The PciIo that can be used to access the host controller. @retval EFI_SUCCESS The memory pool is initialized. @retval EFI_OUT_OF_RESOURCE Fail to init the memory pool. **/ USBHC_MEM_POOL * UsbHcInitMemPool ( IN EFI_PCI_IO_PROTOCOL *PciIo ) { USBHC_MEM_POOL *Pool; Pool = AllocatePool (sizeof (USBHC_MEM_POOL)); if (Pool == NULL) { return Pool; } Pool->PciIo = PciIo; Pool->Head = UsbHcAllocMemBlock (Pool, USBHC_MEM_DEFAULT_PAGES); if (Pool->Head == NULL) { gBS->FreePool (Pool); Pool = NULL; } return Pool; }
/** Allocate some memory from the host controller's memory pool which can be used to communicate with host controller. @param Pool The host controller's memory pool. @param Size Size of the memory to allocate. @return The allocated memory or NULL. **/ VOID * UsbHcAllocateMem ( IN USBHC_MEM_POOL *Pool, IN UINTN Size ) { USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *NewBlock; VOID *Mem; UINTN AllocSize; UINTN Pages; Mem = NULL; AllocSize = USBHC_MEM_ROUND (Size); Head = Pool->Head; ASSERT (Head != NULL); // // First check whether current memory blocks can satisfy the allocation. // for (Block = Head; Block != NULL; Block = Block->Next) { Mem = UsbHcAllocMemFromBlock (Block, AllocSize / USBHC_MEM_UNIT); if (Mem != NULL) { ZeroMem (Mem, Size); break; } } if (Mem != NULL) { return Mem; } // // Create a new memory block if there is not enough memory // in the pool. If the allocation size is larger than the // default page number, just allocate a large enough memory // block. Otherwise allocate default pages. // if (AllocSize > EFI_PAGES_TO_SIZE (USBHC_MEM_DEFAULT_PAGES)) { Pages = EFI_SIZE_TO_PAGES (AllocSize) + 1; } else { Pages = USBHC_MEM_DEFAULT_PAGES; } NewBlock = UsbHcAllocMemBlock (Pool, Pages); if (NewBlock == NULL) { DEBUG ((EFI_D_ERROR, "UsbHcAllocateMem: failed to allocate block\n")); return NULL; } // // Add the new memory block to the pool, then allocate memory from it // UsbHcInsertMemBlockToPool (Head, NewBlock); Mem = UsbHcAllocMemFromBlock (NewBlock, AllocSize / USBHC_MEM_UNIT); if (Mem != NULL) { ZeroMem (Mem, Size); } return Mem; }