From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
To: Brendan Higgins <brendanhiggins@google.com>
Cc: Wolfram Sang <wsa@the-dreams.de>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Joel Stanley <joel@jms.id.au>, Rob Herring <robh+dt@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Andrew Jeffery <andrew@aj.id.au>, Tao Ren <taoren@fb.com>,
Cedric Le Goater <clg@kaod.org>,
Linux I2C <linux-i2c@vger.kernel.org>,
devicetree <devicetree@vger.kernel.org>,
linux-aspeed <linux-aspeed@lists.ozlabs.org>,
OpenBMC Maillist <openbmc@lists.ozlabs.org>
Subject: Re: [PATCH v4 4/4] i2c: aspeed: add DMA mode transfer support
Date: Wed, 19 May 2021 11:38:56 -0700 [thread overview]
Message-ID: <6ab00810-d99e-fcd8-091c-0961ae82f0ed@linux.intel.com> (raw)
In-Reply-To: <685d21f9-2f9d-c0ae-ee77-10eb4441870c@linux.intel.com>
Hi Brendan,
On 4/14/2021 8:08 AM, Jae Hyun Yoo wrote:
[....]
>>> @@ -581,42 +660,55 @@ aspeed_i2c_master_handle_tx_first(struct
>>> aspeed_i2c_bus *bus,
>>> {
>>> u32 command = 0;
>>>
>>> - if (bus->buf_base) {
>>> - u8 wbuf[4];
>>> + if (bus->dma_buf || bus->buf_base) {
>>> int len;
>>> - int i;
>>>
>>> if (msg->len - bus->buf_index > bus->buf_size)
>>> len = bus->buf_size;
>>> else
>>> len = msg->len - bus->buf_index;
>>>
>>> - command |= ASPEED_I2CD_TX_BUFF_ENABLE;
>>> + if (bus->dma_buf) {
>>> + command |= ASPEED_I2CD_TX_DMA_ENABLE;
>>>
>>> - if (msg->len - bus->buf_index > bus->buf_size)
>>> - len = bus->buf_size;
>>> - else
>>> - len = msg->len - bus->buf_index;
>>> + memcpy(bus->dma_buf, msg->buf +
>>> bus->buf_index, len);
>>>
>>> - /*
>>> - * Looks bad here again but use dword writings to
>>> avoid data
>>> - * corruption of byte writing on remapped I2C SRAM.
>>> - */
>>> - for (i = 0; i < len; i++) {
>>> - wbuf[i % 4] = msg->buf[bus->buf_index + i];
>>> - if (i % 4 == 3)
>>> + writel(bus->dma_handle &
>>> ASPEED_I2CD_DMA_ADDR_MASK,
>>> + bus->base + ASPEED_I2C_DMA_ADDR_REG);
>>> + writel(FIELD_PREP(ASPEED_I2CD_DMA_LEN_MASK,
>>> len),
>>> + bus->base + ASPEED_I2C_DMA_LEN_REG);
>>> + bus->dma_len = len;
>>> + } else {
>>> + u8 wbuf[4];
>>> + int i;
>>> +
>>> + command |= ASPEED_I2CD_TX_BUFF_ENABLE;
>>> +
>>> + if (msg->len - bus->buf_index > bus->buf_size)
>>> + len = bus->buf_size;
>>> + else
>>> + len = msg->len - bus->buf_index;
>>> +
>>> + /*
>>> + * Looks bad here again but use dword
>>> writings to avoid
>>> + * data corruption of byte writing on
>>> remapped I2C SRAM.
>>> + */
>>> + for (i = 0; i < len; i++) {
>>> + wbuf[i % 4] = msg->buf[bus->buf_index
>>> + i];
>>> + if (i % 4 == 3)
>>> + writel(*(u32 *)wbuf,
>>> + bus->buf_base + i - 3);
>>> + }
>>> + if (--i % 4 != 3)
>>> writel(*(u32 *)wbuf,
>>> - bus->buf_base + i - 3);
>>> - }
>>> - if (--i % 4 != 3)
>>> - writel(*(u32 *)wbuf,
>>> - bus->buf_base + i - (i % 4));
>>> + bus->buf_base + i - (i % 4));
>>>
>>> - writel(FIELD_PREP(ASPEED_I2CD_BUF_TX_COUNT_MASK,
>>> - len - 1) |
>>> - FIELD_PREP(ASPEED_I2CD_BUF_OFFSET_MASK,
>>> - bus->buf_offset),
>>> - bus->base + ASPEED_I2C_BUF_CTRL_REG);
>>> + writel(FIELD_PREP(ASPEED_I2CD_BUF_TX_COUNT_MASK,
>>> + len - 1) |
>>> + FIELD_PREP(ASPEED_I2CD_BUF_OFFSET_MASK,
>>> + bus->buf_offset),
>>> + bus->base + ASPEED_I2C_BUF_CTRL_REG);
>>> + }
>>>
>>> bus->buf_index += len;
>>> } else {
>>
>> Some of these functions are getting really complex and most of the
>> logic for the different modes is in different if-else blocks. Could
>> you look into splitting this into separate functions based on which
>> mode is being used?
>>
>> Otherwise, this patch looks good.
>
> I already splitted some big chunk of mode dependant logics to address
> your comment on v1. Could you please check again the patched result of
> this function? It's not much complex and it'd be better keep as is for
> consistency in other changes in this patch. I think, splitting it again
> would be not good for readability of the code flow.
>
> Thanks,
> Jae
>
This is the patched result of this function:
static inline u32
aspeed_i2c_master_handle_tx_first(struct aspeed_i2c_bus *bus,
struct i2c_msg *msg)
{
u32 command = 0;
if (bus->dma_buf || bus->buf_base) {
int len;
if (msg->len - bus->buf_index > bus->buf_size)
len = bus->buf_size;
else
len = msg->len - bus->buf_index;
if (bus->dma_buf) {
command |= ASPEED_I2CD_TX_DMA_ENABLE;
memcpy(bus->dma_buf, msg->buf + bus->buf_index, len);
writel(bus->dma_handle & ASPEED_I2CD_DMA_ADDR_MASK,
bus->base + ASPEED_I2C_DMA_ADDR_REG);
writel(FIELD_PREP(ASPEED_I2CD_DMA_LEN_MASK, len),
bus->base + ASPEED_I2C_DMA_LEN_REG);
bus->dma_len = len;
} else {
u8 wbuf[4];
int i;
command |= ASPEED_I2CD_TX_BUFF_ENABLE;
if (msg->len - bus->buf_index > bus->buf_size)
len = bus->buf_size;
else
len = msg->len - bus->buf_index;
for (i = 0; i < len; i++) {
wbuf[i % 4] = msg->buf[bus->buf_index + i];
if (i % 4 == 3)
writel(*(u32 *)wbuf,
bus->buf_base + i - 3);
}
if (--i % 4 != 3)
writel(*(u32 *)wbuf,
bus->buf_base + i - (i % 4));
writel(FIELD_PREP(ASPEED_I2CD_BUF_TX_COUNT_MASK,
len - 1) |
FIELD_PREP(ASPEED_I2CD_BUF_OFFSET_MASK,
bus->buf_offset),
bus->base + ASPEED_I2C_BUF_CTRL_REG);
}
bus->buf_index += len;
} else {
writel(msg->buf[bus->buf_index++],
bus->base + ASPEED_I2C_BYTE_BUF_REG);
}
return command;
}
Do you still think that it should be split into separate functions per
each transfer mode?
Thanks,
Jae
[....]
next prev parent reply other threads:[~2021-05-19 18:39 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-24 19:17 [PATCH v4 0/4] i2c: aspeed: Add buffer and DMA modes support Jae Hyun Yoo
2021-02-24 19:17 ` [PATCH v4 1/4] dt-bindings: i2c: aspeed: add transfer mode support Jae Hyun Yoo
2021-03-06 20:30 ` Rob Herring
2021-03-09 17:02 ` Jae Hyun Yoo
2021-03-10 2:15 ` Rob Herring
2021-03-10 15:55 ` Jae Hyun Yoo
2021-04-08 17:50 ` Jae Hyun Yoo
2021-04-13 19:50 ` Brendan Higgins
2021-10-01 17:05 ` Jae Hyun Yoo
2021-02-24 19:17 ` [PATCH v4 2/4] ARM: dts: aspeed: modify I2C node to support buffer mode Jae Hyun Yoo
2021-02-24 19:17 ` [PATCH v4 3/4] i2c: aspeed: add buffer mode transfer support Jae Hyun Yoo
2021-04-13 21:24 ` Brendan Higgins
2021-02-24 19:17 ` [PATCH v4 4/4] i2c: aspeed: add DMA " Jae Hyun Yoo
2021-04-13 21:32 ` Brendan Higgins
2021-04-14 15:08 ` Jae Hyun Yoo
2021-05-19 18:38 ` Jae Hyun Yoo [this message]
2021-09-30 2:44 ` [PATCH v4 0/4] i2c: aspeed: Add buffer and DMA modes support Zev Weiss
2021-10-01 17:06 ` Jae Hyun Yoo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6ab00810-d99e-fcd8-091c-0961ae82f0ed@linux.intel.com \
--to=jae.hyun.yoo@linux.intel.com \
--cc=andrew@aj.id.au \
--cc=benh@kernel.crashing.org \
--cc=brendanhiggins@google.com \
--cc=clg@kaod.org \
--cc=devicetree@vger.kernel.org \
--cc=joel@jms.id.au \
--cc=linux-aspeed@lists.ozlabs.org \
--cc=linux-i2c@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=openbmc@lists.ozlabs.org \
--cc=robh+dt@kernel.org \
--cc=taoren@fb.com \
--cc=wsa@the-dreams.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).