Commit e619a75f authored by Justin Treon's avatar Justin Treon Committed by David Woodhouse

[MTD] Unlocking all Intel flash that is locked on power up.

Patch for unlocking all Intel flash that has instant locking on power up.
The patch has been tested on Intel M18, P30 and J3D Strata Flash.
  1.    The automatic unlocking can be disabled for a particular partition
         in the map or the command line.
     a. For the bit mask in the map it should look like:
         .mask_flags   = MTD_POWERUP_LOCK,
     b. For the command line parsing it should look like:
         mtdparts=0x80000(bootloader)lk
  2.    This will only unlock parts with instant individual block locking.
         Intel parts with legacy unlocking will not be unlocked.
Signed-off-by: default avatarJustin Treon <justin_treon@yahoo.com>
Signed-off-by: default avatarJared Hulbert <jaredeh@gmail.com>
Acked-by: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
parent 842b1a10
...@@ -269,10 +269,16 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param) ...@@ -269,10 +269,16 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
/* /*
* Some chips power-up with all sectors locked by default. * Some chips power-up with all sectors locked by default.
*/ */
static void fixup_use_powerup_lock(struct mtd_info *mtd, void *param) static void fixup_unlock_powerup_lock(struct mtd_info *mtd, void *param)
{ {
printk(KERN_INFO "Using auto-unlock on power-up/resume\n" ); struct map_info *map = mtd->priv;
mtd->flags |= MTD_STUPID_LOCK; struct cfi_private *cfi = map->fldrv_priv;
struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
if (cfip->FeatureSupport&32) {
printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
mtd->flags |= MTD_POWERUP_LOCK;
}
} }
static struct cfi_fixup cfi_fixup_table[] = { static struct cfi_fixup cfi_fixup_table[] = {
...@@ -288,7 +294,7 @@ static struct cfi_fixup cfi_fixup_table[] = { ...@@ -288,7 +294,7 @@ static struct cfi_fixup cfi_fixup_table[] = {
#endif #endif
{ CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL }, { CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
{ CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL }, { CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
{ MANUFACTURER_INTEL, 0x891c, fixup_use_powerup_lock, NULL, }, { MANUFACTURER_INTEL, CFI_ID_ANY, fixup_unlock_powerup_lock, NULL, },
{ 0, 0, NULL, NULL } { 0, 0, NULL, NULL }
}; };
...@@ -2349,7 +2355,7 @@ static int cfi_intelext_suspend(struct mtd_info *mtd) ...@@ -2349,7 +2355,7 @@ static int cfi_intelext_suspend(struct mtd_info *mtd)
struct flchip *chip; struct flchip *chip;
int ret = 0; int ret = 0;
if ((mtd->flags & MTD_STUPID_LOCK) if ((mtd->flags & MTD_POWERUP_LOCK)
&& extp && (extp->FeatureSupport & (1 << 5))) && extp && (extp->FeatureSupport & (1 << 5)))
cfi_intelext_save_locks(mtd); cfi_intelext_save_locks(mtd);
...@@ -2460,7 +2466,7 @@ static void cfi_intelext_resume(struct mtd_info *mtd) ...@@ -2460,7 +2466,7 @@ static void cfi_intelext_resume(struct mtd_info *mtd)
spin_unlock(chip->mutex); spin_unlock(chip->mutex);
} }
if ((mtd->flags & MTD_STUPID_LOCK) if ((mtd->flags & MTD_POWERUP_LOCK)
&& extp && (extp->FeatureSupport & (1 << 5))) && extp && (extp->FeatureSupport & (1 << 5)))
cfi_intelext_restore_locks(mtd); cfi_intelext_restore_locks(mtd);
} }
......
...@@ -217,7 +217,7 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param) ...@@ -217,7 +217,7 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
{ {
mtd->lock = cfi_atmel_lock; mtd->lock = cfi_atmel_lock;
mtd->unlock = cfi_atmel_unlock; mtd->unlock = cfi_atmel_unlock;
mtd->flags |= MTD_STUPID_LOCK; mtd->flags |= MTD_POWERUP_LOCK;
} }
static struct cfi_fixup cfi_fixup_table[] = { static struct cfi_fixup cfi_fixup_table[] = {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* mtdparts=<mtddef>[;<mtddef] * mtdparts=<mtddef>[;<mtddef]
* <mtddef> := <mtd-id>:<partdef>[,<partdef>] * <mtddef> := <mtd-id>:<partdef>[,<partdef>]
* <partdef> := <size>[@offset][<name>][ro] * <partdef> := <size>[@offset][<name>][ro][lk]
* <mtd-id> := unique name used in mapping driver/device (mtd->name) * <mtd-id> := unique name used in mapping driver/device (mtd->name)
* <size> := standard linux memsize OR "-" to denote all remaining space * <size> := standard linux memsize OR "-" to denote all remaining space
* <name> := '(' NAME ')' * <name> := '(' NAME ')'
...@@ -143,6 +143,13 @@ static struct mtd_partition * newpart(char *s, ...@@ -143,6 +143,13 @@ static struct mtd_partition * newpart(char *s,
s += 2; s += 2;
} }
/* if lk is found do NOT unlock the MTD partition*/
if (strncmp(s, "lk", 2) == 0)
{
mask_flags |= MTD_POWERUP_LOCK;
s += 2;
}
/* test if more partitions are following */ /* test if more partitions are following */
if (*s == ',') if (*s == ',')
{ {
......
...@@ -61,7 +61,7 @@ int add_mtd_device(struct mtd_info *mtd) ...@@ -61,7 +61,7 @@ int add_mtd_device(struct mtd_info *mtd)
/* Some chips always power up locked. Unlock them now */ /* Some chips always power up locked. Unlock them now */
if ((mtd->flags & MTD_WRITEABLE) if ((mtd->flags & MTD_WRITEABLE)
&& (mtd->flags & MTD_STUPID_LOCK) && mtd->unlock) { && (mtd->flags & MTD_POWERUP_LOCK) && mtd->unlock) {
if (mtd->unlock(mtd, 0, mtd->size)) if (mtd->unlock(mtd, 0, mtd->size))
printk(KERN_WARNING printk(KERN_WARNING
"%s: unlock failed, " "%s: unlock failed, "
......
...@@ -29,7 +29,7 @@ struct mtd_oob_buf { ...@@ -29,7 +29,7 @@ struct mtd_oob_buf {
#define MTD_WRITEABLE 0x400 /* Device is writeable */ #define MTD_WRITEABLE 0x400 /* Device is writeable */
#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */
#define MTD_NO_ERASE 0x1000 /* No erase necessary */ #define MTD_NO_ERASE 0x1000 /* No erase necessary */
#define MTD_STUPID_LOCK 0x2000 /* Always locked after reset */ #define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */
// Some common devices / combinations of capabilities // Some common devices / combinations of capabilities
#define MTD_CAP_ROM 0 #define MTD_CAP_ROM 0
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment