3 This driver produces Extended SCSI Pass Thru Protocol instances for
4 LSI Fusion MPT SCSI devices.
6 Copyright (C) 2020, Oracle and/or its affiliates.
8 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <IndustryStandard/FusionMptScsi.h>
13 #include <IndustryStandard/Pci.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
16 #include <Library/UefiBootServicesTableLib.h>
17 #include <Library/UefiLib.h>
18 #include <Protocol/PciIo.h>
19 #include <Protocol/ScsiPassThruExt.h>
20 #include <Uefi/UefiSpec.h>
23 // Higher versions will be used before lower, 0x10-0xffffffef is the version
24 // range for IVH (Indie Hardware Vendors)
26 #define MPT_SCSI_BINDING_VERSION 0x10
32 #define MPT_SCSI_DEV_SIGNATURE SIGNATURE_32 ('M','P','T','S')
35 EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru
;
36 EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode
;
39 #define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \
40 CR (PassThruPtr, MPT_SCSI_DEV, PassThru, MPT_SCSI_DEV_SIGNATURE)
50 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
53 IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET
*Packet
,
54 IN EFI_EVENT Event OPTIONAL
57 return EFI_UNSUPPORTED
;
63 MptScsiGetNextTargetLun (
64 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
65 IN OUT UINT8
**Target
,
69 return EFI_UNSUPPORTED
;
75 MptScsiGetNextTarget (
76 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
80 return EFI_UNSUPPORTED
;
86 MptScsiBuildDevicePath (
87 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
90 IN OUT EFI_DEVICE_PATH_PROTOCOL
**DevicePath
93 return EFI_UNSUPPORTED
;
100 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
101 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
106 return EFI_UNSUPPORTED
;
112 MptScsiResetChannel (
113 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
116 return EFI_UNSUPPORTED
;
122 MptScsiResetTargetLun (
123 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*This
,
128 return EFI_UNSUPPORTED
;
138 MptScsiControllerSupported (
139 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
140 IN EFI_HANDLE ControllerHandle
,
141 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
145 EFI_PCI_IO_PROTOCOL
*PciIo
;
148 Status
= gBS
->OpenProtocol (
150 &gEfiPciIoProtocolGuid
,
152 This
->DriverBindingHandle
,
154 EFI_OPEN_PROTOCOL_BY_DRIVER
156 if (EFI_ERROR (Status
)) {
160 Status
= PciIo
->Pci
.Read (
164 sizeof (Pci
) / sizeof (UINT32
),
167 if (EFI_ERROR (Status
)) {
171 if (Pci
.Hdr
.VendorId
== LSI_LOGIC_PCI_VENDOR_ID
&&
172 (Pci
.Hdr
.DeviceId
== LSI_53C1030_PCI_DEVICE_ID
||
173 Pci
.Hdr
.DeviceId
== LSI_SAS1068_PCI_DEVICE_ID
||
174 Pci
.Hdr
.DeviceId
== LSI_SAS1068E_PCI_DEVICE_ID
)) {
175 Status
= EFI_SUCCESS
;
177 Status
= EFI_UNSUPPORTED
;
183 &gEfiPciIoProtocolGuid
,
184 This
->DriverBindingHandle
,
193 MptScsiControllerStart (
194 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
195 IN EFI_HANDLE ControllerHandle
,
196 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
202 Dev
= AllocateZeroPool (sizeof (*Dev
));
204 return EFI_OUT_OF_RESOURCES
;
207 Dev
->Signature
= MPT_SCSI_DEV_SIGNATURE
;
210 // Host adapter channel, doesn't exist
212 Dev
->PassThruMode
.AdapterId
= MAX_UINT32
;
213 Dev
->PassThruMode
.Attributes
=
214 EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL
|
215 EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL
;
217 Dev
->PassThru
.Mode
= &Dev
->PassThruMode
;
218 Dev
->PassThru
.PassThru
= &MptScsiPassThru
;
219 Dev
->PassThru
.GetNextTargetLun
= &MptScsiGetNextTargetLun
;
220 Dev
->PassThru
.BuildDevicePath
= &MptScsiBuildDevicePath
;
221 Dev
->PassThru
.GetTargetLun
= &MptScsiGetTargetLun
;
222 Dev
->PassThru
.ResetChannel
= &MptScsiResetChannel
;
223 Dev
->PassThru
.ResetTargetLun
= &MptScsiResetTargetLun
;
224 Dev
->PassThru
.GetNextTarget
= &MptScsiGetNextTarget
;
226 Status
= gBS
->InstallProtocolInterface (
228 &gEfiExtScsiPassThruProtocolGuid
,
229 EFI_NATIVE_INTERFACE
,
232 if (EFI_ERROR (Status
)) {
247 MptScsiControllerStop (
248 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
249 IN EFI_HANDLE ControllerHandle
,
250 IN UINTN NumberOfChildren
,
251 IN EFI_HANDLE
*ChildHandleBuffer
255 EFI_EXT_SCSI_PASS_THRU_PROTOCOL
*PassThru
;
258 Status
= gBS
->OpenProtocol (
260 &gEfiExtScsiPassThruProtocolGuid
,
262 This
->DriverBindingHandle
,
264 EFI_OPEN_PROTOCOL_GET_PROTOCOL
// Lookup only
266 if (EFI_ERROR (Status
)) {
270 Dev
= MPT_SCSI_FROM_PASS_THRU (PassThru
);
272 Status
= gBS
->UninstallProtocolInterface (
274 &gEfiExtScsiPassThruProtocolGuid
,
277 if (EFI_ERROR (Status
)) {
287 EFI_DRIVER_BINDING_PROTOCOL mMptScsiDriverBinding
= {
288 &MptScsiControllerSupported
,
289 &MptScsiControllerStart
,
290 &MptScsiControllerStop
,
291 MPT_SCSI_BINDING_VERSION
,
292 NULL
, // ImageHandle, filled by EfiLibInstallDriverBindingComponentName2
293 NULL
, // DriverBindingHandle, filled as well
301 EFI_UNICODE_STRING_TABLE mDriverNameTable
[] = {
302 { "eng;en", L
"LSI Fusion MPT SCSI Driver" },
307 EFI_COMPONENT_NAME_PROTOCOL mComponentName
;
311 MptScsiGetDriverName (
312 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
314 OUT CHAR16
**DriverName
317 return LookupUnicodeString2 (
319 This
->SupportedLanguages
,
322 (BOOLEAN
)(This
== &mComponentName
) // Iso639Language
328 MptScsiGetDeviceName (
329 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
330 IN EFI_HANDLE DeviceHandle
,
331 IN EFI_HANDLE ChildHandle
,
333 OUT CHAR16
**ControllerName
336 return EFI_UNSUPPORTED
;
340 EFI_COMPONENT_NAME_PROTOCOL mComponentName
= {
341 &MptScsiGetDriverName
,
342 &MptScsiGetDeviceName
,
343 "eng" // SupportedLanguages, ISO 639-2 language codes
347 EFI_COMPONENT_NAME2_PROTOCOL mComponentName2
= {
348 (EFI_COMPONENT_NAME2_GET_DRIVER_NAME
) &MptScsiGetDriverName
,
349 (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME
) &MptScsiGetDeviceName
,
350 "en" // SupportedLanguages, RFC 4646 language codes
360 IN EFI_HANDLE ImageHandle
,
361 IN EFI_SYSTEM_TABLE
*SystemTable
364 return EfiLibInstallDriverBindingComponentName2 (
367 &mMptScsiDriverBinding
,
368 ImageHandle
, // The handle to install onto