]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/Library/FlashDeviceLib/FlashDeviceLibDxeRuntimeSmm.c
Vlv2TbltDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Vlv2TbltDevicePkg / Library / FlashDeviceLib / FlashDeviceLibDxeRuntimeSmm.c
CommitLineData
7a0a32f1
JY
1/** @file\r
2\r
3 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
4\r
9dc8036d 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7a0a32f1
JY
6\r
7\r
8\r
9**/\r
10\r
11#include <PiDxe.h>\r
12\r
13#include <Library/FlashDeviceLib.h>\r
14#include <Library/DebugLib.h>\r
15#include <Library/BaseLib.h>\r
16#include <Library/UefiBootServicesTableLib.h>\r
17#include <Library/UefiRuntimeServicesTableLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/UefiRuntimeLib.h>\r
20#include <Protocol/SmmBase2.h>\r
21#include <Guid/EventGroup.h>\r
22#include "SpiChipDefinitions.h"\r
23\r
24extern UINTN FlashDeviceBase;\r
25\r
26extern EFI_SPI_PROTOCOL *mSpiProtocol;\r
27\r
28VOID\r
29EFIAPI\r
30LibFvbFlashDeviceVirtualAddressChangeNotifyEvent (\r
31 IN EFI_EVENT Event,\r
32 IN VOID *Context\r
33 )\r
34{\r
35 gRT->ConvertPointer (0, (VOID **) &mSpiProtocol);\r
36 gRT->ConvertPointer (0, (VOID **) &FlashDeviceBase);\r
37}\r
38\r
39\r
40/**\r
41 The library constructuor.\r
42\r
43 The function does the necessary initialization work for this library\r
44 instance. Please put all initialization works in it.\r
45\r
46 @param[in] ImageHandle The firmware allocated handle for the UEFI image.\r
47 @param[in] SystemTable A pointer to the EFI system table.\r
48\r
49 @retval EFI_SUCCESS The function always return EFI_SUCCESS for now.\r
50 It will ASSERT on error for debug version.\r
51 @retval EFI_ERROR Please reference LocateProtocol for error code details.\r
52\r
53**/\r
54EFI_STATUS\r
55EFIAPI\r
56LibFvbFlashDeviceSupportInit (\r
57 IN EFI_HANDLE ImageHandle,\r
58 IN EFI_SYSTEM_TABLE *SystemTable\r
59 )\r
60{\r
61 EFI_STATUS Status;\r
62 EFI_EVENT Event;\r
63 UINT8 SfId[3];\r
64 UINT8 FlashIndex;\r
65 UINT8 SpiReadError;\r
66 UINT8 SpiNotMatchError;\r
67 EFI_SMM_BASE2_PROTOCOL *SmmBase;\r
68 BOOLEAN InSmm;\r
69\r
70 SpiReadError = 0x00;\r
71 SpiNotMatchError = 0x00;\r
72\r
73 InSmm = FALSE;\r
74 Status = gBS->LocateProtocol (\r
75 &gEfiSmmBase2ProtocolGuid,\r
76 NULL,\r
77 (void **)&SmmBase\r
78 );\r
79 if (!EFI_ERROR(Status)) {\r
80 Status = SmmBase->InSmm(SmmBase, &InSmm);\r
81 if (EFI_ERROR(Status)) {\r
82 InSmm = FALSE;\r
83 }\r
84 }\r
85\r
86 if (!InSmm) {\r
87 Status = gBS->LocateProtocol (\r
88 &gEfiSpiProtocolGuid,\r
89 NULL,\r
90 (VOID **)&mSpiProtocol\r
91 );\r
92 ASSERT_EFI_ERROR (Status);\r
93\r
94 Status = gBS->CreateEventEx (\r
95 EVT_NOTIFY_SIGNAL,\r
96 TPL_NOTIFY,\r
97 LibFvbFlashDeviceVirtualAddressChangeNotifyEvent,\r
98 NULL,\r
99 &gEfiEventVirtualAddressChangeGuid,\r
100 &Event\r
101 );\r
102 ASSERT_EFI_ERROR (Status);\r
103\r
104 } else {\r
105 Status = gBS->LocateProtocol (\r
106 &gEfiSmmSpiProtocolGuid,\r
107 NULL,\r
108 (VOID **)&mSpiProtocol\r
109 );\r
110 ASSERT_EFI_ERROR (Status);\r
111 }\r
112\r
113\r
114 for (FlashIndex = EnumSpiFlashW25Q64; FlashIndex < EnumSpiFlashMax; FlashIndex++) {\r
115 Status = mSpiProtocol->Init (mSpiProtocol, &(mInitTable[FlashIndex]));\r
116 if (!EFI_ERROR (Status)) {\r
117 //\r
118 // Read Vendor/Device IDs to check if the driver supports the Serial Flash device.\r
119 //\r
120 Status = mSpiProtocol->Execute (\r
121 mSpiProtocol,\r
122 SPI_READ_ID,\r
123 SPI_WREN,\r
124 TRUE,\r
125 FALSE,\r
126 FALSE,\r
127 0,\r
128 3,\r
129 SfId,\r
130 EnumSpiRegionAll\r
131 );\r
132 if (!EFI_ERROR (Status)) {\r
133 if ((SfId[0] == mInitTable[FlashIndex].VendorId) &&\r
134 (SfId[1] == mInitTable[FlashIndex].DeviceId0) &&\r
135 (SfId[2] == mInitTable[FlashIndex].DeviceId1)) {\r
136 //\r
137 // Found a matching SPI device, FlashIndex now contains flash device.\r
138 //\r
139 DEBUG ((EFI_D_ERROR, "OK - Found SPI Flash Type in SPI Flash Driver, Device Type ID 0 = 0x%02x!\n", mInitTable[FlashIndex].DeviceId0));\r
140 DEBUG ((EFI_D_ERROR, "Device Type ID 1 = 0x%02x!\n", mInitTable[FlashIndex].DeviceId1));\r
141\r
142 if (mInitTable[FlashIndex].BiosStartOffset == (UINTN) (-1)) {\r
143 DEBUG ((EFI_D_ERROR, "ERROR - The size of BIOS image is bigger than SPI Flash device!\n"));\r
144 CpuDeadLoop ();\r
145 }\r
146 break;\r
147 } else {\r
148 SpiNotMatchError++;\r
149 }\r
150 } else {\r
151 SpiReadError++;\r
152 }\r
153 }\r
154 }\r
155\r
156 DEBUG ((EFI_D_ERROR, "SPI flash chip VID = 0x%X, DID0 = 0x%X, DID1 = 0x%X\n", SfId[0], SfId[1], SfId[2]));\r
157\r
158 if (FlashIndex < EnumSpiFlashMax) {\r
159 return EFI_SUCCESS;\r
160 } else {\r
161 if (SpiReadError != 0) {\r
162 DEBUG ((EFI_D_ERROR, "ERROR - SPI Read ID execution failed! Error Count = %d\n", SpiReadError));\r
163 }\r
164 else {\r
165 if (SpiNotMatchError != 0) {\r
166 DEBUG ((EFI_D_ERROR, "ERROR - No supported SPI flash chip found! Error Count = %d\n", SpiNotMatchError));\r
167 DEBUG ((EFI_D_ERROR, "SPI flash chip VID = 0x%X, DID0 = 0x%X, DID1 = 0x%X\n", SfId[0], SfId[1], SfId[2]));\r
168 }\r
169 }\r
170 return EFI_UNSUPPORTED;\r
171 }\r
172}\r
173\r