On Tue, 7 Jul 2026 at 00:01, Titus Rwantare <[email protected]> wrote: > > From: titusr <[email protected]> > > The 32 byte payload was raised to 255 for block reads in the SMBus 3.0 > specification. SMBus does not provide a way for devices to declare which > version of the spec they are designed to so we must allow newer devices > to return as much data as they allow. > > Specification: https://smbus.org/specs/SMBus_3_3_20240512.pdf > > > 6.5.7 Block Write/Read > The Block Write begins with a slave address and a write condition. After the > command code the host issues a byte count which describes how many more bytes > will follow in the message. If a slave has 20 bytes to send, the byte count > field will have the value 20 (14h), followed by the 20 bytes of data. The > byte count does not include the PEC byte. The byte count may be 0. A Block > Read or Block Write is allowed to transfer a maximum of 255 data bytes. > > Signed-off-by: Titus Rwantare <[email protected]> > --- > hw/i2c/smbus_slave.c | 4 ++-- > include/hw/i2c/smbus_slave.h | 2 +- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/hw/i2c/smbus_slave.c b/hw/i2c/smbus_slave.c > index cfb61c879e..407a118d24 100644 > --- a/hw/i2c/smbus_slave.c > +++ b/hw/i2c/smbus_slave.c > @@ -217,8 +217,8 @@ bool smbus_vmstate_needed(SMBusDevice *dev) > > const VMStateDescription vmstate_smbus_device = { > .name = TYPE_SMBUS_DEVICE, > - .version_id = 1, > - .minimum_version_id = 1, > + .version_id = 2, > + .minimum_version_id = 2, > .fields = (const VMStateField[]) { > VMSTATE_I2C_SLAVE(i2c, SMBusDevice), > VMSTATE_INT32(mode, SMBusDevice), > diff --git a/include/hw/i2c/smbus_slave.h b/include/hw/i2c/smbus_slave.h > index 86bfe0a79e..59522ff1b1 100644 > --- a/include/hw/i2c/smbus_slave.h > +++ b/include/hw/i2c/smbus_slave.h > @@ -64,7 +64,7 @@ struct SMBusDeviceClass { > uint8_t (*receive_byte)(SMBusDevice *dev); > }; > > -#define SMBUS_DATA_MAX_LEN 34 /* command + len + 32 bytes of data. */ > +#define SMBUS_DATA_MAX_LEN 257 /* command + len + 255 bytes of data. */
This is a migration compatibility break, and you can use this with machines like q35 where we care about migration compat (e.g. via the smbus-impi device creatable on the command line), so we need to do this in a way that maintains migration compat from older versions of QEMU, I'm afraid. thanks -- PMM
