]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/UfsPciHcPei/UfsPciHcPei.c
MdeModulePkg: Clean up source files
[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
0591696e
FT
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UfsPciHcPei.h"\r
17\r
18EDKII_UFS_HOST_CONTROLLER_PPI mUfsHostControllerPpi = { GetUfsHcMmioBar };\r
19\r
20EFI_PEI_PPI_DESCRIPTOR mPpiList = {\r
21 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
22 &gEdkiiPeiUfsHostControllerPpiGuid,\r
23 &mUfsHostControllerPpi\r
24};\r
25\r
26/**\r
27 Get the MMIO base address of UFS host controller.\r
28\r
29 @param[in] This The protocol instance pointer.\r
30 @param[in] ControllerId The ID of the UFS host controller.\r
31 @param[out] MmioBar Pointer to the UFS host controller MMIO base address.\r
32\r
33 @retval EFI_SUCCESS The operation succeeds.\r
34 @retval EFI_INVALID_PARAMETER The parameters are invalid.\r
35\r
36**/\r
37EFI_STATUS\r
38EFIAPI\r
39GetUfsHcMmioBar (\r
40 IN EDKII_UFS_HOST_CONTROLLER_PPI *This,\r
41 IN UINT8 ControllerId,\r
42 OUT UINTN *MmioBar\r
43 )\r
44{\r
45 UFS_HC_PEI_PRIVATE_DATA *Private;\r
46\r
47 if ((This == NULL) || (MmioBar == NULL)) {\r
48 return EFI_INVALID_PARAMETER;\r
49 }\r
50\r
51 Private = UFS_HC_PEI_PRIVATE_DATA_FROM_THIS (This);\r
52\r
53 if (ControllerId >= Private->TotalUfsHcs) {\r
54 return EFI_INVALID_PARAMETER;\r
55 }\r
d1102dba 56\r
0591696e
FT
57 *MmioBar = (UINTN)Private->UfsHcPciAddr[ControllerId];\r
58\r
59 return EFI_SUCCESS;\r
60}\r
61\r
62/**\r
63 The user code starts with this function.\r
d1102dba 64\r
0591696e
FT
65 @param FileHandle Handle of the file being invoked.\r
66 @param PeiServices Describes the list of possible PEI Services.\r
67\r
68 @retval EFI_SUCCESS The driver is successfully initialized.\r
69 @retval Others Can't initialize the driver.\r
70\r
71**/\r
72EFI_STATUS\r
73EFIAPI\r
74InitializeUfsHcPeim (\r
75 IN EFI_PEI_FILE_HANDLE FileHandle,\r
76 IN CONST EFI_PEI_SERVICES **PeiServices\r
77 )\r
78{\r
79 EFI_BOOT_MODE BootMode;\r
80 EFI_STATUS Status;\r
81 UINT16 Bus;\r
82 UINT16 Device;\r
83 UINT16 Function;\r
84 UINT32 Size;\r
85 UINT8 SubClass;\r
86 UINT8 BaseClass;\r
87 UFS_HC_PEI_PRIVATE_DATA *Private;\r
88\r
89 //\r
90 // Shadow this PEIM to run from memory\r
91 //\r
92 if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) {\r
93 return EFI_SUCCESS;\r
94 }\r
95\r
96 Status = PeiServicesGetBootMode (&BootMode);\r
97 ///\r
98 /// We do not export this in S3 boot path, because it is only for recovery.\r
99 ///\r
100 if (BootMode == BOOT_ON_S3_RESUME) {\r
101 return EFI_SUCCESS;\r
102 }\r
103\r
104 Private = (UFS_HC_PEI_PRIVATE_DATA *) AllocateZeroPool (sizeof (UFS_HC_PEI_PRIVATE_DATA));\r
105 if (Private == NULL) {\r
106 DEBUG ((EFI_D_ERROR, "Failed to allocate memory for UFS_HC_PEI_PRIVATE_DATA! \n"));\r
107 return EFI_OUT_OF_RESOURCES;\r
108 }\r
109\r
110 Private->Signature = UFS_HC_PEI_SIGNATURE;\r
111 Private->UfsHostControllerPpi = mUfsHostControllerPpi;\r
112 Private->PpiList = mPpiList;\r
113 Private->PpiList.Ppi = &Private->UfsHostControllerPpi;\r
114\r
115 for (Bus = 0; Bus < 256; Bus++) {\r
116 for (Device = 0; Device < 32; Device++) {\r
117 for (Function = 0; Function < 8; Function++) {\r
118 SubClass = PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x0A));\r
119 BaseClass = PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x0B));\r
120\r
121 if ((SubClass == 0x09) && (BaseClass == PCI_CLASS_MASS_STORAGE)) {\r
122 //\r
123 // Get the Ufs Pci host controller's MMIO region size.\r
124 //\r
125 PciAnd16 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET), (UINT16)~(EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE));\r
126 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET), 0xFFFFFFFF);\r
127 Size = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET));\r
128 //\r
129 // Assign resource to the Ufs Pci host controller's MMIO BAR.\r
130 // Enable the Ufs Pci host controller by setting BME and MSE bits of PCI_CMD register.\r
131 //\r
132 PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET), (UINT32)(PcdGet32 (PcdUfsPciHostControllerMmioBase) + Size * Private->TotalUfsHcs));\r
133 PciOr16 (PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET), (EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE));\r
134 //\r
135 // Record the allocated Mmio base address.\r
136 //\r
137 Private->UfsHcPciAddr[Private->TotalUfsHcs] = PcdGet32 (PcdUfsPciHostControllerMmioBase) + Size * Private->TotalUfsHcs;\r
138 Private->TotalUfsHcs++;\r
139 ASSERT (Private->TotalUfsHcs < MAX_UFS_HCS);\r
140 }\r
141 }\r
142 }\r
143 }\r
144\r
145 ///\r
146 /// Install Ufs Host Controller PPI\r
147 ///\r
148 Status = PeiServicesInstallPpi (&Private->PpiList);\r
149\r
150 ASSERT_EFI_ERROR (Status);\r
151 return Status;\r
152}\r