xref: /qemu/include/hw/i2c/pm_smbus.h (revision 2bf40d08)
1 #ifndef PM_SMBUS_H
2 #define PM_SMBUS_H
3 
4 #include "exec/memory.h"
5 #include "hw/i2c/smbus_master.h"
6 
7 #define PM_SMBUS_MAX_MSG_SIZE 32
8 
9 typedef struct PMSMBus {
10     I2CBus *smbus;
11     MemoryRegion io;
12 
13     uint8_t smb_stat;
14     uint8_t smb_ctl;
15     uint8_t smb_cmd;
16     uint8_t smb_addr;
17     uint8_t smb_data0;
18     uint8_t smb_data1;
19     uint8_t smb_data[PM_SMBUS_MAX_MSG_SIZE];
20     uint8_t smb_blkdata;
21     uint8_t smb_auxctl;
22     uint32_t smb_index;
23 
24     /* Set by pm_smbus.c */
25     void (*reset)(struct PMSMBus *s);
26 
27     /* Set by the user. */
28     bool i2c_enable;
29     void (*set_irq)(struct PMSMBus *s, bool enabled);
30     void *opaque;
31 
32     /* Internally used by pm_smbus. */
33 
34     /* Set on block transfers after the last byte has been read, so the
35        INTR bit can be set at the right time. */
36     bool op_done;
37 
38     /* Set during an I2C block read, so we know how to handle data. */
39     bool in_i2c_block_read;
40 
41     /* Used to work around a bug in AMIBIOS, see smb_transaction_start() */
42     bool start_transaction_on_status_read;
43 } PMSMBus;
44 
45 void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk);
46 
47 /*
48  * For backwards compatibility on migration, older versions don't have
49  * working migration for pm_smbus, this lets us ignore the migrations
50  * for older machine versions.
51  */
52 bool pm_smbus_vmstate_needed(void);
53 
54 extern const VMStateDescription pmsmb_vmstate;
55 
56 #endif /* PM_SMBUS_H */
57