Patchwork [3/9] mtd: sh_flctl: Use different OOB layout

login
register
mail settings
Submitter Bastian Hecht
Date April 20, 2012, 9:13 a.m.
Message ID <1334913230-23615-4-git-send-email-hechtb@gmail.com>
Download mbox | patch
Permalink /patch/153975/
State New
Headers show

Comments

Bastian Hecht - April 20, 2012, 9:13 a.m.
The flctl hardware has changed and a new OOB layout must be adapted for
2k page size NAND chips when using hardware ECC.
The related bit fields ECCPOS[0-2] are gone - the bits are marked as
reserved now in the datasheet. As there are no official users of the
hardware ECC so far, they are completely removed.

Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
 drivers/mtd/nand/sh_flctl.c  |   20 +++++++++++++-------
 include/linux/mtd/sh_flctl.h |    4 ----
 2 files changed, 13 insertions(+), 11 deletions(-)
Laurent Pinchart - April 21, 2012, 2:41 p.m.
Hi Bastian,

Thanks for the patch.

On Friday 20 April 2012 11:13:44 Bastian Hecht wrote:
> The flctl hardware has changed and a new OOB layout must be adapted for
> 2k page size NAND chips when using hardware ECC.
> The related bit fields ECCPOS[0-2] are gone - the bits are marked as
> reserved now in the datasheet. As there are no official users of the
> hardware ECC so far, they are completely removed.
> 
> Signed-off-by: Bastian Hecht <hechtb@gmail.com>
> ---
>  drivers/mtd/nand/sh_flctl.c  |   20 +++++++++++++-------
>  include/linux/mtd/sh_flctl.h |    4 ----
>  2 files changed, 13 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
> index 3c27921..411d783 100644
> --- a/drivers/mtd/nand/sh_flctl.c
> +++ b/drivers/mtd/nand/sh_flctl.c
> @@ -44,11 +44,17 @@ static struct nand_ecclayout flctl_4secc_oob_16 = {
>  };
> 
>  static struct nand_ecclayout flctl_4secc_oob_64 = {
> -	.eccbytes = 10,
> -	.eccpos = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
> -	.oobfree = {
> -		{.offset = 60,
> -		. length = 4} },
> +	.eccbytes = 4 * 10,
> +		.eccpos = {
> +			 6,  7, 8,  9, 10, 11, 12, 13, 14, 15,
> +			22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
> +			38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
> +			54, 55, 56, 57, 58, 59, 60, 61, 62, 63 },

Indentation mistake ?

> +		.oobfree = {
> +			{.offset = 2, .length = 4},
> +			{.offset = 16, .length = 6},
> +			{.offset = 32, .length = 6},
> +			{.offset = 48, .length = 6} },

Just for my information, where does that information come from ?

>  };
> 
>  static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
> @@ -62,7 +68,7 @@ static struct nand_bbt_descr flctl_4secc_smallpage = {
> 
>  static struct nand_bbt_descr flctl_4secc_largepage = {
>  	.options = NAND_BBT_SCAN2NDPAGE,
> -	.offs = 58,
> +	.offs = 0,
>  	.len = 2,
>  	.pattern = scan_ff_pattern,
>  };
> @@ -831,7 +837,7 @@ static int flctl_chip_init_tail(struct mtd_info *mtd)
>  		chip->ecc.mode = NAND_ECC_HW;
> 
>  		/* 4 symbols ECC enabled */
> -		flctl->flcmncr_base |= _4ECCEN | ECCPOS2 | ECCPOS_02;
> +		flctl->flcmncr_base |= _4ECCEN;
>  	} else {
>  		chip->ecc.mode = NAND_ECC_SOFT;
>  	}
> diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
> index 6832a90..91c5b01 100644
> --- a/include/linux/mtd/sh_flctl.h
> +++ b/include/linux/mtd/sh_flctl.h
> @@ -49,7 +49,6 @@
>  #define	FLERRADR(f)		(f->reg + 0x98)
> 
>  /* FLCMNCR control bits */
> -#define ECCPOS2		(0x1 << 25)
>  #define _4ECCCNTEN	(0x1 << 24)
>  #define _4ECCEN		(0x1 << 23)
>  #define _4ECCCORRECT	(0x1 << 22)
> @@ -59,9 +58,6 @@
>  #define QTSEL_E		(0x1 << 17)
>  #define ENDIAN		(0x1 << 16)	/* 1 = little endian */
>  #define FCKSEL_E	(0x1 << 15)
> -#define ECCPOS_00	(0x00 << 12)
> -#define ECCPOS_01	(0x01 << 12)
> -#define ECCPOS_02	(0x02 << 12)
>  #define ACM_SACCES_MODE	(0x01 << 10)
>  #define NANWF_E		(0x1 << 9)
>  #define SE_D		(0x1 << 8)	/* Spare area disable */
Bastian Hecht - April 23, 2012, 8:51 a.m.
Hello Laurent,

