xref: /freebsd/sys/dev/hptrr/him.h (revision 1e413cf93298b5b97441a21d9a50fdcd0ee9945e)
1 /*
2  * Copyright (c) HighPoint Technologies, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 #include <dev/hptrr/hptrr_config.h>
29 /*
30  * $Id: him.h,v 1.41 2007/01/12 09:12:49 gmm Exp $
31  * Copyright (C) 2004-2005 HighPoint Technologies, Inc. All rights reserved.
32  */
33 #ifndef _HPT_HIM_H_
34 #define _HPT_HIM_H_
35 
36 #define VERMAGIC_HIM 41
37 
38 #if defined(__cplusplus)
39 extern "C" {
40 #endif
41 
42 #include <dev/hptrr/list.h>
43 
44 #define SECTOR_TO_BYTE_SHIFT 9
45 #define SECTOR_TO_BYTE(x)	((HPT_U32)(x) << SECTOR_TO_BYTE_SHIFT)
46 #define BYTE_TO_SECTOR(x)	((x)>>SECTOR_TO_BYTE_SHIFT)
47 
48 typedef struct _PCI_ID
49 {
50 	HPT_U16 vid;
51 	HPT_U16 did;
52 	HPT_U32 subsys;
53 	HPT_U8  rev;
54 	HPT_U8  nbase;
55 	HPT_U16 reserve;
56 }
57 PCI_ID;
58 
59 typedef struct _PCI_ADDRESS
60 {
61 	HPT_U8 tree;
62 	HPT_U8 bus;
63 	HPT_U8 device;
64 	HPT_U8 function;
65 }
66 PCI_ADDRESS;
67 
68 typedef struct _HIM_ADAPTER_CONFIG
69 {
70 	PCI_ADDRESS pci_addr;
71 	PCI_ID  pci_id;
72 
73 	HPT_U8  max_devices;
74 	HPT_U8  reserve1;
75 
76 	HPT_U8	bDevsPerBus;
77 	HPT_U8	first_on_slot;
78 
79 	HPT_U8	bChipType;
80 	HPT_U8	bChipIntrNum;
81 	HPT_U8	bChipFlags;
82 	HPT_U8	bNumBuses;
83 
84 	HPT_U8	szVendorID[36];
85 	HPT_U8	szProductID[36];
86 }
87 HIM_ADAPTER_CONFIG, *PHIM_ADAPTER_CONFIG;
88 
89 typedef struct _HIM_CHANNEL_CONFIG
90 {
91 	HPT_U32 io_port;
92 	HPT_U32 ctl_port;
93 } HIM_CHANNEL_CONFIG, *PHIM_CHANNEL_CONFIG;
94 
95 typedef struct _HIM_DEVICE_FLAGS
96 {
97 	HPT_U32 df_atapi                :1;
98 	HPT_U32 df_removable_drive		:1;
99 	HPT_U32 df_on_line              :1;
100 	HPT_U32 df_reduce_mode          :1;
101 	HPT_U32 df_sata                 :1;
102 	HPT_U32 df_on_pm_port           :1;
103 	HPT_U32 df_support_read_ahead	:1;
104 	HPT_U32 df_read_ahead_enabled	:1;
105 	HPT_U32 df_support_write_cache	:1;
106 	HPT_U32 df_write_cache_enabled	:1;
107 	HPT_U32	df_cdrom_device			:1;
108 	HPT_U32 df_tape_device			:1;
109 	HPT_U32 df_support_tcq			:1;
110 	HPT_U32 df_tcq_enabled			:1;
111 	HPT_U32 df_support_ncq			:1;
112 	HPT_U32 df_ncq_enabled			:1;
113 } DEVICE_FLAGS, *PDEVICE_FLAGS;
114 
115 #pragma pack(1)
116 typedef struct _IDENTIFY_DATA2 {
117     HPT_U16 GeneralConfiguration;
118     HPT_U16 NumberOfCylinders;
119     HPT_U16 Reserved1;
120     HPT_U16 NumberOfHeads;
121     HPT_U16 UnformattedBytesPerTrack;
122     HPT_U16 UnformattedBytesPerSector;
123     HPT_U16 SectorsPerTrack;
124     HPT_U16 VendorUnique1[3];
125     HPT_U16 SerialNumber[10];
126     HPT_U16 BufferType;
127     HPT_U16 BufferSectorSize;
128     HPT_U16 NumberOfEccBytes;
129     HPT_U16 FirmwareRevision[4];
130     HPT_U16 ModelNumber[20];
131     HPT_U8  MaximumBlockTransfer;
132     HPT_U8  VendorUnique2;
133     HPT_U16 DoubleWordIo;
134     HPT_U16 Capabilities;
135     HPT_U16 Reserved2;
136     HPT_U8  VendorUnique3;
137     HPT_U8  PioCycleTimingMode;
138     HPT_U8  VendorUnique4;
139     HPT_U8  DmaCycleTimingMode;
140     HPT_U16 TranslationFieldsValid;
141     HPT_U16 NumberOfCurrentCylinders;
142     HPT_U16 NumberOfCurrentHeads;
143     HPT_U16 CurrentSectorsPerTrack;
144     HPT_U32 CurrentSectorCapacity;
145     HPT_U16 CurrentMultiSectorSetting;
146     HPT_U32 UserAddressableSectors;
147     HPT_U8  SingleWordDMASupport;
148     HPT_U8  SingleWordDMAActive;
149     HPT_U8  MultiWordDMASupport;
150     HPT_U8  MultiWordDMAActive;
151     HPT_U8  AdvancedPIOModes;
152     HPT_U8  Reserved4;
153     HPT_U16 MinimumMWXferCycleTime;
154     HPT_U16 RecommendedMWXferCycleTime;
155     HPT_U16 MinimumPIOCycleTime;
156     HPT_U16 MinimumPIOCycleTimeIORDY;
157     HPT_U16 Reserved5[2];
158     HPT_U16 ReleaseTimeOverlapped;
159     HPT_U16 ReleaseTimeServiceCommand;
160     HPT_U16 MajorRevision;
161     HPT_U16 MinorRevision;
162 }
163 #ifdef __GNUC__
164 __attribute__((packed))
165 #endif
166 IDENTIFY_DATA2, *PIDENTIFY_DATA2;
167 #pragma pack()
168 
169 typedef struct _HIM_DEVICE_CONFIG
170 {
171 	HPT_U64 capacity;
172 
173 	DEVICE_FLAGS flags;
174 
175 	HPT_U8  path_id;
176 	HPT_U8  target_id;
177 	HPT_U8  max_queue_depth;
178 	HPT_U8  spin_up_mode;
179 
180 	HPT_U8  reserved;
181 	HPT_U8  transfer_mode;
182 	HPT_U8	bMaxShowMode;
183 	HPT_U8	bDeUsable_Mode;
184 
185 	HPT_U16	max_sectors_per_cmd;
186 
187 	PIDENTIFY_DATA2 pIdentifyData;
188 
189 }
190 HIM_DEVICE_CONFIG, *PHIM_DEVICE_CONFIG;
191 
192 
193 #define _DIT_MODE			0
194 #define _DIT_601			1
195 #define _DIT_READ_AHEAD		2
196 #define _DIT_WRITE_CACHE	3
197 #define _DIT_TCQ			4
198 #define _DIT_NCQ			5
199 #define _DIT_BEEP_OFF		6
200 #define _DIT_SPIN_UP_MODE   7
201 
202 #define SPIN_UP_MODE_NOSUPPORT 0
203 #define SPIN_UP_MODE_FULL      1
204 #define SPIN_UP_MODE_STANDBY   2
205 
206 struct tcq_control {
207 	HPT_U8 enable;
208 	HPT_U8 depth;
209 };
210 
211 struct ncq_control {
212 	HPT_U8 enable;
213 	HPT_U8 depth;
214 };
215 
216 typedef struct _HIM_ALTERABLE_DEV_INFO{
217 	HPT_U8 type;
218 	union {
219 		HPT_U8 mode;
220 		HPT_U8 enable_read_ahead;
221 		HPT_U8 enable_read_cache;
222 		HPT_U8 enable_write_cache;
223 		struct tcq_control tcq;
224 		struct ncq_control ncq;
225 		void * adapter;
226 		HPT_U8 spin_up_mode;
227 	}u;
228 } HIM_ALTERABLE_DEV_INFO, *PHIM_ALTERABLE_DEV_INFO;
229 
230 struct _COMMAND;
231 struct _IOCTL_ARG;
232 
233 typedef void (*PROBE_CALLBACK)(void *arg, void *dev, int index);
234 
235 typedef struct _HIM {
236 	char *name;
237 	struct _HIM *next;
238 	HPT_UINT max_sg_descriptors;
239 	#define _HIM_INTERFACE(_type, _fn, _args) _type (* _fn) _args;
240 	#include <dev/hptrr/himfuncs.h>
241 }
242 HIM, *PHIM;
243 
244 
245 #pragma pack(1)
246 #ifdef SG_FLAG_EOT
247 #error "don't use SG_FLAG_EOT with _SG.eot. clean the code!"
248 #endif
249 
250 typedef struct _SG {
251 	HPT_U32 size;
252 	HPT_UINT eot;
253 	union {
254 		HPT_U8 FAR * _logical;
255 		BUS_ADDRESS bus;
256 	}
257 	addr;
258 }
259 SG, *PSG;
260 #pragma pack()
261 
262 typedef struct _AtaCommand
263 {
264     HPT_U64	Lba;
265     HPT_U16	nSectors;
266     HPT_U16	pad;
267 } AtaComm, *PAtaComm;
268 
269 #define ATA_CMD_SET_FEATURES 0xef
270 #define ATA_CMD_FLUSH	0xE7
271 #define ATA_CMD_VERIFY 0x40
272 #define ATA_CMD_STANDBY 0xe2
273 #define ATA_CMD_READ_MULTI	0xC4
274 #define ATA_CMD_READ_MULTI_EXT	0x29
275 #define ATA_CMD_WRITE_MULTI	0xC5
276 #define ATA_CMD_WRITE_MULTI_EXT	0x39
277 #define ATA_CMD_WRITE_MULTI_FUA_EXT	0xCE
278 
279 #define ATA_SET_FEATURES_XFER 0x3
280 #define ATA_SECTOR_SIZE 512
281 
282 typedef struct _PassthroughCmd {
283 	HPT_U16    bFeaturesReg;
284 	HPT_U16    bSectorCountReg;
285 	HPT_U16    bLbaLowReg;
286 	HPT_U16    bLbaMidReg;
287 	HPT_U16    bLbaHighReg;
288 	HPT_U8     bDriveHeadReg;
289 	HPT_U8     bCommandReg;
290 	HPT_U8     nSectors;
291 	HPT_U8    *pDataBuffer;
292 }
293 PassthroughCmd;
294 
295 
296 #define CTRL_CMD_REBUILD 1
297 #define CTRL_CMD_VERIFY  2
298 #define CTRL_CMD_INIT    3
299 
300 
301 typedef struct _R5ControlCmd {
302 	HPT_U64  StripeLine;
303 	HPT_U16 Offset;
304 	HPT_U8  Command;
305 	HPT_U8  reserve1;
306 }
307 R5ControlCmd, *PR5ControlCmd;
308 
309 typedef struct _HPT_ADDRESS
310 {
311 	HPT_U8 * logical;
312 	BUS_ADDRESS bus;
313 }
314 HPT_ADDRESS;
315 
316 
317 typedef struct ctl_pages {
318 	HPT_ADDRESS *pages;
319 	HPT_UINT	page_size;
320 	HPT_UINT	npages;
321 	HPT_UINT min_sg_descriptors;
322 } CONTROL_PAGES, *PCONTROL_PAGES;
323 
324 typedef struct _R1ControlCmd {
325 	HPT_U64  Lba;
326 	HPT_U16 nSectors;
327 	HPT_U8  Command;      /* CTRL_CMD_XXX */
328 	HPT_U8  reserve1;
329 	PCONTROL_PAGES ctl_pages;
330 }
331 R1ControlCmd, *PR1ControlCmd;
332 
333 typedef void (*TQ_PROC)(void *arg);
334 
335 struct tq_item {
336 	TQ_PROC proc;
337 	void *arg;
338 	struct tq_item *next;
339 };
340 
341 #define INIT_TQ_ITEM(t, p, a) \
342 	do { (t)->proc = p; (t)->arg = a; (t)->next = 0; } while (0)
343 
344 typedef struct _COMMAND
345 {
346 
347 	struct _VBUS * vbus;
348 
349 	struct freelist *grplist;
350 	HPT_UINT grpcnt;
351 
352 
353 	struct list_head q_link;
354 	struct tq_item done_dpc;
355 
356 	HPT_UINT extsize;
357     void *ext;
358 
359 
360 
361 	void *target;
362 	void *priv;
363 	HPT_UPTR priv2;
364 
365 	int priority;
366 	struct lock_request *owned_lock;
367 	struct lock_request *lock_req;
368 
369     union{
370         /* Ide Command */
371         AtaComm Ide;
372         PassthroughCmd Passthrough;
373         /* Atapi Command */
374         HPT_U8 Atapi[12];
375 		/* Control command */
376 		R5ControlCmd R5Control;
377 		R1ControlCmd R1Control;
378 	} uCmd;
379 
380 	HPT_U8 type; /* CMD_TYPE_* */
381 
382    	struct {
383 		HPT_U8	physical_sg: 1;
384 		HPT_U8	data_in: 1;
385 		HPT_U8	data_out: 1;
386 		HPT_U8  transform : 1;
387 		HPT_U8  hard_flush: 2;
388 		HPT_U8  from_cc: 1;
389 	} flags;
390 
391     /* return status */
392     HPT_U8	Result;
393 	/* retry count */
394 	HPT_U8  RetryCount;
395 
396 
397    	PSG psg;
398 
399 
400    	int  (*buildsgl)(struct _COMMAND *cmd, PSG psg, int logical);
401 	void (*done)(struct _COMMAND *cmd);
402 }
403 COMMAND, *PCOMMAND;
404 
405 /* command types */
406 #define   CMD_TYPE_IO           0
407 #define   CMD_TYPE_CONTROL      1
408 #define   CMD_TYPE_ATAPI        2
409 #define   CMD_TYPE_PASSTHROUGH  3
410 #define   CMD_TYPE_FLUSH		4
411 
412 /* flush command flags */
413 #define   CF_HARD_FLUSH_CACHE   1
414 #define   CF_HARD_FLUSH_STANDBY 2
415 
416 /* command return values */
417 #define   RETURN_PENDING             0
418 #define   RETURN_SUCCESS             1
419 #define   RETURN_BAD_DEVICE          2
420 #define   RETURN_BAD_PARAMETER       3
421 #define   RETURN_WRITE_NO_DRQ        4
422 #define   RETURN_DEVICE_BUSY         5
423 #define   RETURN_INVALID_REQUEST     6
424 #define   RETURN_SELECTION_TIMEOUT   7
425 #define   RETURN_IDE_ERROR           8
426 #define   RETURN_NEED_LOGICAL_SG     9
427 #define   RETURN_NEED_PHYSICAL_SG    10
428 #define   RETURN_RETRY               11
429 #define   RETURN_DATA_ERROR          12
430 #define   RETURN_BUS_RESET           13
431 #define   RETURN_BAD_TRANSFER_LENGTH 14
432 #define	  RETURN_INSUFFICIENT_MEMORY 15
433 #define   RETURN_SECTOR_ERROR        16
434 
435 #if defined(__cplusplus)
436 }
437 #endif
438 #endif
439