]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbServiceSmm.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / FvbRuntimeDxe / FvbServiceSmm.c
CommitLineData
3cbfba02
DW
1/** @file\r
2 SMM Firmware Volume Block Driver for Lakeport Platform.\r
3\r
4 Firmware volume block driver for FWH or SPI device.\r
5 It depends on which Flash Device Library to be linked with this driver.\r
6\r
7Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
8 \r\r
9dc8036d
MK
9 SPDX-License-Identifier: BSD-2-Clause-Patent\r
10\r
3cbfba02
DW
11 \r\r
12\r
13**/\r
14\r
15#include <PiSmm.h>\r
16#include <Library/SmmServicesTableLib.h>\r
17#include "FvbSmmCommon.h"\r
18#include "FvbService.h"\r
19\r
20/**\r
21 The function installs EFI_SMM_FIRMWARE_VOLUME_BLOCK protocol\r
22 for each FV in the system.\r
23\r
24 @param[in] FwhInstance The pointer to a FW volume instance structure,\r
25 which contains the information about one FV.\r
26 @param[in] InstanceNum The instance number which can be used as a ID\r
27 to locate this FwhInstance in other functions.\r
28\r
29 @retval VOID\r
30\r
31**/\r
32VOID\r
33InstallFvbProtocol (\r
34 IN EFI_FW_VOL_INSTANCE *FwhInstance,\r
35 IN UINTN InstanceNum\r
36 )\r
37{\r
38 EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
39 EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
40 EFI_STATUS Status;\r
41 EFI_HANDLE FvbHandle;\r
42\r
43 FvbDevice = (EFI_FW_VOL_BLOCK_DEVICE *) AllocateRuntimeCopyPool (\r
44 sizeof (EFI_FW_VOL_BLOCK_DEVICE),\r
45 &mFvbDeviceTemplate\r
46 );\r
47 ASSERT (FvbDevice != NULL);\r
48\r
49 FvbDevice->Instance = InstanceNum;\r
50 FwVolHeader = &FwhInstance->VolumeHeader;\r
51\r
52 //\r
53 // Set up the devicepath.\r
54 //\r
55 if (FwVolHeader->ExtHeaderOffset == 0) {\r
56 //\r
57 // FV does not contains extension header, then produce MEMMAP_DEVICE_PATH.\r
58 //\r
59 FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateRuntimeCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate);\r
60 ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.StartingAddress = FwhInstance->FvBase;\r
61 ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.EndingAddress = FwhInstance->FvBase + FwVolHeader->FvLength - 1;\r
62 } else {\r
63 FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateRuntimeCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate);\r
64 CopyGuid (\r
65 &((FV_PIWG_DEVICE_PATH *)FvbDevice->DevicePath)->FvDevPath.FvName,\r
66 (GUID *)(UINTN)(FwhInstance->FvBase + FwVolHeader->ExtHeaderOffset)\r
67 );\r
68 }\r
69\r
70 //\r
71 // Install the SMM Firmware Volume Block Protocol and Device Path Protocol.\r
72 //\r
73 FvbHandle = NULL;\r
74 Status = gSmst->SmmInstallProtocolInterface (\r
75 &FvbHandle,\r
76 &gEfiSmmFirmwareVolumeBlockProtocolGuid,\r
77 EFI_NATIVE_INTERFACE,\r
78 &FvbDevice->FwVolBlockInstance\r
79 );\r
80 ASSERT_EFI_ERROR (Status);\r
81\r
82 Status = gSmst->SmmInstallProtocolInterface (\r
83 &FvbHandle,\r
84 &gEfiDevicePathProtocolGuid,\r
85 EFI_NATIVE_INTERFACE,\r
86 FvbDevice->DevicePath\r
87 );\r
88 ASSERT_EFI_ERROR (Status);\r
89\r
90 //\r
91 // Notify the Fvb wrapper driver SMM fvb is ready.\r
92 //\r
93 FvbHandle = NULL;\r
94 Status = gBS->InstallProtocolInterface (\r
95 &FvbHandle,\r
96 &gEfiSmmFirmwareVolumeBlockProtocolGuid,\r
97 EFI_NATIVE_INTERFACE,\r
98 &FvbDevice->FwVolBlockInstance\r
99 );\r
100}\r
101\r
102\r
103/**\r
104 The driver entry point for SMM Firmware Volume Block Driver.\r
105\r
106 The function does the necessary initialization work\r
107 Firmware Volume Block Driver.\r
108\r
109 @param[in] ImageHandle The firmware allocated handle for the UEFI image.\r
110 @param[in] SystemTable A pointer to the EFI system table.\r
111\r
112 @retval EFI_SUCCESS This funtion always return EFI_SUCCESS.\r
113 It will ASSERT on errors.\r
114\r
115**/\r
116EFI_STATUS\r
117EFIAPI\r
118FvbSmmInitialize (\r
119 IN EFI_HANDLE ImageHandle,\r
120 IN EFI_SYSTEM_TABLE *SystemTable\r
121 )\r
122{\r
123 FvbInitialize ();\r
124\r
125 return EFI_SUCCESS;\r
126}\r
127\r