Re: [PATCH v3 1/1] dmaengine: dw: Select only supported masters for ACPI devices

Serge Semin
2024-09-23T11:57:33Z

On Mon, Sep 23, 2024 at 11:21:37AM +0300, Andy Shevchenko wrote:
> On Mon, Sep 23, 2024 at 01:01:08AM +0300, Serge Semin wrote:
> > On Fri, Sep 20, 2024 at 06:56:17PM +0300, Andy Shevchenko wrote:
>
> ...
>
> > > Fix the problem by specifying the default master ID for both memory
> > > and peripheral devices in the driver data. Thus the issue noticed for
> > > the iDMA 32-bit controllers will be eliminated and the ACPI-probed
> > > DW DMA controllers will be configured with the correct master ID by
> > > default.
>
> > > ---
> > > v3: rewrote to use driver_data
> > > v2: https://lore.kernel.org/r/20240919185151.7331-1-fancer.lancer@gmail.com
> >
> > IMO v2 looked better for me.
>
> I disagree, obviously, since I sent a v3.

> (I can drop your authorship and tags in v4)

No need in that. See my further comments.

>
> > I am sure you know, but Master IDs is a
> > platform-specific thing specific for each slave/peripheral device
> > connected to the DMA controller. Depending on the chip design one
> > peripheral device can be accessed over the one master IDs, another
> > device/memory may have another master connected (can be up to four
> > master IDs in general). That's why the master IDs have been declared
> > in the dw_dma_slave structure.
>
> Correct.
>
> > So adding them to struct
> > dw_dma_chip_pdata doesn't seem like a good idea seeing it contains the
> > generic DW DMA controller info.
>
> So far there is no evidence that the channels are integrated differently on
> the same DMA controller over all hardware that uses this IP.

I've got one device (which currently isn't supported by the vanilla
kernel) which DW DMA-controller have a weird feature of being able to
communicate with one of the peripherals via both available masters.)
So the master IDs order can differ from what is currently set by
default (for ACPI).

Anyway regarding the amount of the master I/F-es, yes, I failed to
find any platform with more than two masters synthesized in. But based
on the DW DMAC IP-core databook there can be up to four of them (see
the DMAH_NUM_MASTER_INT parameter).

>
> > On the contrary my implementation
> > seems a bit more coherent since it just changes the default slave IDs
> > defined in the dw_dma_acpi_filter() method and initialized in the
> > dw_dma_slave instance without adding slave-specific fields to the
> > generic controller data.
>

> The default enumeration for PCI + ACPI or pure ACPI devices is not
> changed with my patch, but actually makes it better (increases granularity).
> The defaults are platform specific and that's what driver_data is for.

Since it's a default setting for the particular controller then it
seems it would be better to signify that semantic in the fields name.
Moreover seeing it's a per-platform setup I would recomment to move
these fields to the dw_dma_platform_data structure instead.
(Please see my last comment regarding this.)

>
> While you like your solution, the problem with it that it doesn't cover
> different orders, so it's half-baked solution, I think. Mine doesn't
> change the status quo about integration (see above) and has better approach
> regarding different ordering.

Well, your solution doesn't cover the different order of the master
IDs either, because the IDs order is still fixed but on the per-controller
basis. Yes, in that regard your approach is bit more comprehensive,
but it still remains half-baked since, as you said yourself further,
it doesn't cover the cases of the non-default master IDs combination.

My solution doesn't change the status quo either, but merely fixes the
case which is currently incorrectly handled in the
dw_dma_acpi_filter() method. The rest remains the same.
(See further before responding to this comment.)

> Both implementations have a flaw regarding per-channel master configuration.

Right, none of our approaches provide a complete solution of the
problem with a per-peripheral device master IDs setup. Based on this and
what was said in the previous comments chunk, I would normally prefer to
choose a simpler, more localised, less invasive fix, which is provided
in my version of the change. That's why I started the discussion
in the first place.
(Please see my last comment before answering to this one.)

>
> > What seems like a much better alternative to the both approaches, is
> > to use the dw_dma_slave instance defined in the mrfld_spi_setup()
> > method for the Intel Merrifield SPI PXA2xx DMA-interface in
> > drivers/spi/spi-pxa2xx-pci.c. But AFAICT that data is left unused
> > since the DMA-engine handle and connection parameters are determined
> > by the channel name. Right? Is it possible to make use of the
> > filter-function specified to the dma_request_slave_channel_compat()
> > method?
>

> Unfortunately no, in ACPI case the only data we use is the name (index) of
> the channel in the respective resources. Everything else is done automatically.

Right, but AFAICS ACPI doesn't provide the complete settings in this
case. I thought about some combined solution: retrieve the DMAC
channel via the standard name/index-based approach and then pass the
dw_dma_slave settings via the custom filter method specified by the
client driver, thus making use of what is implemented in the
Merrifield SPI PXA2xx driver. Alas implementing this approach would
require to alter the generic DMA-engine core somehow.(

In anyway if you prefer your version of the fix, fine by me. I've
provided my reasoning above. If it wasn't enough to persuade you I
won't be insisting on my change anymore especially seeing its your and
Varesh duty to maintain the driver. But, again IMO, it seems to be
better to add the default_{m,p}_master/d{p,m}_master/etc fields to the
dw_dma_platform_data structure since the platform-specific controller
settings have been consolidated in there. The dw_dma_chip_pdata
structure looks as more like generic driver data storage.

-Serge(y)

>
> --
> With Best Regards,
> Andy Shevchenko
>
>