[Sound-open-firmware] [PATCH 2/2] cnl: dma: refine dma interrupt processing on cnl

rander.wang rander.wang at linux.intel.com
Thu Mar 8 07:39:51 CET 2018


hi Liam,

     you mentioned :  using IRQ core as 1st level IRQ handler

i don't get your idea.  to check which dma triggers the interrupt, dma 
status register

would be queried. Do this in 1st level IRQ handler is very ugly.

Rander

On 3/7/2018 4:57 PM, Liam Girdwood wrote:
> On Wed, 2018-03-07 at 10:15 +0800, rander.wang wrote:
>> hi Liam,
>>
>> On 3/6/2018 7:40 PM, Liam Girdwood wrote:
>>> On Tue, 2018-03-06 at 13:26 +0800, Rander Wang wrote:
>>>> +/*All the dma share the same interrupt on CNL, so check each dma*/
>>>> +/*controller when interrupt coming, then do the work            */
>>>> +static void dw_dma_irq_cnl(void *data)
>>>> +{
>>>> +	struct dma *dma;
>>>> +	uint32_t status_intr;
>>>> +
>>>> +	/*check interrupt status of DMA controller 0*/
>>>> +	dma = dma_get(DMA_GP_LP_DMAC0);
>>>> +	status_intr = dw_read(dma, DW_INTR_STATUS);
>>>> +	if (status_intr)
>>>> +		dw_dma_irq_handler(dma);
>>>> +
>>>> +	/*check interrupt status of DMA controller 1*/
>>>> +	dma = dma_get(DMA_GP_LP_DMAC1);
>>>> +	status_intr = dw_read(dma, DW_INTR_STATUS);
>>>> +	if (status_intr)
>>>> +		dw_dma_irq_handler(dma);
>>> Btw, shouldn't the CNL IRQ hanler be using the same code as APL since
>>> the DMAC is second level on both APL and CNL ?
>> for APL, there is a different irq for each DMA channel, but for CNL two
>> dma controller share the same irq, and dma status should be checked for
>> which channal. So it is a three level irq on CNL
> Ok, now I see.
>
> This should still use the 1st and 2nd level handlers like APL.
>
> 1) Each DMAC registers an IRQ handler with it's DMAC private data.
>
> 2) On IRQ, the first level IRQ core handler is called and it it turns
> calls both second level handlers (DMAC handlers).
>
> Can you redo 2/2 to use the above method. Your current patch does the
> above steps in the DMA driver instead of the IRQ core.
>
> Liam
>
>>>> +}
>>>> +
>>>>    static int dw_dma_probe(struct dma *dma)
>>>>    {
>>>>    	struct dma_pdata *dw_pdata;
>>>> @@ -1157,7 +1177,11 @@ static int dw_dma_probe(struct dma *dma)
>>>>    	}
>>>>    
>>>>    	/* register our IRQ handler */
>>>> +#ifdef CONFIG_CANNONLAKE
>>>> +	interrupt_register(dma_irq(dma), dw_dma_irq_cnl, dma);
>>>> +#else
>>>>    	interrupt_register(dma_irq(dma), dw_dma_irq_handler, dma);
>>>> +#endif
>>> You dont need this #ifdef if both IRQ handler functions have the same
>>> name (and we select the correct one at build time).
>>       sorry, i don't understand this issue.
>>> Liam
>>>
>>>>    	interrupt_enable(dma_irq(dma));
>>>>    
>>>>    	return 0;
>>> _______________________________________________
>>> Sound-open-firmware mailing list
>>> Sound-open-firmware at alsa-project.org
>>> http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware
>> _______________________________________________
>> Sound-open-firmware mailing list
>> Sound-open-firmware at alsa-project.org
>> http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware


More information about the Sound-open-firmware mailing list