xref: /freebsd-src/sys/dev/hpt27xx/array.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
181966bceSXin LI /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4f29c86f1SXin LI  * Copyright (c) 2004-2011 HighPoint Technologies, Inc.
581966bceSXin LI  * All rights reserved.
681966bceSXin LI  *
781966bceSXin LI  * Redistribution and use in source and binary forms, with or without
881966bceSXin LI  * modification, are permitted provided that the following conditions
981966bceSXin LI  * are met:
1081966bceSXin LI  * 1. Redistributions of source code must retain the above copyright
1181966bceSXin LI  *    notice, this list of conditions and the following disclaimer.
1281966bceSXin LI  * 2. Redistributions in binary form must reproduce the above copyright
1381966bceSXin LI  *    notice, this list of conditions and the following disclaimer in the
1481966bceSXin LI  *    documentation and/or other materials provided with the distribution.
1581966bceSXin LI  *
1681966bceSXin LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1781966bceSXin LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1881966bceSXin LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1981966bceSXin LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2081966bceSXin LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2181966bceSXin LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2281966bceSXin LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2381966bceSXin LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2481966bceSXin LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2581966bceSXin LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2681966bceSXin LI  * SUCH DAMAGE.
2781966bceSXin LI  */
2881966bceSXin LI 
2981966bceSXin LI #include <dev/hpt27xx/hpt27xx_config.h>
3081966bceSXin LI 
3181966bceSXin LI #ifndef _HPT_ARRAY_H_
3281966bceSXin LI #define _HPT_ARRAY_H_
3381966bceSXin LI 
3481966bceSXin LI #define VERMAGIC_ARRAY 46
3581966bceSXin LI 
3681966bceSXin LI #if defined(__cplusplus)
3781966bceSXin LI extern "C" {
3881966bceSXin LI #endif
3981966bceSXin LI 
4081966bceSXin LI #define MAX_ARRAY_NAME 16
4181966bceSXin LI 
4281966bceSXin LI #ifndef MAX_MEMBERS
4381966bceSXin LI #define MAX_MEMBERS    16
4481966bceSXin LI #endif
4581966bceSXin LI 
4681966bceSXin LI #if MAX_MEMBERS<=16
4781966bceSXin LI typedef HPT_U16 HPT_MMASK;
4881966bceSXin LI #elif MAX_MEMBERS<=32
4981966bceSXin LI typedef HPT_U32 HPT_MMASK;
5081966bceSXin LI #elif MAX_MEMBERS<=64
5181966bceSXin LI typedef HPT_U64 HPT_MMASK;
5281966bceSXin LI #else
5381966bceSXin LI #error "MAX_MEMBERS too large"
5481966bceSXin LI #endif
5581966bceSXin LI 
5681966bceSXin LI #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
5781966bceSXin LI 
5881966bceSXin LI #if MAX_MEMBERS<32
5981966bceSXin LI #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
6081966bceSXin LI #else
6181966bceSXin LI #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
6281966bceSXin LI #endif
6381966bceSXin LI 
6481966bceSXin LI #define MAX_REBUILD_SECTORS 128
6581966bceSXin LI 
6681966bceSXin LI typedef struct _RAID_FLAGS {
6781966bceSXin LI 	HPT_UINT rf_need_initialize : 1;
6881966bceSXin LI 	HPT_UINT rf_need_rebuild: 1;
6981966bceSXin LI 	HPT_UINT rf_need_sync: 1;
7081966bceSXin LI 	/* ioctl flags */
7181966bceSXin LI 	HPT_UINT rf_auto_rebuild: 1;
7281966bceSXin LI 	HPT_UINT rf_rebuilding: 1;
7381966bceSXin LI 	HPT_UINT rf_verifying: 1;
7481966bceSXin LI 	HPT_UINT rf_initializing: 1;
7581966bceSXin LI 	HPT_UINT rf_abort_verifying: 1;
7681966bceSXin LI 	HPT_UINT rf_raid15: 1;
7781966bceSXin LI 	HPT_UINT rf_v3_format : 1;
7881966bceSXin LI 	HPT_UINT rf_need_transform : 1;
7981966bceSXin LI 	HPT_UINT rf_transforming : 1;
8081966bceSXin LI 	HPT_UINT rf_abort_transform : 1;
8181966bceSXin LI 	HPT_UINT rf_log_write: 1;
8281966bceSXin LI } RAID_FLAGS;
8381966bceSXin LI 
8481966bceSXin LI typedef struct transform_cmd_ext
8581966bceSXin LI {
8681966bceSXin LI 	HPT_LBA lba;
8781966bceSXin LI 	HPT_U16 total_sectors;
8881966bceSXin LI 	HPT_U16 finished_sectors;
8981966bceSXin LI } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
9081966bceSXin LI 
9181966bceSXin LI 
9281966bceSXin LI #define TO_MOVE_DATA        0
9381966bceSXin LI #define TO_INITIALIZE       1
9481966bceSXin LI #define TO_INITIALIZE_ONLY  2
9581966bceSXin LI #define TO_MOVE_DATA_ONLY   3
9681966bceSXin LI typedef struct hpt_transform
9781966bceSXin LI {
9881966bceSXin LI 	HPT_U32 stamp;
9981966bceSXin LI 	PVDEV source;
10081966bceSXin LI 	PVDEV target;
10181966bceSXin LI 	struct list_head link;
10281966bceSXin LI 	HPT_U8 transform_from_tail;
10381966bceSXin LI 	struct tq_item task;
10481966bceSXin LI 
10581966bceSXin LI 	struct lock_request lock;
10681966bceSXin LI 	TRANSFORM_CMD_EXT cmdext;
10781966bceSXin LI 
10881966bceSXin LI 	HPT_U64 transform_point;
10981966bceSXin LI 	HPT_U16 transform_sectors_per_step;
11081966bceSXin LI 	HPT_U8  operation;
11181966bceSXin LI 	HPT_U8  disabled;
11281966bceSXin LI } HPT_TRANSFORM, *PHPT_TRANSFORM;
11381966bceSXin LI 
11481966bceSXin LI typedef struct hpt_array
11581966bceSXin LI {
11681966bceSXin LI 	HPT_U32 array_stamp;
11781966bceSXin LI 	HPT_U32 data_stamp;
11881966bceSXin LI 	HPT_U32 array_sn;
11981966bceSXin LI 
12081966bceSXin LI 	HPT_U8  ndisk;
12181966bceSXin LI 	HPT_U8  block_size_shift;
12281966bceSXin LI 	HPT_U16 strip_width;
12381966bceSXin LI 	HPT_U8  sector_size_shift; /*sector size = 512B<<sector_size_shift*/
12481966bceSXin LI 	HPT_U8  jid;
12581966bceSXin LI 	HPT_U8  reserved[2];
12681966bceSXin LI 
12781966bceSXin LI 
12881966bceSXin LI 	HPT_MMASK outdated_members;
12981966bceSXin LI 	HPT_MMASK offline_members;
13081966bceSXin LI 
13181966bceSXin LI 	PVDEV member[MAX_MEMBERS];
13281966bceSXin LI 
13381966bceSXin LI 	RAID_FLAGS flags;
13481966bceSXin LI 
13581966bceSXin LI 	HPT_U64 rebuilt_sectors;
13681966bceSXin LI 
13781966bceSXin LI 
13881966bceSXin LI 	HPT_U8 name[MAX_ARRAY_NAME];
13981966bceSXin LI 	PHPT_TRANSFORM transform;
14081966bceSXin LI 
14181966bceSXin LI 	TIME_RECORD create_time;
14281966bceSXin LI 	HPT_U8  description[64];
14381966bceSXin LI 	HPT_U8  create_manager[16];
14481966bceSXin LI 
14581966bceSXin LI #ifdef OS_SUPPORT_TASK
14681966bceSXin LI 	int floating_priority;
14781966bceSXin LI 	OSM_TASK ioctl_task;
14881966bceSXin LI 	IOCTL_ARG ioctl_arg;
14981966bceSXin LI 
15081966bceSXin LI 	char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
15181966bceSXin LI 	char ioctl_outbuf[sizeof(HPT_UINT)];
15281966bceSXin LI #endif
15381966bceSXin LI 
15481966bceSXin LI } HPT_ARRAY, *PHPT_ARRAY;
15581966bceSXin LI 
15681966bceSXin LI #ifdef OS_SUPPORT_TASK
15781966bceSXin LI void ldm_start_rebuild(struct _VDEV *pArray);
15881966bceSXin LI #else
15981966bceSXin LI #define ldm_start_rebuild(pArray)
16081966bceSXin LI #endif
16181966bceSXin LI 
16281966bceSXin LI typedef struct _raw_partition{
16381966bceSXin LI 	struct _raw_partition * next;
16481966bceSXin LI 	__HPT_RAW_LBA start;
16581966bceSXin LI 	__HPT_RAW_LBA capacity;
16681966bceSXin LI 	PVDEV   vd_part;
16781966bceSXin LI } RAW_PARTITION, *PRAW_PARTITION;
16881966bceSXin LI 
16981966bceSXin LI typedef struct hpt_partiton
17081966bceSXin LI {
17181966bceSXin LI 	PVDEV raw_disk;
17281966bceSXin LI 	__HPT_RAW_LBA des_location;
17381966bceSXin LI 	PRAW_PARTITION raw_part;
17481966bceSXin LI 	HPT_U8  del_mbr;
17581966bceSXin LI 	HPT_U8  reserved[3];
17681966bceSXin LI } HPT_PARTITION, *PHPT_PARTITION;
17781966bceSXin LI 
17881966bceSXin LI void ldm_check_array_online(PVDEV pArray);
17981966bceSXin LI void ldm_generic_member_failed(PVDEV member);
18081966bceSXin LI void ldm_sync_array_info(PVDEV pArray);
18181966bceSXin LI void ldm_sync_array_stamp(PVDEV pArray);
18281966bceSXin LI void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
18381966bceSXin LI 
18481966bceSXin LI #if defined(__cplusplus)
18581966bceSXin LI }
18681966bceSXin LI #endif
18781966bceSXin LI #endif
188