Fix some bugs and add new feature for Spreadtrum DMA engine
Subsystems (2)
cover Fix some bugs and add new feature for Spreadtrum DMA engine
Hi,
This patch set fixes some DMA engine bugs and adds interrupt support for 2-stage transfer.
Baolin Wang (3):
dmaengine: sprd: Fix the possible crash when getting engine status
dmaengine: sprd: Add validation of current descriptor in irq handler
dmaengine: sprd: Add interrupt support for 2-stage transfer
Eric Long (4):
dmaengine: sprd: Fix the incorrect start for 2-stage destination
channels
dmaengine: sprd: Add device validation to support multiple
controllers
dmaengine: sprd: Fix block length overflow
dmaengine: sprd: Fix the right place to configure 2-stage transfer
drivers/dma/sprd-dma.c | 54 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 11 deletions(-)
Signature · 1 line
1.7.9.5
PATCH 1/7 dmaengine: sprd: Fix the possible crash when getting engine status
We will get a NULL virtual descriptor by vchan_find_desc() when the descriptor has been submitted, that will crash the kernel when getting the engine status.
In this case, since the descriptor has been submitted, which means the pointer 'schan->cur_desc' will point to the current descriptor, then we can use 'schan->cur_desc' to get the engine status to avoid this issue.
--- drivers/dma/sprd-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/sprd-dma.c +1 -1
@@ -625,7 +625,7 @@ static enum dma_status sprd_dma_tx_status(struct dma_chan *chan,else pos =0 ; }else if (schan->cur_desc && schan->cur_desc->vd.tx.cookie == cookie) { -struct sprd_dma_desc *sdesc =to_sprd_dma_desc (vd); +struct sprd_dma_desc *sdesc = schan->cur_desc;if (sdesc->dir ==DMA_DEV_TO_MEM ) pos =sprd_dma_get_dst_addr (schan);
Vinod Koul
maintainerRe: [PATCH 1/7] dmaengine: sprd: Fix the possible crash when getting engine status
Quoted 2 lines · Baolin Wang
We will get a NULL virtual descriptor by
vchan_find_desc()when the descriptor has been submitted, that will crash the kernel when getting the engine status.
No that is wrong, status is for descriptor and not engine!
Quoted 3 lines
In this case, since the descriptor has been submitted, which means the pointer '
schan->cur_desc' will point to the current descriptor, then we can use 'schan->cur_desc' to get the engine status to avoid this issue.
Nope, since the descriptor is completed, you return with residue as 0 and DMA_COMPLETE status!
Quoted 21 lines
Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/dma/sprd-dma.c +1
-1@@ -625,7 +625,7 @@ static enum dma_status sprd_dma_tx_status(struct dma_chan *chan,else pos =0 ; }else if (schan->cur_desc && schan->cur_desc->vd.tx.cookie == cookie) { -struct sprd_dma_desc *sdesc =to_sprd_dma_desc (vd); +struct sprd_dma_desc *sdesc = schan->cur_desc;if (sdesc->dir ==DMA_DEV_TO_MEM ) pos =sprd_dma_get_dst_addr (schan);Signature · 1 line
1.7.9.5
Re: [PATCH 1/7] dmaengine: sprd: Fix the possible crash when getting engine status
Hi Vinod,
Quoted 6 lines · Vinod Koul
Quoted 2 lines · Baolin Wang
We will get a NULL virtual descriptor by
vchan_find_desc()when the descriptor has been submitted, that will crash the kernel when getting the engine status.No that is wrong, status is for descriptor and not engine!
Sure, will fix the commit message.
Quoted 7 lines
Quoted 4 lines
In this case, since the descriptor has been submitted, which means the pointer '
schan->cur_desc' will point to the current descriptor, then we can use 'schan->cur_desc' to get the engine status to avoid this issue.Nope, since the descriptor is completed, you return with residue as 0 and
DMA_COMPLETEstatus!
No, the descriptor is not completed now. If it is completed, we will return 0 with DMA_COMPLETE status. But now the descriptor is on progress, we should get the descriptor to return current residue. Sorry for confusing description.
Quoted 25 lines
Quoted 21 lines
Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/dma/sprd-dma.c +1
-2@@ -625,7 +625,7 @@ static enum dma_status sprd_dma_tx_status(struct dma_chan *chan,else pos =0 ; }else if (schan->cur_desc && schan->cur_desc->vd.tx.cookie == cookie) { -struct sprd_dma_desc *sdesc =to_sprd_dma_desc (vd); +struct sprd_dma_desc *sdesc = schan->cur_desc;if (sdesc->dir ==DMA_DEV_TO_MEM ) pos =sprd_dma_get_dst_addr (schan); --Quoted 1 line
1.7.9.5
--
~Vinod
Vinod Koul
maintainerRe: [PATCH 1/7] dmaengine: sprd: Fix the possible crash when getting engine status
Quoted 17 lines · Baolin Wang
Hi Vinod,
Quoted 6 lines · Vinod Koul
Quoted 2 lines · Baolin Wang
We will get a NULL virtual descriptor by
vchan_find_desc()when the descriptor has been submitted, that will crash the kernel when getting the engine status.No that is wrong, status is for descriptor and not engine!
Sure, will fix the commit message.
Quoted 5 lines
Quoted 4 lines
In this case, since the descriptor has been submitted, which means the pointer '
schan->cur_desc' will point to the current descriptor, then we can use 'schan->cur_desc' to get the engine status to avoid this issue.
Quoted 7 lines
Quoted 2 lines
Nope, since the descriptor is completed, you return with residue as 0 and
DMA_COMPLETEstatus!No, the descriptor is not completed now. If it is completed, we will return 0 with
DMA_COMPLETEstatus. But now the descriptor is on progress, we should get the descriptor to return current residue. Sorry for confusing description.
OKay will wait for updated description to understand the fix
Quoted 32 lines
Quoted 26 lines
Quoted 22 lines
Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/dma/sprd-dma.c +1
-2@@ -625,7 +625,7 @@ static enum dma_status sprd_dma_tx_status(struct dma_chan *chan,else pos =0 ; }else if (schan->cur_desc && schan->cur_desc->vd.tx.cookie == cookie) { -struct sprd_dma_desc *sdesc =to_sprd_dma_desc (vd); +struct sprd_dma_desc *sdesc = schan->cur_desc;if (sdesc->dir ==DMA_DEV_TO_MEM ) pos =sprd_dma_get_dst_addr (schan); --Quoted 1 line
1.7.9.5
--
~VinodSignature · 2 lines
Baolin Wang Best Regards
PATCH 2/7 dmaengine: sprd: Add validation of current descriptor in irq handler
In reply to Baolin WangWhen user terminates one DMA channel to free all its descriptors, but at the same time one transaction interrupt was triggered possibly, now we should not handle this interrupt by validating if the 'schan->cur_desc' was set as NULL to avoid crashing the kernel.
--- drivers/dma/sprd-dma.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/dma/sprd-dma.c +7 -2
@@ -552,12 +552,17 @@ static irqreturn_t dma_irq_handle(int irq, void *dev_id) schan = &sdev->channels[i];spin_lock (&schan->vc.lock); + + sdesc = schan->cur_desc; +if (!sdesc) { +spin_unlock (&schan->vc.lock); +return IRQ_HANDLED ; + } + int_type =sprd_dma_get_int_type (schan); req_type =sprd_dma_get_req_type (schan);sprd_dma_clear_int (schan); - sdesc = schan->cur_desc; -/* cyclic mode schedule callback */ cyclic = schan->linklist.phy_addr ? true : false;if (cyclic == true) {
PATCH 3/7 dmaengine: sprd: Fix the incorrect start for 2-stage destination channels
In reply to Baolin WangFrom: Eric Long <[email protected]>
The 2-stage destination channel will be triggered by source channel automatically, which means we should not trigger it by software request.
--- drivers/dma/sprd-dma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/dma/sprd-dma.c +3 -1
@@ -510,7 +510,9 @@ static void sprd_dma_start(struct sprd_dma_chn *schan)sprd_dma_set_uid (schan);sprd_dma_enable_chn (schan); -if (schan->dev_id ==SPRD_DMA_SOFTWARE_UID ) +if (schan->dev_id ==SPRD_DMA_SOFTWARE_UID && + schan->chn_mode !=SPRD_DMA_DST_CHN0 && + schan->chn_mode !=SPRD_DMA_DST_CHN1 )sprd_dma_soft_request (schan); }
PATCH 4/7 dmaengine: sprd: Add device validation to support multiple controllers
In reply to Baolin WangFrom: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/dma/sprd-dma.c +5 -0
@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param; +if (chan->device->dev->of_node != dma_spec->np) +return false; + schan->dev_id = slave_id;return true; }
Vinod Koul
maintainerRe: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 17 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +0
-0
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 8 lines
drivers/dma/sprd-dma.c +3
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param; +if (chan->device->dev->of_node != dma_spec->np)
Are you not using of_dma_find_controller() that does this, so this would be useless!
Quoted 7 lines
drivers/dma/sprd-dma.c +2
-0+return false; + schan->dev_id = slave_id;return true; }Signature · 1 line
1.7.9.5
Re: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;
Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!
Yes, we can use of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to use of_dma_find_controller(), I can change to use it in next version. Thank.
struct sprd_dma_filter_param {
struct device_node *np;
};static struct dma_chan* sprd_dma_xlate(struct of_phandle_args *dma_spec, struct of_dma *of_dma)
{
param.np = dma_spec->node;
return dma_request_channel(xxx);
}of_dma_controller_register(np, sprd_dma_xlate, sdev);
Vinod Koul
maintainerRe: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!
Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.
Sorry I should have clarified more..
of_dma_find_controller() is called by xlate, so you already run this check, so why use this :)
Re: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.
Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)
The of_dma_find_controller() can save the requested device node into dma_spec, and in the of_dma_simple_xlate() function, it will call dma_request_channel() to request one channel, but it did not validate the device node to find the corresponding dma device in dma_request_channel(). So we should in our filter function to validate the device node with the device node specified by the dma_spec. Hope I make things clear.
Vinod Koul
maintainerRe: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 46 lines · Baolin Wang
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)
Quoted 7 lines
The
of_dma_find_controller()can save the requested device node intodma_spec, and in theof_dma_simple_xlate()function, it will calldma_request_channel()to request one channel, but it did not validate the device node to find the corresponding dma device indma_request_channel(). So we should in our filter function to validate the device node with the device node specified by thedma_spec. Hope I make things clear.
But dma_request_channel() calls of_dma_request_slave_channel() which invokes of_dma_find_controller() why is it broken for you if that is the case..
Re: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 56 lines · Vinod Koul
Quoted 46 lines · Baolin Wang
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)Quoted 7 lines
The
of_dma_find_controller()can save the requested device node intodma_spec, and in theof_dma_simple_xlate()function, it will calldma_request_channel()to request one channel, but it did not validate the device node to find the corresponding dma device indma_request_channel(). So we should in our filter function to validate the device node with the device node specified by thedma_spec. Hope I make things clear.
Quoted 3 lines
But
dma_request_channel()callsof_dma_request_slave_channel()which invokesof_dma_find_controller()why is it broken for you if that is the case..
No,the calling process should be:dma_request_slave_channel() --->dma_request_chan()--->of_dma_request_slave_channel()---->of_dma_simple_xlate() ----> dma_request_channel().
Re: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Hi Vinod,
Quoted 58 lines · Baolin Wang
Quoted 56 lines · Vinod Koul
Quoted 53 lines · Baolin Wang
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)The
of_dma_find_controller()can save the requested device node intodma_spec, and in theof_dma_simple_xlate()function, it will calldma_request_channel()to request one channel, but it did not validate the device node to find the corresponding dma device indma_request_channel(). So we should in our filter function to validate the device node with the device node specified by thedma_spec. Hope I make things clear.
Quoted 9 lines
Quoted 3 lines
But
dma_request_channel()callsof_dma_request_slave_channel()which invokesof_dma_find_controller()why is it broken for you if that is the case..No,the calling process should be:
dma_request_slave_channel()--->dma_request_chan()--->of_dma_request_slave_channel()---->of_dma_simple_xlate() ---->dma_request_channel().
You can check other drivers, they also will save the device node to validate in their filter function.
For example the imx-sdma driver:
https://elixir.bootlin.com/linux/v5.1-rc6/source/drivers/dma/imx-sdma.c#L1931
Vinod Koul
maintainerRe: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Quoted 69 lines · Baolin Wang
Hi Vinod,
Quoted 66 lines · Baolin Wang
Quoted 56 lines · Vinod Koul
Quoted 46 lines · Baolin Wang
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)Quoted 7 lines
The
of_dma_find_controller()can save the requested device node intodma_spec, and in theof_dma_simple_xlate()function, it will calldma_request_channel()to request one channel, but it did not validate the device node to find the corresponding dma device indma_request_channel(). So we should in our filter function to validate the device node with the device node specified by thedma_spec. Hope I make things clear.Quoted 3 lines
But
dma_request_channel()callsof_dma_request_slave_channel()which invokesof_dma_find_controller()why is it broken for you if that is the case..No,the calling process should be:
dma_request_slave_channel()--->dma_request_chan()--->of_dma_request_slave_channel()---->of_dma_simple_xlate() ---->dma_request_channel().
The thing is that this is a generic issue, so fix should be in the core and not in the driver. Agree in you case of_dma_find_controller() is not invoked, so we should fix that in core
Quoted 5 lines
You can check other drivers, they also will save the device node to validate in their filter function.
For example the imx-sdma driver:
https://elixir.bootlin.com/linux/v5.1-rc6/source/drivers/dma/imx-sdma.c#L1931
Exactly, more the reason this should be in core :)
Re: [PATCH 4/7] dmaengine: sprd: Add device validation to support multiple controllers
Hi Vinod,
Quoted 77 lines · Vinod Koul
Quoted 69 lines · Baolin Wang
Hi Vinod,
Quoted 66 lines · Baolin Wang
Quoted 56 lines · Vinod Koul
Quoted 46 lines · Baolin Wang
Quoted 40 lines · Vinod Koul
Quoted 32 lines · Baolin Wang
Quoted 26 lines · Vinod Koul
Quoted 24 lines · Baolin Wang
From: Eric Long <[email protected]>
Since we can support multiple DMA engine controllers, we should add device validation in filter function to check if the correct controller to be requested.
Signed-off-by Eric Long <[email protected]>Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/dma/sprd-dma.c +2
-0@@ -1020,8 +1020,13 @@ static void sprd_dma_free_desc(struct virt_dma_desc *vd)static bool sprd_dma_filter_fn (struct dma_chan *chan,void *param) {struct sprd_dma_chn *schan =to_sprd_dma_chan (chan); +struct of_phandle_args *dma_spec = + container_of(param, struct of_phandle_args, args[0]);u32 slave_id = *(u32 *)param;Quoted 4 lines
drivers/dma/sprd-dma.c static void sprd_dma_free_desc(struct virt_dma_desc *vd) · line 1027
Quoted 1 line
drivers/dma/sprd-dma.c +1
-0+if (chan->device->dev->of_node != dma_spec->np)Are you not using
of_dma_find_controller()that does this, so this would be useless!Quoted 5 lines
Yes, we can use
of_dma_find_controller(), but that will be a little complicated than current solution. Since we need introduce one structure to save the node to validate in the filter function like below, which seems make things complicated. But if you still like to useof_dma_find_controller(), I can change to use it in next version.Quoted 4 lines
Sorry I should have clarified more..
of_dma_find_controller()is called by xlate, so you already run this check, so why use this :)Quoted 7 lines
The
of_dma_find_controller()can save the requested device node intodma_spec, and in theof_dma_simple_xlate()function, it will calldma_request_channel()to request one channel, but it did not validate the device node to find the corresponding dma device indma_request_channel(). So we should in our filter function to validate the device node with the device node specified by thedma_spec. Hope I make things clear.Quoted 3 lines
But
dma_request_channel()callsof_dma_request_slave_channel()which invokesof_dma_find_controller()why is it broken for you if that is the case..No,the calling process should be:
dma_request_slave_channel()--->dma_request_chan()--->of_dma_request_slave_channel()---->of_dma_simple_xlate() ---->dma_request_channel().The thing is that this is a generic issue, so fix should be in the core and not in the driver. Agree in you case
of_dma_find_controller()is not invoked, so we should fix that in coreQuoted 1 line
Quoted 6 lines
Quoted 4 lines
You can check other drivers, they also will save the device node to validate in their filter function.
For example the imx-sdma driver:
https://elixir.bootlin.com/linux/v5.1-rc6/source/drivers/dma/imx-sdma.c#L1931Exactly, more the reason this should be in core :)
Sorry for late reply due to my holiday.
OK, I can move the fix into the core. So I think I will drop this patch from my patchset, and I will create another patch set to fix the device node validation issue with converting other drivers which did the similar things. Thanks.
Signature · 2 lines
Baolin Wang Best Regards
PATCH 5/7 dmaengine: sprd: Fix block length overflow
In reply to Baolin WangFrom: Eric Long <[email protected]>
The maximum value of block length is 0xffff, so if the configured transfer length is more than 0xffff, that will cause block length overflow to lead a configuration error.
Thus we can set block length as the maximum burst length to avoid this issue, since the maximum burst length will not be a big value which is more than 0xffff.
--- drivers/dma/sprd-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/sprd-dma.c +1 -1
@@ -778,7 +778,7 @@ static int sprd_dma_fill_desc(struct dma_chan *chan, temp |= slave_cfg->src_maxburst &SPRD_DMA_FRG_LEN_MASK ; hw->frg_len = temp; - hw->blk_len = len &SPRD_DMA_BLK_LEN_MASK ; + hw->blk_len = slave_cfg->src_maxburst &SPRD_DMA_BLK_LEN_MASK ; hw->trsc_len = len &SPRD_DMA_TRSC_LEN_MASK ; temp = (dst_step &SPRD_DMA_TRSF_STEP_MASK ) <<SPRD_DMA_DEST_TRSF_STEP_OFFSET ;
PATCH 6/7 dmaengine: sprd: Fix the right place to configure 2-stage transfer
In reply to Baolin WangFrom: Eric Long <[email protected]>
Move the 2-stage configuration before configuring the link-list mode, since we will use some 2-stage configuration to fill the link-list configuration.
--- drivers/dma/sprd-dma.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/dma/sprd-dma.c +6 -6
@@ -911,6 +911,12 @@ static int sprd_dma_fill_linklist_desc(struct dma_chan *chan, schan->linklist.virt_addr =0 ; } +/* Set channel mode and trigger mode for 2-stage transfer */ + schan->chn_mode = + (flags >>SPRD_DMA_CHN_MODE_SHIFT ) &SPRD_DMA_CHN_MODE_MASK ; + schan->trg_mode = + (flags >>SPRD_DMA_TRG_MODE_SHIFT ) &SPRD_DMA_TRG_MODE_MASK ; + sdesc =kzalloc (sizeof (*sdesc),GFP_NOWAIT );if (!sdesc)return NULL ;
@@ -944,12 +950,6 @@ static int sprd_dma_fill_linklist_desc(struct dma_chan *chan, } } -/* Set channel mode and trigger mode for 2-stage transfer */ - schan->chn_mode = - (flags >>SPRD_DMA_CHN_MODE_SHIFT ) &SPRD_DMA_CHN_MODE_MASK ; - schan->trg_mode = - (flags >>SPRD_DMA_TRG_MODE_SHIFT ) &SPRD_DMA_TRG_MODE_MASK ; - ret =sprd_dma_fill_desc (chan, &sdesc->chn_hw,0 ,0 , src, dst, len, dir, flags, slave_cfg);if (ret) {
PATCH 7/7 dmaengine: sprd: Add interrupt support for 2-stage transfer
In reply to Baolin WangFor 2-stage transfer, some users like Audio still need transaction interrupt to notify when the 2-stage transfer is completed. Thus we should enable 2-stage transfer interrupt to support this feature.
--- drivers/dma/sprd-dma.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
drivers/dma/sprd-dma.c +21 -1
@@ -62,6 +62,8 @@/* SPRD_DMA_GLB_2STAGE_GRP register definition */ #define SPRD_DMA_GLB_2STAGE_EN BIT(24)#define SPRD_DMA_GLB_CHN_INT_MASK GENMASK(23, 20) +#define SPRD_DMA_GLB_DEST_INT BIT(22) +#define SPRD_DMA_GLB_SRC_INT BIT(20)#define SPRD_DMA_GLB_LIST_DONE_TRG BIT(19)#define SPRD_DMA_GLB_TRANS_DONE_TRG BIT(18)#define SPRD_DMA_GLB_BLOCK_DONE_TRG BIT(17)
@@ -135,6 +137,7 @@/* define DMA channel mode & trigger mode mask */ #define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0) +#define SPRD_DMA_INT_TYPE_MASK GENMASK(7, 0)/* define the DMA transfer step type */ #define SPRD_DMA_NONE_STEP 0
@@ -190,6 +193,7 @@ struct sprd_dma_chn {u32 dev_id;enum sprd_dma_chn_mode chn_mode;enum sprd_dma_trg_mode trg_mode; +enum sprd_dma_int_type int_type;struct sprd_dma_desc *cur_desc; };
@@ -429,6 +433,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;
@@ -436,6 +443,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;
@@ -443,6 +453,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;
@@ -450,6 +463,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;
@@ -911,11 +927,15 @@ static int sprd_dma_fill_linklist_desc(struct dma_chan *chan, schan->linklist.virt_addr =0 ; } -/* Set channel mode and trigger mode for 2-stage transfer */ +/* +* Set channel mode, interrupt mode and trigger mode for 2-stage +* transfer. +*/ schan->chn_mode = (flags >>SPRD_DMA_CHN_MODE_SHIFT ) &SPRD_DMA_CHN_MODE_MASK ; schan->trg_mode = (flags >>SPRD_DMA_TRG_MODE_SHIFT ) &SPRD_DMA_TRG_MODE_MASK ; + schan->int_type = flags &SPRD_DMA_INT_TYPE_MASK ; sdesc =kzalloc (sizeof (*sdesc),GFP_NOWAIT );if (!sdesc)
Vinod Koul
maintainerRe: [PATCH 7/7] dmaengine: sprd: Add interrupt support for 2-stage transfer
Quoted 39 lines · Baolin Wang
For 2-stage transfer, some users like Audio still need transaction interrupt to notify when the 2-stage transfer is completed. Thus we should enable 2-stage transfer interrupt to support this feature.
Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)drivers/dma/sprd-dma.c +4
-0@@ -62,6 +62,8 @@/* SPRD_DMA_GLB_2STAGE_GRP register definition */ #define SPRD_DMA_GLB_2STAGE_EN BIT(24)#define SPRD_DMA_GLB_CHN_INT_MASK GENMASK(23, 20) +#define SPRD_DMA_GLB_DEST_INT BIT(22) +#define SPRD_DMA_GLB_SRC_INT BIT(20)#define SPRD_DMA_GLB_LIST_DONE_TRG BIT(19)#define SPRD_DMA_GLB_TRANS_DONE_TRG BIT(18)#define SPRD_DMA_GLB_BLOCK_DONE_TRG BIT(17)@@ -135,6 +137,7 @@/* define DMA channel mode & trigger mode mask */ #define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0) +#define SPRD_DMA_INT_TYPE_MASK GENMASK(7, 0)/* define the DMA transfer step type */ #define SPRD_DMA_NONE_STEP 0@@ -190,6 +193,7 @@ struct sprd_dma_chn {u32 dev_id;enum sprd_dma_chn_mode chn_mode;enum sprd_dma_trg_mode trg_mode; +enum sprd_dma_int_type int_type;struct sprd_dma_desc *cur_desc; };
drivers/dma/sprd-dma.c static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) · line 436
Quoted 4 lines
drivers/dma/sprd-dma.c +1
-0@@ -429,6 +433,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT )
Who configure int_type?
Quoted 54 lines
drivers/dma/sprd-dma.c +16
-1+ val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;@@ -436,6 +443,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;@@ -443,6 +453,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;@@ -450,6 +463,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;@@ -911,11 +927,15 @@ static int sprd_dma_fill_linklist_desc(struct dma_chan *chan, schan->linklist.virt_addr =0 ; } -/* Set channel mode and trigger mode for 2-stage transfer */ +/* +* Set channel mode, interrupt mode and trigger mode for 2-stage +* transfer. +*/ schan->chn_mode = (flags >>SPRD_DMA_CHN_MODE_SHIFT ) &SPRD_DMA_CHN_MODE_MASK ; schan->trg_mode = (flags >>SPRD_DMA_TRG_MODE_SHIFT ) &SPRD_DMA_TRG_MODE_MASK ; + schan->int_type = flags &SPRD_DMA_INT_TYPE_MASK ; sdesc =kzalloc (sizeof (*sdesc),GFP_NOWAIT );if (!sdesc)Signature · 1 line
1.7.9.5
Re: [PATCH 7/7] dmaengine: sprd: Add interrupt support for 2-stage transfer
Quoted 40 lines · Vinod Koul
Quoted 38 lines · Baolin Wang
For 2-stage transfer, some users like Audio still need transaction interrupt to notify when the 2-stage transfer is completed. Thus we should enable 2-stage transfer interrupt to support this feature.
Signed-off-by Baolin Wang <[email protected]>--- drivers/dma/sprd-dma.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)drivers/dma/sprd-dma.c +4
-0@@ -62,6 +62,8 @@/* SPRD_DMA_GLB_2STAGE_GRP register definition */ #define SPRD_DMA_GLB_2STAGE_EN BIT(24)#define SPRD_DMA_GLB_CHN_INT_MASK GENMASK(23, 20) +#define SPRD_DMA_GLB_DEST_INT BIT(22) +#define SPRD_DMA_GLB_SRC_INT BIT(20)#define SPRD_DMA_GLB_LIST_DONE_TRG BIT(19)#define SPRD_DMA_GLB_TRANS_DONE_TRG BIT(18)#define SPRD_DMA_GLB_BLOCK_DONE_TRG BIT(17)@@ -135,6 +137,7 @@/* define DMA channel mode & trigger mode mask */ #define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0) +#define SPRD_DMA_INT_TYPE_MASK GENMASK(7, 0)/* define the DMA transfer step type */ #define SPRD_DMA_NONE_STEP 0@@ -190,6 +193,7 @@ struct sprd_dma_chn {u32 dev_id;enum sprd_dma_chn_mode chn_mode;enum sprd_dma_trg_mode trg_mode; +enum sprd_dma_int_type int_type;struct sprd_dma_desc *cur_desc; };
Quoted 7 lines
drivers/dma/sprd-dma.c static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) · line 436
Quoted 5 lines
drivers/dma/sprd-dma.c +1
-0@@ -429,6 +433,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT )Who configure
int_type?
The int_type is configured through the flags ofsprd_dma_prep_slave_sg() by users, see:
https://elixir.bootlin.com/linux/v5.1-rc6/source/include/linux/dma/sprd-dma.h#L9
Quoted 58 lines
Quoted 54 lines
drivers/dma/sprd-dma.c +16
-2+ val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;@@ -436,6 +443,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_SRC_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;@@ -443,6 +453,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP1 , val, val);break ;@@ -450,6 +463,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = (chn <<SPRD_DMA_GLB_DEST_CHN_OFFSET ) &SPRD_DMA_GLB_DEST_CHN_MASK ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT ) + val |=SPRD_DMA_GLB_DEST_INT ; +sprd_dma_glb_update (sdev,SPRD_DMA_GLB_2STAGE_GRP2 , val, val);break ;@@ -911,11 +927,15 @@ static int sprd_dma_fill_linklist_desc(struct dma_chan *chan, schan->linklist.virt_addr =0 ; } -/* Set channel mode and trigger mode for 2-stage transfer */ +/* +* Set channel mode, interrupt mode and trigger mode for 2-stage +* transfer. +*/ schan->chn_mode = (flags >>SPRD_DMA_CHN_MODE_SHIFT ) &SPRD_DMA_CHN_MODE_MASK ; schan->trg_mode = (flags >>SPRD_DMA_TRG_MODE_SHIFT ) &SPRD_DMA_TRG_MODE_MASK ; + schan->int_type = flags &SPRD_DMA_INT_TYPE_MASK ; sdesc =kzalloc (sizeof (*sdesc),GFP_NOWAIT );if (!sdesc) --Quoted 1 line
1.7.9.5
--
~Vinod
Vinod Koul
maintainerRe: [PATCH 7/7] dmaengine: sprd: Add interrupt support for 2-stage transfer
Quoted 11 lines · Baolin Wang
Quoted 9 lines · Vinod Koul
drivers/dma/sprd-dma.c static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) · line 436
Quoted 5 lines · Baolin Wang
drivers/dma/sprd-dma.c +1
-0@@ -429,6 +433,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT )Who configure
int_type?
Quoted 3 lines
The
int_typeis configured through the flags ofsprd_dma_prep_slave_sg()by users, see:
https://elixir.bootlin.com/linux/v5.1-rc6/source/include/linux/dma/sprd-dma.h#L9
Please use DMA_PREP_INTERRUPT flag instead!
Re: [PATCH 7/7] dmaengine: sprd: Add interrupt support for 2-stage transfer
Quoted 13 lines · Vinod Koul
Quoted 11 lines · Baolin Wang
Quoted 9 lines · Vinod Koul
drivers/dma/sprd-dma.c static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) · line 436
Quoted 5 lines · Baolin Wang
drivers/dma/sprd-dma.c +1
-0@@ -429,6 +433,9 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) val = chn &SPRD_DMA_GLB_SRC_CHN_MASK ; val |=BIT (schan->trg_mode -1 ) <<SPRD_DMA_GLB_TRG_OFFSET ; val |=SPRD_DMA_GLB_2STAGE_EN ; +if (schan->int_type !=SPRD_DMA_NO_INT )Who configure
int_type?
Quoted 5 lines
Quoted 3 lines
The
int_typeis configured through the flags ofsprd_dma_prep_slave_sg()by users, see:
https://elixir.bootlin.com/linux/v5.1-rc6/source/include/linux/dma/sprd-dma.h#L9Please use
DMA_PREP_INTERRUPTflag instead!
We can not use DMA_PREP_INTERRUPT flag, since we have some Spreadtrum specific DMA interrupt flags configured by users, which I think we have made a consensus before. See:
https://elixir.bootlin.com/linux/v5.1-rc6/source/include/linux/dma/sprd-dma.h#L105