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),
|
__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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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/
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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.
|
* 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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user