]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/VlvPlatformInitDxe/VlvPlatformInit.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / VlvPlatformInitDxe / VlvPlatformInit.c
CommitLineData
3cbfba02
DW
1\r
2/*++\r
3\r
4Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved\r
5 \r\r
9dc8036d
MK
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
3cbfba02
DW
8 \r\r
9\r
10\r
11Module Name:\r
12\r
13 VlvPlatformInit.c\r
14\r
15Abstract:\r
16\r
17 This is the driver that initializes the Intel ValleyView.\r
18\r
19--*/\r
20\r
21#include "VlvPlatformInit.h"\r
22#include <Protocol/VlvPlatformPolicy.h>\r
23\r
24extern DXE_VLV_PLATFORM_POLICY_PROTOCOL *DxePlatformSaPolicy;\r
25UINT64 GTTMMADR;\r
26\r
27DXE_VLV_PLATFORM_POLICY_PROTOCOL *DxePlatformSaPolicy;\r
28\r
29/**\r
30 "Poll Status" for GT Readiness\r
31\r
32 @param Base Base address of MMIO\r
33 @param Offset MMIO Offset\r
34 @param Mask Mask\r
35 @param Result Value to wait for\r
36\r
37 @retval None\r
38\r
39**/\r
40VOID\r
41PollGtReady_hang (\r
42 UINT64 Base,\r
43 UINT32 Offset,\r
44 UINT32 Mask,\r
45 UINT32 Result\r
46 )\r
47{\r
48 UINT32 GtStatus;\r
49\r
50 //\r
51 // Register read\r
52 //\r
53 GtStatus = MmioRead32 ((UINTN)Base+ Offset);\r
54\r
55 while (((GtStatus & Mask) != Result)) {\r
56\r
57 GtStatus = MmioRead32 ((UINTN)Base + Offset);\r
58 }\r
59\r
60}\r
61\r
62/**\r
63 Do Post GT PM Init Steps after VBIOS Initialization.\r
64\r
65 @param Event A pointer to the Event that triggered the callback.\r
66 @param Context A pointer to private data registered with the callback function.\r
67\r
68 @retval EFI_SUCCESS GC_TODO\r
69\r
70\r
71**/\r
72EFI_STATUS\r
73EFIAPI \r
74PostPmInitCallBack (\r
75 IN EFI_EVENT Event,\r
76 IN VOID *Context\r
77 )\r
78{\r
79 UINT64 OriginalGTTMMADR;\r
80 UINT32 LoGTBaseAddress;\r
81 UINT32 HiGTBaseAddress;\r
82\r
83 //\r
84 // Enable Bus Master, I/O and Memory access on 0:2:0\r
85 //\r
86 PciOr8 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_CMD), (BIT2 | BIT1));\r
87\r
88 //\r
89 // only 32bit read/write is legal for device 0:2:0\r
90 //\r
91 OriginalGTTMMADR = (UINT64) PciRead32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR));\r
92 OriginalGTTMMADR = LShiftU64 ((UINT64) PciRead32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR + 4)), 32) | (OriginalGTTMMADR);\r
93\r
94 //\r
95 // 64bit GTTMADR does not work for S3 save script table since it is executed in PEIM phase\r
96 // Program temporarily 32bits GTTMMADR for POST and S3 resume\r
97 //\r
98 LoGTBaseAddress = (UINT32) (GTTMMADR & 0xFFFFFFFF);\r
99 HiGTBaseAddress = (UINT32) RShiftU64 ((GTTMMADR & 0xFFFFFFFF00000000), 32);\r
100 S3PciWrite32(PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR), LoGTBaseAddress);\r
101 S3PciWrite32(PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR+4), HiGTBaseAddress);\r
102\r
103\r
104\r
105 //\r
106 // Restore original GTTMMADR\r
107 //\r
108 LoGTBaseAddress = (UINT32) (OriginalGTTMMADR & 0xFFFFFFFF);\r
109 HiGTBaseAddress = (UINT32) RShiftU64 ((OriginalGTTMMADR & 0xFFFFFFFF00000000), 32);\r
110\r
111 S3PciWrite32(PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR), LoGTBaseAddress);\r
112 S3PciWrite32(PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_GTTMMADR+4), HiGTBaseAddress);\r
113\r
114\r
115 //\r
116 // Lock the following registers, GGC, BDSM, BGSM\r
117 //\r
118 PciOr32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_MGGC_OFFSET), LockBit);\r
119 PciOr32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_BSM_OFFSET), LockBit);\r
120 PciOr32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0,IGD_R_BGSM), LockBit);\r
121\r
122 gBS->CloseEvent (Event);\r
123\r
124 //\r
125 // Return final status\r
126 //\r
127 return EFI_SUCCESS;\r
128}\r
129\r
130/**\r
131\r
132 Routine Description:\r
133\r
134 Initialize GT Post Routines.\r
135\r
136 @param ImageHandle Handle for the image of this driver\r
137 @param DxePlatformSaPolicy SA DxePlatformPolicy protocol\r
138\r
139 @retval EFI_SUCCESS GT POST initialization complete\r
140\r
141**/\r
142EFI_STATUS\r
143IgdPmHook (\r
144 IN EFI_HANDLE ImageHandle,\r
40dc8c8b 145 IN DXE_VLV_PLATFORM_POLICY_PROTOCOL *DxePlatformSaPolicyParam\r
3cbfba02
DW
146 )\r
147{\r
148\r
149 EFI_EVENT mConOutEvent;\r
150 VOID *gConOutNotifyReg;\r
151\r
152 EFI_STATUS Status;\r
153\r
154 EFI_PHYSICAL_ADDRESS MemBaseAddress;\r
155 UINT32 LoGTBaseAddress;\r
156 UINT32 HiGTBaseAddress;\r
157\r
158 GTTMMADR = 0;\r
159 Status = EFI_SUCCESS;\r
160\r
161 //\r
162 // If device 0:2:0 (Internal Graphics Device, or GT) is enabled, then Program GTTMMADR,\r
163 //\r
164 if (PciRead16(PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_VID)) != 0xFFFF) {\r
165\r
166 ASSERT (gDS!=NULL);\r
167\r
168 //\r
169 // Enable Bus Master, I/O and Memory access on 0:2:0\r
170 //\r
171 PciOr8(PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_CMD), (BIT2 | BIT1 | BIT0));\r
172\r
173 //\r
174 // Means Allocate 4MB for GTTMADDR\r
175 //\r
176 MemBaseAddress = 0x0ffffffff;\r
177\r
178 Status = gDS->AllocateMemorySpace (\r
179 EfiGcdAllocateMaxAddressSearchBottomUp,\r
180 EfiGcdMemoryTypeMemoryMappedIo,\r
181 GTT_MEM_ALIGN,\r
182 GTTMMADR_SIZE_4MB,\r
183 &MemBaseAddress,\r
184 ImageHandle,\r
185 NULL\r
186 );\r
187 ASSERT_EFI_ERROR (Status);\r
188\r
189 //\r
190 // Program GT PM Settings if GTTMMADR allocation is Successful\r
191 //\r
192 GTTMMADR = (UINTN) MemBaseAddress;\r
193\r
194 LoGTBaseAddress = (UINT32) (MemBaseAddress & 0xFFFFFFFF);\r
195 HiGTBaseAddress = (UINT32) RShiftU64 ((MemBaseAddress & 0xFFFFFFFF00000000), 32);\r
196\r
197 PciWrite32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_GTTMMADR), LoGTBaseAddress);\r
198 PciWrite32 (PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_GTTMMADR+4), HiGTBaseAddress);\r
199\r
200\r
201 S3PciRead32(PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_GTTMMADR));\r
202\r
203\r
204 S3MmioRead32(IGD_R_GTTMMADR + 4);\r
205\r
206\r
207 S3PciRead8(PCI_LIB_ADDRESS(0, IGD_DEV, 0, IGD_R_CMD));\r
208\r
209 //\r
210 // Do POST GT PM Init Steps after VBIOS Initialization in DoPostPmInitCallBack\r
211 //\r
212 Status = gBS->CreateEvent (\r
213 EVT_NOTIFY_SIGNAL,\r
214 TPL_CALLBACK,\r
215 (EFI_EVENT_NOTIFY)PostPmInitCallBack,\r
216 NULL,\r
217 &mConOutEvent\r
218 );\r
219\r
220 ASSERT_EFI_ERROR (Status);\r
221 if (EFI_ERROR (Status)) {\r
222 return Status;\r
223 }\r
224\r
225\r
226 Status = gBS->RegisterProtocolNotify (\r
227 &gEfiGraphicsOutputProtocolGuid,\r
228 mConOutEvent,\r
229 &gConOutNotifyReg\r
230 );\r
231\r
232\r
233\r
234 MmioWrite64 (IGD_R_GTTMMADR, 0);\r
235\r
236 //\r
237 // Free allocated resources\r
238 //\r
239 gDS->FreeMemorySpace (\r
240 MemBaseAddress,\r
241 GTTMMADR_SIZE_4MB\r
242 );\r
243\r
244 }\r
245\r
246 return EFI_SUCCESS;\r
247}\r
248\r
249/**\r
250\r
251 This is the standard EFI driver point that detects\r
252 whether there is an ICH southbridge in the system\r
253 and if so, initializes the chip.\r
254\r
255 @param ImageHandle Handle for the image of this driver\r
256 @param SystemTable Pointer to the EFI System Table\r
257\r
258 @retval EFI_SUCCESS The function completed successfully\r
259\r
260**/\r
261EFI_STATUS\r
262EFIAPI\r
263VlvPlatformInitEntryPoint (\r
264 IN EFI_HANDLE ImageHandle,\r
265 IN EFI_SYSTEM_TABLE *SystemTable\r
266 )\r
267{\r
268 EFI_STATUS Status;\r
269\r
270 Status = gBS->LocateProtocol (&gDxeVlvPlatformPolicyGuid, NULL, (void **)&DxePlatformSaPolicy);\r
271 ASSERT_EFI_ERROR (Status);\r
272\r
273 //\r
274 // GtPostInit Initialization\r
275 //\r
276 DEBUG ((EFI_D_ERROR, "Initializing GT PowerManagement and other GT POST related\n"));\r
277 IgdPmHook (ImageHandle, DxePlatformSaPolicy);\r
278\r
279 //\r
280 // IgdOpRegion Install Initialization\r
281 //\r
282 DEBUG ((EFI_D_ERROR, "Initializing IGD OpRegion\n"));\r
283 IgdOpRegionInit ();\r
284\r
285 return EFI_SUCCESS;\r
286}\r
287\r