tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: bfe91da29bfad9941d5d703d45e29f0812a20724 commit: a5460b5e5fb82656807840d40d3deaecad094044 READ_ONCE: Simplify implementations of {READ,WRITE}_ONCE() date: 3 months ago config: i386-randconfig-s002-20200707 (attached as .config) compiler: gcc-9 (Debian 9.3.0-14) 9.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.2-31-gabbfd661-dirty git checkout a5460b5e5fb82656807840d40d3deaecad094044 # save the attached .config to linux build tree make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot sparse warnings: (new ones prefixed by >>) >> drivers/dma/mediatek/mtk-hsdma.c:451:17: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 volatile @@ got unsigned int [usertype] src @@ drivers/dma/mediatek/mtk-hsdma.c:451:17: sparse: expected restricted __le32 volatile >> drivers/dma/mediatek/mtk-hsdma.c:451:17: sparse: got unsigned int [usertype] src drivers/dma/mediatek/mtk-hsdma.c:452:17: sparse: sparse: restricted __le32 degrades to integer drivers/dma/mediatek/mtk-hsdma.c:452:17: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 volatile @@ got unsigned int @@ drivers/dma/mediatek/mtk-hsdma.c:452:17: sparse: expected restricted __le32 volatile drivers/dma/mediatek/mtk-hsdma.c:452:17: sparse: got unsigned int >> drivers/dma/mediatek/mtk-hsdma.c:456:17: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 volatile @@ got unsigned int [usertype] dest @@ drivers/dma/mediatek/mtk-hsdma.c:456:17: sparse: expected restricted __le32 volatile >> drivers/dma/mediatek/mtk-hsdma.c:456:17: sparse: got unsigned int [usertype] dest drivers/dma/mediatek/mtk-hsdma.c:457:17: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 volatile @@ got int @@ drivers/dma/mediatek/mtk-hsdma.c:457:17: sparse: expected restricted __le32 volatile drivers/dma/mediatek/mtk-hsdma.c:457:17: sparse: got int drivers/dma/mediatek/mtk-hsdma.c:580:33: sparse: sparse: restricted __le32 degrades to integer drivers/dma/mediatek/mtk-hsdma.c:604:26: sparse: sparse: Using plain integer as NULL pointer drivers/dma/mediatek/mtk-hsdma.c:878:18: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le32 [usertype] ddone @@ got unsigned long @@ drivers/dma/mediatek/mtk-hsdma.c:878:18: sparse: expected restricted __le32 [usertype] ddone drivers/dma/mediatek/mtk-hsdma.c:878:18: sparse: got unsigned long drivers/dma/mediatek/mtk-hsdma.c:879:16: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le32 [usertype] ls0 @@ got unsigned long @@ drivers/dma/mediatek/mtk-hsdma.c:879:16: sparse: expected restricted __le32 [usertype] ls0 drivers/dma/mediatek/mtk-hsdma.c:879:16: sparse: got unsigned long drivers/dma/mediatek/mtk-hsdma.c:883:18: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le32 [usertype] ddone @@ got unsigned long @@ drivers/dma/mediatek/mtk-hsdma.c:883:18: sparse: expected restricted __le32 [usertype] ddone drivers/dma/mediatek/mtk-hsdma.c:883:18: sparse: got unsigned long drivers/dma/mediatek/mtk-hsdma.c:884:16: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le32 [usertype] ls0 @@ got unsigned long @@ drivers/dma/mediatek/mtk-hsdma.c:884:16: sparse: expected restricted __le32 [usertype] ls0 drivers/dma/mediatek/mtk-hsdma.c:884:16: sparse: got unsigned long vim +451 drivers/dma/mediatek/mtk-hsdma.c 548c4597e984b7 Sean Wang 2018-03-15 411 548c4597e984b7 Sean Wang 2018-03-15 412 static int mtk_hsdma_issue_pending_vdesc(struct mtk_hsdma_device *hsdma, 548c4597e984b7 Sean Wang 2018-03-15 413 struct mtk_hsdma_pchan *pc, 548c4597e984b7 Sean Wang 2018-03-15 414 struct mtk_hsdma_vdesc *hvd) 548c4597e984b7 Sean Wang 2018-03-15 415 { 548c4597e984b7 Sean Wang 2018-03-15 416 struct mtk_hsdma_ring *ring = &pc->ring; 548c4597e984b7 Sean Wang 2018-03-15 417 struct mtk_hsdma_pdesc *txd, *rxd; 548c4597e984b7 Sean Wang 2018-03-15 418 u16 reserved, prev, tlen, num_sgs; 548c4597e984b7 Sean Wang 2018-03-15 419 unsigned long flags; 548c4597e984b7 Sean Wang 2018-03-15 420 548c4597e984b7 Sean Wang 2018-03-15 421 /* Protect against PC is accessed by multiple VCs simultaneously */ 548c4597e984b7 Sean Wang 2018-03-15 422 spin_lock_irqsave(&hsdma->lock, flags); 548c4597e984b7 Sean Wang 2018-03-15 423 548c4597e984b7 Sean Wang 2018-03-15 424 /* 548c4597e984b7 Sean Wang 2018-03-15 425 * Reserve rooms, where pc->nr_free is used to track how many free 548c4597e984b7 Sean Wang 2018-03-15 426 * rooms in the ring being updated in user and IRQ context. 548c4597e984b7 Sean Wang 2018-03-15 427 */ 548c4597e984b7 Sean Wang 2018-03-15 428 num_sgs = DIV_ROUND_UP(hvd->len, MTK_HSDMA_MAX_LEN); 548c4597e984b7 Sean Wang 2018-03-15 429 reserved = min_t(u16, num_sgs, atomic_read(&pc->nr_free)); 548c4597e984b7 Sean Wang 2018-03-15 430 548c4597e984b7 Sean Wang 2018-03-15 431 if (!reserved) { 548c4597e984b7 Sean Wang 2018-03-15 432 spin_unlock_irqrestore(&hsdma->lock, flags); 548c4597e984b7 Sean Wang 2018-03-15 433 return -ENOSPC; 548c4597e984b7 Sean Wang 2018-03-15 434 } 548c4597e984b7 Sean Wang 2018-03-15 435 548c4597e984b7 Sean Wang 2018-03-15 436 atomic_sub(reserved, &pc->nr_free); 548c4597e984b7 Sean Wang 2018-03-15 437 548c4597e984b7 Sean Wang 2018-03-15 438 while (reserved--) { 548c4597e984b7 Sean Wang 2018-03-15 439 /* Limit size by PD capability for valid data moving */ 548c4597e984b7 Sean Wang 2018-03-15 440 tlen = (hvd->len > MTK_HSDMA_MAX_LEN) ? 548c4597e984b7 Sean Wang 2018-03-15 441 MTK_HSDMA_MAX_LEN : hvd->len; 548c4597e984b7 Sean Wang 2018-03-15 442 548c4597e984b7 Sean Wang 2018-03-15 443 /* 548c4597e984b7 Sean Wang 2018-03-15 444 * Setup PDs using the remaining VD info mapped on those 548c4597e984b7 Sean Wang 2018-03-15 445 * reserved rooms. And since RXD is shared memory between the 548c4597e984b7 Sean Wang 2018-03-15 446 * host and the device allocated by dma_alloc_coherent call, 548c4597e984b7 Sean Wang 2018-03-15 447 * the helper macro WRITE_ONCE can ensure the data written to 548c4597e984b7 Sean Wang 2018-03-15 448 * RAM would really happens. 548c4597e984b7 Sean Wang 2018-03-15 449 */ 548c4597e984b7 Sean Wang 2018-03-15 450 txd = &ring->txd[ring->cur_tptr]; 548c4597e984b7 Sean Wang 2018-03-15 @451 WRITE_ONCE(txd->desc1, hvd->src); 548c4597e984b7 Sean Wang 2018-03-15 452 WRITE_ONCE(txd->desc2, 548c4597e984b7 Sean Wang 2018-03-15 453 hsdma->soc->ls0 | MTK_HSDMA_DESC_PLEN(tlen)); 548c4597e984b7 Sean Wang 2018-03-15 454 548c4597e984b7 Sean Wang 2018-03-15 455 rxd = &ring->rxd[ring->cur_tptr]; 548c4597e984b7 Sean Wang 2018-03-15 @456 WRITE_ONCE(rxd->desc1, hvd->dest); 548c4597e984b7 Sean Wang 2018-03-15 457 WRITE_ONCE(rxd->desc2, MTK_HSDMA_DESC_PLEN(tlen)); 548c4597e984b7 Sean Wang 2018-03-15 458 548c4597e984b7 Sean Wang 2018-03-15 459 /* Associate VD, the PD belonged to */ 548c4597e984b7 Sean Wang 2018-03-15 460 ring->cb[ring->cur_tptr].vd = &hvd->vd; 548c4597e984b7 Sean Wang 2018-03-15 461 548c4597e984b7 Sean Wang 2018-03-15 462 /* Move forward the pointer of TX ring */ 548c4597e984b7 Sean Wang 2018-03-15 463 ring->cur_tptr = MTK_HSDMA_NEXT_DESP_IDX(ring->cur_tptr, 548c4597e984b7 Sean Wang 2018-03-15 464 MTK_DMA_SIZE); 548c4597e984b7 Sean Wang 2018-03-15 465 548c4597e984b7 Sean Wang 2018-03-15 466 /* Update VD with remaining data */ 548c4597e984b7 Sean Wang 2018-03-15 467 hvd->src += tlen; 548c4597e984b7 Sean Wang 2018-03-15 468 hvd->dest += tlen; 548c4597e984b7 Sean Wang 2018-03-15 469 hvd->len -= tlen; 548c4597e984b7 Sean Wang 2018-03-15 470 } 548c4597e984b7 Sean Wang 2018-03-15 471 548c4597e984b7 Sean Wang 2018-03-15 472 /* 548c4597e984b7 Sean Wang 2018-03-15 473 * Tagging flag for the last PD for VD will be responsible for 548c4597e984b7 Sean Wang 2018-03-15 474 * completing VD. 548c4597e984b7 Sean Wang 2018-03-15 475 */ 548c4597e984b7 Sean Wang 2018-03-15 476 if (!hvd->len) { 548c4597e984b7 Sean Wang 2018-03-15 477 prev = MTK_HSDMA_LAST_DESP_IDX(ring->cur_tptr, MTK_DMA_SIZE); 548c4597e984b7 Sean Wang 2018-03-15 478 ring->cb[prev].flag = MTK_HSDMA_VDESC_FINISHED; 548c4597e984b7 Sean Wang 2018-03-15 479 } 548c4597e984b7 Sean Wang 2018-03-15 480 548c4597e984b7 Sean Wang 2018-03-15 481 /* Ensure all changes indeed done before we're going on */ 548c4597e984b7 Sean Wang 2018-03-15 482 wmb(); 548c4597e984b7 Sean Wang 2018-03-15 483 548c4597e984b7 Sean Wang 2018-03-15 484 /* 548c4597e984b7 Sean Wang 2018-03-15 485 * Updating into hardware the pointer of TX ring lets HSDMA to take 548c4597e984b7 Sean Wang 2018-03-15 486 * action for those pending PDs. 548c4597e984b7 Sean Wang 2018-03-15 487 */ 548c4597e984b7 Sean Wang 2018-03-15 488 mtk_dma_write(hsdma, MTK_HSDMA_TX_CPU, ring->cur_tptr); 548c4597e984b7 Sean Wang 2018-03-15 489 548c4597e984b7 Sean Wang 2018-03-15 490 spin_unlock_irqrestore(&hsdma->lock, flags); 548c4597e984b7 Sean Wang 2018-03-15 491 548c4597e984b7 Sean Wang 2018-03-15 492 return 0; 548c4597e984b7 Sean Wang 2018-03-15 493 } 548c4597e984b7 Sean Wang 2018-03-15 494 :::::: The code at line 451 was first introduced by commit :::::: 548c4597e984b79aad8190235d664f1c3a433f94 dmaengine: mediatek: Add MediaTek High-Speed DMA controller for MT7622 and MT7623 SoC :::::: TO: Sean Wang :::::: CC: Vinod Koul --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org