From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-x22b.google.com (mail-wr0-x22b.google.com [IPv6:2a00:1450:400c:c0c::22b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 773F421E95E0F for ; Wed, 30 Aug 2017 01:18:48 -0700 (PDT) Received: by mail-wr0-x22b.google.com with SMTP id z91so16347720wrc.1 for ; Wed, 30 Aug 2017 01:21:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=k+EKEGIVzkmyX3q3eIp4Y7kOXOdZESXJltVwtae0eMI=; b=ceGfu96w/h9PxY6XtJVZrbHxPj6TCLb+nhIsXvrNArZper/eifUZsNcns+6xEAdVzv CfRrmTM7BR3abNJhypxpyWxCRyqF9fnOPe0caSP8LST/cKdgMFE9FIQvEJfYETVzaZfF LNLMtl1TMpCXzKPQz0S47uLWk+XBr1TYINdo0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=k+EKEGIVzkmyX3q3eIp4Y7kOXOdZESXJltVwtae0eMI=; b=B7x4OB3Wy/G9w3sGEEK8CjFFH1YNrsOHSoJ8/RVrGeuVpwDk6NhjkAxlozKX+K92Ub BSCRz2vccjzSSqyWVbUqoHGEGi4Uezmfpvn9ThB/Urvjx7lxbBdls7iWBS0yRZCYREdm iMtXJfU8gygck/yiltb+Ur8SFfuKCBUY+7bNY4WvloEaFm+qYh6v31MeU9gVUvEw1ljA KxDL7qfRdoyMAZxDWFwgj9PXkEGlGqHxA0KvxZXl7TjqUFLGEA5GWPRkIgid0Ughgo76 G+7ZW2ear+SdaMu/fODm+gGw1EqWabNXVB8tFnbW2Q+Edv1aoc6eCWgldHrrb7agB/nP sF6Q== X-Gm-Message-State: AHYfb5i1/NDXOAEOKBDO9WoNTGI+Zjg/ZK6bjTedzlp75TTQdN3g7Rme d49XQZfn0j+6Uu1Lknp9eQ== X-Received: by 10.223.185.39 with SMTP id k36mr492017wrf.251.1504081287893; Wed, 30 Aug 2017 01:21:27 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:27 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Cc: Ard Biesheuvel Date: Wed, 30 Aug 2017 09:21:08 +0100 Message-Id: <20170830082108.7470-7-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170830082108.7470-1-ard.biesheuvel@linaro.org> References: <20170830082108.7470-1-ard.biesheuvel@linaro.org> Subject: [PATCH 6/6] ArmPkg: remove ArmDmaLib 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: , X-List-Received-Date: Wed, 30 Aug 2017 08:18:49 -0000 Now that we have a generic DmaLib implementation for non-coherent DMA, let's get rid of the ARM specific one. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- ArmPkg/ArmPkg.dsc | 2 - ArmPkg/Library/ArmDmaLib/ArmDmaLib.c | 478 -------------------- ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf | 49 -- 3 files changed, 529 deletions(-) diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index ff2b0c074dc1..cf86f89bd702 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -72,7 +72,6 @@ [LibraryClasses.common] ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf - DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf @@ -106,7 +105,6 @@ [LibraryClasses.ARM, LibraryClasses.AARCH64] [Components.common] ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf - ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf ArmPkg/Library/BdsLib/BdsLib.inf ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.inf diff --git a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c deleted file mode 100644 index 2a8cf0fe21a4..000000000000 --- a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c +++ /dev/null @@ -1,478 +0,0 @@ -/** @file - Generic ARM implementation of DmaLib.h - - Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
- Copyright (c) 2015 - 2017, Linaro, Ltd. All rights reserved.
- - 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 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 IMPLIED. - -**/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -typedef struct { - EFI_PHYSICAL_ADDRESS HostAddress; - VOID *BufferAddress; - UINTN NumberOfBytes; - DMA_MAP_OPERATION Operation; - BOOLEAN DoubleBuffer; -} MAP_INFO_INSTANCE; - - -typedef struct { - LIST_ENTRY Link; - VOID *HostAddress; - UINTN NumPages; - UINT64 Attributes; -} UNCACHED_ALLOCATION; - -STATIC EFI_CPU_ARCH_PROTOCOL *mCpu; -STATIC LIST_ENTRY UncachedAllocationList; - -STATIC -PHYSICAL_ADDRESS -HostToDeviceAddress ( - IN VOID *Address - ) -{ - return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdArmDmaDeviceOffset); -} - -/** - Provides the DMA controller-specific addresses needed to access system memory. - - Operation is relative to the DMA bus master. - - @param Operation Indicates if the bus master is going to read or write to system memory. - @param HostAddress The system memory address to map to the DMA controller. - @param NumberOfBytes On input the number of bytes to map. On output the number of bytes - that were mapped. - @param DeviceAddress The resulting map address for the bus master controller to use to - access the hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. - @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common 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 requested address. - -**/ -EFI_STATUS -EFIAPI -DmaMap ( - IN DMA_MAP_OPERATION Operation, - IN VOID *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ) -{ - EFI_STATUS Status; - MAP_INFO_INSTANCE *Map; - VOID *Buffer; - EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; - UINTN AllocSize; - - if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL || Mapping == NULL ) { - return EFI_INVALID_PARAMETER; - } - - if (Operation >= MapOperationMaximum) { - return EFI_INVALID_PARAMETER; - } - - *DeviceAddress = HostToDeviceAddress (HostAddress); - - // Remember range so we can flush on the other side - Map = AllocatePool (sizeof (MAP_INFO_INSTANCE)); - if (Map == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - if (Operation != MapOperationBusMasterRead && - ((((UINTN)HostAddress & (mCpu->DmaBufferAlignment - 1)) != 0) || - ((*NumberOfBytes & (mCpu->DmaBufferAlignment - 1)) != 0))) { - - // Get the cacheability of the region - Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor); - if (EFI_ERROR(Status)) { - goto FreeMapInfo; - } - - // If the mapped buffer is not an uncached buffer - if ((GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) != 0) { - // - // Operations of type MapOperationBusMasterCommonBuffer are only allowed - // on uncached buffers. - // - if (Operation == MapOperationBusMasterCommonBuffer) { - DEBUG ((EFI_D_ERROR, - "%a: Operation type 'MapOperationBusMasterCommonBuffer' is only supported\n" - "on memory regions that were allocated using DmaAllocateBuffer ()\n", - __FUNCTION__)); - Status = EFI_UNSUPPORTED; - goto FreeMapInfo; - } - - // - // If the buffer does not fill entire cache lines we must double buffer - // into a suitably aligned allocation that allows us to invalidate the - // cache without running the risk of corrupting adjacent unrelated data. - // Note that pool allocations are guaranteed to be 8 byte aligned, so - // we only have to add (alignment - 8) worth of padding. - // - Map->DoubleBuffer = TRUE; - AllocSize = ALIGN_VALUE (*NumberOfBytes, mCpu->DmaBufferAlignment) + - (mCpu->DmaBufferAlignment - 8); - Map->BufferAddress = AllocatePool (AllocSize); - if (Map->BufferAddress == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto FreeMapInfo; - } - - Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment); - *DeviceAddress = HostToDeviceAddress (Buffer); - - // - // Get rid of any dirty cachelines covering the double buffer. This - // prevents them from being written back unexpectedly, potentially - // overwriting the data we receive from the device. - // - mCpu->FlushDataCache (mCpu, (UINTN)Buffer, *NumberOfBytes, - EfiCpuFlushTypeWriteBack); - } else { - Map->DoubleBuffer = FALSE; - } - } else { - Map->DoubleBuffer = FALSE; - - DEBUG_CODE_BEGIN (); - - // - // The operation type check above only executes if the buffer happens to be - // misaligned with respect to CWG, but even if it is aligned, we should not - // allow arbitrary buffers to be used for creating consistent mappings. - // So duplicate the check here when running in DEBUG mode, just to assert - // that we are not trying to create a consistent mapping for cached memory. - // - Status = gDS->GetMemorySpaceDescriptor ((UINTN)HostAddress, &GcdDescriptor); - ASSERT_EFI_ERROR(Status); - - ASSERT (Operation != MapOperationBusMasterCommonBuffer || - (GcdDescriptor.Attributes & (EFI_MEMORY_WB | EFI_MEMORY_WT)) == 0); - - DEBUG_CODE_END (); - - // Flush the Data Cache (should not have any effect if the memory region is uncached) - mCpu->FlushDataCache (mCpu, (UINTN)HostAddress, *NumberOfBytes, - EfiCpuFlushTypeWriteBackInvalidate); - } - - Map->HostAddress = (UINTN)HostAddress; - Map->NumberOfBytes = *NumberOfBytes; - Map->Operation = Operation; - - *Mapping = Map; - - return EFI_SUCCESS; - -FreeMapInfo: - FreePool (Map); - - return Status; -} - - -/** - Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer() - operation and releases any corresponding resources. - - @param Mapping The mapping value returned from DmaMap*(). - - @retval EFI_SUCCESS The range was unmapped. - @retval EFI_DEVICE_ERROR The data was not committed to the target system memory. - @retval EFI_INVALID_PARAMETER An inconsistency was detected between the mapping type - and the DoubleBuffer field - -**/ -EFI_STATUS -EFIAPI -DmaUnmap ( - IN VOID *Mapping - ) -{ - MAP_INFO_INSTANCE *Map; - EFI_STATUS Status; - VOID *Buffer; - - if (Mapping == NULL) { - ASSERT (FALSE); - return EFI_INVALID_PARAMETER; - } - - Map = (MAP_INFO_INSTANCE *)Mapping; - - Status = EFI_SUCCESS; - if (Map->DoubleBuffer) { - ASSERT (Map->Operation == MapOperationBusMasterWrite); - - if (Map->Operation != MapOperationBusMasterWrite) { - Status = EFI_INVALID_PARAMETER; - } else { - Buffer = ALIGN_POINTER (Map->BufferAddress, mCpu->DmaBufferAlignment); - - mCpu->FlushDataCache (mCpu, (UINTN)Buffer, Map->NumberOfBytes, - EfiCpuFlushTypeInvalidate); - - CopyMem ((VOID *)(UINTN)Map->HostAddress, Buffer, Map->NumberOfBytes); - - FreePool (Map->BufferAddress); - } - } else { - if (Map->Operation == MapOperationBusMasterWrite) { - // - // Make sure we read buffer from uncached memory and not the cache - // - mCpu->FlushDataCache (mCpu, Map->HostAddress, Map->NumberOfBytes, - EfiCpuFlushTypeInvalidate); - } - } - - FreePool (Map); - - return Status; -} - -/** - Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer. - mapping. - - @param MemoryType The type of memory to allocate, EfiBootServicesData or - EfiRuntimeServicesData. - @param Pages The number of pages to allocate. - @param HostAddress A pointer to store the base system memory address of the - allocated range. - - @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_CACHED. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. - -**/ -EFI_STATUS -EFIAPI -DmaAllocateBuffer ( - IN EFI_MEMORY_TYPE MemoryType, - IN UINTN Pages, - OUT VOID **HostAddress - ) -{ - return DmaAllocateAlignedBuffer (MemoryType, Pages, 0, HostAddress); -} - -/** - Allocates pages that are suitable for an DmaMap() of type - MapOperationBusMasterCommonBuffer mapping, at the requested alignment. - - @param MemoryType The type of memory to allocate, EfiBootServicesData or - EfiRuntimeServicesData. - @param Pages The number of pages to allocate. - @param Alignment Alignment in bytes of the base of the returned - buffer (must be a power of 2) - @param HostAddress A pointer to store the base system memory address of the - allocated range. - - @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_CACHED. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. - -**/ -EFI_STATUS -EFIAPI -DmaAllocateAlignedBuffer ( - IN EFI_MEMORY_TYPE MemoryType, - IN UINTN Pages, - IN UINTN Alignment, - OUT VOID **HostAddress - ) -{ - EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; - VOID *Allocation; - UINT64 MemType; - UNCACHED_ALLOCATION *Alloc; - EFI_STATUS Status; - - if (Alignment == 0) { - Alignment = EFI_PAGE_SIZE; - } - - if (HostAddress == NULL || - (Alignment & (Alignment - 1)) != 0) { - return EFI_INVALID_PARAMETER; - } - - if (MemoryType == EfiBootServicesData) { - Allocation = AllocateAlignedPages (Pages, Alignment); - } else if (MemoryType == EfiRuntimeServicesData) { - Allocation = AllocateAlignedRuntimePages (Pages, Alignment); - } else { - return EFI_INVALID_PARAMETER; - } - - if (Allocation == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // Get the cacheability of the region - Status = gDS->GetMemorySpaceDescriptor ((UINTN)Allocation, &GcdDescriptor); - if (EFI_ERROR(Status)) { - goto FreeBuffer; - } - - // Choose a suitable uncached memory type that is supported by the region - if (GcdDescriptor.Capabilities & EFI_MEMORY_WC) { - MemType = EFI_MEMORY_WC; - } else if (GcdDescriptor.Capabilities & EFI_MEMORY_UC) { - MemType = EFI_MEMORY_UC; - } else { - Status = EFI_UNSUPPORTED; - goto FreeBuffer; - } - - Alloc = AllocatePool (sizeof *Alloc); - if (Alloc == NULL) { - goto FreeBuffer; - } - - Alloc->HostAddress = Allocation; - Alloc->NumPages = Pages; - Alloc->Attributes = GcdDescriptor.Attributes; - - InsertHeadList (&UncachedAllocationList, &Alloc->Link); - - // Remap the region with the new attributes - Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)Allocation, - EFI_PAGES_TO_SIZE (Pages), - MemType); - if (EFI_ERROR (Status)) { - goto FreeAlloc; - } - - Status = mCpu->FlushDataCache (mCpu, - (PHYSICAL_ADDRESS)(UINTN)Allocation, - EFI_PAGES_TO_SIZE (Pages), - EfiCpuFlushTypeInvalidate); - if (EFI_ERROR (Status)) { - goto FreeAlloc; - } - - *HostAddress = Allocation; - - return EFI_SUCCESS; - -FreeAlloc: - RemoveEntryList (&Alloc->Link); - FreePool (Alloc); - -FreeBuffer: - FreePages (Allocation, Pages); - return Status; -} - - -/** - Frees memory that was allocated with DmaAllocateBuffer(). - - @param Pages The number of pages to free. - @param HostAddress The base system memory address of the allocated range. - - @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 DmaAllocateBuffer(). - -**/ -EFI_STATUS -EFIAPI -DmaFreeBuffer ( - IN UINTN Pages, - IN VOID *HostAddress - ) -{ - LIST_ENTRY *Link; - UNCACHED_ALLOCATION *Alloc; - BOOLEAN Found; - EFI_STATUS Status; - - if (HostAddress == NULL) { - return EFI_INVALID_PARAMETER; - } - - for (Link = GetFirstNode (&UncachedAllocationList), Found = FALSE; - !IsNull (&UncachedAllocationList, Link); - Link = GetNextNode (&UncachedAllocationList, Link)) { - - Alloc = BASE_CR (Link, UNCACHED_ALLOCATION, Link); - if (Alloc->HostAddress == HostAddress && Alloc->NumPages == Pages) { - Found = TRUE; - break; - } - } - - if (!Found) { - ASSERT (FALSE); - return EFI_INVALID_PARAMETER; - } - - RemoveEntryList (&Alloc->Link); - - Status = gDS->SetMemorySpaceAttributes ((PHYSICAL_ADDRESS)(UINTN)HostAddress, - EFI_PAGES_TO_SIZE (Pages), - Alloc->Attributes); - if (EFI_ERROR (Status)) { - goto FreeAlloc; - } - - // - // If we fail to restore the original attributes, it is better to leak the - // memory than to return it to the heap - // - FreePages (HostAddress, Pages); - -FreeAlloc: - FreePool (Alloc); - return Status; -} - - -EFI_STATUS -EFIAPI -ArmDmaLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - InitializeListHead (&UncachedAllocationList); - - // Get the Cpu protocol for later use - return gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu); -} diff --git a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf deleted file mode 100644 index e33ed92c9d20..000000000000 --- a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf +++ /dev/null @@ -1,49 +0,0 @@ -#/** @file -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# 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 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 IMPLIED. -# -#**/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = ArmDmaLib - FILE_GUID = F1BD6B36-B705-43aa-8A28-33F58ED85EFB - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - LIBRARY_CLASS = DmaLib - CONSTRUCTOR = ArmDmaLibConstructor - -[Sources.common] - ArmDmaLib.c - -[Packages] - MdePkg/MdePkg.dec - EmbeddedPkg/EmbeddedPkg.dec - ArmPkg/ArmPkg.dec - - -[LibraryClasses] - DebugLib - DxeServicesTableLib - UefiBootServicesTableLib - MemoryAllocationLib - IoLib - BaseMemoryLib - -[Protocols] - gEfiCpuArchProtocolGuid - -[Guids] - -[Pcd] - gArmTokenSpaceGuid.PcdArmDmaDeviceOffset - -[Depex] - gEfiCpuArchProtocolGuid -- 2.11.0