]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/FusionMptScsi.h
OvmfPkg/MptScsiDxe: Initialize hardware
[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 //
48 // Device structures
49 //
50
51 #pragma pack (1)
52 typedef struct {
53 UINT8 WhoInit;
54 UINT8 Reserved1;
55 UINT8 ChainOffset;
56 UINT8 Function;
57 UINT8 Flags;
58 UINT8 MaxDevices;
59 UINT8 MaxBuses;
60 UINT8 MessageFlags;
61 UINT32 MessageContext;
62 UINT16 ReplyFrameSize;
63 UINT16 Reserved2;
64 UINT32 HostMfaHighAddr;
65 UINT32 SenseBufferHighAddr;
66 } MPT_IO_CONTROLLER_INIT_REQUEST;
67
68 typedef struct {
69 UINT8 WhoInit;
70 UINT8 Reserved1;
71 UINT8 MessageLength;
72 UINT8 Function;
73 UINT8 Flags;
74 UINT8 MaxDevices;
75 UINT8 MaxBuses;
76 UINT8 MessageFlags;
77 UINT32 MessageContext;
78 UINT16 Reserved2;
79 UINT16 IocStatus;
80 UINT32 IocLogInfo;
81 } MPT_IO_CONTROLLER_INIT_REPLY;
82
83 typedef struct {
84 UINT8 TargetId;
85 UINT8 Bus;
86 UINT8 ChainOffset;
87 UINT8 Function;
88 UINT8 CdbLength;
89 UINT8 SenseBufferLength;
90 UINT8 Reserved;
91 UINT8 MessageFlags;
92 UINT32 MessageContext;
93 UINT8 Lun[8];
94 UINT32 Control;
95 UINT8 Cdb[16];
96 UINT32 DataLength;
97 UINT32 SenseBufferLowAddress;
98 } MPT_SCSI_IO_REQUEST;
99
100 typedef struct {
101 UINT32 Length: 24;
102 UINT32 EndOfList: 1;
103 UINT32 Is64BitAddress: 1;
104 //
105 // True when the buffer contains data to be transfered. Otherwise it's the
106 // destination buffer
107 //
108 UINT32 BufferContainsData: 1;
109 UINT32 LocalAddress: 1;
110 UINT32 ElementType: 2;
111 UINT32 EndOfBuffer: 1;
112 UINT32 LastElement: 1;
113 UINT64 DataBufferAddress;
114 } MPT_SG_ENTRY_SIMPLE;
115
116 typedef struct {
117 UINT8 TargetId;
118 UINT8 Bus;
119 UINT8 MessageLength;
120 UINT8 Function;
121 UINT8 CdbLength;
122 UINT8 SenseBufferLength;
123 UINT8 Reserved;
124 UINT8 MessageFlags;
125 UINT32 MessageContext;
126 UINT8 ScsiStatus;
127 UINT8 ScsiState;
128 UINT16 IocStatus;
129 UINT32 IocLogInfo;
130 UINT32 TransferCount;
131 UINT32 SenseCount;
132 UINT32 ResponseInfo;
133 } MPT_SCSI_IO_REPLY;
134
135 typedef struct {
136 MPT_SCSI_IO_REQUEST Header;
137 MPT_SG_ENTRY_SIMPLE Sg;
138 } MPT_SCSI_REQUEST_WITH_SG;
139 #pragma pack ()
140
141 typedef union {
142 MPT_SCSI_IO_REPLY Data;
143 UINT64 Uint64; // 8 byte alignment required by HW
144 } MPT_SCSI_IO_REPLY_ALIGNED;
145
146 typedef union {
147 MPT_SCSI_REQUEST_WITH_SG Data;
148 UINT64 Uint64; // 8 byte alignment required by HW
149 } MPT_SCSI_REQUEST_ALIGNED;
150
151 #endif // __FUSION_MPT_SCSI_H__