]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/pms/freebsd/driver/ini/src/agtiapi.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / pms / freebsd / driver / ini / src / agtiapi.h
1 /*******************************************************************************
2 **
3 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
4 *
5 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 
6 *that the following conditions are met: 
7 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 
8 *2. Redistributions in binary form must reproduce the above copyright notice, 
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 
10 *
11 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
12 *
13 *INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
14 *ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
15 *SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
16 *OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
17 *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
18 *THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
19 **
20 * $FreeBSD$
21 **
22 *******************************************************************************/
23
24 #include <dev/pms/freebsd/driver/common/osenv.h>
25 #include <dev/pms/freebsd/driver/common/ostypes.h>
26 #include <dev/pms/freebsd/driver/common/osdebug.h>
27 #include <dev/pms/freebsd/driver/ini/src/agdef.h>
28 #include <dev/pms/freebsd/driver/common/lxcommon.h>
29 #ifdef AGTIAPI_ISCSI
30 #include "cmtypes.h"
31 #include "bktypes.h"
32 #endif
33 #ifdef FDS_DM
34 #include <dev/pms/RefTisa/discovery/api/dm.h>
35 #endif
36 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
37 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
38 #include <dev/pms/RefTisa/tisa/api/titypes.h>
39 #include <vm/uma.h>
40
41 typedef u_int32_t atomic_t;
42
43 #define atomic_set(p,v)         (*(p) = (v))
44 #define atomic_read(p)          (*(p))
45 #define atomic_inc(p)           atomic_add_int(p,1)
46 #define atomic_dec(p)           atomic_subtract_int(p,1)
47 #define atomic_add(n,p)         atomic_add_int(p,n)
48 #define atomic_sub(n,p)         atomic_subtract_int(p,n)
49
50 #define AGSCSI_INIT_XCHG_LEN  sizeof(tiScsiInitiatorRequest_t)
51 #define AGSMP_INIT_XCHG_LEN   sizeof(tiSMPFrame_t)  
52 #define CMND_DMA_UNMAP( pCard, cmnd )
53
54
55 // define PMC lean flags used for bit operations to track dev listing state
56 #define DPMC_LEANFLAG_NOAGDEVYT     2  // agDev handle not present yet
57 #define DPMC_LEANFLAG_NOWWNLIST     4  // WWNList entry not present
58 #define DPMC_LEANFLAG_AGDEVUSED     8  // agDev handle used
59 #define DPMC_LEANFLAG_PDEVSUSED    16  // pDevice slot used
60
61 typedef bus_dmamap_t dma_addr_t; // ##
62
63 #define timer_list callout
64
65 typedef struct ccb_hdr_s {
66   void *next;
67 } ccb_hdr_t;
68
69
70 typedef struct _CCB {
71   U32               targetId;
72   U32               lun;
73   U32               channel;
74   U16               ccbStatus;
75   U16               scsiStatus;
76   U32               dataLen;
77   U08               senseLen;
78   U08               addrMode;
79   U08               retryCount;
80   U16               numSgElements;
81   U32               flags;
82   U32_64            dmaHandle;
83   caddr_t           pSenseData;   // auto request sense data
84   tiSgl_t          *sgList;           // [AGTIAPI_MAX_DMA_SEGS]
85   bus_addr_t        tisgl_busaddr;
86   //  dma_addr_t        sglDmaHandle;      // ## dmaHandle for sgList
87   tiDeviceHandle_t *devHandle;
88   struct _CCB      *pccbNext;
89   struct _CCB      *pccbChainNext;    // forward link pointers
90   struct scsi_cmnd *cmd;              // call back owner pointer
91   struct _CCB      *pccbIO;           // for TM TARGET_RESET
92   U32_64            startTime;
93   tiIORequest_t     tiIORequest;
94   tdIORequestBody_t tdIOReqBody;
95   tiSuperScsiInitiatorRequest_t tiSuperScsiRequest;
96   tiSMPFrame_t            tiSMPFrame;
97 #ifdef CCBUILD_TEST_EPL
98   caddr_t           epl_ptr;
99   dma_addr_t        epl_dma_ptr;
100 #endif
101
102 #ifdef CCBUILD_TEST_DPL
103   caddr_t           dplPtr;
104   dma_addr_t        dplDma;
105 #endif
106
107 #if defined (PERF_COUNT)
108   u64               startCmnd;         // temp var to hold cmnd arrival
109 #endif
110 #ifdef ENABLE_NONSTANDARD_SECTORS
111   caddr_t           metaPtr;
112   dma_addr_t        dmaHandleMeta;
113 #endif
114 #ifdef ENABLE_SATA_DIF
115   caddr_t           holePtr;
116   dma_addr_t        dmaHandleHole;
117   int               scaling_done;
118 #endif
119
120 #ifdef SUPER_FAST_IO_TEST 
121   agsaIORequest_t      IoContext;
122   agsaSASRequestBody_t sasRequestBody;
123   u32                  reqType;
124   u32                  queueId;
125   agsaSgl_t           *sgl; // Used for esgl
126 #endif
127   //new
128   bus_dmamap_t          CCB_dmamap;
129   union ccb           *ccb; /* replacement of struct scsi_cmnd */
130   struct agtiapi_softc *pmcsc;
131  
132 } ccb_t, *pccb_t;
133
134
135 #define AGTIAPI_CCB_SIZE  sizeof(struct _CCB)
136
137 /*
138 typedef struct _ag_portal_data
139 {
140   ag_portal_info_t    portalInfo;
141   void                *pCard;
142 } ag_portal_data_t;
143 */
144
145 typedef enum {
146         DEK_TABLE_0 = 0,
147         DEK_TABLE_1 = 1,
148         DEK_TABLE_INVALID = DEK_MAX_TABLES,
149      } dek_table_e;
150
151 typedef struct ag_encrypt_map_s {
152         unsigned long long lbaMin;
153         unsigned long long lbaMax;
154         dek_table_e        dekTable;
155         bit32              dekIndex;
156         bit32              kekIndex;
157         bit32              kekTagCheck;
158         bit32              kekTag[2];
159         struct list_head   *list;
160     } ag_encrypt_map_t;
161
162 typedef struct ag_kek_table_s {
163  #define KEK_TABLE_MAX_ENTRY  8
164         bit32              wrapperIndex;
165         tiEncryptKekBlob_t kekBlob;
166    } ag_kek_table_t;
167
168 typedef struct ag_dek_kek_map_s {
169         bit32             kekIndex;
170    } ag_dek_kek_map_t;
171
172 /*
173 ** There is no LUN filed for the device structure.
174 ** The reason is if the device is a single lun device, it
175 ** will be lun 0.  If is a multi-lun device such as EMC 
176 ** or Galaxi, only one device structure is associated with
177 ** the device since only one device handler is provided.
178 */
179 typedef struct _ag_device {
180 //#ifdef HOTPLUG_SUPPORT 
181   /* used for hot-plug, temporarily either in new or removed devices list */
182   LINK_NODE           devLink;  
183 //#endif
184   U32                 targetId;
185   U32                 flags;
186   U16                 devType;
187   U16                 resetCount;
188   U32                 portalId;
189   void               *pCard;
190   U32                 sector_size;
191   U32                 CCBCount;
192 #ifdef HOTPLUG_SUPPORT
193   struct scsi_device *sdev;
194 #endif
195   tiDeviceHandle_t   *pDevHandle;
196   tiDeviceInfo_t      devInfo;
197   ag_portal_info_t   *pPortalInfo;
198   U08                 targetName[AGTIAPI_MAX_NAME];
199   U16                 targetLen;
200   U32                     qbusy;
201   U32                     qdepth;
202 } ag_device_t;
203
204
205 /*      
206 ** Use an array of these structures to map from assigned
207 ** device target id (which is the index into the array) to
208 ** the entry in the bd_devlist.
209 **
210 ** Please note that an extra entry has been added to both
211 ** the bd_devlist array and the bd_WWN_list.  This last
212 ** entry is the "no mapping" entry -- used for initialization
213 ** and to indicate an inactive entry.
214 */
215 typedef struct _ag_tgt_map { 
216   U16      devListIndex;
217   U16      flags;
218   U08      targetName[AGTIAPI_MAX_NAME];
219   U16      targetLen;
220   U08      portId;
221   int      sasLrIdx; // Index into SAS Local/Remote list (part of extend-portID)
222   uint32_t devRemoved; // when set, ghost target device is timing out
223 } ag_tgt_map_t;
224
225
226 // use an array of this struct to map local/remote dyads to ag_tgt_map_t
227 // entries
228 typedef struct _ag_slr_map {
229   U08  localeName[AGTIAPI_MIN_NAME];
230   U08  remoteName[AGTIAPI_MAX_NAME];
231   int  localeNameLen;
232   int  remoteNameLen;
233 } ag_slr_map_t;
234
235
236 #ifdef LINUX_PERBI_SUPPORT
237 // Use a list of these structures to hold target-WWN
238 // mapping assignments on the boot line during driver
239 // loading.
240 typedef struct _ag_mapping_s 
241 {
242   struct _ag_mapping_s *next;
243   U16                   targetId;
244   U08                   cardNo;
245   U08                   targetLen;
246   U08                   targetName[AGTIAPI_MAX_NAME];
247 } ag_mapping_t;
248 #endif
249
250 typedef struct _ag_portal_data
251 {
252   ag_portal_info_t    portalInfo;
253   void               *pCard;
254 } ag_portal_data_t;
255
256
257 // The softc holds our per-instance data
258 struct agtiapi_softc {
259   device_t            my_dev;
260   struct cdev        *my_cdev;
261   struct cam_sim     *sim;
262   struct cam_path    *path;
263   struct resource    *resirq;
264   void               *intr_cookie;
265
266   int                 rscID[MAX_MSIX_NUM_VECTOR];
267   struct resource    *irq[MAX_MSIX_NUM_VECTOR];
268   void               *intrcookie[MAX_MSIX_NUM_VECTOR];
269
270   // timer stuff; mc lean
271   bus_dma_tag_t       buffer_dmat;
272   struct cam_devq    *devq;
273   struct callout      OS_timer;
274   struct mtx          OS_timer_lock;
275   struct callout      IO_timer;
276   struct mtx          IO_timer_lock;
277   struct callout      devRmTimer;
278   struct mtx          devRmTimerLock;
279   uint16_t            rmChkCt;
280
281   // for tiSgl_t memory
282   tiSgl_t            *tisgl_mem;
283   bus_addr_t          tisgl_busaddr;
284   bus_dma_tag_t       tisgl_dmat;
285   bus_dmamap_t        tisgl_map;
286
287   // for ostiAllocMemory() pre allocation pool
288   void               *osti_mem;
289   bus_addr_t          osti_busaddr;
290   bus_dma_tag_t       osti_dmat;
291   bus_dmamap_t        osti_mapp;
292
293   // pre-allocation pool
294   U32                 typhn; // size needed
295   void               *typh_mem;
296   bus_addr_t          typh_busaddr;
297   bus_dma_tag_t       typh_dmat;
298   bus_dmamap_t        typh_mapp;
299   U32                 typhIdx;
300   U32                 tyPhsIx;
301
302
303   // begin ag_card_t references (AKA pCard)
304   struct Scsi_Host   *pHost;
305   tiRoot_t            tiRoot;             // tiRoot for the card
306   U32                 VidDid;
307   U32                 SVID_SSID;
308   U32                 flags;              // keep track of state
309   U32                 freezeSim;
310   U32                 up_count;
311   U32                 down_count;
312   U08                 hostNo;             // host number signed by OS
313   U08                 cardNo;             // host no signed by driver
314   U16                 tgtCount;           // total target devices
315   U16                 badTgtCount;        // total bad target devices
316   U16                 activeCCB;          // number of active CCB
317   U32                 ccbTotal;           // total # of CCB allocated
318   U32                 devDiscover;        // # of device to be discovered
319   U32                 resetCount;
320   U32                 timeoutTicks;
321   U32                 portCount;          // portal count
322   U32                 SimQFrozen;         // simq frozen state
323   U32                 devq_flag;      //device busy flag 
324   U32                 dev_scan;           //device ready 
325   pccb_t              ccbSendHead;        // CCB send list head
326   pccb_t              ccbSendTail;        // CCB send list tail
327   pccb_t              ccbDoneHead;        // CCB done list head
328   pccb_t              ccbDoneTail;        // CCB done list tail
329   pccb_t              smpSendHead;        // CCB send list head
330   pccb_t              smpSendTail;        // CCB send list tail
331   pccb_t              smpDoneHead;        // CCB done list head
332   pccb_t              smpDoneTail;        // CCB done list tail
333   caddr_t            *ccbChainList;       // ccb chain list head
334   caddr_t            *ccbFreeList;        // free ccb list head
335   ccb_hdr_t          *ccbAllocList;       // ### ccb allocation chain list head
336   struct pci_pool    *sglPool;            // for SGL pci_alloc_consistent
337   struct timer_list   osTimerList;        // card timer list
338 #ifdef TD_TIMER
339   struct timer_list   tdTimerList;        // tdlayer timer list
340 #endif
341   struct timer_list   tiTimerList;        // tilayer timer list
342   ag_portal_data_t   *pPortalData;        // wrapper
343   ag_card_info_t     *pCardInfo;
344   ag_device_t        *pDevList;
345
346 #define CIPHER_MODE_INVALID 0xffffffffUL
347 #define DEK_INDEX_INVALID   0xffffffffUL
348 #define KEK_INDEX_INVALID   0xffffffffUL
349   int                 encrypt;            // enable/disable encryption flag
350   bit32               dek_size;           // size of dek
351   void               *ioctl_data;         // encryption ioctl data pointer
352
353   struct list_head   *encrypt_map;        // encryption map
354   ag_kek_table_t      kek_table[KEK_TABLE_MAX_ENTRY];
355   // KEK table
356   ag_dek_kek_map_t    dek_kek_map[DEK_MAX_TABLES][DEK_MAX_TABLE_ITEMS];
357   // storage for dek index in tables (sysfs)
358   int                 dek_index[2];
359 #define DEK_SIZE_PLAIN   72
360 #define DEK_SIZE_ENCRYPT 80
361 #define ENCRYPTION_MAP_MEMPOOL_SIZE 64
362   char                map_cache_name[32]; // name of mapping memory pool
363   struct kmem_cache  *map_cache;          // handle to mapping cache
364   bit32               cipher_mode;        // storage of cipher mode
365 #define ENCRYPTION_IO_ERR_MEMPOOL_SIZE 256
366   struct mtx          ioerr_queue_lock;
367   char                ioerr_cache_name[32];
368   struct kmem_cache  *ioerr_cache;        // handle to IO error cache
369
370 //#ifdef LINUX_PERBI_SUPPORT
371   ag_tgt_map_t       *pWWNList;
372   ag_slr_map_t       *pSLRList;           // SAS Local/Remote map list
373   U32                 numTgtHardMapped;   // hard mapped target number
374 //#endif
375   struct sema            *pIoctlSem;         // for ioctl sync.
376   U32_64              osLockFlag;         // flag for oslayer spin lock TBU
377 #ifdef AGTIAPI_LOCAL_LOCK
378   struct mtx          sendLock;           // local queue lock
379   struct mtx          doneLock;           // local queue lock
380   struct mtx          sendSMPLock;        // local queue lock
381   struct mtx          doneSMPLock;        // local queue lock
382   struct mtx          ccbLock;            // ccb list lock
383   struct mtx         *STLock;             // Low Level & TD locks
384   unsigned long      *STLockFlags;        // Low Level & TD locks flags
385   struct mtx          memLock;            // dynamic memory allocation lock
386   struct mtx          freezeLock;
387 #endif
388 #ifdef AGTIAPI_DPC                        // card deferred intr process tasklet
389   struct callout      tasklet_dpc[MAX_MSIX_NUM_DPC];
390 #endif
391 //#ifdef HOTPLUG_SUPPORT
392   struct mtx          devListLock;        // device lists lock
393 //#endif
394
395 };
396
397 int agtiapi_getdevlist( struct agtiapi_softc *pCard,
398                         tiIOCTLPayload_t *agIOCTLPayload );
399 int agtiapi_getCardInfo ( struct agtiapi_softc      *pCard,
400                           U32_64                        size,
401                           void                        *buffer );
402
403 #ifndef LINUX_PERBI_SUPPORT
404 #define INDEX(_pCard, _T)   (_T)
405 #else
406 #define INDEX(_pCard, _T)   (((_pCard)->pWWNList + (_T))->devListIndex)
407 #endif
408