xref: /dflybsd-src/sys/dev/raid/hptmv/vdevice.h (revision 7323311a0a4ed05bd2444f35783159a0c5ebcba1)
135878b55SSascha Wildner /*
235878b55SSascha Wildner  * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
335878b55SSascha Wildner  * All rights reserved.
435878b55SSascha Wildner  *
535878b55SSascha Wildner  * Redistribution and use in source and binary forms, with or without
635878b55SSascha Wildner  * modification, are permitted provided that the following conditions
735878b55SSascha Wildner  * are met:
835878b55SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
935878b55SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
1035878b55SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
1135878b55SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
1235878b55SSascha Wildner  *    documentation and/or other materials provided with the distribution.
1335878b55SSascha Wildner  *
1435878b55SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1535878b55SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1635878b55SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1735878b55SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1835878b55SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1935878b55SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2035878b55SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2135878b55SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2235878b55SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2335878b55SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2435878b55SSascha Wildner  * SUCH DAMAGE.
2535878b55SSascha Wildner  *
2635878b55SSascha Wildner  * $FreeBSD: src/sys/dev/hptmv/vdevice.h,v 1.4 2009/04/07 16:38:25 delphij Exp $
2735878b55SSascha Wildner  */
2835878b55SSascha Wildner 
2935878b55SSascha Wildner #ifndef _VDEVICE_H_
3035878b55SSascha Wildner #define _VDEVICE_H_
3135878b55SSascha Wildner 
3235878b55SSascha Wildner /***************************************************************************
3335878b55SSascha Wildner  * Description:  virtual device header
3435878b55SSascha Wildner  ***************************************************************************/
3535878b55SSascha Wildner 
3635878b55SSascha Wildner typedef  struct _VDevice
3735878b55SSascha Wildner {
3835878b55SSascha Wildner 	UCHAR        VDeviceType;
3935878b55SSascha Wildner 	UCHAR        vf_bootmark: 1; 	/* is boot device? */
4035878b55SSascha Wildner 	UCHAR		 vf_bootable: 1;    /* has active partition */
4135878b55SSascha Wildner 	UCHAR        vf_online: 1; 		/* is usable? */
4235878b55SSascha Wildner 	UCHAR        vf_cache_disk: 1;  /* Cache enabled */
4335878b55SSascha Wildner 	UCHAR        vf_format_v2: 1;   /* old array block */
4435878b55SSascha Wildner 	UCHAR        vf_freed: 1;       /* memory free */
4535878b55SSascha Wildner 	UCHAR        reserve1;
4635878b55SSascha Wildner 	UCHAR        bSerialNumber; 	/* valid if pParent!=0 */
4735878b55SSascha Wildner 
4835878b55SSascha Wildner 	PVDevice	 pParent;			/* parent array */
4935878b55SSascha Wildner 	PVBus        pVBus;				/* vbus this device located. Must not be NULL. */
5035878b55SSascha Wildner 
5135878b55SSascha Wildner 	LBA_T        VDeviceCapacity;   /* number of blocks */
5235878b55SSascha Wildner 
5335878b55SSascha Wildner 	LBA_T        LockedLba;
5435878b55SSascha Wildner 	USHORT       LockedSectors;
5535878b55SSascha Wildner 	USHORT       ActiveRequests;
5635878b55SSascha Wildner 	PCommand     LockWaitList;
5735878b55SSascha Wildner 	void (* HPTLIBAPI QuiesceAction)(_VBUS_ARG void *arg);
5835878b55SSascha Wildner 	void  *QuiesceArg;
5935878b55SSascha Wildner 	void (* HPTLIBAPI flush_callback)(_VBUS_ARG void *arg);
6035878b55SSascha Wildner 	void *flush_callback_arg;
6135878b55SSascha Wildner 
6235878b55SSascha Wildner 
6335878b55SSascha Wildner #if defined(_RAID5N_)
6435878b55SSascha Wildner 	struct stripe **CacheEntry;
6535878b55SSascha Wildner 	struct range_lock *range_lock;
6635878b55SSascha Wildner #endif
6735878b55SSascha Wildner 
6835878b55SSascha Wildner 	void (* HPTLIBAPI pfnSendCommand)(_VBUS_ARG PCommand pCmd);   /* call this to send a command to a VDevice */
6935878b55SSascha Wildner 	void (* HPTLIBAPI pfnDeviceFailed)(_VBUS_ARG PVDevice pVDev); /* call this when a VDevice failed */
7035878b55SSascha Wildner 
7135878b55SSascha Wildner 	union {
7235878b55SSascha Wildner #ifdef SUPPORT_ARRAY
7335878b55SSascha Wildner 		RaidArray array;
7435878b55SSascha Wildner #endif
7535878b55SSascha Wildner 		Device disk;
7635878b55SSascha Wildner 	} u;
7735878b55SSascha Wildner 
7835878b55SSascha Wildner } VDevice;
7935878b55SSascha Wildner 
80a643c667SSascha Wildner #define ARRAY_VDEV_SIZE (__offsetof(VDevice, u) + sizeof(RaidArray))
81a643c667SSascha Wildner #define DISK_VDEV_SIZE  (__offsetof(VDevice, u) + sizeof(Device))
8235878b55SSascha Wildner 
83a643c667SSascha Wildner #define Map2pVDevice(pDev) ((PVDevice)((UINT_PTR)pDev - __offsetof(VDevice, u.disk)))
8435878b55SSascha Wildner 
8535878b55SSascha Wildner /*
8635878b55SSascha Wildner  * bUserDeviceMode
8735878b55SSascha Wildner  */
8835878b55SSascha Wildner #define MEMBER_NOT_SET_MODE  0x5F
8935878b55SSascha Wildner 
9035878b55SSascha Wildner /*
9135878b55SSascha Wildner  * arrayType
9235878b55SSascha Wildner  */
9335878b55SSascha Wildner #define VD_SPARE             0
9435878b55SSascha Wildner #define VD_REMOVABLE         1
9535878b55SSascha Wildner #define VD_ATAPI             2
9635878b55SSascha Wildner #define VD_SINGLE_DISK       3
9735878b55SSascha Wildner 
9835878b55SSascha Wildner #define VD_JBOD              4 /* JBOD */
9935878b55SSascha Wildner #define VD_RAID_0            5 /* RAID 0 stripe */
10035878b55SSascha Wildner #define VD_RAID_1            6 /* RAID 1 mirror */
10135878b55SSascha Wildner #define VD_RAID_3            7 /* RAID 3 */
10235878b55SSascha Wildner #define VD_RAID_5            8 /* RAID 5 */
10335878b55SSascha Wildner #define VD_MAX_TYPE 8
10435878b55SSascha Wildner 
10535878b55SSascha Wildner #ifdef SUPPORT_ARRAY
10635878b55SSascha Wildner #define mIsArray(pVDev) (pVDev->VDeviceType>VD_SINGLE_DISK)
10735878b55SSascha Wildner #else
10835878b55SSascha Wildner #define mIsArray(pVDev) 0
10935878b55SSascha Wildner #endif
11035878b55SSascha Wildner 
11135878b55SSascha Wildner extern void (* HPTLIBAPI pfnSendCommand[])(_VBUS_ARG PCommand pCmd);
11235878b55SSascha Wildner extern void (* HPTLIBAPI pfnDeviceFailed[])(_VBUS_ARG PVDevice pVDev);
11335878b55SSascha Wildner void HPTLIBAPI fOsDiskFailed(_VBUS_ARG PVDevice pVDev);
11435878b55SSascha Wildner void HPTLIBAPI fDeviceSendCommand(_VBUS_ARG PCommand pCmd);
11535878b55SSascha Wildner void HPTLIBAPI fSingleDiskFailed(_VBUS_ARG PVDevice pVDev);
11635878b55SSascha Wildner 
11735878b55SSascha Wildner /***************************************************************************
11835878b55SSascha Wildner  * Description:  RAID Adapter
11935878b55SSascha Wildner  ***************************************************************************/
12035878b55SSascha Wildner 
12135878b55SSascha Wildner typedef struct _VBus  {
12235878b55SSascha Wildner 	/* pVDevice[] may be non-continuous */
12335878b55SSascha Wildner 	PVDevice      pVDevice[MAX_VDEVICE_PER_VBUS];
12435878b55SSascha Wildner 
12535878b55SSascha Wildner 	UINT          nInstances;
12635878b55SSascha Wildner 	PChipInstance pChipInstance[MAX_CHIP_IN_VBUS];
12735878b55SSascha Wildner 
12835878b55SSascha Wildner 	void *        OsExt; /* for OS private use */
12935878b55SSascha Wildner 
13035878b55SSascha Wildner 
13135878b55SSascha Wildner 	int serial_mode;
13235878b55SSascha Wildner 	int next_active;
13335878b55SSascha Wildner 	int working_devs;
13435878b55SSascha Wildner 
13535878b55SSascha Wildner 
13635878b55SSascha Wildner 
13735878b55SSascha Wildner 	PCommand pFreeCommands;
13835878b55SSascha Wildner 	DPC_ROUTINE PendingRoutines[MAX_PENDING_ROUTINES];
13935878b55SSascha Wildner 	int PendingRoutinesFirst, PendingRoutinesLast;
14035878b55SSascha Wildner 	DPC_ROUTINE IdleRoutines[MAX_IDLE_ROUTINES];
14135878b55SSascha Wildner 	int IdleRoutinesFirst, IdleRoutinesLast;
14235878b55SSascha Wildner 
14335878b55SSascha Wildner #ifdef SUPPORT_ARRAY
14435878b55SSascha Wildner 	PVDevice pFreeArrayLink;
14535878b55SSascha Wildner 	BYTE    _ArrayTables[MAX_ARRAY_PER_VBUS * ARRAY_VDEV_SIZE];
14635878b55SSascha Wildner #endif
14735878b55SSascha Wildner 
14835878b55SSascha Wildner 
14935878b55SSascha Wildner #ifdef _RAID5N_
15035878b55SSascha Wildner 	struct r5_global_data r5;
15135878b55SSascha Wildner #endif
15235878b55SSascha Wildner 
15335878b55SSascha Wildner } VBus;
15435878b55SSascha Wildner 
15535878b55SSascha Wildner /*
15635878b55SSascha Wildner  * Array members must be on same VBus.
15735878b55SSascha Wildner  * The platform dependent part shall select one of the following strategy.
15835878b55SSascha Wildner  */
15935878b55SSascha Wildner #ifdef SET_VBUS_FOR_EACH_IRQ
16035878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) ((pChip1)->bChipIntrNum==(pChip2)->bChipIntrNum)
16135878b55SSascha Wildner #elif defined(SET_VBUS_FOR_EACH_CONTROLLER)
16235878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \
16335878b55SSascha Wildner 	((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev)
16435878b55SSascha Wildner #elif defined(SET_VBUS_FOR_EACH_FUNCTION)
16535878b55SSascha Wildner #define CHIP_ON_SAME_VBUS(pChip1, pChip2) \
16635878b55SSascha Wildner 	((pChip1)->pci_bus==(pChip2)->pci_bus && (pChip1)->pci_dev==(pChip2)->pci_dev && (pChip1)->pci_func==(pChip2)->pci_func)
16735878b55SSascha Wildner #else
16835878b55SSascha Wildner #error You must set one vbus setting
16935878b55SSascha Wildner #endif
17035878b55SSascha Wildner 
17135878b55SSascha Wildner #define FOR_EACH_CHANNEL_ON_VBUS(_pVBus, _pChan) \
17235878b55SSascha Wildner 		for (_pChan=pChanStart; _pChan<pChanEnd; _pChan++) \
17335878b55SSascha Wildner 			if (_pChan->pChipInstance->pVBus!=_pVBus) ; else
17435878b55SSascha Wildner 
17535878b55SSascha Wildner #define FOR_EACH_DEV_ON_VBUS(pVBus, pVDev, i) \
17635878b55SSascha Wildner 		for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \
17735878b55SSascha Wildner 			if ((pVDev=pVBus->pVDevice[i])==0) continue; else
17835878b55SSascha Wildner 
17935878b55SSascha Wildner 
18035878b55SSascha Wildner #define FOR_EACH_VBUS(pVBus) \
18135878b55SSascha Wildner 	for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \
18235878b55SSascha Wildner 
18335878b55SSascha Wildner #define FOR_EACH_ARRAY_ON_ALL_VBUS(pVBus, pArray, i) \
18435878b55SSascha Wildner 	for(pVBus = gVBus; pVBus < &gVBus[MAX_VBUS]; pVBus++) \
18535878b55SSascha Wildner 		for(i = 0; i < MAX_ARRAY_PER_VBUS; i++) \
18635878b55SSascha Wildner 			if ((pArray=((PVDevice)&pVBus->_ArrayTables[i*ARRAY_VDEV_SIZE]))->u.array.dArStamp==0) continue; else
18735878b55SSascha Wildner 
18835878b55SSascha Wildner #define FOR_EACH_DEV_ON_ALL_VBUS(pVBus, pVDev, i) \
18935878b55SSascha Wildner 	FOR_EACH_VBUS(pVBus) \
19035878b55SSascha Wildner 		for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++) \
19135878b55SSascha Wildner 			if ((pVDev=pVBus->pVDevice[i])==0) continue; else
19235878b55SSascha Wildner 
19335878b55SSascha Wildner /***************************************************************************
19435878b55SSascha Wildner  * Description:  the functions called by IDE layer
19535878b55SSascha Wildner  ***************************************************************************/
19635878b55SSascha Wildner #ifdef SUPPORT_ARRAY
19735878b55SSascha Wildner #define IdeRegisterDevice               fCheckArray
19835878b55SSascha Wildner #else
19935878b55SSascha Wildner void HPTLIBAPI IdeRegisterDevice(PDevice pDev);
20035878b55SSascha Wildner #endif
20135878b55SSascha Wildner 
20235878b55SSascha Wildner /***************************************************************************
20335878b55SSascha Wildner  * Description:  the functions OS must provided
20435878b55SSascha Wildner  ***************************************************************************/
20535878b55SSascha Wildner 
20635878b55SSascha Wildner void HPTLIBAPI OsSetDeviceTable(PDevice pDevice, PIDENTIFY_DATA pIdentify);
20735878b55SSascha Wildner 
20835878b55SSascha Wildner /*
20935878b55SSascha Wildner  * allocate and free data structure
21035878b55SSascha Wildner  */
21135878b55SSascha Wildner PChannel fGetChannelTable(void);
21235878b55SSascha Wildner PDevice  fGetDeviceTable(void);
21335878b55SSascha Wildner #define  OsGetChannelTable(x, y)  fGetChannelTable()
21435878b55SSascha Wildner #define  OsGetDeviceTable(x, y)   fGetDeviceTable()
21535878b55SSascha Wildner void 	OsReturnTable(PDevice pDevice);
21635878b55SSascha Wildner /***************************************************************************
21735878b55SSascha Wildner  * Description:  the functions Prototype
21835878b55SSascha Wildner  ***************************************************************************/
21935878b55SSascha Wildner /*
22035878b55SSascha Wildner  * vdevice.c
22135878b55SSascha Wildner  */
22235878b55SSascha Wildner int Initialize(void);
22335878b55SSascha Wildner int InitializeAllChips(void);
22435878b55SSascha Wildner void InitializeVBus(PVBus pVBus);
22535878b55SSascha Wildner void fRegisterChip(PChipInstance pChip);
22635878b55SSascha Wildner void __fRegisterVDevices(PVBus pVBus);
22735878b55SSascha Wildner void fRegisterVDevices(void);
22835878b55SSascha Wildner void HPTLIBAPI UnregisterVDevice(PVDevice);
22935878b55SSascha Wildner void HPTLIBAPI fCheckBootable(PVDevice pVDev);
23035878b55SSascha Wildner void HPTLIBAPI fFlushVDev(PVDevice pVDev);
23135878b55SSascha Wildner void HPTLIBAPI fFlushVDevAsync(PVDevice pVDev, DPC_PROC done, void *arg);
23235878b55SSascha Wildner void HPTLIBAPI fShutdownVDev(PVDevice pVDev);
23335878b55SSascha Wildner void HPTLIBAPI fResetVBus(_VBUS_ARG0);
23435878b55SSascha Wildner void HPTLIBAPI fCompleteAllCommandsSynchronously(PVBus _vbus_p);
23535878b55SSascha Wildner 
236*7323311aSzrj #define RegisterVDevice(pVDev)	do { } while (0)
23735878b55SSascha Wildner #define OsRegisterDevice(pVDev)
23835878b55SSascha Wildner #define OsUnregisterDevice(pVDev)
23935878b55SSascha Wildner 
24035878b55SSascha Wildner #ifdef SUPPORT_VBUS_CONFIG
24135878b55SSascha Wildner void VBus_Config(PVBus pVBus, char *str);
24235878b55SSascha Wildner #else
24335878b55SSascha Wildner #define VBus_Config(pVBus, str)
24435878b55SSascha Wildner #endif
24535878b55SSascha Wildner 
24635878b55SSascha Wildner #pragma pack(1)
24735878b55SSascha Wildner struct fdisk_partition_table
24835878b55SSascha Wildner {
24935878b55SSascha Wildner 	UCHAR 		bootid;   			/* bootable?  0=no, 128=yes  */
25035878b55SSascha Wildner 	UCHAR 		beghead;  			/* beginning head number */
25135878b55SSascha Wildner 	UCHAR 		begsect;  			/* beginning sector number */
25235878b55SSascha Wildner 	UCHAR		begcyl;   			/* 10 bit nmbr, with high 2 bits put in begsect */
25335878b55SSascha Wildner 	UCHAR		systid;   			/* Operating System type indicator code */
25435878b55SSascha Wildner 	UCHAR 		endhead;  			/* ending head number */
25535878b55SSascha Wildner 	UCHAR 		endsect;  			/* ending sector number */
25635878b55SSascha Wildner 	UCHAR 		endcyl;   			/* also a 10 bit nmbr, with same high 2 bit trick */
25735878b55SSascha Wildner 	ULONG   	relsect;            /* first sector relative to start of disk */
25835878b55SSascha Wildner 	ULONG 		numsect;            /* number of sectors in partition */
25935878b55SSascha Wildner };
26035878b55SSascha Wildner 
26135878b55SSascha Wildner typedef struct _Master_Boot_Record
26235878b55SSascha Wildner {
26335878b55SSascha Wildner 	UCHAR   bootinst[446];   		/* space to hold actual boot code */
26435878b55SSascha Wildner 	struct 	fdisk_partition_table parts[4];
26535878b55SSascha Wildner 	USHORT  signature;       		/* set to 0xAA55 to indicate PC MBR format */
26635878b55SSascha Wildner }
26735878b55SSascha Wildner Master_Boot_Record, *PMaster_Boot_Record;
26835878b55SSascha Wildner 
26935878b55SSascha Wildner #ifndef SUPPORT_ARRAY
27035878b55SSascha Wildner /* TODO: move it later */
27135878b55SSascha Wildner #ifdef __BIG_ENDIAN_BITFIELD
27235878b55SSascha Wildner typedef DWORD TIME_RECORD;
27335878b55SSascha Wildner #else
27435878b55SSascha Wildner typedef struct _TIME_RECORD {
27535878b55SSascha Wildner    UINT        seconds:6;      /* 0 - 59 */
27635878b55SSascha Wildner    UINT        minutes:6;      /* 0 - 59 */
27735878b55SSascha Wildner    UINT        month:4;        /* 1 - 12 */
27835878b55SSascha Wildner    UINT        hours:6;        /* 0 - 59 */
27935878b55SSascha Wildner    UINT        day:5;          /* 1 - 31 */
28035878b55SSascha Wildner    UINT        year:5;         /* 0=2000, 31=2031 */
28135878b55SSascha Wildner } TIME_RECORD;
28235878b55SSascha Wildner #endif
28335878b55SSascha Wildner #endif
28435878b55SSascha Wildner 
28535878b55SSascha Wildner #pragma pack()
28635878b55SSascha Wildner #endif
287