10d09e41aSPaolo Bonzini #ifndef PM_SMBUS_H 20d09e41aSPaolo Bonzini #define PM_SMBUS_H 30d09e41aSPaolo Bonzini 4*d4842052SMarkus Armbruster #include "exec/memory.h" 593198b6cSCorey Minyard #include "hw/i2c/smbus_master.h" 693198b6cSCorey Minyard 738ad4faeSCorey Minyard #define PM_SMBUS_MAX_MSG_SIZE 32 838ad4faeSCorey Minyard 90d09e41aSPaolo Bonzini typedef struct PMSMBus { 10a5c82852SAndreas Färber I2CBus *smbus; 110d09e41aSPaolo Bonzini MemoryRegion io; 120d09e41aSPaolo Bonzini 130d09e41aSPaolo Bonzini uint8_t smb_stat; 140d09e41aSPaolo Bonzini uint8_t smb_ctl; 150d09e41aSPaolo Bonzini uint8_t smb_cmd; 160d09e41aSPaolo Bonzini uint8_t smb_addr; 170d09e41aSPaolo Bonzini uint8_t smb_data0; 180d09e41aSPaolo Bonzini uint8_t smb_data1; 1938ad4faeSCorey Minyard uint8_t smb_data[PM_SMBUS_MAX_MSG_SIZE]; 2038ad4faeSCorey Minyard uint8_t smb_blkdata; 2138ad4faeSCorey Minyard uint8_t smb_auxctl; 2238ad4faeSCorey Minyard uint32_t smb_index; 2338ad4faeSCorey Minyard 2438ad4faeSCorey Minyard /* Set by pm_smbus.c */ 2538ad4faeSCorey Minyard void (*reset)(struct PMSMBus *s); 2638ad4faeSCorey Minyard 2738ad4faeSCorey Minyard /* Set by the user. */ 2838ad4faeSCorey Minyard bool i2c_enable; 29e724385aSCorey Minyard void (*set_irq)(struct PMSMBus *s, bool enabled); 30e724385aSCorey Minyard void *opaque; 3138ad4faeSCorey Minyard 3238ad4faeSCorey Minyard /* Internally used by pm_smbus. */ 3338ad4faeSCorey Minyard 3438ad4faeSCorey Minyard /* Set on block transfers after the last byte has been read, so the 3538ad4faeSCorey Minyard INTR bit can be set at the right time. */ 3638ad4faeSCorey Minyard bool op_done; 3752cc6a49SCorey Minyard 3852cc6a49SCorey Minyard /* Set during an I2C block read, so we know how to handle data. */ 3952cc6a49SCorey Minyard bool in_i2c_block_read; 4052cc6a49SCorey Minyard 4152cc6a49SCorey Minyard /* Used to work around a bug in AMIBIOS, see smb_transaction_start() */ 4252cc6a49SCorey Minyard bool start_transaction_on_status_read; 430d09e41aSPaolo Bonzini } PMSMBus; 440d09e41aSPaolo Bonzini 4545726b6eSCorey Minyard void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk); 460d09e41aSPaolo Bonzini 474ab2f2a8SCorey Minyard /* 484ab2f2a8SCorey Minyard * For backwards compatibility on migration, older versions don't have 494ab2f2a8SCorey Minyard * working migration for pm_smbus, this lets us ignore the migrations 504ab2f2a8SCorey Minyard * for older machine versions. 514ab2f2a8SCorey Minyard */ 524ab2f2a8SCorey Minyard bool pm_smbus_vmstate_needed(void); 534ab2f2a8SCorey Minyard 544ab2f2a8SCorey Minyard extern const VMStateDescription pmsmb_vmstate; 554ab2f2a8SCorey Minyard 56175de524SMarkus Armbruster #endif /* PM_SMBUS_H */ 57