On 2019/12/11 18:52, Vinod Koul wrote: > On 10-12-19, 10:13, Zhou Wang wrote: >> This patch adds a driver for HiSilicon Kunpeng DMA engine. > > Can you please describe this controller here, how many channels, > controller capabilities etc OK, will add related description about this controller. > >> +static void hisi_dma_enable_dma(struct hisi_dma_dev *hdma_dev, u32 index, >> + bool enable) > > Coding Style expects the second line to be aligned to preceding line > brace opne, --strict option with checkpatch should warn you! seems code it right, just looks wrong in patch. However, I checked whole patch again with --strict, find some other warnings, will fix them in next version. > >> +{ >> + void __iomem *addr = hdma_dev->base + HISI_DMA_CTRL0(index); >> + u32 tmp; >> + >> + tmp = readl_relaxed(addr); >> + tmp = enable ? tmp | HISI_DMA_CTRL0_QUEUE_EN : >> + tmp & ~HISI_DMA_CTRL0_QUEUE_EN; >> + writel_relaxed(tmp, addr); >> +} > > why not create a modifyl() macro and then use that here and other places > rather than doiun read, modify, write sequence OK. > >> +static void hisi_dma_reset_hw_chan(struct hisi_dma_chan *chan) >> +{ >> + struct hisi_dma_dev *hdma_dev = chan->hdma_dev; >> + u32 index = chan->qp_num, tmp; >> + int ret; >> + >> + hisi_dma_pause_dma(hdma_dev, index, true); >> + hisi_dma_enable_dma(hdma_dev, index, false); >> + hisi_dma_mask_irq(hdma_dev, index); >> + >> + ret = readl_relaxed_poll_timeout(hdma_dev->base + >> + HISI_DMA_Q_FSM_STS(index), tmp, >> + FIELD_GET(HISI_DMA_FSM_STS_MASK, tmp) != RUN, 10, 1000); >> + if (ret) >> + dev_err(&hdma_dev->pdev->dev, "disable channel timeout!\n"); > > you want to continue on this timeout? need find a way to handle this, thanks. > >> +static int hisi_dma_terminate_all(struct dma_chan *c) >> +{ >> + struct hisi_dma_chan *chan = to_hisi_dma_chan(c); >> + unsigned long flags; >> + LIST_HEAD(head); >> + >> + spin_lock_irqsave(&chan->vc.lock, flags); >> + >> + hisi_dma_pause_dma(chan->hdma_dev, chan->qp_num, true); >> + if (chan->desc) { >> + vchan_terminate_vdesc(&chan->desc->vd); >> + chan->desc = NULL; >> + } >> + >> + vchan_get_all_descriptors(&chan->vc, &head); >> + >> + spin_unlock_irqrestore(&chan->vc.lock, flags); >> + >> + vchan_dma_desc_free_list(&chan->vc, &head); >> + hisi_dma_pause_dma(chan->hdma_dev, chan->qp_num, false); > > pause on terminate? Not DISABLE? here this function just aborts transfers on specific channel. > >> +static struct pci_driver hisi_dma_pci_driver = { >> + .name = "hisi_dma", >> + .id_table = hisi_dma_pci_tbl, >> + .probe = hisi_dma_probe, > > no .remove and kconfig has a tristate option! Use devres APIs in probe, so seems nothing should be done in remove :) Best, Zhou > >> +MODULE_AUTHOR("Zhou Wang <wangzhou1@xxxxxxxxxxxxx>"); >> +MODULE_AUTHOR("Zhenfa Qiu <qiuzhenfa@xxxxxxxxxxxxx>"); >> +MODULE_DESCRIPTION("HiSilicon Kunpeng DMA controller driver"); >> +MODULE_LICENSE("GPL"); > > GPL v2.. >