|
2 | 2 | /* |
3 | 3 | * Copyright (C) 2020-2022 Loongson Technology Corporation Limited |
4 | 4 | */ |
5 | | -#include <linux/init.h> |
| 5 | +#include <linux/acpi.h> |
6 | 6 | #include <linux/dma-direct.h> |
7 | | -#include <linux/dma-mapping.h> |
8 | | -#include <linux/dma-map-ops.h> |
9 | | -#include <linux/swiotlb.h> |
10 | 7 |
|
11 | | -#include <asm/bootinfo.h> |
12 | | -#include <asm/dma.h> |
13 | | -#include <asm/loongson.h> |
14 | | - |
15 | | -/* |
16 | | - * We extract 4bit node id (bit 44~47) from Loongson-3's |
17 | | - * 48bit physical address space and embed it into 40bit. |
18 | | - */ |
19 | | - |
20 | | -static int node_id_offset; |
21 | | - |
22 | | -dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) |
23 | | -{ |
24 | | - long nid = (paddr >> 44) & 0xf; |
25 | | - |
26 | | - return ((nid << 44) ^ paddr) | (nid << node_id_offset); |
27 | | -} |
28 | | - |
29 | | -phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) |
| 8 | +void acpi_arch_dma_setup(struct device *dev) |
30 | 9 | { |
31 | | - long nid = (daddr >> node_id_offset) & 0xf; |
| 10 | + int ret; |
| 11 | + u64 mask, end = 0; |
| 12 | + const struct bus_dma_region *map = NULL; |
| 13 | + |
| 14 | + ret = acpi_dma_get_range(dev, &map); |
| 15 | + 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 | + } |
| 22 | + |
| 23 | + mask = DMA_BIT_MASK(ilog2(end) + 1); |
| 24 | + dev->bus_dma_limit = end; |
| 25 | + dev->dma_range_map = map; |
| 26 | + dev->coherent_dma_mask = min(dev->coherent_dma_mask, mask); |
| 27 | + *dev->dma_mask = min(*dev->dma_mask, mask); |
| 28 | + } |
32 | 29 |
|
33 | | - return ((nid << node_id_offset) ^ daddr) | (nid << 44); |
34 | | -} |
35 | | - |
36 | | -void __init plat_swiotlb_setup(void) |
37 | | -{ |
38 | | - swiotlb_init(true, SWIOTLB_VERBOSE); |
39 | | - node_id_offset = ((readl(LS7A_DMA_CFG) & LS7A_DMA_NODE_MASK) >> LS7A_DMA_NODE_SHF) + 36; |
40 | 30 | } |
0 commit comments