FvbService.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /** @file
  2. The header file for Firmware volume block driver.
  3. Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #ifndef FW_BLOCK_SERVICE_H_
  7. #define FW_BLOCK_SERVICE_H_
  8. #include <Guid/EventGroup.h>
  9. #include <Guid/FirmwareFileSystem2.h>
  10. #include <Guid/SystemNvDataGuid.h>
  11. #include <Guid/VariableFormat.h>
  12. #include <Protocol/DevicePath.h>
  13. #include <Protocol/FirmwareVolumeBlock.h>
  14. #include <Library/UefiDriverEntryPoint.h>
  15. #include <Library/UefiBootServicesTableLib.h>
  16. #include <Library/UefiLib.h>
  17. #include <Library/BaseLib.h>
  18. #include <Library/DebugLib.h>
  19. #include <Library/BaseMemoryLib.h>
  20. #include <Library/IoLib.h>
  21. #include <Library/CacheMaintenanceLib.h>
  22. #include <Library/MemoryAllocationLib.h>
  23. #include <Library/PcdLib.h>
  24. #include <Library/FlashDeviceLib.h>
  25. #include <Library/DevicePathLib.h>
  26. #include <Library/HobLib.h>
  27. #include <Library/DxeServicesLib.h>
  28. #include <Guid/NvVariableInfoGuid.h>
  29. #include <Register/ArchitecturalMsr.h>
  30. //
  31. // Define two helper macro to extract the Capability field or Status field in FVB
  32. // bit fields
  33. //
  34. #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP |\
  35. EFI_FVB2_READ_ENABLED_CAP | \
  36. EFI_FVB2_WRITE_DISABLED_CAP | \
  37. EFI_FVB2_WRITE_ENABLED_CAP | \
  38. EFI_FVB2_LOCK_CAP \
  39. )
  40. #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
  41. typedef struct {
  42. UINTN FvBase;
  43. UINTN NumOfBlocks;
  44. //
  45. // Note!!!: VolumeHeader must be the last element
  46. // of the structure.
  47. //
  48. EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
  49. } EFI_FW_VOL_INSTANCE;
  50. typedef struct {
  51. EFI_FW_VOL_INSTANCE *FvInstance;
  52. UINT32 NumFv;
  53. UINT32 Flags;
  54. } FWB_GLOBAL;
  55. //
  56. // Fvb Protocol instance data
  57. //
  58. #define FVB_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
  59. #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
  60. #define FVB_DEVICE_SIGNATURE SIGNATURE_32('F','V','B','C')
  61. typedef struct {
  62. MEDIA_FW_VOL_DEVICE_PATH FvDevPath;
  63. EFI_DEVICE_PATH_PROTOCOL EndDevPath;
  64. } FV_PIWG_DEVICE_PATH;
  65. typedef struct {
  66. MEMMAP_DEVICE_PATH MemMapDevPath;
  67. EFI_DEVICE_PATH_PROTOCOL EndDevPath;
  68. } FV_MEMMAP_DEVICE_PATH;
  69. typedef struct {
  70. UINT32 Signature;
  71. EFI_DEVICE_PATH_PROTOCOL *DevicePath;
  72. UINTN Instance;
  73. EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
  74. } EFI_FW_VOL_BLOCK_DEVICE;
  75. /**
  76. Get a heathy FV header used for variable store recovery
  77. @retval The FV header.
  78. **/
  79. EFI_FIRMWARE_VOLUME_HEADER *
  80. GetFvHeaderTemplate (
  81. VOID
  82. );
  83. EFI_STATUS
  84. InitVariableStore (
  85. VOID
  86. );
  87. //
  88. // Protocol APIs
  89. //
  90. EFI_STATUS
  91. EFIAPI
  92. FvbProtocolGetAttributes (
  93. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  94. OUT EFI_FVB_ATTRIBUTES_2 *Attributes
  95. );
  96. EFI_STATUS
  97. EFIAPI
  98. FvbProtocolSetAttributes (
  99. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  100. IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
  101. );
  102. EFI_STATUS
  103. EFIAPI
  104. FvbProtocolGetPhysicalAddress (
  105. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  106. OUT EFI_PHYSICAL_ADDRESS *Address
  107. );
  108. EFI_STATUS
  109. EFIAPI
  110. FvbProtocolGetBlockSize (
  111. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  112. IN EFI_LBA Lba,
  113. OUT UINTN *BlockSize,
  114. OUT UINTN *NumOfBlocks
  115. );
  116. EFI_STATUS
  117. EFIAPI
  118. FvbProtocolRead (
  119. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  120. IN EFI_LBA Lba,
  121. IN UINTN Offset,
  122. IN OUT UINTN *NumBytes,
  123. OUT UINT8 *Buffer
  124. );
  125. EFI_STATUS
  126. EFIAPI
  127. FvbProtocolWrite (
  128. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  129. IN EFI_LBA Lba,
  130. IN UINTN Offset,
  131. IN OUT UINTN *NumBytes,
  132. IN UINT8 *Buffer
  133. );
  134. EFI_STATUS
  135. EFIAPI
  136. FvbProtocolEraseBlocks (
  137. IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
  138. ...
  139. );
  140. EFI_FW_VOL_INSTANCE *
  141. GetFvbInstance (
  142. IN UINTN Instance
  143. );
  144. EFI_STATUS
  145. InstallFvbProtocol (
  146. IN EFI_FW_VOL_INSTANCE *FwhInstance,
  147. IN UINTN InstanceNum
  148. );
  149. EFI_STATUS
  150. FvbInitialize (
  151. VOID
  152. );
  153. extern FWB_GLOBAL mFvbModuleGlobal;
  154. extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate;
  155. extern FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate;
  156. extern FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate;
  157. #endif