[Sound-open-firmware] [RFC PATCH 4/6] dma: use newly defined API for request DMAC

Keyon Jie yang.jie at linux.intel.com
Wed Jun 6 04:13:52 CEST 2018



On 2018年06月06日 03:20, Ranjani Sridharan wrote:
> On Tue, 2018-06-05 at 19:14 +0800, Keyon Jie wrote:
>>
>> On 2018年06月05日 12:23, Ranjani Sridharan wrote:
>>> Use the new dma_get() API to procure DMAC's for all the users.
>>>
>>> Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com
>>>>
>>> ---
>>>    src/audio/dai.c        |  7 ++++++-
>>>    src/audio/host.c       | 28 +++++++++++++++++++++++-----
>>>    src/host/common_test.c |  2 +-
>>>    src/ipc/apl-ipc.c      |  3 ++-
>>>    src/ipc/byt-ipc.c      |  4 ++--
>>>    src/ipc/cnl-ipc.c      |  4 ++--
>>>    src/ipc/dma-copy.c     |  7 ++++++-
>>>    src/ipc/hsw-ipc.c      |  4 ++--
>>>    8 files changed, 44 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/src/audio/dai.c b/src/audio/dai.c
>>> index 1eeecd2..715e4c6 100644
>>> --- a/src/audio/dai.c
>>> +++ b/src/audio/dai.c
>>> @@ -201,7 +201,12 @@ static struct comp_dev *dai_new(struct
>>> sof_ipc_comp *comp)
>>>    		goto error;
>>>    	}
>>>    
>>> -	dd->dma = dma_get(ipc_dai->dmac_id);
>>> +	/*
>>> +	 * request DMAC with DAI_DMA user type, DUPLEX copy
>>> direction
>>> +	 * shared access flag
>>> +	 */
>>> +	dd->dma = dma_get(DMAC_USER_GP_LP_DMA, DMAC_DIR_DUPLEX,
>>> +			  DMAC_FLAGS_SHARED);
>>>    	if (dd->dma == NULL) {
>>>    		trace_dai_error("eDd");
>>>    		goto error;
>>> diff --git a/src/audio/host.c b/src/audio/host.c
>>> index c0f4e1b..6c5076b 100644
>>> --- a/src/audio/host.c
>>> +++ b/src/audio/host.c
>>> @@ -530,12 +530,30 @@ static struct comp_dev *host_new(struct
>>> sof_ipc_comp *comp)
>>>    	comp_set_drvdata(dev, hd);
>>>    
>>>    #if !defined CONFIG_DMA_GW
>>> -	hd->dma = dma_get(ipc_host->dmac_id);
>>> +	/*
>>> +	 * request DMAC with HOST_DMA user type, duplex copy
>>> direction
>>> +	 * and shared access flag
>>> +	 */
>>> +	hd->dma = dma_get(DMAC_USER_HOST_DMA, DMAC_DIR_DUPLEX,
>>> +			  DMAC_FLAGS_SHARED);
>>>    #else
>>> -	if (ipc_host->direction == SOF_IPC_STREAM_PLAYBACK)
>>> -		hd->dma = dma_get(DMA_HOST_OUT_DMAC);
>>> -	else
>>> -		hd->dma = dma_get(DMA_HOST_IN_DMAC);
>>> +	if (ipc_host->direction == SOF_IPC_STREAM_PLAYBACK) {
>>> +
>>> +		/*
>>> +		 * request DMAC with HOST_DMA user type, READ copy
>>> direction
>>> +		 * and shared access flag
>>> +		 */
>>> +		hd->dma = dma_get(DMAC_USER_HOST_DMA,
>>> DMAC_DIR_READ,
>>> +				  DMAC_FLAGS_SHARED);
>>> +	} else {
>>> +
>>> +		/*
>>> +		 * request DMAC with HOST_DMA user type, WRITE
>>> copy direction
>>> +		 * and shared access flag
>>> +		 */
>>> +		hd->dma = dma_get(DMAC_USER_HOST_DMA,
>>> DMAC_DIR_WRITE,
>>> +				  DMAC_FLAGS_SHARED);
>>> +	}
>>>    #endif
>>>    	if (hd->dma == NULL) {
>>>    		trace_host_error("eDM");
>>> diff --git a/src/host/common_test.c b/src/host/common_test.c
>>> index e286883..155c81b 100644
>>> --- a/src/host/common_test.c
>>> +++ b/src/host/common_test.c
>>> @@ -200,7 +200,7 @@ struct dai *dai_get(uint32_t type, uint32_t
>>> index)
>>>    	return NULL;
>>>    }
>>>    
>>> -struct dma *dma_get(int dmac_id)
>>> +struct dma *dma_get(enum dmac_user, enum dmac_copy_dir, int flags)
>>>    {
>>>    	return NULL;
>>>    }
>>> diff --git a/src/ipc/apl-ipc.c b/src/ipc/apl-ipc.c
>>> index 78291d0..c7d7305 100644
>>> --- a/src/ipc/apl-ipc.c
>>> +++ b/src/ipc/apl-ipc.c
>>> @@ -199,7 +199,8 @@ int platform_ipc_init(struct ipc *ipc)
>>>    		bzero(iipc->page_table, HOST_PAGE_SIZE);
>>>    
>>>    	/* dma */
>>> -	iipc->dmac = dma_get(DMA_GP_LP_DMAC0);
>>> +	iipc->dmac = dma_get(DMAC_USER_GP_LP_DMA, DMAC_DIR_DUPLEX,
>>> +			     DMAC_FLAGS_SHARED);
>>>    
>>>    	/* PM */
>>>    	iipc->pm_prepare_D3 = 0;
>>> diff --git a/src/ipc/byt-ipc.c b/src/ipc/byt-ipc.c
>>> index 87e7949..7c9feba 100644
>>> --- a/src/ipc/byt-ipc.c
>>> +++ b/src/ipc/byt-ipc.c
>>> @@ -225,8 +225,8 @@ int platform_ipc_init(struct ipc *ipc)
>>>    	if (iipc->page_table)
>>>    		bzero(iipc->page_table,
>>> PLATFORM_PAGE_TABLE_SIZE);
>>>    
>>> -	/* dma */
>>> -	iipc->dmac = dma_get(DMA_ID_DMAC0);
>>> +	/* request DMAC with shared access flag */
>>> +	iipc->dmac = dma_get(0, 0, DMAC_FLAGS_SHARED);
>>>    
>>>    	/* PM */
>>>    	iipc->pm_prepare_D3 = 0;
>>> diff --git a/src/ipc/cnl-ipc.c b/src/ipc/cnl-ipc.c
>>> index ba65164..fa71aa3 100644
>>> --- a/src/ipc/cnl-ipc.c
>>> +++ b/src/ipc/cnl-ipc.c
>>> @@ -199,8 +199,8 @@ int platform_ipc_init(struct ipc *ipc)
>>>    		bzero(iipc->page_table, HOST_PAGE_SIZE);
>>>    
>>>    	/* dma */
>>> -	iipc->dmac = dma_get(DMA_GP_LP_DMAC0);
>>> -
>>> +	iipc->dmac = dma_get(DMAC_USER_GP_LP_DMA, DMAC_DIR_DUPLEX,
>>> +			     DMAC_FLAGS_SHARED);
>>>    	/* PM */
>>>    	iipc->pm_prepare_D3 = 0;
>>>    
>>> diff --git a/src/ipc/dma-copy.c b/src/ipc/dma-copy.c
>>> index be72eb8..7fd8449 100644
>>> --- a/src/ipc/dma-copy.c
>>> +++ b/src/ipc/dma-copy.c
>>> @@ -375,7 +375,12 @@ int dma_copy_from_host_nowait(struct dma_copy
>>> *dc, struct dma_sg_config *host_sg
>>>    
>>>    int dma_copy_new(struct dma_copy *dc, int dmac)
>>>    {
>>> -	dc->dmac = dma_get(dmac);
>>> +	/*
>>> +	 * request DMAC with HOST_DMA user type, WRITE copy
>>> direction
>>> +	 * with shared access and high perf flags
>>> +	 */
>>> +	dc->dmac = dma_get(DMAC_USER_HOST_DMA, DMAC_DIR_WRITE,
>>> +			   DMAC_FLAGS_SHARED);
>>
>> be careful about this, for platform older than skl, we don't have
>> host
>> dma, so I assume your patch will break dma trace on byt.
> 
> The first 2 arguments are ignored for BYT/CHT/HSW so no issues there.

OK, that's fine then.

Thanks,
~Keyon

> BYT is the only platform I've tested this set of patches to work on.
> 
> 
>>
>> Thanks,
>> ~Keyon
>>
>>>    	if (dc->dmac == NULL) {
>>>    		trace_dma_error("ec0");
>>>    		return -ENODEV;
>>> diff --git a/src/ipc/hsw-ipc.c b/src/ipc/hsw-ipc.c
>>> index aa4d9e1..bbfc10b 100644
>>> --- a/src/ipc/hsw-ipc.c
>>> +++ b/src/ipc/hsw-ipc.c
>>> @@ -221,8 +221,8 @@ int platform_ipc_init(struct ipc *ipc)
>>>    	if (iipc->page_table)
>>>    		bzero(iipc->page_table,
>>> PLATFORM_PAGE_TABLE_SIZE);
>>>    
>>> -	/* dma */
>>> -	iipc->dmac = dma_get(DMA_ID_DMAC1);
>>> +	/* request DMAC with shared access flag */
>>> +	iipc->dmac = dma_get(0, 0, DMAC_FLAGS_SHARED);
>>>    
>>>    	/* PM */
>>>    	iipc->pm_prepare_D3 = 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