[PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA

Thomas Weißschuh posted 2 patches 12 months ago
drivers/firmware/cirrus/cs_dsp.c | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
[PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Thomas Weißschuh 12 months ago
Also drop the bounce buffer in cs_dsp_coeff_write_ctrl_raw().

The bounce buffer in cs_dsp_coeff_write_ctrl_raw() could theoretically
also be removed. That would be a functional change as the output may be
modified in error cases.
As I don't know the driver very well I left that part out.

Not tested on real hardware.
This came up while porting kunit to mips64.
Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
cs_dsp is unnecessary in the first place.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
Thomas Weißschuh (2):
      firmware: cs_dsp: Remove usage of GFP_DMA
      firmware: cs_dsp: Remove bounce buffer in cs_dsp_coeff_write_ctrl_raw()

 drivers/firmware/cirrus/cs_dsp.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)
---
base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
change-id: 20250211-cs_dsp-gfp_dma-0581bdd09dd5

Best regards,
-- 
Thomas Weißschuh <thomas.weissschuh@linutronix.de>

Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Richard Fitzgerald 12 months ago
On 11/02/2025 5:03 pm, Thomas Weißschuh wrote:
> Also drop the bounce buffer in cs_dsp_coeff_write_ctrl_raw().
> 
> The bounce buffer in cs_dsp_coeff_write_ctrl_raw() could theoretically
> also be removed. That would be a functional change as the output may be
> modified in error cases.
> As I don't know the driver very well I left that part out.
> 
> Not tested on real hardware.
> This came up while porting kunit to mips64.
> Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
> cs_dsp is unnecessary in the first place.
> 

You're sure that all I2C and SPI bus controllers now handle non-DMA-safe
buffers correctly?

> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> ---
> Thomas Weißschuh (2):
>        firmware: cs_dsp: Remove usage of GFP_DMA
>        firmware: cs_dsp: Remove bounce buffer in cs_dsp_coeff_write_ctrl_raw()
> 
>   drivers/firmware/cirrus/cs_dsp.c | 15 +++------------
>   1 file changed, 3 insertions(+), 12 deletions(-)
> ---
> base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
> change-id: 20250211-cs_dsp-gfp_dma-0581bdd09dd5
> 
> Best regards,

Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Richard Fitzgerald 12 months ago
On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:
> On 11/02/2025 5:03 pm, Thomas Weißschuh wrote:
>> Also drop the bounce buffer in cs_dsp_coeff_write_ctrl_raw().
>>
>> The bounce buffer in cs_dsp_coeff_write_ctrl_raw() could theoretically
>> also be removed. That would be a functional change as the output may be
>> modified in error cases.
>> As I don't know the driver very well I left that part out.
>>
>> Not tested on real hardware.
>> This came up while porting kunit to mips64.
>> Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by

I would say that is a bug in mips64 that should be fixed in mips64.
It is not reasonable to expect generic drivers to have special cases for
platforms that don't handle GFP_DMA.


>> cs_dsp is unnecessary in the first place.
>>
> 
> You're sure that all I2C and SPI bus controllers now handle non-DMA-safe
> buffers correctly?
> 
I just tested this.

The spi kernel doc says this:

  * struct spi_transfer - a read/write buffer pair
  * @tx_buf: data to be written (DMA-safe memory), or NULL
  * @rx_buf: data to be read (DMA-safe memory), or NULL

On x86_64() a spi_write() fails with -EINVAL if I pass it a non-dma-safe
buffer of data. But it works if I pass it a buffer allocated with
GFP_DMA.

So I think it is a bad idea to remove GFP_DMA to workaround mips64.

>> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
>> ---
>> Thomas Weißschuh (2):
>>        firmware: cs_dsp: Remove usage of GFP_DMA
>>        firmware: cs_dsp: Remove bounce buffer in 
>> cs_dsp_coeff_write_ctrl_raw()
>>
>>   drivers/firmware/cirrus/cs_dsp.c | 15 +++------------
>>   1 file changed, 3 insertions(+), 12 deletions(-)
>> ---
>> base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
>> change-id: 20250211-cs_dsp-gfp_dma-0581bdd09dd5
>>
>> Best regards,
> 

Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Mark Brown 12 months ago
On Thu, Feb 13, 2025 at 02:28:06PM +0000, Richard Fitzgerald wrote:
> On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:

> > > Not tested on real hardware.
> > > This came up while porting kunit to mips64.
> > > Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by

> I would say that is a bug in mips64 that should be fixed in mips64.
> It is not reasonable to expect generic drivers to have special cases for
> platforms that don't handle GFP_DMA.

What specifically is the issue?  If it's a build time issue I'd
definitely agree that we should just be able to assume that platforms at
least build.  IIRC there is a Kconfig you can depend on for DMA but it
seems more trouble than it's worth to fix all users.
Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Thomas Weißschuh 12 months ago
On Thu, Feb 13, 2025 at 03:06:59PM +0000, Mark Brown wrote:
> On Thu, Feb 13, 2025 at 02:28:06PM +0000, Richard Fitzgerald wrote:
> > On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:
> 
> > > > Not tested on real hardware.
> > > > This came up while porting kunit to mips64.
> > > > Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
> 
> > I would say that is a bug in mips64 that should be fixed in mips64.
> > It is not reasonable to expect generic drivers to have special cases for
> > platforms that don't handle GFP_DMA.

Indeed, I did that, too.

> What specifically is the issue?  If it's a build time issue I'd
> definitely agree that we should just be able to assume that platforms at
> least build.  IIRC there is a Kconfig you can depend on for DMA but it
> seems more trouble than it's worth to fix all users.

More details in [0], It's only a runtime issue.

I'm still wondering how all the on-stack buffers used with regmap_raw_read()
and regmap_raw_write() by cs_dsp are satisfying the DMA requirements.

[0] https://lore.kernel.org/lkml/20250212-kunit-mips-v1-1-eb49c9d76615@linutronix.de/
Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Richard Fitzgerald 11 months, 3 weeks ago
On 13/02/2025 3:16 pm, Thomas Weißschuh wrote:
> On Thu, Feb 13, 2025 at 03:06:59PM +0000, Mark Brown wrote:
>> On Thu, Feb 13, 2025 at 02:28:06PM +0000, Richard Fitzgerald wrote:
>>> On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:
>>
>>>>> Not tested on real hardware.
>>>>> This came up while porting kunit to mips64.
>>>>> Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
>>
>>> I would say that is a bug in mips64 that should be fixed in mips64.
>>> It is not reasonable to expect generic drivers to have special cases for
>>> platforms that don't handle GFP_DMA.
> 
> Indeed, I did that, too.
> 
>> What specifically is the issue?  If it's a build time issue I'd
>> definitely agree that we should just be able to assume that platforms at
>> least build.  IIRC there is a Kconfig you can depend on for DMA but it
>> seems more trouble than it's worth to fix all users.
> 
> More details in [0], It's only a runtime issue.
> 
> I'm still wondering how all the on-stack buffers used with regmap_raw_read()
> and regmap_raw_write() by cs_dsp are satisfying the DMA requirements.
> 
There are 3 suspicious regmap_raw_read(). The others are all integers,
which are guaranteed not to cross a page boundary.

However, it looks like it might be safe to remove the GFP_DMA flags
now. regmap_raw_read() calls spi_write_then_read() which specifically
says that the buffers do not need to be DMA-safe and internally uses a
DMA-safe buffer. regmap_raw_write() uses either a temporary physically
contiguous buffer or GFP_DMA buffer (the implementation is terrifyingly
complex so it's difficult to determine exactly what it does).

(Some older systems could only use certain special memory areas for DMA
but we haven't seen any of those used with cs_dsp.)


> [0] https://lore.kernel.org/lkml/20250212-kunit-mips-v1-1-eb49c9d76615@linutronix.de/

Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Charles Keepax 11 months, 3 weeks ago
On Wed, Feb 19, 2025 at 04:26:55PM +0000, Richard Fitzgerald wrote:
> On 13/02/2025 3:16 pm, Thomas Weißschuh wrote:
> > On Thu, Feb 13, 2025 at 03:06:59PM +0000, Mark Brown wrote:
> > > On Thu, Feb 13, 2025 at 02:28:06PM +0000, Richard Fitzgerald wrote:
> > > > On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:
> > > 
> > > > > > Not tested on real hardware.
> > > > > > This came up while porting kunit to mips64.
> > > > > > Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
> > > 
> > > > I would say that is a bug in mips64 that should be fixed in mips64.
> > > > It is not reasonable to expect generic drivers to have special cases for
> > > > platforms that don't handle GFP_DMA.
> > 
> > Indeed, I did that, too.
> > 
> > > What specifically is the issue?  If it's a build time issue I'd
> > > definitely agree that we should just be able to assume that platforms at
> > > least build.  IIRC there is a Kconfig you can depend on for DMA but it
> > > seems more trouble than it's worth to fix all users.
> > 
> > More details in [0], It's only a runtime issue.
> > 
> > I'm still wondering how all the on-stack buffers used with regmap_raw_read()
> > and regmap_raw_write() by cs_dsp are satisfying the DMA requirements.
> > 
> There are 3 suspicious regmap_raw_read(). The others are all integers,
> which are guaranteed not to cross a page boundary.
> 
> However, it looks like it might be safe to remove the GFP_DMA flags
> now. regmap_raw_read() calls spi_write_then_read() which specifically
> says that the buffers do not need to be DMA-safe and internally uses a
> DMA-safe buffer. regmap_raw_write() uses either a temporary physically
> contiguous buffer or GFP_DMA buffer (the implementation is terrifyingly
> complex so it's difficult to determine exactly what it does).
> 
> (Some older systems could only use certain special memory areas for DMA
> but we haven't seen any of those used with cs_dsp.)
> 

We also need to consider what the I2C subsystem does, I have a
vague memory of thinking the SPI system will attempt to remap
buffers but I2C will just use them as is. cs_dsp will be used
with both, although SPI is slightly more common for obvious
reasons.

Thanks,
Charles
Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Richard Fitzgerald 11 months, 3 weeks ago
On 20/02/2025 9:52 am, Charles Keepax wrote:
> On Wed, Feb 19, 2025 at 04:26:55PM +0000, Richard Fitzgerald wrote:
>> On 13/02/2025 3:16 pm, Thomas Weißschuh wrote:
>>> On Thu, Feb 13, 2025 at 03:06:59PM +0000, Mark Brown wrote:
>>>> On Thu, Feb 13, 2025 at 02:28:06PM +0000, Richard Fitzgerald wrote:
>>>>> On 11/02/2025 5:21 pm, Richard Fitzgerald wrote:
>>>>
>>>>>>> Not tested on real hardware.
>>>>>>> This came up while porting kunit to mips64.
>>>>>>> Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
>>>>
>>>>> I would say that is a bug in mips64 that should be fixed in mips64.
>>>>> It is not reasonable to expect generic drivers to have special cases for
>>>>> platforms that don't handle GFP_DMA.
>>>
>>> Indeed, I did that, too.
>>>
>>>> What specifically is the issue?  If it's a build time issue I'd
>>>> definitely agree that we should just be able to assume that platforms at
>>>> least build.  IIRC there is a Kconfig you can depend on for DMA but it
>>>> seems more trouble than it's worth to fix all users.
>>>
>>> More details in [0], It's only a runtime issue.
>>>
>>> I'm still wondering how all the on-stack buffers used with regmap_raw_read()
>>> and regmap_raw_write() by cs_dsp are satisfying the DMA requirements.
>>>
>> There are 3 suspicious regmap_raw_read(). The others are all integers,
>> which are guaranteed not to cross a page boundary.
>>
>> However, it looks like it might be safe to remove the GFP_DMA flags
>> now. regmap_raw_read() calls spi_write_then_read() which specifically
>> says that the buffers do not need to be DMA-safe and internally uses a
>> DMA-safe buffer. regmap_raw_write() uses either a temporary physically
>> contiguous buffer or GFP_DMA buffer (the implementation is terrifyingly
>> complex so it's difficult to determine exactly what it does).
>>
>> (Some older systems could only use certain special memory areas for DMA
>> but we haven't seen any of those used with cs_dsp.)
>>
> 
> We also need to consider what the I2C subsystem does, I have a
> vague memory of thinking the SPI system will attempt to remap
> buffers but I2C will just use them as is. cs_dsp will be used
> with both, although SPI is slightly more common for obvious
> reasons.
> 
> Thanks,
> Charles

For information here is the presentation given by Wolfram Sang
describing the DMA problem. This is the reason we used GFP_DMA buffers
in the cs_dsp code.

https://events19.linuxfoundation.org/wp-content/uploads/2017/12/20181023-Wolfram-Sang-ELCE18-safe_dma_buffers.pdf

Re: [PATCH 0/2] firmware: cs_dsp: Remove usage of GFP_DMA
Posted by Thomas Weißschuh 12 months ago
On Tue, Feb 11, 2025 at 05:21:08PM +0000, Richard Fitzgerald wrote:
> On 11/02/2025 5:03 pm, Thomas Weißschuh wrote:
> > Also drop the bounce buffer in cs_dsp_coeff_write_ctrl_raw().
> > 
> > The bounce buffer in cs_dsp_coeff_write_ctrl_raw() could theoretically
> > also be removed. That would be a functional change as the output may be
> > modified in error cases.
> > As I don't know the driver very well I left that part out.
> > 
> > Not tested on real hardware.
> > This came up while porting kunit to mips64.
> > Apparently GFP_DMA does not work there, but IMO the usage of GFP_DMA by
> > cs_dsp is unnecessary in the first place.
> > 
> 
> You're sure that all I2C and SPI bus controllers now handle non-DMA-safe
> buffers correctly?

No, but as mentioned in patch 1, many transfers are done from and to
on-stack buffers and these seem to work.
Anyways, I fixed the DMA zone issue on MIPS in general [0],
feel free to disregard the series.

[0] https://lore.kernel.org/r/20250212-kunit-mips-v1-0-eb49c9d76615@linutronix.de
(lore is broken right now, so it will take some time to show up)

> > Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> > ---
> > Thomas Weißschuh (2):
> >        firmware: cs_dsp: Remove usage of GFP_DMA
> >        firmware: cs_dsp: Remove bounce buffer in cs_dsp_coeff_write_ctrl_raw()
> > 
> >   drivers/firmware/cirrus/cs_dsp.c | 15 +++------------
> >   1 file changed, 3 insertions(+), 12 deletions(-)
> > ---
> > base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
> > change-id: 20250211-cs_dsp-gfp_dma-0581bdd09dd5
> > 
> > Best regards,
>