[PATCH v8] mtd: sharpslpart: Add sharpslpart partition parser

kbuild test robot lkp at intel.com
Thu Aug 31 05:50:38 PDT 2017


Hi Andrea,

[auto build test ERROR on mtd/master]
[also build test ERROR on v4.13-rc7 next-20170829]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Andrea-Adami/mtd-sharpslpart-Add-sharpslpart-partition-parser/20170831-190713
base:   git://git.infradead.org/linux-mtd.git master
config: ia64-allyesconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 6.2.0
reproduce:
        wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=ia64 

All error/warnings (new ones prefixed by >>):

   drivers/mtd/parsers/sharpslpart.c: In function 'sharpsl_nand_init_ftl':
>> drivers/mtd/parsers/sharpslpart.c:47:37: error: 'SZ_1M' undeclared (first use in this function)
    #define SHARPSL_FTL_PART_SIZE  (7 * SZ_1M)
                                        ^
>> drivers/mtd/parsers/sharpslpart.c:176:25: note: in expansion of macro 'SHARPSL_FTL_PART_SIZE'
     phymax = mtd_div_by_eb(SHARPSL_FTL_PART_SIZE, mtd);
                            ^~~~~~~~~~~~~~~~~~~~~
   drivers/mtd/parsers/sharpslpart.c:47:37: note: each undeclared identifier is reported only once for each function it appears in
    #define SHARPSL_FTL_PART_SIZE  (7 * SZ_1M)
                                        ^
>> drivers/mtd/parsers/sharpslpart.c:176:25: note: in expansion of macro 'SHARPSL_FTL_PART_SIZE'
     phymax = mtd_div_by_eb(SHARPSL_FTL_PART_SIZE, mtd);
                            ^~~~~~~~~~~~~~~~~~~~~

