1 /** @file
2 
3   Macros and type definitions for LSI Fusion MPT SCSI devices.
4 
5   Copyright (C) 2020, Oracle and/or its affiliates.
6 
7   SPDX-License-Identifier: BSD-2-Clause-Patent
8 
9 **/
10 
11 #ifndef __FUSION_MPT_SCSI_H__
12 #define __FUSION_MPT_SCSI_H__
13 
14 //
15 // Device offsets and constants
16 //
17 
18 #define LSI_LOGIC_PCI_VENDOR_ID 0x1000
19 #define LSI_53C1030_PCI_DEVICE_ID 0x0030
20 #define LSI_SAS1068_PCI_DEVICE_ID 0x0054
21 #define LSI_SAS1068E_PCI_DEVICE_ID 0x0058
22 
23 #define MPT_REG_DOORBELL  0x00
24 #define MPT_REG_WRITE_SEQ 0x04
25 #define MPT_REG_HOST_DIAG 0x08
26 #define MPT_REG_TEST      0x0c
27 #define MPT_REG_DIAG_DATA 0x10
28 #define MPT_REG_DIAG_ADDR 0x14
29 #define MPT_REG_ISTATUS   0x30
30 #define MPT_REG_IMASK     0x34
31 #define MPT_REG_REQ_Q     0x40
32 #define MPT_REG_REP_Q     0x44
33 
34 #define MPT_DOORBELL_RESET     0x40
35 #define MPT_DOORBELL_HANDSHAKE 0x42
36 
37 #define MPT_IMASK_DOORBELL 0x01
38 #define MPT_IMASK_REPLY    0x08
39 
40 #define MPT_MESSAGE_HDR_FUNCTION_SCSI_IO_REQUEST 0x00
41 #define MPT_MESSAGE_HDR_FUNCTION_IOC_INIT        0x02
42 
43 #define MPT_SG_ENTRY_TYPE_SIMPLE 0x01
44 
45 #define MPT_IOC_WHOINIT_ROM_BIOS 0x02
46 
47 #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_NONE  (0x00 << 24)
48 #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_WRITE (0x01 << 24)
49 #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_READ  (0x02 << 24)
50 
51 #define MPT_SCSI_IOCSTATUS_SUCCESS          0x0000
52 #define MPT_SCSI_IOCSTATUS_DEVICE_NOT_THERE 0x0043
53 #define MPT_SCSI_IOCSTATUS_DATA_OVERRUN     0x0044
54 #define MPT_SCSI_IOCSTATUS_DATA_UNDERRUN    0x0045
55 
56 //
57 // Device structures
58 //
59 
60 #pragma pack (1)
61 typedef struct {
62   UINT8     WhoInit;
63   UINT8     Reserved1;
64   UINT8     ChainOffset;
65   UINT8     Function;
66   UINT8     Flags;
67   UINT8     MaxDevices;
68   UINT8     MaxBuses;
69   UINT8     MessageFlags;
70   UINT32    MessageContext;
71   UINT16    ReplyFrameSize;
72   UINT16    Reserved2;
73   UINT32    HostMfaHighAddr;
74   UINT32    SenseBufferHighAddr;
75 } MPT_IO_CONTROLLER_INIT_REQUEST;
76 
77 typedef struct {
78   UINT8     WhoInit;
79   UINT8     Reserved1;
80   UINT8     MessageLength;
81   UINT8     Function;
82   UINT8     Flags;
83   UINT8     MaxDevices;
84   UINT8     MaxBuses;
85   UINT8     MessageFlags;
86   UINT32    MessageContext;
87   UINT16    Reserved2;
88   UINT16    IocStatus;
89   UINT32    IocLogInfo;
90 } MPT_IO_CONTROLLER_INIT_REPLY;
91 
92 typedef struct {
93   UINT8     TargetId;
94   UINT8     Bus;
95   UINT8     ChainOffset;
96   UINT8     Function;
97   UINT8     CdbLength;
98   UINT8     SenseBufferLength;
99   UINT8     Reserved;
100   UINT8     MessageFlags;
101   UINT32    MessageContext;
102   UINT8     Lun[8];
103   UINT32    Control;
104   UINT8     Cdb[16];
105   UINT32    DataLength;
106   UINT32    SenseBufferLowAddress;
107 } MPT_SCSI_IO_REQUEST;
108 
109 typedef struct {
110   UINT32    Length:             24;
111   UINT32    EndOfList:          1;
112   UINT32    Is64BitAddress:     1;
113   //
114   // True when the buffer contains data to be transfered. Otherwise it's the
115   // destination buffer
116   //
117   UINT32    BufferContainsData: 1;
118   UINT32    LocalAddress:       1;
119   UINT32    ElementType:        2;
120   UINT32    EndOfBuffer:        1;
121   UINT32    LastElement:        1;
122   UINT64    DataBufferAddress;
123 } MPT_SG_ENTRY_SIMPLE;
124 
125 typedef struct {
126   UINT8     TargetId;
127   UINT8     Bus;
128   UINT8     MessageLength;
129   UINT8     Function;
130   UINT8     CdbLength;
131   UINT8     SenseBufferLength;
132   UINT8     Reserved;
133   UINT8     MessageFlags;
134   UINT32    MessageContext;
135   UINT8     ScsiStatus;
136   UINT8     ScsiState;
137   UINT16    IocStatus;
138   UINT32    IocLogInfo;
139   UINT32    TransferCount;
140   UINT32    SenseCount;
141   UINT32    ResponseInfo;
142 } MPT_SCSI_IO_REPLY;
143 
144 typedef struct {
145   MPT_SCSI_IO_REQUEST Header;
146   MPT_SG_ENTRY_SIMPLE Sg;
147 } MPT_SCSI_REQUEST_WITH_SG;
148 #pragma pack ()
149 
150 typedef union {
151   MPT_SCSI_IO_REPLY        Data;
152   UINT64                   Uint64; // 8 byte alignment required by HW
153 } MPT_SCSI_IO_REPLY_ALIGNED;
154 
155 typedef union {
156   MPT_SCSI_REQUEST_WITH_SG Data;
157   UINT64                   Uint64; // 8 byte alignment required by HW
158 } MPT_SCSI_REQUEST_ALIGNED;
159 
160 #endif // __FUSION_MPT_SCSI_H__
161