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
This commit is contained in:
sophgo-forum-service
2024-06-06 15:18:28 +08:00
committed by carbon
parent 7ddf29a19c
commit 5c388375f5
14 changed files with 133 additions and 7 deletions

View File

@ -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), __dma_page_cpu_to_dev(phys_to_page(paddr), paddr & (PAGE_SIZE - 1),
size, dir); size, dir);
} }
EXPORT_SYMBOL_GPL(arch_sync_dma_for_device);
void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)

View File

@ -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); __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, void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)

View File

@ -1,4 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only # 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/ obj-$(CONFIG_BUILTIN_DTB) += boot/dts/

View File

@ -524,4 +524,4 @@ source "kernel/power/Kconfig"
endmenu endmenu
source "drivers/firmware/Kconfig" source "drivers/firmware/Kconfig"
source "arch/riscv/mach-cvitek/Kconfig" source "arch/riscv/march-cvitek/Kconfig"

View File

@ -37,6 +37,9 @@ enum sbi_ext_base_fid {
SBI_EXT_BASE_GET_MVENDORID, SBI_EXT_BASE_GET_MVENDORID,
SBI_EXT_BASE_GET_MARCHID, SBI_EXT_BASE_GET_MARCHID,
SBI_EXT_BASE_GET_MIMPID, 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 { enum sbi_ext_time_fid {
@ -100,6 +103,9 @@ int sbi_console_getchar(void);
long sbi_get_mvendorid(void); long sbi_get_mvendorid(void);
long sbi_get_marchid(void); long sbi_get_marchid(void);
long sbi_get_mimpid(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_set_timer(uint64_t stime_value);
void sbi_shutdown(void); void sbi_shutdown(void);
void sbi_clear_ipi(void); void sbi_clear_ipi(void);

View File

@ -562,6 +562,38 @@ long sbi_get_mimpid(void)
return __sbi_base_ecall(SBI_EXT_BASE_GET_MIMPID); 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) static void sbi_send_cpumask_ipi(const struct cpumask *target)
{ {
struct cpumask hartid_mask; struct cpumask hartid_mask;

View File

@ -1 +0,0 @@
obj-y := cvitek.o

View File

@ -0,0 +1,2 @@
obj-y += syscall_reset_c906l.o

View File

@ -0,0 +1,37 @@
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/clk.h>
#include <linux/syscalls.h>
#include <asm/sbi.h>
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;
}

View File

@ -4,7 +4,6 @@
* *
* Copyright (C) 2011 Google, Inc. * Copyright (C) 2011 Google, Inc.
*/ */
#include <linux/err.h> #include <linux/err.h>
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/kthread.h> #include <linux/kthread.h>
@ -22,7 +21,39 @@ void *ion_heap_map_kernel(struct ion_heap *heap,
{ {
void *vaddr; 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) if (buffer->flags & ION_FLAG_CACHED)
vaddr = memremap(buffer->paddr, PAGE_ALIGN(buffer->size), MEMREMAP_WB); 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)); vaddr = ioremap(buffer->paddr, PAGE_ALIGN(buffer->size));
if (!vaddr) { if (!vaddr) {
pr_err("ion_heap_map_kernel map failed\n"); pr_err("%s map failed\n", __func__);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
#endif
return vaddr; return vaddr;
} }
void ion_heap_unmap_kernel(struct ion_heap *heap, void ion_heap_unmap_kernel(struct ion_heap *heap,
struct ion_buffer *buffer) struct ion_buffer *buffer)
{ {
#if defined(CONFIG_ARM) || defined(__arm__) || defined(__aarch64__)
vunmap(buffer->vaddr);
#else
if (buffer->flags & ION_FLAG_CACHED) if (buffer->flags & ION_FLAG_CACHED)
memunmap(buffer->vaddr); memunmap(buffer->vaddr);
else else
iounmap(buffer->vaddr); iounmap(buffer->vaddr);
#endif
} }
int ion_heap_map_user(struct ion_heap *heap, struct ion_buffer *buffer, int ion_heap_map_user(struct ion_heap *heap, struct ion_buffer *buffer,

View File

@ -1222,6 +1222,8 @@ asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len,
unsigned long fd, unsigned long pgoff); unsigned long fd, unsigned long pgoff);
asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); 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 * Not a real system call, but a placeholder for syscalls which are

View File

@ -860,8 +860,13 @@ __SYSCALL(__NR_faccessat2, sys_faccessat2)
#define __NR_process_madvise 440 #define __NR_process_madvise 440
__SYSCALL(__NR_process_madvise, sys_process_madvise) __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 #undef __NR_syscalls
#define __NR_syscalls 441 #define __NR_syscalls 442
/* /*
* 32 bit systems traditionally used different * 32 bit systems traditionally used different

View File

@ -471,3 +471,7 @@ COND_SYSCALL(setuid16);
/* restartable sequence */ /* restartable sequence */
COND_SYSCALL(rseq); COND_SYSCALL(rseq);
/* cv181x/cv180x reset c906l */
COND_SYSCALL(reset_c906l);