From: Jing Xiangfeng <jingxiangfeng@huawei.com>
To: <gregkh@linuxfoundation.org>, <catalin.marinas@arm.com>,
<will@kernel.org>, <akpm@linux-foundation.org>,
<nsaenzjulienne@suse.de>, <paul.walmsley@sifive.com>,
<palmer@dabbelt.com>, <aou@eecs.berkeley.edu>, <rppt@kernel.org>,
<lorenzo.pieralisi@arm.com>, <guohanjun@huawei.com>,
<sudeep.holla@arm.com>, <rjw@rjwysocki.net>, <lenb@kernel.org>,
<song.bao.hua@hisilicon.com>, <ardb@kernel.org>,
<anshuman.khandual@arm.com>, <bhelgaas@google.com>, <guro@fb.com>,
<robh+dt@kernel.org>
Cc: <stable@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>,
<frowand.list@gmail.com>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-mm@kvack.org>,
<linux-riscv@lists.infradead.org>, <jingxiangfeng@huawei.com>,
<wangkefeng.wang@huawei.com>, Rob Herring <robh@kernel.org>
Subject: [PATCH stable v5.10 3/7] of/address: Introduce of_dma_get_max_cpu_address()
Date: Wed, 3 Mar 2021 15:33:15 +0800 [thread overview]
Message-ID: <20210303073319.2215839-4-jingxiangfeng@huawei.com> (raw)
In-Reply-To: <20210303073319.2215839-1-jingxiangfeng@huawei.com>
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
commit 964db79d6c186cc2ecc6ae46f98eed7e0ea8cf71 upstream
Introduce of_dma_get_max_cpu_address(), which provides the highest CPU
physical address addressable by all DMA masters in the system. It's
specially useful for setting memory zones sizes at early boot time.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20201119175400.9995-4-nsaenzjulienne@suse.de
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Jing Xiangfeng <jingxiangfeng@huawei.com>
---
drivers/of/address.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/linux/of.h | 7 +++++++
2 files changed, 49 insertions(+)
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 1c3257a2d4e3..73ddf2540f3f 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -1024,6 +1024,48 @@ int of_dma_get_range(struct device_node *np, const struct bus_dma_region **map)
}
#endif /* CONFIG_HAS_DMA */
+/**
+ * of_dma_get_max_cpu_address - Gets highest CPU address suitable for DMA
+ * @np: The node to start searching from or NULL to start from the root
+ *
+ * Gets the highest CPU physical address that is addressable by all DMA masters
+ * in the sub-tree pointed by np, or the whole tree if NULL is passed. If no
+ * DMA constrained device is found, it returns PHYS_ADDR_MAX.
+ */
+phys_addr_t __init of_dma_get_max_cpu_address(struct device_node *np)
+{
+ phys_addr_t max_cpu_addr = PHYS_ADDR_MAX;
+ struct of_range_parser parser;
+ phys_addr_t subtree_max_addr;
+ struct device_node *child;
+ struct of_range range;
+ const __be32 *ranges;
+ u64 cpu_end = 0;
+ int len;
+
+ if (!np)
+ np = of_root;
+
+ ranges = of_get_property(np, "dma-ranges", &len);
+ if (ranges && len) {
+ 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 - 1;
+
+ if (max_cpu_addr > cpu_end)
+ max_cpu_addr = cpu_end;
+ }
+
+ for_each_available_child_of_node(np, child) {
+ subtree_max_addr = of_dma_get_max_cpu_address(child);
+ if (max_cpu_addr > subtree_max_addr)
+ max_cpu_addr = subtree_max_addr;
+ }
+
+ return max_cpu_addr;
+}
+
/**
* 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 af655d264f10..0f4e81e6fb23 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);
+phys_addr_t of_dma_get_max_cpu_address(struct device_node *np);
+
#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 phys_addr_t of_dma_get_max_cpu_address(struct device_node *np)
+{
+ return PHYS_ADDR_MAX;
+}
+
#define of_match_ptr(_ptr) NULL
#define of_match_node(_matches, _node) NULL
#endif /* CONFIG_OF */
--
2.25.1
next prev parent reply other threads:[~2021-03-03 13:06 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-03 7:33 [PATCH stable v5.10 0/7] arm64: Default to 32-bit wide ZONE_DMA Jing Xiangfeng
2021-03-03 7:33 ` [PATCH stable v5.10 1/7] arm64: mm: Move reserve_crashkernel() into mem_init() Jing Xiangfeng
2021-03-03 7:33 ` [PATCH stable v5.10 2/7] arm64: mm: Move zone_dma_bits initialization into zone_sizes_init() Jing Xiangfeng
2021-03-03 7:33 ` Jing Xiangfeng [this message]
2021-03-03 7:33 ` [PATCH stable v5.10 4/7] of: unittest: Add test for of_dma_get_max_cpu_address() Jing Xiangfeng
2021-03-03 7:33 ` [PATCH stable v5.10 5/7] arm64: mm: Set ZONE_DMA size based on devicetree's dma-ranges Jing Xiangfeng
2021-03-03 7:33 ` [PATCH stable v5.10 6/7] arm64: mm: Set ZONE_DMA size based on early IORT scan Jing Xiangfeng
2021-03-03 7:33 ` [PATCH stable v5.10 7/7] mm: Remove examples from enum zone_type comment Jing Xiangfeng
2021-03-04 13:46 ` [PATCH stable v5.10 0/7] arm64: Default to 32-bit wide ZONE_DMA Greg KH
2021-03-04 14:05 ` Nicolas Saenz Julienne
2021-03-04 14:17 ` Greg KH
2021-03-04 15:09 ` Nicolas Saenz Julienne
2021-03-07 15:24 ` Greg KH
2021-03-08 3:20 ` Jing Xiangfeng
2021-03-08 9:58 ` Greg KH
2021-05-11 12:35 ` Kefeng Wang
2021-05-12 12:06 ` Greg KH
2021-06-23 6:59 ` Kefeng Wang
2021-06-23 7:12 ` Greg KH
2021-06-23 7:25 ` Kefeng Wang
2021-06-23 7:34 ` Greg KH
2021-06-23 8:01 ` Kefeng Wang
2021-06-25 10:19 ` Greg KH
2021-06-26 1:19 ` Kefeng Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210303073319.2215839-4-jingxiangfeng@huawei.com \
--to=jingxiangfeng@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=anshuman.khandual@arm.com \
--cc=aou@eecs.berkeley.edu \
--cc=ardb@kernel.org \
--cc=bhelgaas@google.com \
--cc=catalin.marinas@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=frowand.list@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=guohanjun@huawei.com \
--cc=guro@fb.com \
--cc=lenb@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-riscv@lists.infradead.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=nsaenzjulienne@suse.de \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=rjw@rjwysocki.net \
--cc=robh+dt@kernel.org \
--cc=robh@kernel.org \
--cc=rppt@kernel.org \
--cc=song.bao.hua@hisilicon.com \
--cc=stable@vger.kernel.org \
--cc=sudeep.holla@arm.com \
--cc=wangkefeng.wang@huawei.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®