From patchwork Sat Oct 10 15:12:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Saenz Julienne X-Patchwork-Id: 11830173 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9288915E6 for ; Sat, 10 Oct 2020 15:14:51 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 687D222280 for ; Sat, 10 Oct 2020 15:14:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Y5JXDOH1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 687D222280 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=x0sEPv0XgHYUYQ5C0tGxYUP5CH0c878Y9xIlKJqDCMI=; b=Y5JXDOH1cVR3AtDzA1olqn18L VK3C1XXpwdnuOYpaz1oOw+a3JsNyKmLUdPfej1zHKOVEaJ9qhPpWLJzKzLKzSHYVWrKv8py275+ep wbEP+nzFqURGwA26ujj080nMz01qydYsLhFkKSU4edATouCiilWpOF2X4CNKI5N+7JcJOUwK5tffd P9R11KkSSvAxtNN/hYJrjBrsFeJeChgswYd2mjEFwIAEdt9EdyB1n5pKrzBfpDDxee3lSuZE8o9sC s7gLkzxVfyQo4tcsF5AiShaiUGIpgsq1umx+pAVrqn7kqu/+vj595fvOrYRlYTEISLnrGm7+msPXm 3d1XztBQg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kRGYZ-0002L4-Hv; Sat, 10 Oct 2020 15:13:11 +0000 Received: from mx2.suse.de ([195.135.220.15]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kRGYC-0002Cm-KV; Sat, 10 Oct 2020 15:12:51 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201010_111248_868812_052FE18B X-CRM114-Status: GOOD ( 17.17 ) X-Spam-Score: -2.3 (--) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-2.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at https://www.dnswl.org/, medium trust [195.135.220.15 listed in list.dnswl.org] 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [195.135.220.15 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, jeremy.linton@arm.com, Nicolas Saenz Julienne , iommu@lists.linux-foundation.org, linux-rpi-kernel@lists.infradead.org, robin.murphy@arm.com, linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.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 */