xref: /dragonfly/sys/dev/disk/nata/ata-raid.h (revision 9243051b)
1c1b3d7c5SThomas E. Spanjaard /*-
2f6e8a0a1SImre Vadasz  * Copyright (c) 2000 - 2006 Søren Schmidt <sos@FreeBSD.org>
3c1b3d7c5SThomas E. Spanjaard  * All rights reserved.
4c1b3d7c5SThomas E. Spanjaard  *
5c1b3d7c5SThomas E. Spanjaard  * Redistribution and use in source and binary forms, with or without
6c1b3d7c5SThomas E. Spanjaard  * modification, are permitted provided that the following conditions
7c1b3d7c5SThomas E. Spanjaard  * are met:
8c1b3d7c5SThomas E. Spanjaard  * 1. Redistributions of source code must retain the above copyright
9c1b3d7c5SThomas E. Spanjaard  *    notice, this list of conditions and the following disclaimer,
10c1b3d7c5SThomas E. Spanjaard  *    without modification, immediately at the beginning of the file.
11c1b3d7c5SThomas E. Spanjaard  * 2. Redistributions in binary form must reproduce the above copyright
12c1b3d7c5SThomas E. Spanjaard  *    notice, this list of conditions and the following disclaimer in the
13c1b3d7c5SThomas E. Spanjaard  *    documentation and/or other materials provided with the distribution.
14c1b3d7c5SThomas E. Spanjaard  *
15c1b3d7c5SThomas E. Spanjaard  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16c1b3d7c5SThomas E. Spanjaard  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17c1b3d7c5SThomas E. Spanjaard  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18c1b3d7c5SThomas E. Spanjaard  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19c1b3d7c5SThomas E. Spanjaard  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20c1b3d7c5SThomas E. Spanjaard  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21c1b3d7c5SThomas E. Spanjaard  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22c1b3d7c5SThomas E. Spanjaard  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23c1b3d7c5SThomas E. Spanjaard  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24c1b3d7c5SThomas E. Spanjaard  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25c1b3d7c5SThomas E. Spanjaard  *
26c1b3d7c5SThomas E. Spanjaard  * $FreeBSD: src/sys/dev/ata/ata-raid.h,v 1.44 2006/02/17 13:02:10 sos Exp $
27c1b3d7c5SThomas E. Spanjaard  */
28c1b3d7c5SThomas E. Spanjaard 
29c1b3d7c5SThomas E. Spanjaard #include <sys/param.h>
30c1b3d7c5SThomas E. Spanjaard 
31c1b3d7c5SThomas E. Spanjaard #include <sys/bus.h>
32c1b3d7c5SThomas E. Spanjaard #include <sys/disk.h>
33c1b3d7c5SThomas E. Spanjaard #include <sys/proc.h>
34*15bd3c73SMatthew Dillon #include <sys/lock.h>
35c1b3d7c5SThomas E. Spanjaard 
36c1b3d7c5SThomas E. Spanjaard /* misc defines */
37c1b3d7c5SThomas E. Spanjaard #define MAX_ARRAYS      16
38c1b3d7c5SThomas E. Spanjaard #define MAX_VOLUMES     4
39c1b3d7c5SThomas E. Spanjaard #define MAX_DISKS       16
40c1b3d7c5SThomas E. Spanjaard #define AR_PROXIMITY    2048    /* how many sectors is "close" */
41c1b3d7c5SThomas E. Spanjaard 
42c1b3d7c5SThomas E. Spanjaard #define ATA_MAGIC       "FreeBSD ATA driver RAID "
43c1b3d7c5SThomas E. Spanjaard 
44c1b3d7c5SThomas E. Spanjaard struct ata_raid_subdisk {
45c1b3d7c5SThomas E. Spanjaard     struct ar_softc     *raid[MAX_VOLUMES];
46c1b3d7c5SThomas E. Spanjaard     int                 disk_number[MAX_VOLUMES];
47c1b3d7c5SThomas E. Spanjaard };
48c1b3d7c5SThomas E. Spanjaard 
49c1b3d7c5SThomas E. Spanjaard /*  ATA PseudoRAID Metadata */
50c1b3d7c5SThomas E. Spanjaard struct ar_softc {
51c1b3d7c5SThomas E. Spanjaard     int                 lun;
52c1b3d7c5SThomas E. Spanjaard     u_int8_t            name[32];
53c1b3d7c5SThomas E. Spanjaard     int                 volume;
54c1b3d7c5SThomas E. Spanjaard     u_int64_t           magic_0;
55c1b3d7c5SThomas E. Spanjaard     u_int64_t           magic_1;
56c1b3d7c5SThomas E. Spanjaard     int                 type;
57c1b3d7c5SThomas E. Spanjaard #define AR_T_JBOD               0x0001
58c1b3d7c5SThomas E. Spanjaard #define AR_T_SPAN               0x0002
59c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID0              0x0004
60c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID1              0x0008
61c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID01             0x0010
62c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID3              0x0020
63c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID4              0x0040
64c1b3d7c5SThomas E. Spanjaard #define AR_T_RAID5              0x0080
65c1b3d7c5SThomas E. Spanjaard 
66c1b3d7c5SThomas E. Spanjaard     int                 status;
67c1b3d7c5SThomas E. Spanjaard #define AR_S_READY              0x0001
68c1b3d7c5SThomas E. Spanjaard #define AR_S_DEGRADED           0x0002
69c1b3d7c5SThomas E. Spanjaard #define AR_S_REBUILDING         0x0004
70c1b3d7c5SThomas E. Spanjaard 
71c1b3d7c5SThomas E. Spanjaard     int                 format;
72c1b3d7c5SThomas E. Spanjaard #define AR_F_FREEBSD_RAID       0x0001
73c1b3d7c5SThomas E. Spanjaard #define AR_F_ADAPTEC_RAID       0x0002
74c1b3d7c5SThomas E. Spanjaard #define AR_F_HPTV2_RAID         0x0004
75c1b3d7c5SThomas E. Spanjaard #define AR_F_HPTV3_RAID         0x0008
76c1b3d7c5SThomas E. Spanjaard #define AR_F_INTEL_RAID         0x0010
77c1b3d7c5SThomas E. Spanjaard #define AR_F_ITE_RAID           0x0020
78c1b3d7c5SThomas E. Spanjaard #define AR_F_JMICRON_RAID       0x0040
79c1b3d7c5SThomas E. Spanjaard #define AR_F_LSIV2_RAID         0x0080
80c1b3d7c5SThomas E. Spanjaard #define AR_F_LSIV3_RAID         0x0100
81c1b3d7c5SThomas E. Spanjaard #define AR_F_NVIDIA_RAID        0x0200
82c1b3d7c5SThomas E. Spanjaard #define AR_F_PROMISE_RAID       0x0400
83c1b3d7c5SThomas E. Spanjaard #define AR_F_SII_RAID           0x0800
84c1b3d7c5SThomas E. Spanjaard #define AR_F_SIS_RAID           0x1000
85c1b3d7c5SThomas E. Spanjaard #define AR_F_VIA_RAID           0x2000
86c1b3d7c5SThomas E. Spanjaard #define AR_F_FORMAT_MASK        0x1fff
87c1b3d7c5SThomas E. Spanjaard 
88c1b3d7c5SThomas E. Spanjaard     u_int               generation;
89c1b3d7c5SThomas E. Spanjaard     u_int64_t           total_sectors;
90c1b3d7c5SThomas E. Spanjaard     u_int64_t           offset_sectors; /* offset from start of disk */
91c1b3d7c5SThomas E. Spanjaard     u_int16_t           heads;
92c1b3d7c5SThomas E. Spanjaard     u_int16_t           sectors;
93c1b3d7c5SThomas E. Spanjaard     u_int32_t           cylinders;
94c1b3d7c5SThomas E. Spanjaard     u_int               width;          /* array width in disks */
95c1b3d7c5SThomas E. Spanjaard     u_int               interleave;     /* interleave in sectors */
96c1b3d7c5SThomas E. Spanjaard     u_int               total_disks;    /* number of disks in this array */
97c1b3d7c5SThomas E. Spanjaard     struct ar_disk {
98c1b3d7c5SThomas E. Spanjaard 	device_t        dev;
99c1b3d7c5SThomas E. Spanjaard 	u_int8_t        serial[16];     /* serial # of physical disk */
100c1b3d7c5SThomas E. Spanjaard 	u_int64_t       sectors;        /* useable sectors on this disk */
101c1b3d7c5SThomas E. Spanjaard 	off_t           last_lba;       /* last lba used (for performance) */
102c1b3d7c5SThomas E. Spanjaard 	u_int           flags;
103c1b3d7c5SThomas E. Spanjaard #define AR_DF_PRESENT           0x0001  /* this HW pos has a disk present */
104c1b3d7c5SThomas E. Spanjaard #define AR_DF_ASSIGNED          0x0002  /* this HW pos assigned to an array */
105c1b3d7c5SThomas E. Spanjaard #define AR_DF_SPARE             0x0004  /* this HW pos is a spare */
106c1b3d7c5SThomas E. Spanjaard #define AR_DF_ONLINE            0x0008  /* this HW pos is online and in use */
107c1b3d7c5SThomas E. Spanjaard 
108c1b3d7c5SThomas E. Spanjaard     } disks[MAX_DISKS];
109c1b3d7c5SThomas E. Spanjaard     int                 toggle;         /* performance hack for RAID1's */
110c1b3d7c5SThomas E. Spanjaard     u_int64_t           rebuild_lba;    /* rebuild progress indicator */
111*15bd3c73SMatthew Dillon     struct lock		lock;           /* metadata lock */
1125e8604ceSThomas E. Spanjaard     struct disk		disk;		/* disklabel/slice stuff */
11389be26e1SSascha Wildner     struct devstat	devstat;	/* device statistics */
1145e8604ceSThomas E. Spanjaard     cdev_t		cdev;		/* device placeholder */
115c1b3d7c5SThomas E. Spanjaard     struct proc         *pid;           /* rebuilder process id */
116c1b3d7c5SThomas E. Spanjaard };
117c1b3d7c5SThomas E. Spanjaard 
118c1b3d7c5SThomas E. Spanjaard /* Adaptec HostRAID Metadata */
119c1b3d7c5SThomas E. Spanjaard #define ADP_LBA(dev) \
120c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 17)
121c1b3d7c5SThomas E. Spanjaard 
122c1b3d7c5SThomas E. Spanjaard /* note all entries are big endian */
123c1b3d7c5SThomas E. Spanjaard struct adaptec_raid_conf {
124c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_0;
125c1b3d7c5SThomas E. Spanjaard #define ADP_MAGIC_0             0xc4650790
126c1b3d7c5SThomas E. Spanjaard 
127c1b3d7c5SThomas E. Spanjaard     u_int32_t           generation;
128c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_0;
129c1b3d7c5SThomas E. Spanjaard     u_int16_t           total_configs;
130c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_1;
131c1b3d7c5SThomas E. Spanjaard     u_int16_t           checksum;
132c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_2;
133c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_3;
134c1b3d7c5SThomas E. Spanjaard     u_int32_t           flags;
135c1b3d7c5SThomas E. Spanjaard     u_int32_t           timestamp;
136c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_4[4];
137c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_5[4];
138c1b3d7c5SThomas E. Spanjaard     struct {
139c1b3d7c5SThomas E. Spanjaard 	u_int16_t       total_disks;
140c1b3d7c5SThomas E. Spanjaard 	u_int16_t       generation;
141c1b3d7c5SThomas E. Spanjaard 	u_int32_t       magic_0;
142c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_0;
143c1b3d7c5SThomas E. Spanjaard 	u_int8_t        type;
144c1b3d7c5SThomas E. Spanjaard #define ADP_T_RAID0             0x00
145c1b3d7c5SThomas E. Spanjaard #define ADP_T_RAID1             0x01
146c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_1;
147c1b3d7c5SThomas E. Spanjaard 	u_int8_t        flags;
148c1b3d7c5SThomas E. Spanjaard 
149c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_2;
150c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_3;
151c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_4;
152c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_5;
153c1b3d7c5SThomas E. Spanjaard 
154c1b3d7c5SThomas E. Spanjaard 	u_int32_t       disk_number;
155c1b3d7c5SThomas E. Spanjaard 	u_int32_t       dummy_6;
156c1b3d7c5SThomas E. Spanjaard 	u_int32_t       sectors;
157c1b3d7c5SThomas E. Spanjaard 	u_int16_t       stripe_shift;
158c1b3d7c5SThomas E. Spanjaard 	u_int16_t       dummy_7;
159c1b3d7c5SThomas E. Spanjaard 
160c1b3d7c5SThomas E. Spanjaard 	u_int32_t       dummy_8[4];
161c1b3d7c5SThomas E. Spanjaard 	u_int8_t        name[16];
162c1b3d7c5SThomas E. Spanjaard     } configs[127];
163c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_6[13];
164c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_1;
165c1b3d7c5SThomas E. Spanjaard #define ADP_MAGIC_1             0x9ff85009
166c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_7[3];
167c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_2;
168c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_8[46];
169c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_3;
170c1b3d7c5SThomas E. Spanjaard #define ADP_MAGIC_3             0x4d545044
171c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_4;
172c1b3d7c5SThomas E. Spanjaard #define ADP_MAGIC_4             0x9ff85009
173c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_9[62];
174c1b3d7c5SThomas E. Spanjaard } __packed;
175c1b3d7c5SThomas E. Spanjaard 
176c1b3d7c5SThomas E. Spanjaard 
177c1b3d7c5SThomas E. Spanjaard /* Highpoint V2 RocketRAID Metadata */
178c1b3d7c5SThomas E. Spanjaard #define HPTV2_LBA(dev)  9
179c1b3d7c5SThomas E. Spanjaard 
180c1b3d7c5SThomas E. Spanjaard struct hptv2_raid_conf {
181c1b3d7c5SThomas E. Spanjaard     int8_t              filler1[32];
182c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic;
183c1b3d7c5SThomas E. Spanjaard #define HPTV2_MAGIC_OK          0x5a7816f0
184c1b3d7c5SThomas E. Spanjaard #define HPTV2_MAGIC_BAD         0x5a7816fd
185c1b3d7c5SThomas E. Spanjaard 
186c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_0;
187c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_1;
188c1b3d7c5SThomas E. Spanjaard     u_int32_t           order;
189c1b3d7c5SThomas E. Spanjaard #define HPTV2_O_RAID0           0x01
190c1b3d7c5SThomas E. Spanjaard #define HPTV2_O_RAID1           0x02
191c1b3d7c5SThomas E. Spanjaard #define HPTV2_O_OK              0x04
192c1b3d7c5SThomas E. Spanjaard 
193c1b3d7c5SThomas E. Spanjaard     u_int8_t            array_width;
194c1b3d7c5SThomas E. Spanjaard     u_int8_t            stripe_shift;
195c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
196c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID0           0x00
197c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID1           0x01
198c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID01_RAID0    0x02
199c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_SPAN            0x03
200c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID_3          0x04
201c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID_5          0x05
202c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_JBOD            0x06
203c1b3d7c5SThomas E. Spanjaard #define HPTV2_T_RAID01_RAID1    0x07
204c1b3d7c5SThomas E. Spanjaard 
205c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
206c1b3d7c5SThomas E. Spanjaard     u_int32_t           total_sectors;
207c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_mode;
208c1b3d7c5SThomas E. Spanjaard     u_int32_t           boot_mode;
209c1b3d7c5SThomas E. Spanjaard     u_int8_t            boot_disk;
210c1b3d7c5SThomas E. Spanjaard     u_int8_t            boot_protect;
211c1b3d7c5SThomas E. Spanjaard     u_int8_t            error_log_entries;
212c1b3d7c5SThomas E. Spanjaard     u_int8_t            error_log_index;
213c1b3d7c5SThomas E. Spanjaard     struct {
214c1b3d7c5SThomas E. Spanjaard 	u_int32_t       timestamp;
215c1b3d7c5SThomas E. Spanjaard 	u_int8_t        reason;
216c1b3d7c5SThomas E. Spanjaard #define HPTV2_R_REMOVED         0xfe
217c1b3d7c5SThomas E. Spanjaard #define HPTV2_R_BROKEN          0xff
218c1b3d7c5SThomas E. Spanjaard 
219c1b3d7c5SThomas E. Spanjaard 	u_int8_t        disk;
220c1b3d7c5SThomas E. Spanjaard 	u_int8_t        status;
221c1b3d7c5SThomas E. Spanjaard 	u_int8_t        sectors;
222c1b3d7c5SThomas E. Spanjaard 	u_int32_t       lba;
223c1b3d7c5SThomas E. Spanjaard     } errorlog[32];
224c1b3d7c5SThomas E. Spanjaard     int8_t              filler2[16];
225c1b3d7c5SThomas E. Spanjaard     u_int32_t           rebuild_lba;
226c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_1;
227c1b3d7c5SThomas E. Spanjaard     u_int8_t            name_1[15];
228c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_2;
229c1b3d7c5SThomas E. Spanjaard     u_int8_t            name_2[15];
230c1b3d7c5SThomas E. Spanjaard     int8_t              filler3[8];
231c1b3d7c5SThomas E. Spanjaard } __packed;
232c1b3d7c5SThomas E. Spanjaard 
233c1b3d7c5SThomas E. Spanjaard 
234c1b3d7c5SThomas E. Spanjaard /* Highpoint V3 RocketRAID Metadata */
235c1b3d7c5SThomas E. Spanjaard #define HPTV3_LBA(dev) \
236c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 11)
237c1b3d7c5SThomas E. Spanjaard 
238c1b3d7c5SThomas E. Spanjaard struct hptv3_raid_conf {
239c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic;
240c1b3d7c5SThomas E. Spanjaard #define HPTV3_MAGIC             0x5a7816f3
241c1b3d7c5SThomas E. Spanjaard 
242c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_0;
243c1b3d7c5SThomas E. Spanjaard     u_int8_t            checksum_0;
244c1b3d7c5SThomas E. Spanjaard     u_int8_t            mode;
245c1b3d7c5SThomas E. Spanjaard #define HPTV3_BOOT_MARK         0x01
246c1b3d7c5SThomas E. Spanjaard #define HPTV3_USER_MODE         0x02
247c1b3d7c5SThomas E. Spanjaard 
248c1b3d7c5SThomas E. Spanjaard     u_int8_t            user_mode;
249c1b3d7c5SThomas E. Spanjaard     u_int8_t            config_entries;
250c1b3d7c5SThomas E. Spanjaard     struct {
251c1b3d7c5SThomas E. Spanjaard 	u_int32_t       total_sectors;
252c1b3d7c5SThomas E. Spanjaard 	u_int8_t        type;
253c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_SPARE           0x00
254c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_JBOD            0x03
255c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_SPAN            0x04
256c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_RAID0           0x05
257c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_RAID1           0x06
258c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_RAID3           0x07
259c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_RAID5           0x08
260c1b3d7c5SThomas E. Spanjaard 
261c1b3d7c5SThomas E. Spanjaard 	u_int8_t        total_disks;
262c1b3d7c5SThomas E. Spanjaard 	u_int8_t        disk_number;
263c1b3d7c5SThomas E. Spanjaard 	u_int8_t        stripe_shift;
264c1b3d7c5SThomas E. Spanjaard 	u_int16_t       status;
265c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_NEED_REBUILD    0x01
266c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_RAID5_FLAG      0x02
267c1b3d7c5SThomas E. Spanjaard 
268c1b3d7c5SThomas E. Spanjaard 	u_int16_t       critical_disks;
269c1b3d7c5SThomas E. Spanjaard 	u_int32_t       rebuild_lba;
270c1b3d7c5SThomas E. Spanjaard     } __packed configs[2];
271c1b3d7c5SThomas E. Spanjaard     u_int8_t            name[16];
272c1b3d7c5SThomas E. Spanjaard     u_int32_t           timestamp;
273c1b3d7c5SThomas E. Spanjaard     u_int8_t            description[64];
274c1b3d7c5SThomas E. Spanjaard     u_int8_t            creator[16];
275c1b3d7c5SThomas E. Spanjaard     u_int8_t            checksum_1;
276c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_0;
277c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_1;
278c1b3d7c5SThomas E. Spanjaard     u_int8_t            flags;
279c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_ENABLE_TCQ      0x01
280c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_ENABLE_NCQ      0x02
281c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_ENABLE_WCACHE   0x04
282c1b3d7c5SThomas E. Spanjaard #define HPTV3_T_ENABLE_RCACHE   0x08
283c1b3d7c5SThomas E. Spanjaard 
284c1b3d7c5SThomas E. Spanjaard     struct {
285c1b3d7c5SThomas E. Spanjaard 	u_int32_t       total_sectors;
286c1b3d7c5SThomas E. Spanjaard 	u_int32_t       rebuild_lba;
287c1b3d7c5SThomas E. Spanjaard     } __packed configs_high[2];
288c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler[87];
289c1b3d7c5SThomas E. Spanjaard } __packed;
290c1b3d7c5SThomas E. Spanjaard 
291c1b3d7c5SThomas E. Spanjaard 
292c1b3d7c5SThomas E. Spanjaard /* Intel MatrixRAID Metadata */
293c1b3d7c5SThomas E. Spanjaard #define INTEL_LBA(dev) \
294c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 3)
295c1b3d7c5SThomas E. Spanjaard 
296c1b3d7c5SThomas E. Spanjaard struct intel_raid_conf {
297c1b3d7c5SThomas E. Spanjaard     u_int8_t            intel_id[24];
298c1b3d7c5SThomas E. Spanjaard #define INTEL_MAGIC             "Intel Raid ISM Cfg Sig. "
299c1b3d7c5SThomas E. Spanjaard 
300c1b3d7c5SThomas E. Spanjaard     u_int8_t            version[6];
301c1b3d7c5SThomas E. Spanjaard #define INTEL_VERSION_1100      "1.1.00"
302c1b3d7c5SThomas E. Spanjaard #define INTEL_VERSION_1201      "1.2.01"
303c1b3d7c5SThomas E. Spanjaard #define INTEL_VERSION_1202      "1.2.02"
304c1b3d7c5SThomas E. Spanjaard 
305c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_0[2];
306c1b3d7c5SThomas E. Spanjaard     u_int32_t           checksum;
307c1b3d7c5SThomas E. Spanjaard     u_int32_t           config_size;
308c1b3d7c5SThomas E. Spanjaard     u_int32_t           config_id;
309c1b3d7c5SThomas E. Spanjaard     u_int32_t           generation;
310c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_1[2];
311c1b3d7c5SThomas E. Spanjaard     u_int8_t            total_disks;
312c1b3d7c5SThomas E. Spanjaard     u_int8_t            total_volumes;
313c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_2[2];
314c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_0[39];
315c1b3d7c5SThomas E. Spanjaard     struct {
316c1b3d7c5SThomas E. Spanjaard 	u_int8_t        serial[16];
317c1b3d7c5SThomas E. Spanjaard 	u_int32_t       sectors;
318c1b3d7c5SThomas E. Spanjaard 	u_int32_t       id;
319c1b3d7c5SThomas E. Spanjaard 	u_int32_t       flags;
320c1b3d7c5SThomas E. Spanjaard #define INTEL_F_SPARE           0x01
321c1b3d7c5SThomas E. Spanjaard #define INTEL_F_ASSIGNED        0x02
322c1b3d7c5SThomas E. Spanjaard #define INTEL_F_DOWN            0x04
323c1b3d7c5SThomas E. Spanjaard #define INTEL_F_ONLINE          0x08
324c1b3d7c5SThomas E. Spanjaard 
325c1b3d7c5SThomas E. Spanjaard 	u_int32_t       filler[5];
326c1b3d7c5SThomas E. Spanjaard     } __packed disk[1];
327c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_1[62];
328c1b3d7c5SThomas E. Spanjaard } __packed;
329c1b3d7c5SThomas E. Spanjaard 
330c1b3d7c5SThomas E. Spanjaard struct intel_raid_mapping {
331c1b3d7c5SThomas E. Spanjaard     u_int8_t            name[16];
332c1b3d7c5SThomas E. Spanjaard     u_int64_t           total_sectors __packed;
333c1b3d7c5SThomas E. Spanjaard     u_int32_t           state;
334c1b3d7c5SThomas E. Spanjaard     u_int32_t           reserved;
335c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_0[20];
336c1b3d7c5SThomas E. Spanjaard     u_int32_t           offset;
337c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_sectors;
338c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_count;
339c1b3d7c5SThomas E. Spanjaard     u_int16_t           stripe_sectors;
340c1b3d7c5SThomas E. Spanjaard     u_int8_t            status;
341c1b3d7c5SThomas E. Spanjaard #define INTEL_S_READY           0x00
342c1b3d7c5SThomas E. Spanjaard #define INTEL_S_DISABLED        0x01
343c1b3d7c5SThomas E. Spanjaard #define INTEL_S_DEGRADED        0x02
344c1b3d7c5SThomas E. Spanjaard #define INTEL_S_FAILURE         0x03
345c1b3d7c5SThomas E. Spanjaard 
346c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
347c1b3d7c5SThomas E. Spanjaard #define INTEL_T_RAID0           0x00
348c1b3d7c5SThomas E. Spanjaard #define INTEL_T_RAID1           0x01
349c1b3d7c5SThomas E. Spanjaard #define INTEL_T_RAID5           0x05
350c1b3d7c5SThomas E. Spanjaard 
351c1b3d7c5SThomas E. Spanjaard     u_int8_t            total_disks;
352c1b3d7c5SThomas E. Spanjaard     u_int8_t            magic[3];
353c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_1[7];
354c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_idx[1];
355c1b3d7c5SThomas E. Spanjaard } __packed;
356c1b3d7c5SThomas E. Spanjaard 
357c1b3d7c5SThomas E. Spanjaard 
358c1b3d7c5SThomas E. Spanjaard /* Integrated Technology Express Metadata */
359c1b3d7c5SThomas E. Spanjaard #define ITE_LBA(dev) \
360c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 2)
361c1b3d7c5SThomas E. Spanjaard 
362c1b3d7c5SThomas E. Spanjaard struct ite_raid_conf {
363c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_1[5];
364c1b3d7c5SThomas E. Spanjaard     u_int8_t            timestamp_0[8];
365c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_1;
366c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_2[5];
367c1b3d7c5SThomas E. Spanjaard     u_int16_t           filler_3;
368c1b3d7c5SThomas E. Spanjaard     u_int8_t            ite_id[40];
369c1b3d7c5SThomas E. Spanjaard #define ITE_MAGIC               "Integrated Technology Express Inc      "
370c1b3d7c5SThomas E. Spanjaard 
371c1b3d7c5SThomas E. Spanjaard     u_int16_t           filler_4;
372c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_5[6];
373c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_2;
374c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_3;
375c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_6[12];
376c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_4;
377c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_7[5];
378c1b3d7c5SThomas E. Spanjaard     u_int64_t           total_sectors __packed;
379c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_8[12];
380c1b3d7c5SThomas E. Spanjaard 
381c1b3d7c5SThomas E. Spanjaard     u_int16_t           filler_9;
382c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
383c1b3d7c5SThomas E. Spanjaard #define ITE_T_RAID0             0x00
384c1b3d7c5SThomas E. Spanjaard #define ITE_T_RAID1             0x01
385c1b3d7c5SThomas E. Spanjaard #define ITE_T_RAID01            0x02
386c1b3d7c5SThomas E. Spanjaard #define ITE_T_SPAN              0x03
387c1b3d7c5SThomas E. Spanjaard 
388c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_10;
389c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_5[8];
390c1b3d7c5SThomas E. Spanjaard     u_int8_t            stripe_1kblocks;
391c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_11[3];
392c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_12[54];
393c1b3d7c5SThomas E. Spanjaard 
394c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_6[4];
395c1b3d7c5SThomas E. Spanjaard     u_int8_t            timestamp_1[8];
396c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_13[9];
397c1b3d7c5SThomas E. Spanjaard     u_int8_t            stripe_sectors;
398c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_14[3];
399c1b3d7c5SThomas E. Spanjaard     u_int8_t            array_width;
400c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_15[3];
401c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_16;
402c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_17;
403c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
404c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_sectors;
405c1b3d7c5SThomas E. Spanjaard     u_int16_t           filler_18;
406c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_7[4];
407c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_20[104];
408c1b3d7c5SThomas E. Spanjaard } __packed;
409c1b3d7c5SThomas E. Spanjaard 
410c1b3d7c5SThomas E. Spanjaard 
411c1b3d7c5SThomas E. Spanjaard /* JMicron Technology Corp Metadata */
412c1b3d7c5SThomas E. Spanjaard #define JMICRON_LBA(dev) \
413c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 1)
414c1b3d7c5SThomas E. Spanjaard #define	JM_MAX_DISKS		8
415c1b3d7c5SThomas E. Spanjaard 
416c1b3d7c5SThomas E. Spanjaard struct jmicron_raid_conf {
417c1b3d7c5SThomas E. Spanjaard     u_int8_t            signature[2];
418c1b3d7c5SThomas E. Spanjaard #define JMICRON_MAGIC		"JM"
419c1b3d7c5SThomas E. Spanjaard 
420c1b3d7c5SThomas E. Spanjaard     u_int16_t           version;
421c1b3d7c5SThomas E. Spanjaard #define JMICRON_VERSION		0x0001
422c1b3d7c5SThomas E. Spanjaard 
423c1b3d7c5SThomas E. Spanjaard     u_int16_t           checksum;
424c1b3d7c5SThomas E. Spanjaard     u_int8_t		filler_1[10];
425c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_id;
426c1b3d7c5SThomas E. Spanjaard     u_int32_t           offset;
427c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_sectors_high;
428c1b3d7c5SThomas E. Spanjaard     u_int16_t           disk_sectors_low;
429c1b3d7c5SThomas E. Spanjaard     u_int8_t		filler_2[2];
430c1b3d7c5SThomas E. Spanjaard     u_int8_t            name[16];
431c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
432c1b3d7c5SThomas E. Spanjaard #define	JM_T_RAID0		0
433c1b3d7c5SThomas E. Spanjaard #define	JM_T_RAID1		1
434c1b3d7c5SThomas E. Spanjaard #define	JM_T_RAID01		2
435c1b3d7c5SThomas E. Spanjaard #define	JM_T_JBOD		3
436c1b3d7c5SThomas E. Spanjaard #define	JM_T_RAID5		5
437c1b3d7c5SThomas E. Spanjaard 
438c1b3d7c5SThomas E. Spanjaard     u_int8_t            stripe_shift;
439c1b3d7c5SThomas E. Spanjaard     u_int16_t           flags;
440c1b3d7c5SThomas E. Spanjaard #define	JM_F_READY		0x0001
441c1b3d7c5SThomas E. Spanjaard #define JM_F_BOOTABLE		0x0002
442c1b3d7c5SThomas E. Spanjaard #define JM_F_BAD		0x0004
443c1b3d7c5SThomas E. Spanjaard #define JM_F_ACTIVE		0c0010
444c1b3d7c5SThomas E. Spanjaard #define JM_F_UNSYNC		0c0020
445c1b3d7c5SThomas E. Spanjaard #define JM_F_NEWEST		0c0040
446c1b3d7c5SThomas E. Spanjaard 
447c1b3d7c5SThomas E. Spanjaard     u_int8_t		filler_3[4];
448c1b3d7c5SThomas E. Spanjaard     u_int32_t           spare[2];
449c1b3d7c5SThomas E. Spanjaard     u_int32_t           disks[JM_MAX_DISKS];
450c1b3d7c5SThomas E. Spanjaard     u_int8_t		filler_4[32];
451c1b3d7c5SThomas E. Spanjaard     u_int8_t		filler_5[384];
452c1b3d7c5SThomas E. Spanjaard };
453c1b3d7c5SThomas E. Spanjaard 
454c1b3d7c5SThomas E. Spanjaard 
455c1b3d7c5SThomas E. Spanjaard /* LSILogic V2 MegaRAID Metadata */
456c1b3d7c5SThomas E. Spanjaard #define LSIV2_LBA(dev) \
457c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 1)
458c1b3d7c5SThomas E. Spanjaard 
459c1b3d7c5SThomas E. Spanjaard struct lsiv2_raid_conf {
460c1b3d7c5SThomas E. Spanjaard     u_int8_t            lsi_id[6];
461c1b3d7c5SThomas E. Spanjaard #define LSIV2_MAGIC             "$XIDE$"
462c1b3d7c5SThomas E. Spanjaard 
463c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_0;
464c1b3d7c5SThomas E. Spanjaard     u_int8_t            flags;
465c1b3d7c5SThomas E. Spanjaard     u_int16_t           version;
466c1b3d7c5SThomas E. Spanjaard     u_int8_t            config_entries;
467c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid_count;
468c1b3d7c5SThomas E. Spanjaard     u_int8_t            total_disks;
469c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_1;
470c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_2;
471c1b3d7c5SThomas E. Spanjaard 
472c1b3d7c5SThomas E. Spanjaard     union {
473c1b3d7c5SThomas E. Spanjaard 	struct {
474c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    type;
475c1b3d7c5SThomas E. Spanjaard #define LSIV2_T_RAID0           0x01
476c1b3d7c5SThomas E. Spanjaard #define LSIV2_T_RAID1           0x02
477c1b3d7c5SThomas E. Spanjaard #define LSIV2_T_SPARE           0x08
478c1b3d7c5SThomas E. Spanjaard 
479c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    dummy_0;
480c1b3d7c5SThomas E. Spanjaard 	    u_int16_t   stripe_sectors;
481c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    array_width;
482c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    disk_count;
483c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    config_offset;
484c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    dummy_1;
485c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    flags;
486c1b3d7c5SThomas E. Spanjaard #define LSIV2_R_DEGRADED        0x02
487c1b3d7c5SThomas E. Spanjaard 
488c1b3d7c5SThomas E. Spanjaard 	    u_int32_t   total_sectors;
489c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    filler[3];
490c1b3d7c5SThomas E. Spanjaard 	} __packed raid;
491c1b3d7c5SThomas E. Spanjaard 	struct {
492c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    device;
493c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_MASTER          0x00
494c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_SLAVE           0x01
495c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_CHANNEL0        0x00
496c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_CHANNEL1        0x10
497c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_NONE            0xff
498c1b3d7c5SThomas E. Spanjaard 
499c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    dummy_0;
500c1b3d7c5SThomas E. Spanjaard 	    u_int32_t   disk_sectors;
501c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    disk_number;
502c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    raid_number;
503c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    flags;
504c1b3d7c5SThomas E. Spanjaard #define LSIV2_D_GONE            0x02
505c1b3d7c5SThomas E. Spanjaard 
506c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    filler[7];
507c1b3d7c5SThomas E. Spanjaard 	} __packed disk;
508c1b3d7c5SThomas E. Spanjaard     } configs[30];
509c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
510c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid_number;
511c1b3d7c5SThomas E. Spanjaard     u_int32_t           timestamp;
512c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler[10];
513c1b3d7c5SThomas E. Spanjaard } __packed;
514c1b3d7c5SThomas E. Spanjaard 
515c1b3d7c5SThomas E. Spanjaard 
516c1b3d7c5SThomas E. Spanjaard /* LSILogic V3 MegaRAID Metadata */
517c1b3d7c5SThomas E. Spanjaard #define LSIV3_LBA(dev) \
518c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 4)
519c1b3d7c5SThomas E. Spanjaard 
520c1b3d7c5SThomas E. Spanjaard struct lsiv3_raid_conf {
521c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_0;        /* 0xa0203200 */
522c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_0[3];
523c1b3d7c5SThomas E. Spanjaard     u_int8_t            magic_1[4];     /* "SATA" */
524c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_1[40];
525c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_0;        /* 0x0d000003 */
526c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_2[7];
527c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_1;        /* 0x0d000003 */
528c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_3[70];
529c1b3d7c5SThomas E. Spanjaard     u_int8_t            magic_2[8];     /* "$_ENQ$31" */
530c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_4[7];
531c1b3d7c5SThomas E. Spanjaard     u_int8_t            checksum_0;
532c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_5[512*2];
533c1b3d7c5SThomas E. Spanjaard     u_int8_t            lsi_id[6];
534c1b3d7c5SThomas E. Spanjaard #define LSIV3_MAGIC             "$_IDE$"
535c1b3d7c5SThomas E. Spanjaard 
536c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_2;        /* 0x33de for OK disk */
537c1b3d7c5SThomas E. Spanjaard     u_int16_t           version;        /* 0x0131 for this version */
538c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_3;        /* 0x0440 always */
539c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler_6;
540c1b3d7c5SThomas E. Spanjaard 
541c1b3d7c5SThomas E. Spanjaard     struct {
542c1b3d7c5SThomas E. Spanjaard 	u_int16_t       stripe_pages;
543c1b3d7c5SThomas E. Spanjaard 	u_int8_t        type;
544c1b3d7c5SThomas E. Spanjaard #define LSIV3_T_RAID0           0x00
545c1b3d7c5SThomas E. Spanjaard #define LSIV3_T_RAID1           0x01
546c1b3d7c5SThomas E. Spanjaard 
547c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_0;
548c1b3d7c5SThomas E. Spanjaard 	u_int8_t        total_disks;
549c1b3d7c5SThomas E. Spanjaard 	u_int8_t        array_width;
550c1b3d7c5SThomas E. Spanjaard 	u_int8_t        filler_0[10];
551c1b3d7c5SThomas E. Spanjaard 
552c1b3d7c5SThomas E. Spanjaard 	u_int32_t       sectors;
553c1b3d7c5SThomas E. Spanjaard 	u_int16_t       dummy_1;
554c1b3d7c5SThomas E. Spanjaard 	u_int32_t       offset;
555c1b3d7c5SThomas E. Spanjaard 	u_int16_t       dummy_2;
556c1b3d7c5SThomas E. Spanjaard 	u_int8_t        device;
557c1b3d7c5SThomas E. Spanjaard #define LSIV3_D_DEVICE          0x01
558c1b3d7c5SThomas E. Spanjaard #define LSIV3_D_CHANNEL         0x10
559c1b3d7c5SThomas E. Spanjaard 
560c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_3;
561c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_4;
562c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_5;
563c1b3d7c5SThomas E. Spanjaard 	u_int8_t        filler_1[16];
564c1b3d7c5SThomas E. Spanjaard     } __packed raid[8];
565c1b3d7c5SThomas E. Spanjaard     struct {
566c1b3d7c5SThomas E. Spanjaard 	u_int32_t       disk_sectors;
567c1b3d7c5SThomas E. Spanjaard 	u_int32_t       dummy_0;
568c1b3d7c5SThomas E. Spanjaard 	u_int32_t       dummy_1;
569c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_2;
570c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_3;
571c1b3d7c5SThomas E. Spanjaard 	u_int8_t        flags;
572c1b3d7c5SThomas E. Spanjaard #define LSIV3_D_MIRROR          0x00
573c1b3d7c5SThomas E. Spanjaard #define LSIV3_D_STRIPE          0xff
574c1b3d7c5SThomas E. Spanjaard 	u_int8_t        dummy_4;
575c1b3d7c5SThomas E. Spanjaard     } __packed disk[6];
576c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_7[7];
577c1b3d7c5SThomas E. Spanjaard     u_int8_t            device;
578c1b3d7c5SThomas E. Spanjaard     u_int32_t           timestamp;
579c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_8[3];
580c1b3d7c5SThomas E. Spanjaard     u_int8_t            checksum_1;
581c1b3d7c5SThomas E. Spanjaard } __packed;
582c1b3d7c5SThomas E. Spanjaard 
583c1b3d7c5SThomas E. Spanjaard 
584c1b3d7c5SThomas E. Spanjaard /* nVidia MediaShield Metadata */
585c1b3d7c5SThomas E. Spanjaard #define NVIDIA_LBA(dev) \
586c1b3d7c5SThomas E. Spanjaard 	(((struct ad_softc *)device_get_ivars(dev))->total_secs - 2)
587c1b3d7c5SThomas E. Spanjaard 
588c1b3d7c5SThomas E. Spanjaard struct nvidia_raid_conf {
589c1b3d7c5SThomas E. Spanjaard     u_int8_t            nvidia_id[8];
590c1b3d7c5SThomas E. Spanjaard #define NV_MAGIC                "NVIDIA  "
591c1b3d7c5SThomas E. Spanjaard 
592c1b3d7c5SThomas E. Spanjaard     u_int32_t           config_size;
593c1b3d7c5SThomas E. Spanjaard     u_int32_t           checksum;
594c1b3d7c5SThomas E. Spanjaard     u_int16_t           version;
595c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
596c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_0;
597c1b3d7c5SThomas E. Spanjaard     u_int32_t           total_sectors;
598c1b3d7c5SThomas E. Spanjaard     u_int32_t           sector_size;
599c1b3d7c5SThomas E. Spanjaard     u_int8_t            serial[16];
600c1b3d7c5SThomas E. Spanjaard     u_int8_t            revision[4];
601c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_1;
602c1b3d7c5SThomas E. Spanjaard 
603c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_0;
604c1b3d7c5SThomas E. Spanjaard #define NV_MAGIC0               0x00640044
605c1b3d7c5SThomas E. Spanjaard 
606c1b3d7c5SThomas E. Spanjaard     u_int64_t           magic_1;
607c1b3d7c5SThomas E. Spanjaard     u_int64_t           magic_2;
608c1b3d7c5SThomas E. Spanjaard     u_int8_t            flags;
609c1b3d7c5SThomas E. Spanjaard     u_int8_t            array_width;
610c1b3d7c5SThomas E. Spanjaard     u_int8_t            total_disks;
611c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_2;
612c1b3d7c5SThomas E. Spanjaard     u_int16_t           type;
613c1b3d7c5SThomas E. Spanjaard #define NV_T_RAID0              0x00000080
614c1b3d7c5SThomas E. Spanjaard #define NV_T_RAID1              0x00000081
615c1b3d7c5SThomas E. Spanjaard #define NV_T_RAID3              0x00000083
616c1b3d7c5SThomas E. Spanjaard #define NV_T_RAID5              0x00000085
617c1b3d7c5SThomas E. Spanjaard #define NV_T_RAID01             0x00008180
618c1b3d7c5SThomas E. Spanjaard #define NV_T_SPAN               0x000000ff
619c1b3d7c5SThomas E. Spanjaard 
620c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_3;
621c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_sectors;
622c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_bytes;
623c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_shift;
624c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_mask;
625c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_sizesectors;
626c1b3d7c5SThomas E. Spanjaard     u_int32_t           stripe_sizebytes;
627c1b3d7c5SThomas E. Spanjaard     u_int32_t           rebuild_lba;
628c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_4;
629c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_5;
630c1b3d7c5SThomas E. Spanjaard     u_int32_t           status;
631c1b3d7c5SThomas E. Spanjaard #define NV_S_BOOTABLE           0x00000001
632c1b3d7c5SThomas E. Spanjaard #define NV_S_DEGRADED           0x00000002
633c1b3d7c5SThomas E. Spanjaard 
634c1b3d7c5SThomas E. Spanjaard     u_int32_t           filler[98];
635c1b3d7c5SThomas E. Spanjaard } __packed;
636c1b3d7c5SThomas E. Spanjaard 
637c1b3d7c5SThomas E. Spanjaard 
638c1b3d7c5SThomas E. Spanjaard /* Promise FastTrak Metadata */
639c1b3d7c5SThomas E. Spanjaard #define PROMISE_LBA(dev) \
640c1b3d7c5SThomas E. Spanjaard 	(((((struct ad_softc *)device_get_ivars(dev))->total_secs / (((struct ad_softc *)device_get_ivars(dev))->heads * ((struct ad_softc *)device_get_ivars(dev))->sectors)) * ((struct ad_softc *)device_get_ivars(dev))->heads * ((struct ad_softc *)device_get_ivars(dev))->sectors) - ((struct ad_softc *)device_get_ivars(dev))->sectors)
641c1b3d7c5SThomas E. Spanjaard 
642c1b3d7c5SThomas E. Spanjaard struct promise_raid_conf {
643c1b3d7c5SThomas E. Spanjaard     char                promise_id[24];
644c1b3d7c5SThomas E. Spanjaard #define PR_MAGIC                "Promise Technology, Inc."
645c1b3d7c5SThomas E. Spanjaard 
646c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_0;
647c1b3d7c5SThomas E. Spanjaard     u_int64_t           magic_0;
648c1b3d7c5SThomas E. Spanjaard #define PR_MAGIC0(x)            (((u_int64_t)(x.channel) << 48) | \
649c1b3d7c5SThomas E. Spanjaard 				((u_int64_t)(x.device != 0) << 56))
650c1b3d7c5SThomas E. Spanjaard     u_int16_t           magic_1;
651c1b3d7c5SThomas E. Spanjaard     u_int32_t           magic_2;
652c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler1[470];
653c1b3d7c5SThomas E. Spanjaard     struct {
654c1b3d7c5SThomas E. Spanjaard 	u_int32_t       integrity;
655c1b3d7c5SThomas E. Spanjaard #define PR_I_VALID              0x00000080
656c1b3d7c5SThomas E. Spanjaard 
657c1b3d7c5SThomas E. Spanjaard 	u_int8_t        flags;
658c1b3d7c5SThomas E. Spanjaard #define PR_F_VALID              0x00000001
659c1b3d7c5SThomas E. Spanjaard #define PR_F_ONLINE             0x00000002
660c1b3d7c5SThomas E. Spanjaard #define PR_F_ASSIGNED           0x00000004
661c1b3d7c5SThomas E. Spanjaard #define PR_F_SPARE              0x00000008
662c1b3d7c5SThomas E. Spanjaard #define PR_F_DUPLICATE          0x00000010
663c1b3d7c5SThomas E. Spanjaard #define PR_F_REDIR              0x00000020
664c1b3d7c5SThomas E. Spanjaard #define PR_F_DOWN               0x00000040
665c1b3d7c5SThomas E. Spanjaard #define PR_F_READY              0x00000080
666c1b3d7c5SThomas E. Spanjaard 
667c1b3d7c5SThomas E. Spanjaard 	u_int8_t        disk_number;
668c1b3d7c5SThomas E. Spanjaard 	u_int8_t        channel;
669c1b3d7c5SThomas E. Spanjaard 	u_int8_t        device;
670c1b3d7c5SThomas E. Spanjaard 	u_int64_t       magic_0 __packed;
671c1b3d7c5SThomas E. Spanjaard 	u_int32_t       disk_offset;
672c1b3d7c5SThomas E. Spanjaard 	u_int32_t       disk_sectors;
673c1b3d7c5SThomas E. Spanjaard 	u_int32_t       rebuild_lba;
674c1b3d7c5SThomas E. Spanjaard 	u_int16_t       generation;
675c1b3d7c5SThomas E. Spanjaard 	u_int8_t        status;
676c1b3d7c5SThomas E. Spanjaard #define PR_S_VALID              0x01
677c1b3d7c5SThomas E. Spanjaard #define PR_S_ONLINE             0x02
678c1b3d7c5SThomas E. Spanjaard #define PR_S_INITED             0x04
679c1b3d7c5SThomas E. Spanjaard #define PR_S_READY              0x08
680c1b3d7c5SThomas E. Spanjaard #define PR_S_DEGRADED           0x10
681c1b3d7c5SThomas E. Spanjaard #define PR_S_MARKED             0x20
682c1b3d7c5SThomas E. Spanjaard #define PR_S_FUNCTIONAL         0x80
683c1b3d7c5SThomas E. Spanjaard 
684c1b3d7c5SThomas E. Spanjaard 	u_int8_t        type;
685c1b3d7c5SThomas E. Spanjaard #define PR_T_RAID0              0x00
686c1b3d7c5SThomas E. Spanjaard #define PR_T_RAID1              0x01
687c1b3d7c5SThomas E. Spanjaard #define PR_T_RAID3              0x02
688c1b3d7c5SThomas E. Spanjaard #define PR_T_RAID5              0x04
689c1b3d7c5SThomas E. Spanjaard #define PR_T_SPAN               0x08
690c1b3d7c5SThomas E. Spanjaard #define PR_T_JBOD               0x10
691c1b3d7c5SThomas E. Spanjaard 
692c1b3d7c5SThomas E. Spanjaard 	u_int8_t        total_disks;
693c1b3d7c5SThomas E. Spanjaard 	u_int8_t        stripe_shift;
694c1b3d7c5SThomas E. Spanjaard 	u_int8_t        array_width;
695c1b3d7c5SThomas E. Spanjaard 	u_int8_t        array_number;
696c1b3d7c5SThomas E. Spanjaard 	u_int32_t       total_sectors;
697c1b3d7c5SThomas E. Spanjaard 	u_int16_t       cylinders;
698c1b3d7c5SThomas E. Spanjaard 	u_int8_t        heads;
699c1b3d7c5SThomas E. Spanjaard 	u_int8_t        sectors;
700c1b3d7c5SThomas E. Spanjaard 	u_int64_t       magic_1 __packed;
701c1b3d7c5SThomas E. Spanjaard 	struct {
702c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    flags;
703c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    dummy_0;
704c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    channel;
705c1b3d7c5SThomas E. Spanjaard 	    u_int8_t    device;
706c1b3d7c5SThomas E. Spanjaard 	    u_int64_t   magic_0 __packed;
707c1b3d7c5SThomas E. Spanjaard 	} disk[8];
708c1b3d7c5SThomas E. Spanjaard     } raid;
709c1b3d7c5SThomas E. Spanjaard     int32_t             filler2[346];
710c1b3d7c5SThomas E. Spanjaard     u_int32_t           checksum;
711c1b3d7c5SThomas E. Spanjaard } __packed;
712c1b3d7c5SThomas E. Spanjaard 
713c1b3d7c5SThomas E. Spanjaard 
714c1b3d7c5SThomas E. Spanjaard /* Silicon Image Medley Metadata */
715c1b3d7c5SThomas E. Spanjaard #define SII_LBA(dev) \
716c1b3d7c5SThomas E. Spanjaard 	( ((struct ad_softc *)device_get_ivars(dev))->total_secs - 1)
717c1b3d7c5SThomas E. Spanjaard 
718c1b3d7c5SThomas E. Spanjaard struct sii_raid_conf {
719c1b3d7c5SThomas E. Spanjaard     u_int16_t           ata_params_00_53[54];
720c1b3d7c5SThomas E. Spanjaard     u_int64_t           total_sectors;
721c1b3d7c5SThomas E. Spanjaard     u_int16_t           ata_params_58_79[70];
722c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_0;
723c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_1;
724c1b3d7c5SThomas E. Spanjaard     u_int32_t           controller_pci_id;
725c1b3d7c5SThomas E. Spanjaard     u_int16_t           version_minor;
726c1b3d7c5SThomas E. Spanjaard     u_int16_t           version_major;
727c1b3d7c5SThomas E. Spanjaard     u_int8_t            timestamp[6];
728c1b3d7c5SThomas E. Spanjaard     u_int16_t           stripe_sectors;
729c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_2;
730c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
731c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
732c1b3d7c5SThomas E. Spanjaard #define SII_T_RAID0             0x00
733c1b3d7c5SThomas E. Spanjaard #define SII_T_RAID1             0x01
734c1b3d7c5SThomas E. Spanjaard #define SII_T_RAID01            0x02
735c1b3d7c5SThomas E. Spanjaard #define SII_T_SPARE             0x03
736c1b3d7c5SThomas E. Spanjaard 
737c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid0_disks;
738c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid0_ident;
739c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid1_disks;
740c1b3d7c5SThomas E. Spanjaard     u_int8_t            raid1_ident;
741c1b3d7c5SThomas E. Spanjaard     u_int64_t           rebuild_lba;
742c1b3d7c5SThomas E. Spanjaard     u_int32_t           generation;
743c1b3d7c5SThomas E. Spanjaard     u_int8_t            status;
744c1b3d7c5SThomas E. Spanjaard #define SII_S_READY             0x01
745c1b3d7c5SThomas E. Spanjaard 
746c1b3d7c5SThomas E. Spanjaard     u_int8_t            base_raid1_position;
747c1b3d7c5SThomas E. Spanjaard     u_int8_t            base_raid0_position;
748c1b3d7c5SThomas E. Spanjaard     u_int8_t            position;
749c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_3;
750c1b3d7c5SThomas E. Spanjaard     u_int8_t            name[16];
751c1b3d7c5SThomas E. Spanjaard     u_int16_t           checksum_0;
752c1b3d7c5SThomas E. Spanjaard     int8_t              filler1[190];
753c1b3d7c5SThomas E. Spanjaard     u_int16_t           checksum_1;
754c1b3d7c5SThomas E. Spanjaard } __packed;
755c1b3d7c5SThomas E. Spanjaard 
756c1b3d7c5SThomas E. Spanjaard 
757c1b3d7c5SThomas E. Spanjaard /* Silicon Integrated Systems RAID Metadata */
758c1b3d7c5SThomas E. Spanjaard #define SIS_LBA(dev) \
759c1b3d7c5SThomas E. Spanjaard 	( ((struct ad_softc *)device_get_ivars(dev))->total_secs - 16)
760c1b3d7c5SThomas E. Spanjaard 
761c1b3d7c5SThomas E. Spanjaard struct sis_raid_conf {
762c1b3d7c5SThomas E. Spanjaard     u_int16_t           magic;
763c1b3d7c5SThomas E. Spanjaard #define SIS_MAGIC               0x0010
764c1b3d7c5SThomas E. Spanjaard 
765c1b3d7c5SThomas E. Spanjaard     u_int8_t            disks;
766c1b3d7c5SThomas E. Spanjaard #define SIS_D_MASTER            0xf0
767c1b3d7c5SThomas E. Spanjaard #define SIS_D_MIRROR            0x0f
768c1b3d7c5SThomas E. Spanjaard 
769c1b3d7c5SThomas E. Spanjaard     u_int8_t            type_total_disks;
770c1b3d7c5SThomas E. Spanjaard #define SIS_D_MASK              0x0f
771c1b3d7c5SThomas E. Spanjaard #define SIS_T_MASK              0xf0
772c1b3d7c5SThomas E. Spanjaard #define SIS_T_JBOD              0x10
773c1b3d7c5SThomas E. Spanjaard #define SIS_T_RAID0             0x20
774c1b3d7c5SThomas E. Spanjaard #define SIS_T_RAID1             0x30
775c1b3d7c5SThomas E. Spanjaard 
776c1b3d7c5SThomas E. Spanjaard     u_int32_t           dummy_0;
777c1b3d7c5SThomas E. Spanjaard     u_int32_t           controller_pci_id;
778c1b3d7c5SThomas E. Spanjaard     u_int16_t           stripe_sectors;
779c1b3d7c5SThomas E. Spanjaard     u_int16_t           dummy_1;
780c1b3d7c5SThomas E. Spanjaard     u_int32_t           timestamp;
781c1b3d7c5SThomas E. Spanjaard     u_int8_t            model[40];
782c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_number;
783c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_2[3];
784c1b3d7c5SThomas E. Spanjaard     int8_t              filler1[448];
785c1b3d7c5SThomas E. Spanjaard } __packed;
786c1b3d7c5SThomas E. Spanjaard 
787c1b3d7c5SThomas E. Spanjaard 
788c1b3d7c5SThomas E. Spanjaard /* VIA Tech V-RAID Metadata */
789c1b3d7c5SThomas E. Spanjaard #define VIA_LBA(dev) \
790c1b3d7c5SThomas E. Spanjaard 	( ((struct ad_softc *)device_get_ivars(dev))->total_secs - 1)
791c1b3d7c5SThomas E. Spanjaard 
792c1b3d7c5SThomas E. Spanjaard struct via_raid_conf {
793c1b3d7c5SThomas E. Spanjaard     u_int16_t           magic;
794c1b3d7c5SThomas E. Spanjaard #define VIA_MAGIC               0xaa55
795c1b3d7c5SThomas E. Spanjaard 
796c1b3d7c5SThomas E. Spanjaard     u_int8_t            dummy_0;
797c1b3d7c5SThomas E. Spanjaard     u_int8_t            type;
798c1b3d7c5SThomas E. Spanjaard #define VIA_T_MASK              0x7e
799c1b3d7c5SThomas E. Spanjaard #define VIA_T_BOOTABLE          0x01
800c1b3d7c5SThomas E. Spanjaard #define VIA_T_RAID0             0x04
801c1b3d7c5SThomas E. Spanjaard #define VIA_T_RAID1             0x0c
802c1b3d7c5SThomas E. Spanjaard #define VIA_T_RAID01            0x4c
803c1b3d7c5SThomas E. Spanjaard #define VIA_T_RAID5             0x2c
804c1b3d7c5SThomas E. Spanjaard #define VIA_T_SPAN              0x44
805c1b3d7c5SThomas E. Spanjaard #define VIA_T_UNKNOWN           0x80
806c1b3d7c5SThomas E. Spanjaard 
807c1b3d7c5SThomas E. Spanjaard     u_int8_t            disk_index;
808c1b3d7c5SThomas E. Spanjaard #define VIA_D_MASK              0x0f
809c1b3d7c5SThomas E. Spanjaard #define VIA_D_DEGRADED          0x10
810c1b3d7c5SThomas E. Spanjaard #define VIA_D_HIGH_IDX          0x20
811c1b3d7c5SThomas E. Spanjaard 
812c1b3d7c5SThomas E. Spanjaard     u_int8_t            stripe_layout;
813c1b3d7c5SThomas E. Spanjaard #define VIA_L_DISKS             0x07
814c1b3d7c5SThomas E. Spanjaard #define VIA_L_MASK              0xf0
815c1b3d7c5SThomas E. Spanjaard #define VIA_L_SHIFT             4
816c1b3d7c5SThomas E. Spanjaard 
817c1b3d7c5SThomas E. Spanjaard     u_int64_t           disk_sectors;
818c1b3d7c5SThomas E. Spanjaard     u_int32_t           disk_id;
819c1b3d7c5SThomas E. Spanjaard     u_int32_t           disks[8];
820c1b3d7c5SThomas E. Spanjaard     u_int8_t            checksum;
821c1b3d7c5SThomas E. Spanjaard     u_int8_t            filler_1[461];
822c1b3d7c5SThomas E. Spanjaard } __packed;
823