xref: /openbmc/qemu/include/hw/i2c/pm_smbus.h (revision afd76053)
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