]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/NorFlashDxe: Make the driver more compliant with the UEFI specification
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 14 Apr 2013 09:25:34 +0000 (09:25 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 14 Apr 2013 09:25:34 +0000 (09:25 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14263 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.c

index 21fceac1dc79979cce7ee0e4f1174b97caeec9f7..279b77c75ee18e664df3195494edb559e53fc0b6 100644 (file)
@@ -1,6 +1,6 @@
 /** @file  NorFlashBlockIoDxe.c\r
 \r
 /** @file  NorFlashBlockIoDxe.c\r
 \r
-  Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2011-2013, ARM Ltd. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -51,17 +51,27 @@ NorFlashBlockIoReadBlocks (
 {\r
   NOR_FLASH_INSTANCE  *Instance;\r
   EFI_STATUS          Status;\r
 {\r
   NOR_FLASH_INSTANCE  *Instance;\r
   EFI_STATUS          Status;\r
+  EFI_BLOCK_IO_MEDIA  *Media;\r
+\r
+  if (This == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
   Instance = INSTANCE_FROM_BLKIO_THIS(This);\r
 \r
   Instance = INSTANCE_FROM_BLKIO_THIS(This);\r
+  Media = This->Media;\r
 \r
   DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));\r
 \r
 \r
   DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));\r
 \r
-  if( !This->Media->MediaPresent ) {\r
+  if (!Media) {\r
+    Status = EFI_INVALID_PARAMETER;\r
+  } else if (!Media->MediaPresent) {\r
     Status = EFI_NO_MEDIA;\r
     Status = EFI_NO_MEDIA;\r
-  } else if( This->Media->MediaId != MediaId ) {\r
+  } else if (Media->MediaId != MediaId) {\r
     Status = EFI_MEDIA_CHANGED;\r
     Status = EFI_MEDIA_CHANGED;\r
+  } else if ((Media->IoAlign > 2) && (((UINTN)Buffer & (Media->IoAlign - 1)) != 0)) {\r
+    Status = EFI_INVALID_PARAMETER;\r
   } else {\r
   } else {\r
-    Status = NorFlashReadBlocks (Instance,Lba,BufferSizeInBytes,Buffer);\r
+    Status = NorFlashReadBlocks (Instance, Lba, BufferSizeInBytes, Buffer);\r
   }\r
 \r
   return Status;\r
   }\r
 \r
   return Status;\r
index a9c589b744c56363332dc32476b0c575d0817ce3..7953b6c9f563441a27b38a0f9049f29b0dae7d6b 100644 (file)
@@ -1,6 +1,6 @@
 /** @file  NorFlashDxe.c\r
 \r
 /** @file  NorFlashDxe.c\r
 \r
-  Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2011-2013, ARM Ltd. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -721,19 +721,20 @@ NorFlashReadBlocks (
   UINT32              NumBlocks;\r
   UINTN               StartAddress;\r
 \r
   UINT32              NumBlocks;\r
   UINTN               StartAddress;\r
 \r
+  DEBUG((DEBUG_BLKIO, "NorFlashReadBlocks: BufferSize=0x%xB BlockSize=0x%xB LastBlock=%ld, Lba=%ld.\n",\r
+      BufferSizeInBytes, Instance->Media.BlockSize, Instance->Media.LastBlock, Lba));\r
+\r
   // The buffer must be valid\r
   if (Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   // The buffer must be valid\r
   if (Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  // We must have some bytes to read\r
-  DEBUG((DEBUG_BLKIO, "NorFlashReadBlocks: BufferSize=0x%x bytes.\n", BufferSizeInBytes));\r
-  if(BufferSizeInBytes == 0) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+  // Return if we have not any byte to read \r
+  if (BufferSizeInBytes == 0) {\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   // The size of the buffer must be a multiple of the block size\r
   }\r
 \r
   // The size of the buffer must be a multiple of the block size\r
-  DEBUG((DEBUG_BLKIO, "NorFlashReadBlocks: BlockSize=0x%x bytes.\n", Instance->Media.BlockSize));\r
   if ((BufferSizeInBytes % Instance->Media.BlockSize) != 0) {\r
     return EFI_BAD_BUFFER_SIZE;\r
   }\r
   if ((BufferSizeInBytes % Instance->Media.BlockSize) != 0) {\r
     return EFI_BAD_BUFFER_SIZE;\r
   }\r
@@ -741,8 +742,6 @@ NorFlashReadBlocks (
   // All blocks must be within the device\r
   NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize ;\r
 \r
   // All blocks must be within the device\r
   NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize ;\r
 \r
-  DEBUG((DEBUG_BLKIO, "NorFlashReadBlocks: NumBlocks=%d, LastBlock=%ld, Lba=%ld\n", NumBlocks, Instance->Media.LastBlock, Lba));\r
-\r
   if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) {\r
     DEBUG((EFI_D_ERROR, "NorFlashReadBlocks: ERROR - Read will exceed last block\n"));\r
     return EFI_INVALID_PARAMETER;\r
   if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) {\r
     DEBUG((EFI_D_ERROR, "NorFlashReadBlocks: ERROR - Read will exceed last block\n"));\r
     return EFI_INVALID_PARAMETER;\r