]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/VirtNorFlashDxe: avoid array mode switch after each word write
authorArd Biesheuvel <ardb@kernel.org>
Mon, 24 Oct 2022 15:34:09 +0000 (17:34 +0200)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 27 Oct 2022 16:52:01 +0000 (16:52 +0000)
NorFlashWriteSingleWord() switches into programming mode and back into
array mode for every single word that it writes. Under KVM, this
involves tearing down the read-only memslot, and setting it up again,
which is costly and unnecessary.

Instead, move the array mode switch into the callers, and only make the
switch when the writing is done.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
OvmfPkg/VirtNorFlashDxe/VirtNorFlash.c
OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c

index f41d9d372f49414e5f6d6b7238cc1ad7bc3071e3..0a5c5d48c738f69ddc44808e48842ac782c5ee8d 100644 (file)
@@ -205,9 +205,6 @@ NorFlashWriteSingleWord (
     SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER);\r
   }\r
 \r
-  // Put device back into Read Array mode\r
-  SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY);\r
-\r
   return Status;\r
 }\r
 \r
@@ -286,8 +283,7 @@ NorFlashWriteBuffer (
 \r
   // The buffer was not available for writing\r
   if (WaitForBuffer == 0) {\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto EXIT;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   // From now on we work in 32-bit words\r
@@ -337,10 +333,6 @@ NorFlashWriteBuffer (
     SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER);\r
   }\r
 \r
-EXIT:\r
-  // Put device back into Read Array mode\r
-  SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY);\r
-\r
   return Status;\r
 }\r
 \r
@@ -739,6 +731,8 @@ NorFlashWriteSingleBlock (
       }\r
 \r
       TempStatus = NorFlashWriteSingleWord (Instance, WordAddr, WordToWrite);\r
+      // Put device back into Read Array mode\r
+      SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY);\r
       if (EFI_ERROR (TempStatus)) {\r
         return EFI_DEVICE_ERROR;\r
       }\r
index 2ceda226359ca36e10887640ea8f789ae3a4ec71..f9a41f6aab0f9189a625fc02501e068e732945cb 100644 (file)
@@ -280,6 +280,9 @@ NorFlashWriteFullBlock (
   }\r
 \r
 EXIT:\r
+  // Put device back into Read Array mode\r
+  SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY);\r
+\r
   if (!EfiAtRuntime ()) {\r
     // Interruptions can resume.\r
     gBS->RestoreTPL (OriginalTPL);\r