X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FMptScsiDxe%2FMptScsi.c;fp=OvmfPkg%2FMptScsiDxe%2FMptScsi.c;h=d396bff85cb6df7f81e2f6e63089deb51f28b7af;hp=40d392c2346f7e259174234bafa39985bd61d92c;hb=093cceaf79b5d16880050a08e4bd465954ea6a97;hpb=a53e5b417413bae3f3ea89976380d169e2f6861d diff --git a/OvmfPkg/MptScsiDxe/MptScsi.c b/OvmfPkg/MptScsiDxe/MptScsi.c index 40d392c234..d396bff85c 100644 --- a/OvmfPkg/MptScsiDxe/MptScsi.c +++ b/OvmfPkg/MptScsiDxe/MptScsi.c @@ -11,8 +11,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -34,6 +36,7 @@ typedef struct { UINT32 Signature; EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode; + UINT8 MaxTarget; } MPT_SCSI_DEV; #define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \ @@ -57,6 +60,22 @@ MptScsiPassThru ( return EFI_UNSUPPORTED; } +STATIC +BOOLEAN +IsTargetInitialized ( + IN UINT8 *Target + ) +{ + UINTN Idx; + + for (Idx = 0; Idx < TARGET_MAX_BYTES; ++Idx) { + if (Target[Idx] != 0xFF) { + return TRUE; + } + } + return FALSE; +} + STATIC EFI_STATUS EFIAPI @@ -66,7 +85,28 @@ MptScsiGetNextTargetLun ( IN OUT UINT64 *Lun ) { - return EFI_UNSUPPORTED; + MPT_SCSI_DEV *Dev; + + Dev = MPT_SCSI_FROM_PASS_THRU (This); + // + // Currently support only LUN 0, so hardcode it + // + if (!IsTargetInitialized (*Target)) { + ZeroMem (*Target, TARGET_MAX_BYTES); + *Lun = 0; + } else if (**Target > Dev->MaxTarget || *Lun > 0) { + return EFI_INVALID_PARAMETER; + } else if (**Target < Dev->MaxTarget) { + // + // This device interface support 256 targets only, so it's enough to + // increment the LSB of Target, as it will never overflow. + // + **Target += 1; + } else { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; } STATIC @@ -77,7 +117,24 @@ MptScsiGetNextTarget ( IN OUT UINT8 **Target ) { - return EFI_UNSUPPORTED; + MPT_SCSI_DEV *Dev; + + Dev = MPT_SCSI_FROM_PASS_THRU (This); + if (!IsTargetInitialized (*Target)) { + ZeroMem (*Target, TARGET_MAX_BYTES); + } else if (**Target > Dev->MaxTarget) { + return EFI_INVALID_PARAMETER; + } else if (**Target < Dev->MaxTarget) { + // + // This device interface support 256 targets only, so it's enough to + // increment the LSB of Target, as it will never overflow. + // + **Target += 1; + } else { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; } STATIC @@ -206,6 +263,8 @@ MptScsiControllerStart ( Dev->Signature = MPT_SCSI_DEV_SIGNATURE; + Dev->MaxTarget = PcdGet8 (PcdMptScsiMaxTargetLimit); + // // Host adapter channel, doesn't exist //