summaryrefslogtreecommitdiff
path: root/sys/dev/ata/ata_raidreg.h
blob: 62643761a5fe884cdd96d37c4e6332e98f0f9044 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
/*	$NetBSD: ata_raidreg.h,v 1.9 2014/09/10 07:04:48 matt Exp $	*/

/*-
 * Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer,
 *    without modification, immediately at the beginning of the file.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _DEV_PCI_PCIIDE_PROMISE_RAID_H_
#define	_DEV_PCI_PCIIDE_PROMISE_RAID_H_

/*
 * Macro to compute the LBA of the Promise RAID configuration structure,
 * using the disk's softc structure.
 */
#define	PR_LBA(wd)							\
	((((wd)->sc_capacity /						\
	   ((wd)->sc_params.atap_heads * (wd)->sc_params.atap_sectors)) * \
	  (wd)->sc_params.atap_heads * (wd)->sc_params.atap_sectors) -	\
	 (wd)->sc_params.atap_sectors)

struct promise_raid_conf {
	char		promise_id[24];
#define	PR_MAGIC	"Promise Technology, Inc."

	uint32_t	dummy_0;

	uint64_t	magic_0;
	uint16_t	magic_1;
	uint32_t	magic_2;
	uint8_t		filler1[470];
	struct {				/* 0x200 */
		uint32_t	integrity;
#define	PR_I_VALID	0x00000080

		uint8_t		flags;
#define	PR_F_VALID	0x01
#define	PR_F_ONLINE	0x02
#define	PR_F_ASSIGNED	0x04
#define	PR_F_SPARE	0x08
#define	PR_F_DUPLICATE	0x10
#define	PR_F_REDIR	0x20
#define	PR_F_DOWN	0x40
#define	PR_F_READY	0x80

		uint8_t		disk_number;
		uint8_t		channel;
		uint8_t		device;
		uint64_t	magic_0 __packed;
		uint32_t	disk_offset;	/* 0x210 */
		uint32_t	disk_sectors;
		uint32_t	rebuild_lba;
		uint16_t	generation;
		uint8_t		status;
#define	PR_S_VALID	0x01
#define	PR_S_ONLINE	0x02
#define	PR_S_INITED	0x04
#define	PR_S_READY	0x08
#define	PR_S_DEGRADED	0x10
#define	PR_S_MARKED	0x20
#define	PR_S_FUNCTIONAL	0x80

		uint8_t		type;
#define	PR_T_RAID0	0x00
#define	PR_T_RAID1	0x01
#define	PR_T_RAID3	0x02
#define	PR_T_RAID5	0x04
#define	PR_T_SPAN	0x08

		uint8_t		total_disks;	/* 0x220 */
		uint8_t		stripe_shift;
		uint8_t		array_width;
		uint8_t		array_number;
		uint32_t	total_sectors;
		uint16_t	cylinders;
		uint8_t		heads;
		uint8_t		sectors;
		uint64_t	magic_1 __packed;
		struct {
			uint8_t		flags;
			uint8_t		dummy_0;
			uint8_t		channel;
			uint8_t		device;
			uint64_t	magic_0 __packed;
		} disk[8];
	} raid;
	uint32_t	filler2[346];
	uint32_t	checksum;
} __packed;

/*
 * Macro to compute the LBA of the Adaptec HostRAID configuration structure,
 * using the disk's softc structure.
 */
#define	ADP_LBA(wd)							\
	((wd)->sc_capacity - 17)

struct adaptec_raid_conf {
	uint32_t	magic_0;
#define	ADP_MAGIC_0	0x900765c4

	uint32_t	generation;
	uint16_t	dummy_0;
	uint16_t	total_configs;
	uint16_t	dummy_1;
	uint16_t	checksum;
	uint32_t	dummy_2;
	uint32_t	dummy_3;
	uint32_t	flags;
	uint32_t	timestamp;
	uint32_t	dummy_4[4];
	uint32_t	dummy_5[4];
	struct {
		uint16_t	total_disks;
		uint16_t	generation;
		uint32_t	magic_0;
		uint8_t		dummy_0;
		uint8_t		type;
#define ADP_T_RAID0			0x00
#define ADP_T_RAID1			0x01
		uint8_t		dummy_1;
		uint8_t		flags;

