All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
To: robh+dt@kernel.org, catalin.marinas@arm.com, hch@lst.de,
	ardb@kernel.org, linux-kernel@vger.kernel.org,
	Frank Rowand <frowand.list@gmail.com>
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 <nsaenzjulienne@suse.de>
Subject: [PATCH v3 3/8] of/address: Introduce of_dma_get_max_cpu_address()
Date: Wed, 14 Oct 2020 21:12:05 +0200	[thread overview]
Message-ID: <20201014191211.27029-4-nsaenzjulienne@suse.de> (raw)
In-Reply-To: <20201014191211.27029-1-nsaenzjulienne@suse.de>

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>

---

Changes since v2:
 - Use PHYS_ADDR_MAX
 - return phys_dma_t
 - Rename function
 - Correct subject
 - Add support to start parsing from an arbitrary device node in order
   for the function to work with unit tests

 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 eb9ab4f1e80b..b5a9695aaf82 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 system (or subtree when np is non-NULL). 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;
+	phys_addr_t cpu_end = 0;
+	struct of_range range;
+	const __be32 *ranges;
+	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;
+
+		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 481ec0467285..db8db8f2c967 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.28.0


WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
To: robh+dt@kernel.org, catalin.marinas@arm.com, hch@lst.de,
	ardb@kernel.org, linux-kernel@vger.kernel.org,
	Frank Rowand <frowand.list@gmail.com>
Cc: devicetree@vger.kernel.org, jeremy.linton@arm.com,
	iommu@lists.linux-foundation.org,
	linux-rpi-kernel@lists.infradead.org, robin.murphy@arm.com,
	linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 3/8] of/address: Introduce of_dma_get_max_cpu_address()
Date: Wed, 14 Oct 2020 21:12:05 +0200	[thread overview]
Message-ID: <20201014191211.27029-4-nsaenzjulienne@suse.de> (raw)
In-Reply-To: <20201014191211.27029-1-nsaenzjulienne@suse.de>

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>

---

Changes since v2:
 - Use PHYS_ADDR_MAX
 - return phys_dma_t
 - Rename function
 - Correct subject
 - Add support to start parsing from an arbitrary device node in order
   for the function to work with unit tests

 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 eb9ab4f1e80b..b5a9695aaf82 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 system (or subtree when np is non-NULL). 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;
+	phys_addr_t cpu_end = 0;
+	struct of_range range;
+	const __be32 *ranges;
+	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;
+
+		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 481ec0467285..db8db8f2c967 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.28.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
To: robh+dt@kernel.org, catalin.marinas@arm.com, hch@lst.de,
	ardb@kernel.org, linux-kernel@vger.kernel.org,
	Frank Rowand <frowand.list@gmail.com>
Cc: devicetree@vger.kernel.org, jeremy.linton@arm.com,
	Nicolas Saenz Julienne <nsaenzjulienne@suse.de>,
	iommu@lists.linux-foundation.org,
	linux-rpi-kernel@lists.infradead.org, robin.murphy@arm.com,
	linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 3/8] of/address: Introduce of_dma_get_max_cpu_address()
Date: Wed, 14 Oct 2020 21:12:05 +0200	[thread overview]
Message-ID: <20201014191211.27029-4-nsaenzjulienne@suse.de> (raw)
In-Reply-To: <20201014191211.27029-1-nsaenzjulienne@suse.de>

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>

---

Changes since v2:
 - Use PHYS_ADDR_MAX
 - return phys_dma_t
 - Rename function
 - Correct subject
 - Add support to start parsing from an arbitrary device node in order
   for the function to work with unit tests

 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 eb9ab4f1e80b..b5a9695aaf82 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 system (or subtree when np is non-NULL). 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;
