]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c
Correct typo in word in DxeCore.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVolBlock / FwVolBlock.c
index 35926d3ee2a5cb1161d773bdaa1c949774ec400b..27e9f9e0b1147a87c0c5f7bdb1ae0706e5667822 100644 (file)
@@ -1,11 +1,11 @@
 /** @file\r
   Implementations for Firmware Volume Block protocol.\r
 \r
-  It consumes FV HOBs and creates read-lonly Firmare Volume Block protocol\r
+  It consumes FV HOBs and creates read-only Firmare Volume Block protocol\r
   instances for each of them.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -15,35 +15,59 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include <DxeMain.h>\r
+#include "DxeMain.h"\r
+#include "FwVolBlock.h"\r
 \r
-\r
-EFI_FW_VOL_BLOCK_DEVICE  mFwVolBlock = {\r
-  FVB_DEVICE_SIGNATURE,\r
-  NULL,\r
+FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate = {\r
   {\r
     {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_MEMMAP_DP,\r
       {\r
-        HARDWARE_DEVICE_PATH,\r
-        HW_MEMMAP_DP,\r
-        {\r
-          (UINT8)(sizeof (MEMMAP_DEVICE_PATH)),\r
-          (UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8)\r
-        }\r
-      },\r
-      EfiMemoryMappedIO,\r
-      (EFI_PHYSICAL_ADDRESS) 0,\r
-      (EFI_PHYSICAL_ADDRESS) 0,\r
+        (UINT8)(sizeof (MEMMAP_DEVICE_PATH)),\r
+        (UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8)\r
+      }\r
     },\r
+    EfiMemoryMappedIO,\r
+    (EFI_PHYSICAL_ADDRESS) 0,\r
+    (EFI_PHYSICAL_ADDRESS) 0,\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
     {\r
-      END_DEVICE_PATH_TYPE,\r
-      END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate = {\r
+  {\r
+    {\r
+      MEDIA_DEVICE_PATH,\r
+      MEDIA_PIWG_FW_VOL_DP,\r
       {\r
-        END_DEVICE_PATH_LENGTH,\r
-        0\r
+        (UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH)),\r
+        (UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH) >> 8)\r
       }\r
     },\r
+    { 0 }\r
   },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    {\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+EFI_FW_VOL_BLOCK_DEVICE  mFwVolBlock = {\r
+  FVB_DEVICE_SIGNATURE,\r
+  NULL,\r
+  NULL,\r
   {\r
     FwVolBlockGetAttributes,\r
     (EFI_FVB_SET_ATTRIBUTES)FwVolBlockSetAttributes,\r
@@ -75,7 +99,7 @@ EFI_STATUS
 EFIAPI\r
 FwVolBlockGetAttributes (\r
   IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
-  OUT       EFI_FVB_ATTRIBUTES                  *Attributes\r
+  OUT       EFI_FVB_ATTRIBUTES_2                *Attributes\r
   )\r
 {\r
   EFI_FW_VOL_BLOCK_DEVICE               *FvbDevice;\r
@@ -85,7 +109,7 @@ FwVolBlockGetAttributes (
   //\r
   // Since we are read only, it's safe to get attributes data from our in-memory copy.\r
   //\r
-  *Attributes = FvbDevice->FvbAttributes;\r
+  *Attributes = FvbDevice->FvbAttributes & ~EFI_FVB2_WRITE_STATUS;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -109,7 +133,7 @@ EFI_STATUS
 EFIAPI\r
 FwVolBlockSetAttributes (\r
   IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
-  IN CONST  EFI_FVB_ATTRIBUTES                  *Attributes\r
+  IN CONST  EFI_FVB_ATTRIBUTES_2                *Attributes\r
   )\r
 {\r
   return EFI_UNSUPPORTED;\r
@@ -302,7 +326,7 @@ FwVolBlockGetPhysicalAddress (
 \r
   FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
 \r
-  if (FvbDevice->FvbAttributes & EFI_FVB2_MEMORY_MAPPED) {\r
+  if ((FvbDevice->FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {\r
     *Address = FvbDevice->BaseAddress;\r
     return EFI_SUCCESS;\r
   }\r
@@ -426,6 +450,9 @@ ProduceFVBProtocolOnBuffer (
   // Get FvHeader alignment\r
   //\r
   FvAlignment = 1 << ((FwVolHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);\r
+  //\r
+  // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value. \r
+  //\r
   if (FvAlignment < 8) {\r
     FvAlignment = 8;\r
   }\r
@@ -438,7 +465,7 @@ ProduceFVBProtocolOnBuffer (
   //\r
   // Allocate EFI_FW_VOL_BLOCK_DEVICE\r
   //\r
-  FvbDev = CoreAllocateCopyPool (sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFwVolBlock);\r
+  FvbDev = AllocateCopyPool (sizeof (EFI_FW_VOL_BLOCK_DEVICE), &mFwVolBlock);\r
   if (FvbDev == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -460,11 +487,12 @@ ProduceFVBProtocolOnBuffer (
   //\r
   // Second, allocate the cache\r
   //\r
-  FvbDev->LbaCache = CoreAllocateBootServicesPool (FvbDev->NumBlocks * sizeof (LBA_CACHE));\r
+  FvbDev->LbaCache = AllocatePool (FvbDev->NumBlocks * sizeof (LBA_CACHE));\r
   if (FvbDev->LbaCache == NULL) {\r
     CoreFreePool (FvbDev);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+  \r
   //\r
   // Last, fill in the cache with the linear address of the blocks\r
   //\r
@@ -481,11 +509,34 @@ ProduceFVBProtocolOnBuffer (
   }\r
 \r
   //\r
-  // Set up the devicepath\r
+  // Judget whether FV name guid is produced in Fv extension header\r
   //\r
-  FvbDev->DevicePath.MemMapDevPath.StartingAddress = BaseAddress;\r
-  FvbDev->DevicePath.MemMapDevPath.EndingAddress = BaseAddress + FwVolHeader->FvLength - 1;\r
-\r
+  if (FwVolHeader->ExtHeaderOffset == 0) {\r
+    //\r
+    // FV does not contains extension header, then produce MEMMAP_DEVICE_PATH\r
+    //\r
+    FvbDev->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate);\r
+    if (FvbDev->DevicePath == NULL) {\r
+      FreePool (FvbDev);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    ((FV_MEMMAP_DEVICE_PATH *) FvbDev->DevicePath)->MemMapDevPath.StartingAddress = BaseAddress;\r
+    ((FV_MEMMAP_DEVICE_PATH *) FvbDev->DevicePath)->MemMapDevPath.EndingAddress   = BaseAddress + FwVolHeader->FvLength - 1;\r
+  } else {\r
+    //\r
+    // FV contains extension header, then produce MEDIA_FW_VOL_DEVICE_PATH\r
+    //\r
+    FvbDev->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate);\r
+    if (FvbDev->DevicePath == NULL) {\r
+      FreePool (FvbDev);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    CopyGuid (\r
+      &((FV_PIWG_DEVICE_PATH *)FvbDev->DevicePath)->FvDevPath.FvName, \r
+      (GUID *)(UINTN)(BaseAddress + FwVolHeader->ExtHeaderOffset)\r
+      );\r
+  }\r
+  \r
   //\r
   //\r
   // Attach FvVolBlock Protocol to new handle\r
@@ -493,8 +544,7 @@ ProduceFVBProtocolOnBuffer (
   Status = CoreInstallMultipleProtocolInterfaces (\r
              &FvbDev->Handle,\r
              &gEfiFirmwareVolumeBlockProtocolGuid,     &FvbDev->FwVolBlockInstance,\r
-             &gEfiDevicePathProtocolGuid,              &FvbDev->DevicePath,\r
-             &gEfiFirmwareVolumeDispatchProtocolGuid,  NULL,\r
+             &gEfiDevicePathProtocolGuid,              FvbDev->DevicePath,\r
              NULL\r
              );\r
 \r
@@ -511,9 +561,7 @@ ProduceFVBProtocolOnBuffer (
 \r
 \r
 /**\r
-  This routine is the driver initialization entry point.  It initializes the\r
-  libraries, consumes FV hobs and NT_NON_MM_FV environment variable and\r
-  produces instances of FW_VOL_BLOCK_PROTOCOL as appropriate.\r
+  This routine consumes FV hobs and produces instances of FW_VOL_BLOCK_PROTOCOL as appropriate.\r
 \r
   @param  ImageHandle            The image handle.\r
   @param  SystemTable            The system table.\r
@@ -566,6 +614,7 @@ FwVolBlockDriverInit (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 CoreProcessFirmwareVolume (\r
   IN VOID                             *FvHeader,\r
   IN UINTN                            Size,\r