From nobody Tue Feb 10 03:39:07 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55879+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55879+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1584373400; cv=none; d=zohomail.com; s=zohoarc; b=GK7XmKyUMH8Ezf4UpSLwoRfpCtBmTcP91utivRpnS3dclrwdTwdnswuB0F2+tDyMi35FmJZMqZJksqfQq2+Qw2M8IhLtADTA94M4Ewe8UUi1MAXE3o/qUgud/hPgdBvNJ4vlMTWNsRDm3fTAHD4NZRst6WwF+nEayctjj7rT3cc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1584373400; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=X5ZqHsiDz5F+3PHtbYkDnLkHZBgekQwWzC2smRew7Ek=; b=E8yXKSeXykbmBpn6HOwbNUDgcS/eD/hodWgQvKhe5Z0a5TC9O4w1kAKA967DjaetQ2vsbJVHajTuAde1o+MNitNK7fgBtgLirEV6cdoAiZBEorpL9v5dZ6vZaFQrcrx370KCYwmaGFZk41A0RxRwDgQLLiHPFblmnqvpgpAM/18= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55879+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1584373400188934.4529300134054; Mon, 16 Mar 2020 08:43:20 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 4TrdYY1788612xCaH4LSFeKZ; Mon, 16 Mar 2020 08:43:19 -0700 X-Received: from userp2120.oracle.com (userp2120.oracle.com [156.151.31.85]) by mx.groups.io with SMTP id smtpd.web10.69877.1584370958442879360 for ; Mon, 16 Mar 2020 08:02:38 -0700 X-Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 02GErlJ7156949; Mon, 16 Mar 2020 15:02:38 GMT X-Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by userp2120.oracle.com with ESMTP id 2yrqwmyayk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 16 Mar 2020 15:02:36 +0000 X-Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 02GEqWR7173329; Mon, 16 Mar 2020 15:00:36 GMT X-Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3020.oracle.com with ESMTP id 2ys8yvyjjg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 16 Mar 2020 15:00:36 +0000 X-Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 02GF0ZwC011674; Mon, 16 Mar 2020 15:00:35 GMT X-Received: from spark.ravello.local (/213.57.127.2) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 16 Mar 2020 08:00:35 -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: [edk2-devel] [PATCH 13/17] OvmfPkg/PvScsiDxe: Setup requests and completions rings Date: Mon, 16 Mar 2020 17:01:09 +0200 Message-Id: <20200316150113.104630-14-liran.alon@oracle.com> In-Reply-To: <20200316150113.104630-1-liran.alon@oracle.com> References: <20200316150113.104630-1-liran.alon@oracle.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,liran.alon@oracle.com X-Gm-Message-State: 32riO3I1XANkCr9QrMYItAZBx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1584373399; bh=QR2HjUyeofGH7niKmZdEsirDFgGQpMpWDpGcoDjAv+k=; h=Cc:Date:From:Reply-To:Subject:To; b=oNCEJtDs0sCeB/mU7Q0aBFF/IvBB5rXPf1OgV6+yva3O8g5q9dRu492LZhMDC7CmGr9 9kI65ERWkoEH/aOXkGR+8za5pfdNiXnr6qu04lRe3UWGQiuQOiu7rsIVkEUIlJmM87DJc Y743xddL15+TsnkH+/qx62jvhVfOoEP0KdY= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" These rings are shared memory buffers between host and device in which a cyclic buffer is managed to send request descriptors from host to device and receive completion descriptors from device to host. Note that because device may be constrained by IOMMU or guest may be run under AMD SEV, we make sure to map these rings to device by using PciIo->Map(). Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2567 Reviewed-by: Nikita Leshenko Signed-off-by: Liran Alon --- OvmfPkg/PvScsiDxe/PvScsi.c | 235 +++++++++++++++++++++++++++++++++++++ OvmfPkg/PvScsiDxe/PvScsi.h | 17 +++ 2 files changed, 252 insertions(+) diff --git a/OvmfPkg/PvScsiDxe/PvScsi.c b/OvmfPkg/PvScsiDxe/PvScsi.c index fb2407d2adb2..c3f5d38f3d30 100644 --- a/OvmfPkg/PvScsiDxe/PvScsi.c +++ b/OvmfPkg/PvScsiDxe/PvScsi.c @@ -16,6 +16,7 @@ #include #include #include +#include =20 #include "PvScsi.h" =20 @@ -396,6 +397,209 @@ PvScsiSetPCIAttributes ( return EFI_SUCCESS; } =20 +STATIC +EFI_STATUS +PvScsiAllocatePages ( + IN PVSCSI_DEV *Dev, + IN UINTN Pages, + IN OUT VOID **HostAddress + ) +{ + return Dev->PciIo->AllocateBuffer ( + Dev->PciIo, + AllocateAnyPages, + EfiBootServicesData, + Pages, + HostAddress, + EFI_PCI_ATTRIBUTE_MEMORY_CACHED + ); +} + +STATIC +VOID +PvScsiFreePages ( + IN PVSCSI_DEV *Dev, + IN UINTN Pages, + IN VOID *HostAddress + ) +{ + Dev->PciIo->FreeBuffer ( + Dev->PciIo, + Pages, + HostAddress + ); +} + +STATIC +EFI_STATUS +PvScsiMapBuffer ( + IN PVSCSI_DEV *Dev, + IN EFI_PCI_IO_PROTOCOL_OPERATION PciIoOperation, + IN VOID *HostAddress, + IN UINTN NumberOfBytes, + OUT PVSCSI_DMA_DESC *DmaDesc + ) +{ + EFI_STATUS Status; + UINTN BytesMapped; + + BytesMapped =3D NumberOfBytes; + Status =3D Dev->PciIo->Map ( + Dev->PciIo, + PciIoOperation, + HostAddress, + &BytesMapped, + &DmaDesc->DeviceAddress, + &DmaDesc->Mapping + ); + if (EFI_ERROR (Status)) { + return Status; + } + + if (BytesMapped !=3D NumberOfBytes) { + Status =3D EFI_OUT_OF_RESOURCES; + goto Unmap; + } + + return EFI_SUCCESS; + +Unmap: + Dev->PciIo->Unmap (Dev->PciIo, DmaDesc->Mapping); + DmaDesc->Mapping =3D NULL; + + return Status; +} + +STATIC +VOID +PvScsiUnmapBuffer ( + IN PVSCSI_DEV *Dev, + IN OUT PVSCSI_DMA_DESC *DmaDesc) +{ + Dev->PciIo->Unmap (Dev->PciIo, DmaDesc->Mapping); +} + +STATIC +EFI_STATUS +PvScsiAllocateSharedPages ( + IN PVSCSI_DEV *Dev, + IN UINTN Pages, + IN EFI_PCI_IO_PROTOCOL_OPERATION PciIoOperation, + OUT VOID **HostAddress, + OUT PVSCSI_DMA_DESC *DmaDesc + ) +{ + EFI_STATUS Status; + + *HostAddress =3D NULL; + DmaDesc->Mapping =3D NULL; + + Status =3D PvScsiAllocatePages (Dev, Pages, HostAddress); + if (EFI_ERROR (Status)) { + return Status; + } + + Status =3D PvScsiMapBuffer ( + Dev, + PciIoOperation, + *HostAddress, + Pages * EFI_PAGE_SIZE, + DmaDesc + ); + if (EFI_ERROR (Status)) { + goto FreePages; + } + + return EFI_SUCCESS; + +FreePages: + PvScsiFreePages (Dev, Pages, *HostAddress); + *HostAddress =3D NULL; + + return Status; +} + +STATIC +VOID +PvScsiFreeSharedPages ( + IN PVSCSI_DEV *Dev, + IN UINTN Pages, + IN OUT VOID **HostAddress, + IN OUT PVSCSI_DMA_DESC *DmaDesc + ) +{ + if (*HostAddress) { + if (DmaDesc->Mapping) { + PvScsiUnmapBuffer (Dev, DmaDesc); + DmaDesc->Mapping =3D NULL; + } + + PvScsiFreePages (Dev, Pages, *HostAddress); + *HostAddress =3D NULL; + } +} + +STATIC +EFI_STATUS +PvScsiInitRings ( + IN OUT PVSCSI_DEV *Dev + ) +{ + EFI_STATUS Status; + PVSCSI_CMD_DESC_SETUP_RINGS Cmd; + + Status =3D PvScsiAllocateSharedPages ( + Dev, + 1, + EfiPciIoOperationBusMasterCommonBuffer, + (VOID **)&Dev->RingDesc.RingState, + &Dev->RingDesc.RingStateDmaDesc + ); + if (EFI_ERROR (Status)) { + return Status; + } + ZeroMem (Dev->RingDesc.RingState, EFI_PAGE_SIZE); + + Status =3D PvScsiAllocateSharedPages ( + Dev, + 1, + EfiPciIoOperationBusMasterCommonBuffer, + (VOID **)&Dev->RingDesc.RingReqs, + &Dev->RingDesc.RingReqsDmaDesc + ); + if (EFI_ERROR (Status)) { + return Status; + } + ZeroMem (Dev->RingDesc.RingReqs, EFI_PAGE_SIZE); + + Status =3D PvScsiAllocateSharedPages ( + Dev, + 1, + EfiPciIoOperationBusMasterCommonBuffer, + (VOID **)&Dev->RingDesc.RingCmps, + &Dev->RingDesc.RingCmpsDmaDesc + ); + if (EFI_ERROR (Status)) { + return Status; + } + ZeroMem (Dev->RingDesc.RingCmps, EFI_PAGE_SIZE); + + ZeroMem (&Cmd, sizeof Cmd); + Cmd.ReqRingNumPages =3D 1; + Cmd.CmpRingNumPages =3D 1; + Cmd.RingsStatePPN =3D + ((UINT64) Dev->RingDesc.RingStateDmaDesc.DeviceAddress) >> + EFI_PAGE_SHIFT; + Cmd.ReqRingPPNs[0] =3D + ((UINT64) Dev->RingDesc.RingReqsDmaDesc.DeviceAddress) >> + EFI_PAGE_SHIFT; + Cmd.CmpRingPPNs[0] =3D + ((UINT64) Dev->RingDesc.RingCmpsDmaDesc.DeviceAddress) >> + EFI_PAGE_SHIFT; + + return PvScsiWriteCmdDesc(Dev, PVSCSI_CMD_SETUP_RINGS, &Cmd, sizeof Cmd); +} + STATIC EFI_STATUS PvScsiInit ( @@ -425,6 +629,15 @@ PvScsiInit ( if (EFI_ERROR (Status)) { return Status; } + + // + // Init PVSCSI rings + // + Status =3D PvScsiInitRings (Dev); + if (EFI_ERROR (Status)) { + return Status; + } + // // Populate the exported interface's attributes // @@ -463,6 +676,28 @@ PvScsiUninit ( IN OUT PVSCSI_DEV *Dev ) { + // + // Free PVSCSI rings + // + PvScsiFreeSharedPages ( + Dev, + 1, + (VOID **)&Dev->RingDesc.RingCmps, + &Dev->RingDesc.RingCmpsDmaDesc + ); + PvScsiFreeSharedPages ( + Dev, + 1, + (VOID **)&Dev->RingDesc.RingReqs, + &Dev->RingDesc.RingReqsDmaDesc + ); + PvScsiFreeSharedPages ( + Dev, + 1, + (VOID **)&Dev->RingDesc.RingState, + &Dev->RingDesc.RingStateDmaDesc + ); + // // Restore PCI Attributes // diff --git a/OvmfPkg/PvScsiDxe/PvScsi.h b/OvmfPkg/PvScsiDxe/PvScsi.h index 5f611dbbc98c..6d23b6e1eccf 100644 --- a/OvmfPkg/PvScsiDxe/PvScsi.h +++ b/OvmfPkg/PvScsiDxe/PvScsi.h @@ -15,12 +15,29 @@ #include #include =20 +typedef struct { + EFI_PHYSICAL_ADDRESS DeviceAddress; + VOID *Mapping; +} PVSCSI_DMA_DESC; + +typedef struct { + PVSCSI_RINGS_STATE *RingState; + PVSCSI_DMA_DESC RingStateDmaDesc; + + PVSCSI_RING_REQ_DESC *RingReqs; + PVSCSI_DMA_DESC RingReqsDmaDesc; + + PVSCSI_RING_CMP_DESC *RingCmps; + PVSCSI_DMA_DESC RingCmpsDmaDesc; +} PVSCSI_RING_DESC; + #define PVSCSI_SIG SIGNATURE_32 ('P', 'S', 'C', 'S') =20 typedef struct { UINT32 Signature; EFI_PCI_IO_PROTOCOL *PciIo; UINT64 OriginalPciAttributes; + PVSCSI_RING_DESC RingDesc; UINT8 MaxTarget; UINT8 MaxLun; EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; --=20 2.20.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55879): https://edk2.groups.io/g/devel/message/55879 Mute This Topic: https://groups.io/mt/72001281/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-