]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/FusionMptScsi.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / FusionMptScsi.h
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__