2012/4/21 Laurent Pinchart <laurent.pinchart@ideasonboard.com>:
> Hi Bastian,
>
> Thanks for the patch.
>
> On Friday 20 April 2012 11:13:44 Bastian Hecht wrote:
>> The flctl hardware has changed and a new OOB layout must be adapted for
>> 2k page size NAND chips when using hardware ECC.
>> The related bit fields ECCPOS[0-2] are gone - the bits are marked as
>> reserved now in the datasheet. As there are no official users of the
>> hardware ECC so far, they are completely removed.
>>
>> Signed-off-by: Bastian Hecht <hechtb@gmail.com>
>> ---
>>  drivers/mtd/nand/sh_flctl.c  |   20 +++++++++++++-------
>>  include/linux/mtd/sh_flctl.h |    4 ----
>>  2 files changed, 13 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
>> index 3c27921..411d783 100644
>> --- a/drivers/mtd/nand/sh_flctl.c
>> +++ b/drivers/mtd/nand/sh_flctl.c
>> @@ -44,11 +44,17 @@ static struct nand_ecclayout flctl_4secc_oob_16 = {
>>  };
>>
>>  static struct nand_ecclayout flctl_4secc_oob_64 = {
>> -     .eccbytes = 10,
>> -     .eccpos = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
>> -     .oobfree = {
>> -             {.offset = 60,
>> -             . length = 4} },
>> +     .eccbytes = 4 * 10,
>> +             .eccpos = {
>> +                      6,  7, 8,  9, 10, 11, 12, 13, 14, 15,
>> +                     22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
>> +                     38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
>> +                     54, 55, 56, 57, 58, 59, 60, 61, 62, 63 },
>
> Indentation mistake ?

Yes, thanks for noticing.

>> +             .oobfree = {
>> +                     {.offset = 2, .length = 4},
>> +                     {.offset = 16, .length = 6},
>> +                     {.offset = 32, .length = 6},
>> +                     {.offset = 48, .length = 6} },
>
> Just for my information, where does that information come from ?

The first 2 bytes are used for bad block marking at the 1st page of
every erase block. This seems to be the default for all NAND chips
when they are marked by the manufacturer. The last 10 bytes are used
for ECC in each 16-bytes ECC hunk - I don't remember if I got this
info from the datasheet or by inspecting the page writes. BTW a page
is layed out this way: 512 bytes data / 16 bytes oob / 512 bytes data
/ 16 bytes oob / 512 bytes data / 16 bytes oob / 512 bytes data / 16
bytes oob. This leads to the code above.

Best regards,

 Bastian Hecht


>>  };
>>
>>  static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
>> @@ -62,7 +68,7 @@ static struct nand_bbt_descr flctl_4secc_smallpage = {
>>
>>  static struct nand_bbt_descr flctl_4secc_largepage = {
>>       .options = NAND_BBT_SCAN2NDPAGE,
>> -     .offs = 58,
>> +     .offs = 0,
>>       .len = 2,
>>       .pattern = scan_ff_pattern,
>>  };
>> @@ -831,7 +837,7 @@ static int flctl_chip_init_tail(struct mtd_info *mtd)
>>               chip->ecc.mode = NAND_ECC_HW;
>>
>>               /* 4 symbols ECC enabled */
>> -             flctl->flcmncr_base |= _4ECCEN | ECCPOS2 | ECCPOS_02;
>> +             flctl->flcmncr_base |= _4ECCEN;
>>       } else {
>>               chip->ecc.mode = NAND_ECC_SOFT;
>>       }
>> diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
>> index 6832a90..91c5b01 100644
>> --- a/include/linux/mtd/sh_flctl.h
>> +++ b/include/linux/mtd/sh_flctl.h
>> @@ -49,7 +49,6 @@
>>  #define      FLERRADR(f)             (f->reg + 0x98)
>>
>>  /* FLCMNCR control bits */
>> -#define ECCPOS2              (0x1 << 25)
>>  #define _4ECCCNTEN   (0x1 << 24)
>>  #define _4ECCEN              (0x1 << 23)
>>  #define _4ECCCORRECT (0x1 << 22)
>> @@ -59,9 +58,6 @@
>>  #define QTSEL_E              (0x1 << 17)
>>  #define ENDIAN               (0x1 << 16)     /* 1 = little endian */
>>  #define FCKSEL_E     (0x1 << 15)
>> -#define ECCPOS_00    (0x00 << 12)
>> -#define ECCPOS_01    (0x01 << 12)
>> -#define ECCPOS_02    (0x02 << 12)
>>  #define ACM_SACCES_MODE      (0x01 << 10)
>>  #define NANWF_E              (0x1 << 9)
>>  #define SE_D         (0x1 << 8)      /* Spare area disable */
> --
> Regards,
>
> Laurent Pinchart
>

