| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * | 
|  | 3 | *			Linux MegaRAID device driver | 
|  | 4 | * | 
|  | 5 | * Copyright (c) 2003-2004  LSI Logic Corporation. | 
|  | 6 | * | 
|  | 7 | *	   This program is free software; you can redistribute it and/or | 
|  | 8 | *	   modify it under the terms of the GNU General Public License | 
|  | 9 | *	   as published by the Free Software Foundation; either version | 
|  | 10 | *	   2 of the License, or (at your option) any later version. | 
|  | 11 | * | 
|  | 12 | * FILE		: megaraid_ioctl.h | 
|  | 13 | * | 
|  | 14 | * Definitions to interface with user level applications | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | #ifndef _MEGARAID_IOCTL_H_ | 
|  | 18 | #define _MEGARAID_IOCTL_H_ | 
|  | 19 |  | 
|  | 20 | #include <linux/types.h> | 
| Matthew Wilcox | 6188e10 | 2008-04-18 22:21:05 -0400 | [diff] [blame] | 21 | #include <linux/semaphore.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 |  | 
|  | 23 | #include "mbox_defs.h" | 
|  | 24 |  | 
| Randy Dunlap | a69b74d | 2007-01-05 22:41:48 -0800 | [diff] [blame] | 25 | /* | 
|  | 26 | * console messages debug levels | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | */ | 
|  | 28 | #define	CL_ANN		0	/* print unconditionally, announcements */ | 
|  | 29 | #define CL_DLEVEL1	1	/* debug level 1, informative */ | 
|  | 30 | #define CL_DLEVEL2	2	/* debug level 2, verbose */ | 
|  | 31 | #define CL_DLEVEL3	3	/* debug level 3, very verbose */ | 
|  | 32 |  | 
| Randy Dunlap | a69b74d | 2007-01-05 22:41:48 -0800 | [diff] [blame] | 33 | /** | 
|  | 34 | * con_log() - console log routine | 
|  | 35 | * @level		: indicates the severity of the message. | 
|  | 36 | * @fmt			: format string | 
|  | 37 | * | 
|  | 38 | * con_log displays the error messages on the console based on the current | 
|  | 39 | * debug level. Also it attaches the appropriate kernel severity level with | 
|  | 40 | * the message. | 
|  | 41 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 | #define	con_log(level, fmt) if (LSI_DBGLVL >= level) printk fmt; | 
|  | 43 |  | 
|  | 44 | /* | 
|  | 45 | * Definitions & Declarations needed to use common management module | 
|  | 46 | */ | 
|  | 47 |  | 
|  | 48 | #define MEGAIOC_MAGIC		'm' | 
|  | 49 | #define MEGAIOCCMD		_IOWR(MEGAIOC_MAGIC, 0, mimd_t) | 
|  | 50 |  | 
|  | 51 | #define MEGAIOC_QNADAP		'm'	/* Query # of adapters		*/ | 
|  | 52 | #define MEGAIOC_QDRVRVER	'e'	/* Query driver version		*/ | 
|  | 53 | #define MEGAIOC_QADAPINFO   	'g'	/* Query adapter information	*/ | 
|  | 54 |  | 
|  | 55 | #define USCSICMD		0x80 | 
|  | 56 | #define UIOC_RD			0x00001 | 
|  | 57 | #define UIOC_WR			0x00002 | 
|  | 58 |  | 
|  | 59 | #define MBOX_CMD		0x00000 | 
|  | 60 | #define GET_DRIVER_VER		0x10000 | 
|  | 61 | #define GET_N_ADAP		0x20000 | 
|  | 62 | #define GET_ADAP_INFO		0x30000 | 
|  | 63 | #define GET_CAP			0x40000 | 
|  | 64 | #define GET_STATS		0x50000 | 
|  | 65 | #define GET_IOCTL_VERSION	0x01 | 
|  | 66 |  | 
|  | 67 | #define EXT_IOCTL_SIGN_SZ	16 | 
|  | 68 | #define EXT_IOCTL_SIGN		"$$_EXTD_IOCTL_$$" | 
|  | 69 |  | 
|  | 70 | #define	MBOX_LEGACY		0x00		/* ioctl has legacy mbox*/ | 
|  | 71 | #define MBOX_HPE		0x01		/* ioctl has hpe mbox	*/ | 
|  | 72 |  | 
|  | 73 | #define	APPTYPE_MIMD		0x00		/* old existing apps	*/ | 
|  | 74 | #define APPTYPE_UIOC		0x01		/* new apps using uioc	*/ | 
|  | 75 |  | 
|  | 76 | #define IOCTL_ISSUE		0x00000001	/* Issue ioctl		*/ | 
|  | 77 | #define IOCTL_ABORT		0x00000002	/* Abort previous ioctl	*/ | 
|  | 78 |  | 
|  | 79 | #define DRVRTYPE_MBOX		0x00000001	/* regular mbox driver	*/ | 
|  | 80 | #define DRVRTYPE_HPE		0x00000002	/* new hpe driver	*/ | 
|  | 81 |  | 
|  | 82 | #define MKADAP(adapno)	(MEGAIOC_MAGIC << 8 | (adapno) ) | 
|  | 83 | #define GETADAP(mkadap)	((mkadap) ^ MEGAIOC_MAGIC << 8) | 
|  | 84 |  | 
|  | 85 | #define MAX_DMA_POOLS		5		/* 4k, 8k, 16k, 32k, 64k*/ | 
|  | 86 |  | 
|  | 87 |  | 
|  | 88 | /** | 
|  | 89 | * struct uioc_t - the common ioctl packet structure | 
|  | 90 | * | 
|  | 91 | * @signature	: Must be "$$_EXTD_IOCTL_$$" | 
|  | 92 | * @mb_type	: Type of the mail box (MB_LEGACY or MB_HPE) | 
|  | 93 | * @app_type	: Type of the issuing application (existing or new) | 
|  | 94 | * @opcode	: Opcode of the command | 
|  | 95 | * @adapno	: Adapter number | 
|  | 96 | * @cmdbuf	: Pointer to buffer - can point to mbox or plain data buffer | 
|  | 97 | * @xferlen	: xferlen for DCMD and non mailbox commands | 
|  | 98 | * @data_dir	: Direction of the data transfer | 
|  | 99 | * @status	: Status from the driver | 
|  | 100 | * @reserved	: reserved bytes for future expansion | 
|  | 101 | * | 
|  | 102 | * @user_data	: user data transfer address is saved in this | 
|  | 103 | * @user_data_len: length of the data buffer sent by user app | 
|  | 104 | * @user_pthru	: user passthru address is saves in this (null if DCMD) | 
|  | 105 | * @pthru32	: kernel address passthru (allocated per kioc) | 
|  | 106 | * @pthru32_h	: physicall address of @pthru32 | 
|  | 107 | * @list	: for kioc free pool list maintenance | 
|  | 108 | * @done	: call back routine for llds to call when kioc is completed | 
|  | 109 | * @buf_vaddr	: dma pool buffer attached to kioc for data transfer | 
|  | 110 | * @buf_paddr	: physical address of the dma pool buffer | 
|  | 111 | * @pool_index	: index of the dma pool that @buf_vaddr is taken from | 
|  | 112 | * @free_buf	: indicates if buffer needs to be freed after kioc completes | 
|  | 113 | * | 
|  | 114 | * Note		: All LSI drivers understand only this packet. Any other | 
|  | 115 | *		: format sent by applications would be converted to this. | 
|  | 116 | */ | 
|  | 117 | typedef struct uioc { | 
|  | 118 |  | 
|  | 119 | /* User Apps: */ | 
|  | 120 |  | 
|  | 121 | uint8_t			signature[EXT_IOCTL_SIGN_SZ]; | 
|  | 122 | uint16_t		mb_type; | 
|  | 123 | uint16_t		app_type; | 
|  | 124 | uint32_t		opcode; | 
|  | 125 | uint32_t		adapno; | 
|  | 126 | uint64_t		cmdbuf; | 
|  | 127 | uint32_t		xferlen; | 
|  | 128 | uint32_t		data_dir; | 
|  | 129 | int32_t			status; | 
|  | 130 | uint8_t			reserved[128]; | 
|  | 131 |  | 
|  | 132 | /* Driver Data: */ | 
|  | 133 | void __user *		user_data; | 
|  | 134 | uint32_t		user_data_len; | 
| Ju, Seokmann | 0b4972d | 2006-07-25 08:45:06 -0600 | [diff] [blame] | 135 |  | 
|  | 136 | /* 64bit alignment */ | 
|  | 137 | uint32_t                pad_for_64bit_align; | 
|  | 138 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 139 | mraid_passthru_t	__user *user_pthru; | 
|  | 140 |  | 
|  | 141 | mraid_passthru_t	*pthru32; | 
|  | 142 | dma_addr_t		pthru32_h; | 
|  | 143 |  | 
|  | 144 | struct list_head	list; | 
|  | 145 | void			(*done)(struct uioc*); | 
|  | 146 |  | 
|  | 147 | caddr_t			buf_vaddr; | 
|  | 148 | dma_addr_t		buf_paddr; | 
|  | 149 | int8_t			pool_index; | 
|  | 150 | uint8_t			free_buf; | 
|  | 151 |  | 
|  | 152 | uint8_t			timedout; | 
|  | 153 |  | 
|  | 154 | } __attribute__ ((aligned(1024),packed)) uioc_t; | 
|  | 155 |  | 
|  | 156 |  | 
|  | 157 | /** | 
|  | 158 | * struct mraid_hba_info - information about the controller | 
|  | 159 | * | 
| Randy Dunlap | a69b74d | 2007-01-05 22:41:48 -0800 | [diff] [blame] | 160 | * @pci_vendor_id		: PCI vendor id | 
|  | 161 | * @pci_device_id		: PCI device id | 
|  | 162 | * @subsystem_vendor_id		: PCI subsystem vendor id | 
|  | 163 | * @subsystem_device_id		: PCI subsystem device id | 
|  | 164 | * @baseport			: base port of hba memory | 
|  | 165 | * @pci_bus			: PCI bus | 
|  | 166 | * @pci_dev_fn			: PCI device/function values | 
|  | 167 | * @irq				: interrupt vector for the device | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 168 | * | 
|  | 169 | * Extended information of 256 bytes about the controller. Align on the single | 
|  | 170 | * byte boundary so that 32-bit applications can be run on 64-bit platform | 
|  | 171 | * drivers withoug re-compilation. | 
|  | 172 | * NOTE: reduce the number of reserved bytes whenever new field are added, so | 
|  | 173 | * that total size of the structure remains 256 bytes. | 
|  | 174 | */ | 
|  | 175 | typedef struct mraid_hba_info { | 
|  | 176 |  | 
|  | 177 | uint16_t	pci_vendor_id; | 
|  | 178 | uint16_t	pci_device_id; | 
|  | 179 | uint16_t	subsys_vendor_id; | 
|  | 180 | uint16_t	subsys_device_id; | 
|  | 181 |  | 
|  | 182 | uint64_t	baseport; | 
|  | 183 | uint8_t		pci_bus; | 
|  | 184 | uint8_t		pci_dev_fn; | 
|  | 185 | uint8_t		pci_slot; | 
|  | 186 | uint8_t		irq; | 
|  | 187 |  | 
|  | 188 | uint32_t	unique_id; | 
|  | 189 | uint32_t	host_no; | 
|  | 190 |  | 
|  | 191 | uint8_t		num_ldrv; | 
|  | 192 | } __attribute__ ((aligned(256), packed)) mraid_hba_info_t; | 
|  | 193 |  | 
|  | 194 |  | 
|  | 195 | /** | 
|  | 196 | * mcontroller	: adapter info structure for old mimd_t apps | 
|  | 197 | * | 
|  | 198 | * @base	: base address | 
|  | 199 | * @irq		: irq number | 
|  | 200 | * @numldrv	: number of logical drives | 
|  | 201 | * @pcibus	: pci bus | 
|  | 202 | * @pcidev	: pci device | 
|  | 203 | * @pcifun	: pci function | 
|  | 204 | * @pciid	: pci id | 
|  | 205 | * @pcivendor	: vendor id | 
|  | 206 | * @pcislot	: slot number | 
|  | 207 | * @uid		: unique id | 
|  | 208 | */ | 
|  | 209 | typedef struct mcontroller { | 
|  | 210 |  | 
|  | 211 | uint64_t	base; | 
|  | 212 | uint8_t		irq; | 
|  | 213 | uint8_t		numldrv; | 
|  | 214 | uint8_t		pcibus; | 
|  | 215 | uint16_t	pcidev; | 
|  | 216 | uint8_t		pcifun; | 
|  | 217 | uint16_t	pciid; | 
|  | 218 | uint16_t	pcivendor; | 
|  | 219 | uint8_t		pcislot; | 
|  | 220 | uint32_t	uid; | 
|  | 221 |  | 
|  | 222 | } __attribute__ ((packed)) mcontroller_t; | 
|  | 223 |  | 
|  | 224 |  | 
|  | 225 | /** | 
|  | 226 | * mm_dmapool_t	: Represents one dma pool with just one buffer | 
|  | 227 | * | 
|  | 228 | * @vaddr	: Virtual address | 
|  | 229 | * @paddr	: DMA physicall address | 
|  | 230 | * @bufsize	: In KB - 4 = 4k, 8 = 8k etc. | 
|  | 231 | * @handle	: Handle to the dma pool | 
|  | 232 | * @lock	: lock to synchronize access to the pool | 
|  | 233 | * @in_use	: If pool already in use, attach new block | 
|  | 234 | */ | 
|  | 235 | typedef struct mm_dmapool { | 
|  | 236 | caddr_t		vaddr; | 
|  | 237 | dma_addr_t	paddr; | 
|  | 238 | uint32_t	buf_size; | 
|  | 239 | struct dma_pool	*handle; | 
|  | 240 | spinlock_t	lock; | 
|  | 241 | uint8_t		in_use; | 
|  | 242 | } mm_dmapool_t; | 
|  | 243 |  | 
|  | 244 |  | 
|  | 245 | /** | 
|  | 246 | * mraid_mmadp_t: Structure that drivers pass during (un)registration | 
|  | 247 | * | 
|  | 248 | * @unique_id		: Any unique id (usually PCI bus+dev+fn) | 
|  | 249 | * @drvr_type		: megaraid or hpe (DRVRTYPE_MBOX or DRVRTYPE_HPE) | 
|  | 250 | * @drv_data		: Driver specific; not touched by the common module | 
|  | 251 | * @timeout		: timeout for issued kiocs | 
|  | 252 | * @max_kioc		: Maximum ioctl packets acceptable by the lld | 
|  | 253 | * @pdev		: pci dev; used for allocating dma'ble memory | 
|  | 254 | * @issue_uioc		: Driver supplied routine to issue uioc_t commands | 
|  | 255 | *			: issue_uioc(drvr_data, kioc, ISSUE/ABORT, uioc_done) | 
|  | 256 | * @quiescent		: flag to indicate if ioctl can be issued to this adp | 
|  | 257 | * @list		: attach with the global list of adapters | 
|  | 258 | * @kioc_list		: block of mem for @max_kioc number of kiocs | 
|  | 259 | * @kioc_pool		: pool of free kiocs | 
|  | 260 | * @kioc_pool_lock	: protection for free pool | 
|  | 261 | * @kioc_semaphore	: so as not to exceed @max_kioc parallel ioctls | 
|  | 262 | * @mbox_list		: block of mem for @max_kioc number of mboxes | 
|  | 263 | * @pthru_dma_pool	: DMA pool to allocate passthru packets | 
|  | 264 | * @dma_pool_list	: array of dma pools | 
|  | 265 | */ | 
|  | 266 |  | 
|  | 267 | typedef struct mraid_mmadp { | 
|  | 268 |  | 
|  | 269 | /* Filled by driver */ | 
|  | 270 |  | 
|  | 271 | uint32_t		unique_id; | 
|  | 272 | uint32_t		drvr_type; | 
|  | 273 | unsigned long		drvr_data; | 
|  | 274 | uint16_t		timeout; | 
|  | 275 | uint8_t			max_kioc; | 
|  | 276 |  | 
|  | 277 | struct pci_dev		*pdev; | 
|  | 278 |  | 
|  | 279 | int(*issue_uioc)(unsigned long, uioc_t *, uint32_t); | 
|  | 280 |  | 
|  | 281 | /* Maintained by common module */ | 
|  | 282 | uint32_t		quiescent; | 
|  | 283 |  | 
|  | 284 | struct list_head	list; | 
|  | 285 | uioc_t			*kioc_list; | 
|  | 286 | struct list_head	kioc_pool; | 
|  | 287 | spinlock_t		kioc_pool_lock; | 
|  | 288 | struct semaphore	kioc_semaphore; | 
|  | 289 |  | 
|  | 290 | mbox64_t		*mbox_list; | 
|  | 291 | struct dma_pool		*pthru_dma_pool; | 
|  | 292 | mm_dmapool_t		dma_pool_list[MAX_DMA_POOLS]; | 
|  | 293 |  | 
|  | 294 | } mraid_mmadp_t; | 
|  | 295 |  | 
|  | 296 | int mraid_mm_register_adp(mraid_mmadp_t *); | 
|  | 297 | int mraid_mm_unregister_adp(uint32_t); | 
|  | 298 | uint32_t mraid_mm_adapter_app_handle(uint32_t); | 
|  | 299 |  | 
|  | 300 | #endif /* _MEGARAID_IOCTL_H_ */ |