[PATCH v4 02/13] ASoC: Intel: catpt: Define DSP operations

Cezary Rojewski cezary.rojewski at intel.com
Wed Aug 19 15:46:30 CEST 2020


On 2020-08-18 1:50 PM, Andy Shevchenko wrote:
> On Mon, Aug 17, 2020 at 01:12:01PM +0200, Cezary Rojewski wrote:
>> On 2020-08-13 8:51 PM, Andy Shevchenko wrote:
>>> On Wed, Aug 12, 2020 at 10:57:42PM +0200, Cezary Rojewski wrote:
>>>> Implement dsp lifecycle functions such as core RESET and STALL,
>>>> SRAM power control and LP clock selection. This also adds functions for
>>>> handling transport over DW DMA controller.
>>
>> Thanks for your input Andy!
> 
> You're welcome!
> 

>>>> +#define CATPT_DMA_DEVID		1 /* dma engine used */
>>>
>>> Not sure I understand what exactly this means.
>>>
>>
>> Well, you may choose either engine 0 or 1 for loading images. Reference
>> solution which I'm basing catpt on - Windows driver equivalent - makes use
>> of engine 1. Goal of this implementation is to align closely to stable
>> Windows solution wherever possible to reduce maintainance cost.
> 
> Please, give extended comment here.
> 

Sure, ack.

>>>> +	status = dma_wait_for_async_tx(desc);
>>>
>>>> +	catpt_updatel_shim(cdev, HMDC,
>>>> +			   CATPT_HMDC_HDDA(CATPT_DMA_DEVID, chan->chan_id), 0);
>>>
>>> Update even in erroneous case?
>>>
>>
>> Yes. This is based on stable Windows solution equivalent and get's updated
>> even in failure case to disable access to HOST memory in demand more.
> 
> I guess this deserves a comment.
> 

Ditto.

>>>> +	return (status == DMA_COMPLETE) ? 0 : -EPROTO;
> 
> ...
> 
>>>> +	new <<= __ffs(mask);
>>>> +	new = ~(new) & mask;
>>>
>>> Unneeded parentheses.
>>> And perhaps in one line it will be better to understand:
>>>
>>> 	new = ~(new << __ffs(mask)) & mask;
>>>
>>
>> Was called out in the past not to combine everything in one-line like if I'm
>> to hide something from reviewer.
>>
>> No problem with combining these together in v5.
> 
> you also may consider to use u32_replace_bits() or so.
> 

I'll check bitfields.h too, sure.

>>>> +	bool lp;
>>>> +
>>>> +	if (list_empty(&cdev->stream_list))
>>>> +		return catpt_dsp_select_lpclock(cdev, true, true);
>>>> +
>>>> +	lp = true;
>>>> +	list_for_each_entry(stream, &cdev->stream_list, node) {
>>>> +		if (stream->prepared) {
>>>> +			lp = false;
>>>> +			break;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	return catpt_dsp_select_lpclock(cdev, lp, true);
>>>
>>> Seems too much duplication.
>>>
>>> 	struct catpt_stream_runtime *stream;
>>>
>>> 	list_for_each_entry(stream, &cdev->stream_list, node) {
>>> 		if (stream->prepared)
>>> 			return catpt_dsp_select_lpclock(cdev, false, true);
>>> 	}
>>>
>>> 	return catpt_dsp_select_lpclock(cdev, true, true);
>>>
>>>
>>> Better?
>>
>> list_first_entry (part of list_for_each_entry) expects list to be non-empty.
>> ->streal_list may be empty when invoking catpt_dsp_update_lpclock().
> 
> I didn't get this. Can you point out where is exactly problematic place?
> 

list_for_each_entry makes use of list_first_entry when initializing 
'pos' index variable. Documentation for list_first_entry reads: "Note, 
that list is expected to be not empty" so I'm validating list's status 
before moving on to the loop as stream_list may be empty when 
catpt_dsp_update_lpclock() gets called.


More information about the Alsa-devel mailing list