From patchwork Thu Mar 3 23:55:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 8497131 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C94BA9F38C for ; Thu, 3 Mar 2016 23:58:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C2961201CE for ; Thu, 3 Mar 2016 23:58:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DDF952026F for ; Thu, 3 Mar 2016 23:58:31 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1abd6I-0006jC-Pl; Thu, 03 Mar 2016 23:56:10 +0000 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1abd6F-0006dQ-19 for linux-arm-kernel@lists.infradead.org; Thu, 03 Mar 2016 23:56:08 +0000 Received: by mail-pf0-x242.google.com with SMTP id 63so2174256pfe.0 for ; Thu, 03 Mar 2016 15:55:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=husB/HVGYq9ik5VlkC2lV3VuM7MHla4rthNU01rXM5Q=; b=XWr80PoD4qH5bhstM0igx//HdG2DsUpDOFI0dbqkSF3UrwGdWmjd3MnSlyu39HtgLt gHIe4FmTa0wV11KcVFUOJU36k1Lzz0Jam8IvVIk+4nyvi+IqB5q2esK302DGcvuAA0p5 lIZ1MITYSGFDuIt1p4kEPsZX3muVU6UrvE07Djmcc96O8Q+EIsfHHccBv8TquKKTw8ya wSWsUz2NZ4Btum5isqZNsZL5+zpY0+3M1nc7IsjsjIaDlOSGy0YqH/eXiNTFUYdO2XPL 5+QBDGBBeta6BF5BVC7O/cieIQvKbcTcBd2kWHio3wECaklfB8BHwXp/E5ruRFa7xkQn Dabg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=husB/HVGYq9ik5VlkC2lV3VuM7MHla4rthNU01rXM5Q=; b=XIKB5qOLAsmeUkWNniXiEgFbW3ytZKispNvg33hnV1jXVM92eJVNwxNBYJG7saUCR8 ZIDnZcv8wiO3gGG8+3/9H29KoUvOHHk/qiB5VuJblXQTAt6LqoSPRrIKI+T4PU5chGS5 Hvn9AbYHkuTuoihIVWDQ/JeoGkhGU9TMMgY8Uwww9NL+aZCCRaH3tU2NGD4vmQmkvHqh B+eEbhtALf0mpDRvkRkn0uGGXt5pgWl1ErkoD1m5wFk2GtQVesJVmWht6+iYmQ21NXrf UsUgS0hYXZJExnScmrOBmFKZ85z1EvCBT6xcHb6uouA9j5uuQjA6Z2aqvrtXv/uhXdxT Tc0Q== X-Gm-Message-State: AD7BkJI11h0QtMU8Gg5thSTG3/QKZnRX5Yj3bZqIQxvI01ETx2pf4IQ/Fm/beF6Bhu9W+g== X-Received: by 10.98.32.150 with SMTP id m22mr7571688pfj.27.1457049346820; Thu, 03 Mar 2016 15:55:46 -0800 (PST) Received: from dl.caveonetworks.com ([64.2.3.194]) by smtp.gmail.com with ESMTPSA id p8sm682246pfi.34.2016.03.03.15.55.42 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 Mar 2016 15:55:42 -0800 (PST) Received: from dl.caveonetworks.com (localhost.localdomain [127.0.0.1]) by dl.caveonetworks.com (8.14.5/8.14.5) with ESMTP id u23NtfdL023394; Thu, 3 Mar 2016 15:55:41 -0800 Received: (from ddaney@localhost) by dl.caveonetworks.com (8.14.5/8.14.5/Submit) id u23NtffY023393; Thu, 3 Mar 2016 15:55:41 -0800 From: David Daney To: Will Deacon , linux-arm-kernel@lists.infradead.org, Rob Herring , Frank Rowand , Grant Likely , Pawel Moll , Ian Campbell , Kumar Gala , Ganapatrao Kulkarni , Robert Richter , Ard Biesheuvel , Matt Fleming , Mark Rutland , Catalin Marinas Subject: [PATCH v14 1/6] efi: ARM/arm64: ignore DT memory nodes instead of removing them Date: Thu, 3 Mar 2016 15:55:34 -0800 Message-Id: <1457049339-23351-2-git-send-email-ddaney.cavm@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1457049339-23351-1-git-send-email-ddaney.cavm@gmail.com> References: <1457049339-23351-1-git-send-email-ddaney.cavm@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160303_155607_156971_B12FCDF2 X-CRM114-Status: GOOD ( 16.24 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, David Daney MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ard Biesheuvel There are two problems with the UEFI stub DT memory node removal routine: - it deletes nodes as it traverses the tree, which happens to work but is not supported, as deletion invalidates the node iterator; - deleting memory nodes entirely may discard annotations in the form of additional properties on the nodes. Since the discovery of DT memory nodes occurs strictly before the UEFI init sequence, we can simply clear the memblock memory table before parsing the UEFI memory map. This way, it is no longer necessary to remove the nodes, so we can remove that logic from the stub as well. Signed-off-by: Ard Biesheuvel Signed-off-by: David Daney --- drivers/firmware/efi/arm-init.c | 8 ++++++++ drivers/firmware/efi/libstub/fdt.c | 24 +----------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c index 9e15d57..40c9d85 100644 --- a/drivers/firmware/efi/arm-init.c +++ b/drivers/firmware/efi/arm-init.c @@ -143,6 +143,14 @@ static __init void reserve_regions(void) if (efi_enabled(EFI_DBG)) pr_info("Processing EFI memory map:\n"); + /* + * Discard memblocks discovered so far: if there are any at this + * point, they originate from memory nodes in the DT, and UEFI + * uses its own memory map instead. + */ + memblock_dump_all(); + memblock_remove(0, ULLONG_MAX); + for_each_efi_memory_desc(&memmap, md) { paddr = md->phys_addr; npages = md->num_pages; diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c index cf7b7d4..9df1560 100644 --- a/drivers/firmware/efi/libstub/fdt.c +++ b/drivers/firmware/efi/libstub/fdt.c @@ -24,7 +24,7 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt, unsigned long map_size, unsigned long desc_size, u32 desc_ver) { - int node, prev, num_rsv; + int node, num_rsv; int status; u32 fdt_val32; u64 fdt_val64; @@ -54,28 +54,6 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt, goto fdt_set_fail; /* - * Delete any memory nodes present. We must delete nodes which - * early_init_dt_scan_memory may try to use. - */ - prev = 0; - for (;;) { - const char *type; - int len; - - node = fdt_next_node(fdt, prev, NULL); - if (node < 0) - break; - - type = fdt_getprop(fdt, node, "device_type", &len); - if (type && strncmp(type, "memory", len) == 0) { - fdt_del_node(fdt, node); - continue; - } - - prev = node; - } - - /* * Delete all memory reserve map entries. When booting via UEFI, * kernel will use the UEFI memory map to find reserved regions. */