xref: /openbmc/qemu/include/hw/scsi/esp.h (revision 62357c047a5abc6ede992159ed7c0aaaeb50617a)
10d09e41aSPaolo Bonzini #ifndef QEMU_HW_ESP_H
20d09e41aSPaolo Bonzini #define QEMU_HW_ESP_H
30d09e41aSPaolo Bonzini 
40d09e41aSPaolo Bonzini #include "hw/scsi/scsi.h"
51b13a60cSMark Cave-Ayland #include "hw/sysbus.h"
6042879fcSMark Cave-Ayland #include "qemu/fifo8.h"
7db1015e9SEduardo Habkost #include "qom/object.h"
80d09e41aSPaolo Bonzini 
90d09e41aSPaolo Bonzini /* esp.c */
100d09e41aSPaolo Bonzini #define ESP_MAX_DEVS 7
110d09e41aSPaolo Bonzini typedef void (*ESPDMAMemoryReadWriteFunc)(void *opaque, uint8_t *buf, int len);
120d09e41aSPaolo Bonzini 
130d09e41aSPaolo Bonzini #define ESP_REGS 16
14042879fcSMark Cave-Ayland #define ESP_FIFO_SZ 16
15023666daSMark Cave-Ayland #define ESP_CMDFIFO_SZ 32
160d09e41aSPaolo Bonzini 
170d09e41aSPaolo Bonzini typedef struct ESPState ESPState;
180d09e41aSPaolo Bonzini 
19eb169c76SMark Cave-Ayland #define TYPE_ESP "esp"
20eb169c76SMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(ESPState, ESP)
21eb169c76SMark Cave-Ayland 
220d09e41aSPaolo Bonzini struct ESPState {
23eb169c76SMark Cave-Ayland     DeviceState parent_obj;
24eb169c76SMark Cave-Ayland 
250d09e41aSPaolo Bonzini     uint8_t rregs[ESP_REGS];
260d09e41aSPaolo Bonzini     uint8_t wregs[ESP_REGS];
270d09e41aSPaolo Bonzini     qemu_irq irq;
286dec7c0dSMark Cave-Ayland     qemu_irq drq_irq;
29*442de89aSMark Cave-Ayland     bool drq_state;
300d09e41aSPaolo Bonzini     uint8_t chip_id;
31c9cf45c1SHannes Reinecke     bool tchi_written;
320d09e41aSPaolo Bonzini     int32_t ti_size;
330d09e41aSPaolo Bonzini     uint32_t status;
340d09e41aSPaolo Bonzini     uint32_t dma;
35042879fcSMark Cave-Ayland     Fifo8 fifo;
360d09e41aSPaolo Bonzini     SCSIBus bus;
370d09e41aSPaolo Bonzini     SCSIDevice *current_dev;
380d09e41aSPaolo Bonzini     SCSIRequest *current_req;
39023666daSMark Cave-Ayland     Fifo8 cmdfifo;
40023666daSMark Cave-Ayland     uint8_t cmdfifo_cdb_offset;
414eb86065SPaolo Bonzini     uint8_t lun;
420d09e41aSPaolo Bonzini     uint32_t do_cmd;
430d09e41aSPaolo Bonzini 
448dded6deSMark Cave-Ayland     bool data_ready;
450d09e41aSPaolo Bonzini     int dma_enabled;
460d09e41aSPaolo Bonzini 
470d09e41aSPaolo Bonzini     uint32_t async_len;
480d09e41aSPaolo Bonzini     uint8_t *async_buf;
490d09e41aSPaolo Bonzini 
500d09e41aSPaolo Bonzini     ESPDMAMemoryReadWriteFunc dma_memory_read;
510d09e41aSPaolo Bonzini     ESPDMAMemoryReadWriteFunc dma_memory_write;
520d09e41aSPaolo Bonzini     void *dma_opaque;
530d09e41aSPaolo Bonzini     void (*dma_cb)(ESPState *s);
540bd005beSMark Cave-Ayland 
550bd005beSMark Cave-Ayland     uint8_t mig_version_id;
566cc88d6bSMark Cave-Ayland 
576cc88d6bSMark Cave-Ayland     /* Legacy fields for vmstate_esp version < 5 */
586cc88d6bSMark Cave-Ayland     uint32_t mig_dma_left;
594aaa6ac3SMark Cave-Ayland     uint32_t mig_deferred_status;
604aaa6ac3SMark Cave-Ayland     bool mig_deferred_complete;
61042879fcSMark Cave-Ayland     uint32_t mig_ti_rptr, mig_ti_wptr;
62042879fcSMark Cave-Ayland     uint8_t mig_ti_buf[ESP_FIFO_SZ];
63023666daSMark Cave-Ayland     uint8_t mig_cmdbuf[ESP_CMDFIFO_SZ];
64023666daSMark Cave-Ayland     uint32_t mig_cmdlen;
6582003450SMark Cave-Ayland 
6682003450SMark Cave-Ayland     uint8_t mig_ti_cmd;
670d09e41aSPaolo Bonzini };
680d09e41aSPaolo Bonzini 
6984fbefedSMark Cave-Ayland #define TYPE_SYSBUS_ESP "sysbus-esp"
7084fbefedSMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(SysBusESPState, SYSBUS_ESP)
711b13a60cSMark Cave-Ayland 
72db1015e9SEduardo Habkost struct SysBusESPState {
731b13a60cSMark Cave-Ayland     /*< private >*/
741b13a60cSMark Cave-Ayland     SysBusDevice parent_obj;
751b13a60cSMark Cave-Ayland     /*< public >*/
761b13a60cSMark Cave-Ayland 
771b13a60cSMark Cave-Ayland     MemoryRegion iomem;
7874d71ea1SLaurent Vivier     MemoryRegion pdma;
791b13a60cSMark Cave-Ayland     uint32_t it_shift;
801b13a60cSMark Cave-Ayland     ESPState esp;
81db1015e9SEduardo Habkost };
821b13a60cSMark Cave-Ayland 
830d09e41aSPaolo Bonzini #define ESP_TCLO   0x0
840d09e41aSPaolo Bonzini #define ESP_TCMID  0x1
850d09e41aSPaolo Bonzini #define ESP_FIFO   0x2
860d09e41aSPaolo Bonzini #define ESP_CMD    0x3
870d09e41aSPaolo Bonzini #define ESP_RSTAT  0x4
880d09e41aSPaolo Bonzini #define ESP_WBUSID 0x4
890d09e41aSPaolo Bonzini #define ESP_RINTR  0x5
900d09e41aSPaolo Bonzini #define ESP_WSEL   0x5
910d09e41aSPaolo Bonzini #define ESP_RSEQ   0x6
920d09e41aSPaolo Bonzini #define ESP_WSYNTP 0x6
930d09e41aSPaolo Bonzini #define ESP_RFLAGS 0x7
940d09e41aSPaolo Bonzini #define ESP_WSYNO  0x7
950d09e41aSPaolo Bonzini #define ESP_CFG1   0x8
960d09e41aSPaolo Bonzini #define ESP_RRES1  0x9
970d09e41aSPaolo Bonzini #define ESP_WCCF   0x9
980d09e41aSPaolo Bonzini #define ESP_RRES2  0xa
990d09e41aSPaolo Bonzini #define ESP_WTEST  0xa
1000d09e41aSPaolo Bonzini #define ESP_CFG2   0xb
1010d09e41aSPaolo Bonzini #define ESP_CFG3   0xc
1020d09e41aSPaolo Bonzini #define ESP_RES3   0xd
1030d09e41aSPaolo Bonzini #define ESP_TCHI   0xe
1040d09e41aSPaolo Bonzini #define ESP_RES4   0xf
1050d09e41aSPaolo Bonzini 
1060d09e41aSPaolo Bonzini #define CMD_DMA 0x80
1070d09e41aSPaolo Bonzini #define CMD_CMD 0x7f
1080d09e41aSPaolo Bonzini 
1090d09e41aSPaolo Bonzini #define CMD_NOP      0x00
1100d09e41aSPaolo Bonzini #define CMD_FLUSH    0x01
1110d09e41aSPaolo Bonzini #define CMD_RESET    0x02
1120d09e41aSPaolo Bonzini #define CMD_BUSRESET 0x03
1130d09e41aSPaolo Bonzini #define CMD_TI       0x10
1140d09e41aSPaolo Bonzini #define CMD_ICCS     0x11
1150d09e41aSPaolo Bonzini #define CMD_MSGACC   0x12
1160d09e41aSPaolo Bonzini #define CMD_PAD      0x18
1170d09e41aSPaolo Bonzini #define CMD_SATN     0x1a
1180d09e41aSPaolo Bonzini #define CMD_RSTATN   0x1b
1190d09e41aSPaolo Bonzini #define CMD_SEL      0x41
1200d09e41aSPaolo Bonzini #define CMD_SELATN   0x42
1210d09e41aSPaolo Bonzini #define CMD_SELATNS  0x43
1220d09e41aSPaolo Bonzini #define CMD_ENSEL    0x44
1230d09e41aSPaolo Bonzini #define CMD_DISSEL   0x45
1240d09e41aSPaolo Bonzini 
1250d09e41aSPaolo Bonzini #define STAT_DO 0x00
1260d09e41aSPaolo Bonzini #define STAT_DI 0x01
1270d09e41aSPaolo Bonzini #define STAT_CD 0x02
1280d09e41aSPaolo Bonzini #define STAT_ST 0x03
1290d09e41aSPaolo Bonzini #define STAT_MO 0x06
1300d09e41aSPaolo Bonzini #define STAT_MI 0x07
1310d09e41aSPaolo Bonzini #define STAT_PIO_MASK 0x06
1320d09e41aSPaolo Bonzini 
1330d09e41aSPaolo Bonzini #define STAT_TC 0x10
1340d09e41aSPaolo Bonzini #define STAT_PE 0x20
1350d09e41aSPaolo Bonzini #define STAT_GE 0x40
1360d09e41aSPaolo Bonzini #define STAT_INT 0x80
1370d09e41aSPaolo Bonzini 
1380d09e41aSPaolo Bonzini #define BUSID_DID 0x07
1390d09e41aSPaolo Bonzini 
1400d09e41aSPaolo Bonzini #define INTR_FC 0x08
1410d09e41aSPaolo Bonzini #define INTR_BS 0x10
1420d09e41aSPaolo Bonzini #define INTR_DC 0x20
1430d09e41aSPaolo Bonzini #define INTR_RST 0x80
1440d09e41aSPaolo Bonzini 
1450d09e41aSPaolo Bonzini #define SEQ_0 0x0
146799d90d8SMark Cave-Ayland #define SEQ_MO 0x1
1470d09e41aSPaolo Bonzini #define SEQ_CD 0x4
1480d09e41aSPaolo Bonzini 
1490d09e41aSPaolo Bonzini #define CFG1_RESREPT 0x40
1500d09e41aSPaolo Bonzini 
1510d09e41aSPaolo Bonzini #define TCHI_FAS100A 0x4
1520d09e41aSPaolo Bonzini #define TCHI_AM53C974 0x12
1530d09e41aSPaolo Bonzini 
1540d09e41aSPaolo Bonzini void esp_dma_enable(ESPState *s, int irq, int level);
1550d09e41aSPaolo Bonzini void esp_request_cancelled(SCSIRequest *req);
15617ea26c2SHannes Reinecke void esp_command_complete(SCSIRequest *req, size_t resid);
1570d09e41aSPaolo Bonzini void esp_transfer_data(SCSIRequest *req, uint32_t len);
1580d09e41aSPaolo Bonzini void esp_hard_reset(ESPState *s);
1590d09e41aSPaolo Bonzini uint64_t esp_reg_read(ESPState *s, uint32_t saddr);
1600d09e41aSPaolo Bonzini void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val);
1610d09e41aSPaolo Bonzini extern const VMStateDescription vmstate_esp;
162ff4a1dabSMark Cave-Ayland int esp_pre_save(void *opaque);
1630d09e41aSPaolo Bonzini 
1640d09e41aSPaolo Bonzini #endif
165