Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp3369075pxu; Sun, 11 Oct 2020 07:12:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyf6tmMvik5ptXxxQYp0v+cDyEMJQ8+/5ZKE1G/xAEb3WDnZkrB+NQOs1OX13IgAvppYRVL X-Received: by 2002:a17:906:4cc2:: with SMTP id q2mr24813420ejt.422.1602425544187; Sun, 11 Oct 2020 07:12:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602425544; cv=none; d=google.com; s=arc-20160816; b=Ad58TmhQhGrV3WuOwM9zkcC/R2wLvG6Uyb9SQETfZHZBdZy32Cpq8s6hxJWfEF2QpC mfrGQZ5OIHfoM9UVCQW7JVMVuJJ6QQ/MV/TtE0xrkCyM8f53fYTUgL1HCmHJzeXl28pd KedPFCqKY2zjHjtxpNv4IAUTz8aDl06rkMXORLyp238bkrZZSYG7aMvd7tHkulPdPLnM sEboNXhaC2T5T4qeaSi+vljq5Na4B2Kkx+OYfOd1enwQZj0T4LjCK50UO8pAkJaiJ7ZR Cx0+O1MWVKUaVC+0k3wyNYHf6zqOxHou+BLzPeMrDPsNy7C7OuL3n60e3e8FWI7LxfSa DE0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=DeGA6Y2a2W227kFIqalH+Rc6eJPeqZrSuRvBOX1K14E=; b=0Pu8K4OmFWIlK5oqYZwdgy+Q0yNu8YB62S5ElPcQ6z0agL7prlKBCuyuc+KrPHEVmG fF0Veyqqr93t1CIXQTgbsmAlq9nGqU4pq3KeM5glyKEEGAzmkA9zWP9+hO+fjAE7Perq vHZx9rqF6aIqOzO5HYdwaICmoFLBOzBC0km4Fh5cbwi2N4pmApmT/Umxx1h8pY1sGehz Ip43fFnn7+cYbZj0nDrzIHkvOr3khkrg004aj2jk+hIH03n/V58yfchTQRd+KH+4Cr8v oVVcvX0EBXrlhIf7k6U2vTRYzESepfJis0VNxf5l84G4YPq5DMdmlE7cIe1XJbsjDFTq BMAw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j89si7206679edc.446.2020.10.11.07.12.00; Sun, 11 Oct 2020 07:12:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731813AbgJJW5a (ORCPT + 99 others); Sat, 10 Oct 2020 18:57:30 -0400 Received: from mx2.suse.de ([195.135.220.15]:48202 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732225AbgJJTn7 (ORCPT ); Sat, 10 Oct 2020 15:43:59 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 3053EB132; Sat, 10 Oct 2020 15:12:46 +0000 (UTC) From: Nicolas Saenz Julienne To: robh+dt@kernel.org, catalin.marinas@arm.com, hch@lst.de, ardb@kernel.org, linux-kernel@vger.kernel.org, Frank Rowand Cc: robin.murphy@arm.com, linux-arm-kernel@lists.infradead.org, linux-rpi-kernel@lists.infradead.org, jeremy.linton@arm.com, iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, Nicolas Saenz Julienne Subject: [PATCH v2 2/5] of/address: Introduce of_dma_lower_bus_limit() Date: Sat, 10 Oct 2020 17:12:32 +0200 Message-Id: <20201010151235.20585-3-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201010151235.20585-1-nsaenzjulienne@suse.de> References: <20201010151235.20585-1-nsaenzjulienne@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function provides the CPU physical address addressable by the most constrained bus in the system. It might be useful in order to dynamically set up memory zones during boot. Signed-off-by: Nicolas Saenz Julienne --- drivers/of/address.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/of.h | 7 +++++++ 2 files changed, 41 insertions(+) diff --git a/drivers/of/address.c b/drivers/of/address.c index eb9ab4f1e80b..755e97b65096 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -1024,6 +1024,40 @@ int of_dma_get_range(struct device_node *np, const struct bus_dma_region **map) } #endif /* CONFIG_HAS_DMA */ +/** + * of_dma_safe_phys_limit - Get system wide DMA safe address space + * + * Gets the CPU physical address limit for safe DMA addressing system wide by + * searching for the most constraining dma-range. Otherwise it returns ~0ULL. + */ +u64 __init of_dma_safe_phys_limit(void) +{ + struct device_node *np = NULL; + struct of_range_parser parser; + const __be32 *ranges = NULL; + u64 phys_dma_limit = ~0ULL; + struct of_range range; + int len; + + for_each_of_allnodes(np) { + dma_addr_t cpu_end = 0; + + ranges = of_get_property(np, "dma-ranges", &len); + if (!ranges || !len) + continue; + + of_dma_range_parser_init(&parser, np); + for_each_of_range(&parser, &range) + if (range.cpu_addr + range.size > cpu_end) + cpu_end = range.cpu_addr + range.size; + + if (phys_dma_limit > cpu_end) + phys_dma_limit = cpu_end; + } + + return phys_dma_limit; +} + /** * of_dma_is_coherent - Check if device is coherent * @np: device node diff --git a/include/linux/of.h b/include/linux/of.h index 481ec0467285..958c64cffa92 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -558,6 +558,8 @@ int of_map_id(struct device_node *np, u32 id, const char *map_name, const char *map_mask_name, struct device_node **target, u32 *id_out); +u64 of_dma_safe_phys_limit(void); + #else /* CONFIG_OF */ static inline void of_core_init(void) @@ -995,6 +997,11 @@ static inline int of_map_id(struct device_node *np, u32 id, return -EINVAL; } +static inline u64 of_dma_safe_phys_limit(void) +{ + return ~0ULL; +} + #define of_match_ptr(_ptr) NULL #define of_match_node(_matches, _node) NULL #endif /* CONFIG_OF */ -- 2.28.0