Re: [PATCH v8] mtd: sharpslpart: Add sharpslpart partition parser
From: kbuild test robot
Date: Thu Aug 31 2017 - 08:51:36 EST
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
Attachment:
.config.gz
Description: application/gzip