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