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