summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKefeng Wang <wangkefeng.wang@huawei.com>2021-06-02 16:55:16 +0800
committerPalmer Dabbelt <palmerdabbelt@google.com>2021-06-11 13:42:26 -0700
commitce3aca0465e31c20ada1270ac6547ba28b610ab2 (patch)
treea2b2e71d99e1ec5a2f187f88bdc279e0370abf7d /arch
parentae3d69bcc455905bac1d08d3563e4e576028e896 (diff)
downloadlinux-stable-ce3aca0465e31c20ada1270ac6547ba28b610ab2.tar.gz
linux-stable-ce3aca0465e31c20ada1270ac6547ba28b610ab2.tar.bz2
linux-stable-ce3aca0465e31c20ada1270ac6547ba28b610ab2.zip
riscv: Only initialize swiotlb when necessary
The SWIOTLB buffer is not needed unless the physical address space is beyond the limit of dma, only initialize swiotlb when swiotlb_force is true or not all system memory is DMA-able. Also move the swiotlb_init() into mem_init(). Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/kernel/setup.c5
-rw-r--r--arch/riscv/mm/init.c8
2 files changed, 8 insertions, 5 deletions
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 4db4d0b5911f..5c6d2a1fdbc7 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -17,7 +17,6 @@
#include <linux/of_fdt.h>
#include <linux/of_platform.h>
#include <linux/sched/task.h>
-#include <linux/swiotlb.h>
#include <linux/smp.h>
#include <linux/efi.h>
#include <linux/crash_dump.h>
@@ -295,10 +294,6 @@ void __init setup_arch(char **cmdline_p)
protect_kernel_linear_mapping_text_rodata();
}
-#ifdef CONFIG_SWIOTLB
- swiotlb_init(1);
-#endif
-
#ifdef CONFIG_KASAN
kasan_init();
#endif
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index e7b136abf90c..30b204546ceb 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -11,6 +11,7 @@
#include <linux/memblock.h>
#include <linux/initrd.h>
#include <linux/swap.h>
+#include <linux/swiotlb.h>
#include <linux/sizes.h>
#include <linux/of_fdt.h>
#include <linux/of_reserved_mem.h>
@@ -109,6 +110,13 @@ void __init mem_init(void)
BUG_ON(!mem_map);
#endif /* CONFIG_FLATMEM */
+#ifdef CONFIG_SWIOTLB
+ if (swiotlb_force == SWIOTLB_FORCE ||
+ max_pfn > PFN_DOWN(dma32_phys_limit))
+ swiotlb_init(1);
+ else
+ swiotlb_force = SWIOTLB_NO_FORCE;
+#endif
high_memory = (void *)(__va(PFN_PHYS(max_low_pfn)));
memblock_free_all();