		uint8_t		dummy_2;
		uint8_t		dummy_3;
		uint8_t		dummy_4;
		uint8_t		dummy_5;

		uint32_t	disk_number;
		uint32_t	dummy_6;
		uint32_t	sectors;
		uint16_t	stripe_sectors;
		uint16_t	dummy_7;

		uint32_t	dummy_8[4];
		uint8_t		name[16];
	} configs[127];
	uint32_t	dummy_6[13];
	uint32_t	magic_1;
#define ADP_MAGIC_1		0x0950f89f
	uint32_t	dummy_7[3];
	uint32_t	magic_2;
	uint32_t	dummy_8[46];
	uint32_t	magic_3;
#define ADP_MAGIC_3		0x4450544d
	uint32_t	magic_4;
#define ADP_MAGIC_4		0x0950f89f
	uint32_t	dummy_9[62];
} __packed;

/* VIA Tech V-RAID Metadata */
/* Derrived from FreeBSD ata-raid.h 1.46 */
#define VIA_LBA(wd) ((wd)->sc_capacity - 1)

struct via_raid_conf {
	uint16_t	magic;
#define VIA_MAGIC		0xaa55
	uint8_t		dummy_0;
	uint8_t		type;
#define VIA_T_MASK		0x7e
#define VIA_T_BOOTABLE		0x01
#define VIA_T_RAID0		0x04
#define VIA_T_RAID1		0x0c
#define VIA_T_RAID01		0x4c
#define VIA_T_RAID5		0x2c
#define VIA_T_SPAN		0x44
#define VIA_T_UNKNOWN		0x80
	uint8_t		disk_index;
#define VIA_D_MASK		0x0f
#define VIA_D_DEGRADED		0x10
#define VIA_D_HIGH_IDX		0x20
	uint8_t		stripe_layout;
#define VIA_L_DISKS		0x07
#define VIA_L_MASK		0xf0
#define VIA_L_SHIFT		4
	uint64_t		disk_sectors;
	uint32_t		disk_id;
	uint32_t		disks[8];
	uint8_t			checksum;
	uint8_t			pad_0[461];
} __packed;

/* nVidia MediaShield Metadata */
/* taken from FreeBSD ata-raid.h 1.47 */
#define NVIDIA_LBA(wd) ((wd)->sc_capacity - 2)

struct nvidia_raid_conf {
    uint8_t            nvidia_id[8];
#define NV_MAGIC                "NVIDIA  "

    uint32_t           config_size;
    uint32_t           checksum;
    uint16_t           version;
    uint8_t            disk_number;
    uint8_t            dummy_0;
    uint32_t           total_sectors;
    uint32_t           sector_size;
    uint8_t            serial[16];
    uint8_t            revision[4];
    uint32_t           dummy_1;

    uint32_t           magic_0;
#define NV_MAGIC0               0x00640044

    uint64_t           magic_1;
    uint64_t           magic_2;
    uint8_t            flags;
    uint8_t            array_width;
    uint8_t            total_disks;
    uint8_t            dummy_2;
    uint16_t           type;
#define NV_T_RAID0              0x00000080
#define NV_T_RAID1              0x00000081
#define NV_T_RAID3              0x00000083
#define NV_T_RAID5              0x00000085
#define NV_T_RAID01             0x00008180
#define NV_T_SPAN               0x000000ff

    uint16_t           dummy_3;
    uint32_t           stripe_sectors;
    uint32_t           stripe_bytes;
    uint32_t           stripe_shift;
    uint32_t           stripe_mask;
    uint32_t           stripe_sizesectors;
    uint32_t           stripe_sizebytes;
    uint32_t           rebuild_lba;
    uint32_t           dummy_4;
    uint32_t           dummy_5;
    uint32_t           status;
#define NV_S_BOOTABLE           0x00000001
#define NV_S_DEGRADED           0x00000002