Patch

diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 3c27921..411d783 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -44,11 +44,17 @@  static struct nand_ecclayout flctl_4secc_oob_16 = {
 };
 
 static struct nand_ecclayout flctl_4secc_oob_64 = {
-	.eccbytes = 10,
-	.eccpos = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
-	.oobfree = {
-		{.offset = 60,
-		. length = 4} },
+	.eccbytes = 4 * 10,
+		.eccpos = {
+			 6,  7, 8,  9, 10, 11, 12, 13, 14, 15,
+			22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+			38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+			54, 55, 56, 57, 58, 59, 60, 61, 62, 63 },
+		.oobfree = {
+			{.offset = 2, .length = 4},
+			{.offset = 16, .length = 6},
+			{.offset = 32, .length = 6},
+			{.offset = 48, .length = 6} },
 };
 
 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
@@ -62,7 +68,7 @@  static struct nand_bbt_descr flctl_4secc_smallpage = {
 
 static struct nand_bbt_descr flctl_4secc_largepage = {
 	.options = NAND_BBT_SCAN2NDPAGE,
-	.offs = 58,
+	.offs = 0,
 	.len = 2,
 	.pattern = scan_ff_pattern,
 };
@@ -831,7 +837,7 @@  static int flctl_chip_init_tail(struct mtd_info *mtd)
 		chip->ecc.mode = NAND_ECC_HW;
 
 		/* 4 symbols ECC enabled */
-		flctl->flcmncr_base |= _4ECCEN | ECCPOS2 | ECCPOS_02;
+		flctl->flcmncr_base |= _4ECCEN;
 	} else {
 		chip->ecc.mode = NAND_ECC_SOFT;
 	}
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
index 6832a90..91c5b01 100644
--- a/include/linux/mtd/sh_flctl.h
+++ b/include/linux/mtd/sh_flctl.h
@@ -49,7 +49,6 @@ 
 #define	FLERRADR(f)		(f->reg + 0x98)
 
 /* FLCMNCR control bits */
-#define ECCPOS2		(0x1 << 25)
 #define _4ECCCNTEN	(0x1 << 24)
 #define _4ECCEN		(0x1 << 23)
 #define _4ECCCORRECT	(0x1 << 22)
@@ -59,9 +58,6 @@ 
 #define QTSEL_E		(0x1 << 17)
 #define ENDIAN		(0x1 << 16)	/* 1 = little endian */
 #define FCKSEL_E	(0x1 << 15)
-#define ECCPOS_00	(0x00 << 12)
-#define ECCPOS_01	(0x01 << 12)
-#define ECCPOS_02	(0x02 << 12)
 #define ACM_SACCES_MODE	(0x01 << 10)
 #define NANWF_E		(0x1 << 9)
 #define SE_D		(0x1 << 8)	/* Spare area disable */