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/osbsd.h,v 1.7 2009/04/07 16:38:25 delphij Exp $ 2735878b55SSascha Wildner */ 2835878b55SSascha Wildner #ifndef _OSBSD_H_ 2935878b55SSascha Wildner #define _OSBSD_H_ 3035878b55SSascha Wildner 3135878b55SSascha Wildner #include <sys/bus.h> 3235878b55SSascha Wildner #include <sys/resource.h> 3335878b55SSascha Wildner #include <sys/eventhandler.h> 3435878b55SSascha Wildner #include <sys/devicestat.h> 3535878b55SSascha Wildner 3635878b55SSascha Wildner #include <vm/vm.h> 3735878b55SSascha Wildner #include <vm/pmap.h> 3835878b55SSascha Wildner #include <vm/vm_extern.h> 3935878b55SSascha Wildner 4035878b55SSascha Wildner #include <sys/rman.h> 4135878b55SSascha Wildner 4235878b55SSascha Wildner #include <bus/cam/cam.h> 4335878b55SSascha Wildner #include <bus/cam/cam_ccb.h> 4435878b55SSascha Wildner #include <bus/cam/cam_debug.h> 4535878b55SSascha Wildner #include <bus/cam/cam_sim.h> 4635878b55SSascha Wildner #include <bus/cam/cam_xpt_sim.h> 4735878b55SSascha Wildner #include <bus/cam/cam_periph.h> 4835878b55SSascha Wildner 4935878b55SSascha Wildner #include <bus/cam/scsi/scsi_all.h> 5035878b55SSascha Wildner #include <bus/cam/scsi/scsi_message.h> 5135878b55SSascha Wildner 5235878b55SSascha Wildner 5335878b55SSascha Wildner 54*c898d682SSascha Wildner extern void lock_driver(void); 55*c898d682SSascha Wildner extern void unlock_driver(void); 5635878b55SSascha Wildner 5735878b55SSascha Wildner typedef struct 5835878b55SSascha Wildner { 5935878b55SSascha Wildner UCHAR status; /* 0 nonbootable; 80h bootable */ 6035878b55SSascha Wildner UCHAR start_head; 6135878b55SSascha Wildner USHORT start_sector; 6235878b55SSascha Wildner UCHAR type; 6335878b55SSascha Wildner UCHAR end_head; 6435878b55SSascha Wildner USHORT end_sector; 6535878b55SSascha Wildner ULONG start_abs_sector; 6635878b55SSascha Wildner ULONG num_of_sector; 6735878b55SSascha Wildner } partition; 6835878b55SSascha Wildner 6935878b55SSascha Wildner typedef struct _INQUIRYDATA { 7035878b55SSascha Wildner UCHAR DeviceType : 5; 7135878b55SSascha Wildner UCHAR DeviceTypeQualifier : 3; 7235878b55SSascha Wildner UCHAR DeviceTypeModifier : 7; 7335878b55SSascha Wildner UCHAR RemovableMedia : 1; 7435878b55SSascha Wildner UCHAR Versions; 7535878b55SSascha Wildner UCHAR ResponseDataFormat; 7635878b55SSascha Wildner UCHAR AdditionalLength; 7735878b55SSascha Wildner UCHAR Reserved[2]; 7835878b55SSascha Wildner UCHAR SoftReset : 1; 7935878b55SSascha Wildner UCHAR CommandQueue : 1; 8035878b55SSascha Wildner UCHAR Reserved2 : 1; 8135878b55SSascha Wildner UCHAR LinkedCommands : 1; 8235878b55SSascha Wildner UCHAR Synchronous : 1; 8335878b55SSascha Wildner UCHAR Wide16Bit : 1; 8435878b55SSascha Wildner UCHAR Wide32Bit : 1; 8535878b55SSascha Wildner UCHAR RelativeAddressing : 1; 8635878b55SSascha Wildner UCHAR VendorId[8]; 8735878b55SSascha Wildner UCHAR ProductId[16]; 8835878b55SSascha Wildner UCHAR ProductRevisionLevel[4]; 8935878b55SSascha Wildner UCHAR VendorSpecific[20]; 9035878b55SSascha Wildner UCHAR Reserved3[40]; 9135878b55SSascha Wildner } INQUIRYDATA, *PINQUIRYDATA; 9235878b55SSascha Wildner 9335878b55SSascha Wildner #define MV_IAL_HT_SACOALT_DEFAULT 1 9435878b55SSascha Wildner #define MV_IAL_HT_SAITMTH_DEFAULT 1 9535878b55SSascha Wildner 9635878b55SSascha Wildner /****************************************/ 9735878b55SSascha Wildner /* GENERAL Definitions */ 9835878b55SSascha Wildner /****************************************/ 9935878b55SSascha Wildner 10035878b55SSascha Wildner /* Bits for HD_ERROR */ 10135878b55SSascha Wildner #define NM_ERR 0x02 /* media present */ 10235878b55SSascha Wildner #define ABRT_ERR 0x04 /* Command aborted */ 10335878b55SSascha Wildner #define MCR_ERR 0x08 /* media change request */ 10435878b55SSascha Wildner #define IDNF_ERR 0x10 /* ID field not found */ 10535878b55SSascha Wildner #define MC_ERR 0x20 /* media changed */ 10635878b55SSascha Wildner #define UNC_ERR 0x40 /* Uncorrect data */ 10735878b55SSascha Wildner #define WP_ERR 0x40 /* write protect */ 10835878b55SSascha Wildner #define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ 10935878b55SSascha Wildner 11035878b55SSascha Wildner #define REQUESTS_ARRAY_SIZE (9 * MV_EDMA_REQUEST_QUEUE_SIZE) /* 9 K bytes */ 11135878b55SSascha Wildner #define RESPONSES_ARRAY_SIZE (12 * MV_EDMA_RESPONSE_QUEUE_SIZE) /* 3 K bytes */ 11235878b55SSascha Wildner 11335878b55SSascha Wildner #define PRD_ENTRIES_PER_CMD (MAX_SG_DESCRIPTORS+1) 11435878b55SSascha Wildner #define PRD_ENTRIES_SIZE (MV_EDMA_PRD_ENTRY_SIZE*PRD_ENTRIES_PER_CMD) 11535878b55SSascha Wildner #define PRD_TABLES_FOR_VBUS (MV_SATA_CHANNELS_NUM*MV_EDMA_QUEUE_LENGTH) 11635878b55SSascha Wildner 11735878b55SSascha Wildner typedef enum _SataEvent 11835878b55SSascha Wildner { 11935878b55SSascha Wildner SATA_EVENT_NO_CHANGE = 0, 12035878b55SSascha Wildner SATA_EVENT_CHANNEL_CONNECTED, 12135878b55SSascha Wildner SATA_EVENT_CHANNEL_DISCONNECTED 12235878b55SSascha Wildner } SATA_EVENT; 12335878b55SSascha Wildner 12435878b55SSascha Wildner typedef ULONG_PTR dma_addr_t; 12535878b55SSascha Wildner 12635878b55SSascha Wildner typedef struct _MV_CHANNEL 12735878b55SSascha Wildner { 12835878b55SSascha Wildner unsigned int maxUltraDmaModeSupported; 12935878b55SSascha Wildner unsigned int maxDmaModeSupported; 13035878b55SSascha Wildner unsigned int maxPioModeSupported; 13135878b55SSascha Wildner MV_BOOLEAN online; 13235878b55SSascha Wildner MV_BOOLEAN writeCacheSupported; 13335878b55SSascha Wildner MV_BOOLEAN writeCacheEnabled; 13435878b55SSascha Wildner MV_BOOLEAN readAheadSupported; 13535878b55SSascha Wildner MV_BOOLEAN readAheadEnabled; 13635878b55SSascha Wildner MV_U8 queueDepth; 13735878b55SSascha Wildner 13835878b55SSascha Wildner } MV_CHANNEL; 13935878b55SSascha Wildner 14035878b55SSascha Wildner typedef struct _BUS_DMAMAP 14135878b55SSascha Wildner { struct _BUS_DMAMAP *next; 14235878b55SSascha Wildner struct IALAdapter *pAdapter; 14335878b55SSascha Wildner bus_dmamap_t dma_map; 14435878b55SSascha Wildner SCAT_GATH psg[MAX_SG_DESCRIPTORS]; 14535878b55SSascha Wildner } BUS_DMAMAP, *PBUS_DMAMAP; 14635878b55SSascha Wildner 14735878b55SSascha Wildner typedef struct IALAdapter 14835878b55SSascha Wildner { 14935878b55SSascha Wildner struct cam_path *path; 15035878b55SSascha Wildner 15135878b55SSascha Wildner bus_dma_tag_t io_dma_parent; /* I/O buffer DMA tag */ 15235878b55SSascha Wildner PBUS_DMAMAP pbus_dmamap_list; 15335878b55SSascha Wildner PBUS_DMAMAP pbus_dmamap; 15435878b55SSascha Wildner 15535878b55SSascha Wildner device_t hpt_dev; /* bus device */ 15635878b55SSascha Wildner struct resource *hpt_irq; /* interrupt */ 15735878b55SSascha Wildner struct resource *mem_res; 15835878b55SSascha Wildner void *hpt_intr; /* interrupt handle */ 15935878b55SSascha Wildner struct IALAdapter *next; 16035878b55SSascha Wildner 16135878b55SSascha Wildner MV_SATA_ADAPTER mvSataAdapter; 16235878b55SSascha Wildner MV_CHANNEL mvChannel[MV_SATA_CHANNELS_NUM]; 16335878b55SSascha Wildner MV_U8 *requestsArrayBaseAddr; 16435878b55SSascha Wildner MV_U8 *requestsArrayBaseAlignedAddr; 16535878b55SSascha Wildner dma_addr_t requestsArrayBaseDmaAddr; 16635878b55SSascha Wildner dma_addr_t requestsArrayBaseDmaAlignedAddr; 16735878b55SSascha Wildner MV_U8 *responsesArrayBaseAddr; 16835878b55SSascha Wildner MV_U8 *responsesArrayBaseAlignedAddr; 16935878b55SSascha Wildner dma_addr_t responsesArrayBaseDmaAddr; 17035878b55SSascha Wildner dma_addr_t responsesArrayBaseDmaAlignedAddr; 17135878b55SSascha Wildner SATA_EVENT sataEvents[MV_SATA_CHANNELS_NUM]; 17235878b55SSascha Wildner 17335878b55SSascha Wildner struct callout event_timer_connect; 17435878b55SSascha Wildner struct callout event_timer_disconnect; 17535878b55SSascha Wildner 17635878b55SSascha Wildner struct _VBus VBus; 17735878b55SSascha Wildner struct _VDevice VDevices[MV_SATA_CHANNELS_NUM]; 17835878b55SSascha Wildner PCommand pCommandBlocks; 17935878b55SSascha Wildner PUCHAR prdTableAddr; 18035878b55SSascha Wildner PUCHAR prdTableAlignedAddr; 18135878b55SSascha Wildner void* pFreePRDLink; 18235878b55SSascha Wildner 18335878b55SSascha Wildner union ccb *pending_Q; 18435878b55SSascha Wildner 18535878b55SSascha Wildner MV_U8 outstandingCommands; 18635878b55SSascha Wildner 18735878b55SSascha Wildner UCHAR status; 18835878b55SSascha Wildner UCHAR ver_601; 18935878b55SSascha Wildner UCHAR beeping; 19035878b55SSascha Wildner 19135878b55SSascha Wildner eventhandler_tag eh; 19235878b55SSascha Wildner } 19335878b55SSascha Wildner IAL_ADAPTER_T; 19435878b55SSascha Wildner 19535878b55SSascha Wildner extern IAL_ADAPTER_T *gIal_Adapter; 19635878b55SSascha Wildner 19735878b55SSascha Wildner /*entry.c*/ 19835878b55SSascha Wildner typedef void (*HPT_DPC)(IAL_ADAPTER_T *,void*,UCHAR); 19935878b55SSascha Wildner 20035878b55SSascha Wildner int hpt_queue_dpc(HPT_DPC dpc, IAL_ADAPTER_T *pAdapter, void *arg, UCHAR flags); 20135878b55SSascha Wildner void hpt_rebuild_data_block(IAL_ADAPTER_T *pAdapter, PVDevice pArray, UCHAR flags); 20235878b55SSascha Wildner void Check_Idle_Call(IAL_ADAPTER_T *pAdapter); 20335878b55SSascha Wildner void fRescanAllDevice(_VBUS_ARG0); 20435878b55SSascha Wildner int hpt_add_disk_to_array(_VBUS_ARG DEVICEID idArray, DEVICEID idDisk); 20535878b55SSascha Wildner 20635878b55SSascha Wildner int Kernel_DeviceIoControl(_VBUS_ARG 20735878b55SSascha Wildner DWORD dwIoControlCode, /* operation control code */ 20835878b55SSascha Wildner PVOID lpInBuffer, /* input data buffer */ 20935878b55SSascha Wildner DWORD nInBufferSize, /* size of input data buffer */ 21035878b55SSascha Wildner PVOID lpOutBuffer, /* output data buffer */ 21135878b55SSascha Wildner DWORD nOutBufferSize, /* size of output data buffer */ 21235878b55SSascha Wildner PDWORD lpBytesReturned /* byte count */ 21335878b55SSascha Wildner ); 21435878b55SSascha Wildner 21535878b55SSascha Wildner 21635878b55SSascha Wildner #define __str_direct(x) #x 21735878b55SSascha Wildner #define __str(x) __str_direct(x) 21835878b55SSascha Wildner #define KMSG_LEADING __str(PROC_DIR_NAME) ": " 21935878b55SSascha Wildner #define hpt_printk(_x_) do { kprintf(KMSG_LEADING); kprintf _x_ ; } while (0) 22035878b55SSascha Wildner 22135878b55SSascha Wildner #define DUPLICATE 0 22235878b55SSascha Wildner #define INITIALIZE 1 22335878b55SSascha Wildner #define REBUILD_PARITY 2 22435878b55SSascha Wildner #define VERIFY 3 22535878b55SSascha Wildner 22635878b55SSascha Wildner /***********************************************************/ 22735878b55SSascha Wildner 22835878b55SSascha Wildner static __inline struct cam_periph * 22935878b55SSascha Wildner hpt_get_periph(int path_id,int target_id) 23035878b55SSascha Wildner { 23135878b55SSascha Wildner struct cam_periph *periph = NULL; 23235878b55SSascha Wildner struct cam_path *path; 23335878b55SSascha Wildner int status; 23435878b55SSascha Wildner 23535878b55SSascha Wildner status = xpt_create_path(&path, NULL, path_id, target_id, 0); 23635878b55SSascha Wildner if (status == CAM_REQ_CMP) { 23735878b55SSascha Wildner periph = cam_periph_find(path, "da"); 23835878b55SSascha Wildner xpt_free_path(path); 23935878b55SSascha Wildner 24035878b55SSascha Wildner } 24135878b55SSascha Wildner return periph; 24235878b55SSascha Wildner } 24335878b55SSascha Wildner 24435878b55SSascha Wildner #ifdef __i386__ 24535878b55SSascha Wildner #define BITS_PER_LONG 32 24635878b55SSascha Wildner #define VDEV_TO_ID(pVDev) (DEVICEID)(pVDev) 24735878b55SSascha Wildner #define ID_TO_VDEV(id) (PVDevice)(id) 24835878b55SSascha Wildner #else /*Only support x86_64(AMD64 and EM64T)*/ 24935878b55SSascha Wildner #define BITS_PER_LONG 64 25035878b55SSascha Wildner #define VDEV_TO_ID(pVDev) (DEVICEID)(ULONG_PTR)(pVDev) 25135878b55SSascha Wildner #define ID_TO_VDEV(id) (PVDevice)(((ULONG_PTR)gIal_Adapter & 0xffffffff00000000) | (id)) 25235878b55SSascha Wildner #endif 25335878b55SSascha Wildner 25435878b55SSascha Wildner #define INVALID_DEVICEID (-1) 25535878b55SSascha Wildner #define INVALID_STRIPSIZE (-1) 25635878b55SSascha Wildner 25735878b55SSascha Wildner #define shortswap(w) ((WORD)((w)>>8 | ((w) & 0xFF)<<8)) 25835878b55SSascha Wildner 25935878b55SSascha Wildner #ifndef MinBlockSizeShift 26035878b55SSascha Wildner #define MinBlockSizeShift 5 26135878b55SSascha Wildner #define MaxBlockSizeShift 12 26235878b55SSascha Wildner #endif 26335878b55SSascha Wildner 26435878b55SSascha Wildner #pragma pack(1) 26535878b55SSascha Wildner typedef struct _HPT_IOCTL_TRANSFER_PARAM 26635878b55SSascha Wildner { 26735878b55SSascha Wildner ULONG nInBufferSize; 26835878b55SSascha Wildner ULONG nOutBufferSize; 26935878b55SSascha Wildner UCHAR buffer[0]; 27035878b55SSascha Wildner }HPT_IOCTL_TRANSFER_PARAM, *PHPT_IOCTL_TRANSFER_PARAM; 27135878b55SSascha Wildner 27235878b55SSascha Wildner typedef struct _HPT_SET_STATE_PARAM 27335878b55SSascha Wildner { 27435878b55SSascha Wildner DEVICEID idArray; 27535878b55SSascha Wildner DWORD state; 27635878b55SSascha Wildner } HPT_SET_STATE_PARAM, *PHPT_SET_STATE_PARAM; 27735878b55SSascha Wildner 27835878b55SSascha Wildner typedef struct _HPT_SET_ARRAY_INFO 27935878b55SSascha Wildner { 28035878b55SSascha Wildner DEVICEID idArray; 28135878b55SSascha Wildner ALTERABLE_ARRAY_INFO Info; 28235878b55SSascha Wildner } HPT_SET_ARRAY_INFO, *PHPT_SET_ARRAY_INFO; 28335878b55SSascha Wildner 28435878b55SSascha Wildner typedef struct _HPT_SET_DEVICE_INFO 28535878b55SSascha Wildner { 28635878b55SSascha Wildner DEVICEID idDisk; 28735878b55SSascha Wildner ALTERABLE_DEVICE_INFO Info; 28835878b55SSascha Wildner } HPT_SET_DEVICE_INFO, *PHPT_SET_DEVICE_INFO; 28935878b55SSascha Wildner 29035878b55SSascha Wildner typedef struct _HPT_SET_DEVICE_INFO_V2 29135878b55SSascha Wildner { 29235878b55SSascha Wildner DEVICEID idDisk; 29335878b55SSascha Wildner ALTERABLE_DEVICE_INFO_V2 Info; 29435878b55SSascha Wildner } HPT_SET_DEVICE_INFO_V2, *PHPT_SET_DEVICE_INFO_V2; 29535878b55SSascha Wildner 29635878b55SSascha Wildner typedef struct _HPT_ADD_DISK_TO_ARRAY 29735878b55SSascha Wildner { 29835878b55SSascha Wildner DEVICEID idArray; 29935878b55SSascha Wildner DEVICEID idDisk; 30035878b55SSascha Wildner } HPT_ADD_DISK_TO_ARRAY, *PHPT_ADD_DISK_TO_ARRAY; 30135878b55SSascha Wildner 30235878b55SSascha Wildner typedef struct _HPT_DEVICE_IO 30335878b55SSascha Wildner { 30435878b55SSascha Wildner DEVICEID id; 30535878b55SSascha Wildner int cmd; 30635878b55SSascha Wildner ULONG lba; 30735878b55SSascha Wildner DWORD nSector; 30835878b55SSascha Wildner UCHAR buffer[0]; 30935878b55SSascha Wildner } HPT_DEVICE_IO, *PHPT_DEVICE_IO; 31035878b55SSascha Wildner 31135878b55SSascha Wildner int check_VDevice_valid(PVDevice); 31235878b55SSascha Wildner int hpt_default_ioctl(_VBUS_ARG DWORD, PVOID, DWORD, PVOID, DWORD, PDWORD); 31335878b55SSascha Wildner 31435878b55SSascha Wildner #define HPT_NULL_ID 0 31535878b55SSascha Wildner 31635878b55SSascha Wildner #pragma pack() 31735878b55SSascha Wildner 31835878b55SSascha Wildner #endif 319