NetBSD/sys/dev/ata/ata_raidreg.h
thorpej 3381232270 Experimental support for RAID volumes configured by ATA "RAID" controllers.
Such RAID controllers are actually just IDE controllers with a BIOS that
can create RAID volumes and write the configuration info to config blocks
on the disks.  The BIOS can do I/O to these volumes, and the OS must
understand the config blocks and implement RAID in software in order to be
able to use these volumes.

Only SPAN (simple concatenation) and RAID0 are supported at this time,
and writing back config blocks is also not supported at this time.  Currently,
only the Promise configuration scheme is supported, although supporting
the Highpoint scheme should not be too difficult.

In any case, this is sufficient to use the Promise RAID0 volume (thus
preserving the win2k AS installation) on this new Intel server I have.

Thanks to Soren Schmidt for doing the work in FreeBSD; it made this
task much easier.  The config block parsing code is adapted from his
work.
2003-01-27 18:21:23 +00:00

114 lines
3.6 KiB
C

/* $NetBSD: ata_raidreg.h,v 1.1 2003/01/27 18:21:28 thorpej 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__));
#endif /* _DEV_PCI_PCIIDE_PROMISE_RAID_H_ */