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