On Sat, Aug 02, 2025 at 02:37:54PM +0200, Konrad Dybcio wrote: > On 8/1/25 2:00 PM, Laurent Pinchart wrote: > > On Wed, Jul 30, 2025 at 02:37:54PM -0400, Frank Li wrote: > >> On Wed, Jul 30, 2025 at 09:04:17PM +0300, Laurent Pinchart wrote: > >>> On Wed, Jul 30, 2025 at 12:39:43PM -0400, Frank Li wrote: > >>>> On Wed, Jul 30, 2025 at 11:33:29AM +0200, Konrad Dybcio wrote: > >>>>> From: Konrad Dybcio <konrad.dybcio@xxxxxxxxxxxxxxxx> > >>>>> > >>>>> The DMA subsystem attempts to make it theoretically possible to pair > >>>>> any DMA block with any user. While that's convenient from a > >>>>> codebase sanity perspective, some blocks are more intertwined. > >>>>> > >>>>> One such case is the Qualcomm GENI, where each wrapper contains a > >>>>> number of Serial Engine instances, each one of which can be programmed > >>>>> to support a different protocol (such as I2C, I3C, SPI, UART, etc.). > >>>>> > >>>>> The GPI DMA it's designed together with, needs to receive the ID of the > >>>>> protocol that's in use, to adjust its behavior accordingly. Currently, > >>>>> that's done through passing that ID through device tree, with each > >>>>> Serial Engine expressed NUM_PROTOCOL times, resulting in terrible > >>>>> dt-bindings that are full of useless copypasta. > >>>>> > >>>>> In a step to cut down on that, let the DMA user give the engine driver > >>>>> a hint at request time. > >>>>> > >>>>> Signed-off-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxxxxxxxx> > >>>>> --- > > [...] > > >>>>> diff --git a/include/linux/of_dma.h b/include/linux/of_dma.h > >>>>> index fd706cdf255c61c82ce30ef9a2c44930bef34bc8..9f9bc4207b85d48d73c25aad4b362e7c84c01756 100644 > >>>>> --- a/include/linux/of_dma.h > >>>>> +++ b/include/linux/of_dma.h > >>>>> @@ -19,7 +19,7 @@ struct of_dma { > >>>>> struct list_head of_dma_controllers; > >>>>> struct device_node *of_node; > >>>>> struct dma_chan *(*of_dma_xlate) > >>>>> - (struct of_phandle_args *, struct of_dma *); > >>>>> + (struct of_phandle_args *, struct of_dma *, void *); > >>>> > >>>> I suggest pass down more informaiton, like client's dev point. So we can > >>>> auto create device link between client's dev and dma chan's device. > >>> > >>> Is .of_dma_xlate() really the right place to do that ? If you want to > >>> create a device link for PM reasons, isn't it better created when the > >>> channel is requested ? It should also be removed when the channel is > >>> freed. > >> > >> I remember just need record client device pointer here. > >> > >>>> > >>>> DMA Engineer device > >>>> DMA chan device > >>>> consumer clients' device. > >>>> > >>>> If consumer device runtime pm suspend can auto trigger DMA chan's device's > >>>> runtime pm function. > >>>> > >>>> It will simplifly DMA engine's run time pm manage. Currently many DMA run > >>>> time pm implement as, runtime_pm_get() when alloc and runtime_pm_put() at > >>>> free channel. But many devices request dma channel at probe, which make > >>>> dma engine work at always 'on' state. > >>>> > >>>> But ideally, dma chan should be resume only when it is used to transfer. > >>> > >>> This is exactly what I was going to mention after reading the last > >>> paragraph. Is there anything that prevents a DMA engine driver to > >>> perform a rutime PM get() when a transfer is submitted > >> > >> DMA description is a queue, It is hard to track each descriptor submit and > >> finished. espcially cycle buffer case. > >> > >> And according to dma engine API defination, submit a descriptor not > >> neccessary to turn on clock, maybe just pure software operation, such as > >> enqueue it to a software list. > >> > >> Many driver call dmaengine_submit() in irq context, submit new descriptor > >> when previous descriptor finished. runtime_pm_get() can NOT be called in > >> atomic context. > >> > >> And some driver submit many descripor advance. Only issue_transfer() is > >> actually trigger hardware to start transfer. > >> > >> Some client use cycle descripor, such audio devices. Some audio devices > >> have not free descriptor at their run time suspend function, just disable > >> audio devices's clocks. Audio devices run time suspend, which means no > >> one use this dma channel, dma channel can auto suspend if built device link > >> between audio device and dma chan devices. > >> > >> Some DMA client have not devices, such as memory to memory. for this kind > >> case, it need keep chan always on. > >> > >> issue_transfer() can be call in atomic context. but trigger hardware transfer > >> need clock and runtime_pm_get() can't be called in atomic context. > >> > >> Most case issue_transfer() is call in irq handle, which means device should > >> already be in runtime resume statue. DMA engine can safely access their > >> register if using device link. > > > > You have good points there, in particular the fact the issue_transfer() > > can be called in interrupt context. > > > > For me this calls for new DMA engine operations to "start/stop" the DMA > > engine (better names are likely needed) from a client perspective. > > > >>> and a put() when > >>> it completes ? (Logically speaking, the actual implementation would > >>> likely be a bit different in drivers, but the result would be similar.) > > So.. do you folks want me to alter the patch in any way? I think the runtime PM issue is orthogonal to the problem this series addresses. It can be addressed separately. That being said, I'm not a big fan of passing a void pointer to .of_xlate() to carry device-specific information, in a device-specific format. This seems prone to mismatch between clients and DMA engines. .of_xlate() also seems the wrong place to do this. It would be cleaner if we could use another operation, such as dmaengine_slave_config() for instance. -- Regards, Laurent Pinchart