From patchwork Tue Mar 8 23:59:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Daney X-Patchwork-Id: 63697 Delivered-To: patch@linaro.org Received: by 10.112.199.169 with SMTP id jl9csp2349498lbc; Tue, 8 Mar 2016 16:00:59 -0800 (PST) X-Received: by 10.98.72.3 with SMTP id v3mr40704632pfa.62.1457481650230; Tue, 08 Mar 2016 16:00:50 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q88si7909741pfa.197.2016.03.08.16.00.49; Tue, 08 Mar 2016 16:00:50 -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 S1752083AbcCIAAo (ORCPT + 30 others); Tue, 8 Mar 2016 19:00:44 -0500 Received: from mail-pf0-f196.google.com ([209.85.192.196]:33240 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751484AbcCIAAE (ORCPT ); Tue, 8 Mar 2016 19:00:04 -0500 Received: by mail-pf0-f196.google.com with SMTP id 63so2217236pfe.0; Tue, 08 Mar 2016 16:00:03 -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=FVtus+UV88WwSzixLVeE5UJEblguCyaqvsDPZwdqR1jp6vvbC/+xeU8zh6ElMrVLmL YdAYtw5Owbxj/oIZg47nBF2R6zbvkfb2dwTCtklRkfOFSANx3E7Nn7DnuHJJ+RuXZ7MU uJuVIc/Ycrrg/sYQzP8q/LlxPpnIKTsxdzCg+HW7kaBXKrifR5bn5y6WCrOOSQXNfH3C 0z0pgaAlcbB/gFyy8FEoUGfCYw7+uo6KxbiLS6Ndcv8UGnJOz1XPD+sc7KRqRH9PjLPo 0+qbAS+f/eUrhjd0TJoSknK1TZ26erVAc/lwuc34EWjeQ0ozbYeKyOAa+kap4dGv9FT6 dxtw== 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=SQUSLvNzIC+5/l5d//3NlgKWIjDhQ9inBtEGBW3xsLV/zs1iBQ3lsMuDFLehvbAiZi byoYu/u+tPaVZuHgzMPn8rZjpFQzyw6HSPmWXY0lI5A/9m7W7QW1/iqJXbuYe1LtBKxO dM8b5a0X9F2KDlXv5IejBeCuOX2E8wxbVuYMVI/YBpMUNvLLkWKXBntHuMXcLh72pwXZ B6iejP2+uBVCDFlhpmj2fgRvpNaUhULWaJvIkAe1WxAfxbrRL9gkIBlzaKVCNUS3CW7E k7BUOmC2BNDlNU8MRkS2HhIQRVJ+Tq6kGU2ZatcmMf7Xy0RhEoBeQ1Q2y996R2HjY5o+ lDrQ== X-Gm-Message-State: AD7BkJLGHyOIBxXZDteJahkO9YGHDCb42sfjrZC8PwJPM+20a0Qtv0+APh22XeLJKWHGpA== X-Received: by 10.98.65.203 with SMTP id g72mr46186516pfd.138.1457481603448; Tue, 08 Mar 2016 16:00:03 -0800 (PST) Received: from dl.caveonetworks.com ([64.2.3.194]) by smtp.gmail.com with ESMTPSA id n66sm7431364pfj.39.2016.03.08.15.59.58 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 08 Mar 2016 16:00:00 -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 u28Nxvst009020; Tue, 8 Mar 2016 15:59:57 -0800 Received: (from ddaney@localhost) by dl.caveonetworks.com (8.14.5/8.14.5/Submit) id u28NxvB9009019; Tue, 8 Mar 2016 15:59:57 -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 Cc: linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, David Daney Subject: [PATCH v15 1/6] efi: ARM/arm64: ignore DT memory nodes instead of removing them Date: Tue, 8 Mar 2016 15:59:42 -0800 Message-Id: <1457481587-8976-2-git-send-email-ddaney.cavm@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1457481587-8976-1-git-send-email-ddaney.cavm@gmail.com> References: <1457481587-8976-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. */