Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1530193 > unrolled thread
| Started by | Mason <slash.tmp@free.fr> |
|---|---|
| First post | 2016-11-25 13:50 +0100 |
| Last post | 2016-12-08 12:50 +0100 |
| Articles | 20 on this page of 52 — 6 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-11-25 13:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-11-25 14:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-11-25 15:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-11-25 15:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-11-25 16:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-11-29 19:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-06 06:10 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-06 13:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-06 14:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-06 16:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-06 16:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-07 00:00 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-07 17:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-07 17:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 11:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-08 12:00 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Geert Uytterhoeven <geert@linux-m68k.org> - 2016-12-08 12:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 12:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Geert Uytterhoeven <geert@linux-m68k.org> - 2016-12-08 13:10 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-08 13:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 13:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 17:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 17:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-09 08:10 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Sebastian Frias <sf84@laposte.net> - 2016-12-09 11:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-09 12:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished 1Måns Rullgård <mans@mansr.com> - 2016-12-09 12:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-09 18:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-09 18:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-09 19:00 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-09 18:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-09 19:00 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-09 19:20 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-09 19:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 12:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Geert Uytterhoeven <geert@linux-m68k.org> - 2016-12-08 13:10 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 13:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Geert Uytterhoeven <geert@linux-m68k.org> - 2016-12-08 13:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 13:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-08 14:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 14:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-08 13:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 16:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 17:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 16:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Mason <slash.tmp@free.fr> - 2016-12-08 16:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 17:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 17:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-07 17:40 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-07 17:50 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Vinod Koul <vinod.koul@intel.com> - 2016-12-08 11:30 +0100
Re: Tearing down DMA transfer setup after DMA client has finished Måns Rullgård <mans@mansr.com> - 2016-12-08 12:50 +0100
Page 2 of 3 — ← Prev page 1 [2] 3 Next page →
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-08 13:30 +0100 |
| Message-ID | <sM5ZM-65C-29@gated-at.bofh.it> |
| In reply to | #1538471 |
Geert Uytterhoeven <geert@linux-m68k.org> writes: > Hi Måns, > > On Thu, Dec 8, 2016 at 12:47 PM, Måns Rullgård <mans@mansr.com> wrote: >> Geert Uytterhoeven <geert@linux-m68k.org> writes: >>> On Thu, Dec 8, 2016 at 11:54 AM, Mason <slash.tmp@free.fr> wrote: >>>> On 08/12/2016 11:39, Vinod Koul wrote: >>>>> On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote: >>>>>> Vinod Koul <vinod.koul@intel.com> writes: >>>>>>> On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote: >>>>>>>> That's not going to work very well. Device drivers typically request >>>>>>>> dma channels in their probe functions or when the device is opened. >>>>>>>> This means that reserving one of the few channels there will inevitably >>>>>>>> make some other device fail to operate. >>>>>>> >>>>>>> No that doesn't make sense at all, you should get a channel only when you >>>>>>> want to use it and not in probe! >>>>>> >>>>>> Tell that to just about every single driver ever written. >>>>> >>>>> Not really, few do yes which is wrong but not _all_ do that. >>>> >>>> Vinod, >>>> >>>> Could you explain something to me in layman's terms? >>>> >>>> I have a NAND Flash Controller driver that depends on the >>>> DMA driver under discussion. >>>> >>>> Suppose I move the dma_request_chan() call from the driver's >>>> probe function, to the actual DMA transfer function. >>>> >>>> I would want dma_request_chan() to put the calling thread >>>> to sleep until a channel becomes available (possibly with >>>> a timeout value). >>>> >>>> But Maxime told me dma_request_chan() will just return >>>> -EBUSY if no channels are available. >>>> >>>> Am I supposed to busy wait in my driver's DMA function >>>> until a channel becomes available? >>> >>> Can you fall back to PIO if requesting a channel fails? >>> >>> Alternatively, dma_request_chan() could always succeed, and >>> dmaengine_prep_slave_sg() could fail if the channel is currently not >>> available due to a limitation on the number of active channels, and >>> the driver could fall back to PIO for that transfer. >> >> Why are we debating this nonsense? There is an easy fix that doesn't >> require changing the semantics of existing functions or falling back to >> slow pio. > > You still want to fall back to PIO if the DMA engine is not available at all > (e.g. DMA engine driver not compiled in, or module not loaded). That's a choice for each device driver to make. Some devices don't have a pio mode at all. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-08 17:40 +0100 |
| Message-ID | <sM9TI-8om-21@gated-at.bofh.it> |
| In reply to | #1538430 |
On Thu, Dec 08, 2016 at 11:54:51AM +0100, Mason wrote: > On 08/12/2016 11:39, Vinod Koul wrote: > > > On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote: > > > >> Vinod Koul <vinod.koul@intel.com> writes: > >> > >>> On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote: > >>>> > >>>> That's not going to work very well. Device drivers typically request > >>>> dma channels in their probe functions or when the device is opened. > >>>> This means that reserving one of the few channels there will inevitably > >>>> make some other device fail to operate. > >>> > >>> No that doesn't make sense at all, you should get a channel only when you > >>> want to use it and not in probe! > >> > >> Tell that to just about every single driver ever written. > > > > Not really, few do yes which is wrong but not _all_ do that. > > Vinod, > > Could you explain something to me in layman's terms? > > I have a NAND Flash Controller driver that depends on the > DMA driver under discussion. > > Suppose I move the dma_request_chan() call from the driver's > probe function, to the actual DMA transfer function. > > I would want dma_request_chan() to put the calling thread > to sleep until a channel becomes available (possibly with > a timeout value). > > But Maxime told me dma_request_chan() will just return > -EBUSY if no channels are available. That is correct > Am I supposed to busy wait in my driver's DMA function > until a channel becomes available? If someone else is using the channels then the bust wait will not help, so in this case you should fall back to PIO, few drivers do that > I don't understand how the multiplexing of few memory > channels to many clients is supposed to happen efficiently? To make it efficient, disregarding your Sbox HW issue, the solution is virtual channels. You can delink physical channels and virtual channels. If one has SW controlled MUX then a channel can service any client. For few controllers request lines are hard wired so they cant use any channel. But if you dont have this restriction then driver can queue up many transactions from different controllers. -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-08 17:50 +0100 |
| Message-ID | <sMa3n-8rP-3@gated-at.bofh.it> |
| In reply to | #1538711 |
Vinod Koul <vinod.koul@intel.com> writes: > To make it efficient, disregarding your Sbox HW issue, the solution is > virtual channels. You can delink physical channels and virtual channels. If > one has SW controlled MUX then a channel can service any client. For few > controllers request lines are hard wired so they cant use any channel. But > if you dont have this restriction then driver can queue up many transactions > from different controllers. Have you been paying attention at all? This exactly what the driver ALREADY DOES. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-09 08:10 +0100 |
| Message-ID | <sMntD-hq-1@gated-at.bofh.it> |
| In reply to | #1538722 |
On Thu, Dec 08, 2016 at 04:48:18PM +0000, Måns Rullgård wrote: > Vinod Koul <vinod.koul@intel.com> writes: > > > To make it efficient, disregarding your Sbox HW issue, the solution is > > virtual channels. You can delink physical channels and virtual channels. If > > one has SW controlled MUX then a channel can service any client. For few > > controllers request lines are hard wired so they cant use any channel. But > > if you dont have this restriction then driver can queue up many transactions > > from different controllers. > > Have you been paying attention at all? This exactly what the driver > ALREADY DOES. And have you read what the question was? -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Frias <sf84@laposte.net> |
|---|---|
| Date | 2016-12-09 11:30 +0100 |
| Message-ID | <sMqBb-24F-7@gated-at.bofh.it> |
| In reply to | #1539144 |
On 09/12/16 07:59, Vinod Koul wrote: > On Thu, Dec 08, 2016 at 04:48:18PM +0000, Måns Rullgård wrote: >> Vinod Koul <vinod.koul@intel.com> writes: >> >>> To make it efficient, disregarding your Sbox HW issue, the solution is >>> virtual channels. You can delink physical channels and virtual channels. If >>> one has SW controlled MUX then a channel can service any client. For few >>> controllers request lines are hard wired so they cant use any channel. But >>> if you dont have this restriction then driver can queue up many transactions >>> from different controllers. >> >> Have you been paying attention at all? This exactly what the driver >> ALREADY DOES. > > And have you read what the question was? > I think many people appreciate the quick turn around time and responsiveness of knowledgeable people making constructive remarks in this thread, but it looks we are slowly drifting away from the main problem. If we had to sum up the discussion, the current DMA API/framework in Linux seems to lack a way to properly handle this HW (or if it has a way, the information got lost somewhere). What concrete solution do you propose? Alternatively, one can think of the current issue (i.e.: the fact that the IRQ arrives "too soon") in a different way. Instead of thinking the IRQ indicates "transfer complete", it is indicating "ready to accept another command", which in practice (and with proper API support) can translate into efficient queuing of DMA operations.
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-09 12:40 +0100 |
| Message-ID | <sMrGV-2Gh-5@gated-at.bofh.it> |
| In reply to | #1539243 |
Sebastian Frias <sf84@laposte.net> writes: > On 09/12/16 07:59, Vinod Koul wrote: >> On Thu, Dec 08, 2016 at 04:48:18PM +0000, Måns Rullgård wrote: >>> Vinod Koul <vinod.koul@intel.com> writes: >>> >>>> To make it efficient, disregarding your Sbox HW issue, the solution is >>>> virtual channels. You can delink physical channels and virtual channels. If >>>> one has SW controlled MUX then a channel can service any client. For few >>>> controllers request lines are hard wired so they cant use any channel. But >>>> if you dont have this restriction then driver can queue up many transactions >>>> from different controllers. >>> >>> Have you been paying attention at all? This exactly what the driver >>> ALREADY DOES. >> >> And have you read what the question was? I wrote the driver. I think I know what Mason and I are asking. > I think many people appreciate the quick turn around time and > responsiveness of knowledgeable people making constructive remarks in > this thread, but it looks we are slowly drifting away from the main > problem. > > If we had to sum up the discussion, the current DMA API/framework in > Linux seems to lack a way to properly handle this HW (or if it has a > way, the information got lost somewhere). > > What concrete solution do you propose? > > Alternatively, one can think of the current issue (i.e.: the fact that > the IRQ arrives "too soon") in a different way. Instead of thinking > the IRQ indicates "transfer complete", it is indicating "ready to > accept another command", which in practice (and with proper API > support) can translate into efficient queuing of DMA operations. For multiple back to back transfers to the same peripheral, it is indeed a slight optimisation. What's apparently lacking is some way of doing a full flush -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | 1Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-09 12:40 +0100 |
| Message-ID | <sMrGW-2Gh-17@gated-at.bofh.it> |
| In reply to | #1539243 |
Sebastian Frias <sf84@laposte.net> writes: > On 09/12/16 07:59, Vinod Koul wrote: >> On Thu, Dec 08, 2016 at 04:48:18PM +0000, Måns Rullgård wrote: >>> Vinod Koul <vinod.koul@intel.com> writes: >>> >>>> To make it efficient, disregarding your Sbox HW issue, the solution is >>>> virtual channels. You can delink physical channels and virtual channels. If >>>> one has SW controlled MUX then a channel can service any client. For few >>>> controllers request lines are hard wired so they cant use any channel. But >>>> if you dont have this restriction then driver can queue up many transactions >>>> from different controllers. >>> >>> Have you been paying attention at all? This exactly what the driver >>> ALREADY DOES. >> >> And have you read what the question was? I wrote the driver. I think I know what Mason and I are asking. > I think many people appreciate the quick turn around time and > responsiveness of knowledgeable people making constructive remarks in > this thread, but it looks we are slowly drifting away from the main > problem. > > If we had to sum up the discussion, the current DMA API/framework in > Linux seems to lack a way to properly handle this HW (or if it has a > way, the information got lost somewhere). > > What concrete solution do you propose? > > Alternatively, one can think of the current issue (i.e.: the fact that > the IRQ arrives "too soon") in a different way. Instead of thinking > the IRQ indicates "transfer complete", it is indicating "ready to > accept another command", which in practice (and with proper API > support) can translate into efficient queuing of DMA operations. For multiple back to back transfers to the same peripheral, it is indeed a slight optimisation. What's apparently lacking is some way of doing a full flush at the end of a series of transfers, before switching the channel to another device. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-09 18:20 +0100 |
| Message-ID | <sMx02-615-3@gated-at.bofh.it> |
| In reply to | #1539243 |
On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: > > What concrete solution do you propose? I have already proposed two solutions. A) Request a channel only when you need it. Obviously we can't do virtual channels with this (though we should still use virt-channels framework). The sbox setup and teardown can be done as part of channel request and freeup. PL08x already does this. Downside is that we can only have as many consumers at a time as channels. I have not heard any technical reason for not doing this apart from drivers grab the channel at probe, which is incorrect and needs to be fixed irrespective of the problem at hand. This is my preferred option. B) Create a custom driver specific API. This API for example: sbox_setup(bool enable, ...) can be called by client to explicitly setup and clear up the sbox setting. This way we can have transactions muxed. I have not heard any arguments on why we shouldn't do this except Russell's comment that A) solves this. > Alternatively, one can think of the current issue (i.e.: the fact that the IRQ > arrives "too soon") in a different way. > Instead of thinking the IRQ indicates "transfer complete", it is indicating "ready > to accept another command", which in practice (and with proper API support) can > translate into efficient queuing of DMA operations. That IMO is a better understanding of this issue. But based on discussion, I think the issue is that submitting next transaction cannot be done until sbox is setup (as a consequence torn down for previous). Tear down can be down only when client knows that transfer is done, from dma controller data has been pushed and in-flight. -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-09 18:30 +0100 |
| Message-ID | <sMx9E-64e-19@gated-at.bofh.it> |
| In reply to | #1539561 |
Vinod Koul <vinod.koul@intel.com> writes: > On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: >> >> What concrete solution do you propose? > > I have already proposed two solutions. > > A) Request a channel only when you need it. Obviously we can't do virtual > channels with this (though we should still use virt-channels framework). > The sbox setup and teardown can be done as part of channel request and > freeup. PL08x already does this. > > Downside is that we can only have as many consumers at a time as channels. > > I have not heard any technical reason for not doing this apart from drivers > grab the channel at probe, which is incorrect and needs to be fixed > irrespective of the problem at hand. > > This is my preferred option. Sorry, but this is not acceptable. > B) Create a custom driver specific API. This API for example: > sbox_setup(bool enable, ...) > can be called by client to explicitly setup and clear up the sbox setting. > > This way we can have transactions muxed. > > I have not heard any arguments on why we shouldn't do this except Russell's > comment that A) solves this. Driver-specific interfaces are not the solution. That way lies chaos and madness. This would all be so much easier if you all would just shut up for a moment and let me fix it properly. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-09 19:00 +0100 |
| Message-ID | <sMxCG-6dN-25@gated-at.bofh.it> |
| In reply to | #1539570 |
On Fri, Dec 09, 2016 at 05:28:01PM +0000, Måns Rullgård wrote: > Vinod Koul <vinod.koul@intel.com> writes: > > > On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: > >> > >> What concrete solution do you propose? > > > > I have already proposed two solutions. > > > > A) Request a channel only when you need it. Obviously we can't do virtual > > channels with this (though we should still use virt-channels framework). > > The sbox setup and teardown can be done as part of channel request and > > freeup. PL08x already does this. > > > > Downside is that we can only have as many consumers at a time as channels. > > > > I have not heard any technical reason for not doing this apart from drivers > > grab the channel at probe, which is incorrect and needs to be fixed > > irrespective of the problem at hand. > > > > This is my preferred option. > > Sorry, but this is not acceptable. without outlining why.. > > > B) Create a custom driver specific API. This API for example: > > sbox_setup(bool enable, ...) > > can be called by client to explicitly setup and clear up the sbox setting. > > > > This way we can have transactions muxed. > > > > I have not heard any arguments on why we shouldn't do this except Russell's > > comment that A) solves this. > > Driver-specific interfaces are not the solution. That way lies chaos > and madness. Yes fair enough. So would API change which 99% world doesnt need. > This would all be so much easier if you all would just shut up for a > moment and let me fix it properly. Oh please go away, noone is asking you to reply! -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Mason <slash.tmp@free.fr> |
|---|---|
| Date | 2016-12-09 18:40 +0100 |
| Message-ID | <sMxjj-677-3@gated-at.bofh.it> |
| In reply to | #1539561 |
On 09/12/2016 18:17, Vinod Koul wrote: > On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: >> >> What concrete solution do you propose? > > I have already proposed two solutions. > > A) Request a channel only when you need it. Obviously we can't do virtual > channels with this (though we should still use virt-channels framework). > The sbox setup and teardown can be done as part of channel request and > freeup. PL08x already does this. > > Downside is that we can only have as many consumers at a time as channels. > > I have not heard any technical reason for not doing this apart from drivers > grab the channel at probe, which is incorrect and needs to be fixed > irrespective of the problem at hand. > > This is my preferred option. There is one important drawback with this solution. If a driver calls dma_request_chan() when no channels are currently available, it will get -EBUSY. If there were a flag in dma_request_chan to be put to sleep (with timeout) until a channel is available, then it would work. But busy waiting in the client driver is a waste of power. Regards.
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-09 19:00 +0100 |
| Message-ID | <sMxCG-6dN-19@gated-at.bofh.it> |
| In reply to | #1539572 |
On Fri, Dec 09, 2016 at 06:34:15PM +0100, Mason wrote: > On 09/12/2016 18:17, Vinod Koul wrote: > > > On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: > >> > >> What concrete solution do you propose? > > > > I have already proposed two solutions. > > > > A) Request a channel only when you need it. Obviously we can't do virtual > > channels with this (though we should still use virt-channels framework). > > The sbox setup and teardown can be done as part of channel request and > > freeup. PL08x already does this. > > > > Downside is that we can only have as many consumers at a time as channels. > > > > I have not heard any technical reason for not doing this apart from drivers > > grab the channel at probe, which is incorrect and needs to be fixed > > irrespective of the problem at hand. > > > > This is my preferred option. > > There is one important drawback with this solution. If a driver calls > dma_request_chan() when no channels are currently available, it will > get -EBUSY. If there were a flag in dma_request_chan to be put to > sleep (with timeout) until a channel is available, then it would > work. But busy waiting in the client driver is a waste of power. Right, but in that case the fallback would be PIO mode, and if that is not availble (IIRC some f your devices don't) then reject the usage with EAGAIN. -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Vinod Koul <vinod.koul@intel.com> |
|---|---|
| Date | 2016-12-09 19:20 +0100 |
| Message-ID | <sMxW2-6zD-17@gated-at.bofh.it> |
| In reply to | #1539579 |
On Fri, Dec 09, 2016 at 11:26:06PM +0530, Vinod Koul wrote: > On Fri, Dec 09, 2016 at 06:34:15PM +0100, Mason wrote: > > On 09/12/2016 18:17, Vinod Koul wrote: > > > > > On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: > > >> > > >> What concrete solution do you propose? > > > > > > I have already proposed two solutions. > > > > > > A) Request a channel only when you need it. Obviously we can't do virtual > > > channels with this (though we should still use virt-channels framework). > > > The sbox setup and teardown can be done as part of channel request and > > > freeup. PL08x already does this. > > > > > > Downside is that we can only have as many consumers at a time as channels. > > > > > > I have not heard any technical reason for not doing this apart from drivers > > > grab the channel at probe, which is incorrect and needs to be fixed > > > irrespective of the problem at hand. > > > > > > This is my preferred option. > > > > There is one important drawback with this solution. If a driver calls > > dma_request_chan() when no channels are currently available, it will > > get -EBUSY. If there were a flag in dma_request_chan to be put to > > sleep (with timeout) until a channel is available, then it would > > work. But busy waiting in the client driver is a waste of power. > > Right, but in that case the fallback would be PIO mode, and if that is > not availble (IIRC some f your devices don't) then reject the usage with > EAGAIN. Alternatively I can think of one more way. If there is fixed delay or maximum delay predicted between ISR being fired and transaction being completed from client, then we can use that magic value and degrade the performance a bit but make a simpler system than other two suggestions. The idea here is that typically the subsequent transaction should be issued as soon as possible, best case being in the ISR. But we can degrade that performance a bit and issue in the tasklet. But that can be done after introducing a delay, that too only in the case where new sbox configuration is different from previous one (so performance degrade is only on the switch and not for txn for same setup). You can possible optimize even further by issuing in ISR for same sbox setup and issuing in tasklet if configuration is different. Yes this is bit iffy and adds more burden on driver, but lets us get away with decent performance and being able to handle the hardware condition. Would that work for your case...? -- ~Vinod
[toc] | [prev] | [next] | [standalone]
| From | Mason <slash.tmp@free.fr> |
|---|---|
| Date | 2016-12-09 19:30 +0100 |
| Message-ID | <sMy5I-6DX-43@gated-at.bofh.it> |
| In reply to | #1539579 |
[ Dropping Mans to preserve his peace-of-mind ] On 09/12/2016 18:56, Vinod Koul wrote: > On Fri, Dec 09, 2016 at 06:34:15PM +0100, Mason wrote: >> On 09/12/2016 18:17, Vinod Koul wrote: >> >>> On Fri, Dec 09, 2016 at 11:25:57AM +0100, Sebastian Frias wrote: >>>> >>>> What concrete solution do you propose? >>> >>> I have already proposed two solutions. >>> >>> A) Request a channel only when you need it. Obviously we can't do virtual >>> channels with this (though we should still use virt-channels framework). >>> The sbox setup and teardown can be done as part of channel request and >>> freeup. PL08x already does this. >>> >>> Downside is that we can only have as many consumers at a time as channels. >>> >>> I have not heard any technical reason for not doing this apart from drivers >>> grab the channel at probe, which is incorrect and needs to be fixed >>> irrespective of the problem at hand. >>> >>> This is my preferred option. >> >> There is one important drawback with this solution. If a driver calls >> dma_request_chan() when no channels are currently available, it will >> get -EBUSY. If there were a flag in dma_request_chan to be put to >> sleep (with timeout) until a channel is available, then it would >> work. But busy waiting in the client driver is a waste of power. > > Right, but in that case the fallback would be PIO mode, and if that is > not availble (IIRC some f your devices don't) then reject the usage with > EAGAIN. Maybe I'm missing something, but I don't see how that would help. Take the NAND Flash controller driver, for instance. PIO is not an option, because the ECC engine is tied to DMA. And failing with -EAGAIN doesn't help the busy looping situation. The caller should be put on some kind of queue to wait for a "channel ready" event. Regards.
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-08 12:50 +0100 |
| Message-ID | <sM5n3-5Di-3@gated-at.bofh.it> |
| In reply to | #1538419 |
Vinod Koul <vinod.koul@intel.com> writes: > On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote: >> Vinod Koul <vinod.koul@intel.com> writes: >> >> > On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote: >> >> >> >> That's not going to work very well. Device drivers typically request >> >> dma channels in their probe functions or when the device is opened. >> >> This means that reserving one of the few channels there will inevitably >> >> make some other device fail to operate. >> > >> > No that doesnt make sense at all, you should get a channel only when you >> > want to use it and not in probe! >> >> Tell that to just about every single driver ever written. > > Not really, few do yes which is wrong but not _all_ do that. Every driver I ever looked at does. Name one you consider "correct." -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Geert Uytterhoeven <geert@linux-m68k.org> |
|---|---|
| Date | 2016-12-08 13:10 +0100 |
| Message-ID | <sM5Gq-5YO-27@gated-at.bofh.it> |
| In reply to | #1538458 |
On Thu, Dec 8, 2016 at 12:44 PM, Måns Rullgård <mans@mansr.com> wrote:
> Vinod Koul <vinod.koul@intel.com> writes:
>> On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote:
>>> Vinod Koul <vinod.koul@intel.com> writes:
>>> > On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote:
>>> >> That's not going to work very well. Device drivers typically request
>>> >> dma channels in their probe functions or when the device is opened.
>>> >> This means that reserving one of the few channels there will inevitably
>>> >> make some other device fail to operate.
>>> >
>>> > No that doesnt make sense at all, you should get a channel only when you
>>> > want to use it and not in probe!
>>>
>>> Tell that to just about every single driver ever written.
>>
>> Not really, few do yes which is wrong but not _all_ do that.
>
> Every driver I ever looked at does. Name one you consider "correct."
I'm far from claiming that drivers/tty/serial/sh-sci.c is perfect, but it does
request DMA channels at open time, not at probe time.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-08 13:30 +0100 |
| Message-ID | <sM5ZM-65C-5@gated-at.bofh.it> |
| In reply to | #1538470 |
Geert Uytterhoeven <geert@linux-m68k.org> writes: > On Thu, Dec 8, 2016 at 12:44 PM, Måns Rullgård <mans@mansr.com> wrote: >> Vinod Koul <vinod.koul@intel.com> writes: >>> On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote: >>>> Vinod Koul <vinod.koul@intel.com> writes: >>>> > On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote: >>>> >> That's not going to work very well. Device drivers typically request >>>> >> dma channels in their probe functions or when the device is opened. >>>> >> This means that reserving one of the few channels there will inevitably >>>> >> make some other device fail to operate. >>>> > >>>> > No that doesnt make sense at all, you should get a channel only when you >>>> > want to use it and not in probe! >>>> >>>> Tell that to just about every single driver ever written. >>> >>> Not really, few do yes which is wrong but not _all_ do that. >> >> Every driver I ever looked at does. Name one you consider "correct." > > I'm far from claiming that drivers/tty/serial/sh-sci.c is perfect, but > it does request DMA channels at open time, not at probe time. In the part quoted above, I said most drivers request dma channels in their probe or open functions. For the purposes of this discussion, that distinction is irrelevant. In either case, the channel is held indefinitely. If this wasn't the correct way to use the dmaengine, there would be no need for the virt-dma helpers which are specifically designed for cases the one currently at hand. The only problem we have is that nobody envisioned hardware where the dma engine indicates completion slightly too soon. I suspect there's a fifo or such somewhere, and the interrupt is triggered when the last byte has been placed in the fifo rather than when it has been removed which would have been more correct. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Geert Uytterhoeven <geert@linux-m68k.org> |
|---|---|
| Date | 2016-12-08 13:40 +0100 |
| Message-ID | <sM69r-68W-11@gated-at.bofh.it> |
| In reply to | #1538477 |
On Thu, Dec 8, 2016 at 1:20 PM, Måns Rullgård <mans@mansr.com> wrote:
> Geert Uytterhoeven <geert@linux-m68k.org> writes:
>> On Thu, Dec 8, 2016 at 12:44 PM, Måns Rullgård <mans@mansr.com> wrote:
>>> Vinod Koul <vinod.koul@intel.com> writes:
>>>> On Wed, Dec 07, 2016 at 04:45:58PM +0000, Måns Rullgård wrote:
>>>>> Vinod Koul <vinod.koul@intel.com> writes:
>>>>> > On Tue, Dec 06, 2016 at 01:14:20PM +0000, Måns Rullgård wrote:
>>>>> >> That's not going to work very well. Device drivers typically request
>>>>> >> dma channels in their probe functions or when the device is opened.
>>>>> >> This means that reserving one of the few channels there will inevitably
>>>>> >> make some other device fail to operate.
>>>>> >
>>>>> > No that doesnt make sense at all, you should get a channel only when you
>>>>> > want to use it and not in probe!
>>>>>
>>>>> Tell that to just about every single driver ever written.
>>>>
>>>> Not really, few do yes which is wrong but not _all_ do that.
>>>
>>> Every driver I ever looked at does. Name one you consider "correct."
>>
>> I'm far from claiming that drivers/tty/serial/sh-sci.c is perfect, but
>> it does request DMA channels at open time, not at probe time.
>
> In the part quoted above, I said most drivers request dma channels in
> their probe or open functions. For the purposes of this discussion,
> that distinction is irrelevant. In either case, the channel is held
> indefinitely. If this wasn't the correct way to use the dmaengine,
> there would be no need for the virt-dma helpers which are specifically
> designed for cases the one currently at hand.
Sorry, I mainly read Vinod's "not in probe", and missed your "or when the
device is opened".
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
[toc] | [prev] | [next] | [standalone]
| From | Måns Rullgård <mans@mansr.com> |
|---|---|
| Date | 2016-12-08 13:50 +0100 |
| Message-ID | <sM6j8-6ce-11@gated-at.bofh.it> |
| In reply to | #1538477 |
Mason <slash.tmp@free.fr> writes: > On 08/12/2016 13:20, Måns Rullgård wrote: > >> The only problem we have is that nobody envisioned hardware where the >> dma engine indicates completion slightly too soon. I suspect there's a >> fifo or such somewhere, and the interrupt is triggered when the last >> byte has been placed in the fifo rather than when it has been removed >> which would have been more correct. > > As I (tried to) explain here: > https://marc.info/?l=dmaengine&m=148007808418242&w=2 > > A *read* MBUS agent raises its IRQ when it is safe for the memory > to be overwritten (i.e. every byte has been pushed into the pipe). > > A *write* MBUS agent raises its IRQ when it is safe for another > agent to read any one of the transferred bytes. > > The issue comes from the fact that, for a memory-to-device transfer, > the system will receive the read agent's IRQ, but most devices > (NFC, SATA) don't have an IRQ line to signal that their part of the > operation is complete. SATA does, actually. Nevertheless, it's an unusual design. -- Måns Rullgård
[toc] | [prev] | [next] | [standalone]
| From | Mason <slash.tmp@free.fr> |
|---|---|
| Date | 2016-12-08 14:40 +0100 |
| Message-ID | <sM75v-6GO-15@gated-at.bofh.it> |
| In reply to | #1538514 |
On 08/12/2016 13:44, Måns Rullgård wrote: > Mason <slash.tmp@free.fr> writes: > >> On 08/12/2016 13:20, Måns Rullgård wrote: >> >>> The only problem we have is that nobody envisioned hardware where the >>> dma engine indicates completion slightly too soon. I suspect there's a >>> fifo or such somewhere, and the interrupt is triggered when the last >>> byte has been placed in the fifo rather than when it has been removed >>> which would have been more correct. >> >> As I (tried to) explain here: >> https://marc.info/?l=dmaengine&m=148007808418242&w=2 >> >> A *read* MBUS agent raises its IRQ when it is safe for the memory >> to be overwritten (i.e. every byte has been pushed into the pipe). >> >> A *write* MBUS agent raises its IRQ when it is safe for another >> agent to read any one of the transferred bytes. >> >> The issue comes from the fact that, for a memory-to-device transfer, >> the system will receive the read agent's IRQ, but most devices >> (NFC, SATA) don't have an IRQ line to signal that their part of the >> operation is complete. > > SATA does, actually. Nevertheless, it's an unusual design. Thanks, I was mistaken about the SATA controller. On tango3 (and also tango4, I assume) IRQ 41 = Serial ATA #0 IRQ 42 = Serial ATA DMA #0 IRQ 54 = Serial ATA #1 IRQ 55 = Serial ATA DMA #1 But in the end, whether there is a device interrupt (SATA) or not (NFC), for a memory-to-device transfer, the DMA driver will get the read agent notification (which should be ignored) and the client driver should either spin until idle (NFC) or wait for its completion IRQ (SATA). Correct? Regards.
[toc] | [prev] | [next] | [standalone]
Page 2 of 3 — ← Prev page 1 [2] 3 Next page →
Back to top | Article view | linux.kernel
csiph-web