1*c0586b87SGarrett D'Amore /* 2*c0586b87SGarrett D'Amore * This file and its contents are supplied under the terms of the 3*c0586b87SGarrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0. 4*c0586b87SGarrett D'Amore * You may only use this file in accordance with the terms of version 5*c0586b87SGarrett D'Amore * 1.0 of the CDDL. 6*c0586b87SGarrett D'Amore * 7*c0586b87SGarrett D'Amore * A full copy of the text of the CDDL should have accompanied this 8*c0586b87SGarrett D'Amore * source. A copy of the CDDL is also available via the Internet at 9*c0586b87SGarrett D'Amore * http://www.illumos.org/license/CDDL. 10*c0586b87SGarrett D'Amore */ 11*c0586b87SGarrett D'Amore 12*c0586b87SGarrett D'Amore /* 13*c0586b87SGarrett D'Amore * Copyright 2016 Nexenta Systems, Inc. 14*c0586b87SGarrett D'Amore * Copyright 2022 RackTop Systems, Inc. 15*c0586b87SGarrett D'Amore */ 16*c0586b87SGarrett D'Amore 17*c0586b87SGarrett D'Amore #ifndef _PVSCSI_VAR_H_ 18*c0586b87SGarrett D'Amore #define _PVSCSI_VAR_H_ 19*c0586b87SGarrett D'Amore 20*c0586b87SGarrett D'Amore typedef struct pvscsi_dma_buf { 21*c0586b87SGarrett D'Amore ddi_dma_handle_t dmah; 22*c0586b87SGarrett D'Amore caddr_t addr; 23*c0586b87SGarrett D'Amore uint64_t pa; 24*c0586b87SGarrett D'Amore ddi_acc_handle_t acch; 25*c0586b87SGarrett D'Amore } pvscsi_dma_buf_t; 26*c0586b87SGarrett D'Amore 27*c0586b87SGarrett D'Amore #define PVSCSI_MAX_IO_PAGES 256 28*c0586b87SGarrett D'Amore #define PVSCSI_MAX_IO_SIZE (PVSCSI_MAX_IO_PAGES * PAGE_SIZE) 29*c0586b87SGarrett D'Amore #define PVSCSI_MAX_SG_SIZE (PVSCSI_MAX_IO_PAGES + 1) 30*c0586b87SGarrett D'Amore 31*c0586b87SGarrett D'Amore typedef struct pvscsi_cmd { 32*c0586b87SGarrett D'Amore struct scsi_pkt *pkt; 33*c0586b87SGarrett D'Amore struct scsi_arq_status cmd_scb; 34*c0586b87SGarrett D'Amore uint8_t cdb[SCSI_CDB_SIZE]; 35*c0586b87SGarrett D'Amore size_t cdblen; 36*c0586b87SGarrett D'Amore uint8_t tag; 37*c0586b87SGarrett D'Amore uint8_t scsi_status; 38*c0586b87SGarrett D'Amore uint32_t host_status; 39*c0586b87SGarrett D'Amore uint64_t transferred; 40*c0586b87SGarrett D'Amore boolean_t poll; 41*c0586b87SGarrett D'Amore int target; 42*c0586b87SGarrett D'Amore int lun; 43*c0586b87SGarrett D'Amore uint32_t ctx; 44*c0586b87SGarrett D'Amore list_node_t queue_node; 45*c0586b87SGarrett D'Amore clock_t timeout; 46*c0586b87SGarrett D'Amore clock_t start; 47*c0586b87SGarrett D'Amore struct pvscsi_softc *pvs; 48*c0586b87SGarrett D'Amore struct pvscsi_cmd *next_cmd; 49*c0586b87SGarrett D'Amore 50*c0586b87SGarrett D'Amore ddi_dma_handle_t sgl_dmah; 51*c0586b87SGarrett D'Amore ddi_acc_handle_t sgl_acch; 52*c0586b87SGarrett D'Amore uint64_t sgl_pa; 53*c0586b87SGarrett D'Amore struct PVSCSISGElement *sgl; 54*c0586b87SGarrett D'Amore 55*c0586b87SGarrett D'Amore uint64_t arq_pa; 56*c0586b87SGarrett D'Amore uint8_t arq_sense[SENSE_LENGTH]; 57*c0586b87SGarrett D'Amore ddi_dma_handle_t arq_dmah; 58*c0586b87SGarrett D'Amore 59*c0586b87SGarrett D'Amore uint32_t dma_dir; 60*c0586b87SGarrett D'Amore 61*c0586b87SGarrett D'Amore uint8_t done; 62*c0586b87SGarrett D'Amore uint8_t expired; 63*c0586b87SGarrett D'Amore } pvscsi_cmd_t; 64*c0586b87SGarrett D'Amore 65*c0586b87SGarrett D'Amore typedef struct pvscsi_msg { 66*c0586b87SGarrett D'Amore struct pvscsi_softc *pvs; 67*c0586b87SGarrett D'Amore int type; 68*c0586b87SGarrett D'Amore int target; 69*c0586b87SGarrett D'Amore int lun; 70*c0586b87SGarrett D'Amore } pvscsi_msg_t; 71*c0586b87SGarrett D'Amore 72*c0586b87SGarrett D'Amore typedef struct pvscsi_device { 73*c0586b87SGarrett D'Amore list_node_t node; 74*c0586b87SGarrett D'Amore struct pvscsi_softc *pvs; 75*c0586b87SGarrett D'Amore int target; 76*c0586b87SGarrett D'Amore int lun; 77*c0586b87SGarrett D'Amore } pvscsi_device_t; 78*c0586b87SGarrett D'Amore 79*c0586b87SGarrett D'Amore typedef struct pvscsi_softc { 80*c0586b87SGarrett D'Amore dev_info_t *dip; 81*c0586b87SGarrett D'Amore scsi_hba_tran_t *tran; 82*c0586b87SGarrett D'Amore scsi_hba_tgtmap_t *tgtmap; 83*c0586b87SGarrett D'Amore pvscsi_dma_buf_t state_buf; 84*c0586b87SGarrett D'Amore pvscsi_dma_buf_t req_ring_buf; 85*c0586b87SGarrett D'Amore uint_t req_pages; 86*c0586b87SGarrett D'Amore uint_t req_depth; 87*c0586b87SGarrett D'Amore pvscsi_dma_buf_t cmp_ring_buf; 88*c0586b87SGarrett D'Amore uint_t cmp_pages; 89*c0586b87SGarrett D'Amore pvscsi_dma_buf_t msg_ring_buf; 90*c0586b87SGarrett D'Amore uint_t msg_pages; 91*c0586b87SGarrett D'Amore ddi_acc_handle_t mmio_handle; 92*c0586b87SGarrett D'Amore caddr_t mmio_base; 93*c0586b87SGarrett D'Amore int intr_cnt; 94*c0586b87SGarrett D'Amore int intr_pri; 95*c0586b87SGarrett D'Amore int intr_type; 96*c0586b87SGarrett D'Amore uint32_t max_targets; 97*c0586b87SGarrett D'Amore ddi_intr_handle_t intr_handles[PVSCSI_MAX_INTRS]; 98*c0586b87SGarrett D'Amore list_t cmd_queue; 99*c0586b87SGarrett D'Amore list_t devices; 100*c0586b87SGarrett D'Amore kmutex_t lock; 101*c0586b87SGarrett D'Amore ddi_taskq_t *tq; 102*c0586b87SGarrett D'Amore timeout_id_t timeout; 103*c0586b87SGarrett D'Amore boolean_t detach; 104*c0586b87SGarrett D'Amore } pvscsi_softc_t; 105*c0586b87SGarrett D'Amore 106*c0586b87SGarrett D'Amore #define REQ_RING(pvs) \ 107*c0586b87SGarrett D'Amore ((struct PVSCSIRingReqDesc *)((pvs)->req_ring_buf.addr)) 108*c0586b87SGarrett D'Amore 109*c0586b87SGarrett D'Amore #define CMP_RING(pvs) \ 110*c0586b87SGarrett D'Amore ((struct PVSCSIRingCmpDesc *)((pvs)->cmp_ring_buf.addr)) 111*c0586b87SGarrett D'Amore 112*c0586b87SGarrett D'Amore #define MSG_RING(pvs) \ 113*c0586b87SGarrett D'Amore ((struct PVSCSIRingMsgDesc *)((pvs)->msg_ring_buf.addr)) 114*c0586b87SGarrett D'Amore 115*c0586b87SGarrett D'Amore #define RINGS_STATE(pvs) \ 116*c0586b87SGarrett D'Amore ((struct PVSCSIRingsState *)((pvs)->state_buf.addr)) 117*c0586b87SGarrett D'Amore 118*c0586b87SGarrett D'Amore #define PVSCSI_MAXTGTS 16 119*c0586b87SGarrett D'Amore 120*c0586b87SGarrett D'Amore #define PAGE_SIZE 4096 121*c0586b87SGarrett D'Amore #define PAGE_SHIFT 12 122*c0586b87SGarrett D'Amore 123*c0586b87SGarrett D'Amore #define PVSCSI_DEFAULT_NUM_PAGES_PER_RING 8 124*c0586b87SGarrett D'Amore #define PVSCSI_DEFAULT_NUM_PAGES_MSG_RING 1 125*c0586b87SGarrett D'Amore 126*c0586b87SGarrett D'Amore #endif /* _PVSCSI_VAR_H_ */ 127