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