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*4882a593Smuzhiyundma_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*4882a593Smuzhiyunphys_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*4882a593Smuzhiyunvoid __init plat_swiotlb_setup(void) 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun swiotlb_init(1); 28*4882a593Smuzhiyun } 29