From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.61]) by mx.groups.io with SMTP id smtpd.web10.9689.1586933651985461000 for ; Tue, 14 Apr 2020 23:54:12 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Qzi+gLpt; spf=pass (domain: redhat.com, ip: 205.139.110.61, mailfrom: lersek@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586933651; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SeFO3S1h2zCPaXi/3PBJxx8HI/30sLOmPa5SbtuOD5Q=; b=Qzi+gLptEFagbZb9H13d5tr/EeEFzMnrf82YGlZ+ySvtvaTPPSXUM0LeYxye/Y1gO040KA xtYy+VzfcMiQWt2rV+wRXE9fk/N1CV15H9DMveSWv2ufsBS/6+oyCPMb6BtuTcnQ2eaXol af1IalaV1Xz5lOpXn3zgcc04I/RwzIo= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-222-QcZcgNUlPBCSIuzzf4M3aA-1; Wed, 15 Apr 2020 02:54:09 -0400 X-MC-Unique: QcZcgNUlPBCSIuzzf4M3aA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B9CA4801E6C; Wed, 15 Apr 2020 06:54:07 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-112-155.ams2.redhat.com [10.36.112.155]) by smtp.corp.redhat.com (Postfix) with ESMTP id 171B660BF1; Wed, 15 Apr 2020 06:54:05 +0000 (UTC) Subject: Re: [edk2-devel] [PATCH v4 05/13] OvmfPkg/MptScsiDxe: Install stubbed EXT_SCSI_PASS_THRU To: devel@edk2.groups.io, nikita.leshchenko@oracle.com Cc: liran.alon@oracle.com, aaron.young@oracle.com, Jordan Justen , Ard Biesheuvel References: <20200414173813.7715-1-nikita.leshchenko@oracle.com> <20200414173813.7715-6-nikita.leshchenko@oracle.com> From: "Laszlo Ersek" Message-ID: <3d466a82-7b64-8b43-d7ef-83f0f4712c81@redhat.com> Date: Wed, 15 Apr 2020 08:54:04 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20200414173813.7715-6-nikita.leshchenko@oracle.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 04/14/20 19:38, Nikita Leshenko wrote: > Support dynamic insertion and removal of the protocol > > Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2390 > Signed-off-by: Nikita Leshenko > Reviewed-by: Laszlo Ersek > --- > OvmfPkg/MptScsiDxe/MptScsi.c | 181 +++++++++++++++++++++++++++++- > OvmfPkg/MptScsiDxe/MptScsiDxe.inf | 5 +- > 2 files changed, 183 insertions(+), 3 deletions(-) My R-b stands, just one small request: > > diff --git a/OvmfPkg/MptScsiDxe/MptScsi.c b/OvmfPkg/MptScsiDxe/MptScsi.c > index 4e2f8f2296fb..40d392c2346f 100644 > --- a/OvmfPkg/MptScsiDxe/MptScsi.c > +++ b/OvmfPkg/MptScsiDxe/MptScsi.c > @@ -11,9 +11,12 @@ > > #include > #include > +#include > +#include > #include > #include > #include > +#include > #include > > // > @@ -22,6 +25,109 @@ > // > #define MPT_SCSI_BINDING_VERSION 0x10 > > +// > +// Runtime Structures > +// > + > +#define MPT_SCSI_DEV_SIGNATURE SIGNATURE_32 ('M','P','T','S') > +typedef struct { > + UINT32 Signature; > + EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; > + EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode; > +} MPT_SCSI_DEV; > + > +#define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \ > + CR (PassThruPtr, MPT_SCSI_DEV, PassThru, MPT_SCSI_DEV_SIGNATURE) > + > +// > +// Ext SCSI Pass Thru > +// > + > +STATIC > +EFI_STATUS > +EFIAPI > +MptScsiPassThru ( > + 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 > +MptScsiGetNextTargetLun ( > + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > + IN OUT UINT8 **Target, > + IN OUT UINT64 *Lun > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +STATIC > +EFI_STATUS > +EFIAPI > +MptScsiGetNextTarget ( > + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > + IN OUT UINT8 **Target > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +STATIC > +EFI_STATUS > +EFIAPI > +MptScsiBuildDevicePath ( > + 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 > +MptScsiGetTargetLun ( > + 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 > +MptScsiResetChannel ( > + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +STATIC > +EFI_STATUS > +EFIAPI > +MptScsiResetTargetLun ( > + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > + IN UINT8 *Target, > + IN UINT64 Lun > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > // > // Driver Binding > // > @@ -90,7 +196,49 @@ MptScsiControllerStart ( > IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > ) > { > - return EFI_UNSUPPORTED; > + EFI_STATUS Status; > + MPT_SCSI_DEV *Dev; > + > + Dev = AllocateZeroPool (sizeof (*Dev)); > + if (Dev == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Dev->Signature = MPT_SCSI_DEV_SIGNATURE; > + > + // > + // Host adapter channel, doesn't exist > + // > + Dev->PassThruMode.AdapterId = MAX_UINT32; > + Dev->PassThruMode.Attributes = > + EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | > + EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; > + > + Dev->PassThru.Mode = &Dev->PassThruMode; > + Dev->PassThru.PassThru = &MptScsiPassThru; > + Dev->PassThru.GetNextTargetLun = &MptScsiGetNextTargetLun; > + Dev->PassThru.BuildDevicePath = &MptScsiBuildDevicePath; > + Dev->PassThru.GetTargetLun = &MptScsiGetTargetLun; > + Dev->PassThru.ResetChannel = &MptScsiResetChannel; > + Dev->PassThru.ResetTargetLun = &MptScsiResetTargetLun; > + Dev->PassThru.GetNextTarget = &MptScsiGetNextTarget; > + > + Status = gBS->InstallProtocolInterface ( > + &ControllerHandle, > + &gEfiExtScsiPassThruProtocolGuid, > + EFI_NATIVE_INTERFACE, > + &Dev->PassThru > + ); > + if (EFI_ERROR (Status)) { > + goto FreePool; > + } > + > + return EFI_SUCCESS; > + > +FreePool: > + FreePool (Dev); > + > + return Status; > } > > STATIC > @@ -103,7 +251,36 @@ MptScsiControllerStop ( > IN EFI_HANDLE *ChildHandleBuffer > ) > { > - return EFI_UNSUPPORTED; > + EFI_STATUS Status; > + EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; > + MPT_SCSI_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 = MPT_SCSI_FROM_PASS_THRU (PassThru); > + > + Status = gBS->UninstallProtocolInterface ( > + ControllerHandle, > + &gEfiExtScsiPassThruProtocolGuid, > + &Dev->PassThru > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + FreePool (Dev); > + > + return Status; > } > > STATIC > diff --git a/OvmfPkg/MptScsiDxe/MptScsiDxe.inf b/OvmfPkg/MptScsiDxe/MptScsiDxe.inf > index 414b96e5a248..5bdbc63f3ac6 100644 > --- a/OvmfPkg/MptScsiDxe/MptScsiDxe.inf > +++ b/OvmfPkg/MptScsiDxe/MptScsiDxe.inf > @@ -24,9 +24,12 @@ [Packages] > OvmfPkg/OvmfPkg.dec > > [LibraryClasses] > + DebugLib > + MemoryAllocationLib > UefiBootServicesTableLib > UefiDriverEntryPoint > UefiLib > > [Protocols] > - gEfiPciIoProtocolGuid ## TO_START > + gEfiPciIoProtocolGuid ## TO_START > + gEfiExtScsiPassThruProtocolGuid ## BY_START > (1) Please keep this section sorted as well. Thanks Laszlo