[U-Boot-Users] [PATCH] Rework flash_read_uchar(), flash_read_ushort(), flash_read_long() for reading flash safety.

Zhang Wei wei.zhang at freescale.com
Thu Feb 8 12:26:34 CET 2007


Signed-off-by: Zhang Wei <wei.zhang at freescale.com>
---
 drivers/cfi_flash.c |  107 +++++++++++++++++++++++----------------------------
 1 files changed, 48 insertions(+), 59 deletions(-)

diff --git a/drivers/cfi_flash.c b/drivers/cfi_flash.c
index 696f9a4..8289b21 100644
--- a/drivers/cfi_flash.c
+++ b/drivers/cfi_flash.c
@@ -250,83 +250,72 @@ static void flash_printqry (flash_info_t
 #endif
 
 
-/*-----------------------------------------------------------------------
- * read a character at a port width address
- */
-inline uchar flash_read_uchar (flash_info_t * info, uint offset)
+static inline ulong flash_read(flash_info_t * info,
+			       flash_sect_t sect, uint offset, int data_size)
 {
-	uchar *cp;
+	volatile cfiptr_t addr;
+	unsigned long retval = 0;
+	int i;
 
-	cp = flash_make_addr (info, 0, offset);
+	addr.cp = flash_make_addr(info, sect, offset);
+	for (i = 0; i < data_size; i++)	{
+		cfiword_t cw;
+		switch (info->portwidth) {
+		case FLASH_CFI_8BIT:
+			cw.c = addr.cp[i];
+			break;
+		case FLASH_CFI_16BIT:
+			cw.w = addr.wp[i];
+			break;
+		case FLASH_CFI_32BIT:
+			cw.l = addr.lp[i];
+			break;
+		case FLASH_CFI_64BIT:
+			cw.ll = addr.llp[i];
+			break;
+		default:
+			return 0;
+		}
 #if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA)
-	return (cp[0]);
+		retval |= (cw.c << (8 * i));
 #else
-	return (cp[info->portwidth - 1]);
+		retval |= (((cw.ll >> (8 * (FLASH_CFI_64BIT - info->portwidth)))
+					& 0xff) << (8 * i));
 #endif
+	}
+
+	debug ("flash_read retval = 0x%x\n", retval);
+	return retval;
 }
 
 /*-----------------------------------------------------------------------
- * read a short word by swapping for ppc format.
+ * read a character at a port width address
  */
-ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+inline uchar flash_read_uchar (flash_info_t * info, uint offset)
 {
-	uchar *addr;
-	ushort retval;
-
-#ifdef DEBUG
-	int x;
-#endif
-	addr = flash_make_addr (info, sect, offset);
-
-#ifdef DEBUG
-	debug ("ushort addr is at %p info->portwidth = %d\n", addr,
-	       info->portwidth);
-	for (x = 0; x < 2 * info->portwidth; x++) {
-		debug ("addr[%x] = 0x%x\n", x, addr[x]);
-	}
-#endif
-#if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA)
-	retval = ((addr[(info->portwidth)] << 8) | addr[0]);
-#else
-	retval = ((addr[(2 * info->portwidth) - 1] << 8) |
-		  addr[info->portwidth - 1]);
-#endif
+	return (uchar)(flash_read(info, 0, offset, sizeof(uchar)));
+}
 
-	debug ("retval = 0x%x\n", retval);
-	return retval;
+/*-----------------------------------------------------------------------
+ * read a short word.
+ */
+ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+	return (ushort)(flash_read(info, sect, offset, sizeof(ushort)));
 }
 
 /*-----------------------------------------------------------------------
  * read a long word by picking the least significant byte of each maximum
- * port size word. Swap for ppc format.
+ * port size word.
  */
 ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
 {
-	uchar *addr;
-	ulong retval;
-
-#ifdef DEBUG
-	int x;
-#endif
-	addr = flash_make_addr (info, sect, offset);
-
-#ifdef DEBUG
-	debug ("long addr is at %p info->portwidth = %d\n", addr,
-	       info->portwidth);
-	for (x = 0; x < 4 * info->portwidth; x++) {
-		debug ("addr[%x] = 0x%x\n", x, addr[x]);
-	}
-#endif
-#if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA)
-	retval = (addr[0] << 16) | (addr[(info->portwidth)] << 24) |
-		(addr[(2 * info->portwidth)]) | (addr[(3 * info->portwidth)] << 8);
-#else
-	retval = (addr[(2 * info->portwidth) - 1] << 24) |
-		(addr[(info->portwidth) - 1] << 16) |
-		(addr[(4 * info->portwidth) - 1] << 8) |
-		addr[(3 * info->portwidth) - 1];
-#endif
-	return retval;
+	ulong rval;
+	rval = (((flash_read(info, sect, offset, sizeof(ushort))
+					& 0xffff) << 16 ) |
+	       (flash_read(info, sect, offset + FLASH_CFI_16BIT, sizeof(ushort))
+		 			& 0xffff));
+	return rval;
 }
 
 
-- 
1.4.0





More information about the U-Boot mailing list