tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: db24726bfefa68c606947a86132591568a06bfb4 commit: d2abc982333c02f9e1ff1c6b3782174f5b7662d7 dmaengine: ti: k3-udma: Initial support for K3 PKTDMA config: arm64-randconfig-m031-20210325 (attached as .config) compiler: aarch64-linux-gcc (GCC) 9.3.0
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <l...@intel.com> Reported-by: Dan Carpenter <dan.carpen...@oracle.com> New smatch warnings: drivers/dma/ti/k3-udma.c:2635 pktdma_alloc_chan_resources() warn: variable dereferenced before check 'uc->rchan' (see line 2556) drivers/dma/ti/k3-udma.c:4769 pktdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() Old smatch warnings: drivers/dma/ti/k3-udma.c:4445 udma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4458 udma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4602 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4617 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4632 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4782 pktdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() vim +2635 drivers/dma/ti/k3-udma.c d2abc982333c02 Peter Ujfalusi 2020-12-08 2508 static int pktdma_alloc_chan_resources(struct dma_chan *chan) d2abc982333c02 Peter Ujfalusi 2020-12-08 2509 { d2abc982333c02 Peter Ujfalusi 2020-12-08 2510 struct udma_chan *uc = to_udma_chan(chan); d2abc982333c02 Peter Ujfalusi 2020-12-08 2511 struct udma_dev *ud = to_udma_dev(chan->device); d2abc982333c02 Peter Ujfalusi 2020-12-08 2512 const struct udma_oes_offsets *oes = &ud->soc_data->oes; d2abc982333c02 Peter Ujfalusi 2020-12-08 2513 u32 irq_ring_idx; d2abc982333c02 Peter Ujfalusi 2020-12-08 2514 int ret; d2abc982333c02 Peter Ujfalusi 2020-12-08 2515 d2abc982333c02 Peter Ujfalusi 2020-12-08 2516 /* d2abc982333c02 Peter Ujfalusi 2020-12-08 2517 * Make sure that the completion is in a known state: d2abc982333c02 Peter Ujfalusi 2020-12-08 2518 * No teardown, the channel is idle d2abc982333c02 Peter Ujfalusi 2020-12-08 2519 */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2520 reinit_completion(&uc->teardown_completed); d2abc982333c02 Peter Ujfalusi 2020-12-08 2521 complete_all(&uc->teardown_completed); d2abc982333c02 Peter Ujfalusi 2020-12-08 2522 uc->state = UDMA_CHAN_IS_IDLE; d2abc982333c02 Peter Ujfalusi 2020-12-08 2523 d2abc982333c02 Peter Ujfalusi 2020-12-08 2524 switch (uc->config.dir) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2525 case DMA_MEM_TO_DEV: d2abc982333c02 Peter Ujfalusi 2020-12-08 2526 /* Slave transfer synchronized - mem to dev (TX) trasnfer */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2527 dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__, d2abc982333c02 Peter Ujfalusi 2020-12-08 2528 uc->id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2529 d2abc982333c02 Peter Ujfalusi 2020-12-08 2530 ret = udma_alloc_tx_resources(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2531 if (ret) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2532 uc->config.remote_thread_id = -1; d2abc982333c02 Peter Ujfalusi 2020-12-08 2533 return ret; d2abc982333c02 Peter Ujfalusi 2020-12-08 2534 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2535 d2abc982333c02 Peter Ujfalusi 2020-12-08 2536 uc->config.src_thread = ud->psil_base + uc->tchan->id; d2abc982333c02 Peter Ujfalusi 2020-12-08 2537 uc->config.dst_thread = uc->config.remote_thread_id; d2abc982333c02 Peter Ujfalusi 2020-12-08 2538 uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET; d2abc982333c02 Peter Ujfalusi 2020-12-08 2539 d2abc982333c02 Peter Ujfalusi 2020-12-08 2540 irq_ring_idx = uc->tchan->tflow_id + oes->pktdma_tchan_flow; d2abc982333c02 Peter Ujfalusi 2020-12-08 2541 d2abc982333c02 Peter Ujfalusi 2020-12-08 2542 ret = pktdma_tisci_tx_channel_config(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2543 break; d2abc982333c02 Peter Ujfalusi 2020-12-08 2544 case DMA_DEV_TO_MEM: d2abc982333c02 Peter Ujfalusi 2020-12-08 2545 /* Slave transfer synchronized - dev to mem (RX) trasnfer */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2546 dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__, d2abc982333c02 Peter Ujfalusi 2020-12-08 2547 uc->id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2548 d2abc982333c02 Peter Ujfalusi 2020-12-08 2549 ret = udma_alloc_rx_resources(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2550 if (ret) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2551 uc->config.remote_thread_id = -1; d2abc982333c02 Peter Ujfalusi 2020-12-08 2552 return ret; d2abc982333c02 Peter Ujfalusi 2020-12-08 2553 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2554 d2abc982333c02 Peter Ujfalusi 2020-12-08 2555 uc->config.src_thread = uc->config.remote_thread_id; d2abc982333c02 Peter Ujfalusi 2020-12-08 @2556 uc->config.dst_thread = (ud->psil_base + uc->rchan->id) | ^^^^^^^^^^^^^ This code dereferences "uc->rchan" without checking for NULL. d2abc982333c02 Peter Ujfalusi 2020-12-08 2557 K3_PSIL_DST_THREAD_ID_OFFSET; d2abc982333c02 Peter Ujfalusi 2020-12-08 2558 d2abc982333c02 Peter Ujfalusi 2020-12-08 2559 irq_ring_idx = uc->rflow->id + oes->pktdma_rchan_flow; d2abc982333c02 Peter Ujfalusi 2020-12-08 2560 d2abc982333c02 Peter Ujfalusi 2020-12-08 2561 ret = pktdma_tisci_rx_channel_config(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2562 break; d2abc982333c02 Peter Ujfalusi 2020-12-08 2563 default: d2abc982333c02 Peter Ujfalusi 2020-12-08 2564 /* Can not happen */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2565 dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n", d2abc982333c02 Peter Ujfalusi 2020-12-08 2566 __func__, uc->id, uc->config.dir); d2abc982333c02 Peter Ujfalusi 2020-12-08 2567 return -EINVAL; d2abc982333c02 Peter Ujfalusi 2020-12-08 2568 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2569 d2abc982333c02 Peter Ujfalusi 2020-12-08 2570 /* check if the channel configuration was successful */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2571 if (ret) d2abc982333c02 Peter Ujfalusi 2020-12-08 2572 goto err_res_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2573 d2abc982333c02 Peter Ujfalusi 2020-12-08 2574 if (udma_is_chan_running(uc)) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2575 dev_warn(ud->dev, "chan%d: is running!\n", uc->id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2576 udma_reset_chan(uc, false); d2abc982333c02 Peter Ujfalusi 2020-12-08 2577 if (udma_is_chan_running(uc)) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2578 dev_err(ud->dev, "chan%d: won't stop!\n", uc->id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2579 ret = -EBUSY; d2abc982333c02 Peter Ujfalusi 2020-12-08 2580 goto err_res_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2581 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2582 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2583 d2abc982333c02 Peter Ujfalusi 2020-12-08 2584 uc->dma_dev = dmaengine_get_dma_device(chan); d2abc982333c02 Peter Ujfalusi 2020-12-08 2585 uc->hdesc_pool = dma_pool_create(uc->name, uc->dma_dev, d2abc982333c02 Peter Ujfalusi 2020-12-08 2586 uc->config.hdesc_size, ud->desc_align, d2abc982333c02 Peter Ujfalusi 2020-12-08 2587 0); d2abc982333c02 Peter Ujfalusi 2020-12-08 2588 if (!uc->hdesc_pool) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2589 dev_err(ud->ddev.dev, d2abc982333c02 Peter Ujfalusi 2020-12-08 2590 "Descriptor pool allocation failed\n"); d2abc982333c02 Peter Ujfalusi 2020-12-08 2591 uc->use_dma_pool = false; d2abc982333c02 Peter Ujfalusi 2020-12-08 2592 ret = -ENOMEM; d2abc982333c02 Peter Ujfalusi 2020-12-08 2593 goto err_res_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2594 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2595 d2abc982333c02 Peter Ujfalusi 2020-12-08 2596 uc->use_dma_pool = true; d2abc982333c02 Peter Ujfalusi 2020-12-08 2597 d2abc982333c02 Peter Ujfalusi 2020-12-08 2598 /* PSI-L pairing */ d2abc982333c02 Peter Ujfalusi 2020-12-08 2599 ret = navss_psil_pair(ud, uc->config.src_thread, uc->config.dst_thread); d2abc982333c02 Peter Ujfalusi 2020-12-08 2600 if (ret) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2601 dev_err(ud->dev, "PSI-L pairing failed: 0x%04x -> 0x%04x\n", d2abc982333c02 Peter Ujfalusi 2020-12-08 2602 uc->config.src_thread, uc->config.dst_thread); d2abc982333c02 Peter Ujfalusi 2020-12-08 2603 goto err_res_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2604 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2605 d2abc982333c02 Peter Ujfalusi 2020-12-08 2606 uc->psil_paired = true; d2abc982333c02 Peter Ujfalusi 2020-12-08 2607 d2abc982333c02 Peter Ujfalusi 2020-12-08 2608 uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx); d2abc982333c02 Peter Ujfalusi 2020-12-08 2609 if (uc->irq_num_ring <= 0) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2610 dev_err(ud->dev, "Failed to get ring irq (index: %u)\n", d2abc982333c02 Peter Ujfalusi 2020-12-08 2611 irq_ring_idx); d2abc982333c02 Peter Ujfalusi 2020-12-08 2612 ret = -EINVAL; d2abc982333c02 Peter Ujfalusi 2020-12-08 2613 goto err_psi_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2614 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2615 d2abc982333c02 Peter Ujfalusi 2020-12-08 2616 ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler, d2abc982333c02 Peter Ujfalusi 2020-12-08 2617 IRQF_TRIGGER_HIGH, uc->name, uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2618 if (ret) { d2abc982333c02 Peter Ujfalusi 2020-12-08 2619 dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2620 goto err_irq_free; d2abc982333c02 Peter Ujfalusi 2020-12-08 2621 } d2abc982333c02 Peter Ujfalusi 2020-12-08 2622 d2abc982333c02 Peter Ujfalusi 2020-12-08 2623 uc->irq_num_udma = 0; d2abc982333c02 Peter Ujfalusi 2020-12-08 2624 d2abc982333c02 Peter Ujfalusi 2020-12-08 2625 udma_reset_rings(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2626 d2abc982333c02 Peter Ujfalusi 2020-12-08 2627 INIT_DELAYED_WORK_ONSTACK(&uc->tx_drain.work, d2abc982333c02 Peter Ujfalusi 2020-12-08 2628 udma_check_tx_completion); d2abc982333c02 Peter Ujfalusi 2020-12-08 2629 d2abc982333c02 Peter Ujfalusi 2020-12-08 2630 if (uc->tchan) d2abc982333c02 Peter Ujfalusi 2020-12-08 2631 dev_dbg(ud->dev, d2abc982333c02 Peter Ujfalusi 2020-12-08 2632 "chan%d: tchan%d, tflow%d, Remote thread: 0x%04x\n", d2abc982333c02 Peter Ujfalusi 2020-12-08 2633 uc->id, uc->tchan->id, uc->tchan->tflow_id, d2abc982333c02 Peter Ujfalusi 2020-12-08 2634 uc->config.remote_thread_id); d2abc982333c02 Peter Ujfalusi 2020-12-08 @2635 else if (uc->rchan) ^^^^^^^^^ This code assumes "uc->rchan" can be NULL. This is potentially a false positive. Ignore it if it is. d2abc982333c02 Peter Ujfalusi 2020-12-08 2636 dev_dbg(ud->dev, d2abc982333c02 Peter Ujfalusi 2020-12-08 2637 "chan%d: rchan%d, rflow%d, Remote thread: 0x%04x\n", d2abc982333c02 Peter Ujfalusi 2020-12-08 2638 uc->id, uc->rchan->id, uc->rflow->id, d2abc982333c02 Peter Ujfalusi 2020-12-08 2639 uc->config.remote_thread_id); d2abc982333c02 Peter Ujfalusi 2020-12-08 2640 return 0; d2abc982333c02 Peter Ujfalusi 2020-12-08 2641 d2abc982333c02 Peter Ujfalusi 2020-12-08 2642 err_irq_free: d2abc982333c02 Peter Ujfalusi 2020-12-08 2643 uc->irq_num_ring = 0; d2abc982333c02 Peter Ujfalusi 2020-12-08 2644 err_psi_free: d2abc982333c02 Peter Ujfalusi 2020-12-08 2645 navss_psil_unpair(ud, uc->config.src_thread, uc->config.dst_thread); d2abc982333c02 Peter Ujfalusi 2020-12-08 2646 uc->psil_paired = false; d2abc982333c02 Peter Ujfalusi 2020-12-08 2647 err_res_free: d2abc982333c02 Peter Ujfalusi 2020-12-08 2648 udma_free_tx_resources(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2649 udma_free_rx_resources(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2650 d2abc982333c02 Peter Ujfalusi 2020-12-08 2651 udma_reset_uchan(uc); d2abc982333c02 Peter Ujfalusi 2020-12-08 2652 d2abc982333c02 Peter Ujfalusi 2020-12-08 2653 dma_pool_destroy(uc->hdesc_pool); d2abc982333c02 Peter Ujfalusi 2020-12-08 2654 uc->use_dma_pool = false; d2abc982333c02 Peter Ujfalusi 2020-12-08 2655 d2abc982333c02 Peter Ujfalusi 2020-12-08 2656 return ret; d2abc982333c02 Peter Ujfalusi 2020-12-08 2657 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org
.config.gz
Description: application/gzip