]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/MptScsiDxe/MptScsi.c
4e2f8f2296fbb5d98fffef9874e228cbea234917
[mirror_edk2.git] / OvmfPkg / MptScsiDxe / MptScsi.c
1 /** @file
2
3 This driver produces Extended SCSI Pass Thru Protocol instances for
4 LSI Fusion MPT SCSI devices.
5
6 Copyright (C) 2020, Oracle and/or its affiliates.
7
8 SPDX-License-Identifier: BSD-2-Clause-Patent
9
10 **/
11
12 #include <IndustryStandard/FusionMptScsi.h>
13 #include <IndustryStandard/Pci.h>
14 #include <Library/UefiBootServicesTableLib.h>
15 #include <Library/UefiLib.h>
16 #include <Protocol/PciIo.h>
17 #include <Uefi/UefiSpec.h>
18
19 //
20 // Higher versions will be used before lower, 0x10-0xffffffef is the version
21 // range for IVH (Indie Hardware Vendors)
22 //
23 #define MPT_SCSI_BINDING_VERSION 0x10
24
25 //
26 // Driver Binding
27 //
28
29 STATIC
30 EFI_STATUS
31 EFIAPI
32 MptScsiControllerSupported (
33 IN EFI_DRIVER_BINDING_PROTOCOL *This,
34 IN EFI_HANDLE ControllerHandle,
35 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
36 )
37 {
38 EFI_STATUS Status;
39 EFI_PCI_IO_PROTOCOL *PciIo;
40 PCI_TYPE00 Pci;
41
42 Status = gBS->OpenProtocol (
43 ControllerHandle,
44 &gEfiPciIoProtocolGuid,
45 (VOID **)&PciIo,
46 This->DriverBindingHandle,
47 ControllerHandle,
48 EFI_OPEN_PROTOCOL_BY_DRIVER
49 );
50 if (EFI_ERROR (Status)) {
51 return Status;
52 }
53
54 Status = PciIo->Pci.Read (
55 PciIo,
56 EfiPciIoWidthUint32,
57 0,
58 sizeof (Pci) / sizeof (UINT32),
59 &Pci
60 );
61 if (EFI_ERROR (Status)) {
62 goto Done;
63 }
64
65 if (Pci.Hdr.VendorId == LSI_LOGIC_PCI_VENDOR_ID &&
66 (Pci.Hdr.DeviceId == LSI_53C1030_PCI_DEVICE_ID ||
67 Pci.Hdr.DeviceId == LSI_SAS1068_PCI_DEVICE_ID ||
68 Pci.Hdr.DeviceId == LSI_SAS1068E_PCI_DEVICE_ID)) {
69 Status = EFI_SUCCESS;
70 } else {
71 Status = EFI_UNSUPPORTED;
72 }
73
74 Done:
75 gBS->CloseProtocol (
76 ControllerHandle,
77 &gEfiPciIoProtocolGuid,
78 This->DriverBindingHandle,
79 ControllerHandle
80 );
81 return Status;
82 }
83
84 STATIC
85 EFI_STATUS
86 EFIAPI
87 MptScsiControllerStart (
88 IN EFI_DRIVER_BINDING_PROTOCOL *This,
89 IN EFI_HANDLE ControllerHandle,
90 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
91 )
92 {
93 return EFI_UNSUPPORTED;
94 }
95
96 STATIC
97 EFI_STATUS
98 EFIAPI
99 MptScsiControllerStop (
100 IN EFI_DRIVER_BINDING_PROTOCOL *This,
101 IN EFI_HANDLE ControllerHandle,
102 IN UINTN NumberOfChildren,
103 IN EFI_HANDLE *ChildHandleBuffer
104 )
105 {
106 return EFI_UNSUPPORTED;
107 }
108
109 STATIC
110 EFI_DRIVER_BINDING_PROTOCOL mMptScsiDriverBinding = {
111 &MptScsiControllerSupported,
112 &MptScsiControllerStart,
113 &MptScsiControllerStop,
114 MPT_SCSI_BINDING_VERSION,
115 NULL, // ImageHandle, filled by EfiLibInstallDriverBindingComponentName2
116 NULL, // DriverBindingHandle, filled as well
117 };
118
119 //
120 // Component Name
121 //
122
123 STATIC
124 EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {
125 { "eng;en", L"LSI Fusion MPT SCSI Driver" },
126 { NULL, NULL }
127 };
128
129 STATIC
130 EFI_COMPONENT_NAME_PROTOCOL mComponentName;
131
132 EFI_STATUS
133 EFIAPI
134 MptScsiGetDriverName (
135 IN EFI_COMPONENT_NAME_PROTOCOL *This,
136 IN CHAR8 *Language,
137 OUT CHAR16 **DriverName
138 )
139 {
140 return LookupUnicodeString2 (
141 Language,
142 This->SupportedLanguages,
143 mDriverNameTable,
144 DriverName,
145 (BOOLEAN)(This == &mComponentName) // Iso639Language
146 );
147 }
148
149 EFI_STATUS
150 EFIAPI
151 MptScsiGetDeviceName (
152 IN EFI_COMPONENT_NAME_PROTOCOL *This,
153 IN EFI_HANDLE DeviceHandle,
154 IN EFI_HANDLE ChildHandle,
155 IN CHAR8 *Language,
156 OUT CHAR16 **ControllerName
157 )
158 {
159 return EFI_UNSUPPORTED;
160 }
161
162 STATIC
163 EFI_COMPONENT_NAME_PROTOCOL mComponentName = {
164 &MptScsiGetDriverName,
165 &MptScsiGetDeviceName,
166 "eng" // SupportedLanguages, ISO 639-2 language codes
167 };
168
169 STATIC
170 EFI_COMPONENT_NAME2_PROTOCOL mComponentName2 = {
171 (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &MptScsiGetDriverName,
172 (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &MptScsiGetDeviceName,
173 "en" // SupportedLanguages, RFC 4646 language codes
174 };
175
176 //
177 // Entry Point
178 //
179
180 EFI_STATUS
181 EFIAPI
182 MptScsiEntryPoint (
183 IN EFI_HANDLE ImageHandle,
184 IN EFI_SYSTEM_TABLE *SystemTable
185 )
186 {
187 return EfiLibInstallDriverBindingComponentName2 (
188 ImageHandle,
189 SystemTable,
190 &mMptScsiDriverBinding,
191 ImageHandle, // The handle to install onto
192 &mComponentName,
193 &mComponentName2
194 );
195 }