From nobody Fri Dec 27 18:25:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1502107215582819.3625016819801; Mon, 7 Aug 2017 05:00:15 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 8135121DF968F; Mon, 7 Aug 2017 04:57:17 -0700 (PDT) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0085.outbound.protection.outlook.com [104.47.33.85]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 7C48F21DFE900 for ; Mon, 7 Aug 2017 04:57:16 -0700 (PDT) Received: from brijesh-build-machine.amd.com (165.204.77.1) by SN1PR12MB0159.namprd12.prod.outlook.com (10.162.3.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1320.16; Mon, 7 Aug 2017 11:59:30 +0000 X-Original-To: edk2-devel@lists.01.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=OysvvNApQbVbtXntT2/zVZ7IrSS5FxJkMd7jjasGnA8=; b=0UFoBaqf3zRDsxLFJOxpFxSYdyAxMB91CV1zPfV61YCDGi5vNrVSiMwQp62fTEl1tEE0Ukf1YGw/m07UN7EHWPC/5s2hNmQlE+ivP/Yz16SUkIdjs11aeO0HWuWuCZienZ89k1uOmrCrUd0fou6hhhPB4kGn80A8VYS9inn5MMo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: edk2-devel@lists.01.org Date: Mon, 7 Aug 2017 07:58:58 -0400 Message-Id: <1502107139-412-14-git-send-email-brijesh.singh@amd.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1502107139-412-1-git-send-email-brijesh.singh@amd.com> References: <1502107139-412-1-git-send-email-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: CY4PR04CA0033.namprd04.prod.outlook.com (10.172.133.19) To SN1PR12MB0159.namprd12.prod.outlook.com (10.162.3.146) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9077e851-7c08-4399-1591-08d4dd8bc312 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:SN1PR12MB0159; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0159; 3:4/DK4j1ZMd5yXQX8I1krlHhLT/pyjn0GqAEOm/RHkPTxbRX6TlLXDelJiGKMZCD7IB49CSSkGn7n/6Zhv3lwXbMH9YLokt7y+mmexWpsU5LjBexEuTtZ++z3fSZHhqMyK3uxMJK/ryBDtBn1BL7GarbXEBYaZYapPfNRTw/LAzpZwKP+cmu44XzP1u3BReWIuVU9NhsBlWsGk9UMt+byEwbiPJvJ11ekg7p7Y+W+6N5IwH7t5uA2dqCUkYlmcaBx; 25:nNGvBKCIdpIz7P1SIGq5dDW2uUY4S1XFK6M9dpYReiKPlcvCvaW+xhSRRrLdyRC/ofdDx/Dba5t9exINNysvTyARzgWJ/xA+PUqb62NUkj9BoIYs1BAGKT9WWwINTCWOLXppBtOTiQPuV7j9gbGASO51wIa02BNOzo1TQSFTSWjV6mlGdGWB2O+SHvDVZIP+dPEAuMeHKLjSqL1L4fBFtKixXnNq8r/wAFGjti6dRYWzi1nCGVyhaqGSxtzj4FUpWKoylHjtiYprmMRLr9jRnpawxJuTL+ATMGJfkX6aHpXYp95liR/c2Dkb/vL06RPGroTr1XtOR5hJWmu0YdrqwQ==; 31:bxDIh7SgdU0J0BI1F4i9KUtaXsi9lAmbU0uzRYiPC31z3Un4oG4dqclq2eJJOGtzN6ZJfgHkKxiEsSpzFv06iHKPKehPiwfIa7ALXpFYEDCjxW5IcdkW56pecFWiNz5CPNxdeZKygcLOmYZ+0z7y7JhTSTxNXvKwhfvnXVPeUS1KAytEof1Z/Wl82JHLJbi0dAfeZgE0P9RWuN5FwnAyr5DMoElekgkX8w11SPODUZM= X-MS-TrafficTypeDiagnostic: SN1PR12MB0159: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0159; 20:pP5JjwBczwu7bSF1lolrRlmmCd0Jl7E5hQfX3BMSkRF7i83ds8bIV4Dhi9TkZ2ypa8/QilEUHl61hpHZJ347EjudVe13WtfUqu/YVwHWb0r191tB9ROqvaYvzhAizb3qFk9+t/PND6GC17b9BtZ2iZJorqVBjix43GlsrvtJAXOHg32GXFkp1S4kcz4hMc6BoF2J5NGHnfijjObZg2vUr5aOwymJSlW4mBaFJXVH2m8xmrtxQAjhOmAkLZ045aELcrNYPO5Keca1/gDq/WQZ0jZPSwmOTTnDcMr+P3WUqyUhr8NSnmP+bDxwUlEl2cUxAYinBCnsgxm/Q+ddtcbY+G2DYKdvUGf/c3lNMI4pJYblJWOYJJB9cyGx38ZfGw/TKOKYD94kdPFTuykh8l1OPFxZfe/Fl/PgStikvHgFiZlNxpy7lHO/dJUVcCafHcKkIfSvW1zLAuyOtkhRS/NVEAFXzMxbJojIsWOD2K5I5W7zuQErGiwDWvg6kZBjzO0F; 4:akEtWLHNYSHxWPIEn72Z/+aZ4q/hxjutl/Bkv/S94PprPmxHeQc6uDBoa30f17EVKzVWZj9woiRvA877DYJQ4+xlhWSZlPJpeujANd0PdQ0NSSe6KQF6aMbZGihTuMk1bemdPyjTJ+FRFuVfFp6fPabwRDielPwi11Y8zcUjevNwVtNCICetkjfkEgHUojhcFW7qCiQvMPR2QOdBOLy2TQikOycZMcgn3d1VdBH9p7t1ykI1W+be0KDvW/K7a4xa1UvKcWlSz/se8FT/yw09DdOOT7mNc7J88rZpRQ5h50lpCMklSVJ/nUN0oFmHiinhAN7yzPtwnFdD+psaOCNv9ZS+jRP2QswpSay5Ya3Ft2o= X-Exchange-Antispam-Report-Test: UriScan:(20558992708506)(767451399110)(228905959029699); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041248)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123558100)(20161123560025)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:SN1PR12MB0159; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:SN1PR12MB0159; X-Forefront-PRVS: 0392679D18 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6009001)(39400400002)(39850400002)(39450400003)(39410400002)(39840400002)(39860400002)(199003)(189002)(3846002)(6116002)(5660300001)(81156014)(81166006)(54906002)(8676002)(68736007)(50466002)(53936002)(53416004)(106356001)(2950100002)(105586002)(2351001)(42186005)(86362001)(6666003)(5003940100001)(36756003)(189998001)(33646002)(6916009)(97736004)(25786009)(2906002)(478600001)(110136004)(47776003)(38730400002)(76176999)(50986999)(66066001)(4326008)(2361001)(305945005)(50226002)(48376002)(7350300001)(101416001)(6486002)(7736002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0159; H:brijesh-build-machine.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR12MB0159; 23:J8YsHVCp7SBUXlSBPcxQvSGm9/qIFiq4QoC38rieX?= =?us-ascii?Q?h8Hw7OJsTutUSnmjbE+oCPrVuU4ib47ZSHOok9RFcBXx0FYlVrpM5NDFXwAn?= =?us-ascii?Q?6nR/ZxslR4VC12yS+MatmlUeNou41doUt+8a742WJcaR1DLRvI2+fIsYimx/?= =?us-ascii?Q?ah9lImj2zFSo0A8rZnXDWhxt9zIzc3cchFcsFg7UQBQTksyq9EcLuoFVXAdZ?= =?us-ascii?Q?z28aAQXvNJ5lPVN6EzVbAEfY4To4ZG/sGP0wQ/uB1kzMhRXYgDG8GR4U3qF1?= =?us-ascii?Q?rg2ArsE1hc9eNkImLJ53iXWnN/A9eF7Z2jYJbrgjg16y1jbP5IP2T1svQDxy?= =?us-ascii?Q?NGWjY5sftbJh6gKyPxFwfVq0p7wpZQN0ryI+I2aHePhlnvL5l3YygrIvYB1L?= =?us-ascii?Q?pHjVfhvWvO8LoLnOScypD00azMR+Ac+O9KIU471qehzLp32e9Zhu3ePBOadc?= =?us-ascii?Q?Dd0Ds24Sgne/3xThMutoe+B56Vk5L72BnntMXypWwdRlJlGkTqtm+OAGttJI?= =?us-ascii?Q?+nX786NySoNYvJg9gefQx6kFV4vfmD0co+pLSgjcRMe0rkeFkVG2PeMcs2Of?= =?us-ascii?Q?9JFASbdKUYb4j2TYQmUsXCRhVlPBrSayDIaoomHr9gb7f5ebcerNMz75bOd3?= =?us-ascii?Q?43LztCOVx7+Hr0JHBZoJZIxYPmWJsTECZHJJ1MFybQUu3b10onDsbqKQyufM?= =?us-ascii?Q?WzWocw4fWwzJyiCNCwvR+6LMZeUOIGsK+skoNqyJor1L1W3x0s7TojZ0QdVZ?= =?us-ascii?Q?IlkF9wPlrC3TnQXSerHzTTFy+E8OB6GTbMQmn7qo/dsPtmI2KrTueJFwjak1?= =?us-ascii?Q?qqXIbjk5NdZvD4PB901dpdkAiAOyfRmFRH3fSikzLmBgrtgasSEigAcGS5TN?= =?us-ascii?Q?YEUJjnuQcpx2XVitu6yYk1GfAyoj4Q0sLhTcnQ1xxAAco4gesncsGge2vIav?= =?us-ascii?Q?mOYDGsgjMSVUFGweKiRE2le7CdVzxKvXoxm0vju97TAgIWiF+7FH/1l8ty2L?= =?us-ascii?Q?q0bpo0b9wnfbm0WC9OLeFj3XiqRA1xTwH9t3+kTZLHSeL6QOr4PBbFXfHKVU?= =?us-ascii?Q?vSUCOiWCl+TkTbvgOMmau6m//nC7y7l2B5Ofk6OQ6jslzRHFke0UdISaK7Lz?= =?us-ascii?Q?4dXjtV1n8Mz8B0QWTLE1X5X/c7IaolF+3GoIEZI98eVzux/TqGPmiFbYWAaU?= =?us-ascii?Q?ydGk5TRc6pQ4sb59lHINQVkrKOxY9DcXqZ2a27adb+zQRiS4CoKRmzvtVaUr?= =?us-ascii?Q?T9L3f1xp84FOCZwMgH6CkBjA6CkaVd1oepOgr0TfMFkZvF0rp1e3mwE/SbXn?= =?us-ascii?Q?BueSV+ADMU6VeqLoBigL3A=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0159; 6:B6/tRQRV4vEvHJAKOJATF3jATX/PkmkkTj9KGm2OuZ+CoBd4zE76CjeGV8ZbP+bu9XJNywEPVpRcmGXXSiEXZHusdyVA6a/7l0pAmUP6ugkEtuQMZ+jMiM5DYmTYEp1nuorQG4hxCBOasD65pRUFpNuV/iFEAMXyNoakx+Mf4SDr20OqlZ69233bGo0RNIMRFu1hdeQvSBVOr1Nojb78u6z18X219d/Ua0nkSKf04DqjTGdf0HaphdPIULhxB7CsO3EAe4rarDu8QKzQY9h1HapHoAcqK/6aucIDvltBCH2qU9BgkTRPZkMjw/0PMOV1xDpYhP4i3Jk8XuZjm3MPdQ==; 5:6YHa9O0KHBfu3XvT9njk6PQxElLsUfDMXrFpDn2In6hhZ2GZqujsNebjFQTVtoGrfB1+egMwNQnzbBkiMn16nk1rb/YRqdpy/iCQBWVH2LrAuWkVgG9pkodMbYGZDv6jPTgRAElg7a7eJtUyFgHYQQ==; 24:YfBXvDI9QOrjz9tt6N9YStTXV8F6Aa/uooenQV5MDhtuxWLJWoCPTmG1puxfKpVKRS0UQmcZCzNSRs1QDMiSfRJQ38muQtApFjtPrzg45Xg=; 7:8eiYCFTK/jhVbWYArwRdTEyVpSRFTMW9PEFZTFa4gIlMwJ194Jx0oD9SH2xVXroq8bBZKzv0nlqNqjgbKNHuxbLmsVY2XF+vLLrgBbGiisihN4DbtNlqCABCfiq4xmSYRHpOlKkOCtYZIzIubOj4374wM5OPxxWZD0r9vT93cSWPWgXcYh900jOgSCPCiGkZVq+v8051UgtDo9Z7fl8EZyzeb6ZRtSo0Umhm+Yejih0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0159; 20:WPMyGvy0+YkFcXQNk/Iww9v+8ODWRxTkkqtpyNwoiWVCla7b652HxYLQpLmUTNkz5DXc4J7EQsi7FhJI8n9it1zrimYcDKvmvufNHzxJC9Wgj19l0kq7FiXMKCvZHRzLToM/9T5smpcypvlTIsMY8P0F9RC6z1iDpB5AxmWlGs/BCCSpavF+YXqBmb+qsz91FiesfE9yzMKwmKm9gauplvLfpJ8vb0a3oMdFrkQ7vrR5TtgHWiFVQ7scrb9UqRvK X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Aug 2017 11:59:30.4800 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0159 Subject: [edk2] [PATCH v1 13/14] OvmfPkg/VirtioNetDxe: Use DeviceAddress in transmit vring descriptors X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jordan Justen , Tom Lendacky , Laszlo Ersek , Ard Biesheuvel Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Update VirtioNetTransmit() to map the callers transmit buffer to a device DMA address and use the DeviceAddress in vring descriptors. Since the transmit buffers are returned back to caller in VirtioNetGetStatus() hence we maintain a list to map DeviceAddress to HostAddress. The list is consulted to find the correct HostAddress upon transmit completion interruption. Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Tom Lendacky Cc: Laszlo Ersek Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Brijesh Singh --- OvmfPkg/VirtioNetDxe/VirtioNet.h | 17 ++++ OvmfPkg/VirtioNetDxe/SnpGetStatus.c | 19 +++- OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c | 100 ++++++++++++++++++++ OvmfPkg/VirtioNetDxe/SnpTransmit.c | 22 +++-- 4 files changed, 149 insertions(+), 9 deletions(-) diff --git a/OvmfPkg/VirtioNetDxe/VirtioNet.h b/OvmfPkg/VirtioNetDxe/Virtio= Net.h index 873069e9de82..6c5129f178cd 100644 --- a/OvmfPkg/VirtioNetDxe/VirtioNet.h +++ b/OvmfPkg/VirtioNetDxe/VirtioNet.h @@ -269,6 +269,23 @@ VirtioNetShutdownTx ( IN OUT VNET_DEV *Dev ); =20 +EFI_STATUS +EFIAPI +VirtioMapTxBuf ( + IN VNET_DEV *Dev, + IN EFI_PHYSICAL_ADDRESS HostAddress, + IN UINTN NumberOfBytes, + OUT EFI_PHYSICAL_ADDRESS *DeviceAddress + ); + +EFI_STATUS +EFIAPI +VirtioUnmapTxBuf ( + IN VNET_DEV *Dev, + OUT EFI_PHYSICAL_ADDRESS *HostAddress, + IN EFI_PHYSICAL_ADDRESS DeviceAddress + ); + // // event callbacks // diff --git a/OvmfPkg/VirtioNetDxe/SnpGetStatus.c b/OvmfPkg/VirtioNetDxe/Snp= GetStatus.c index 694940ea1d97..ddea29e65d57 100644 --- a/OvmfPkg/VirtioNetDxe/SnpGetStatus.c +++ b/OvmfPkg/VirtioNetDxe/SnpGetStatus.c @@ -5,6 +5,7 @@ =20 Copyright (C) 2013, Red Hat, Inc. Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, AMD Inc, All rights reserved.
=20 This program and the accompanying materials are licensed and made availa= ble under the terms and conditions of the BSD License which accompanies this @@ -126,8 +127,10 @@ VirtioNetGetStatus ( *TxBuf =3D NULL; } else { - UINT16 UsedElemIdx; - UINT32 DescIdx; + UINT16 UsedElemIdx; + UINT32 DescIdx; + EFI_PHYSICAL_ADDRESS DeviceAddress; + EFI_PHYSICAL_ADDRESS HostAddress; =20 // // fetch the first descriptor among those that the hypervisor reports @@ -141,9 +144,19 @@ VirtioNetGetStatus ( ASSERT (DescIdx < (UINT32) (2 * Dev->TxMaxPending - 1)); =20 // + // Unmap the DeviceAddress + // + DeviceAddress =3D Dev->TxRing.Desc[DescIdx + 1].Addr; + Status =3D VirtioUnmapTxBuf (Dev, &HostAddress, DeviceAddress); + if (EFI_ERROR (Status)) { + goto Exit; + } + + // + // // report buffer address to caller that has been enqueued by caller // - *TxBuf =3D (VOID *)(UINTN) Dev->TxRing.Desc[DescIdx + 1].Addr; + *TxBuf =3D (VOID *)(UINTN) HostAddress; =20 // // now this descriptor can be used again to enqueue a transmit buffer diff --git a/OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c b/OvmfPkg/VirtioNetDxe= /SnpSharedHelpers.c index 3ed7132be531..6a6866e65b5f 100644 --- a/OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c +++ b/OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c @@ -14,10 +14,25 @@ =20 **/ =20 +#include #include =20 #include "VirtioNet.h" =20 +#define PRIVATE_TXBUF_SIGNATURE SIGNATURE_32 ('t', 'x', 'b', 'f') +typedef struct { + UINT32 Signature; + LIST_ENTRY Link; + EFI_PHYSICAL_ADDRESS HostAddress; + EFI_PHYSICAL_ADDRESS DeviceAddress; + VOID *Mapping; +} PRIVATE_TXBUF_ENTRY; +#define PRIVATE_TXBUF_FROM_LINK(a) CR (a, PRIVATE_TXBUF_ENTRY, Link, \ + PRIVATE_TXBUF_SIGNATURE) + +STATIC LIST_ENTRY mTxBufMapList =3D INITIALIZE_LIST_HEAD_VARIABLE (mTxBufM= apList); + + /** Release RX and TX resources on the boundary of the EfiSimpleNetworkInitialized state. @@ -68,3 +83,88 @@ VirtioNetShutdownTx ( =20 FreePool (Dev->TxFreeStack); } + +EFI_STATUS +EFIAPI +VirtioMapTxBuf ( + IN VNET_DEV *Dev, + IN EFI_PHYSICAL_ADDRESS HostAddress, + IN UINTN NumberOfBytes, + OUT EFI_PHYSICAL_ADDRESS *DeviceAddress + ) +{ + EFI_STATUS Status; + PRIVATE_TXBUF_ENTRY *Private; + + Private =3D AllocatePool (sizeof (*Private)); + if (Private =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Private->Signature =3D PRIVATE_TXBUF_SIGNATURE; + Private->HostAddress =3D HostAddress; + + Status =3D VirtioMapSharedBufferRead (Dev->VirtIo, + (VOID *) (UINTN) Private->HostAddress, NumberOfBytes, + &Private->DeviceAddress, &Private->Mapping); + if (EFI_ERROR (Status)) { + FreePool (Private); + return Status; + } + + *DeviceAddress =3D Private->DeviceAddress; + + // + // Add the mapping information into internal list so that we can retrieve + // the HostAddress upon Unmap(). + // + InsertTailList (&mTxBufMapList, &Private->Link); + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +VirtioUnmapTxBuf ( + IN VNET_DEV *Dev, + OUT EFI_PHYSICAL_ADDRESS *HostAddress, + IN EFI_PHYSICAL_ADDRESS DeviceAddress + ) +{ + EFI_STATUS Status; + PRIVATE_TXBUF_ENTRY *Private; + LIST_ENTRY *Link; + BOOLEAN Found; + + Found =3D FALSE; + + // + // Iterate through internal txbuf list to find mapping for a given + // DeviceAddress. + // + for (Link =3D GetFirstNode (&mTxBufMapList) + ; !IsNull (&mTxBufMapList, Link) + ; Link =3D GetNextNode (&mTxBufMapList, Link) + ) { + Private =3D PRIVATE_TXBUF_FROM_LINK (Link); + if (Private->DeviceAddress =3D=3D DeviceAddress) { + Found =3D TRUE; + break; + } + } + + // + // We failed to find mapping for the given DeviceAddress + // (this should never happen) + // + ASSERT (Found); + + Status =3D VirtioUnmapSharedBuffer (Dev->VirtIo, Private->Mapping); + if (EFI_ERROR (Status)) { + return Status; + } + + *HostAddress =3D Private->HostAddress; + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/VirtioNetDxe/SnpTransmit.c b/OvmfPkg/VirtioNetDxe/SnpT= ransmit.c index 7ca40d5d0650..20c56c12df04 100644 --- a/OvmfPkg/VirtioNetDxe/SnpTransmit.c +++ b/OvmfPkg/VirtioNetDxe/SnpTransmit.c @@ -73,11 +73,12 @@ VirtioNetTransmit ( IN UINT16 *Protocol OPTIONAL ) { - VNET_DEV *Dev; - EFI_TPL OldTpl; - EFI_STATUS Status; - UINT16 DescIdx; - UINT16 AvailIdx; + VNET_DEV *Dev; + EFI_TPL OldTpl; + EFI_STATUS Status; + UINT16 DescIdx; + UINT16 AvailIdx; + EFI_PHYSICAL_ADDRESS DeviceAddress; =20 if (This =3D=3D NULL || BufferSize =3D=3D 0 || Buffer =3D=3D NULL) { return EFI_INVALID_PARAMETER; @@ -144,10 +145,19 @@ VirtioNetTransmit ( } =20 // + // Map the transmit buffer HostAddress to a DeviceAddress + // + Status =3D VirtioMapTxBuf (Dev, (EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, + BufferSize, &DeviceAddress); + if (EFI_ERROR (Status)) { + goto Exit; + } + + // // virtio-0.9.5, 2.4.1 Supplying Buffers to The Device // DescIdx =3D Dev->TxFreeStack[Dev->TxCurPending++]; - Dev->TxRing.Desc[DescIdx + 1].Addr =3D (UINTN) Buffer; + Dev->TxRing.Desc[DescIdx + 1].Addr =3D (UINTN) DeviceAddress; Dev->TxRing.Desc[DescIdx + 1].Len =3D (UINT32) BufferSize; =20 // --=20 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel