From patchwork Tue Feb 23 01:58:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 62653 Delivered-To: patch@linaro.org Received: by 10.112.43.199 with SMTP id y7csp1579442lbl; Mon, 22 Feb 2016 17:58:37 -0800 (PST) X-Received: by 10.66.160.7 with SMTP id xg7mr42082497pab.10.1456192717362; Mon, 22 Feb 2016 17:58:37 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s19si43527138pfi.22.2016.02.22.17.58.36; Mon, 22 Feb 2016 17:58:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dkim=pass header.i=@gmail.com; dmarc=pass (p=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756755AbcBWB6e (ORCPT + 30 others); Mon, 22 Feb 2016 20:58:34 -0500 Received: from mail-pf0-f169.google.com ([209.85.192.169]:36448 "EHLO mail-pf0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754795AbcBWB6a (ORCPT ); Mon, 22 Feb 2016 20:58:30 -0500 Received: by mail-pf0-f169.google.com with SMTP id e127so102837952pfe.3; Mon, 22 Feb 2016 17:58:30 -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=BrRAq8vrpg388Rge0WH1yZ/OQ9+RbH/ZqSrvR7pQzaApL1vYtfnDNUpRU1ffkc++kF Gp/BNYVgHM5K/CIudvI1enG1scoIv7YB/Z7YrwU5O8Oovt8UJGN4SOTYad2o0AdZedCS z/MR6NlrugX7uZsDsP8naIvGpAQMgadodC5ieBv/WvyDM88wwyUiGPSfHWaXPa0YZK5M xSHbwCW+1xwCKbTlyG4+lQE18bZAioOCIwIidcg+op/9jR8eXdEM0RcYjLHQc0cjOFZV ysa67D8JRaO6Hw8R3Waz8LiAjwxrgFRBQMoIqL7mm3VAkL7jy33+AzqxLKHkrd2eCLxP nJsQ== 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=DSj3SngxrI9JOWMAYE+A5lcxRXevfzBBsQu1vNw5ayRnoqt+bE6EBJF1929XTFRaVi fAG/OzqWN1EUW7ZdkufHqAFeGPcoYtXRvMnk3LIVVoWl36XmILQ/YtWg+QtzbSlGPPf/ bVs0dNP5B92NtSLyO+hLP9R4E3LFZ1rjpEB1v7aogY1y+R3YVSp7WSic9OeyrpvC3xBz 50GbTZJ1kDYbgTUHdUHwacF7cMdpvXfRvFlk8U7Oa5xrFo11Sn40wSXXeJHc18bj2Ooe 66fpjgXKC8HNNU7Yu9N4CcGJ338FihiQr4AnN9znPl5TnwGQnme44hiCHI2pKUxy21EV +P6g== X-Gm-Message-State: AG10YOTJhyIyoSXZdF/8T+mII4HIHn61eLUzKE9LTpFKXQ20hXdafona6+Dq97zf3poMlQ== X-Received: by 10.98.32.5 with SMTP id g5mr42719749pfg.74.1456192709934; Mon, 22 Feb 2016 17:58:29 -0800 (PST) Received: from dl.caveonetworks.com ([64.2.3.194]) by smtp.gmail.com with ESMTPSA id r62sm39671920pfr.26.2016.02.22.17.58.26 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 22 Feb 2016 17:58:26 -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 u1N1wPtx002316; Mon, 22 Feb 2016 17:58:25 -0800 Received: (from ddaney@localhost) by dl.caveonetworks.com (8.14.5/8.14.5/Submit) id u1N1wPWn002315; Mon, 22 Feb 2016 17:58:25 -0800 From: David Daney To: Will Deacon , linux-arm-kernel@lists.infradead.org, Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , devicetree@vger.kernel.org, Ard Biesheuvel , Frank Rowand , Grant Likely , Catalin Marinas , Matt Fleming , linux-efi@vger.kernel.org, Ganapatrao Kulkarni , Robert Richter Cc: linux-kernel@vger.kernel.org, David Daney Subject: [PATCH v12 1/5] efi: ARM/arm64: ignore DT memory nodes instead of removing them Date: Mon, 22 Feb 2016 17:58:19 -0800 Message-Id: <1456192703-2274-2-git-send-email-ddaney.cavm@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1456192703-2274-1-git-send-email-ddaney.cavm@gmail.com> References: <1456192703-2274-1-git-send-email-ddaney.cavm@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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(-) -- 1.8.3.1 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. */