From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by mx.groups.io with SMTP id smtpd.web10.15216.1585152473614419819 for ; Wed, 25 Mar 2020 09:07:53 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@oracle.com header.s=corp-2020-01-29 header.b=GpuOdtMb; spf=pass (domain: oracle.com, ip: 141.146.126.78, mailfrom: liran.alon@oracle.com) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 02PG3Fr8138136; Wed, 25 Mar 2020 16:07:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=corp-2020-01-29; bh=y92GVUWtkRi83VoSAs9/IzNIE/IfL39+ZqVJTq8xVgI=; b=GpuOdtMbIieXz5w3CiUWfSM23JNXOfX2WaTOr84QJ6gcg2PGh1wBYhWCsFjGhdYoV3tW 8fuBktblCbzmpqSLzxJxNfK08/evWfMicA9YOngM0Ggc7vRN1au296+Lgh7EmfHvt+Gn h1bbpdFkoUEUv09DZXKu06ExiDwcu+Gfxui2GzjDWBvGKg0e1BFaBF6VUtwLVEm9RWsQ bPdj1YnowfoIj0gS3qUialWWrl9D6rP5uNi6sYohJN7/BLNyVu+VUxItFpA/qy+qgT5V 6uRvAGFYQfm5gnpVKo0+Gknzpq7tEVSveF4IOoe+s8Ejo93pnzEiok/am144wosjKjq1 fw== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 2ywavman9s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Mar 2020 16:07:53 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 02PG7qAp086994; Wed, 25 Mar 2020 16:07:52 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserp3030.oracle.com with ESMTP id 3006r6udwx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Mar 2020 16:07:52 +0000 Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 02PG7lku031669; Wed, 25 Mar 2020 16:07:47 GMT Received: from spark.ravello.local (/213.57.127.2) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Mar 2020 09:07:46 -0700 From: "Liran Alon" To: devel@edk2.groups.io, lersek@redhat.com Cc: nikita.leshchenko@oracle.com, aaron.young@oracle.com, jordan.l.justen@intel.com, ard.biesheuvel@linaro.org, Liran Alon Subject: [PATCH v2 05/17] OvmfPkg/PvScsiDxe: Install stubbed EXT_SCSI_PASS_THRU Date: Wed, 25 Mar 2020 18:09:53 +0200 Message-Id: <20200325161005.16743-6-liran.alon@oracle.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200325161005.16743-1-liran.alon@oracle.com> References: <20200325161005.16743-1-liran.alon@oracle.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9571 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2003250129 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9571 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 malwarescore=0 priorityscore=1501 mlxscore=0 bulkscore=0 clxscore=1015 impostorscore=0 phishscore=0 suspectscore=0 mlxlogscore=999 spamscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2003250128 Content-Transfer-Encoding: 8bit Support dynamic insertion and removal of the protocol. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2567 Reviewed-by: Laszlo Ersek Signed-off-by: Liran Alon --- OvmfPkg/PvScsiDxe/PvScsi.c | 209 +++++++++++++++++++++++++++++++- OvmfPkg/PvScsiDxe/PvScsi.h | 29 +++++ OvmfPkg/PvScsiDxe/PvScsiDxe.inf | 6 +- 3 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 OvmfPkg/PvScsiDxe/PvScsi.h diff --git a/OvmfPkg/PvScsiDxe/PvScsi.c b/OvmfPkg/PvScsiDxe/PvScsi.c index 9923a31d25d7..04c08036b799 100644 --- a/OvmfPkg/PvScsiDxe/PvScsi.c +++ b/OvmfPkg/PvScsiDxe/PvScsi.c @@ -11,17 +11,156 @@ #include #include +#include #include #include #include #include +#include "PvScsi.h" + // // Higher versions will be used before lower, 0x10-0xffffffef is the version // range for IHV (Indie Hardware Vendors) // #define PVSCSI_BINDING_VERSION 0x10 +// +// Ext SCSI Pass Thru +// + +STATIC +EFI_STATUS +EFIAPI +PvScsiPassThru ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN UINT8 *Target, + IN UINT64 Lun, + IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, + IN EFI_EVENT Event OPTIONAL + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiGetNextTargetLun ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN OUT UINT8 **Target, + IN OUT UINT64 *Lun + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiBuildDevicePath ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN UINT8 *Target, + IN UINT64 Lun, + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiGetTargetLun ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, + OUT UINT8 **Target, + OUT UINT64 *Lun + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiResetChannel ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiResetTargetLun ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN UINT8 *Target, + IN UINT64 Lun + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +PvScsiGetNextTarget ( + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, + IN OUT UINT8 **Target + ) +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +PvScsiInit ( + IN OUT PVSCSI_DEV *Dev + ) +{ + // + // Populate the exported interface's attributes + // + Dev->PassThru.Mode = &Dev->PassThruMode; + Dev->PassThru.PassThru = &PvScsiPassThru; + Dev->PassThru.GetNextTargetLun = &PvScsiGetNextTargetLun; + Dev->PassThru.BuildDevicePath = &PvScsiBuildDevicePath; + Dev->PassThru.GetTargetLun = &PvScsiGetTargetLun; + Dev->PassThru.ResetChannel = &PvScsiResetChannel; + Dev->PassThru.ResetTargetLun = &PvScsiResetTargetLun; + Dev->PassThru.GetNextTarget = &PvScsiGetNextTarget; + + // + // AdapterId is a target for which no handle will be created during bus scan. + // Prevent any conflict with real devices. + // + Dev->PassThruMode.AdapterId = MAX_UINT32; + + // + // Set both physical and logical attributes for non-RAID SCSI channel + // + Dev->PassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | + EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; + + // + // No restriction on transfer buffer alignment + // + Dev->PassThruMode.IoAlign = 0; + + return EFI_SUCCESS; +} + +STATIC +VOID +PvScsiUninit ( + IN OUT PVSCSI_DEV *Dev + ) +{ + // Currently nothing to do here +} + // // Driver Binding // @@ -90,7 +229,42 @@ PvScsiDriverBindingStart ( IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL ) { - return EFI_UNSUPPORTED; + PVSCSI_DEV *Dev; + EFI_STATUS Status; + + Dev = (PVSCSI_DEV *) AllocateZeroPool (sizeof (*Dev)); + if (Dev == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = PvScsiInit (Dev); + if (EFI_ERROR (Status)) { + goto FreePvScsi; + } + + // + // Setup complete, attempt to export the driver instance's PassThru interface + // + Dev->Signature = PVSCSI_SIG; + Status = gBS->InstallProtocolInterface ( + &ControllerHandle, + &gEfiExtScsiPassThruProtocolGuid, + EFI_NATIVE_INTERFACE, + &Dev->PassThru + ); + if (EFI_ERROR (Status)) { + goto UninitDev; + } + + return EFI_SUCCESS; + +UninitDev: + PvScsiUninit (Dev); + +FreePvScsi: + FreePool (Dev); + + return Status; } STATIC @@ -103,7 +277,38 @@ PvScsiDriverBindingStop ( IN EFI_HANDLE *ChildHandleBuffer ) { - return EFI_UNSUPPORTED; + EFI_STATUS Status; + EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; + PVSCSI_DEV *Dev; + + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiExtScsiPassThruProtocolGuid, + (VOID **)&PassThru, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL // Lookup only + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Dev = PVSCSI_FROM_PASS_THRU (PassThru); + + Status = gBS->UninstallProtocolInterface ( + ControllerHandle, + &gEfiExtScsiPassThruProtocolGuid, + &Dev->PassThru + ); + if (EFI_ERROR (Status)) { + return Status; + } + + PvScsiUninit (Dev); + + FreePool (Dev); + + return EFI_SUCCESS; } STATIC EFI_DRIVER_BINDING_PROTOCOL mPvScsiDriverBinding = { diff --git a/OvmfPkg/PvScsiDxe/PvScsi.h b/OvmfPkg/PvScsiDxe/PvScsi.h new file mode 100644 index 000000000000..3940b4c20019 --- /dev/null +++ b/OvmfPkg/PvScsiDxe/PvScsi.h @@ -0,0 +1,29 @@ +/** @file + + Internal definitions for the PVSCSI driver, which produces Extended SCSI + Pass Thru Protocol instances for pvscsi devices. + + Copyright (C) 2020, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __PVSCSI_DXE_H_ +#define __PVSCSI_DXE_H_ + +#include +#include + +#define PVSCSI_SIG SIGNATURE_32 ('P', 'S', 'C', 'S') + +typedef struct { + UINT32 Signature; + EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; + EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode; +} PVSCSI_DEV; + +#define PVSCSI_FROM_PASS_THRU(PassThruPointer) \ + CR (PassThruPointer, PVSCSI_DEV, PassThru, PVSCSI_SIG) + +#endif // __PVSCSI_DXE_H_ diff --git a/OvmfPkg/PvScsiDxe/PvScsiDxe.inf b/OvmfPkg/PvScsiDxe/PvScsiDxe.inf index c1f0663832ed..f4d452c6c3d2 100644 --- a/OvmfPkg/PvScsiDxe/PvScsiDxe.inf +++ b/OvmfPkg/PvScsiDxe/PvScsiDxe.inf @@ -19,15 +19,19 @@ [Sources] PvScsi.c + PvScsi.h [Packages] MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec [LibraryClasses] + DebugLib + MemoryAllocationLib UefiBootServicesTableLib UefiDriverEntryPoint UefiLib [Protocols] - gEfiPciIoProtocolGuid ## TO_START + gEfiExtScsiPassThruProtocolGuid ## BY_START + gEfiPciIoProtocolGuid ## TO_START -- 2.20.1