From 3d0376e30aaa496538b17488fff737001330dc88 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Tue, 3 Jul 2007 17:04:46 +0000 Subject: [PATCH] more generic handling of Macronix flash chips, fix #2008 SVN-Revision: 7863 --- .../101-cfi-fixup-macronix-bootloc.patch | 42 +++++++++------ .../101-cfi-fixup-macronix-bootloc.patch | 54 +++++++++++-------- 2 files changed, 56 insertions(+), 40 deletions(-) diff --git a/target/linux/adm5120-2.6/patches-2.6.22/101-cfi-fixup-macronix-bootloc.patch b/target/linux/adm5120-2.6/patches-2.6.22/101-cfi-fixup-macronix-bootloc.patch index 543cb940a4..5740d4ac60 100644 --- a/target/linux/adm5120-2.6/patches-2.6.22/101-cfi-fixup-macronix-bootloc.patch +++ b/target/linux/adm5120-2.6/patches-2.6.22/101-cfi-fixup-macronix-bootloc.patch @@ -2,7 +2,7 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c =================================================================== --- linux-2.6.22-rc6.orig/drivers/mtd/chips/cfi_cmdset_0002.c +++ linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -47,12 +47,17 @@ +@@ -47,12 +47,19 @@ #define MANUFACTURER_AMD 0x0001 #define MANUFACTURER_ATMEL 0x001F #define MANUFACTURER_SST 0x00BF @@ -15,48 +15,56 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c +/* Macronix */ +#define MX29LV160B 0x2249 /* MX29LV160 Bottom-boot chip */ ++#define MX29LV160T 0x22C4 /* MX29LV160 Top-boot chip */ +#define MX29LV320B 0x22A8 /* MX29LV320 Bottom-boot chip */ ++#define MX29LV320T 0x22A7 /* MX29LV320 Top-boot chip */ + static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); -@@ -217,6 +222,35 @@ static void fixup_use_atmel_lock(struct +@@ -217,6 +224,41 @@ static void fixup_use_atmel_lock(struct mtd->flags |= MTD_STUPID_LOCK; } +#ifdef CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC +/* -+ * Some Macronix chips has bad bootblock information in the CFI table ++ * Some Macronix chips has no/bad bootblock information in the CFI table + */ +static void fixup_macronix_bootloc(struct mtd_info *mtd, void* param) +{ + struct map_info *map = mtd->priv; + struct cfi_private *cfi = map->fldrv_priv; + struct cfi_pri_amdstd *extp = cfi->cmdset_priv; -+ __u8 major = extp->MajorVersion; -+ __u8 minor = extp->MinorVersion; ++ __u8 t; + + switch (cfi->id) { + /* TODO: put affected chip ids here */ + case MX29LV160B: + case MX29LV320B: -+ if (((major << 8) | minor) != 0x3131) -+ break; -+ -+ if (extp->TopBottom == 2) -+ break; -+ -+ extp->TopBottom = 2; /* Bottom boot */ -+ printk("%s: weird Macronix chip detected, id:0x%04X, boot location " -+ "forced to bottom\n", map->name, cfi->id); ++ t = 2; /* Bottom boot */ ++ break; ++ case MX29LV160T: ++ case MX29LV320T: ++ t = 3; /* Top boot */ ++ break; ++ default: ++ return; + } ++ ++ if (extp->TopBottom == t) ++ /* boot location detected by the CFI layer is correct */ ++ return; ++ ++ extp->TopBottom = t; ++ printk("%s: Macronix chip detected, id:0x%04X, boot location forced " ++ "to %s\n", map->name, cfi->id, (t == 2) ? "bottom" : "top"); +} +#endif /* CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC */ + static struct cfi_fixup cfi_fixup_table[] = { #ifdef AMD_BOOTLOC_BUG { CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL }, -@@ -231,6 +265,9 @@ static struct cfi_fixup cfi_fixup_table[ +@@ -231,6 +273,9 @@ static struct cfi_fixup cfi_fixup_table[ { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, #endif { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, @@ -78,8 +86,8 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/Kconfig + bool "Force bottom boot for Macronix flash chips" + depends on MTD_CFI_AMDSTD + help -+ Some Macronix flash chips have wrong boot-block location in the -+ CFI table, and the driver may detect the type incorrectly. Select ++ Some Macronix flash chips have no/wrong boot-block location in the ++ CFI table, and the driver may detect the type incorrectly. Select + this if your board has such chip. + config MTD_CFI_STAA diff --git a/target/linux/adm5120-2.6/patches/101-cfi-fixup-macronix-bootloc.patch b/target/linux/adm5120-2.6/patches/101-cfi-fixup-macronix-bootloc.patch index 58b6dff1f2..84fc8652f4 100644 --- a/target/linux/adm5120-2.6/patches/101-cfi-fixup-macronix-bootloc.patch +++ b/target/linux/adm5120-2.6/patches/101-cfi-fixup-macronix-bootloc.patch @@ -1,8 +1,8 @@ -Index: linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c +Index: linux-2.6.21.5/drivers/mtd/chips/cfi_cmdset_0002.c =================================================================== ---- linux-2.6.21.1.orig/drivers/mtd/chips/cfi_cmdset_0002.c -+++ linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -47,12 +47,17 @@ +--- linux-2.6.21.5.orig/drivers/mtd/chips/cfi_cmdset_0002.c ++++ linux-2.6.21.5/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -47,12 +47,19 @@ #define MANUFACTURER_AMD 0x0001 #define MANUFACTURER_ATMEL 0x001F #define MANUFACTURER_SST 0x00BF @@ -15,48 +15,56 @@ Index: linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c +/* Macronix */ +#define MX29LV160B 0x2249 /* MX29LV160 Bottom-boot chip */ ++#define MX29LV160T 0x22C4 /* MX29LV160 Top-boot chip */ +#define MX29LV320B 0x22A8 /* MX29LV320 Bottom-boot chip */ ++#define MX29LV320T 0x22A7 /* MX29LV320 Top-boot chip */ + static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); -@@ -217,6 +222,35 @@ static void fixup_use_atmel_lock(struct +@@ -217,6 +224,41 @@ static void fixup_use_atmel_lock(struct mtd->flags |= MTD_STUPID_LOCK; } +#ifdef CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC +/* -+ * Some Macronix chips has bad bootblock information in the CFI table ++ * Some Macronix chips has no/bad bootblock information in the CFI table + */ +static void fixup_macronix_bootloc(struct mtd_info *mtd, void* param) +{ + struct map_info *map = mtd->priv; + struct cfi_private *cfi = map->fldrv_priv; + struct cfi_pri_amdstd *extp = cfi->cmdset_priv; -+ __u8 major = extp->MajorVersion; -+ __u8 minor = extp->MinorVersion; ++ __u8 t; + + switch (cfi->id) { + /* TODO: put affected chip ids here */ + case MX29LV160B: + case MX29LV320B: -+ if (((major << 8) | minor) != 0x3131) -+ break; -+ -+ if (extp->TopBottom == 2) -+ break; -+ -+ extp->TopBottom = 2; /* Bottom boot */ -+ printk("%s: weird Macronix chip detected, id:0x%04X, boot location " -+ "forced to bottom\n", map->name, cfi->id); ++ t = 2; /* Bottom boot */ ++ break; ++ case MX29LV160T: ++ case MX29LV320T: ++ t = 3; /* Top boot */ ++ break; ++ default: ++ return; + } ++ ++ if (extp->TopBottom == t) ++ /* boot location detected by the CFI layer is correct */ ++ return; ++ ++ extp->TopBottom = t; ++ printk("%s: Macronix chip detected, id:0x%04X, boot location forced " ++ "to %s\n", map->name, cfi->id, (t == 2) ? "bottom" : "top"); +} +#endif /* CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC */ + static struct cfi_fixup cfi_fixup_table[] = { #ifdef AMD_BOOTLOC_BUG { CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL }, -@@ -231,6 +265,9 @@ static struct cfi_fixup cfi_fixup_table[ +@@ -231,6 +273,9 @@ static struct cfi_fixup cfi_fixup_table[ { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, }, #endif { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL }, @@ -66,10 +74,10 @@ Index: linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c { 0, 0, NULL, NULL } }; static struct cfi_fixup jedec_fixup_table[] = { -Index: linux-2.6.21.1/drivers/mtd/chips/Kconfig +Index: linux-2.6.21.5/drivers/mtd/chips/Kconfig =================================================================== ---- linux-2.6.21.1.orig/drivers/mtd/chips/Kconfig -+++ linux-2.6.21.1/drivers/mtd/chips/Kconfig +--- linux-2.6.21.5.orig/drivers/mtd/chips/Kconfig ++++ linux-2.6.21.5/drivers/mtd/chips/Kconfig @@ -199,6 +199,14 @@ config MTD_CFI_AMDSTD provides support for one of those command sets, used on chips including the AMD Am29LV320. @@ -78,8 +86,8 @@ Index: linux-2.6.21.1/drivers/mtd/chips/Kconfig + bool "Force bottom boot for Macronix flash chips" + depends on MTD_CFI_AMDSTD + help -+ Some Macronix flash chips have wrong boot-block location in the -+ CFI table, and the driver may detect the type incorrectly. Select ++ Some Macronix flash chips have no/wrong boot-block location in the ++ CFI table, and the driver may detect the type incorrectly. Select + this if your board has such chip. + config MTD_CFI_STAA