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