xref: /openbmc/linux/arch/loongarch/kernel/dma.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1d4b6f156SHuacai Chen // SPDX-License-Identifier: GPL-2.0
2d4b6f156SHuacai Chen /*
3d4b6f156SHuacai Chen  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4d4b6f156SHuacai Chen  */
5*c78c43feSJianmin Lv #include <linux/acpi.h>
6d4b6f156SHuacai Chen #include <linux/dma-direct.h>
7d4b6f156SHuacai Chen 
acpi_arch_dma_setup(struct device * dev)8*c78c43feSJianmin Lv void acpi_arch_dma_setup(struct device *dev)
9d4b6f156SHuacai Chen {
10*c78c43feSJianmin Lv 	int ret;
11*c78c43feSJianmin Lv 	u64 mask, end = 0;
12*c78c43feSJianmin Lv 	const struct bus_dma_region *map = NULL;
13d4b6f156SHuacai Chen 
14*c78c43feSJianmin Lv 	ret = acpi_dma_get_range(dev, &map);
15*c78c43feSJianmin Lv 	if (!ret && map) {
16*c78c43feSJianmin Lv 		const struct bus_dma_region *r = map;
17*c78c43feSJianmin Lv 
18*c78c43feSJianmin Lv 		for (end = 0; r->size; r++) {
19*c78c43feSJianmin Lv 			if (r->dma_start + r->size - 1 > end)
20*c78c43feSJianmin Lv 				end = r->dma_start + r->size - 1;
21d4b6f156SHuacai Chen 		}
22d4b6f156SHuacai Chen 
23*c78c43feSJianmin Lv 		mask = DMA_BIT_MASK(ilog2(end) + 1);
24*c78c43feSJianmin Lv 		dev->bus_dma_limit = end;
25*c78c43feSJianmin Lv 		dev->dma_range_map = map;
26*c78c43feSJianmin Lv 		dev->coherent_dma_mask = min(dev->coherent_dma_mask, mask);
27*c78c43feSJianmin Lv 		*dev->dma_mask = min(*dev->dma_mask, mask);
28d4b6f156SHuacai Chen 	}
29d4b6f156SHuacai Chen 
30d4b6f156SHuacai Chen }
31