Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mvumi.h
Go to the documentation of this file.
1 /*
2  * Marvell UMI head file
3  *
4  * Copyright 2011 Marvell. <[email protected]>
5  *
6  * This file is licensed under GPLv2.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; version 2 of the
11  * License.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21  * USA
22  */
23 
24 #ifndef MVUMI_H
25 #define MVUMI_H
26 
27 #define MAX_BASE_ADDRESS 6
28 
29 #define VER_MAJOR 1
30 #define VER_MINOR 1
31 #define VER_OEM 0
32 #define VER_BUILD 1500
33 
34 #define MV_DRIVER_NAME "mvumi"
35 #define PCI_VENDOR_ID_MARVELL_2 0x1b4b
36 #define PCI_DEVICE_ID_MARVELL_MV9143 0x9143
37 #define PCI_DEVICE_ID_MARVELL_MV9580 0x9580
38 
39 #define MVUMI_INTERNAL_CMD_WAIT_TIME 45
40 #define MVUMI_INQUIRY_LENGTH 44
41 #define MVUMI_INQUIRY_UUID_OFF 36
42 #define MVUMI_INQUIRY_UUID_LEN 8
43 
44 #define IS_DMA64 (sizeof(dma_addr_t) == 8)
45 
49 };
50 
51 struct mvumi_hw_regs {
52  /* For CPU */
57  void *ctrl_sts_reg;
60 
61  /* For Doorbell */
69 
70  /* reset register */
72  void *reset_enable;
73 
74  /* For Message Unit */
91 
92  /* Bit setting for HW */
104 };
105 
111 };
112 
113 #define SCSI_CMD_MARVELL_SPECIFIC 0xE1
114 #define CDB_CORE_MODULE 0x1
115 #define CDB_CORE_SHUTDOWN 0xB
116 
117 enum {
118  DRBL_HANDSHAKE = 1 << 0,
119  DRBL_SOFT_RESET = 1 << 1,
120  DRBL_BUS_CHANGE = 1 << 2,
122  DRBL_MU_RESET = 1 << 4,
124 
125  /*
126  * Command flag is the flag for the CDB command itself
127  */
128  /* 1-non data; 0-data command */
130  CMD_FLAG_DMA = 1 << 1,
131  CMD_FLAG_PIO = 1 << 2,
132  /* 1-host read data */
134  /* 1-host write data */
137 };
138 
139 #define APICDB0_EVENT 0xF4
140 #define APICDB1_EVENT_GETEVENT 0
141 #define APICDB1_HOST_GETEVENT 1
142 #define MAX_EVENTS_RETURNED 6
143 
144 #define DEVICE_OFFLINE 0
145 #define DEVICE_ONLINE 1
146 
149  u8 dummy[2];
150  u8 bitmap[0];
151 };
152 
164 };
165 
167  unsigned char count;
168  unsigned char reserved[3];
170 };
171 
174  struct mvumi_hba *mhba;
175  unsigned int event;
176  void *param;
177 };
178 
179 #define HS_CAPABILITY_SUPPORT_COMPACT_SG (1U << 4)
180 #define HS_CAPABILITY_SUPPORT_PRD_HOST (1U << 5)
181 #define HS_CAPABILITY_SUPPORT_DYN_SRC (1U << 6)
182 #define HS_CAPABILITY_NEW_PAGE_IO_DEPTH_DEF (1U << 14)
183 
184 #define MVUMI_MAX_SG_ENTRY 32
185 #define SGD_EOT (1L << 27)
186 #define SGD_EOT_CP (1L << 22)
187 
188 struct mvumi_sgl {
193 };
198 };
199 
200 #define GET_COMPACT_SGD_SIZE(sgd) \
201  ((((struct mvumi_compact_sgl *)(sgd))->flags) & 0x3FFFFFL)
202 
203 #define SET_COMPACT_SGD_SIZE(sgd, sz) do { \
204  (((struct mvumi_compact_sgl *)(sgd))->flags) &= ~0x3FFFFFL; \
205  (((struct mvumi_compact_sgl *)(sgd))->flags) |= (sz); \
206 } while (0)
207 #define sgd_getsz(_mhba, sgd, sz) do { \
208  if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG) \
209  (sz) = GET_COMPACT_SGD_SIZE(sgd); \
210  else \
211  (sz) = (sgd)->size; \
212 } while (0)
213 
214 #define sgd_setsz(_mhba, sgd, sz) do { \
215  if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG) \
216  SET_COMPACT_SGD_SIZE(sgd, sz); \
217  else \
218  (sgd)->size = (sz); \
219 } while (0)
220 
221 #define sgd_inc(_mhba, sgd) do { \
222  if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG) \
223  sgd = (struct mvumi_sgl *)(((unsigned char *) (sgd)) + 12); \
224  else \
225  sgd = (struct mvumi_sgl *)(((unsigned char *) (sgd)) + 16); \
226 } while (0)
227 
228 struct mvumi_res {
229  struct list_head entry;
231  void *virt_addr;
232  unsigned int size;
233  unsigned short type; /* enum Resource_Type */
234 };
235 
236 /* Resource type */
240 };
241 
258 };
259 
260 /* Request initiator must set the status to REQ_STATUS_PENDING. */
261 #define REQ_STATUS_PENDING 0x80
262 
263 struct mvumi_cmd {
267  struct scsi_cmnd *scmd;
269  void *data_buf;
270  unsigned short request_id;
271  unsigned char cmd_status;
272 };
273 
274 /*
275  * the function type of the in bound frame
276  */
277 #define CL_FUN_SCSI_CMD 0x1
278 
291 };
292 
293 /*
294  * the respond flag for data_payload of the out bound frame
295  */
296 #define CL_RSP_FLAG_NODATA 0x0
297 #define CL_RSP_FLAG_SENSEDATA 0x1
298 
303  u8 rsp_flag; /* Indicates the type of Data_Payload.*/
306 };
307 
309  struct list_head list;
310  unsigned char data[0];
311 };
312 
313 struct version_info {
318 };
319 
320 #define FW_MAX_DELAY 30
321 #define MVUMI_FW_BUSY (1U << 0)
322 #define MVUMI_FW_ATTACH (1U << 1)
323 #define MVUMI_FW_ALLOC (1U << 2)
324 
325 /*
326  * State is the state of the MU
327  */
328 #define FW_STATE_IDLE 0
329 #define FW_STATE_STARTING 1
330 #define FW_STATE_HANDSHAKING 2
331 #define FW_STATE_STARTED 3
332 #define FW_STATE_ABORT 4
333 
334 #define HANDSHAKE_SIGNATURE 0x5A5A5A5AL
335 #define HANDSHAKE_READYSTATE 0x55AA5AA5L
336 #define HANDSHAKE_DONESTATE 0x55AAA55AL
337 
338 /* HandShake Status definition */
339 #define HS_STATUS_OK 1
340 #define HS_STATUS_ERR 2
341 #define HS_STATUS_INVALID 3
342 
343 /* HandShake State/Cmd definition */
344 #define HS_S_START 1
345 #define HS_S_RESET 2
346 #define HS_S_PAGE_ADDR 3
347 #define HS_S_QUERY_PAGE 4
348 #define HS_S_SEND_PAGE 5
349 #define HS_S_END 6
350 #define HS_S_ABORT 7
351 #define HS_PAGE_VERIFY_SIZE 128
352 
353 #define HS_GET_STATE(a) (a & 0xFFFF)
354 #define HS_GET_STATUS(a) ((a & 0xFFFF0000) >> 16)
355 #define HS_SET_STATE(a, b) (a |= (b & 0xFFFF))
356 #define HS_SET_STATUS(a, b) (a |= ((b & 0xFFFF) << 16))
357 
358 /* handshake frame */
361  /* host information */
364  struct version_info host_ver; /* bios or driver version */
365 
366  /* controller information */
371 
372  /* communication list configuration */
377 
382 
383  /* system time */
385 };
386 
392 };
393 
394 /*
395  * the page code type of the handshake header
396  */
397 #define HS_PAGE_FIRM_CAP 0x1
398 #define HS_PAGE_HOST_INFO 0x2
399 #define HS_PAGE_FIRM_CTL 0x3
400 #define HS_PAGE_CL_INFO 0x4
401 #define HS_PAGE_TOTAL 0x5
402 
403 #define HSP_SIZE(i) sizeof(struct mvumi_hs_page##i)
404 
405 #define HSP_MAX_SIZE ({ \
406  int size, m1, m2; \
407  m1 = max(HSP_SIZE(1), HSP_SIZE(3)); \
408  m2 = max(HSP_SIZE(2), HSP_SIZE(4)); \
409  size = max(m1, m2); \
410  size; \
411 })
412 
413 /* The format of the page code for Firmware capability */
418 
431 };
432 
433 /* The format of the page code for Host information */
438 
448 };
449 
450 /* The format of the page code for firmware control */
461 };
462 
475 };
476 
477 struct mvumi_tag {
478  unsigned short *stack;
479  unsigned short top;
480  unsigned short size;
481 };
482 
483 struct mvumi_device {
484  struct list_head list;
485  struct scsi_device *sdev;
488  int id;
489 };
490 
491 struct mvumi_hba {
494  void *mmio;
496  struct Scsi_Host *shost;
498  struct pci_dev *pdev;
499  unsigned int unique_id;
502 
503  void *ib_list;
505 
506  void *ib_frame;
508 
509  void *ob_list;
511 
512  void *ib_shadow;
514 
515  void *ob_shadow;
517 
520 
521  unsigned int global_isr;
522  unsigned int isr_status;
523 
524  unsigned short max_sge;
525  unsigned short max_target_id;
526  unsigned char *target_map;
527  unsigned int max_io;
528  unsigned int list_num_io;
529  unsigned int ib_max_size;
530  unsigned int ob_max_size;
531  unsigned int ib_max_size_setting;
532  unsigned int ob_max_size_setting;
533  unsigned int max_transfer_size;
534  unsigned char hba_total_pages;
535  unsigned char fw_flag;
536  unsigned char request_id_enabled;
537  unsigned char eot_flag;
538  unsigned short hba_capability;
539  unsigned short io_seq;
540 
541  unsigned int ib_cur_slot;
542  unsigned int ob_cur_slot;
543  unsigned int fw_state;
545 
550 
552  struct mvumi_cmd **tag_cmd;
559 };
560 
562  void (*fire_cmd) (struct mvumi_hba *, struct mvumi_cmd *);
563  void (*enable_intr) (struct mvumi_hba *);
564  void (*disable_intr) (struct mvumi_hba *);
565  int (*clear_intr) (void *);
566  unsigned int (*read_fw_status_reg) (struct mvumi_hba *);
567  unsigned int (*check_ib_list) (struct mvumi_hba *);
568  int (*check_ob_list) (struct mvumi_hba *, unsigned int *,
569  unsigned int *);
570  int (*reset_host) (struct mvumi_hba *);
571 };
572 
573 extern struct timezone sys_tz;
574 #endif