On Mon, Mar 1, 2021 at 1:10 PM Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > On Mon, Mar 01, 2021 at 02:09:25PM +0200, Andy Shevchenko wrote: > > On Mon, Mar 01, 2021 at 05:24:41PM +0530, Viresh Kumar wrote: > > > On 01-03-21, 14:41, Jie Deng wrote: > > > > +/** > > > > + * struct virtio_i2c_req - the virtio I2C request structure > > > > + * @out_hdr: the OUT header of the virtio I2C message > > > > + * @write_buf: contains one I2C segment being written to the device > > > > + * @read_buf: contains one I2C segment being read from the device > > > > + * @in_hdr: the IN header of the virtio I2C message > > > > + */ > > > > +struct virtio_i2c_req { > > > > + struct virtio_i2c_out_hdr out_hdr; > > > > + u8 *write_buf; > > > > + u8 *read_buf; > > > > + struct virtio_i2c_in_hdr in_hdr; > > > > +}; > > > > > > I am not able to appreciate the use of write/read bufs here as we > > > aren't trying to read/write data in the same transaction. Why do we > > > have two bufs here as well as in specs ? > > > > I涎 and SMBus support bidirectional transfers as well. I think two buffers is > > the right thing to do. > > Strictly speaking "half duplex". But the driver does not support this at all: the sglist always has three members as Viresh says: outhdr, msgbuf and inhdr. It then uses a bounce buffer for the actual data transfer, and this always goes either one way or the other. I think the more important question is: does this driver actually need the bounce buffer? It doesn't have to worry about adjacent stack data being clobbered by cache maintenance because virtio is always cache coherent and, so I suspect the bounce buffer can be left out. It might actually be simpler to just have a fixed-length array of headers on the stack and at most the corresponding number of transfers for one virtqueue_kick(). Is there a reasonable limit on how many transfers we would expect to handle at once? I see that most callers of i2c_transfer() hardcode the number to '1' or '2', rarely '3' or '4', while the proposed implementation seems to be optimized for much larger numbers. Arnd