]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg: Enable support for flash in 64-bit address space
authorVijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
Wed, 6 Jan 2021 09:04:00 +0000 (14:34 +0530)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 7 Jan 2021 15:24:42 +0000 (15:24 +0000)
The existing NOR Flash DXE and StandaloneMm driver supports NOR flash
devices connected in the 32-bit address space. Extend these drivers to
allow NOR flash devices connected to 64-bit address space to be usable
as well. Also, convert the base address and size sanity check from
ASSERT() to if condition so that even if the firmware is build in
release mode, it can return error if the parameter(s) is/are invalid.

Signed-off-by: Vijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
Tested-by: Masahisa Kojima <masahisa.kojima@linaro.org>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.c
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashFvb.c
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashStandaloneMm.c
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf

index 41cdd1cbd397695b47d27f4a4dcdd75a5f37f5c8..28dc8e125c78786a9c92f1137370304f6be69592 100644 (file)
@@ -1,6 +1,6 @@
 /** @file  NorFlashDxe.c\r
 \r
-  Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.<BR>\r
+  Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -343,9 +343,18 @@ NorFlashInitialise (
 \r
   for (Index = 0; Index < mNorFlashDeviceCount; Index++) {\r
     // Check if this NOR Flash device contain the variable storage region\r
-    ContainVariableStorage =\r
-        (NorFlashDevices[Index].RegionBaseAddress <= PcdGet32 (PcdFlashNvStorageVariableBase)) &&\r
-        (PcdGet32 (PcdFlashNvStorageVariableBase) + PcdGet32 (PcdFlashNvStorageVariableSize) <= NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+\r
+   if (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0) {\r
+     ContainVariableStorage =\r
+       (NorFlashDevices[Index].RegionBaseAddress <= PcdGet64 (PcdFlashNvStorageVariableBase64)) &&\r
+       (PcdGet64 (PcdFlashNvStorageVariableBase64) + PcdGet32 (PcdFlashNvStorageVariableSize) <=\r
+        NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+   } else {\r
+     ContainVariableStorage =\r
+       (NorFlashDevices[Index].RegionBaseAddress <= PcdGet32 (PcdFlashNvStorageVariableBase)) &&\r
+       (PcdGet32 (PcdFlashNvStorageVariableBase) + PcdGet32 (PcdFlashNvStorageVariableSize) <=\r
+        NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+  }\r
 \r
     Status = NorFlashCreateInstance (\r
       NorFlashDevices[Index].DeviceBaseAddress,\r
@@ -413,10 +422,11 @@ NorFlashFvbInitialize (
       EFI_MEMORY_UC | EFI_MEMORY_RUNTIME);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  mFlashNvStorageVariableBase = PcdGet32 (PcdFlashNvStorageVariableBase);\r
+  mFlashNvStorageVariableBase = (FixedPcdGet64 (PcdFlashNvStorageVariableBase64) != 0) ?\r
+    FixedPcdGet64 (PcdFlashNvStorageVariableBase64) : FixedPcdGet32 (PcdFlashNvStorageVariableBase);\r
 \r
   // Set the index of the first LBA for the FVB\r
-  Instance->StartLba = (PcdGet32 (PcdFlashNvStorageVariableBase) - Instance->RegionBaseAddress) / Instance->Media.BlockSize;\r
+  Instance->StartLba = (mFlashNvStorageVariableBase - Instance->RegionBaseAddress) / Instance->Media.BlockSize;\r
 \r
   BootMode = GetBootModeHob ();\r
   if (BootMode == BOOT_WITH_DEFAULT_SETTINGS) {\r
index 8b5078497fffb734952c1767182236edef1ed068..f8d4c2703143b449c65f64e669781ccbf75ac512 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 #  Component description file for NorFlashDxe module\r
 #\r
-#  Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
+#  Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
   gEfiDiskIoProtocolGuid\r
 \r
 [Pcd.common]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
 \r
index a332b5e98be78c63eea927dbc4a95920ab2ca83f..db8eb595f4b8e32c6dbf8696b4f18faf82ca5916 100644 (file)
@@ -1,6 +1,6 @@
 /*++ @file  NorFlashFvbDxe.c\r
 \r
- Copyright (c) 2011 - 2020, ARM Ltd. All rights reserved.<BR>\r
+ Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>\r
 \r
  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -48,23 +48,66 @@ InitializeFvAndVariableStoreHeaders (
   UINTN                               HeadersLength;\r
   EFI_FIRMWARE_VOLUME_HEADER          *FirmwareVolumeHeader;\r
   VARIABLE_STORE_HEADER               *VariableStoreHeader;\r
+  UINT32                              NvStorageFtwSpareSize;\r
+  UINT32                              NvStorageFtwWorkingSize;\r
+  UINT32                              NvStorageVariableSize;\r
+  UINT64                              NvStorageFtwSpareBase;\r
+  UINT64                              NvStorageFtwWorkingBase;\r
+  UINT64                              NvStorageVariableBase;\r
 \r
   HeadersLength = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(VARIABLE_STORE_HEADER);\r
   Headers = AllocateZeroPool(HeadersLength);\r
 \r
+  NvStorageFtwWorkingSize = PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
+  NvStorageFtwSpareSize = PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
+  NvStorageVariableSize = PcdGet32 (PcdFlashNvStorageVariableSize);\r
+\r
+  NvStorageFtwSpareBase = (PcdGet64 (PcdFlashNvStorageFtwSpareBase64) != 0) ?\r
+    PcdGet64 (PcdFlashNvStorageFtwSpareBase64) : PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
+  NvStorageFtwWorkingBase = (PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) != 0) ?\r
+    PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) : PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
+  NvStorageVariableBase = (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0) ?\r
+    PcdGet64 (PcdFlashNvStorageVariableBase64) : PcdGet32 (PcdFlashNvStorageVariableBase);\r
+\r
   // FirmwareVolumeHeader->FvLength is declared to have the Variable area AND the FTW working area AND the FTW Spare contiguous.\r
-  ASSERT(PcdGet32(PcdFlashNvStorageVariableBase) + PcdGet32(PcdFlashNvStorageVariableSize) == PcdGet32(PcdFlashNvStorageFtwWorkingBase));\r
-  ASSERT(PcdGet32(PcdFlashNvStorageFtwWorkingBase) + PcdGet32(PcdFlashNvStorageFtwWorkingSize) == PcdGet32(PcdFlashNvStorageFtwSpareBase));\r
+  if ((NvStorageVariableBase + NvStorageVariableSize) != NvStorageFtwWorkingBase) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorageFtwWorkingBase is not contiguous with NvStorageVariableBase region\n",\r
+          __FUNCTION__));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((NvStorageFtwWorkingBase + NvStorageFtwWorkingSize) != NvStorageFtwSpareBase) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorageFtwSpareBase is not contiguous with NvStorageFtwWorkingBase region\n",\r
+        __FUNCTION__));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   // Check if the size of the area is at least one block size\r
-  ASSERT((PcdGet32(PcdFlashNvStorageVariableSize) > 0) && (PcdGet32(PcdFlashNvStorageVariableSize) / Instance->Media.BlockSize > 0));\r
-  ASSERT((PcdGet32(PcdFlashNvStorageFtwWorkingSize) > 0) && (PcdGet32(PcdFlashNvStorageFtwWorkingSize) / Instance->Media.BlockSize > 0));\r
-  ASSERT((PcdGet32(PcdFlashNvStorageFtwSpareSize) > 0) && (PcdGet32(PcdFlashNvStorageFtwSpareSize) / Instance->Media.BlockSize > 0));\r
+  if ((NvStorageVariableSize <= 0) || (NvStorageVariableSize / Instance->Media.BlockSize <= 0)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorageVariableSize is 0x%x, should be atleast one block size\n", __FUNCTION__,\r
+          NvStorageVariableSize));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((NvStorageFtwWorkingSize <= 0) || (NvStorageFtwWorkingSize / Instance->Media.BlockSize <= 0)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorageFtwWorkingSize is 0x%x, should be atleast one block size\n", __FUNCTION__,\r
+          NvStorageFtwWorkingSize));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((NvStorageFtwSpareSize <= 0) || (NvStorageFtwSpareSize / Instance->Media.BlockSize <= 0)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorageFtwSpareSize is 0x%x, should be atleast one block size\n", __FUNCTION__,\r
+          NvStorageFtwSpareSize));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   // Ensure the Variable area Base Addresses are aligned on a block size boundaries\r
-  ASSERT(PcdGet32(PcdFlashNvStorageVariableBase) % Instance->Media.BlockSize == 0);\r
-  ASSERT(PcdGet32(PcdFlashNvStorageFtwWorkingBase) % Instance->Media.BlockSize == 0);\r
-  ASSERT(PcdGet32(PcdFlashNvStorageFtwSpareBase) % Instance->Media.BlockSize == 0);\r
+  if ((NvStorageVariableBase % Instance->Media.BlockSize != 0) ||\r
+      (NvStorageFtwWorkingBase % Instance->Media.BlockSize != 0) ||\r
+      (NvStorageFtwSpareBase % Instance->Media.BlockSize != 0)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: NvStorage Base addresses must be aligned to block size boundaries", __FUNCTION__));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   //\r
   // EFI_FIRMWARE_VOLUME_HEADER\r
index 1ebf6d6ba70b49df2de0feec717352fdfc458a16..8a4fb395d286d78fa60ca029c56c8abf0b2462a6 100644 (file)
@@ -1,6 +1,6 @@
 /** @file  NorFlashStandaloneMm.c\r
 \r
-  Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.<BR>\r
+  Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>\r
   Copyright (c) 2020, Linaro, Ltd. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -298,9 +298,18 @@ NorFlashInitialise (
 \r
   for (Index = 0; Index < mNorFlashDeviceCount; Index++) {\r
     // Check if this NOR Flash device contain the variable storage region\r
-    ContainVariableStorage =\r
-        (NorFlashDevices[Index].RegionBaseAddress <= PcdGet32 (PcdFlashNvStorageVariableBase)) &&\r
-        (PcdGet32 (PcdFlashNvStorageVariableBase) + PcdGet32 (PcdFlashNvStorageVariableSize) <= NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+\r
+   if (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0) {\r
+     ContainVariableStorage =\r
+       (NorFlashDevices[Index].RegionBaseAddress <= PcdGet64 (PcdFlashNvStorageVariableBase64)) &&\r
+       (PcdGet64 (PcdFlashNvStorageVariableBase64) + PcdGet32 (PcdFlashNvStorageVariableSize) <=\r
+        NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+   } else {\r
+     ContainVariableStorage =\r
+       (NorFlashDevices[Index].RegionBaseAddress <= PcdGet32 (PcdFlashNvStorageVariableBase)) &&\r
+       (PcdGet32 (PcdFlashNvStorageVariableBase) + PcdGet32 (PcdFlashNvStorageVariableSize) <=\r
+        NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].Size);\r
+  }\r
 \r
     Status = NorFlashCreateInstance (\r
       NorFlashDevices[Index].DeviceBaseAddress,\r
@@ -330,10 +339,11 @@ NorFlashFvbInitialize (
 \r
   ASSERT((Instance != NULL));\r
 \r
-  mFlashNvStorageVariableBase = PcdGet32 (PcdFlashNvStorageVariableBase);\r
 \r
+  mFlashNvStorageVariableBase = (FixedPcdGet64 (PcdFlashNvStorageVariableBase64) != 0) ?\r
+    FixedPcdGet64 (PcdFlashNvStorageVariableBase64) : FixedPcdGet32 (PcdFlashNvStorageVariableBase);\r
   // Set the index of the first LBA for the FVB\r
-  Instance->StartLba = (PcdGet32 (PcdFlashNvStorageVariableBase) - Instance->RegionBaseAddress) / Instance->Media.BlockSize;\r
+  Instance->StartLba = (mFlashNvStorageVariableBase - Instance->RegionBaseAddress) / Instance->Media.BlockSize;\r
 \r
   // Determine if there is a valid header at the beginning of the NorFlash\r
   Status = ValidateFvHeader (Instance);\r
index f788472406b7536d06abcdd53c343c62016a9860..b2f72fb4de20463c7478a2424c9fb0f34fc0c8f5 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 #  Component description file for NorFlashStandaloneMm module\r
 #\r
-#  Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
+#  Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>\r
 #  Copyright (c) 2020, Linaro, Ltd. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
   gEfiSmmFirmwareVolumeBlockProtocolGuid\r
 \r
 [Pcd.common]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
 \r