summaryrefslogtreecommitdiff
path: root/sys/dev/ata/ata_raidreg.h
blob: c88be7db7eaf0dfc5e7809d8c0ebd2c7be930afa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*	$NetBSD: ata_raidreg.h,v 1.3 2005/12/11 12:21:14 christos 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 __attribute__((__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 __attribute__((__packed__));
		struct {
			uint8_t		flags;
			uint8_t		dummy_0;
			uint8_t		channel;
			uint8_t		device;
			uint64_t	magic_0 __attribute__((__packed__));
		} disk[8];
	} raid;
	uint32_t	filler2[346];
	uint32_t	checksum;
} __attribute__((__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];
} __attribute__((__packed__));

#endif /* _DEV_PCI_PCIIDE_PROMISE_RAID_H_ */