vim +/SZ_1M +47 drivers/mtd/parsers/sharpslpart.c

    44	
    45	/* factory defaults */
    46	#define SHARPSL_NAND_PARTS		3
  > 47	#define SHARPSL_FTL_PART_SIZE		(7 * SZ_1M)
    48	#define SHARPSL_PARTINFO1_LADDR		0x00060000
    49	#define SHARPSL_PARTINFO2_LADDR		0x00064000
    50	
    51	#define BOOT_MAGIC			0x424f4f54
    52	#define FSRO_MAGIC			0x4653524f
    53	#define FSRW_MAGIC			0x46535257
    54	
    55	/**
    56	 * struct sharpsl_ftl - Sharp FTL Logical Table
    57	 * @logmax:		number of logical blocks
    58	 * @log2phy:		the logical-to-physical table
    59	 *
    60	 * Structure containing the logical-to-physical translation table
    61	 * used by the SHARP SL FTL.
    62	 */
    63	struct sharpsl_ftl {
    64		unsigned int logmax;
    65		unsigned int *log2phy;
    66	};
    67	
    68	/* verify that the OOB bytes 8 to 15 are free and available for the FTL */
    69	static int sharpsl_nand_check_ooblayout(struct mtd_info *mtd)
    70	{
    71		u8 freebytes = 0;
    72		int section = 0;
    73	
    74		while (true) {
    75			struct mtd_oob_region oobfree = { };
    76			int ret, i;
    77	
    78			ret = mtd_ooblayout_free(mtd, section++, &oobfree);
    79			if (ret)
    80				break;
    81	
    82			if (!oobfree.length || oobfree.offset > 15 ||
    83			    (oobfree.offset + oobfree.length) < 8)
    84				continue;
    85	
    86			i = oobfree.offset >= 8 ? oobfree.offset : 8;
    87			for (; i < oobfree.offset + oobfree.length && i < 16; i++)
    88				freebytes |= BIT(i - 8);
    89	
    90			if (freebytes == 0xff)
    91				return 0;
    92		}
    93	
    94		return -ENOTSUPP;
    95	}
    96	
    97	static int sharpsl_nand_read_oob(struct mtd_info *mtd, loff_t offs, u8 *buf)
    98	{
    99		struct mtd_oob_ops ops = { };
   100		int ret;
   101	
   102		ops.mode = MTD_OPS_PLACE_OOB;
   103		ops.ooblen = mtd->oobsize;
   104		ops.oobbuf = buf;
   105	
   106		ret = mtd_read_oob(mtd, offs, &ops);
   107		if (ret != 0 || mtd->oobsize != ops.oobretlen)
   108			return -1;
   109	
   110		return 0;
   111	}
   112	
   113	/*
   114	 * The logical block number assigned to a physical block is stored in the OOB
   115	 * of the first page, in 3 16-bit copies with the following layout:
   116	 *
   117	 * 01234567 89abcdef
   118	 * -------- --------
   119	 * ECC BB   xyxyxy
   120	 *
   121	 * When reading we check that the first two copies agree.
   122	 * In case of error, matching is tried using the following pairs.
   123	 * Reserved values 0xffff mean the block is kept for wear leveling.
   124	 *
   125	 * 01234567 89abcdef
   126	 * -------- --------
   127	 * ECC BB   xyxy    oob[8]==oob[10] && oob[9]==oob[11]   -> byte0=8   byte1=9
   128	 * ECC BB     xyxy  oob[10]==oob[12] && oob[11]==oob[13] -> byte0=10  byte1=11
   129	 * ECC BB   xy  xy  oob[12]==oob[8] && oob[13]==oob[9]   -> byte0=12  byte1=13
   130	 */
   131	static int sharpsl_nand_get_logical_num(u8 *oob)
   132	{
   133		u16 us;
   134		int good0, good1;
   135	
   136		if (oob[NAND_NOOB_LOGADDR_00] == oob[NAND_NOOB_LOGADDR_10] &&
   137		    oob[NAND_NOOB_LOGADDR_01] == oob[NAND_NOOB_LOGADDR_11]) {
   138			good0 = NAND_NOOB_LOGADDR_00;
   139			good1 = NAND_NOOB_LOGADDR_01;
   140		} else if (oob[NAND_NOOB_LOGADDR_10] == oob[NAND_NOOB_LOGADDR_20] &&
   141			   oob[NAND_NOOB_LOGADDR_11] == oob[NAND_NOOB_LOGADDR_21]) {
   142			good0 = NAND_NOOB_LOGADDR_10;
   143			good1 = NAND_NOOB_LOGADDR_11;
   144		} else if (oob[NAND_NOOB_LOGADDR_20] == oob[NAND_NOOB_LOGADDR_00] &&
   145			   oob[NAND_NOOB_LOGADDR_21] == oob[NAND_NOOB_LOGADDR_01]) {
   146			good0 = NAND_NOOB_LOGADDR_20;
   147			good1 = NAND_NOOB_LOGADDR_21;
   148		} else {
   149			return -EINVAL;
   150		}
   151	
   152		us = oob[good0] | oob[good1] << 8;
   153	
   154		/* parity check */
   155		if (hweight16(us) & BLOCK_UNMASK_COMPLEMENT)
   156			return -EINVAL;
   157	
   158		/* reserved */
   159		if (us == BLOCK_IS_RESERVED)
   160			return BLOCK_IS_RESERVED;
   161	
   162		return (us >> 1) & GENMASK(9, 0);
   163	}
   164	
   165	static int sharpsl_nand_init_ftl(struct mtd_info *mtd, struct sharpsl_ftl *ftl)
   166	{
   167		unsigned int block_num, log_num, phymax;
   168		loff_t block_adr;
   169		u8 *oob;
   170		int i, ret;
   171	
   172		oob = kzalloc(mtd->oobsize, GFP_KERNEL);
   173		if (!oob)
   174			return -ENOMEM;
   175	
 > 176		phymax = mtd_div_by_eb(SHARPSL_FTL_PART_SIZE, mtd);
   177	
   178		/* FTL reserves 5% of the blocks + 1 spare  */
   179		ftl->logmax = ((phymax * 95) / 100) - 1;
   180	
   181		ftl->log2phy = kmalloc_array(ftl->logmax, sizeof(*ftl->log2phy),
   182					     GFP_KERNEL);
   183		if (!ftl->log2phy) {
   184			ret = -ENOMEM;
   185			goto exit;
   186		}
   187	
   188		/* initialize ftl->log2phy */
   189		for (i = 0; i < ftl->logmax; i++)
   190			ftl->log2phy[i] = UINT_MAX;
   191	
   192		/* create physical-logical table */
   193		for (block_num = 0; block_num < phymax; block_num++) {
   194			block_adr = block_num * mtd->erasesize;
   195	
   196			if (mtd_block_isbad(mtd, block_adr))
   197				continue;
   198	
   199			if (sharpsl_nand_read_oob(mtd, block_adr, oob))
   200				continue;
   201	
   202			/* get logical block */
   203			log_num = sharpsl_nand_get_logical_num(oob);
   204	
   205			/* cut-off errors and skip the out-of-range values */
   206			if (log_num > 0 && log_num < ftl->logmax) {
   207				if (ftl->log2phy[log_num] == UINT_MAX)
   208					ftl->log2phy[log_num] = block_num;
   209			}
   210		}
   211	
   212		pr_info("Sharp SL FTL: %d blocks used (%d logical, %d reserved)\n",
   213			phymax, ftl->logmax, phymax - ftl->logmax);
   214	
   215		ret = 0;
   216	exit:
   217		kfree(oob);
   218		return ret;
   219	}
   220	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 51477 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mtd/attachments/20170831/617b83ba/attachment-0001.gz>


More information about the linux-mtd mailing list