Re: [RFC PATCH v4 3/6] i2c: add docs to clarify DMA handling
From: Wolfram Sang <hidden>
Date: 2017-09-08 08:56:47
Also in:
dri-devel, linux-i2c, linux-iio, linux-media, linux-renesas-soc, lkml
Hi Mauro, thanks for your comments. Much appreciated!
There are also a couple of things here that Sphinx would complain. So, it could be worth to rename it to *.rst, while you're writing it, and see what: make htmldocs will complain and how it will look in html.
OK, I'll check that.
quoted
+Given that I2C is a low-speed bus where largely small messages are transferred, +it is not considered a prime user of DMA access. At this time of writing, only +10% of I2C bus master drivers have DMA support implemented.Are you sure about that? I'd say that, on media, at least half of the drivers use DMA for I2C bus access, as the I2C bus is on a remote board that talks with CPU via USB, using DMA, and all communication with USB should be DMA-safe.
Well, the DMA-safe requirement comes then from the USB subsystem, doesn't it? Or do you really use DMA on the remote board to transfer data via I2C to an I2C client?
I guess what you really wanted to say on most of this section is about SoC (and other CPUs) where the I2C bus master is is at the mainboard, and not on some peripheral.
I might be biased to that, yes. So, it is good talking about it.
quoted
And the vast +majority of transactions are so small that setting up DMA for it will likely +add more overhead than a plain PIO transfer. + +Therefore, it is *not* mandatory that the buffer of an I2C message is DMA safe.Again, that may not be true on media boards. The code that implements the I2C transfers there, on most boards, have to be DMA safe, as it won't otherwise send/receive commands from the chips that are after the USB bridge.
That still sounds to me like the DMA-safe requirement comes from USB (which is fine, of course.). In any case, a sentence like "Other subsystem you might use for bridging I2C might impose other DMA requirements" sounds like to nice to have.
quoted
+Drivers wishing to implement DMA can use helper functions from the I2C core. +One gives you a DMA-safe buffer for a given i2c_msg as long as a certain +threshold is met. + + dma_buf = i2c_get_dma_safe_msg_buf(msg, threshold_in_byte);I'm concerned about the new bits added by this call. Right now, USB drivers just use kalloc() for transfer buffers used to send and receive URB control messages for both setting the main device and for I2C messages. Before this changeset, buffers allocated this way are DMA save and have been working for years.
Can you give me a pointer to a driver doing this? I glimpsed around in drivers/media/usb and found that most drivers are having their i2c_msg buffers on the stack. Which is clearly not DMA-safe.
When you add some flags that would make the I2C subsystem aware that a buffer is now DMA safe, I guess you could be breaking those drivers, as a DMA safe buffer will now be considered as DMA-unsafe.
Well, this flag is only relevant for i2c master drivers wishing to do DMA. So, grepping in the above directory grep dma $(grep -rl i2c_add_adapter *) only gives one driver which is irrelevant because the i2c master it registers is not doing any DMA? Am I missing something? We are clearly not aligned yet... Regards, Wolfram