Skip to content

Commit fece653

Browse files
rmurphy-armjoergroedel
authored andcommitted
dma-mapping: Add helpers for dma_range_map bounds
Several places want to compute the lower and/or upper bounds of a dma_range_map, so let's factor that out into reusable helpers. Acked-by: Rob Herring <robh@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hanjun Guo <guohanjun@huawei.com> # For arm64 Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Hanjun Guo <guohanjun@huawei.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Link: https://lore.kernel.org/r/45ec52f033ec4dfb364e23f48abaf787f612fa53.1713523152.git.robin.murphy@arm.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent 91cfd67 commit fece653

File tree

4 files changed

+23
-23
lines changed

4 files changed

+23
-23
lines changed

arch/loongarch/kernel/dma.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,12 @@
88
void acpi_arch_dma_setup(struct device *dev)
99
{
1010
int ret;
11-
u64 mask, end = 0;
11+
u64 mask, end;
1212
const struct bus_dma_region *map = NULL;
1313

1414
ret = acpi_dma_get_range(dev, &map);
1515
if (!ret && map) {
16-
const struct bus_dma_region *r = map;
17-
18-
for (end = 0; r->size; r++) {
19-
if (r->dma_start + r->size - 1 > end)
20-
end = r->dma_start + r->size - 1;
21-
}
16+
end = dma_range_map_max(map);
2217

2318
mask = DMA_BIT_MASK(ilog2(end) + 1);
2419
dev->bus_dma_limit = end;

drivers/acpi/arm64/dma.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,7 @@ void acpi_arch_dma_setup(struct device *dev)
2828

2929
ret = acpi_dma_get_range(dev, &map);
3030
if (!ret && map) {
31-
const struct bus_dma_region *r = map;
32-
33-
for (end = 0; r->size; r++) {
34-
if (r->dma_start + r->size - 1 > end)
35-
end = r->dma_start + r->size - 1;
36-
}
37-
31+
end = dma_range_map_max(map);
3832
dev->dma_range_map = map;
3933
}
4034

drivers/of/device.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,9 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
117117
if (!force_dma)
118118
return ret == -ENODEV ? 0 : ret;
119119
} else {
120-
const struct bus_dma_region *r = map;
121-
122120
/* Determine the overall bounds of all DMA regions */
123-
for (dma_start = ~0; r->size; r++) {
124-
/* Take lower and upper limits */
125-
if (r->dma_start < dma_start)
126-
dma_start = r->dma_start;
127-
if (r->dma_start + r->size > end)
128-
end = r->dma_start + r->size;
129-
}
121+
dma_start = dma_range_map_min(map);
122+
end = dma_range_map_max(map);
130123
}
131124

132125
/*

include/linux/dma-direct.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ static inline phys_addr_t translate_dma_to_phys(struct device *dev,
5454
return (phys_addr_t)-1;
5555
}
5656

57+
static inline dma_addr_t dma_range_map_min(const struct bus_dma_region *map)
58+
{
59+
dma_addr_t ret = (dma_addr_t)U64_MAX;
60+
61+
for (; map->size; map++)
62+
ret = min(ret, map->dma_start);
63+
return ret;
64+
}
65+
66+
static inline dma_addr_t dma_range_map_max(const struct bus_dma_region *map)
67+
{
68+
dma_addr_t ret = 0;
69+
70+
for (; map->size; map++)
71+
ret = max(ret, map->dma_start + map->size - 1);
72+
return ret;
73+
}
74+
5775
#ifdef CONFIG_ARCH_HAS_PHYS_TO_DMA
5876
#include <asm/dma-direct.h>
5977
#ifndef phys_to_dma_unencrypted

0 commit comments

Comments
 (0)