From 3d3c13d8f8238d0ed6e3e23841737de53b2c424f Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 26 Feb 2008 11:28:55 +0100 Subject: [PATCH] [CFI Driver] - Update Kconfig help texts - Turn switch/case into if/else to be able to optimize out unused code when not all bankwidths are needed --- drivers/Kconfig | 54 +++++++++++++++++++++++++ drivers/Makefile | 2 +- drivers/cfi_flash_amd.c | 33 +++++---------- drivers/cfi_flash_intel.c | 35 +++------------- drivers/cfi_flash_new.c | 84 +++++++++++++-------------------------- include/cfi_flash_new.h | 37 ++++++++++++----- 6 files changed, 127 insertions(+), 118 deletions(-) diff --git a/drivers/Kconfig b/drivers/Kconfig index e4a488da5..eeb582b8f 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -10,14 +10,68 @@ config HAS_CFI config DRIVER_CFI bool "cfi flash driver" + help + If you have NOR Flash devices connected to your system and wish + to use them say yes here. + config DRIVER_CFI_NEW + depends on DRIVER_CFI + default y bool "new cfi flash driver" + help + The old cfi flash driver is mainly an adopted version from U-Boot v1 + whereas the new driver contains some more experimental features such + as selecting the supported chiptypes and bus widths making the driver + smaller. + Normally you should stick with the new driver, but if you experience + troubles you could try the old driver. Please report if the new driver + breaks something. + +config DRIVER_CFI_OLD + bool + default y + depends on !DRIVER_CFI_NEW + config DRIVER_CFI_INTEL depends on DRIVER_CFI_NEW bool "Support Intel flash chips" + config DRIVER_CFI_AMD depends on DRIVER_CFI_NEW bool "support AMD flash chips" + +config DRIVER_CFI_BANK_WIDTH_1 + bool "Support 8-bit buswidth" + depends on DRIVER_CFI_NEW + default y + help + If you wish to support CFI devices on a physical bus which is + 8 bits wide, say 'Y'. + +config DRIVER_CFI_BANK_WIDTH_2 + bool "Support 16-bit buswidth" + depends on DRIVER_CFI_NEW + default y + help + If you wish to support CFI devices on a physical bus which is + 16 bits wide, say 'Y'. + +config DRIVER_CFI_BANK_WIDTH_4 + bool "Support 32-bit buswidth" + depends on DRIVER_CFI_NEW + default y + help + If you wish to support CFI devices on a physical bus which is + 32 bits wide, say 'Y'. + +config DRIVER_CFI_BANK_WIDTH_8 + bool "Support 64-bit buswidth" + depends on DRIVER_CFI_NEW + default n + help + If you wish to support CFI devices on a physical bus which is + 64 bits wide, say 'Y'. + config CFI_BUFFER_WRITE bool "use cfi driver with buffer write" depends on DRIVER_CFI || DRIVER_CFI_NEW diff --git a/drivers/Makefile b/drivers/Makefile index 3845305f2..ecba682f4 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -1,7 +1,7 @@ obj-y += net/ obj-y += serial/ obj-y += nand/ -obj-$(CONFIG_DRIVER_CFI) += cfi_flash.o +obj-$(CONFIG_DRIVER_CFI_OLD) += cfi_flash.o obj-$(CONFIG_DRIVER_CFI_NEW) += cfi_flash_new.o obj-$(CONFIG_DRIVER_CFI_INTEL) += cfi_flash_intel.o obj-$(CONFIG_DRIVER_CFI_AMD) += cfi_flash_amd.o diff --git a/drivers/cfi_flash_amd.c b/drivers/cfi_flash_amd.c index b565a8535..6d7130f53 100644 --- a/drivers/cfi_flash_amd.c +++ b/drivers/cfi_flash_amd.c @@ -47,24 +47,18 @@ static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uc cptr.cp = flash_make_addr (info, sect, offset); flash_make_cmd (info, cmd, &cword); - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { retval = ((cptr.cp[0] & cword.c) != (cptr.cp[0] & cword.c)); - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { retval = ((cptr.wp[0] & cword.w) != (cptr.wp[0] & cword.w)); - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { retval = ((cptr.lp[0] & cword.l) != (cptr.lp[0] & cword.l)); - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { retval = ((cptr.llp[0] & cword.ll) != (cptr.llp[0] & cword.ll)); - break; - default: + } else retval = 0; - break; - } + return retval; } @@ -120,29 +114,22 @@ static int amd_flash_write_cfibuffer (flash_info_t * info, ulong dest, const uch flash_make_cmd (info, AMD_CMD_WRITE_TO_BUFFER, &cword); flash_write_word(info, cword, (void *)dest); - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { cnt = len; flash_write_cmd (info, sector, 0, (uchar) cnt - 1); while (cnt-- > 0) *dst.cp++ = *src.cp++; - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { cnt = len >> 1; flash_write_cmd (info, sector, 0, (uchar) cnt - 1); while (cnt-- > 0) *dst.wp++ = *src.wp++; - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { cnt = len >> 2; flash_write_cmd (info, sector, 0, (uchar) cnt - 1); while (cnt-- > 0) *dst.lp++ = *src.lp++; - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { cnt = len >> 3; flash_write_cmd (info, sector, 0, (uchar) cnt - 1); while (cnt-- > 0) *dst.llp++ = *src.llp++; - break; - default: - return ERR_INVAL; } flash_write_cmd (info, sector, 0, AMD_CMD_WRITE_BUFFER_CONFIRM); diff --git a/drivers/cfi_flash_intel.c b/drivers/cfi_flash_intel.c index d6594fc08..18b377cc5 100644 --- a/drivers/cfi_flash_intel.c +++ b/drivers/cfi_flash_intel.c @@ -108,41 +108,18 @@ static int intel_flash_write_cfibuffer (flash_info_t * info, ulong dest, const u if ((retcode = flash_status_check (info, sector, info->buffer_write_tout, "write to buffer")) == ERR_OK) { /* reduce the number of loops by the width of the port */ - switch (info->portwidth) { - case FLASH_CFI_8BIT: - cnt = len; - break; - case FLASH_CFI_16BIT: - cnt = len >> 1; - break; - case FLASH_CFI_32BIT: - cnt = len >> 2; - break; - case FLASH_CFI_64BIT: - cnt = len >> 3; - break; - default: - return ERR_INVAL; - break; - } + cnt = len >> (info->portwidth - 1); + flash_write_cmd (info, sector, 0, (uchar) cnt - 1); while (cnt-- > 0) { - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { *dst.cp++ = *src.cp++; - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { *dst.wp++ = *src.wp++; - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { *dst.lp++ = *src.lp++; - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { *dst.llp++ = *src.llp++; - break; - default: - return ERR_INVAL; - break; } } flash_write_cmd (info, sector, 0, diff --git a/drivers/cfi_flash_new.c b/drivers/cfi_flash_new.c index 848bd3c58..f2d4314b9 100644 --- a/drivers/cfi_flash_new.c +++ b/drivers/cfi_flash_new.c @@ -83,11 +83,9 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c) unsigned long long ll; #endif - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { cword->c = c; - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { #if defined(__LITTLE_ENDIAN) w = c; w <<= 8; @@ -95,8 +93,7 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c) #else cword->w = (cword->w << 8) | c; #endif - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { #if defined(__LITTLE_ENDIAN) l = c; l <<= 24; @@ -104,8 +101,7 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c) #else cword->l = (cword->l << 8) | c; #endif - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { #if defined(__LITTLE_ENDIAN) ll = c; ll <<= 56; @@ -113,7 +109,6 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c) #else cword->ll = (cword->ll << 8) | c; #endif - break; } } @@ -129,22 +124,17 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest, /* Check if Flash is (sufficiently) erased */ - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { flag = ((cptr.cp[0] & cword.c) == cword.c); - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { flag = ((cptr.wp[0] & cword.w) == cword.w); - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { flag = ((cptr.lp[0] & cword.l) == cword.l); - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { flag = ((cptr.llp[0] & cword.ll) == cword.ll); - break; - default: + } else return 2; - } + if (!flag) return 2; @@ -153,19 +143,14 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest, info->cfi_cmd_set->flash_prepare_write(info); - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { cptr.cp[0] = cword.c; - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { cptr.wp[0] = cword.w; - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { cptr.lp[0] = cword.l; - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { cptr.llp[0] = cword.ll; - break; } /* re-enable interrupts if necessary */ @@ -322,7 +307,7 @@ static int flash_detect_cfi (flash_info_t * info) /* * The following code cannot be run from FLASH! */ -ulong flash_get_size (flash_info_t *info, ulong base) +static ulong flash_get_size (flash_info_t *info, ulong base) { int i, j; flash_sect_t sect_cnt; @@ -531,7 +516,7 @@ static int cfi_probe (struct device_d *dev) * when the passed address is greater or equal to the sector address * we have a match */ -flash_sect_t find_sector (flash_info_t * info, ulong addr) +static inline flash_sect_t find_sector (flash_info_t * info, ulong addr) { flash_sect_t sector; @@ -878,7 +863,6 @@ int flash_status_check (flash_info_t * info, flash_sect_t sector, void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf) { int i; - cfiword_t val; uchar *cp = (uchar *) cmdbuf; #if defined(__LITTLE_ENDIAN) @@ -913,20 +897,16 @@ int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cm flash_make_cmd (info, cmd, &cword); debug ("is= cmd %x(%c) addr %p ", cmd, cmd, cptr.cp); - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { debug ("is= %x %x\n", cptr.cp[0], cword.c); retval = (cptr.cp[0] == cword.c); - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { debug ("is= %4.4x %4.4x\n", cptr.wp[0], cword.w); retval = (cptr.wp[0] == cword.w); - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { debug ("is= %8.8lx %8.8lx\n", cptr.lp[0], cword.l); retval = (cptr.lp[0] == cword.l); - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { #ifdef DEBUG { char str1[20]; @@ -938,11 +918,9 @@ int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cm } #endif retval = (cptr.llp[0] == cword.ll); - break; - default: + } else retval = 0; - break; - } + return retval; } @@ -954,23 +932,17 @@ int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd) cptr.cp = flash_make_addr (info, sect, offset); flash_make_cmd (info, cmd, &cword); - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { retval = ((cptr.cp[0] & cword.c) == cword.c); - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { retval = ((cptr.wp[0] & cword.w) == cword.w); - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { retval = ((cptr.lp[0] & cword.l) == cword.l); - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { retval = ((cptr.llp[0] & cword.ll) == cword.ll); - break; - default: + } else retval = 0; - break; - } + return retval; } diff --git a/include/cfi_flash_new.h b/include/cfi_flash_new.h index c00f47c54..2a0517f4b 100644 --- a/include/cfi_flash_new.h +++ b/include/cfi_flash_new.h @@ -209,6 +209,30 @@ static inline uchar flash_read_uchar (flash_info_t * info, uint offset) #endif } +#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_1 +#define bankwidth_is_1(info) (info->portwidth == 1) +#else +#define bankwidth_is_1(info) 0 +#endif + +#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_2 +#define bankwidth_is_2(info) (info->portwidth == 2) +#else +#define bankwidth_is_2(info) 0 +#endif + +#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_4 +#define bankwidth_is_4(info) (info->portwidth == 4) +#else +#define bankwidth_is_4(info) 0 +#endif + +#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_8 +#define bankwidth_is_8(info) (info->portwidth == 8) +#else +#define bankwidth_is_8(info) 0 +#endif + typedef union { unsigned char c; unsigned short w; @@ -225,22 +249,17 @@ typedef union { static inline void flash_write_word(flash_info_t *info, cfiword_t datum, void *addr) { - switch (info->portwidth) { - case FLASH_CFI_8BIT: + if (bankwidth_is_1(info)) { debug("fw addr %p val %02x\n", addr, datum.c); writeb(datum.c, addr); - break; - case FLASH_CFI_16BIT: + } else if (bankwidth_is_2(info)) { debug("fw addr %p val %04x\n", addr, datum.w); writew(datum.w, addr); - break; - case FLASH_CFI_32BIT: + } else if (bankwidth_is_4(info)) { debug("fw addr %p val %08x\n", addr, datum.l); writel(datum.l, addr); - break; - case FLASH_CFI_64BIT: + } else if (bankwidth_is_8(info)) { memcpy((void *)addr, &datum.ll, 8); - break; } }