From patchwork Wed Aug 30 08:21:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111270 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552395ybm; Wed, 30 Aug 2017 01:21:24 -0700 (PDT) X-Google-Smtp-Source: ADKCNb5EDyCQfdXnL/WgNF4cM0CMUUPYf8Ji+vBCxepJmcVly9whlkcOLd7cBJK0AwXGyOM+ztuM X-Received: by 10.84.217.135 with SMTP id p7mr973585pli.170.1504081284142; Wed, 30 Aug 2017 01:21:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081284; cv=none; d=google.com; s=arc-20160816; b=QrR/LW7luJKCw4XYCobKAsljoRGs3vr43UrDdaoKcsfZLA4Gi4jUuFxeiMkACA54t0 FtV/CashEF+tbtZ8sNNa9cboZ2F7/Z/dkm7T4lL/4JRp9Re52LN4VA7Qpa+cyNZw+fMs gEWiexq60ybUv7fPlDAjdDsRS/T+nq0x17R+X8QrOiv7J/qTUOg5Jn4+cV+E5+jiWjKO h5QygNylxkAP4iIffor1JbtolcyLNhoAAI+ezfWGwOZ9a2FanPYupXnVeNtVB3viM6NP qf5RLltGE6f77UmfLCMIRNfB4gPqZGLWyVsEkPYnz4Ubag2jaEC8X24zw9max5GwHTt3 9M+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=6MCVGd1fYlawR7bqWQCjWrAys7BcRWc3fQtjTjSAlS8=; b=FbyRhJqjab2L4+6KbXUEg6wQphnkVXv1NN67UoclmuL0h730z1cduOr0sofu2Wwz14 l5FMvH8DStec4/FXaX37zv7+C1jfKIG+4/BXRH9CyZVYQCgCAWkXyoPZx+odleOVZxe/ 1gxsTo6TWuSGbUaIV7pJ42OCfEErrs4V4h7ay65KynX5u0L6ITKUKn5nW9Io8kS1TZO6 82fmuFylqNhz5H8rgXirs2Lrx3Y73fX1gzIWyhWPb01zCUn0fVGCWBcoBi/H6V0hntXU JLyWyujAw4zoQH+KWgSHb7UlgtWL3Apoe6nJU1bEfa/HEDzcHqv431c5iBEGS6ITNgxr SCxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=KI0SxcMq; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id y14si3938822pfa.367.2017.08.30.01.21.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=KI0SxcMq; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 02F4921E95E18; Wed, 30 Aug 2017 01:18:41 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wr0-x22f.google.com (mail-wr0-x22f.google.com [IPv6:2a00:1450:400c:c0c::22f]) (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 2275421E95E11 for ; Wed, 30 Aug 2017 01:18:38 -0700 (PDT) Received: by mail-wr0-x22f.google.com with SMTP id j29so15396670wre.2 for ; Wed, 30 Aug 2017 01:21:19 -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=mrT7UhGcKB0nUxxC+2EHq3NEDxmSeoKA38UjCQL4iMs=; b=KI0SxcMqMPgP1M7HhEKVkajSDq99coP2IYUPHv44OxEvQU321oFi2r8VKh4LBSIpF9 ZF+XIdAgBiCNYAPlYgkWtLU6EKIfAeedGiLOYFVHtDFv8Cdp+8vvv5QG1aoOR2OUoBFf aU9CKCMOV5QMWQ7MokbD8wj0zW4IaMe3hLH/g= 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=mrT7UhGcKB0nUxxC+2EHq3NEDxmSeoKA38UjCQL4iMs=; b=oA69riFvzCdKpKVkBD9VmCEAuGqDs4Uqqgag51hg4btenDBUtDKdV4ebI4QNlN6tzR +F0BvXYex6Ob3qbPTHzJzftoisrrPKJ6sGDFpPPMH6dwsym4t0TxAAj5BcuJstzJ+TN4 +Ehxw2rk9/+445QKCChXNGGmZzc0pkkh+s23AFsIL1xlqA+TSGPD7q00GWN0/YahwSlO UjDwIs9s5K25TP28QMACLTWfV8S5U2wXjruiMwufslu2cF/p1J8X9PlN6MXjpQMN1la7 5w00VIE6gvcB9hMiPNge6XDXwS4QxCcVfiSzNZj0J7JXimOBIbzuR8PYUNWvqLaKOZqw 1YXw== X-Gm-Message-State: AHYfb5inVLNQm3BKCkSdI7p50xtffPFQ1CcX0dw5oiHkGs5KErczdzVW xKxexX3j1nqUCagctfvVQg== X-Received: by 10.223.134.161 with SMTP id 30mr509792wrx.147.1504081277843; Wed, 30 Aug 2017 01:21:17 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:17 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Wed, 30 Aug 2017 09:21:03 +0100 Message-Id: <20170830082108.7470-2-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: [edk2] [PATCH 1/6] EmbeddedPkg: rename NullDmaLib to CoherentDmaLib 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: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Rename NullDmaLib to CoherentDmaLib to better reflect its nature, and to better convey the fact that it actually serves a useful purpose, i.e., as a DmaLib library class resolution for drivers that control hardware that may only be cache coherent or in some cases (i.e., on some platforms but not on others). Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- EmbeddedPkg/EmbeddedPkg.dsc | 2 +- EmbeddedPkg/Library/{NullDmaLib/NullDmaLib.c => CoherentDmaLib/CoherentDmaLib.c} | 0 EmbeddedPkg/Library/{NullDmaLib/NullDmaLib.inf => CoherentDmaLib/CoherentDmaLib.inf} | 20 ++++++-------------- 3 files changed, 7 insertions(+), 15 deletions(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc index 4a34e34843ad..84c5a842e37e 100644 --- a/EmbeddedPkg/EmbeddedPkg.dsc +++ b/EmbeddedPkg/EmbeddedPkg.dsc @@ -250,7 +250,7 @@ [Components.common] EmbeddedPkg/Library/TemplateResetSystemLib/TemplateResetSystemLib.inf EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf - EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf + EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf EmbeddedPkg/Ebl/Ebl.inf diff --git a/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.c b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c similarity index 100% rename from EmbeddedPkg/Library/NullDmaLib/NullDmaLib.c rename to EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c diff --git a/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf similarity index 78% rename from EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf rename to EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf index 38261d5ede2b..c40a600cf6a3 100644 --- a/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf +++ b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf @@ -1,6 +1,8 @@ #/** @file # # Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
+# Copyright (c) 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 @@ -12,15 +14,15 @@ #**/ [Defines] - INF_VERSION = 0x00010005 - BASE_NAME = NullDmaLib + INF_VERSION = 0x00010019 + BASE_NAME = CoherentDmaLib FILE_GUID = 0F2A0816-D319-4ee7-A6B8-D58524E4428F MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = DmaLib -[Sources.common] - NullDmaLib.c +[Sources] + CoherentDmaLib.c [Packages] MdePkg/MdePkg.dec @@ -29,13 +31,3 @@ [Packages] [LibraryClasses] DebugLib MemoryAllocationLib - - -[Protocols] - -[Guids] - -[Pcd] - -[Depex] - TRUE From patchwork Wed Aug 30 08:21:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111271 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552435ybm; Wed, 30 Aug 2017 01:21:26 -0700 (PDT) X-Google-Smtp-Source: ADKCNb6pL7swLGOd3Grx88Twix+VIo5d1eKdKLHOzOSNWEC/GaR2a9hfd7q/sq1vRj0sRW86rRLo X-Received: by 10.84.217.25 with SMTP id o25mr958097pli.320.1504081286700; Wed, 30 Aug 2017 01:21:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081286; cv=none; d=google.com; s=arc-20160816; b=CupU64/2VrCzISz/afkSQ5aF2C+YVcR589HudR1o9Rsbnry8QXP+IEXLYjUJZl59e7 gnX041w34qCQ62G9apFcnioLXyseTkOhRajjwMWJqaVjPdc9to+gvRJ1WuDhUHfn66rH LGdUXDnD/sR1jw7v6x4Hzo2joI8d6PRa91xfuQx8JNphxCszXEWLAhP/7aLO6U5o8MFj DJp4DQ3xg3qDWSOqYiO/pmohc++5luX8qC2jiA5r84nH3WAPoej/xSGiX/PSZBrnl8AP t1ui/6SXpijR0yKhFugYdydoFUB66sYt7LAdLkJ9m7dv/GBWVcRag41nwZPzktzUc037 U22A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=djf3c5dGXjJUuUrOk5s6gvC0D3egUSIMDU7Mgi81Pcw=; b=Pj+3RlpTEP2tRKJmDYiKMXh90RnIiTu4qep18s8KWUnxrheJH4v0pHe/4oU11gJyzH KpndYuXXp4Pm9nFvbhZWdxiuLbrJZAxfROT/SX2ECs0CNzI/0h2NGeVidFyMIcMYGHXS L13VtGQCIt+UcoWflKLzOnV93BC7gnQFWRb/VLIQxkVjinkPnBjE2sci5BnKczevbgLO ZwEMD9juYKmFhTZLrqw2WsJ25a+c0r/XGYjvroXsg1f1uA4cpqEmB454/EhHCXjvsiHc IG6ouMmYwe+KPaVxOKymxUDEDMx6XrTHpyDwkzyixFVhJ0CiriFYNG/QjsgEo/6YVuz3 P3bQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=R5b//KOw; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id 14si3962864pfh.386.2017.08.30.01.21.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=R5b//KOw; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 3C61221E95E1B; Wed, 30 Aug 2017 01:18:41 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wr0-x22d.google.com (mail-wr0-x22d.google.com [IPv6:2a00:1450:400c:c0c::22d]) (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 AAF2421E95E0F for ; Wed, 30 Aug 2017 01:18:39 -0700 (PDT) Received: by mail-wr0-x22d.google.com with SMTP id k9so4035687wre.4 for ; Wed, 30 Aug 2017 01:21:21 -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=SgtBES6SoFg23UKzdJujgYroDdhbOcZqSjp3kaa8R+A=; b=R5b//KOwKBnGJ5lcED39JT21ICC4T7APPBx4JVupzkMZo+PBRKKpCVKrOIz8DuA9n4 oYeP0w+dOA49eGxvqRq4up7EOmbSfEbK2IpOqFx8wz0W2xPD7cS0jgIjlyfwgHiuo6a7 IjkSK5C8VN1b4d3pTrocTAIHeNstxCmZCyks8= 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=SgtBES6SoFg23UKzdJujgYroDdhbOcZqSjp3kaa8R+A=; b=QajPVR4AYbiW7XgzMniZRG+TeZpuLAgC0BbybFn4fGydDF2Z8QmTiW79kJJloBfHS+ QigaNSLuIuSSoZA4MDFgrVyjO69Ysl2Cf3S9BYOQ1XvF/AEJXpgYYm/gYrao+7nINq03 FY/h5WouZeEtOPC2ZFJVUWQ12a8GheoqgaAuOAHoYDbfMf7GyjJoj3vyqubTtsVio80U qfRHPWbseNT0XBv4uQr8tycCC2HoI6iTwYQ6E2uGeiMYffrFgjEQ+bNt5z5weHU4zXAc /Hcx8WWWHA2ybCqdOrrAZp7wav10D1vTzjnXhxdch/1ceOB194XJtfk6hTFdib2WvWMp eJsw== X-Gm-Message-State: AHYfb5gwuigx1ytg4Sb8Ba0kSxRM/w01cNbXfXo+AHnW0jqew079evhm SGEi5moPBPUpikm9eaWI0g== X-Received: by 10.223.132.39 with SMTP id 36mr538117wrf.69.1504081279505; Wed, 30 Aug 2017 01:21:19 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:18 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Wed, 30 Aug 2017 09:21:04 +0100 Message-Id: <20170830082108.7470-3-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: [edk2] [PATCH 2/6] EmbeddedPkg/CoherentDmaLib: add support for non-1:1 DMA translation 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: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Bring CoherentDmaLib in line with ArmDmaLib, and add support for defining a static offset between the host's and the bus master's view of memory. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- EmbeddedPkg/EmbeddedPkg.dec | 7 +++++++ EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c | 10 +++++++++- EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index 8ad2a84c045c..ccdf38e36a8c 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -208,3 +208,10 @@ [PcdsFixedAtBuild.X64] [PcdsFixedAtBuild.common, PcdsDynamic.common] gEmbeddedTokenSpaceGuid.PcdFdtDevicePaths|L""|VOID*|0x00000055 + + # + # Value to add to a host address to obtain a device address, using + # unsigned 64-bit integer arithmetic. This means we can rely on + # truncation on overflow to specify negative offsets. + # + gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset|0x0|UINT64|0x0000058 diff --git a/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c index 4cbe349190a9..564db83c901c 100644 --- a/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c +++ b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.c @@ -19,6 +19,14 @@ #include +STATIC +PHYSICAL_ADDRESS +HostToDeviceAddress ( + IN VOID *Address + ) +{ + return (PHYSICAL_ADDRESS)(UINTN)Address + PcdGet64 (PcdDmaDeviceOffset); +} /** Provides the DMA controller-specific addresses needed to access system memory. @@ -50,7 +58,7 @@ DmaMap ( OUT VOID **Mapping ) { - *DeviceAddress = (PHYSICAL_ADDRESS)(UINTN)HostAddress; + *DeviceAddress = HostToDeviceAddress (HostAddress); *Mapping = NULL; return EFI_SUCCESS; } diff --git a/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf index c40a600cf6a3..f64d780e16ed 100644 --- a/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf +++ b/EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf @@ -31,3 +31,6 @@ [Packages] [LibraryClasses] DebugLib MemoryAllocationLib + +[Pcd] + gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset From patchwork Wed Aug 30 08:21:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111272 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552480ybm; Wed, 30 Aug 2017 01:21:29 -0700 (PDT) X-Google-Smtp-Source: ADKCNb6hYCLHewvkvuby+11PrqJdo79amdOWQFb9hSfXyQBMdkWju+BQ8PzQlC9YQ15ae7i8Ke7m X-Received: by 10.84.129.14 with SMTP id 14mr1032718plb.38.1504081289866; Wed, 30 Aug 2017 01:21:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081289; cv=none; d=google.com; s=arc-20160816; b=nzJm3K7hu5sWA2IJlIVd0oyefRwpF9qDrOMz4Ls1IgBCxow8XHkjBoyBUKA7GsuqCs bQNR02Kq1kf9R9zSjtfSkZYEnNOkDLCnCZ5dJ0ngFV59iaNOhPNtD78PtR1/khWCrI3S 5qLsWzZ3UEay6uxFj4n51359yylXn4dOEbc6cOa9loOs1jXgWMO6hX+QYToNNfG6w0MN DX4/SyV9j4mj6ynFIPNWJ4AkY59XiKHtEmjp8uUn3nqhpG08FdLB+9d4w2xC24o98+sj 3SFr1unlvXWcdlmSkgwC0zSDOU8QPKAixu8BoorbC50XyUNneno4S+I24V/0f/EU7v1i gLnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=hlkGZ6rDn3vgg7YWAmCotoIqmhqFwN2+q16oI7uKdr8=; b=OOQKE5P2RVO7E0CpN4Q6Zl3abB4RnRAj33N4m0OB/Ldng82cFu5sazVSjY4Z6B03h2 qvkWvPB+lpPNhmQokqc3VLeHQahaCniWbKFQyLOiihSBR8O8zYMu8ob0eihDJup92Y2V dgTTE5+ywMxLvZUXZQs9usgrK5FdvcwocgqMwOy30S0xdlQ4aglodp9VI9Xpscq/727w 8eethrstsM12MAvTU23LzKZpHUKBBZpe2aHBHFu2hL7/4mx4NshUWKFR1J8XOGTUvl8H 36gpNR6Ht6sc9nOJR4d10qUOpMputTkxjTJZh4bnlU9fA9Q+0mjtvUkmjoz9Kjjkpqyz zlGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=NF9aVs0K; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id g11si3916097pgf.370.2017.08.30.01.21.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=NF9aVs0K; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 785D621E95E1F; Wed, 30 Aug 2017 01:18:43 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wm0-x22a.google.com (mail-wm0-x22a.google.com [IPv6:2a00:1450:400c:c09::22a]) (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 8066921CE748D for ; Wed, 30 Aug 2017 01:18:42 -0700 (PDT) Received: by mail-wm0-x22a.google.com with SMTP id e62so41193wma.0 for ; Wed, 30 Aug 2017 01:21:23 -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=w+mcBc8HJUBKAOGbwM5mTjs+aOMJTAFuhmnMjx7c4Yw=; b=NF9aVs0KvJRmM4EU2ZBsvV82CBqtFsU0ShXPiePlRgBZ18qfpL+EwHEHz7oJGaNnqD gxnuDW27hsZRH+w4XpI/zXBcaYGYtytmP/ANSAJ0NlJ+X4EocHJLrRjhFdPpu2tZ5z07 /TABMe8R92ZiZ7iHx1CQI8XHqFst46ANgiYD0= 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=w+mcBc8HJUBKAOGbwM5mTjs+aOMJTAFuhmnMjx7c4Yw=; b=NDCkfSzj6fFskwGxKeR8Fic4TJurL8OXq2wkkOFLJa8cJTVClCU9DB4EO1SKHn3HUb FGpZSDvIPgPtCgTw9pa1iL++Yrga9NRLLsBIuA9WgwhOfkFF+8d78CcnZTZ8VFc45a+d xbHeLNevAHwuikY99ComNlh+ExqKM6dhaBDRH2o1ukif/fg4QNLmrl2wy0roUihUpPvO jJu27/CvWEW4E0XtqnrpDJaUG26NAKtI7h9yxdaaNmTxhwis8EydkjmuSreQ0Cruy48J lAO+uEpV16wk/NmcOpsSDicwO2LiHuSTIQRBgLSoWJMNoXbepTtt8Pb2kfN0YtKNDUFo W+Og== X-Gm-Message-State: AHYfb5i86IylfX9Ntc8V9e/2AlxmrdoVeo94OlK50fQITn2wc39tP1m0 n7nVz9ABgQqGMvBUjFMPsQ== X-Received: by 10.28.129.67 with SMTP id c64mr883699wmd.79.1504081282015; Wed, 30 Aug 2017 01:21:22 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:20 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Wed, 30 Aug 2017 09:21:05 +0100 Message-Id: <20170830082108.7470-4-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: [edk2] [PATCH 3/6] EmbeddedPkg: implement NonCoherentDmaLib based on 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: , Cc: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" The non-coherent DmaLib implementation in ArmDmaLib no longer relies on anything in ArmPkg. So clone it into EmbeddedPkg, and rename it to NonCoherentDmaLib. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- EmbeddedPkg/EmbeddedPkg.dsc | 1 + EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.c | 491 ++++++++++++++++++++ EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf | 50 ++ 3 files changed, 542 insertions(+) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc index 84c5a842e37e..012721a332f4 100644 --- a/EmbeddedPkg/EmbeddedPkg.dsc +++ b/EmbeddedPkg/EmbeddedPkg.dsc @@ -251,6 +251,7 @@ [Components.common] EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf EmbeddedPkg/Library/CoherentDmaLib/CoherentDmaLib.inf + EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf EmbeddedPkg/Ebl/Ebl.inf diff --git a/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.c b/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.c new file mode 100644 index 000000000000..08b9c017f426 --- /dev/null +++ b/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.c @@ -0,0 +1,491 @@ +/** @file + + Generic non-coherent 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 (PcdDmaDeviceOffset); +} + +/** + 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 host's + 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 ((DEBUG_ERROR, + "%a: Operation type 'MapOperationBusMasterCommonBuffer' is only " + "supported\non 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_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_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 +NonCoherentDmaLibConstructor ( + 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/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf b/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf new file mode 100644 index 000000000000..9f430d6c3721 --- /dev/null +++ b/EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf @@ -0,0 +1,50 @@ +#/** @file +# +# Generic non-coherent 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. +# +#**/ + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = NonCoherentDmaLib + FILE_GUID = 43ad4920-db15-4e24-9889-2db568431fbd + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = DmaLib + CONSTRUCTOR = NonCoherentDmaLibConstructor + +[Sources] + NonCoherentDmaLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + DxeServicesTableLib + IoLib + MemoryAllocationLib + UefiBootServicesTableLib + +[Protocols] + gEfiCpuArchProtocolGuid + +[Pcd] + gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset + +[Depex] + gEfiCpuArchProtocolGuid From patchwork Wed Aug 30 08:21:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111273 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552533ybm; Wed, 30 Aug 2017 01:21:33 -0700 (PDT) X-Google-Smtp-Source: ADKCNb6uLJ3DKtsiEgR04Oz6mjrfU4j7q7E+gUC0JmRKEt+Lu66r1w365R8ivXi0KGyXa+czGRRv X-Received: by 10.84.194.195 with SMTP id h61mr945968pld.435.1504081293195; Wed, 30 Aug 2017 01:21:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081293; cv=none; d=google.com; s=arc-20160816; b=AEmNWKUr94FCXtvXRBL2g5iXo6nD79ZL+4bqh2Dqc5iBwx3KtnpcmMK+owIlklNPOW x+t+pYQqilMlHVIaq1g6x9XmA4GHGgA2ltHwYAQbwYhhoYEuDNIFYlZVa5VcZ8M5MnKr p8WEBVVYe1i4GSkuqfHdvalTKXgNdI8m/OgwXvwyIATqNjLqWGLDphIqbrP5hxK22sIn RoD0sFE5ryKwlXpE3Ij6Mk8qP8N5+aWI05qzfK1PIETFJ6b0VISMZ5lqihslPaVWRy5j 7YHY5+Y3Vr3cGw6n7KnFpfK1ZFXLMDAuCuqFkck93eCegK06g7SgIcxHiDzj4Z1j4CR5 Z3rA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=cCFhXMKmMrIEVGfR/OOTPSZbmNXXw2Bl5WqJ9IMtHC4=; b=tQUCMdcYdFHfZz9biGVdkOxBrgM+wdRIej0VkBA62HIRCxRYbivz7KGousJBfdHb0s ozxGftDn7fh24LV+BrmImHQOTzfrSSDhohXDUOvunW5c1D4lVY2rLgfyi28Cgd2cynCK kMd5BFdZ/U3ZhFJGF4sBDijhmV5osFuSZCR1HfGu3bq3oaRNH+175NrUYy2w63whj4R9 zZdZNITd5nKKWeIH89r/Sr9CBYHYaW/0CKT0Y7HZwkMpQwBRuRAIYo5YNBnvtYIUDeBd 4x72dxnzle7srN1MzXvadTtd39MWez5iSIndRiZK7NOsGoeNUtJbqQXlY5Sx9tBnu7oe Em7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=V+E25679; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id e19si4039884pgk.193.2017.08.30.01.21.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:33 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=V+E25679; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id C316E21E95E17; Wed, 30 Aug 2017 01:18:45 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wr0-x22e.google.com (mail-wr0-x22e.google.com [IPv6:2a00:1450:400c:c0c::22e]) (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 A7CE621CE748D for ; Wed, 30 Aug 2017 01:18:43 -0700 (PDT) Received: by mail-wr0-x22e.google.com with SMTP id 40so15791229wrv.5 for ; Wed, 30 Aug 2017 01:21:25 -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=2j4k4SAyLPHjr3TtxjkoXPKGWN1eEaxXzdL3pCmMCEg=; b=V+E25679YlEfp+PO91CYCxqqvnp4rlQuqs6GquFJlD74Oy/Xhvih6zhSfODNNN/zF0 Tg8s8cRm97jdjZsI7SYK3OuSKa2ppjCacLAO043kpJzxXGGBORTOMK3OwWs0nLMTZ5dv pkqhYpEeFHHMS3dVFAAMhvymK2wRyUCMe+N1w= 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=2j4k4SAyLPHjr3TtxjkoXPKGWN1eEaxXzdL3pCmMCEg=; b=SdJUFHcGVAAVTqU79t1GF+ZYVxRkn/08MyK3gwWrbXaUG10WeEFN+v3Pi7l4SGkBNM meZCu5Yack8mIAmYx+D7CsBbTCrt3HZEu8jeCseXVjKNAvSm0U0KZEThvCb5nUn19oGu meVEuscMdeiy0BuQwK1L4lSMpMSdR8R21sWmIk4hH6Rk86Ed7jbCH8fqCA0g9p8TLlp8 hye24Qfqwmsz+nYIUgtkzr+SqxRCDvhxE3n81+G/nUhc+WU+zR5232lBZBEIjSOp89OH FenLxtAksftL+LOiOKl2B3n/3lGOPC5UOKdRZhoEIGN7RtagNl7hOHkO23RDoYK5N7kW sdtw== X-Gm-Message-State: AHYfb5isxZVOHM3Yx53SwN3OfecX3f1KjAojxN2K7JmpHqYsH15E+8oW ruax25fsI0EPMFhF11K6tg== X-Received: by 10.223.199.135 with SMTP id l7mr611823wrg.94.1504081283549; Wed, 30 Aug 2017 01:21:23 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:22 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Wed, 30 Aug 2017 09:21:06 +0100 Message-Id: <20170830082108.7470-5-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: [edk2] [PATCH 4/6] Omap35xxPkg: switch to EmbeddedPkg's NonCoherentDmaLib 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: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Replace the reference to the ARM specific ArmDmaLib with a reference to the generic NonCoherentDmaLib. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- Omap35xxPkg/Omap35xxPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/Omap35xxPkg/Omap35xxPkg.dsc b/Omap35xxPkg/Omap35xxPkg.dsc index 941bc97060b9..c5d9746104e6 100644 --- a/Omap35xxPkg/Omap35xxPkg.dsc +++ b/Omap35xxPkg/Omap35xxPkg.dsc @@ -61,7 +61,7 @@ [LibraryClasses.common] DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf - DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf + DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf TimerLib|Omap35xxPkg/Library/Omap35xxTimerLib/Omap35xxTimerLib.inf From patchwork Wed Aug 30 08:21:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111274 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552592ybm; Wed, 30 Aug 2017 01:21:36 -0700 (PDT) X-Google-Smtp-Source: ADKCNb6k8KzVSWr25rDKhp5GoBgqRu3qTnLhz9P8Y/rTpV4kS7hREyqZAsNq4ArswwDHiTE6my0B X-Received: by 10.98.248.2 with SMTP id d2mr834824pfh.336.1504081296669; Wed, 30 Aug 2017 01:21:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081296; cv=none; d=google.com; s=arc-20160816; b=GRsetvzg+zgOjGF+ToYYomNUo13Q6Mx/QsztcJJj3UyGRi9k9E5I5Mceo3LIZgHd07 44oD8GHi+6vGs4IPCmTzNLMafAlXSBWjMkwBfYq8YK9a/mo0rgrDKzDYqcIPjIV7YhYX nbkF+wSdA19kwFyKwwpBL15j6h+HMj7D4P3i/Yp7CQt0oUFXY8fjMw9itm9vD8S/2j/y n4i/tUjMuUdIuL561RaPEZI9BL0rE8zd1Hj3n+A2FU6toyBJgVh4sTLWQrIfLCkc/oB1 tHTDUvtX96EpkJS4aC0YfcPl3Eyjn2SrPCzKjP9A36NBlnCeHJK7pgHyRTDsuGVVsNyE isyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=ZyGuk3AomKni1Nq4uCem8fLs44cDs3GZuX3vA12bBMg=; b=t5rRF9/b5VH5XT346zFpHlm094UBluiAVcGtq/AdVTemSejIYTGVvw/TMbyUFNsSHR gCKkOaebU2LAkSnfHmOURqH1RAKuhBmY+KkjuX1NuSENaG4pZXMymkW+9d95ey9mR327 EQccnMo7wcBLOrplODKJalV2oWQFE7vDAciOQP//I/iUVUGet2Hi8DQt3W+yG5Me5akQ XvHXpIESZZFKdzdeeUa51ycsAloOaykd7uIu9EhbhyAQgnHTmmR/4suK1S+mtaVogfe8 Wzz04/AbYcskoQNcwJNVlfIvNErxQOqGZ72DAAoZjlczIkeTGC/c7sf5SskyJZq2RKtP 9J2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=HmGu8t9q; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id 32si4162543pla.249.2017.08.30.01.21.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=HmGu8t9q; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 182C221CE748D; Wed, 30 Aug 2017 01:18:47 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wr0-x232.google.com (mail-wr0-x232.google.com [IPv6:2a00:1450:400c:c0c::232]) (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 EC5A321CE748D for ; Wed, 30 Aug 2017 01:18:45 -0700 (PDT) Received: by mail-wr0-x232.google.com with SMTP id z91so16347382wrc.1 for ; Wed, 30 Aug 2017 01:21:27 -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=JEqthR6gIBJKSfb/I1iP++2EXRabkcc6JkbwHgIKo0M=; b=HmGu8t9qeyVSDvAPSsYvR1wC1eV3W2agga8zVgvtpILlAx2FMGdnTUnfj35a/+QLVq GWNwCa8wPj5xf4yfle9hRYD4P2WUyHbtPQgAquJAf29gMZla4YMC5yry5qfQHJfB6dkb mIuW1z9Rxrqh8rZUG7/r7fMwvKIBnr2dh1ThY= 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=JEqthR6gIBJKSfb/I1iP++2EXRabkcc6JkbwHgIKo0M=; b=G89npwKKW6dZkDaBCNDpDBeEuwavcHyYY8Re9KrPZDNR2YlpMee2yOf2q8NHBuK1+A 1KAwtcSMZQHkYr5WeyZp5FD7QP6CbSqAFlHsTZ0MqW0qXH1u5o5cswXi6I6hZQG4cfi+ b1NRhU+cN/dtUKhxiVUK3TZbAy+OkYVescOHBsllFXo4m8uGxkVHr55Br3rYFFJna+oc W/Xv4W4gimcw4eDtYjwX1xHhmE7b0ahFxHWKNvewlL6OaA2ZgWZSDBMCWrwGt1/qwlXM SY/ysz58j18qIWeJFbAuQu6653zxoc6bNk+eq7c43UR7aOUtg+HZrU0KOZQzmxOlFFi0 6Tkw== X-Gm-Message-State: AHYfb5hy4Ta+gT5sfYxLkHRSOthCIyBeFY5DdeM+3x0yMHbFTEY8GTd1 DcwWQKFuGof9fHufyOofUg== X-Received: by 10.223.192.14 with SMTP id z14mr510846wre.292.1504081285661; Wed, 30 Aug 2017 01:21:25 -0700 (PDT) Received: from localhost.localdomain ([105.133.189.215]) by smtp.gmail.com with ESMTPSA id h8sm3051642wma.46.2017.08.30.01.21.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:24 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Wed, 30 Aug 2017 09:21:07 +0100 Message-Id: <20170830082108.7470-6-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: [edk2] [PATCH 5/6] BeagleBoardPkg: switch to generic non-coherent DmaLib 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: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Replace the reference to the ARM specific ArmDmaLib with a reference to the generic NonCoherentDmaLib. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- BeagleBoardPkg/BeagleBoardPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/BeagleBoardPkg/BeagleBoardPkg.dsc b/BeagleBoardPkg/BeagleBoardPkg.dsc index 84aae84ff52d..30f6fd02e82f 100644 --- a/BeagleBoardPkg/BeagleBoardPkg.dsc +++ b/BeagleBoardPkg/BeagleBoardPkg.dsc @@ -122,7 +122,7 @@ [LibraryClasses.common] GdbSerialLib|Omap35xxPkg/Library/GdbSerialLib/GdbSerialLib.inf ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf - DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf + DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf From patchwork Wed Aug 30 08:21:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 111275 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp552651ybm; Wed, 30 Aug 2017 01:21:39 -0700 (PDT) X-Google-Smtp-Source: ADKCNb7gbXYhXgiVBf2By6NQoaKoFGjqk4UbE8QS5iUaSsBU+yL/s1D7HzSRlvOedUcbY9Sumw7w X-Received: by 10.84.224.8 with SMTP id r8mr964736plj.278.1504081299767; Wed, 30 Aug 2017 01:21:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504081299; cv=none; d=google.com; s=arc-20160816; b=k5WhsaC/N7tPxZHooTl8peVBBtoH5DJLNB/jqx1hwkXHgh0bB6N9lNGtIhU/JrgjCE tVEvCsHl7szobpP9UNb1OppSM02at+6gHKr7TzCCSAewHLuVQGfls7pa5S5et6d3e560 v0JLlOKiXN0NP0mN5ong6CN1jlSBwTDgQx0l+CouwKGxQGgTLBIXuxfNO+tvn0Zlrc6R w7SOzzuJKQrVNx5XCJfE3a1TnO+of5liVEvC6Bu+NuFuuUKE3FOw6fzB9LgOsYbCd/XM 5H3Zm4kSvIVYE1qJNJ5e59S4ApcF8vdnJh8U7ok3DbKbXL5ZW2zGupH9eJcLGgGF4Xcv TeAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=lxLF9RNfq0N3Qke4dk1QA0RPBsocD2+NMm54Iy3PDSU=; b=OY9SFOaPioidW3IsEe217+8TDK/Yv4DZ/C7dZUSkEKn9ac5drVVwSkOBd6XrYRrL8H xbFz5Zl44ml41uZtMoUVtQ6Ej2qHabMfXySsk9wnwL84rGX1Km/VYK4nDA5qF+GXVuVN neSBABBnKbJj5NIwSalFnlbcha8rpnYD2V0hR/z2dtQy/EtBWSre0jedalZBL+gU+VZN JsiQzE+FOmNljArhkGW/UwExkfZt/HiY09wQcW/3YM9o4NNeffjtEqA0a6o6bcwx3TOa e0U0+vwgzazOQG+/XHHMPJvX8Ocvq5h0bBQy9zDkdhzhLZ7H+KnGOr+klLCtA8Y0Gkht xDhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ceGfu96w; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id g2si4029519pgu.653.2017.08.30.01.21.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Aug 2017 01:21:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ceGfu96w; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 59A0A21E95E16; Wed, 30 Aug 2017 01:18:50 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org 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 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: [edk2] [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: , Cc: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" 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(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel 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