]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/MptScsiDxe/MptScsi.c
OvmfPkg/MptScsiDxe: Report targets and one LUN
[mirror_edk2.git] / OvmfPkg / MptScsiDxe / MptScsi.c
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