+	phys_addr_t cpu_end = 0;
+	struct of_range range;
+	const __be32 *ranges;
+	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;
+
+		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 481ec0467285..db8db8f2c967 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.28.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2020-10-14 19:12 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-14 19:12 [PATCH v3 0/8] arm64: Default to 32-bit wide ZONE_DMA Nicolas Saenz Julienne
2020-10-14 19:12 ` Nicolas Saenz Julienne
2020-10-14 19:12 ` Nicolas Saenz Julienne
2020-10-14 19:12 ` [PATCH v3 1/8] arm64: mm: Move reserve_crashkernel() into mem_init() Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-15  8:40   ` Will Deacon
2020-10-15  8:40     ` Will Deacon
2020-10-15  8:40     ` Will Deacon
2020-10-15  8:55     ` Nicolas Saenz Julienne
2020-10-15  8:55       ` Nicolas Saenz Julienne
2020-10-15  8:55       ` Nicolas Saenz Julienne
2020-10-14 19:12 ` [PATCH v3 2/8] arm64: mm: Move zone_dma_bits initialization into zone_sizes_init() Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12 ` Nicolas Saenz Julienne [this message]
2020-10-14 19:12   ` [PATCH v3 3/8] of/address: Introduce of_dma_get_max_cpu_address() Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 22:02   ` Rob Herring
2020-10-14 22:02     ` Rob Herring
2020-10-14 22:02     ` Rob Herring
2020-10-15  6:56     ` Ard Biesheuvel
2020-10-15  6:56       ` Ard Biesheuvel
2020-10-15  6:56       ` Ard Biesheuvel
2020-10-15  9:16       ` Nicolas Saenz Julienne
2020-10-15  9:16         ` Nicolas Saenz Julienne
2020-10-15  9:16         ` Nicolas Saenz Julienne
2020-10-15  9:18         ` Ard Biesheuvel
2020-10-15  9:18           ` Ard Biesheuvel
2020-10-15  9:18           ` Ard Biesheuvel
2020-10-15  8:54     ` Nicolas Saenz Julienne
2020-10-15  8:54       ` Nicolas Saenz Julienne
2020-10-15  8:54       ` Nicolas Saenz Julienne
2020-10-15  5:42   ` Christoph Hellwig
2020-10-15  5:42     ` Christoph Hellwig
2020-10-15  5:42     ` Christoph Hellwig
2020-10-15 10:03     ` Nicolas Saenz Julienne
2020-10-15 10:03       ` Nicolas Saenz Julienne
2020-10-15 10:03       ` Nicolas Saenz Julienne
2020-10-16 13:19     ` Rob Herring
2020-10-16 13:19       ` Rob Herring
2020-10-16 13:19       ` Rob Herring
2020-10-14 19:12 ` [PATCH v3 4/8] of: unittest: Add test for of_dma_get_max_cpu_address() Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 22:04   ` Rob Herring
2020-10-14 22:04     ` Rob Herring
2020-10-14 22:04     ` Rob Herring
2020-10-15  9:51     ` Nicolas Saenz Julienne
2020-10-15  9:51       ` Nicolas Saenz Julienne
2020-10-15  9:51       ` Nicolas Saenz Julienne
2020-10-14 19:12 ` [PATCH v3 5/8] dma-direct: Turn zone_dma_bits default value into a define Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-15  5:38   ` Christoph Hellwig
2020-10-15  5:38     ` Christoph Hellwig
2020-10-15  5:38     ` Christoph Hellwig
2020-10-15 10:05     ` Nicolas Saenz Julienne
2020-10-15 10:05       ` Nicolas Saenz Julienne
2020-10-15 10:05       ` Nicolas Saenz Julienne
2020-10-14 19:12 ` [PATCH v3 6/8] arm64: mm: Set ZONE_DMA size based on devicetree's dma-ranges Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-15  5:39   ` Christoph Hellwig
2020-10-15  5:39     ` Christoph Hellwig
2020-10-15  5:39     ` Christoph Hellwig
2020-10-15 10:05     ` Nicolas Saenz Julienne
2020-10-15 10:05       ` Nicolas Saenz Julienne
2020-10-15 10:05       ` Nicolas Saenz Julienne
2020-10-14 19:12 ` [PATCH v3 7/8] arm64: mm: Set ZONE_DMA size based on early IORT scan Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-15 10:31   ` Lorenzo Pieralisi
2020-10-15 10:31     ` Lorenzo Pieralisi
2020-10-15 10:31     ` Lorenzo Pieralisi
2020-10-16  6:56     ` Ard Biesheuvel
2020-10-16  6:56       ` Ard Biesheuvel
2020-10-16  6:56       ` Ard Biesheuvel
2020-10-15 14:26   ` Hanjun Guo
2020-10-15 14:26     ` Hanjun Guo
2020-10-15 14:26     ` Hanjun Guo
2020-10-15 15:15     ` Nicolas Saenz Julienne
2020-10-15 15:15       ` Nicolas Saenz Julienne
2020-10-15 15:15       ` Nicolas Saenz Julienne
2020-10-15 18:03     ` Catalin Marinas
2020-10-15 18:03       ` Catalin Marinas
2020-10-15 18:03       ` Catalin Marinas
2020-10-16  6:51       ` Hanjun Guo
2020-10-16  6:51         ` Hanjun Guo
2020-10-16  6:51         ` Hanjun Guo
2020-10-16  6:54         ` Ard Biesheuvel
2020-10-16  6:54           ` Ard Biesheuvel
2020-10-16  6:54           ` Ard Biesheuvel
2020-10-16  7:27           ` Hanjun Guo
2020-10-16  7:27             ` Hanjun Guo
2020-10-16  7:27             ` Hanjun Guo
2020-10-16  7:34             ` Hanjun Guo
2020-10-16  7:34               ` Hanjun Guo
2020-10-16  7:34               ` Hanjun Guo
2020-10-14 19:12 ` [PATCH v3 8/8] mm: Update DMA zones description Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-14 19:12   ` Nicolas Saenz Julienne
2020-10-15  5:40   ` Christoph Hellwig
2020-10-15  5:40     ` Christoph Hellwig
2020-10-15  5:40     ` Christoph Hellwig

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=20201014191211.27029-4-nsaenzjulienne@suse.de \
    --to=nsaenzjulienne@suse.de \
    --cc=ardb@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jeremy.linton@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rpi-kernel@lists.infradead.org \
    --cc=robh+dt@kernel.org \
    --cc=robin.murphy@arm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.