]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/UfsPciHcPei/UfsPciHcPei.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UfsPciHcPei / UfsPciHcPei.c
CommitLineData
0591696e
FT
1/** @file\r
2 UfsPciHcPei driver is used to provide platform-dependent info, mainly UFS host controller\r
3 MMIO base, to upper layer UFS drivers.\r
4\r
d1102dba 5 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
0591696e
FT
7\r
8**/\r
9\r
10#include "UfsPciHcPei.h"\r
11\r
12EDKII_UFS_HOST_CONTROLLER_PPI mUfsHostControllerPpi = { GetUfsHcMmioBar };\r
13\r
1436aea4 14EFI_PEI_PPI_DESCRIPTOR mPpiList = {\r
0591696e
FT
15 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
16 &gEdkiiPeiUfsHostControllerPpiGuid,\r
17 &mUfsHostControllerPpi\r
18};\r
19\r
20/**\r
21 Get the MMIO base address of UFS host controller.\r
22\r
23 @param[in] This The protocol instance pointer.\r
24 @param[in] ControllerId The ID of the UFS host controller.\r
25 @param[out] MmioBar Pointer to the UFS host controller MMIO base address.\r
26\r
27 @retval EFI_SUCCESS The operation succeeds.\r
28 @retval EFI_INVALID_PARAMETER The parameters are invalid.\r
29\r
30**/\r
31EFI_STATUS\r
32EFIAPI\r
33GetUfsHcMmioBar (\r
1436aea4
MK
34 IN EDKII_UFS_HOST_CONTROLLER_PPI *This,\r
35 IN UINT8 ControllerId,\r
36 OUT UINTN *MmioBar\r
0591696e
FT
37 )\r
38{\r
39 UFS_HC_PEI_PRIVATE_DATA *Private;\r
40\r
41 if ((This == NULL) || (MmioBar == NULL)) {\r
42 return EFI_INVALID_PARAMETER;\r
43 }\r
44\r
45 Private = UFS_HC_PEI_PRIVATE_DATA_FROM_THIS (This);\r
46\r
47 if (ControllerId >= Private->TotalUfsHcs) {\r
48 return EFI_INVALID_PARAMETER;\r
49 }\r
d1102dba 50\r
0591696e
FT
51 *MmioBar = (UINTN)Private->UfsHcPciAddr[ControllerId];\r
52\r
53 return EFI_SUCCESS;\r
54}\r
55\r
56/**\r
57 The user code starts with this function.\r
d1102dba 58\r
0591696e
FT
59 @param FileHandle Handle of the file being invoked.\r
60 @param PeiServices Describes the list of possible PEI Services.\r
61\r
62 @retval EFI_SUCCESS The driver is successfully initialized.\r
63 @retval Others Can't initialize the driver.\r
64\r
65**/\r
66EFI_STATUS\r
67EFIAPI\r
68InitializeUfsHcPeim (\r
1436aea4
MK
69 IN EFI_PEI_FILE_HANDLE FileHandle,\r
70 IN CONST EFI_PEI_SERVICES **PeiServices\r
0591696e
FT
71 )\r
72{\r
73 EFI_BOOT_MODE BootMode;\r
74 EFI_STATUS Status;\r
75 UINT16 Bus;\r
76 UINT16 Device;\r
77 UINT16 Function;\r
78 UINT32 Size;\r
a7b35aae
IC
79 UINT64 MmioSize;\r
80 UINT32 BarAddr;\r
0591696e
FT
81 UINT8 SubClass;\r
82 UINT8 BaseClass;\r
83 UFS_HC_PEI_PRIVATE_DATA *Private;\r
84\r
85 //\r
86 // Shadow this PEIM to run from memory\r
87 //\r
88 if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) {\r
89 return EFI_SUCCESS;\r
90 }\r
91\r
92 Status = PeiServicesGetBootMode (&BootMode);\r
93 ///\r
94 /// We do not export this in S3 boot path, because it is only for recovery.\r
95 ///\r
96 if (BootMode == BOOT_ON_S3_RESUME) {\r
97 return EFI_SUCCESS;\r
98 }\r
99\r
1436aea4 100 Private = (UFS_HC_PEI_PRIVATE_DATA *)AllocateZeroPool (sizeof (UFS_HC_PEI_PRIVATE_DATA));\r
0591696e 101 if (Private == NULL) {\r
87000d77 102 DEBUG ((DEBUG_ERROR, "Failed to allocate memory for UFS_HC_PEI_PRIVATE_DATA! \n"));\r
0591696e
FT
103 return EFI_OUT_OF_RESOURCES;\r
104 }\r
105\r
106 Private->Signature = UFS_HC_PEI_SIGNATURE;\r
107 Private->UfsHostControllerPpi = mUfsHostControllerPpi;\r
108 Private->PpiList = mPpiList;\r
109 Private->PpiList.Ppi = &Private->UfsHostControllerPpi;\r
110\r
a7b35aae 111 BarAddr = PcdGet32 (PcdUfsPciHostControllerMmioBase);\r
0591696e
FT
112 for (Bus = 0; Bus < 256; Bus++) {\r
113 for (Device = 0; Device < 32; Device++) {\r
114 for (Function = 0; Function < 8; Function++) {\r
115 SubClass = PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x0A));\r
116 BaseClass = PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x0B));\r
117\r
118 if ((SubClass == 0x09) && (BaseClass == PCI_CLASS_MASS_STORAGE)) {\r
119 //\r
120 // Get the Ufs Pci host controller's MMIO region size.\r
121 //\r
1436aea4 122 PciAnd16 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET), (UINT16) ~(EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE));\r
0591696e
FT
123 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET), 0xFFFFFFFF);\r
124 Size = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET));\r
a7b35aae
IC
125\r
126 switch (Size & 0x07) {\r
127 case 0x0:\r
128 //\r
129 // Memory space: anywhere in 32 bit address space\r
130 //\r
131 MmioSize = (~(Size & 0xFFFFFFF0)) + 1;\r
132 break;\r
133 case 0x4:\r
134 //\r
135 // Memory space: anywhere in 64 bit address space\r
136 //\r
137 MmioSize = Size & 0xFFFFFFF0;\r
1436aea4
MK
138 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET + 4), 0xFFFFFFFF);\r
139 Size = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET + 4));\r
a7b35aae
IC
140\r
141 //\r
142 // Fix the length to support some specific 64 bit BAR\r
143 //\r
144 Size |= ((UINT32)(-1) << HighBitSet32 (Size));\r
145\r
146 //\r
147 // Calculate the size of 64bit bar\r
148 //\r
1436aea4 149 MmioSize |= LShiftU64 ((UINT64)Size, 32);\r
a7b35aae
IC
150 MmioSize = (~(MmioSize)) + 1;\r
151\r
152 //\r
153 // Clean the high 32bits of this 64bit BAR to 0 as we only allow a 32bit BAR.\r
154 //\r
155 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET + 4), 0);\r
156 break;\r
157 default:\r
158 //\r
159 // Unknown BAR type\r
160 //\r
161 ASSERT (FALSE);\r
162 continue;\r
1436aea4
MK
163 }\r
164\r
0591696e
FT
165 //\r
166 // Assign resource to the Ufs Pci host controller's MMIO BAR.\r
167 // Enable the Ufs Pci host controller by setting BME and MSE bits of PCI_CMD register.\r
168 //\r
a7b35aae 169 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET), BarAddr);\r
0591696e
FT
170 PciOr16 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET), (EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE));\r
171 //\r
172 // Record the allocated Mmio base address.\r
173 //\r
a7b35aae 174 Private->UfsHcPciAddr[Private->TotalUfsHcs] = BarAddr;\r
0591696e 175 Private->TotalUfsHcs++;\r
a7b35aae 176 BarAddr += (UINT32)MmioSize;\r
0591696e
FT
177 ASSERT (Private->TotalUfsHcs < MAX_UFS_HCS);\r
178 }\r
179 }\r
180 }\r
181 }\r
182\r
183 ///\r
184 /// Install Ufs Host Controller PPI\r
185 ///\r
186 Status = PeiServicesInstallPpi (&Private->PpiList);\r
187\r
188 ASSERT_EFI_ERROR (Status);\r
189 return Status;\r
190}\r