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

Reply via email to