]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/MptScsiDxe: Report targets and one LUN
authorNikita Leshenko <nikita.leshchenko@oracle.com>
Mon, 4 May 2020 21:06:01 +0000 (00:06 +0300)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 5 May 2020 20:43:02 +0000 (20:43 +0000)
The controller supports up to 8 targets in practice (Not reported by the
controller, but based on the implementation of the virtual device),
report them in GetNextTarget and GetNextTargetLun. The firmware will
then try to communicate with them and create a block device for each one
that responds.

Support for multiple LUNs will be implemented in another series.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2390
Signed-off-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200504210607.144434-7-nikita.leshchenko@oracle.com>

OvmfPkg/MptScsiDxe/MptScsi.c
OvmfPkg/MptScsiDxe/MptScsiDxe.inf
OvmfPkg/OvmfPkg.dec

index 40d392c2346f7e259174234bafa39985bd61d92c..d396bff85cb6df7f81e2f6e63089deb51f28b7af 100644 (file)
 \r
 #include <IndustryStandard/FusionMptScsi.h>\r
 #include <IndustryStandard/Pci.h>\r
+#include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
+#include <Library/PcdLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Protocol/PciIo.h>\r
@@ -34,6 +36,7 @@ typedef struct {
   UINT32                          Signature;\r
   EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
   EFI_EXT_SCSI_PASS_THRU_MODE     PassThruMode;\r
+  UINT8                           MaxTarget;\r
 } MPT_SCSI_DEV;\r
 \r
 #define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
@@ -57,6 +60,22 @@ MptScsiPassThru (
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+STATIC\r
+BOOLEAN\r
+IsTargetInitialized (\r
+  IN UINT8                                          *Target\r
+  )\r
+{\r
+  UINTN Idx;\r
+\r
+  for (Idx = 0; Idx < TARGET_MAX_BYTES; ++Idx) {\r
+    if (Target[Idx] != 0xFF) {\r
+      return TRUE;\r
+    }\r
+  }\r
+  return FALSE;\r
+}\r
+\r
 STATIC\r
 EFI_STATUS\r
 EFIAPI\r
@@ -66,7 +85,28 @@ MptScsiGetNextTargetLun (
   IN OUT UINT64                                     *Lun\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  MPT_SCSI_DEV *Dev;\r
+\r
+  Dev = MPT_SCSI_FROM_PASS_THRU (This);\r
+  //\r
+  // Currently support only LUN 0, so hardcode it\r
+  //\r
+  if (!IsTargetInitialized (*Target)) {\r
+    ZeroMem (*Target, TARGET_MAX_BYTES);\r
+    *Lun = 0;\r
+  } else if (**Target > Dev->MaxTarget || *Lun > 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  } else if (**Target < Dev->MaxTarget) {\r
+    //\r
+    // This device interface support 256 targets only, so it's enough to\r
+    // increment the LSB of Target, as it will never overflow.\r
+    //\r
+    **Target += 1;\r
+  } else {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 STATIC\r
@@ -77,7 +117,24 @@ MptScsiGetNextTarget (
   IN OUT UINT8                                     **Target\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  MPT_SCSI_DEV *Dev;\r
+\r
+  Dev = MPT_SCSI_FROM_PASS_THRU (This);\r
+  if (!IsTargetInitialized (*Target)) {\r
+    ZeroMem (*Target, TARGET_MAX_BYTES);\r
+  } else if (**Target > Dev->MaxTarget) {\r
+    return EFI_INVALID_PARAMETER;\r
+  } else if (**Target < Dev->MaxTarget) {\r
+    //\r
+    // This device interface support 256 targets only, so it's enough to\r
+    // increment the LSB of Target, as it will never overflow.\r
+    //\r
+    **Target += 1;\r
+  } else {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 STATIC\r
@@ -206,6 +263,8 @@ MptScsiControllerStart (
 \r
   Dev->Signature = MPT_SCSI_DEV_SIGNATURE;\r
 \r
+  Dev->MaxTarget = PcdGet8 (PcdMptScsiMaxTargetLimit);\r
+\r
   //\r
   // Host adapter channel, doesn't exist\r
   //\r
index 9f7c98829ee1c6f1317f65a9e9be2455cc5ad332..d5fd2516e47544f82179ba6b7158c839506bd35b 100644 (file)
   OvmfPkg/OvmfPkg.dec\r
 \r
 [LibraryClasses]\r
+  BaseMemoryLib\r
   DebugLib\r
   MemoryAllocationLib\r
+  PcdLib\r
   UefiBootServicesTableLib\r
   UefiDriverEntryPoint\r
   UefiLib\r
@@ -33,3 +35,6 @@
 [Protocols]\r
   gEfiExtScsiPassThruProtocolGuid        ## BY_START\r
   gEfiPciIoProtocolGuid                  ## TO_START\r
+\r
+[FixedPcd]\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdMptScsiMaxTargetLimit   ## CONSUMES\r
index 8a46fe73344e5239dc51e81b04de2b67e293a5a2..723a779c0348253ee636b8b45a504948026c29e2 100644 (file)
   #  polling loop iteration.\r
   gUefiOvmfPkgTokenSpaceGuid.PcdPvScsiWaitForCmpStallInUsecs|5|UINT32|0x38\r
 \r
+  ## Set the *inclusive* number of targets that MptScsi exposes for scan\r
+  #  by ScsiBusDxe.\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdMptScsiMaxTargetLimit|7|UINT8|0x39\r
+\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0x8\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0x9\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x0|UINT32|0xa\r