]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/hptmv/vdevice.h
Fix requests for "plain" SHA digests of an empty buffer.
[FreeBSD/FreeBSD.git] / sys / dev / hptmv / vdevice.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #ifndef _VDEVICE_H_
32 #define _VDEVICE_H_
33
34 /***************************************************************************
35  * Description:  virtual device header
36  ***************************************************************************/
37
38 typedef  struct _VDevice
39 {
40         UCHAR        VDeviceType;
41         UCHAR        vf_bootmark: 1;    /* is boot device? */
42         UCHAR            vf_bootable: 1;    /* has active partition */
43         UCHAR        vf_online: 1;              /* is usable? */
44         UCHAR        vf_cache_disk: 1;  /* Cache enabled */
45         UCHAR        vf_format_v2: 1;   /* old array block */
46         UCHAR        vf_freed: 1;       /* memory free */
47         UCHAR        reserve1;
48         UCHAR        bSerialNumber;     /* valid if pParent!=0 */
49
50         PVDevice         pParent;                       /* parent array */
51         PVBus        pVBus;                             /* vbus this device located. Must not be NULL. */
52
53         LBA_T        VDeviceCapacity;   /* number of blocks */
54
55         LBA_T        LockedLba;
56         USHORT       LockedSectors;
57         USHORT       ActiveRequests;
58         PCommand     LockWaitList;
59         void (* HPTLIBAPI QuiesceAction)(_VBUS_ARG void *arg);
60         void  *QuiesceArg;
61         void (* HPTLIBAPI flush_callback)(_VBUS_ARG void *arg);
62         void *flush_callback_arg;
63
64
65 #if defined(_RAID5N_)
66         struct stripe **CacheEntry;
67         struct range_lock *range_lock;
68 #endif
69
70         void (* HPTLIBAPI pfnSendCommand)(_VBUS_ARG PCommand pCmd);   /* call this to send a command to a VDevice */
71         void (* HPTLIBAPI pfnDeviceFailed)(_VBUS_ARG PVDevice pVDev); /* call this when a VDevice failed */
72
73         union {
74 #ifdef SUPPORT_ARRAY
75                 RaidArray array;
76 #endif
77                 Device disk;
78         } u;
79
80 } VDevice;
81
82 #define ARRAY_VDEV_SIZE (offsetof(VDevice, u) + sizeof(RaidArray))
83 #define DISK_VDEV_SIZE  (offsetof(VDevice, u) + sizeof(Device))
84
85 #define Map2pVDevice(pDev) ((PVDevice)((UINT_PTR)pDev - (UINT)(UINT_PTR)&((PVDevice)0)->u.disk))
86
87 /*
88  * bUserDeviceMode
89  */
90 #define MEMBER_NOT_SET_MODE  0x5F
91
92 /*
93  * arrayType
94  */
95 #define VD_SPARE             0
96 #define VD_REMOVABLE         1
97 #define VD_ATAPI             2
98 #define VD_SINGLE_DISK       3
99
100 #define VD_JBOD              4 /* JBOD */
101 #define VD_RAID_0            5 /* RAID 0 stripe */
102 #define VD_RAID_1            6 /* RAID 1 mirror */
103 #define VD_RAID_3            7 /* RAID 3 */
104 #define VD_RAID_5            8 /* RAID 5 */
105 #define VD_MAX_TYPE 8
106
107 #ifdef SUPPORT_ARRAY
108 #define mIsArray(pVDev) (pVDev->VDeviceType>VD_SINGLE_DISK)
109 #else 
110 #define mIsArray(pVDev) 0
111 #endif
112
113 extern void (* HPTLIBAPI pfnSendCommand[])(_VBUS_ARG PCommand pCmd);
114 extern void (* HPTLIBAPI pfnDeviceFailed[])(_VBUS_ARG PVDevice pVDev);
115 void HPTLIBAPI fOsDiskFailed(_VBUS_ARG PVDevice pVDev);
116 void HPTLIBAPI fDeviceSendCommand(_VBUS_ARG PCommand pCmd);
117 void HPTLIBAPI fSingleDiskFailed(_VBUS_ARG PVDevice pVDev);
118
119 /***************************************************************************
120  * Description:  RAID Adapter
121  ***************************************************************************/
122
123 typedef struct _VBus  {
124         /* pVDevice[] may be non-continuous */
125         PVDevice      pVDevice[MAX_VDEVICE_PER_VBUS];
126
127         UINT          nInstances;
128         PChipInstance pChipInstance[MAX_CHIP_IN_VBUS];
129
130         void *        OsExt; /* for OS private use */
131
132         
133         int serial_mode;
134         int next_active;
135         int working_devs;
136
137
138
139         PCommand pFreeCommands;
140         DPC_ROUTINE PendingRoutines[MAX_PENDING_ROUTINES];
141         int PendingRoutinesFirst, PendingRoutinesLast;
142         DPC_ROUTINE IdleRoutines[MAX_IDLE_ROUTINES];
143         int IdleRoutinesFirst, IdleRoutinesLast;
144
145 #ifdef SUPPORT_ARRAY
146         PVDevice pFreeArrayLink;
147         BYTE    _ArrayTables[MAX_ARRAY_PER_VBUS * ARRAY_VDEV_SIZE];
148 #endif
149
150
151 #ifdef _RAID5N_
152         struct r5_global_data r5;
153 #endif
154
155 } VBus;
156
157 /*
158  * Array members must be on same VBus.
159  * The platform dependent part shall select one of the following strategy.
160  */
161 #ifdef SET_VBUS_FOR_EACH_IRQ
162 #define CHIP_ON_SAME_VBUS(pChip1, pChip2) ((pChip1)->bChipIntrNum==(pChip2)->bChipIntrNum)
163 #elif defined(SET_VBUS_FOR_EACH_CONTROLLER)
164 #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \
165         ((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev)
166 #elif defined(SET_VBUS_FOR_EACH_FUNCTION)
167 #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \
168         ((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev && (pChip1)->pci_func==(pChip2)->pci_func)
169 #else 
170 #error You must set one vbus setting
171 #endif
172
173 #define FOR_EACH_CHANNEL_ON_VBUS(_pVBus, _pChan) \
174                 for (_pChan=pChanStart; _pChan<pChanEnd; _pChan++) \
175                         if (_pChan->pChipInstance->pVBus!=_pVBus) ; else
176
177 #define FOR_EACH_DEV_ON_VBUS(pVBus, pVDev, i) \
178                 for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \
179                         if ((pVDev=pVBus->pVDevice[i])==0) continue; else
180
181
182 #define FOR_EACH_VBUS(pVBus) \
183         for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \
184
185 #define FOR_EACH_ARRAY_ON_ALL_VBUS(pVBus, pArray, i) \
186         for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \
187                 for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) \
188                         if ((pArray=((PVDevice)&pVBus->_ArrayTables[i*ARRAY_VDEV_SIZE]))->u.array.dArStamp==0) continue; else
189
190 #define FOR_EACH_DEV_ON_ALL_VBUS(pVBus, pVDev, i) \
191         FOR_EACH_VBUS(pVBus) \
192                 for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \
193                         if ((pVDev=pVBus->pVDevice[i])==0) continue; else
194
195 /***************************************************************************
196  * Description:  the functions called by IDE layer
197  ***************************************************************************/
198 #ifdef SUPPORT_ARRAY
199 #define IdeRegisterDevice               fCheckArray
200 #else 
201 void HPTLIBAPI IdeRegisterDevice(PDevice pDev);
202 #endif
203
204 /***************************************************************************
205  * Description:  the functions OS must provided
206  ***************************************************************************/
207
208 void HPTLIBAPI OsSetDeviceTable(PDevice pDevice, PIDENTIFY_DATA pIdentify);
209
210 /*
211  * allocate and free data structure
212  */
213 PChannel fGetChannelTable(void);
214 PDevice  fGetDeviceTable(void);
215 #define  OsGetChannelTable(x, y)  fGetChannelTable()
216 #define  OsGetDeviceTable(x, y)   fGetDeviceTable()
217 void    OsReturnTable(PDevice pDevice);
218 /***************************************************************************
219  * Description:  the functions Prototype
220  ***************************************************************************/
221 /*
222  * vdevice.c
223  */
224 int Initialize(void);
225 int InitializeAllChips(void);
226 void InitializeVBus(PVBus pVBus);
227 void fRegisterChip(PChipInstance pChip);
228 void __fRegisterVDevices(PVBus pVBus);
229 void fRegisterVDevices(void);
230 void HPTLIBAPI UnregisterVDevice(PVDevice);
231 void HPTLIBAPI fCheckBootable(PVDevice pVDev);
232 void HPTLIBAPI fFlushVDev(PVDevice pVDev);
233 void HPTLIBAPI fFlushVDevAsync(PVDevice pVDev, DPC_PROC done, void *arg);
234 void HPTLIBAPI fShutdownVDev(PVDevice pVDev);
235 void HPTLIBAPI fResetVBus(_VBUS_ARG0);
236 void HPTLIBAPI fCompleteAllCommandsSynchronously(PVBus _vbus_p);
237
238 #define RegisterVDevice(pVDev)
239 #define OsRegisterDevice(pVDev)
240 #define OsUnregisterDevice(pVDev)
241
242 #ifdef SUPPORT_VBUS_CONFIG
243 void VBus_Config(PVBus pVBus, char *str);
244 #else 
245 #define VBus_Config(pVBus, str)
246 #endif
247
248 #pragma pack(1)
249 struct fdisk_partition_table
250 {
251         UCHAR           bootid;                         /* bootable?  0=no, 128=yes  */
252         UCHAR           beghead;                        /* beginning head number */
253         UCHAR           begsect;                        /* beginning sector number */
254         UCHAR           begcyl;                         /* 10 bit nmbr, with high 2 bits put in begsect */
255         UCHAR           systid;                         /* Operating System type indicator code */
256         UCHAR           endhead;                        /* ending head number */
257         UCHAR           endsect;                        /* ending sector number */
258         UCHAR           endcyl;                         /* also a 10 bit nmbr, with same high 2 bit trick */
259         ULONG           relsect;            /* first sector relative to start of disk */
260         ULONG           numsect;            /* number of sectors in partition */
261 };
262
263 typedef struct _Master_Boot_Record
264 {
265         UCHAR   bootinst[446];                  /* space to hold actual boot code */
266         struct  fdisk_partition_table parts[4];
267         USHORT  signature;                      /* set to 0xAA55 to indicate PC MBR format */
268 }
269 Master_Boot_Record, *PMaster_Boot_Record;
270
271 #ifndef SUPPORT_ARRAY
272 /* TODO: move it later */
273 #ifdef __BIG_ENDIAN_BITFIELD
274 typedef DWORD TIME_RECORD;
275 #else 
276 typedef struct _TIME_RECORD {
277    UINT        seconds:6;      /* 0 - 59 */
278    UINT        minutes:6;      /* 0 - 59 */
279    UINT        month:4;        /* 1 - 12 */
280    UINT        hours:6;        /* 0 - 59 */
281    UINT        day:5;          /* 1 - 31 */
282    UINT        year:5;         /* 0=2000, 31=2031 */
283 } TIME_RECORD;
284 #endif
285 #endif
286
287 #pragma pack()
288 #endif