1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2024 Racktop Systems, Inc.
14  */
15 
16 #ifndef	_MFI_LD_H
17 #define	_MFI_LD_H
18 
19 #include <sys/debug.h>
20 #include <sys/types.h>
21 
22 #include <sys/scsi/adapters/mfi/mfi.h>
23 #include <sys/scsi/adapters/mfi/mfi_pd.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #define	MFI_SPARE_DEDICATED		1
30 #define	MFI_SPARE_REVERTIBLE		2
31 #define	MFI_SPARE_ENCL_AFFINITY		4
32 
33 #define	MFI_LD_STATE_OFFLINE		0
34 #define	MFI_LD_STATE_PARTIALLY_DEGRADED	1
35 #define	MFI_LD_STATE_DEGRADED		2
36 #define	MFI_LD_STATE_OPTIMAL		3
37 
38 #define	MFI_LD_PARAMS_INIT_NO		0
39 #define	MFI_LD_PARAMS_INIT_QUICK	1
40 #define	MFI_LD_PARAMS_INIT_FULL		2
41 
42 #define	MFI_LD_ACCESS_RW		0
43 #define	MFI_LD_ACCESS_RO		2
44 #define	MFI_LD_ACCESS_BLOCKED		3
45 
46 #define	MFI_LD_CACHE_WRITE_BACK			0x01
47 #define	MFI_LD_CACHE_WRITE_ADAPTIVE		0x02
48 #define	MFI_LD_CACHE_READ_AHEAD			0x04
49 #define	MFI_LD_CACHE_READ_ADAPTIVE		0x08
50 #define	MFI_LD_CACHE_WRITE_CACHE_BAD_BBU	0x10
51 #define	MFI_LD_CACHE_ALLOW_WRITE_CACHE		0x20
52 #define	MFI_LD_CACHE_ALLOW_READ_CACHE		0x40
53 
54 #define	MFI_MAX_ARRAYS			16
55 #define	MFI_MAX_ROW_SIZE		32
56 #define	MFI_MAX_SPAN_DEPTH		8
57 
58 #pragma pack(1)
59 
60 /*
61  * Array configuration
62  */
63 struct mfi_array {
64 	uint64_t	ar_size;
65 	uint8_t		ar_ndrive;
66 	uint8_t		ar_rsvd;
67 	uint16_t	ar_ref;
68 	uint8_t		ar_pad[20];
69 	struct {
70 		mfi_pd_ref_t	pd_ref;
71 		uint16_t	pd_fw_state;
72 		struct {
73 			uint8_t	e_idx;
74 			uint8_t	e_slot;
75 		} pd_encl;
76 	} ar_pd[MFI_MAX_ROW_SIZE];
77 };
78 CTASSERT(sizeof (mfi_array_t) == 288);
79 
80 /*
81  * Spare
82  */
83 struct mfi_spare {
84 	mfi_pd_ref_t	s_pd_ref;
85 	uint8_t		s_type;
86 	uint8_t		s_rsvd[2];
87 	uint8_t		s_array_cnt;
88 	uint16_t	s_array_ref[MFI_MAX_ARRAYS];
89 };
90 CTASSERT(sizeof (mfi_spare_t) == 40);
91 
92 /*
93  * LD reference
94  */
95 struct mfi_ld_ref {
96 	uint8_t		lr_tgtid;
97 	uint8_t		lr_rsvd;
98 	uint16_t	lr_seqnum;
99 };
100 CTASSERT(sizeof (mfi_ld_ref_t) == 4);
101 
102 /*
103  * LD list
104  */
105 struct mfi_ld_list {
106 	uint32_t	ll_ld_count;
107 	uint32_t	ll_rsvd;
108 	struct {
109 		mfi_ld_ref_t	ld_ref;
110 		uint8_t		ld_state;
111 		uint8_t		ld_rsvd[3];
112 		uint64_t	ld_size;
113 	} ll_ld[MFI_MAX_LOGICAL_DRIVES];
114 };
115 CTASSERT(sizeof (mfi_ld_list_t) == 1032);
116 
117 /*
118  * LD parameters
119  */
120 struct mfi_ld_parameters {
121 	uint8_t		lp_primary_raid_lvl;
122 	uint8_t		lp_raid_lvl_qual;
123 	uint8_t		lp_secondary_raid_lvl;
124 	uint8_t		lp_stripe_size;
125 	uint8_t		lp_ndrive;
126 	uint8_t		lp_span_depth;
127 	uint8_t		lp_state;
128 	uint8_t		lp_init_state;
129 	uint8_t		lp_is_consistent;
130 	uint8_t		lp_rsvd1[6];
131 	uint8_t		lp_is_sscd;
132 	uint8_t		lp_rsvd2[16];
133 };
134 CTASSERT(sizeof (mfi_ld_parameters_t) == 32);
135 
136 /*
137  * LD properties
138  */
139 struct mfi_ld_properties {
140 	mfi_ld_ref_t	lp_ld;
141 	char		lp_name[16];
142 	uint8_t		lp_def_cache_policy;
143 	uint8_t		lp_access_policy;
144 	uint8_t		lp_disk_cache_policy;
145 	uint8_t		lp_cur_cache_policy;
146 	uint8_t		lp_no_bgi;
147 	uint8_t		lp_rsvd[7];
148 };
149 CTASSERT(sizeof (mfi_ld_properties_t) == 32);
150 
151 /*
152  * LD span
153  */
154 struct mfi_span {
155 	uint64_t	s_start_block;
156 	uint64_t	s_num_blocks;
157 	uint16_t	s_array_ref;
158 	uint8_t		s_rsvd[6];
159 };
160 CTASSERT(sizeof (mfi_span_t) == 24);
161 
162 /*
163  * LD configuration
164  */
165 struct mfi_ld_config {
166 	mfi_ld_properties_t	lc_props;
167 	mfi_ld_parameters_t	lc_params;
168 	mfi_span_t		lc_span[MFI_MAX_SPAN_DEPTH];
169 };
170 CTASSERT(sizeof (mfi_ld_config_t) == 256);
171 
172 /*
173  * LD progress
174  */
175 struct mfi_ld_progress {
176 	struct {
177 		uint32_t	lp_active_cc:1;
178 		uint32_t	lp_active_bgi:1;
179 		uint32_t	lp_active_fgi:1;
180 		uint32_t	lp_active_recon:1;
181 		uint32_t	lp_active_rsvd:28;
182 	};
183 	mfi_progress_t		lp_cc;
184 	mfi_progress_t		lp_bgi;
185 	mfi_progress_t		lp_fgi;
186 	mfi_progress_t		lp_recon;
187 	mfi_progress_t		lp_rsvd[4];
188 };
189 CTASSERT(sizeof (mfi_ld_progress_t) == 36);
190 
191 /*
192  * LD information
193  */
194 struct mfi_ld_info {
195 	mfi_ld_config_t		li_config;
196 	uint64_t		li_size;
197 	mfi_ld_progress_t	li_progress;
198 	uint16_t		li_cluster_owner;
199 	uint8_t			li_recon_active;
200 	uint8_t			li_resvd1;
201 	uint8_t			li_vpd_page83[64];
202 	uint8_t			li_resvd2[16];
203 };
204 CTASSERT(sizeof (mfi_ld_info_t) == 384);
205 
206 /*
207  * LD target ID list
208  */
209 struct mfi_ld_tgtid_list {
210 	uint32_t	ltl_size;
211 	uint32_t	ltl_count;
212 	uint8_t		ltl_rsvd[3];
213 	uint8_t		ltl_tgtid[0];
214 };
215 
216 /*
217  * RAID configuration
218  */
219 struct mfi_config_data {
220 	uint32_t	cd_size;
221 	uint16_t	cd_array_cnt;
222 	uint16_t	cd_array_size;
223 	uint16_t	cd_ld_cnt;
224 	uint16_t	cd_ld_size;
225 	uint16_t	cd_spare_cnt;
226 	uint16_t	cd_spare_size;
227 	uint8_t		cd_rsvd[16];
228 	mfi_array_t	cd_array[0];
229 	mfi_ld_config_t	cd_ld[0];
230 	mfi_spare_t	cd_spare[0];
231 };
232 
233 #pragma pack(0)
234 #ifdef __cplusplus
235 }
236 #endif
237 
238 #endif	/* _MFI_LD_H */
239