xref: /OK3568_Linux_fs/kernel/arch/mips/loongson64/dma.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <linux/dma-direct.h>
3*4882a593Smuzhiyun #include <linux/init.h>
4*4882a593Smuzhiyun #include <linux/swiotlb.h>
5*4882a593Smuzhiyun #include <boot_param.h>
6*4882a593Smuzhiyun 
phys_to_dma(struct device * dev,phys_addr_t paddr)7*4882a593Smuzhiyun dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun 	/* We extract 2bit node id (bit 44~47, only bit 44~45 used now) from
10*4882a593Smuzhiyun 	 * Loongson-3's 48bit address space and embed it into 40bit */
11*4882a593Smuzhiyun 	long nid = (paddr >> 44) & 0x3;
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun 	return ((nid << 44) ^ paddr) | (nid << node_id_offset);
14*4882a593Smuzhiyun }
15*4882a593Smuzhiyun 
dma_to_phys(struct device * dev,dma_addr_t daddr)16*4882a593Smuzhiyun phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	/* We extract 2bit node id (bit 44~47, only bit 44~45 used now) from
19*4882a593Smuzhiyun 	 * Loongson-3's 48bit address space and embed it into 40bit */
20*4882a593Smuzhiyun 	long nid = (daddr >> node_id_offset) & 0x3;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	return ((nid << node_id_offset) ^ daddr) | (nid << 44);
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun 
plat_swiotlb_setup(void)25*4882a593Smuzhiyun void __init plat_swiotlb_setup(void)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun 	swiotlb_init(1);
28*4882a593Smuzhiyun }
29