]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/LsiScsiDxe: Install stubbed EXT_SCSI_PASS_THRU
authorGary Lin <glin@suse.com>
Fri, 17 Jul 2020 06:11:24 +0000 (14:11 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 17 Jul 2020 20:51:55 +0000 (20:51 +0000)
Partially implement LsiScsiControllerStart() and LsiScsiControllerStop()
to insert the scaffolding of EXT_SCSI_PASS_THRU functions.

v3: Squash the newline below the declaration of LSI_SCSI_FROM_PASS_THRU
v2: Remove the closing of PciIo protocol from LsiScsiControllerStop().

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200717061130.8881-6-glin@suse.com>

OvmfPkg/LsiScsiDxe/LsiScsi.c
OvmfPkg/LsiScsiDxe/LsiScsi.h
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf

index 5bca85bd75eb3f9a9d57d713c1725de7464b57d8..67fadb411e85debf0d6a695127768db7db0096f0 100644 (file)
 \r
 #include <IndustryStandard/LsiScsi.h>\r
 #include <IndustryStandard/Pci.h>\r
 \r
 #include <IndustryStandard/LsiScsi.h>\r
 #include <IndustryStandard/Pci.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Protocol/PciIo.h>\r
 #include <Protocol/PciRootBridgeIo.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Protocol/PciIo.h>\r
 #include <Protocol/PciRootBridgeIo.h>\r
+#include <Protocol/ScsiPassThruExt.h>\r
 #include <Uefi/UefiSpec.h>\r
 \r
 #include "LsiScsi.h"\r
 \r
 #include <Uefi/UefiSpec.h>\r
 \r
 #include "LsiScsi.h"\r
 \r
+//\r
+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL\r
+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,\r
+// sections\r
+// - 14.1 SCSI Driver Model Overview,\r
+// - 14.7 Extended SCSI Pass Thru Protocol.\r
+//\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiPassThru (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                *This,\r
+  IN UINT8                                          *Target,\r
+  IN UINT64                                         Lun,\r
+  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,\r
+  IN EFI_EVENT                                      Event     OPTIONAL\r
+  )\r
+{\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTargetLun (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN OUT UINT8                       **TargetPointer,\r
+  IN OUT UINT64                      *Lun\r
+  )\r
+{\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiBuildDevicePath (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN UINT8                           *Target,\r
+  IN UINT64                          Lun,\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL    **DevicePath\r
+  )\r
+{\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetTargetLun (\r
+  IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL        *DevicePath,\r
+  OUT UINT8                           **TargetPointer,\r
+  OUT UINT64                          *Lun\r
+  )\r
+{\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetChannel (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This\r
+  )\r
+{\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetTargetLun (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN UINT8                           *Target,\r
+  IN UINT64                          Lun\r
+  )\r
+{\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTarget (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN OUT UINT8                       **TargetPointer\r
+  )\r
+{\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
 //\r
 // Probe, start and stop functions of this driver, called by the DXE core for\r
 // specific devices.\r
 //\r
 // Probe, start and stop functions of this driver, called by the DXE core for\r
 // specific devices.\r
@@ -88,7 +179,49 @@ LsiScsiControllerStart (
   IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath OPTIONAL\r
   )\r
 {\r
   IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath OPTIONAL\r
   )\r
 {\r
+  EFI_STATUS           Status;\r
+  LSI_SCSI_DEV         *Dev;\r
+\r
+  Dev = AllocateZeroPool (sizeof (*Dev));\r
+  if (Dev == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Dev->Signature = LSI_SCSI_DEV_SIGNATURE;\r
+\r
+  //\r
+  // Host adapter channel, doesn't exist\r
+  //\r
+  Dev->PassThruMode.AdapterId = MAX_UINT32;\r
+  Dev->PassThruMode.Attributes =\r
+    EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |\r
+    EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;\r
+\r
+  Dev->PassThru.Mode = &Dev->PassThruMode;\r
+  Dev->PassThru.PassThru = &LsiScsiPassThru;\r
+  Dev->PassThru.GetNextTargetLun = &LsiScsiGetNextTargetLun;\r
+  Dev->PassThru.BuildDevicePath = &LsiScsiBuildDevicePath;\r
+  Dev->PassThru.GetTargetLun = &LsiScsiGetTargetLun;\r
+  Dev->PassThru.ResetChannel = &LsiScsiResetChannel;\r
+  Dev->PassThru.ResetTargetLun = &LsiScsiResetTargetLun;\r
+  Dev->PassThru.GetNextTarget = &LsiScsiGetNextTarget;\r
+\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &ControllerHandle,\r
+                  &gEfiExtScsiPassThruProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &Dev->PassThru\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreePool;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
   return EFI_SUCCESS;\r
+\r
+FreePool:\r
+  FreePool (Dev);\r
+\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
@@ -100,7 +233,36 @@ LsiScsiControllerStop (
   IN EFI_HANDLE                  *ChildHandleBuffer\r
   )\r
 {\r
   IN EFI_HANDLE                  *ChildHandleBuffer\r
   )\r
 {\r
-  return EFI_SUCCESS;\r
+  EFI_STATUS                      Status;\r
+  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;\r
+  LSI_SCSI_DEV                    *Dev;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiExtScsiPassThruProtocolGuid,\r
+                  (VOID **)&PassThru,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL // Lookup only\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Dev = LSI_SCSI_FROM_PASS_THRU (PassThru);\r
+\r
+  Status = gBS->UninstallProtocolInterface (\r
+                  ControllerHandle,\r
+                  &gEfiExtScsiPassThruProtocolGuid,\r
+                  &Dev->PassThru\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  FreePool (Dev);\r
+\r
+  return Status;\r
 }\r
 \r
 //\r
 }\r
 \r
 //\r
index 6c8dcbd70a0a342659ca6035633adba2e8a79dc9..751d5b193b5122a3ade241518f664a76ae8f62c5 100644 (file)
 #ifndef _LSI_SCSI_DXE_H_\r
 #define _LSI_SCSI_DXE_H_\r
 \r
 #ifndef _LSI_SCSI_DXE_H_\r
 #define _LSI_SCSI_DXE_H_\r
 \r
+typedef struct {\r
+  UINT32                          Signature;\r
+  EFI_EXT_SCSI_PASS_THRU_MODE     PassThruMode;\r
+  EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
+} LSI_SCSI_DEV;\r
+\r
+#define LSI_SCSI_DEV_SIGNATURE SIGNATURE_32 ('L','S','I','S')\r
+\r
+#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
+  CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)\r
+\r
+\r
 //\r
 // Probe, start and stop functions of this driver, called by the DXE core for\r
 // specific devices.\r
 //\r
 // Probe, start and stop functions of this driver, called by the DXE core for\r
 // specific devices.\r
@@ -47,6 +59,72 @@ LsiScsiControllerStop (
   );\r
 \r
 \r
   );\r
 \r
 \r
+//\r
+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL\r
+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,\r
+// sections\r
+// - 14.1 SCSI Driver Model Overview,\r
+// - 14.7 Extended SCSI Pass Thru Protocol.\r
+//\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiPassThru (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                *This,\r
+  IN UINT8                                          *Target,\r
+  IN UINT64                                         Lun,\r
+  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,\r
+  IN EFI_EVENT                                      Event     OPTIONAL\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTargetLun (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN OUT UINT8                       **TargetPointer,\r
+  IN OUT UINT64                      *Lun\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiBuildDevicePath (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN UINT8                           *Target,\r
+  IN UINT64                          Lun,\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL    **DevicePath\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetTargetLun (\r
+  IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL        *DevicePath,\r
+  OUT UINT8                           **TargetPointer,\r
+  OUT UINT64                          *Lun\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetChannel (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetTargetLun (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN UINT8                           *Target,\r
+  IN UINT64                          Lun\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTarget (\r
+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+  IN OUT UINT8                       **TargetPointer\r
+  );\r
+\r
+\r
 //\r
 // The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and\r
 // EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name\r
 //\r
 // The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and\r
 // EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name\r
index 7ce11fcc6a03ea3dc5d2fdd4de93295b4e12544f..14f9c68308cc311a7272c2aff850680b4827b576 100644 (file)
 \r
 [LibraryClasses]\r
   BaseLib\r
 \r
 [LibraryClasses]\r
   BaseLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
   UefiBootServicesTableLib\r
   UefiDriverEntryPoint\r
   UefiLib\r
 \r
 [Protocols]\r
   UefiBootServicesTableLib\r
   UefiDriverEntryPoint\r
   UefiLib\r
 \r
 [Protocols]\r
+  gEfiExtScsiPassThruProtocolGuid        ## BY_START\r
   gEfiPciIoProtocolGuid                  ## TO_START\r
   gEfiPciIoProtocolGuid                  ## TO_START\r