Re: [PATCH v7 6/8] spi: spi-qpic: add driver for QCOM SPI NAND flash Interface

From: kernel test robot
Date: Wed Jul 24 2024 - 19:46:13 EST


Hi Md,

kernel test robot noticed the following build errors:

[auto build test ERROR on mtd/nand/next]
[also build test ERROR on broonie-spi/for-next robh/for-next linus/master v6.10 next-20240724]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Md-Sadre-Alam/spi-dt-bindings-Introduce-qcom-spi-qpic-snand/20240724-195819
base: https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next
patch link: https://lore.kernel.org/r/20240724114225.2176448-7-quic_mdalam%40quicinc.com
patch subject: [PATCH v7 6/8] spi: spi-qpic: add driver for QCOM SPI NAND flash Interface
config: xtensa-allyesconfig (https://download.01.org/0day-ci/archive/20240725/202407250710.knYmJebL-lkp@xxxxxxxxx/config)
compiler: xtensa-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240725/202407250710.knYmJebL-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202407250710.knYmJebL-lkp@xxxxxxxxx/

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

drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_init':
>> drivers/spi/spi-qpic-snand.c:174:25: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
174 | snand_cfg_val = FIELD_PREP(CLK_CNTR_INIT_VAL_VEC_MASK, CLK_CNTR_INIT_VAL_VEC) |
| ^~~~~~~~~~
drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_ecc_init_ctx_pipelined':
>> drivers/spi/spi-qpic-snand.c:247:42: warning: variable 'steps' set but not used [-Wunused-but-set-variable]
247 | int step_size = 0, strength = 0, steps;
| ^~~~~
drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_write_page':
drivers/spi/spi-qpic-snand.c:1261:30: warning: variable 's_op' set but not used [-Wunused-but-set-variable]
1261 | struct qpic_snand_op s_op = {};
| ^~~~
drivers/spi/spi-qpic-snand.c: At top level:
drivers/spi/spi-qpic-snand.c:1632:19: error: initialization of 'int (*)(struct platform_device *)' from incompatible pointer type 'void (*)(struct platform_device *)' [-Wincompatible-pointer-types]
1632 | .remove = qcom_spi_remove,
| ^~~~~~~~~~~~~~~
drivers/spi/spi-qpic-snand.c:1632:19: note: (near initialization for 'qcom_spi_driver.remove')


vim +/FIELD_PREP +174 drivers/spi/spi-qpic-snand.c

168
169 static int qcom_spi_init(struct qcom_nand_controller *snandc)
170 {
171 u32 snand_cfg_val = 0x0;
172 int ret;
173
> 174 snand_cfg_val = FIELD_PREP(CLK_CNTR_INIT_VAL_VEC_MASK, CLK_CNTR_INIT_VAL_VEC) |
175 FIELD_PREP(LOAD_CLK_CNTR_INIT_EN, 0) |
176 FIELD_PREP(FEA_STATUS_DEV_ADDR_MASK, FEA_STATUS_DEV_ADDR) |
177 FIELD_PREP(SPI_CFG, 0);
178
179 snandc->regs->spi_cfg = snand_cfg_val;
180 snandc->regs->num_addr_cycle = SPI_NUM_ADDR;
181 snandc->regs->busy_wait_cnt = SPI_WAIT_CNT;
182
183 qcom_write_reg_dma(snandc, &snandc->regs->spi_cfg, NAND_FLASH_SPI_CFG, 1, 0);
184
185 snand_cfg_val &= ~LOAD_CLK_CNTR_INIT_EN;
186 snandc->regs->spi_cfg = snand_cfg_val;
187
188 qcom_write_reg_dma(snandc, &snandc->regs->spi_cfg, NAND_FLASH_SPI_CFG, 1, 0);
189
190 qcom_write_reg_dma(snandc, &snandc->regs->num_addr_cycle, NAND_NUM_ADDR_CYCLES, 1, 0);
191 qcom_write_reg_dma(snandc, &snandc->regs->busy_wait_cnt, NAND_BUSY_CHECK_WAIT_CNT, 1,
192 NAND_BAM_NEXT_SGL);
193
194 ret = qcom_submit_descs(snandc);
195 if (ret) {
196 dev_err(snandc->dev, "failure in submitting spi init descriptor\n");
197 return ret;
198 }
199
200 return ret;
201 }
202
203 static int qcom_spi_ooblayout_ecc(struct mtd_info *mtd, int section,
204 struct mtd_oob_region *oobregion)
205 {
206 struct nand_device *nand = mtd_to_nanddev(mtd);
207 struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
208 struct qpic_ecc *qecc = snandc->qspi->ecc;
209
210 if (section > 1)
211 return -ERANGE;
212
213 oobregion->length = qecc->ecc_bytes_hw + qecc->spare_bytes;
214 oobregion->offset = mtd->oobsize - oobregion->length;
215
216 return 0;
217 }
218
219 static int qcom_spi_ooblayout_free(struct mtd_info *mtd, int section,
220 struct mtd_oob_region *oobregion)
221 {
222 struct nand_device *nand = mtd_to_nanddev(mtd);
223 struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
224 struct qpic_ecc *qecc = snandc->qspi->ecc;
225
226 if (section)
227 return -ERANGE;
228
229 oobregion->length = qecc->steps * 4;
230 oobregion->offset = ((qecc->steps - 1) * qecc->bytes) + qecc->bbm_size;
231
232 return 0;
233 }
234
235 static const struct mtd_ooblayout_ops qcom_spi_ooblayout = {
236 .ecc = qcom_spi_ooblayout_ecc,
237 .free = qcom_spi_ooblayout_free,
238 };
239
240 static int qcom_spi_ecc_init_ctx_pipelined(struct nand_device *nand)
241 {
242 struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
243 struct nand_ecc_props *conf = &nand->ecc.ctx.conf;
244 struct nand_ecc_props *reqs = &nand->ecc.requirements;
245 struct nand_ecc_props *user = &nand->ecc.user_conf;
246 struct mtd_info *mtd = nanddev_to_mtd(nand);
> 247 int step_size = 0, strength = 0, steps;
248 int cwperpage, bad_block_byte;
249 struct qpic_ecc *ecc_cfg;
250
251 cwperpage = mtd->writesize / NANDC_STEP_SIZE;
252 snandc->qspi->num_cw = cwperpage;
253
254 ecc_cfg = kzalloc(sizeof(*ecc_cfg), GFP_KERNEL);
255 if (!ecc_cfg)
256 return -ENOMEM;
257 snandc->qspi->oob_buf = kzalloc(mtd->writesize + mtd->oobsize,
258 GFP_KERNEL);
259 if (!snandc->qspi->oob_buf)
260 return -ENOMEM;
261
262 memset(snandc->qspi->oob_buf, 0xff, mtd->writesize + mtd->oobsize);
263
264 nand->ecc.ctx.priv = ecc_cfg;
265 snandc->qspi->mtd = mtd;
266
267 if (user->step_size && user->strength) {
268 step_size = user->step_size;
269 strength = user->strength;
270 } else if (reqs->step_size && reqs->strength) {
271 step_size = reqs->step_size;
272 strength = reqs->strength;
273 }
274
275 if (step_size && strength)
276 steps = mtd->writesize / step_size;
277
278 ecc_cfg->ecc_bytes_hw = 7;
279 ecc_cfg->spare_bytes = 4;
280 ecc_cfg->bbm_size = 1;
281 ecc_cfg->bch_enabled = true;
282 ecc_cfg->bytes = ecc_cfg->ecc_bytes_hw + ecc_cfg->spare_bytes + ecc_cfg->bbm_size;
283
284 ecc_cfg->steps = 4;
285 ecc_cfg->strength = 4;
286 ecc_cfg->step_size = 512;
287 ecc_cfg->cw_data = 516;
288 ecc_cfg->cw_size = ecc_cfg->cw_data + ecc_cfg->bytes;
289 bad_block_byte = mtd->writesize - ecc_cfg->cw_size * (cwperpage - 1) + 1;
290
291 mtd_set_ooblayout(mtd, &qcom_spi_ooblayout);
292
293 ecc_cfg->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
294 FIELD_PREP(UD_SIZE_BYTES_MASK, ecc_cfg->cw_data) |
295 FIELD_PREP(DISABLE_STATUS_AFTER_WRITE, 1) |
296 FIELD_PREP(NUM_ADDR_CYCLES_MASK, 3) |
297 FIELD_PREP(ECC_PARITY_SIZE_BYTES_RS, ecc_cfg->ecc_bytes_hw) |
298 FIELD_PREP(STATUS_BFR_READ, 0) |
299 FIELD_PREP(SET_RD_MODE_AFTER_STATUS, 1) |
300 FIELD_PREP(SPARE_SIZE_BYTES_MASK, ecc_cfg->spare_bytes);
301
302 ecc_cfg->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 0) |
303 FIELD_PREP(CS_ACTIVE_BSY, 0) |
304 FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, bad_block_byte) |
305 FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 0) |
306 FIELD_PREP(WR_RD_BSY_GAP_MASK, 20) |
307 FIELD_PREP(WIDE_FLASH, 0) |
308 FIELD_PREP(ENABLE_BCH_ECC, ecc_cfg->bch_enabled);
309
310 ecc_cfg->cfg0_raw = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
311 FIELD_PREP(NUM_ADDR_CYCLES_MASK, 3) |
312 FIELD_PREP(UD_SIZE_BYTES_MASK, ecc_cfg->cw_size) |
313 FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
314
315 ecc_cfg->cfg1_raw = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 0) |
316 FIELD_PREP(CS_ACTIVE_BSY, 0) |
317 FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
318 FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
319 FIELD_PREP(WR_RD_BSY_GAP_MASK, 20) |
320 FIELD_PREP(WIDE_FLASH, 0) |
321 FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
322
323 ecc_cfg->ecc_bch_cfg = FIELD_PREP(ECC_CFG_ECC_DISABLE, !ecc_cfg->bch_enabled) |
324 FIELD_PREP(ECC_SW_RESET, 0) |
325 FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, ecc_cfg->cw_data) |
326 FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
327 FIELD_PREP(ECC_MODE_MASK, 0) |
328 FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, ecc_cfg->ecc_bytes_hw);
329
330 ecc_cfg->ecc_buf_cfg = 0x203 << NUM_STEPS;
331 ecc_cfg->clrflashstatus = FS_READY_BSY_N;
332 ecc_cfg->clrreadstatus = 0xc0;
333
334 conf->step_size = ecc_cfg->step_size;
335 conf->strength = ecc_cfg->strength;
336
337 snandc->regs->erased_cw_detect_cfg_clr = cpu_to_le32(CLR_ERASED_PAGE_DET);
338 snandc->regs->erased_cw_detect_cfg_set = cpu_to_le32(SET_ERASED_PAGE_DET);
339
340 dev_dbg(snandc->dev, "ECC strength: %u bits per %u bytes\n",
341 ecc_cfg->strength, ecc_cfg->step_size);
342
343 return 0;
344 }
345

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki