Home | History | Annotate | Download | only in XhciPei
      1 /** @file
      2 Private Header file for Usb Host Controller PEIM
      3 
      4 Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions
      8 of the BSD License which accompanies this distribution.  The
      9 full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _EFI_PEI_XHCI_MEM_H_
     18 #define _EFI_PEI_XHCI_MEM_H_
     19 
     20 #include <Uefi.h>
     21 
     22 #define USBHC_MEM_DEFAULT_PAGES 16
     23 
     24 typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK;
     25 
     26 struct _USBHC_MEM_BLOCK {
     27   UINT8                 *Bits;  // Bit array to record which unit is allocated
     28   UINTN                 BitsLen;
     29   UINT8                 *Buf;
     30   UINT8                 *BufHost;
     31   UINTN                 BufLen; // Memory size in bytes
     32   USBHC_MEM_BLOCK       *Next;
     33 };
     34 
     35 //
     36 // Memory allocation unit, must be 2^n, n>4
     37 //
     38 #define USBHC_MEM_UNIT          64
     39 
     40 #define USBHC_MEM_UNIT_MASK     (USBHC_MEM_UNIT - 1)
     41 #define USBHC_MEM_ROUND(Len)    (((Len) + USBHC_MEM_UNIT_MASK) & (~USBHC_MEM_UNIT_MASK))
     42 
     43 #define USB_HC_BIT(a)           ((UINTN)(1 << (a)))
     44 
     45 #define USB_HC_BIT_IS_SET(Data, Bit)   \
     46           ((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit)))
     47 
     48 //
     49 // Advance the byte and bit to the next bit, adjust byte accordingly.
     50 //
     51 #define NEXT_BIT(Byte, Bit)  \
     52           do {               \
     53             (Bit)++;         \
     54             if ((Bit) > 7) { \
     55               (Byte)++;      \
     56               (Bit) = 0;     \
     57             }                \
     58           } while (0)
     59 
     60 //
     61 // USBHC_MEM_POOL is used to manage the memory used by USB
     62 // host controller. XHCI requires the control memory and transfer
     63 // data to be on the same 4G memory.
     64 //
     65 typedef struct _USBHC_MEM_POOL {
     66   BOOLEAN               Check4G;
     67   UINT32                Which4G;
     68   USBHC_MEM_BLOCK       *Head;
     69 } USBHC_MEM_POOL;
     70 
     71 /**
     72   Calculate the corresponding pci bus address according to the Mem parameter.
     73 
     74   @param  Pool          The memory pool of the host controller.
     75   @param  Mem           The pointer to host memory.
     76   @param  Size          The size of the memory region.
     77 
     78   @return               The pci memory address
     79 
     80 **/
     81 EFI_PHYSICAL_ADDRESS
     82 UsbHcGetPciAddrForHostAddr (
     83   IN USBHC_MEM_POOL     *Pool,
     84   IN VOID               *Mem,
     85   IN UINTN              Size
     86   );
     87 
     88 /**
     89   Calculate the corresponding host address according to the pci address.
     90 
     91   @param  Pool          The memory pool of the host controller.
     92   @param  Mem           The pointer to pci memory.
     93   @param  Size          The size of the memory region.
     94 
     95   @return               The host memory address
     96 
     97 **/
     98 EFI_PHYSICAL_ADDRESS
     99 UsbHcGetHostAddrForPciAddr (
    100   IN USBHC_MEM_POOL     *Pool,
    101   IN VOID               *Mem,
    102   IN UINTN              Size
    103   );
    104 
    105 /**
    106   Allocates pages at a specified alignment.
    107 
    108   If Alignment is not a power of two and Alignment is not zero, then ASSERT().
    109 
    110   @param  Pages                 The number of pages to allocate.
    111   @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
    112   @param  HostAddress           The system memory address to map to the PCI controller.
    113   @param  DeviceAddress         The resulting map address for the bus master PCI controller to
    114                                 use to access the hosts HostAddress.
    115 
    116   @retval EFI_SUCCESS           Success to allocate aligned pages.
    117   @retval EFI_INVALID_PARAMETER Pages or Alignment is not valid.
    118   @retval EFI_OUT_OF_RESOURCES  Do not have enough resources to allocate memory.
    119 
    120 **/
    121 EFI_STATUS
    122 UsbHcAllocateAlignedPages (
    123   IN UINTN                      Pages,
    124   IN UINTN                      Alignment,
    125   OUT VOID                      **HostAddress,
    126   OUT EFI_PHYSICAL_ADDRESS      *DeviceAddress
    127   );
    128 
    129 /**
    130   Frees memory that was allocated with UsbHcAllocateAlignedPages().
    131 
    132   @param  HostAddress           The system memory address to map to the PCI controller.
    133   @param  Pages                 The number of pages to free.
    134 
    135 **/
    136 VOID
    137 UsbHcFreeAlignedPages (
    138   IN VOID               *HostAddress,
    139   IN UINTN              Pages
    140   );
    141 
    142 #endif
    143