    uint32_t           filler[98];
} __packed;

/* JMicron Technology Corp Metadata */
#define JMICRON_LBA(wd) 	((wd)->sc_capacity - 1)
#define JM_MAX_DISKS            8

struct jmicron_raid_conf {
	uint8_t 	signature[2];
#define JMICRON_MAGIC 		"JM"
	uint16_t 	version;
#define JMICRON_VERSION 	0x0001
	uint16_t 	checksum;
	uint8_t 	filler_1[10];
	uint32_t 	disk_id;
	uint32_t 	offset;
	uint32_t 	disk_sectors_high;
	uint16_t 	disk_sectors_low;
	uint8_t 	filler_2[2];
	uint8_t 	name[16];
	uint8_t 	type;
#define JM_T_RAID0 		0
#define JM_T_RAID1 		1
#define JM_T_RAID01 		2
#define JM_T_JBOD 		3
#define JM_T_RAID5 		5
	uint8_t 	stripe_shift;
	uint16_t 	flags;
#define JM_F_READY 		0x0001
#define JM_F_BOOTABLE 		0x0002
#define JM_F_BAD 		0x0004
#define JM_F_ACTIVE 		0x0010
#define JM_F_UNSYNC 		0x0020
#define JM_F_NEWEST 		0x0040
	uint8_t 	filler_3[4];
	uint32_t 	spare[2];
	uint32_t 	disks[JM_MAX_DISKS];
	uint8_t 	filler_4[32];
	uint8_t 	filler_5[384];
};

/* Intel MatrixRAID metadata */
#define INTEL_LBA(wd)		((wd)->sc_capacity - 3)

struct intel_raid_conf {
	uint8_t		intel_id[24];
#define INTEL_MAGIC		"Intel Raid ISM Cfg Sig. "

	uint8_t		version[6];
#define INTEL_VERSION_1100	"1.1.00"
#define INTEL_VERSION_1201	"1.2.01"
#define INTEL_VERSION_1202	"1.2.02"

	uint8_t		dummy_0[2];
	uint32_t	checksum;
	uint32_t	config_size;
	uint32_t	config_id;
	uint32_t	generation;
	uint32_t	dummy_1[2];
	uint8_t		total_disks;
	uint8_t		total_volumes;
	uint8_t 	dummy_2[2];
	uint32_t	filler_0[39];
	struct {
		uint8_t		serial[16];
		uint32_t	sectors;
		uint32_t	id;
		uint32_t	flags;
#define INTEL_F_SPARE			0x01
#define INTEL_F_ASSIGNED		0x02
#define INTEL_F_DOWN			0x04
#define INTEL_F_ONLINE			0x08
		uint32_t	filler[5];
	} __packed disk[1];
	uint32_t	filler_1[62];
} __packed;

struct intel_raid_mapping {
	uint8_t		name[16];
	uint64_t	total_sectors __packed;
	uint32_t	state;
	uint32_t	reserved;
	uint32_t	filler_0[20];
	uint32_t	offset;
	uint32_t	disk_sectors;
	uint32_t	stripe_count;
	uint16_t	stripe_sectors;
	uint8_t		status;
#define INTEL_S_READY		0x00
#define INTEL_S_DISABLED	0x01
#define INTEL_S_DEGRADED	0x02
#define INTEL_S_FAILURE		0x03

	uint8_t		type;
#define INTEL_T_RAID0		0x00
#define INTEL_T_RAID1		0x01
#define INTEL_T_RAID5		0x05

	uint8_t		total_disks;
	uint8_t		magic[3];
	uint32_t	filler_1[7];
	uint32_t	disk_idx[1];
} __packed;

#endif /* _DEV_PCI_PCIIDE_PROMISE_RAID_H_ */