[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