From nobody Fri Dec 27 18:48:36 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; 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 1501709107997206.37596936214356; Wed, 2 Aug 2017 14:25:07 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id D78E0208AE400; Wed, 2 Aug 2017 14:22:50 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 34CF021AEB0AE for ; Wed, 2 Aug 2017 14:22:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 95A8D20272; Wed, 2 Aug 2017 21:24:59 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-47.phx2.redhat.com [10.3.116.47]) by smtp.corp.redhat.com (Postfix) with ESMTP id 10F1D17B57; Wed, 2 Aug 2017 21:24:57 +0000 (UTC) X-Original-To: edk2-devel@lists.01.org DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 95A8D20272 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=lersek@redhat.com From: Laszlo Ersek To: edk2-devel-01 Date: Wed, 2 Aug 2017 23:24:42 +0200 Message-Id: <20170802212453.19221-2-lersek@redhat.com> In-Reply-To: <20170802212453.19221-1-lersek@redhat.com> References: <20170802212453.19221-1-lersek@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 02 Aug 2017 21:24:59 +0000 (UTC) Subject: [edk2] [PATCH 01/12] OvmfPkg/IoMmuDxe: rewrap source code to 79 characters 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 , Ard Biesheuvel MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" No functional changes. Cc: Ard Biesheuvel Cc: Brijesh Singh Cc: Jordan Justen Cc: Tom Lendacky Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek --- OvmfPkg/IoMmuDxe/IoMmuDxe.inf | 11 +- OvmfPkg/IoMmuDxe/AmdSevIoMmu.h | 8 +- OvmfPkg/IoMmuDxe/AmdSevIoMmu.c | 173 +++++++++++++------- OvmfPkg/IoMmuDxe/IoMmuDxe.c | 8 +- 4 files changed, 130 insertions(+), 70 deletions(-) diff --git a/OvmfPkg/IoMmuDxe/IoMmuDxe.inf b/OvmfPkg/IoMmuDxe/IoMmuDxe.inf index b90dc80dfd37..21dc39b9233a 100644 --- a/OvmfPkg/IoMmuDxe/IoMmuDxe.inf +++ b/OvmfPkg/IoMmuDxe/IoMmuDxe.inf @@ -1,17 +1,18 @@ #/** @file # # Driver provides the IOMMU protcol support for PciHostBridgeIo and others # drivers. # # Copyright (c) 2017, AMD Inc. All rights reserved.
# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the B= SD -# License which accompanies this distribution. The full text of the lice= nse may -# be found at http://opensource.org/licenses/bsd-license.php +# This program and the accompanying materials are licensed and made avail= able +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR +# IMPLIED. # #**/ =20 diff --git a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.h b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.h index 8b3962a8c395..88dabfc2c435 100644 --- a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.h +++ b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.h @@ -1,36 +1,36 @@ /** @file =20 - The protocol provides support to allocate, free, map and umap a DMA buff= er for - bus master (e.g PciHostBridge). When SEV is enabled, the DMA operations = must - be performed on unencrypted buffer hence protocol clear the encryption b= it - from the DMA buffer. + The protocol provides support to allocate, free, map and umap a DMA buff= er + for bus master (e.g PciHostBridge). When SEV is enabled, the DMA operati= ons + must be performed on unencrypted buffer hence protocol clear the encrypt= ion + bit from the DMA buffer. =20 Copyright (c) 2017, Intel Corporation. All rights reserved.
Copyright (c) 2017, AMD Inc. All rights reserved.
This program and the accompanying materials are licensed and made availa= ble under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php =20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. =20 **/ =20 #ifndef __AMD_SEV_IOMMU_H_ #define __AMD_SEV_IOMMU_H =20 #include =20 #include #include #include #include #include #include =20 /** Install IOMMU protocol to provide the DMA support for PciHostBridge and MemEncryptSevLib. =20 **/ diff --git a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c index 9e78058b7242..edef0f41eecc 100644 --- a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c +++ b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c @@ -1,21 +1,21 @@ /** @file =20 - The protocol provides support to allocate, free, map and umap a DMA buff= er for - bus master (e.g PciHostBridge). When SEV is enabled, the DMA operations = must - be performed on unencrypted buffer hence we use a bounce buffer to map t= he guest - buffer into an unencrypted DMA buffer. + The protocol provides support to allocate, free, map and umap a DMA buff= er + for bus master (e.g PciHostBridge). When SEV is enabled, the DMA operati= ons + must be performed on unencrypted buffer hence we use a bounce buffer to = map + the guest buffer into an unencrypted DMA buffer. =20 Copyright (c) 2017, AMD Inc. All rights reserved.
Copyright (c) 2017, Intel Corporation. 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 distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php =20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. =20 **/ =20 #include "AmdSevIoMmu.h" @@ -23,37 +23,41 @@ typedef struct { EDKII_IOMMU_OPERATION Operation; UINTN NumberOfBytes; UINTN NumberOfPages; EFI_PHYSICAL_ADDRESS HostAddress; EFI_PHYSICAL_ADDRESS DeviceAddress; } MAP_INFO; =20 #define NO_MAPPING (VOID *) (UINTN) -1 =20 /** - Provides the controller-specific addresses required to access system mem= ory from a - DMA bus master. On SEV guest, the DMA operations must be performed on sh= ared - buffer hence we allocate a bounce buffer to map the HostAddress to a Dev= iceAddress. - The Encryption attribute is removed from the DeviceAddress buffer. + Provides the controller-specific addresses required to access system mem= ory + from a DMA bus master. On SEV guest, the DMA operations must be performe= d on + shared buffer hence we allocate a bounce buffer to map the HostAddress t= o a + DeviceAddress. The Encryption attribute is removed from the DeviceAddress + buffer. =20 @param This The protocol instance pointer. @param Operation Indicates if the bus master is going to re= ad or write to system memory. - @param HostAddress The system memory address to map to the PC= I controller. + @param HostAddress The system memory address to map to the PCI + controller. @param NumberOfBytes On input the number of bytes to map. On ou= tput - the number of bytes - that were mapped. - @param DeviceAddress The resulting map address for the bus mast= er PCI - controller to use to - access the hosts HostAddress. + the number of bytes that were mapped. + @param DeviceAddress The resulting map address for the bus mast= er + PCI controller to use to access the hosts + HostAddress. @param Mapping A resulting value to pass to Unmap(). =20 - @retval EFI_SUCCESS The range was mapped for the returned Numb= erOfBytes. - @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a comm= on buffer. + @retval EFI_SUCCESS The range was mapped for the returned + NumberOfBytes. + @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a comm= on + buffer. @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to = a lack - of resources. - @retval EFI_DEVICE_ERROR The system hardware could not map the requ= ested address. + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a + lack of resources. + @retval EFI_DEVICE_ERROR The system hardware could not map the requ= ested + address. =20 **/ EFI_STATUS @@ -61,223 +65,249 @@ EFIAPI IoMmuMap ( IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping ) { EFI_STATUS Status; EFI_PHYSICAL_ADDRESS PhysicalAddress; MAP_INFO *MapInfo; EFI_PHYSICAL_ADDRESS DmaMemoryTop; EFI_ALLOCATE_TYPE AllocateType; =20 if (HostAddress =3D=3D NULL || NumberOfBytes =3D=3D NULL || DeviceAddres= s =3D=3D NULL || Mapping =3D=3D NULL) { return EFI_INVALID_PARAMETER; } =20 // // Make sure that Operation is valid // if ((UINT32) Operation >=3D EdkiiIoMmuOperationMaximum) { return EFI_INVALID_PARAMETER; } PhysicalAddress =3D (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress; =20 DmaMemoryTop =3D (UINTN)-1; AllocateType =3D AllocateAnyPages; =20 if (((Operation !=3D EdkiiIoMmuOperationBusMasterRead64 && Operation !=3D EdkiiIoMmuOperationBusMasterWrite64 && Operation !=3D EdkiiIoMmuOperationBusMasterCommonBuffer64)) && ((PhysicalAddress + *NumberOfBytes) > SIZE_4GB)) { // // If the root bridge or the device cannot handle performing DMA above // 4GB but any part of the DMA transfer being mapped is above 4GB, then // map the DMA transfer to a buffer below 4GB. // DmaMemoryTop =3D SIZE_4GB - 1; AllocateType =3D AllocateMaxAddress; =20 if (Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer || Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer64) { // // Common Buffer operations can not be remapped. If the common bu= ffer - // if above 4GB, then it is not possible to generate a mapping, so= return - // an error. + // if above 4GB, then it is not possible to generate a mapping, so + // return an error. // return EFI_UNSUPPORTED; } } =20 // // CommandBuffer was allocated by us (AllocateBuffer) and is already in // unencryted buffer so no need to create bounce buffer // if (Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer || Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer64) { *Mapping =3D NO_MAPPING; *DeviceAddress =3D PhysicalAddress; =20 return EFI_SUCCESS; } =20 // // Allocate a MAP_INFO structure to remember the mapping when Unmap() is // called later. // MapInfo =3D AllocatePool (sizeof (MAP_INFO)); if (MapInfo =3D=3D NULL) { *NumberOfBytes =3D 0; return EFI_OUT_OF_RESOURCES; } =20 // // Initialize the MAP_INFO structure // MapInfo->Operation =3D Operation; MapInfo->NumberOfBytes =3D *NumberOfBytes; MapInfo->NumberOfPages =3D EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes= ); MapInfo->HostAddress =3D PhysicalAddress; MapInfo->DeviceAddress =3D DmaMemoryTop; =20 // // Allocate a buffer to map the transfer to. // Status =3D gBS->AllocatePages ( AllocateType, EfiBootServicesData, MapInfo->NumberOfPages, &MapInfo->DeviceAddress ); if (EFI_ERROR (Status)) { FreePool (MapInfo); *NumberOfBytes =3D 0; return Status; } =20 // // Clear the memory encryption mask from the device buffer // - Status =3D MemEncryptSevClearPageEncMask (0, MapInfo->DeviceAddress, Map= Info->NumberOfPages, TRUE); + Status =3D MemEncryptSevClearPageEncMask ( + 0, + MapInfo->DeviceAddress, + MapInfo->NumberOfPages, + TRUE + ); ASSERT_EFI_ERROR(Status); =20 // // If this is a read operation from the Bus Master's point of view, // then copy the contents of the real buffer into the mapped buffer // so the Bus Master can read the contents of the real buffer. // if (Operation =3D=3D EdkiiIoMmuOperationBusMasterRead || Operation =3D=3D EdkiiIoMmuOperationBusMasterRead64) { CopyMem ( (VOID *) (UINTN) MapInfo->DeviceAddress, (VOID *) (UINTN) MapInfo->HostAddress, MapInfo->NumberOfBytes ); } =20 // // The DeviceAddress is the address of the maped buffer below 4GB // *DeviceAddress =3D MapInfo->DeviceAddress; =20 // // Return a pointer to the MAP_INFO structure in Mapping // *Mapping =3D MapInfo; =20 - DEBUG ((DEBUG_VERBOSE, "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%= Lx\n", - __FUNCTION__, MapInfo->DeviceAddress, MapInfo->HostAddress, - MapInfo->NumberOfPages, MapInfo->NumberOfBytes)); + DEBUG (( + DEBUG_VERBOSE, + "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n", + __FUNCTION__, + MapInfo->DeviceAddress, + MapInfo->HostAddress, + MapInfo->NumberOfPages, + MapInfo->NumberOfBytes + )); =20 return EFI_SUCCESS; } =20 /** Completes the Map() operation and releases any corresponding resources. =20 @param This The protocol instance pointer. @param Mapping The mapping value returned from Map(). =20 @retval EFI_SUCCESS The range was unmapped. - @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned b= y Map(). - @retval EFI_DEVICE_ERROR The data was not committed to the target s= ystem memory. + @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned by + Map(). + @retval EFI_DEVICE_ERROR The data was not committed to the target s= ystem + memory. **/ EFI_STATUS EFIAPI IoMmuUnmap ( IN EDKII_IOMMU_PROTOCOL *This, IN VOID *Mapping ) { MAP_INFO *MapInfo; EFI_STATUS Status; =20 if (Mapping =3D=3D NULL) { return EFI_INVALID_PARAMETER; } =20 // // See if the Map() operation associated with this Unmap() required a ma= pping // buffer. If a mapping buffer was not required, then this function simp= ly // buffer. If a mapping buffer was not required, then this function simp= ly // if (Mapping =3D=3D NO_MAPPING) { return EFI_SUCCESS; } =20 MapInfo =3D (MAP_INFO *)Mapping; =20 // // If this is a write operation from the Bus Master's point of view, // then copy the contents of the mapped buffer into the real buffer // so the processor can read the contents of the real buffer. // if (MapInfo->Operation =3D=3D EdkiiIoMmuOperationBusMasterWrite || MapInfo->Operation =3D=3D EdkiiIoMmuOperationBusMasterWrite64) { CopyMem ( (VOID *) (UINTN) MapInfo->HostAddress, (VOID *) (UINTN) MapInfo->DeviceAddress, MapInfo->NumberOfBytes ); } =20 - DEBUG ((DEBUG_VERBOSE, "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%= Lx\n", - __FUNCTION__, MapInfo->DeviceAddress, MapInfo->HostAddress, - MapInfo->NumberOfPages, MapInfo->NumberOfBytes)); + DEBUG (( + DEBUG_VERBOSE, + "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n", + __FUNCTION__, + MapInfo->DeviceAddress, + MapInfo->HostAddress, + MapInfo->NumberOfPages, + MapInfo->NumberOfBytes + )); // // Restore the memory encryption mask // - Status =3D MemEncryptSevSetPageEncMask (0, MapInfo->DeviceAddress, MapIn= fo->NumberOfPages, TRUE); + Status =3D MemEncryptSevSetPageEncMask ( + 0, + MapInfo->DeviceAddress, + MapInfo->NumberOfPages, + TRUE + ); ASSERT_EFI_ERROR(Status); =20 // // Free the mapped buffer and the MAP_INFO structure. // gBS->FreePages (MapInfo->DeviceAddress, MapInfo->NumberOfPages); FreePool (Mapping); return EFI_SUCCESS; } =20 /** Allocates pages that are suitable for an OperationBusMasterCommonBuffer = or OperationBusMasterCommonBuffer64 mapping. =20 @param This The protocol instance pointer. @param Type This parameter is not used and must be ign= ored. - @param MemoryType The type of memory to allocate, EfiBootSer= vicesData - or EfiRuntimeServicesData. + @param MemoryType The type of memory to allocate, + EfiBootServicesData or EfiRuntimeServicesD= ata. @param Pages The number of pages to allocate. - @param HostAddress A pointer to store the base system memory = address - of the allocated range. - @param Attributes The requested bit mask of attributes for t= he allocated range. + @param HostAddress A pointer to store the base system memory + address of the allocated range. + @param Attributes The requested bit mask of attributes for t= he + allocated range. =20 @retval EFI_SUCCESS The requested memory pages were allocated. - @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal = attribute - bits are MEMORY_WRITE_COMBINE and MEMORY_C= ACHED. + @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal + attribute bits are MEMORY_WRITE_COMBINE and + MEMORY_CACHED. @retval EFI_INVALID_PARAMETER One or more parameters are invalid. @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. =20 **/ @@ -286,75 +316,82 @@ EFIAPI IoMmuAllocateBuffer ( IN EDKII_IOMMU_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT VOID **HostAddress, IN UINT64 Attributes ) { EFI_STATUS Status; EFI_PHYSICAL_ADDRESS PhysicalAddress; =20 // // Validate Attributes // if ((Attributes & EDKII_IOMMU_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER) != =3D 0) { return EFI_UNSUPPORTED; } =20 // // Check for invalid inputs // if (HostAddress =3D=3D NULL) { return EFI_INVALID_PARAMETER; } =20 // // The only valid memory types are EfiBootServicesData and // EfiRuntimeServicesData // if (MemoryType !=3D EfiBootServicesData && MemoryType !=3D EfiRuntimeServicesData) { return EFI_INVALID_PARAMETER; } =20 PhysicalAddress =3D (UINTN)-1; if ((Attributes & EDKII_IOMMU_ATTRIBUTE_DUAL_ADDRESS_CYCLE) =3D=3D 0) { // // Limit allocations to memory below 4GB // PhysicalAddress =3D SIZE_4GB - 1; } Status =3D gBS->AllocatePages ( AllocateMaxAddress, MemoryType, Pages, &PhysicalAddress ); if (!EFI_ERROR (Status)) { *HostAddress =3D (VOID *) (UINTN) PhysicalAddress; =20 // // Clear memory encryption mask // Status =3D MemEncryptSevClearPageEncMask (0, PhysicalAddress, Pages, T= RUE); ASSERT_EFI_ERROR(Status); } =20 - DEBUG ((DEBUG_VERBOSE, "%a Address 0x%Lx Pages 0x%Lx\n", __FUNCTION__, P= hysicalAddress, Pages)); + DEBUG (( + DEBUG_VERBOSE, + "%a Address 0x%Lx Pages 0x%Lx\n", + __FUNCTION__, + PhysicalAddress, + Pages + )); return Status; } =20 /** Frees memory that was allocated with AllocateBuffer(). =20 @param This The protocol instance pointer. @param Pages The number of pages to free. - @param HostAddress The base system memory address of the allo= cated range. + @param HostAddress The base system memory address of the allo= cated + range. =20 @retval EFI_SUCCESS The requested memory pages were freed. - @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress = and Pages - was not allocated with AllocateBuffer(). + @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress = and + Pages was not allocated with AllocateBuffe= r(). =20 **/ EFI_STATUS @@ -362,57 +399,79 @@ EFIAPI IoMmuFreeBuffer ( IN EDKII_IOMMU_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress ) { EFI_STATUS Status; =20 // // Set memory encryption mask // - Status =3D MemEncryptSevSetPageEncMask (0, (EFI_PHYSICAL_ADDRESS)(UINTN)= HostAddress, Pages, TRUE); + Status =3D MemEncryptSevSetPageEncMask ( + 0, + (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress, + Pages, + TRUE + ); ASSERT_EFI_ERROR(Status); =20 - DEBUG ((DEBUG_VERBOSE, "%a Address 0x%Lx Pages 0x%Lx\n", __FUNCTION__, (= UINTN)HostAddress, Pages)); + DEBUG (( + DEBUG_VERBOSE, + "%a Address 0x%Lx Pages 0x%Lx\n", + __FUNCTION__, + (UINTN)HostAddress, + Pages + )); return gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress, Pages= ); } =20 =20 /** Set IOMMU attribute for a system memory. =20 If the IOMMU protocol exists, the system memory cannot be used for DMA by default. =20 When a device requests a DMA access for a system memory, the device driver need use SetAttribute() to update the IOMMU attribute to request DMA access (read and/or write). =20 The DeviceHandle is used to identify which device submits the request. - The IOMMU implementation need translate the device path to an IOMMU devi= ce ID, - and set IOMMU hardware register accordingly. + The IOMMU implementation need translate the device path to an IOMMU devi= ce + ID, and set IOMMU hardware register accordingly. 1) DeviceHandle can be a standard PCI device. The memory for BusMasterRead need set EDKII_IOMMU_ACCESS_READ. The memory for BusMasterWrite need set EDKII_IOMMU_ACCESS_WRITE. - The memory for BusMasterCommonBuffer need set EDKII_IOMMU_ACCESS_READ= |EDKII_IOMMU_ACCESS_WRITE. - After the memory is used, the memory need set 0 to keep it being prot= ected. + The memory for BusMasterCommonBuffer need set + EDKII_IOMMU_ACCESS_READ|EDKII_IOMMU_ACCESS_WRITE. + After the memory is used, the memory need set 0 to keep it being + protected. 2) DeviceHandle can be an ACPI device (ISA, I2C, SPI, etc). - The memory for DMA access need set EDKII_IOMMU_ACCESS_READ and/or EDK= II_IOMMU_ACCESS_WRITE. + The memory for DMA access need set EDKII_IOMMU_ACCESS_READ and/or + EDKII_IOMMU_ACCESS_WRITE. =20 @param[in] This The protocol instance pointer. - @param[in] DeviceHandle The device who initiates the DMA access re= quest. + @param[in] DeviceHandle The device who initiates the DMA access + request. @param[in] Mapping The mapping value returned from Map(). @param[in] IoMmuAccess The IOMMU access. =20 - @retval EFI_SUCCESS The IoMmuAccess is set for the memory ran= ge specified by DeviceAddress and Length. + @retval EFI_SUCCESS The IoMmuAccess is set for the memory ran= ge + specified by DeviceAddress and Length. @retval EFI_INVALID_PARAMETER DeviceHandle is an invalid handle. - @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned = by Map(). - @retval EFI_INVALID_PARAMETER IoMmuAccess specified an illegal combinat= ion of access. + @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned = by + Map(). + @retval EFI_INVALID_PARAMETER IoMmuAccess specified an illegal combinat= ion + of access. @retval EFI_UNSUPPORTED DeviceHandle is unknown by the IOMMU. - @retval EFI_UNSUPPORTED The bit mask of IoMmuAccess is not suppor= ted by the IOMMU. - @retval EFI_UNSUPPORTED The IOMMU does not support the memory ran= ge specified by Mapping. - @retval EFI_OUT_OF_RESOURCES There are not enough resources available = to modify the IOMMU access. - @retval EFI_DEVICE_ERROR The IOMMU device reported an error while = attempting the operation. + @retval EFI_UNSUPPORTED The bit mask of IoMmuAccess is not suppor= ted + by the IOMMU. + @retval EFI_UNSUPPORTED The IOMMU does not support the memory ran= ge + specified by Mapping. + @retval EFI_OUT_OF_RESOURCES There are not enough resources available = to + modify the IOMMU access. + @retval EFI_DEVICE_ERROR The IOMMU device reported an error while + attempting the operation. =20 **/ EFI_STATUS diff --git a/OvmfPkg/IoMmuDxe/IoMmuDxe.c b/OvmfPkg/IoMmuDxe/IoMmuDxe.c index 101157e228b3..5809afc44196 100644 --- a/OvmfPkg/IoMmuDxe/IoMmuDxe.c +++ b/OvmfPkg/IoMmuDxe/IoMmuDxe.c @@ -1,27 +1,27 @@ /** @file =20 IoMmuDxe driver installs EDKII_IOMMU_PROTOCOL to provide the support for= DMA operations when SEV is enabled. =20 Copyright (c) 2017, AMD Inc. All rights reserved.
=20 - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD - License which accompanies this distribution. The full text of the licen= se may - be found at http://opensource.org/licenses/bsd-license.php + This program and the accompanying materials are licensed and made availa= ble + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php =20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. =20 **/ =20 #include =20 #include #include #include #include #include #include =20 #include "AmdSevIoMmu.h" --=20 2.13.1.3.g8be5a757fa67 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel