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:
committed by
carbon
parent
7ddf29a19c
commit
5c388375f5
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -1 +0,0 @@
|
||||
obj-y := cvitek.o
|
||||
2
linux_5.10/arch/riscv/march-cvitek/Makefile
Normal file
2
linux_5.10/arch/riscv/march-cvitek/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
obj-y += syscall_reset_c906l.o
|
||||
|
||||
37
linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c
Normal file
37
linux_5.10/arch/riscv/march-cvitek/syscall_reset_c906l.c
Normal 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;
|
||||
}
|
||||
|
||||
@ -4,7 +4,6 @@
|
||||
*
|
||||
* Copyright (C) 2011 Google, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/kthread.h>
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -471,3 +471,7 @@ COND_SYSCALL(setuid16);
|
||||
|
||||
/* restartable sequence */
|
||||
COND_SYSCALL(rseq);
|
||||
|
||||
/* cv181x/cv180x reset c906l */
|
||||
COND_SYSCALL(reset_c906l);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user