linux/drivers/scsi/megaraid/megaraid_ioctl.h
<<
>>
Prefs
   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
  23#include "mbox_defs.h"
  24
  25/*
  26 * console messages debug levels
  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
  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 */
  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 */
 117typedef 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;
 135
 136        /* 64bit alignment */
 137        uint32_t                pad_for_64bit_align;
 138
 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 *
 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
 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 */
 175typedef 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 */
 209typedef 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 */
 235typedef 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
 267typedef 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
 296int mraid_mm_register_adp(mraid_mmadp_t *);
 297int mraid_mm_unregister_adp(uint32_t);
 298uint32_t mraid_mm_adapter_app_handle(uint32_t);
 299
 300#endif /* _MEGARAID_IOCTL_H_ */
 301