1e351b826SPaolo Bonzini #ifndef MPTSAS_H 2e351b826SPaolo Bonzini #define MPTSAS_H 3e351b826SPaolo Bonzini 4e351b826SPaolo Bonzini #include "mpi.h" 5e351b826SPaolo Bonzini 6e351b826SPaolo Bonzini #define MPTSAS_NUM_PORTS 8 7e351b826SPaolo Bonzini #define MPTSAS_MAX_FRAMES 2048 /* Firmware limit at 65535 */ 8e351b826SPaolo Bonzini 9e351b826SPaolo Bonzini #define MPTSAS_REQUEST_QUEUE_DEPTH 128 10e351b826SPaolo Bonzini #define MPTSAS_REPLY_QUEUE_DEPTH 128 11e351b826SPaolo Bonzini 12e351b826SPaolo Bonzini #define MPTSAS_MAXIMUM_CHAIN_DEPTH 0x22 13e351b826SPaolo Bonzini 14e351b826SPaolo Bonzini typedef struct MPTSASRequest MPTSASRequest; 15e351b826SPaolo Bonzini 16*040c1fd3SEduardo Habkost #define TYPE_MPTSAS1068 "mptsas1068" 17*040c1fd3SEduardo Habkost typedef struct MPTSASState MPTSASState; 18*040c1fd3SEduardo Habkost #define MPT_SAS(obj) \ 19*040c1fd3SEduardo Habkost OBJECT_CHECK(MPTSASState, (obj), TYPE_MPTSAS1068) 20*040c1fd3SEduardo Habkost 21e351b826SPaolo Bonzini enum { 22e351b826SPaolo Bonzini DOORBELL_NONE, 23e351b826SPaolo Bonzini DOORBELL_WRITE, 24e351b826SPaolo Bonzini DOORBELL_READ 25e351b826SPaolo Bonzini }; 26e351b826SPaolo Bonzini 27e351b826SPaolo Bonzini struct MPTSASState { 28e351b826SPaolo Bonzini PCIDevice dev; 29e351b826SPaolo Bonzini MemoryRegion mmio_io; 30e351b826SPaolo Bonzini MemoryRegion port_io; 31e351b826SPaolo Bonzini MemoryRegion diag_io; 32e351b826SPaolo Bonzini QEMUBH *request_bh; 33e351b826SPaolo Bonzini 34444dd1afSCao jin /* properties */ 35444dd1afSCao jin OnOffAuto msi; 36e351b826SPaolo Bonzini uint64_t sas_addr; 37e351b826SPaolo Bonzini 380b646f44SPaolo Bonzini bool msi_in_use; 390b646f44SPaolo Bonzini 40e351b826SPaolo Bonzini /* Doorbell register */ 41e351b826SPaolo Bonzini uint32_t state; 42e351b826SPaolo Bonzini uint8_t who_init; 43e351b826SPaolo Bonzini uint8_t doorbell_state; 44e351b826SPaolo Bonzini 45e351b826SPaolo Bonzini /* Buffer for requests that are sent through the doorbell register. */ 46e351b826SPaolo Bonzini uint32_t doorbell_msg[256]; 47e351b826SPaolo Bonzini int doorbell_idx; 48e351b826SPaolo Bonzini int doorbell_cnt; 49e351b826SPaolo Bonzini 50e351b826SPaolo Bonzini uint16_t doorbell_reply[256]; 51e351b826SPaolo Bonzini int doorbell_reply_idx; 52e351b826SPaolo Bonzini int doorbell_reply_size; 53e351b826SPaolo Bonzini 54e351b826SPaolo Bonzini /* Other registers */ 55e351b826SPaolo Bonzini uint8_t diagnostic_idx; 56e351b826SPaolo Bonzini uint32_t diagnostic; 57e351b826SPaolo Bonzini uint32_t intr_mask; 58e351b826SPaolo Bonzini uint32_t intr_status; 59e351b826SPaolo Bonzini 60e351b826SPaolo Bonzini /* Request queues */ 61e351b826SPaolo Bonzini uint32_t request_post[MPTSAS_REQUEST_QUEUE_DEPTH + 1]; 62e351b826SPaolo Bonzini uint16_t request_post_head; 63e351b826SPaolo Bonzini uint16_t request_post_tail; 64e351b826SPaolo Bonzini 65e351b826SPaolo Bonzini uint32_t reply_post[MPTSAS_REPLY_QUEUE_DEPTH + 1]; 66e351b826SPaolo Bonzini uint16_t reply_post_head; 67e351b826SPaolo Bonzini uint16_t reply_post_tail; 68e351b826SPaolo Bonzini 69e351b826SPaolo Bonzini uint32_t reply_free[MPTSAS_REPLY_QUEUE_DEPTH + 1]; 70e351b826SPaolo Bonzini uint16_t reply_free_head; 71e351b826SPaolo Bonzini uint16_t reply_free_tail; 72e351b826SPaolo Bonzini 73e351b826SPaolo Bonzini /* IOC Facts */ 74e351b826SPaolo Bonzini hwaddr host_mfa_high_addr; 75e351b826SPaolo Bonzini hwaddr sense_buffer_high_addr; 76e351b826SPaolo Bonzini uint16_t max_devices; 77e351b826SPaolo Bonzini uint16_t max_buses; 78e351b826SPaolo Bonzini uint16_t reply_frame_size; 79e351b826SPaolo Bonzini 80e351b826SPaolo Bonzini SCSIBus bus; 81e351b826SPaolo Bonzini QTAILQ_HEAD(, MPTSASRequest) pending; 82e351b826SPaolo Bonzini }; 83e351b826SPaolo Bonzini 84e351b826SPaolo Bonzini void mptsas_fix_scsi_io_endianness(MPIMsgSCSIIORequest *req); 85e351b826SPaolo Bonzini void mptsas_fix_scsi_io_reply_endianness(MPIMsgSCSIIOReply *reply); 86e351b826SPaolo Bonzini void mptsas_fix_scsi_task_mgmt_endianness(MPIMsgSCSITaskMgmt *req); 87e351b826SPaolo Bonzini void mptsas_fix_scsi_task_mgmt_reply_endianness(MPIMsgSCSITaskMgmtReply *reply); 88e351b826SPaolo Bonzini void mptsas_fix_ioc_init_endianness(MPIMsgIOCInit *req); 89e351b826SPaolo Bonzini void mptsas_fix_ioc_init_reply_endianness(MPIMsgIOCInitReply *reply); 90e351b826SPaolo Bonzini void mptsas_fix_ioc_facts_endianness(MPIMsgIOCFacts *req); 91e351b826SPaolo Bonzini void mptsas_fix_ioc_facts_reply_endianness(MPIMsgIOCFactsReply *reply); 92e351b826SPaolo Bonzini void mptsas_fix_config_endianness(MPIMsgConfig *req); 93e351b826SPaolo Bonzini void mptsas_fix_config_reply_endianness(MPIMsgConfigReply *reply); 94e351b826SPaolo Bonzini void mptsas_fix_port_facts_endianness(MPIMsgPortFacts *req); 95e351b826SPaolo Bonzini void mptsas_fix_port_facts_reply_endianness(MPIMsgPortFactsReply *reply); 96e351b826SPaolo Bonzini void mptsas_fix_port_enable_endianness(MPIMsgPortEnable *req); 97e351b826SPaolo Bonzini void mptsas_fix_port_enable_reply_endianness(MPIMsgPortEnableReply *reply); 98e351b826SPaolo Bonzini void mptsas_fix_event_notification_endianness(MPIMsgEventNotify *req); 99e351b826SPaolo Bonzini void mptsas_fix_event_notification_reply_endianness(MPIMsgEventNotifyReply *reply); 100e351b826SPaolo Bonzini 101e351b826SPaolo Bonzini void mptsas_reply(MPTSASState *s, MPIDefaultReply *reply); 102e351b826SPaolo Bonzini 103e351b826SPaolo Bonzini void mptsas_process_config(MPTSASState *s, MPIMsgConfig *req); 104e351b826SPaolo Bonzini 105e351b826SPaolo Bonzini #endif /* MPTSAS_H */ 106