NetBSD/sys/dev/ata/ata_raidreg.h
tron 2b3ca19215 Add support for Intel MatrixRAID to ataraid(4). It is currently limited
to one volume.

The driver was provided by Juan RP in PR kern/39511.
2008-09-11 11:08:50 +00:00

360 lines
9.3 KiB
C

/* $NetBSD: ata_raidreg.h,v 1.8 2008/09/11 11:08:50 tron Exp $ */
/*-
* Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer,
* without modification, immediately at the beginning of the file.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _DEV_PCI_PCIIDE_PROMISE_RAID_H_
#define _DEV_PCI_PCIIDE_PROMISE_RAID_H_
/*
* Macro to compute the LBA of the Promise RAID configuration structure,
* using the disk's softc structure.
*/
#define PR_LBA(wd) \
((((wd)->sc_capacity / \
((wd)->sc_params.atap_heads * (wd)->sc_params.atap_sectors)) * \
(wd)->sc_params.atap_heads * (wd)->sc_params.atap_sectors) - \
(wd)->sc_params.atap_sectors)
struct promise_raid_conf {
char promise_id[24];
#define PR_MAGIC "Promise Technology, Inc."
uint32_t dummy_0;
uint64_t magic_0;
uint16_t magic_1;
uint32_t magic_2;
uint8_t filler1[470];
struct { /* 0x200 */
uint32_t integrity;
#define PR_I_VALID 0x00000080
uint8_t flags;
#define PR_F_VALID 0x01
#define PR_F_ONLINE 0x02
#define PR_F_ASSIGNED 0x04
#define PR_F_SPARE 0x08
#define PR_F_DUPLICATE 0x10
#define PR_F_REDIR 0x20
#define PR_F_DOWN 0x40
#define PR_F_READY 0x80
uint8_t disk_number;
uint8_t channel;
uint8_t device;
uint64_t magic_0 __packed;
uint32_t disk_offset; /* 0x210 */
uint32_t disk_sectors;
uint32_t rebuild_lba;
uint16_t generation;
uint8_t status;
#define PR_S_VALID 0x01
#define PR_S_ONLINE 0x02
#define PR_S_INITED 0x04
#define PR_S_READY 0x08
#define PR_S_DEGRADED 0x10
#define PR_S_MARKED 0x20
#define PR_S_FUNCTIONAL 0x80
uint8_t type;
#define PR_T_RAID0 0x00
#define PR_T_RAID1 0x01
#define PR_T_RAID3 0x02
#define PR_T_RAID5 0x04
#define PR_T_SPAN 0x08
uint8_t total_disks; /* 0x220 */
uint8_t stripe_shift;
uint8_t array_width;
uint8_t array_number;
uint32_t total_sectors;
uint16_t cylinders;
uint8_t heads;
uint8_t sectors;
uint64_t magic_1 __packed;
struct {
uint8_t flags;
uint8_t dummy_0;
uint8_t channel;
uint8_t device;
uint64_t magic_0 __packed;
} disk[8];
} raid;
uint32_t filler2[346];
uint32_t checksum;
} __packed;
/*
* Macro to compute the LBA of the Adaptec HostRAID configuration structure,
* using the disk's softc structure.
*/
#define ADP_LBA(wd) \
((wd)->sc_capacity - 17)
struct adaptec_raid_conf {
uint32_t magic_0;
#define ADP_MAGIC_0 0x900765c4
uint32_t generation;
uint16_t dummy_0;
uint16_t total_configs;
uint16_t dummy_1;
uint16_t checksum;
uint32_t dummy_2;
uint32_t dummy_3;
uint32_t flags;
uint32_t timestamp;
uint32_t dummy_4[4];
uint32_t dummy_5[4];
struct {
uint16_t total_disks;
uint16_t generation;
uint32_t magic_0;
uint8_t dummy_0;
uint8_t type;
#define ADP_T_RAID0 0x00
#define ADP_T_RAID1 0x01
uint8_t dummy_1;
uint8_t flags;
uint8_t dummy_2;
uint8_t dummy_3;
uint8_t dummy_4;
uint8_t dummy_5;
uint32_t disk_number;
uint32_t dummy_6;
uint32_t sectors;
uint16_t stripe_sectors;
uint16_t dummy_7;
uint32_t dummy_8[4];
uint8_t name[16];
} configs[127];
uint32_t dummy_6[13];
uint32_t magic_1;
#define ADP_MAGIC_1 0x0950f89f
uint32_t dummy_7[3];
uint32_t magic_2;
uint32_t dummy_8[46];
uint32_t magic_3;
#define ADP_MAGIC_3 0x4450544d
uint32_t magic_4;
#define ADP_MAGIC_4 0x0950f89f
uint32_t dummy_9[62];
} __packed;
/* VIA Tech V-RAID Metadata */
/* Derrived from FreeBSD ata-raid.h 1.46 */
#define VIA_LBA(wd) ((wd)->sc_capacity - 1)
struct via_raid_conf {
uint16_t magic;
#define VIA_MAGIC 0xaa55
uint8_t dummy_0;
uint8_t type;
#define VIA_T_MASK 0x7e
#define VIA_T_BOOTABLE 0x01
#define VIA_T_RAID0 0x04
#define VIA_T_RAID1 0x0c
#define VIA_T_RAID01 0x4c
#define VIA_T_RAID5 0x2c
#define VIA_T_SPAN 0x44
#define VIA_T_UNKNOWN 0x80
uint8_t disk_index;
#define VIA_D_MASK 0x0f
#define VIA_D_DEGRADED 0x10
#define VIA_D_HIGH_IDX 0x20
uint8_t stripe_layout;
#define VIA_L_DISKS 0x07
#define VIA_L_MASK 0xf0
#define VIA_L_SHIFT 4
uint64_t disk_sectors;
uint32_t disk_id;
uint32_t disks[8];
uint8_t checksum;
uint8_t pad_0[461];
} __packed;
/* nVidia MediaShield Metadata */
/* taken from FreeBSD ata-raid.h 1.47 */
#define NVIDIA_LBA(wd) ((wd)->sc_capacity - 2)
struct nvidia_raid_conf {
u_int8_t nvidia_id[8];
#define NV_MAGIC "NVIDIA "
u_int32_t config_size;
u_int32_t checksum;
u_int16_t version;
u_int8_t disk_number;
u_int8_t dummy_0;
u_int32_t total_sectors;
u_int32_t sector_size;
u_int8_t serial[16];
u_int8_t revision[4];
u_int32_t dummy_1;
u_int32_t magic_0;
#define NV_MAGIC0 0x00640044
u_int64_t magic_1;
u_int64_t magic_2;
u_int8_t flags;
u_int8_t array_width;
u_int8_t total_disks;
u_int8_t dummy_2;
u_int16_t type;
#define NV_T_RAID0 0x00000080
#define NV_T_RAID1 0x00000081
#define NV_T_RAID3 0x00000083
#define NV_T_RAID5 0x00000085
#define NV_T_RAID01 0x00008180
#define NV_T_SPAN 0x000000ff
u_int16_t dummy_3;
u_int32_t stripe_sectors;
u_int32_t stripe_bytes;
u_int32_t stripe_shift;
u_int32_t stripe_mask;
u_int32_t stripe_sizesectors;
u_int32_t stripe_sizebytes;
u_int32_t rebuild_lba;
u_int32_t dummy_4;
u_int32_t dummy_5;
u_int32_t status;
#define NV_S_BOOTABLE 0x00000001
#define NV_S_DEGRADED 0x00000002
u_int32_t filler[98];
} __packed;
/* JMicron Technology Corp Metadata */
#define JMICRON_LBA(wd) ((wd)->sc_capacity - 1)
#define JM_MAX_DISKS 8
struct jmicron_raid_conf {
uint8_t signature[2];
#define JMICRON_MAGIC "JM"
uint16_t version;
#define JMICRON_VERSION 0x0001
uint16_t checksum;
uint8_t filler_1[10];
uint32_t disk_id;
uint32_t offset;
uint32_t disk_sectors_high;
uint16_t disk_sectors_low;
uint8_t filler_2[2];
uint8_t name[16];
uint8_t type;
#define JM_T_RAID0 0
#define JM_T_RAID1 1
#define JM_T_RAID01 2
#define JM_T_JBOD 3
#define JM_T_RAID5 5
uint8_t stripe_shift;
uint16_t flags;
#define JM_F_READY 0x0001
#define JM_F_BOOTABLE 0x0002
#define JM_F_BAD 0x0004
#define JM_F_ACTIVE 0x0010
#define JM_F_UNSYNC 0x0020
#define JM_F_NEWEST 0x0040
uint8_t filler_3[4];
uint32_t spare[2];
uint32_t disks[JM_MAX_DISKS];
uint8_t filler_4[32];
uint8_t filler_5[384];
};
/* Intel MatrixRAID metadata */
#define INTEL_LBA(wd) ((wd)->sc_capacity - 3)
struct intel_raid_conf {
uint8_t intel_id[24];
#define INTEL_MAGIC "Intel Raid ISM Cfg Sig. "
uint8_t version[6];
#define INTEL_VERSION_1100 "1.1.00"
#define INTEL_VERSION_1201 "1.2.01"
#define INTEL_VERSION_1202 "1.2.02"
uint8_t dummy_0[2];
uint32_t checksum;
uint32_t config_size;
uint32_t config_id;
uint32_t generation;
uint32_t dummy_1[2];
uint8_t total_disks;
uint8_t total_volumes;
uint8_t dummy_2[2];
uint32_t filler_0[39];
struct {
uint8_t serial[16];
uint32_t sectors;
uint32_t id;
uint32_t flags;
#define INTEL_F_SPARE 0x01
#define INTEL_F_ASSIGNED 0x02
#define INTEL_F_DOWN 0x04
#define INTEL_F_ONLINE 0x08
uint32_t filler[5];
} __packed disk[1];
uint32_t filler_1[62];
} __packed;
struct intel_raid_mapping {
uint8_t name[16];
uint64_t total_sectors __packed;
uint32_t state;
uint32_t reserved;
uint32_t filler_0[20];
uint32_t offset;
uint32_t disk_sectors;
uint32_t stripe_count;
uint16_t stripe_sectors;
uint8_t status;
#define INTEL_S_READY 0x00
#define INTEL_S_DISABLED 0x01
#define INTEL_S_DEGRADED 0x02
#define INTEL_S_FAILURE 0x03
uint8_t type;
#define INTEL_T_RAID0 0x00
#define INTEL_T_RAID1 0x01
#define INTEL_T_RAID5 0x05
uint8_t total_disks;
uint8_t magic[3];
uint32_t filler_1[7];
uint32_t disk_idx[1];
} __packed;
#endif /* _DEV_PCI_PCIIDE_PROMISE_RAID_H_ */