lkml.org 
[lkml]   [2018]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] Input: elants_i2c - Use DMA safe i2c when possible
On Wed, Oct 10, 2018 at 09:55:17AM -0700, Stephen Boyd wrote:
> This irq handler is always reading bytes from the device into a
> kmalloced buffer, so it's safe to mark this transaction as DMA safe.
> This avoids bouncing the buffer when an i2c controller decides to use
> DMA for a transaction.
>
> Cc: Wolfram Sang <wsa@the-dreams.de>
> Signed-off-by: Stephen Boyd <swboyd@chromium.org>

No, the buffer is in kmalloc()ed memory, but it is not DMA safe, as it
it not guaranteed to be aligned on cache line size. If you want to do
DMA to it, you need to change:

struct elants_data {

...
u8 buf[MAX_PACKET_SIZE] ____cacheline_aligned;
};

i.e. mark it ____cacheline_aligned and move it to the very end (or mark
the next element in the structure cacheline aligned as well).

Otherwise DMA might smash nearby fileds in this structire.

> ---
> drivers/input/touchscreen/elants_i2c.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index d21ca39b0fdb..be44abb8de33 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -863,7 +863,7 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
> int i;
> int len;
>
> - len = i2c_master_recv(client, ts->buf, sizeof(ts->buf));
> + len = i2c_master_recv_dmasafe(client, ts->buf, sizeof(ts->buf));
> if (len < 0) {
> dev_err(&client->dev, "%s: failed to read data: %d\n",
> __func__, len);
> --
> Sent by a computer through tubes
>

Thanks.

--
Dmitry

\
 
 \ /
  Last update: 2018-10-10 19:08    [W:0.045 / U:0.020 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site