xref: /freebsd/sys/dev/aacraid/aacraid_endian.c (revision 4c9a0adad18263ec8725d9bfc5f560c6ad1da8bd)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2019 Leandro Lupori
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
28 #include <sys/cdefs.h>
29 #include <sys/param.h>
30 #include <sys/types.h>
31 
32 #include <dev/aacraid/aacraid_reg.h>
33 #include <dev/aacraid/aacraid_endian.h>
34 
35 #if _BYTE_ORDER != _LITTLE_ENDIAN
36 
37 #define TOH2(field, bits)	field = le##bits##toh(field)
38 #define TOH(field, bits)	TOH2(field, bits)
39 
40 #define TOLE2(field, bits)	field = htole##bits(field)
41 #define TOLE(field, bits)	TOLE2(field, bits)
42 
43 /* Convert from Little-Endian to host order (TOH) */
44 
45 void
46 aac_fib_header_toh(struct aac_fib_header *ptr)
47 {
48 	TOH(ptr->XferState, 32);
49 	TOH(ptr->Command, 16);
50 	TOH(ptr->Size, 16);
51 	TOH(ptr->SenderSize, 16);
52 	TOH(ptr->SenderFibAddress, 32);
53 	TOH(ptr->u.ReceiverFibAddress, 32);
54 	TOH(ptr->Handle, 32);
55 	TOH(ptr->Previous, 32);
56 	TOH(ptr->Next, 32);
57 }
58 
59 void
60 aac_adapter_info_toh(struct aac_adapter_info *ptr)
61 {
62 	TOH(ptr->PlatformBase, 32);
63 	TOH(ptr->CpuArchitecture, 32);
64 	TOH(ptr->CpuVariant, 32);
65 	TOH(ptr->ClockSpeed, 32);
66 	TOH(ptr->ExecutionMem, 32);
67 	TOH(ptr->BufferMem, 32);
68 	TOH(ptr->TotalMem, 32);
69 
70 	TOH(ptr->KernelRevision.buildNumber, 32);
71 	TOH(ptr->MonitorRevision.buildNumber, 32);
72 	TOH(ptr->HardwareRevision.buildNumber, 32);
73 	TOH(ptr->BIOSRevision.buildNumber, 32);
74 
75 	TOH(ptr->ClusteringEnabled, 32);
76 	TOH(ptr->ClusterChannelMask, 32);
77 	TOH(ptr->SerialNumber, 64);
78 	TOH(ptr->batteryPlatform, 32);
79 	TOH(ptr->SupportedOptions, 32);
80 	TOH(ptr->OemVariant, 32);
81 }
82 
83 void
84 aac_container_creation_toh(struct aac_container_creation *ptr)
85 {
86 	u_int32_t *date = (u_int32_t *)ptr + 1;
87 
88 	*date = le32toh(*date);
89 	TOH(ptr->ViaAdapterSerialNumber, 64);
90 }
91 
92 void
93 aac_mntobj_toh(struct aac_mntobj *ptr)
94 {
95 	TOH(ptr->ObjectId, 32);
96 	aac_container_creation_toh(&ptr->CreateInfo);
97 	TOH(ptr->Capacity, 32);
98 	TOH(ptr->VolType, 32);
99 	TOH(ptr->ObjType, 32);
100 	TOH(ptr->ContentState, 32);
101 	TOH(ptr->ObjExtension.BlockDevice.BlockSize, 32);
102 	TOH(ptr->ObjExtension.BlockDevice.bdLgclPhysMap, 32);
103 	TOH(ptr->AlterEgoId, 32);
104 	TOH(ptr->CapacityHigh, 32);
105 }
106 
107 void
108 aac_mntinforesp_toh(struct aac_mntinforesp *ptr)
109 {
110 	TOH(ptr->Status, 32);
111 	TOH(ptr->MntType, 32);
112 	TOH(ptr->MntRespCount, 32);
113 	aac_mntobj_toh(&ptr->MntTable[0]);
114 }
115 
116 void
117 aac_fsa_ctm_toh(struct aac_fsa_ctm *ptr)
118 {
119 	int i;
120 
121 	TOH(ptr->command, 32);
122 	for (i = 0; i < CT_FIB_PARAMS; i++)
123 		TOH(ptr->param[i], 32);
124 }
125 
126 void
127 aac_cnt_config_toh(struct aac_cnt_config *ptr)
128 {
129 	TOH(ptr->Command, 32);
130 	aac_fsa_ctm_toh(&ptr->CTCommand);
131 }
132 
133 void
134 aac_ctcfg_resp_toh(struct aac_ctcfg_resp *ptr)
135 {
136 	TOH(ptr->Status, 32);
137 	TOH(ptr->resp, 32);
138 	TOH(ptr->param, 32);
139 }
140 
141 void
142 aac_getbusinf_toh(struct aac_getbusinf *ptr)
143 {
144 	TOH(ptr->ProbeComplete, 32);
145 	TOH(ptr->BusCount, 32);
146 	TOH(ptr->TargetsPerBus, 32);
147 }
148 
149 void
150 aac_vmi_businf_resp_toh(struct aac_vmi_businf_resp *ptr)
151 {
152 	TOH(ptr->Status, 32);
153 	TOH(ptr->ObjType, 32);
154 	TOH(ptr->MethId, 32);
155 	TOH(ptr->ObjId, 32);
156 	TOH(ptr->IoctlCmd, 32);
157 	aac_getbusinf_toh(&ptr->BusInf);
158 }
159 
160 void
161 aac_srb_response_toh(struct aac_srb_response *ptr)
162 {
163 	TOH(ptr->fib_status, 32);
164 	TOH(ptr->srb_status, 32);
165 	TOH(ptr->scsi_status, 32);
166 	TOH(ptr->data_len, 32);
167 	TOH(ptr->sense_len, 32);
168 }
169 
170 /* Convert from host order to Little-Endian (TOLE) */
171 
172 void
173 aac_adapter_init_tole(struct aac_adapter_init *ptr)
174 {
175 	TOLE(ptr->InitStructRevision, 32);
176 	TOLE(ptr->NoOfMSIXVectors, 32);
177 	TOLE(ptr->FilesystemRevision, 32);
178 	TOLE(ptr->CommHeaderAddress, 32);
179 	TOLE(ptr->FastIoCommAreaAddress, 32);
180 	TOLE(ptr->AdapterFibsPhysicalAddress, 32);
181 	TOLE(ptr->AdapterFibsVirtualAddress, 32);
182 	TOLE(ptr->AdapterFibsSize, 32);
183 	TOLE(ptr->AdapterFibAlign, 32);
184 	TOLE(ptr->PrintfBufferAddress, 32);
185 	TOLE(ptr->PrintfBufferSize, 32);
186 	TOLE(ptr->HostPhysMemPages, 32);
187 	TOLE(ptr->HostElapsedSeconds, 32);
188 	TOLE(ptr->InitFlags, 32);
189 	TOLE(ptr->MaxIoCommands, 32);
190 	TOLE(ptr->MaxIoSize, 32);
191 	TOLE(ptr->MaxFibSize, 32);
192 	TOLE(ptr->MaxNumAif, 32);
193 	TOLE(ptr->HostRRQ_AddrLow, 32);
194 	TOLE(ptr->HostRRQ_AddrHigh, 32);
195 }
196 
197 void
198 aac_fib_header_tole(struct aac_fib_header *ptr)
199 {
200 	TOLE(ptr->XferState, 32);
201 	TOLE(ptr->Command, 16);
202 	TOLE(ptr->Size, 16);
203 	TOLE(ptr->SenderSize, 16);
204 	TOLE(ptr->SenderFibAddress, 32);
205 	TOLE(ptr->u.ReceiverFibAddress, 32);
206 	TOLE(ptr->Handle, 32);
207 	TOLE(ptr->Previous, 32);
208 	TOLE(ptr->Next, 32);
209 }
210 
211 void
212 aac_mntinfo_tole(struct aac_mntinfo *ptr)
213 {
214 	TOLE(ptr->Command, 32);
215 	TOLE(ptr->MntType, 32);
216 	TOLE(ptr->MntCount, 32);
217 }
218 
219 void
220 aac_fsa_ctm_tole(struct aac_fsa_ctm *ptr)
221 {
222 	int i;
223 
224 	TOLE(ptr->command, 32);
225 	for (i = 0; i < CT_FIB_PARAMS; i++)
226 		TOLE(ptr->param[i], 32);
227 }
228 
229 void
230 aac_cnt_config_tole(struct aac_cnt_config *ptr)
231 {
232 	TOLE(ptr->Command, 32);
233 	aac_fsa_ctm_tole(&ptr->CTCommand);
234 }
235 
236 void
237 aac_raw_io_tole(struct aac_raw_io *ptr)
238 {
239 	TOLE(ptr->BlockNumber, 64);
240 	TOLE(ptr->ByteCount, 32);
241 	TOLE(ptr->ContainerId, 16);
242 	TOLE(ptr->Flags, 16);
243 	TOLE(ptr->BpTotal, 16);
244 	TOLE(ptr->BpComplete, 16);
245 }
246 
247 void
248 aac_raw_io2_tole(struct aac_raw_io2 *ptr)
249 {
250 	TOLE(ptr->strtBlkLow, 32);
251 	TOLE(ptr->strtBlkHigh, 32);
252 	TOLE(ptr->byteCnt, 32);
253 	TOLE(ptr->ldNum, 16);
254 	TOLE(ptr->flags, 16);
255 	TOLE(ptr->sgeFirstSize, 32);
256 	TOLE(ptr->sgeNominalSize, 32);
257 }
258 
259 void
260 aac_fib_xporthdr_tole(struct aac_fib_xporthdr *ptr)
261 {
262 	TOLE(ptr->HostAddress, 64);
263 	TOLE(ptr->Size, 32);
264 	TOLE(ptr->Handle, 32);
265 }
266 
267 void
268 aac_ctcfg_tole(struct aac_ctcfg *ptr)
269 {
270 	TOLE(ptr->Command, 32);
271 	TOLE(ptr->cmd, 32);
272 	TOLE(ptr->param, 32);
273 }
274 
275 void
276 aac_vmioctl_tole(struct aac_vmioctl *ptr)
277 {
278 	TOLE(ptr->Command, 32);
279 	TOLE(ptr->ObjType, 32);
280 	TOLE(ptr->MethId, 32);
281 	TOLE(ptr->ObjId, 32);
282 	TOLE(ptr->IoctlCmd, 32);
283 	TOLE(ptr->IoctlBuf[0], 32);
284 }
285 
286 void
287 aac_pause_command_tole(struct aac_pause_command *ptr)
288 {
289 	TOLE(ptr->Command, 32);
290 	TOLE(ptr->Type, 32);
291 	TOLE(ptr->Timeout, 32);
292 	TOLE(ptr->Min, 32);
293 	TOLE(ptr->NoRescan, 32);
294 	TOLE(ptr->Parm3, 32);
295 	TOLE(ptr->Parm4, 32);
296 	TOLE(ptr->Count, 32);
297 }
298 
299 void
300 aac_srb_tole(struct aac_srb *ptr)
301 {
302 	TOLE(ptr->function, 32);
303 	TOLE(ptr->bus, 32);
304 	TOLE(ptr->target, 32);
305 	TOLE(ptr->lun, 32);
306 	TOLE(ptr->timeout, 32);
307 	TOLE(ptr->flags, 32);
308 	TOLE(ptr->data_len, 32);
309 	TOLE(ptr->retry_limit, 32);
310 	TOLE(ptr->cdb_len, 32);
311 }
312 
313 void
314 aac_sge_ieee1212_tole(struct aac_sge_ieee1212 *ptr)
315 {
316 	TOLE(ptr->addrLow, 32);
317 	TOLE(ptr->addrHigh, 32);
318 	TOLE(ptr->length, 32);
319 	TOLE(ptr->flags, 32);
320 }
321 
322 void
323 aac_sg_entryraw_tole(struct aac_sg_entryraw *ptr)
324 {
325 	TOLE(ptr->Next, 32);
326 	TOLE(ptr->Prev, 32);
327 	TOLE(ptr->SgAddress, 64);
328 	TOLE(ptr->SgByteCount, 32);
329 	TOLE(ptr->Flags, 32);
330 }
331 
332 void
333 aac_sg_entry_tole(struct aac_sg_entry *ptr)
334 {
335 	TOLE(ptr->SgAddress, 32);
336 	TOLE(ptr->SgByteCount, 32);
337 }
338 
339 void
340 aac_sg_entry64_tole(struct aac_sg_entry64 *ptr)
341 {
342 	TOLE(ptr->SgAddress, 64);
343 	TOLE(ptr->SgByteCount, 32);
344 }
345 
346 void
347 aac_blockread_tole(struct aac_blockread *ptr)
348 {
349 	TOLE(ptr->Command, 32);
350 	TOLE(ptr->ContainerId, 32);
351 	TOLE(ptr->BlockNumber, 32);
352 	TOLE(ptr->ByteCount, 32);
353 }
354 
355 void
356 aac_blockwrite_tole(struct aac_blockwrite *ptr)
357 {
358 	TOLE(ptr->Command, 32);
359 	TOLE(ptr->ContainerId, 32);
360 	TOLE(ptr->BlockNumber, 32);
361 	TOLE(ptr->ByteCount, 32);
362 	TOLE(ptr->Stable, 32);
363 }
364 
365 void
366 aac_blockread64_tole(struct aac_blockread64 *ptr)
367 {
368 	TOLE(ptr->Command, 32);
369 	TOLE(ptr->ContainerId, 16);
370 	TOLE(ptr->SectorCount, 16);
371 	TOLE(ptr->BlockNumber, 32);
372 	TOLE(ptr->Pad, 16);
373 	TOLE(ptr->Flags, 16);
374 }
375 
376 void
377 aac_blockwrite64_tole(struct aac_blockwrite64 *ptr)
378 {
379 	TOLE(ptr->Command, 32);
380 	TOLE(ptr->ContainerId, 16);
381 	TOLE(ptr->SectorCount, 16);
382 	TOLE(ptr->BlockNumber, 32);
383 	TOLE(ptr->Pad, 16);
384 	TOLE(ptr->Flags, 16);
385 }
386 
387 #endif
388