Re: [PATCH v2] dmaengine: hisilicon: Add Kunpeng DMA engine support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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..
> 




[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux