From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::344; helo=mail-wm1-x344.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) (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 28A2721195BDA for ; Tue, 27 Nov 2018 06:54:26 -0800 (PST) Received: by mail-wm1-x344.google.com with SMTP id z18so7434172wmc.4 for ; Tue, 27 Nov 2018 06:54:26 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=vZ9tHQXB4Z+ntuv5cvpirNh36JERSCZLGNcUzo4/wjE=; b=ZB+ebDJW5d3SfkqeIzlS13rfd3XzDjU3kZvOhQRVVNQduxO/1/h0D/Vk647AtpKrHT LFNqxIqHDj7ymRYpilOhAg5ELMUb43m5F4skh1+idaBD2XbicEcpu2HkgasOY/SqXUU9 ZexacLBDKZCa4iKrMKeavs3fRvg8HWwnRE1K8= 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:mime-version:content-transfer-encoding; bh=vZ9tHQXB4Z+ntuv5cvpirNh36JERSCZLGNcUzo4/wjE=; b=agbEVnALUrWwKrsP9y/szGLF6omEeuuUKdo9R7yqdFF6V/wI4XeIHerEZYu2c+mB5o eq5MTowxGs+94F73y8RQ3O2ZQ7NnyzMVS+2exRgFa/nRk8uLbEI34sCaxx8vvOuIs9oH nSI3mlDC4zmqRbNG9him40X+N938G9aBQoVYyNdV8Q5a0F797aXhygGd45Q+G0ep6xdD MQI0na39s9tkOdBVyDsfuLex8u3U8/xX66qydZ4wc/I3nLbE6tOj7hSZUPXReX0guZrB 0VJSRKOFzUeShtTCoiPG/1pqQn0pZjS6FUsC+9IN09HknMPPbn2afmm9uxSgeRlDv3m/ EqVQ== X-Gm-Message-State: AA+aEWYNZY7F3NnAVFmB6bP5b6qxVRgGwz8y15ReEtiUYCrZoMQ3LGU0 U7ADZm0Ju307E/iC5+ZVWJb5f5TUInQ= X-Google-Smtp-Source: AJdET5cXBkkRQvE6efjbJwigINeRnT1v2D4visV2xIMVltogUVjMRnkroqP4FAsmiLJoRFhYagU5ow== X-Received: by 2002:a1c:b1d5:: with SMTP id a204mr28403193wmf.32.1543330464277; Tue, 27 Nov 2018 06:54:24 -0800 (PST) Received: from harold.home ([2a01:cb1d:112:6f00:f523:5d63:a56a:3d76]) by smtp.gmail.com with ESMTPSA id v19sm4828490wrd.46.2018.11.27.06.54.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Nov 2018 06:54:23 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Cc: Ard Biesheuvel , Laszlo Ersek , Eric Auger , Andrew Jones , Philippe Mathieu-Daude Date: Tue, 27 Nov 2018 15:54:17 +0100 Message-Id: <20181127145418.11992-2-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181127145418.11992-1-ard.biesheuvel@linaro.org> References: <20181127145418.11992-1-ard.biesheuvel@linaro.org> MIME-Version: 1.0 Subject: [PATCH v2 1/2] ArmVirtPkg/FdtPciHostBridgeLib: map ECAM and I/O spaces in GCD memory map X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Nov 2018 14:54:26 -0000 Content-Transfer-Encoding: 8bit Up until now, we have been getting away with not declaring the ECAM and translated I/O spaces at all in the GCD memory map, simply because we map the entire address space with device attributes in the early PEI code, and so these regions will be mapped wherever they end up. Now that we are about to make changes to how ArmVirtQemu reasons about the size of the address space, it would be better to get rid of this mapping of the entire address space, since it can get arbitrarily large without real benefit. So start by mapping the ECAM and translated I/O spaces explicitly, instead of relying on the early PEI mapping. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf | 1 + ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c | 46 +++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf index 0995f4b7a156..4011336a353b 100644 --- a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf +++ b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf @@ -42,6 +42,7 @@ [Packages] [LibraryClasses] DebugLib DevicePathLib + DxeServicesTableLib MemoryAllocationLib PciPcdProducerLib diff --git a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c index 5b9c887db35d..ba177353122e 100644 --- a/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c +++ b/ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,33 @@ typedef struct { #define DTB_PCI_HOST_RANGE_IO BIT24 #define DTB_PCI_HOST_RANGE_TYPEMASK (BIT31 | BIT30 | BIT29 | BIT25 | BIT24) +STATIC +EFI_STATUS +MapGcdMmioSpace ( + IN UINT64 Base, + IN UINT64 Size + ) +{ + EFI_STATUS Status; + + Status = gDS->AddMemorySpace (EfiGcdMemoryTypeMemoryMappedIo, Base, Size, + EFI_MEMORY_UC); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: failed to add GCD memory space for region [0x%Lx+0x%Lx)\n", + __FUNCTION__, Base, Size)); + return Status; + } + + Status = gDS->SetMemorySpaceAttributes (Base, Size, EFI_MEMORY_UC); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: failed to set memory space attributes for region [0x%Lx+0x%Lx)\n", + __FUNCTION__, Base, Size)); + } + return Status; +} + STATIC EFI_STATUS ProcessPciHost ( @@ -266,7 +294,23 @@ ProcessPciHost ( "Io[0x%Lx+0x%Lx)@0x%Lx Mem32[0x%Lx+0x%Lx)@0x0 Mem64[0x%Lx+0x%Lx)@0x0\n", __FUNCTION__, ConfigBase, ConfigSize, *BusMin, *BusMax, *IoBase, *IoSize, IoTranslation, *Mmio32Base, *Mmio32Size, *Mmio64Base, *Mmio64Size)); - return EFI_SUCCESS; + + // Map the ECAM space in the GCD memory map + Status = MapGcdMmioSpace (ConfigBase, ConfigSize); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Map the MMIO window that provides I/O access - the PCI host bridge code + // is not aware of this translation and so it will only map the I/O view + // in the GCD I/O map. + // + Status = MapGcdMmioSpace (IoTranslation, *IoSize); + ASSERT_EFI_ERROR (Status); + + return Status; } STATIC PCI_ROOT_BRIDGE mRootBridge; -- 2.19.1