i2c: at91: use dma safe buffers
authorMichael Walle <michael@walle.cc>
Thu, 7 Apr 2022 15:08:28 +0000 (17:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:23:14 +0000 (10:23 +0200)
[ Upstream commit 03fbb903c8bf7e53e101e8d9a7b261264317c411 ]

The supplied buffer might be on the stack and we get the following error
message:
[    3.312058] at91_i2c e0070600.i2c: rejecting DMA map of vmalloc memory

Use i2c_{get,put}_dma_safe_msg_buf() to get a DMA-able memory region if
necessary.

Fixes: 60937b2cdbf9 ("i2c: at91: add dma support")
Signed-off-by: Michael Walle <michael@walle.cc>
Reviewed-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-at91-master.c

index b0eae94..5eca3b3 100644 (file)
@@ -656,6 +656,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
        unsigned int_addr_flag = 0;
        struct i2c_msg *m_start = msg;
        bool is_read;
+       u8 *dma_buf;
 
        dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num);
 
@@ -703,7 +704,17 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
        dev->msg = m_start;
        dev->recv_len_abort = false;
 
+       if (dev->use_dma) {
+               dma_buf = i2c_get_dma_safe_msg_buf(m_start, 1);
+               if (!dma_buf) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               dev->buf = dma_buf;
+       }
+
        ret = at91_do_twi_transfer(dev);
+       i2c_put_dma_safe_msg_buf(dma_buf, m_start, !ret);
 
        ret = (ret < 0) ? ret : num;
 out: