From patchwork Fri Apr 8 22:50:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 8786751 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8A46FC0553 for ; Fri, 8 Apr 2016 22:53:05 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A33A42011E for ; Fri, 8 Apr 2016 22:53:04 +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 BE377200E5 for ; Fri, 8 Apr 2016 22:53:03 +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 1aofFc-0001fX-QP; Fri, 08 Apr 2016 22:51:40 +0000 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aofF1-0001PY-S2 for linux-arm-kernel@lists.infradead.org; Fri, 08 Apr 2016 22:51:05 +0000 Received: by mail-pf0-x241.google.com with SMTP id d184so10257374pfc.1 for ; Fri, 08 Apr 2016 15:50:44 -0700 (PDT) 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=pLOD0TdBUOpJeU3x/geuPim3e8pSUCT4bpKerGoCkP8=; b=tbo/Puza+N7C/765qepx8mwUtNqW81ImAez0ZNy2ilX4niVRouEw//wPEf6hvCvB/a 4Hr/8YIxBPob0hivcKnvhCKOSAROnw6VebRpFhRuDGfQRcXZ8HLQaT/IXu0MqV1SXkdN S+uNZ0aPIcMPic+dN6Y5ztm84rJ0A84xq9kMJDkAzgB6cgAnJ9Wf3UNgF8WH6gvPfXgA NNKsR/u09i/0abaFsgI1EUag0nPqjw3+5r0t3Ui/3uumpbaC7uimud3IsgYtaKgDP1p7 OoQZ7sUDnOmcz99L6Wr6x/RLH5NOswQCq38PlIKINdJBpFis7wi9t88Q1r15IqRxhm5k uRhQ== 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=pLOD0TdBUOpJeU3x/geuPim3e8pSUCT4bpKerGoCkP8=; b=Fhdkd8pSk0z/oc8I8sL3lIuvEN+vPLkV2sYjR4WuJxU6kYKQQSYJCjt2vHypsv9ur7 qxKAS6h3Z+EHfCUzW1pW6f2l+Hlh/B57Yn26g9ZTvKqfXxPSuNOQQRkt4wI7AaH5rcT3 XSqzzMN65Xx4gKKqp4TDOKuRm7yg5jI3jssVbUVFVkzge0RHBqFHAs0QwI83tGvUyRZw U3CfaNRmbisas6CEs4TzLhyWOUqp0GytXaUiKT8EoTtYBqg6OWvEabHctEa+s9h7EDhs QYPOoK7+Olda49hVXzqdnIBLdsx1jM/gzYzUsOmbStHsq3GgvDE2PwAKPM52XK73SWpN SldA== X-Gm-Message-State: AD7BkJIVJP63Y3TF5e7AIPJz0B6Om9D52GJTY2UlQVr56Lk7mLDrxFDdxxMtuFLVLiEmYw== X-Received: by 10.98.18.195 with SMTP id 64mr15885183pfs.131.1460155844215; Fri, 08 Apr 2016 15:50:44 -0700 (PDT) Received: from dl.caveonetworks.com ([64.2.3.194]) by smtp.gmail.com with ESMTPSA id fw9sm20928163pac.21.2016.04.08.15.50.38 (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 08 Apr 2016 15:50:40 -0700 (PDT) Received: from dl.caveonetworks.com (localhost.localdomain [127.0.0.1]) by dl.caveonetworks.com (8.14.5/8.14.5) with ESMTP id u38Mobjm008735; Fri, 8 Apr 2016 15:50:37 -0700 Received: (from ddaney@localhost) by dl.caveonetworks.com (8.14.5/8.14.5/Submit) id u38MobWp008734; Fri, 8 Apr 2016 15:50:37 -0700 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 v16 1/6] efi: ARM/arm64: ignore DT memory nodes instead of removing them Date: Fri, 8 Apr 2016 15:50:23 -0700 Message-Id: <1460155828-8690-2-git-send-email-ddaney.cavm@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1460155828-8690-1-git-send-email-ddaney.cavm@gmail.com> References: <1460155828-8690-1-git-send-email-ddaney.cavm@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160408_155104_052193_18A2AA58 X-CRM114-Status: GOOD ( 17.41 ) 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=-5.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 Acked-by: Steve Capper --- 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 aa1f743..5d6945b 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 6dba78a..e58abfa 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. */