From 5c388375f5b9af563b921e6156dc0bfef7ad8e00 Mon Sep 17 00:00:00 2001 From: sophgo-forum-service Date: Thu, 6 Jun 2024 15:18:28 +0800 Subject: [PATCH] linux_5.10: weekly rls 2024.06.6 -74ac5b, Export arm/arm64 arch_sync_dma_for_device api. -5c342e, Fix ion arm api. -d9b948, Add C906L rst/unrst/reset syscall. Change-Id: Id2764250d02c62715b79480ad6b6fcc3a20aad48 --- linux_5.10/arch/arm/mm/dma-mapping.c | 1 + linux_5.10/arch/arm64/mm/dma-mapping.c | 1 + linux_5.10/arch/riscv/Kbuild | 2 +- linux_5.10/arch/riscv/Kconfig | 2 +- linux_5.10/arch/riscv/include/asm/sbi.h | 6 +++ linux_5.10/arch/riscv/kernel/sbi.c | 32 ++++++++++++++ linux_5.10/arch/riscv/mach-cvitek/Makefile | 1 - .../{mach-cvitek => march-cvitek}/Kconfig | 0 linux_5.10/arch/riscv/march-cvitek/Makefile | 2 + .../riscv/march-cvitek/syscall_reset_c906l.c | 37 ++++++++++++++++ .../drivers/staging/android/ion/ion_heap.c | 43 +++++++++++++++++-- linux_5.10/include/linux/syscalls.h | 2 + linux_5.10/include/uapi/asm-generic/unistd.h | 7 ++- linux_5.10/kernel/sys_ni.c | 4 ++ 14 files changed, 133 insertions(+), 7 deletions(-) delete mode 100644 linux_5.10/arch/riscv/mach-cvitek/Makefile rename linux_5.10/arch/riscv/{mach-cvitek => march-cvitek}/Kconfig (100%) create mode 100644 linux_5.10/arch/riscv/march-cvitek/Makefile create mode 100644 linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c diff --git a/linux_5.10/arch/arm/mm/dma-mapping.c b/linux_5.10/arch/arm/mm/dma-mapping.c index c4b8df2ad..ccd6913e1 100644 --- a/linux_5.10/arch/arm/mm/dma-mapping.c +++ b/linux_5.10/arch/arm/mm/dma-mapping.c @@ -2303,6 +2303,7 @@ void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, __dma_page_cpu_to_dev(phys_to_page(paddr), paddr & (PAGE_SIZE - 1), size, dir); } +EXPORT_SYMBOL_GPL(arch_sync_dma_for_device); void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, enum dma_data_direction dir) diff --git a/linux_5.10/arch/arm64/mm/dma-mapping.c b/linux_5.10/arch/arm64/mm/dma-mapping.c index abd29ac4c..5cbab894f 100644 --- a/linux_5.10/arch/arm64/mm/dma-mapping.c +++ b/linux_5.10/arch/arm64/mm/dma-mapping.c @@ -18,6 +18,7 @@ void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, { __dma_map_area(phys_to_virt(paddr), size, dir); } +EXPORT_SYMBOL_GPL(arch_sync_dma_for_device); void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, enum dma_data_direction dir) diff --git a/linux_5.10/arch/riscv/Kbuild b/linux_5.10/arch/riscv/Kbuild index 4614c01ba..1c5df4732 100644 --- a/linux_5.10/arch/riscv/Kbuild +++ b/linux_5.10/arch/riscv/Kbuild @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-y += kernel/ mm/ net/ +obj-y += kernel/ mm/ net/ march-cvitek/ obj-$(CONFIG_BUILTIN_DTB) += boot/dts/ diff --git a/linux_5.10/arch/riscv/Kconfig b/linux_5.10/arch/riscv/Kconfig index c82f7afd9..872a1f272 100644 --- a/linux_5.10/arch/riscv/Kconfig +++ b/linux_5.10/arch/riscv/Kconfig @@ -524,4 +524,4 @@ source "kernel/power/Kconfig" endmenu source "drivers/firmware/Kconfig" -source "arch/riscv/mach-cvitek/Kconfig" +source "arch/riscv/march-cvitek/Kconfig" diff --git a/linux_5.10/arch/riscv/include/asm/sbi.h b/linux_5.10/arch/riscv/include/asm/sbi.h index 9746edaab..8b5df5d9c 100644 --- a/linux_5.10/arch/riscv/include/asm/sbi.h +++ b/linux_5.10/arch/riscv/include/asm/sbi.h @@ -37,6 +37,9 @@ enum sbi_ext_base_fid { SBI_EXT_BASE_GET_MVENDORID, SBI_EXT_BASE_GET_MARCHID, SBI_EXT_BASE_GET_MIMPID, + SBI_EXT_BASE_RESET_C906L, + SBI_EXT_BASE_RST_C906L, + SBI_EXT_BASE_UNRST_C906L, }; enum sbi_ext_time_fid { @@ -100,6 +103,9 @@ int sbi_console_getchar(void); long sbi_get_mvendorid(void); long sbi_get_marchid(void); long sbi_get_mimpid(void); +long sbi_rst_c906l(void); +long sbi_unrst_c906l(const unsigned long address); +long sbi_reset_c906l(const unsigned long address); void sbi_set_timer(uint64_t stime_value); void sbi_shutdown(void); void sbi_clear_ipi(void); diff --git a/linux_5.10/arch/riscv/kernel/sbi.c b/linux_5.10/arch/riscv/kernel/sbi.c index 51a4e5f23..2b06367d0 100644 --- a/linux_5.10/arch/riscv/kernel/sbi.c +++ b/linux_5.10/arch/riscv/kernel/sbi.c @@ -562,6 +562,38 @@ long sbi_get_mimpid(void) return __sbi_base_ecall(SBI_EXT_BASE_GET_MIMPID); } +long sbi_rst_c906l(void) +{ + return __sbi_base_ecall(SBI_EXT_BASE_RST_C906L); +} +EXPORT_SYMBOL(sbi_rst_c906l); + +long sbi_unrst_c906l(const unsigned long address) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_UNRST_C906L + , address, 0, 0, 0, 0, 0); + if (ret.error) + return ret.error; + + return 0; +} +EXPORT_SYMBOL(sbi_unrst_c906l); + +long sbi_reset_c906l(const unsigned long address) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_RESET_C906L + , address, 0, 0, 0, 0, 0); + if (ret.error) + return ret.error; + + return 0; +} +EXPORT_SYMBOL(sbi_reset_c906l); + static void sbi_send_cpumask_ipi(const struct cpumask *target) { struct cpumask hartid_mask; diff --git a/linux_5.10/arch/riscv/mach-cvitek/Makefile b/linux_5.10/arch/riscv/mach-cvitek/Makefile deleted file mode 100644 index c52d393fb..000000000 --- a/linux_5.10/arch/riscv/mach-cvitek/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-y := cvitek.o diff --git a/linux_5.10/arch/riscv/mach-cvitek/Kconfig b/linux_5.10/arch/riscv/march-cvitek/Kconfig similarity index 100% rename from linux_5.10/arch/riscv/mach-cvitek/Kconfig rename to linux_5.10/arch/riscv/march-cvitek/Kconfig diff --git a/linux_5.10/arch/riscv/march-cvitek/Makefile b/linux_5.10/arch/riscv/march-cvitek/Makefile new file mode 100644 index 000000000..96468a463 --- /dev/null +++ b/linux_5.10/arch/riscv/march-cvitek/Makefile @@ -0,0 +1,2 @@ +obj-y += syscall_reset_c906l.o + diff --git a/linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c b/linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c new file mode 100644 index 000000000..8481ba473 --- /dev/null +++ b/linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include +#include +#include + +SYSCALL_DEFINE2(reset_c906l, int, reset, const unsigned long, address) +{ + int ret = -1; + struct clk *efuse_clk = NULL; + + efuse_clk = clk_get_sys(NULL, "clk_efuse"); + if (IS_ERR(efuse_clk)) { + pr_err("%s: efuse clock not found %ld\n", __func__ + , PTR_ERR(efuse_clk)); + return -1; + } + + clk_prepare_enable(efuse_clk); + switch (reset) { + case 0: //rst + ret = sbi_rst_c906l(); + break; + case 1: //unrst + ret = sbi_unrst_c906l(address); + break; + case 2: //rst + unrst + ret = sbi_reset_c906l(address); + break; + default: + break; + }; + + clk_disable_unprepare(efuse_clk); + return ret; +} + diff --git a/linux_5.10/drivers/staging/android/ion/ion_heap.c b/linux_5.10/drivers/staging/android/ion/ion_heap.c index 8978b0099..d91eecdce 100644 --- a/linux_5.10/drivers/staging/android/ion/ion_heap.c +++ b/linux_5.10/drivers/staging/android/ion/ion_heap.c @@ -4,7 +4,6 @@ * * Copyright (C) 2011 Google, Inc. */ - #include #include #include @@ -22,7 +21,39 @@ void *ion_heap_map_kernel(struct ion_heap *heap, { void *vaddr; - pr_debug("ion_heap_map_kernel addr=0x%llx, size=%lu\n", buffer->paddr, PAGE_ALIGN(buffer->size)); +#if defined(CONFIG_ARM) || defined(__arm__) || defined(__aarch64__) + pr_debug("%s addr=0x%llx, size=%lu\n", __func__, buffer->paddr, PAGE_ALIGN(buffer->size)); + + struct sg_page_iter piter; + pgprot_t pgprot; + struct sg_table *table = buffer->sg_table; + int npages = PAGE_ALIGN(buffer->size) / PAGE_SIZE; + struct page **pages = vmalloc(array_size(npages, + sizeof(struct page *))); + struct page **tmp = pages; + + if (!pages) + return ERR_PTR(-ENOMEM); + + if (buffer->flags & ION_FLAG_CACHED) + pgprot = PAGE_KERNEL; + else + pgprot = pgprot_writecombine(PAGE_KERNEL); + + for_each_sgtable_page(table, &piter, 0) { + WARN_ON(tmp - pages >= npages); + *tmp++ = sg_page_iter_page(&piter); + } + + vaddr = vmap(pages, npages, VM_MAP, pgprot); + vfree(pages); + + if (!vaddr) + return ERR_PTR(-ENOMEM); + +#else + + pr_debug("%s addr=0x%llx, size=%lu\n", __func__, buffer->paddr, PAGE_ALIGN(buffer->size)); if (buffer->flags & ION_FLAG_CACHED) vaddr = memremap(buffer->paddr, PAGE_ALIGN(buffer->size), MEMREMAP_WB); @@ -30,20 +61,26 @@ void *ion_heap_map_kernel(struct ion_heap *heap, vaddr = ioremap(buffer->paddr, PAGE_ALIGN(buffer->size)); if (!vaddr) { - pr_err("ion_heap_map_kernel map failed\n"); + pr_err("%s map failed\n", __func__); return ERR_PTR(-ENOMEM); } +#endif return vaddr; } void ion_heap_unmap_kernel(struct ion_heap *heap, struct ion_buffer *buffer) { +#if defined(CONFIG_ARM) || defined(__arm__) || defined(__aarch64__) + vunmap(buffer->vaddr); +#else if (buffer->flags & ION_FLAG_CACHED) memunmap(buffer->vaddr); else iounmap(buffer->vaddr); + +#endif } int ion_heap_map_user(struct ion_heap *heap, struct ion_buffer *buffer, diff --git a/linux_5.10/include/linux/syscalls.h b/linux_5.10/include/linux/syscalls.h index 37bea07c1..fb11994b9 100644 --- a/linux_5.10/include/linux/syscalls.h +++ b/linux_5.10/include/linux/syscalls.h @@ -1222,6 +1222,8 @@ asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len, unsigned long fd, unsigned long pgoff); asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); +/* add by sophon.com, rst/unrst c906l */ +asmlinkage long sys_reset_c906l(int reset, const unsigned long address); /* * Not a real system call, but a placeholder for syscalls which are diff --git a/linux_5.10/include/uapi/asm-generic/unistd.h b/linux_5.10/include/uapi/asm-generic/unistd.h index 15279e8d8..39ff682f4 100644 --- a/linux_5.10/include/uapi/asm-generic/unistd.h +++ b/linux_5.10/include/uapi/asm-generic/unistd.h @@ -860,8 +860,13 @@ __SYSCALL(__NR_faccessat2, sys_faccessat2) #define __NR_process_madvise 440 __SYSCALL(__NR_process_madvise, sys_process_madvise) +// Reset/Unreset c906l at cv181x/cv180x +// add by sophon.com +#define __NR_reset_c906l 441 +__SYSCALL(__NR_reset_c906l, sys_reset_c906l) + #undef __NR_syscalls -#define __NR_syscalls 441 +#define __NR_syscalls 442 /* * 32 bit systems traditionally used different diff --git a/linux_5.10/kernel/sys_ni.c b/linux_5.10/kernel/sys_ni.c index f27ac94d5..9f437f671 100644 --- a/linux_5.10/kernel/sys_ni.c +++ b/linux_5.10/kernel/sys_ni.c @@ -471,3 +471,7 @@ COND_SYSCALL(setuid16); /* restartable sequence */ COND_SYSCALL(rseq); + +/* cv181x/cv180x reset c906l */ +COND_SYSCALL(reset_c906l); +