18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
48c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
58c2ecf20Sopenharmony_ci * for more details.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 2020 Loongson Technology Corporation Limited
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci#include <linux/acpi.h>
118c2ecf20Sopenharmony_ci#include <linux/dma-direct.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_civoid acpi_arch_dma_setup(struct device *dev)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	int ret;
168c2ecf20Sopenharmony_ci	u64 mask, end = 0;
178c2ecf20Sopenharmony_ci	const struct bus_dma_region *map = NULL;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	ret = acpi_dma_get_range(dev, &map);
208c2ecf20Sopenharmony_ci	if (!ret && map) {
218c2ecf20Sopenharmony_ci		const struct bus_dma_region *r = map;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci		for (end = 0; r->size; r++) {
248c2ecf20Sopenharmony_ci			if (r->dma_start + r->size - 1 > end)
258c2ecf20Sopenharmony_ci				end = r->dma_start + r->size - 1;
268c2ecf20Sopenharmony_ci		}
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci		mask = DMA_BIT_MASK(ilog2(end) + 1);
298c2ecf20Sopenharmony_ci		dev->bus_dma_limit = end;
308c2ecf20Sopenharmony_ci		dev->dma_range_map = map;
318c2ecf20Sopenharmony_ci		dev->coherent_dma_mask = min(dev->coherent_dma_mask, mask);
328c2ecf20Sopenharmony_ci		*dev->dma_mask = min(*dev->dma_mask, mask);
338c2ecf20Sopenharmony_ci	}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci}
36