Hi Vinod, I love your patch! Perhaps something to improve: [auto build test WARNING on spi/for-next] [also build test WARNING on wsa/i2c/for-next asoc/for-next linus/master v5.13-rc7 next-20210624] [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] url: https://github.com/0day-ci/linux/commits/Vinod-Koul/Add-and-enable-GPI-DMA-users/20210625-132320 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next config: x86_64-randconfig-a012-20210625 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 9ca0171a9ffdef5fdb1511d197a3fd72490362de) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # https://github.com/0day-ci/linux/commit/3632ac4a40c3ef7f86f081d462bf17b45e4c0085 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Vinod-Koul/Add-and-enable-GPI-DMA-users/20210625-132320 git checkout 3632ac4a40c3ef7f86f081d462bf17b45e4c0085 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): >> drivers/spi/spi-geni-qcom.c:496:44: warning: variable 'i' is uninitialized when used here [-Wuninitialized] dev_err(mas->dev, "Tx[%d] timeout%lu\n", i, timeout); ^ include/linux/dev_printk.h:112:32: note: expanded from macro 'dev_err' _dev_err(dev, dev_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~~~~ drivers/spi/spi-geni-qcom.c:407:12: note: initialize the variable 'i' to silence this warning int ret, i; ^ = 0 >> drivers/spi/spi-geni-qcom.c:579:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (IS_ERR_OR_NULL(mas->gsi)) ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/spi/spi-geni-qcom.c:590:9: note: uninitialized use occurs here return ret; ^~~ drivers/spi/spi-geni-qcom.c:579:2: note: remove the 'if' if its condition is always false if (IS_ERR_OR_NULL(mas->gsi)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/spi/spi-geni-qcom.c:562:9: note: initialize the variable 'ret' to silence this warning int ret; ^ = 0 2 warnings generated. vim +/i +496 drivers/spi/spi-geni-qcom.c 398 399 static int setup_gsi_xfer(struct spi_transfer *xfer, struct spi_geni_master *mas, 400 struct spi_device *spi_slv, struct spi_master *spi) 401 { 402 unsigned long flags = DMA_PREP_INTERRUPT | DMA_CTRL_ACK; 403 struct spi_geni_gsi *gsi; 404 struct dma_slave_config config = {}; 405 struct gpi_spi_config peripheral = {}; 406 unsigned long timeout, jiffies; 407 int ret, i; 408 409 config.peripheral_config = &peripheral; 410 config.peripheral_size = sizeof(peripheral); 411 peripheral.set_config = true; 412 413 if (xfer->bits_per_word != mas->cur_bits_per_word || 414 xfer->speed_hz != mas->cur_speed_hz) { 415 mas->cur_bits_per_word = xfer->bits_per_word; 416 mas->cur_speed_hz = xfer->speed_hz; 417 } 418 419 if (!(mas->cur_bits_per_word % MIN_WORD_LEN)) { 420 peripheral.rx_len = ((xfer->len << 3) / mas->cur_bits_per_word); 421 } else { 422 int bytes_per_word = (mas->cur_bits_per_word / BITS_PER_BYTE) + 1; 423 424 peripheral.rx_len = (xfer->len / bytes_per_word); 425 } 426 427 if (xfer->tx_buf && xfer->rx_buf) { 428 peripheral.cmd = SPI_DUPLEX; 429 } else if (xfer->tx_buf) { 430 peripheral.cmd = SPI_TX; 431 peripheral.rx_len = 0; 432 } else if (xfer->rx_buf) { 433 peripheral.cmd = SPI_RX; 434 } 435 436 if (spi_slv->mode & SPI_LOOP) 437 peripheral.loopback_en = true; 438 if (spi_slv->mode & SPI_CPOL) 439 peripheral.clock_pol_high = true; 440 if (spi_slv->mode & SPI_CPHA) 441 peripheral.data_pol_high = true; 442 443 peripheral.cs = spi_slv->chip_select; 444 peripheral.pack_en = true; 445 peripheral.word_len = xfer->bits_per_word - MIN_WORD_LEN; 446 peripheral.fragmentation = FRAGMENTATION; 447 448 ret = get_spi_clk_cfg(mas->cur_speed_hz, mas, 449 &peripheral.clk_src, &peripheral.clk_div); 450 if (ret) { 451 dev_err(mas->dev, "Err in get_spi_clk_cfg() :%d\n", ret); 452 return ret; 453 } 454 455 gsi = &mas->gsi[mas->num_xfers]; 456 gsi->rx_cb.mas = mas; 457 gsi->rx_cb.xfer = xfer; 458 459 if (peripheral.cmd & SPI_RX) { 460 dmaengine_slave_config(mas->rx, &config); 461 gsi->rx_desc = dmaengine_prep_slave_sg(mas->rx, xfer->rx_sg.sgl, xfer->rx_sg.nents, 462 DMA_DEV_TO_MEM, flags); 463 if (!gsi->rx_desc) { 464 dev_err(mas->dev, "Err setting up rx desc\n"); 465 return -EIO; 466 } 467 gsi->rx_desc->callback_result = spi_gsi_rx_callback_result; 468 gsi->rx_desc->callback_param = &gsi->rx_cb; 469 } 470 471 dmaengine_slave_config(mas->tx, &config); 472 gsi->tx_desc = dmaengine_prep_slave_sg(mas->tx, xfer->tx_sg.sgl, xfer->tx_sg.nents, 473 DMA_MEM_TO_DEV, flags); 474 if (!gsi->tx_desc) { 475 dev_err(mas->dev, "Err setting up tx desc\n"); 476 return -EIO; 477 } 478 479 gsi->tx_cb.mas = mas; 480 gsi->tx_cb.xfer = xfer; 481 gsi->tx_desc->callback_result = spi_gsi_tx_callback_result; 482 gsi->tx_desc->callback_param = &gsi->tx_cb; 483 484 if (peripheral.cmd & SPI_RX) 485 gsi->rx_cookie = dmaengine_submit(gsi->rx_desc); 486 gsi->tx_cookie = dmaengine_submit(gsi->tx_desc); 487 488 if (peripheral.cmd & SPI_RX) 489 dma_async_issue_pending(mas->rx); 490 dma_async_issue_pending(mas->tx); 491 mas->num_xfers++; 492 493 jiffies = msecs_to_jiffies(SPI_XFER_TIMEOUT_MS); 494 timeout = wait_for_completion_timeout(&mas->tx_cb, jiffies); 495 if (timeout <= 0) { > 496 dev_err(mas->dev, "Tx[%d] timeout%lu\n", i, timeout); 497 ret = -ETIMEDOUT; 498 goto err_gsi_geni_transfer_one; 499 } 500 501 if (peripheral.cmd & SPI_RX) { 502 jiffies = msecs_to_jiffies(SPI_XFER_TIMEOUT_MS); 503 timeout = wait_for_completion_timeout(&mas->rx_cb, jiffies); 504 if (timeout <= 0) { 505 dev_err(mas->dev, "Rx[%d] timeout%lu\n", i, timeout); 506 ret = -ETIMEDOUT; 507 goto err_gsi_geni_transfer_one; 508 } 509 } 510 511 spi_finalize_current_transfer(spi); 512 return 0; 513 514 err_gsi_geni_transfer_one: 515 dmaengine_terminate_all(mas->tx); 516 return ret; 517 } 518 519 static bool geni_can_dma(struct spi_controller *ctlr, 520 struct spi_device *slv, struct spi_transfer *xfer) 521 { 522 struct spi_geni_master *mas = spi_master_get_devdata(slv->master); 523 524 /* check if dma is supported */ 525 if (mas->cur_xfer_mode == GENI_GPI_DMA) 526 return true; 527 528 return false; 529 } 530 531 static int spi_geni_prepare_message(struct spi_master *spi, 532 struct spi_message *spi_msg) 533 { 534 struct spi_geni_master *mas = spi_master_get_devdata(spi); 535 int ret; 536 537 switch (mas->cur_xfer_mode) { 538 case GENI_SE_FIFO: 539 if (spi_geni_is_abort_still_pending(mas)) 540 return -EBUSY; 541 ret = setup_fifo_params(spi_msg->spi, spi); 542 if (ret) 543 dev_err(mas->dev, "Couldn't select mode %d\n", ret); 544 return ret; 545 546 case GENI_GPI_DMA: 547 mas->num_xfers = 0; 548 reinit_completion(&mas->tx_cb); 549 reinit_completion(&mas->rx_cb); 550 memset(mas->gsi, 0, (sizeof(struct spi_geni_gsi) * NUM_SPI_XFER)); 551 552 return 0; 553 } 554 555 dev_err(mas->dev, "Mode not supported %d", mas->cur_xfer_mode); 556 return -EINVAL; 557 } 558 559 static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas) 560 { 561 size_t gsi_sz; 562 int ret; 563 564 mas->tx = dma_request_chan(mas->dev, "tx"); 565 if (IS_ERR_OR_NULL(mas->tx)) { 566 dev_err(mas->dev, "Failed to get tx DMA ch %ld", PTR_ERR(mas->tx)); 567 ret = PTR_ERR(mas->tx); 568 goto err_tx; 569 } 570 mas->rx = dma_request_chan(mas->dev, "rx"); 571 if (IS_ERR_OR_NULL(mas->rx)) { 572 dev_err(mas->dev, "Failed to get rx DMA ch %ld", PTR_ERR(mas->rx)); 573 ret = PTR_ERR(mas->rx); 574 goto err_rx; 575 } 576 577 gsi_sz = sizeof(struct spi_geni_gsi) * NUM_SPI_XFER; 578 mas->gsi = devm_kzalloc(mas->dev, gsi_sz, GFP_KERNEL); > 579 if (IS_ERR_OR_NULL(mas->gsi)) 580 goto err_mem; 581 return 0; 582 583 err_mem: 584 dma_release_channel(mas->rx); 585 err_rx: 586 dma_release_channel(mas->tx); 587 err_tx: 588 mas->tx = NULL; 589 mas->rx = NULL; 590 return ret; 591 } 592 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org