C-SKY(csky) Linux Kernel Port
Subsystems (11)
v3 cover C-SKY(csky) Linux Kernel Port
This is the 3th version patchset to add the Linux kernel port for C-SKY(csky). Thanks to everyone who provided feedback on the previous version.
This patchset adds architecture support to Linux for C-SKY's 32-bit embedded CPU cores and the patches are based on linux-4.18.4
There are two ABI versions with several CPU cores in this patchset:
ABIv1: ck610 (16-bit instruction, 32-bit data path, VIPT Cache ...)
ABIv2: ck807 ck810 ck860 (16/32-bit variable length instruction, PIPT Cache,
SMP ...)
More information: http://en.c-sky.com
I'm from Hangzhou,China C-SKY Microsystems and responsible for C-SKY Linux port. The development repo is
https://gitlab.com/c-sky/csky-linux
We use buildroot as our CI-test enviornment. "LTP, Lmbench, uclibc-ng-test ..." will be tested for every commit. See here for more details:
https://gitlab.com/c-sky/buildroot/pipelines
You can try C-SKY linux in a few steps:
$ git clone https://gitlab.com/c-sky/buildroot.git $ cd buildroot $ make qemu_csky_ck807f_4.18_glibc_defconfig $ make It will download "linux glibc gcc binutils qemu busybox" source code and build them into one image. How to run, See: https://c-sky.gitlab.io/-/buildroot/-/jobs/94714727/artifacts/output/images/readme.txt
Any feedback is welcome.
Changes in v3:
dc560f1 csky: change to EM_CSKY 252 for elf.h
2ac3ddf csky: remove gx6605s.dts
af00b8c csky: add defconfig and qemu.dts
6c87efb csky: remove the deprecate name.
f6dda39 csky: add dt-bindings doc.
d9f02a8 csky: remove KERNEL_VERSION in upstream branch 7bd663c csky: Use kernel/dma/noncoherent.c
1544c09 csky: bugfix emmc hang up LINS-976
e963271 csky: cleanup include/asm/Kbuild
cd267ba csky: remove CSKY_DEBUG_INFO
78950da csky: remove dcache invalid.
13fe51d csky: remove csum_ipv6_magic(), use generic one. a7372db csky: bugfix CK810 access twice error.
1bb7c69 csky: bugfix add gcc asm memory for barrier. 5ea3257 csky: add -msoft-float instead of -mfloat-abi=soft. 38b037d csky: bugfix losing cache flush range.
ab5e8c4 csky: Add ticket-spinlock and qrwlock support. c9aaec5 csky: rename cskyksyms.c to libgcc_ksyms.c 28c5e48 csky: avoid the MB on failure: trylock
f929c97 csky: bugfix idly4 may cause exception.
09dc496 csky: Use GENERIC_ASHLDI3/ASHRDI3 etc
6ecc99d csky: optimize smp boot code.
16f50df csky: asm/bug.h simple implement.
0ba532a csky: csky asm/atomic.h added.
df66947 csky: asm/compat.h added
275a06f csky: String operations optimization
4c021dd csky: ck860 SMP memory barrier optimize
fc39c66 csky: Add wait/doze/stop
d005144 csky: add GENERIC_ALLOCATOR
4a10074 csky: bugfix cma failed for highmem.
9f2ca70 csky: CMA supported :)
53791f4 csky: optimize csky_dma_alloc_nonatomic
974676e csky: optimize the cpuinfo printf.
2538669 csky: bugfix make headers_install error.
1158d0c csky: prevent hard-float and vdsp instructions. dc3c856 csky: increase Normal Memory to 1GB
6ee5932 csky: bugfix qemu mmu couldn't support 0xffffe000 1d7dfb8 csky: csky_dma_alloc_atomic added.
caf6610 csky: restruct the fixmap memory layout.
5a17eaa csky: use -Wa,-mcpu=ckxxxfv to the as.
4d51829 csky: use Kconfig.hz.
f3f88fa csky: BUGFIX add -mcpu=ck860f support
6192fd1 csky: support ck860 fpu.
7aa5e01 csky: BUGFIX add smp_mb before ldex.
15758e2 csky: BUGFIX tlbi couldn't handle ASID in another CPU core. d69640d csky: enable tlbi.vas to flush one tlb entry
Changes in v2:
a29bfc8 csky: add pre_mmu_init, move misc mmu setup to mm/init.c
4eab702 csky: no need kmap for !VM_EXEC.
6770eec csky: Use TEE as the name of CPU Trusted Execution Enviornment.
a56c8c7 csky: update the cache flush api.
1a48a95 csky: add C-SKY Trust Zone.
b7a0a44 csky: use CONFIG_RAM_BASE as the same in memory of dts.
15adf81 csky: remove unused code.
35c0d97 csky: bugfix lost a cacheline flush when start isn't cacheline-aligned.
4e82c8d csky: use tlbi.alls for ck860 smp temporary.
ae7149e csky: bugfix use kmap_atomic() to prevent no mapped addr.
5538795 csky: bugfix user access in kernel space.
a7aa591 csky: add 16bit user space bkpt.
0de70ec csky: add sync.is for cmpxchg in SMP.
c5c08a1 csky: seperate sync.is and sync for SMP and Non-SMP.
dbbf4dc csky: use sync.is for ck860 mb().
f33f8da csky: rewrite the alignment implement.
68152c7 csky: bugfix alignment pt_regs error.
d618d43 csky: support set_affinity for irq balance in SMP
ebf86c9 csky: bugfix compile error without CONFIG_SMP.
8537eea csky: remove debug code.
4ebc051 csky: bugfix compile error with linux-4.9.56
75a938e csky: C-SKY SMP supported.
0eebc07 csky: use internal function for map_sg.
3d29751 csky: bugfix can't support highmem
b545d2a csky: bugfix r26 is the link reg for jsri_to_jsr.
9e3313a csky: bugfix sync tls for abiv1 in ptrace.
587a0d2 csky: use __NR_rt_sigreturn in asm-generic.
f562b46 csky: bugfix gpr_set & fpr_set
f57266f csky: bugfix fpu_fpe_helper excute mtcr mfcr.
c676669 csky: bugfix ave is default enable on reset.
d40d34d csky: remove unused sc_mask in sigcontext.h.
274b7a2 csky: redesign the signal's api
7501771 csky: bugfix forget restore usp.
923e2ca csky: re-struct the pt_regs for regset.
2a1e499 csky: fixup config.
ada81ec csky: bugfix abiv1 compile error.
e34acb9 csky: bugfix abiv1 couldn't support -mno-stack-size.
ec53560 csky: change irq map, reserve soft_irq&private_irq space.
c7576f7 csky: bugfix modpost warning with -mno-stack-size
c8ff9d4 csky: support csky mp timer alpha version.
deabaaf csky: update .gitignore.
574815c csky: bugfix compile error with abiv1 in 4.15
0b426a7 csky: bugfix format of cpu verion id.
083435f csky: irq-csky-v2 alpha init.
21209e5 csky: add .gitignore
73e19b4 csky: remove FMFS_FPU_REGS/FMTS_FPU_REGS
07e8fac csky: add fpu regset in ptrace.c
cac779d csky: add CSKY_VECIRQ_LEGENCY for SOC bug.
54bab1d csky: move usp into pt_regs.
b167422 csky: support regset for ptrace.
a098d4c csky: remove ARCH_WANT_IPC_PARSE_VERSION
fe61a84 csky: add timer-of support.
27702e2 csky: bugfix boot error.
ebe3edb csky: bugfix gx6605s boot failed - add __HEAD to head.section for head.S - move INIT_SECTION together to fix compile warning. 7138cae csky: coding convension for timer-nationalchip.c
fa7f9bb csky: use ffs instead of fls.
ddc9e81 csky: change to generic irq chip for irq-csky.c
e9be8b9 irqchip: add generic irq chip for irq-nationalchip
2ee83fe csky: add set_handle_irq(), ref from openrisc & arm.
74181d6 csky: use irq_domain_add_linear instead of leagcy.
fa45ae4 csky: bugfix setup stroge order for uncached.
eb8030f csky: add HIGHMEM config in Kconfig
4f983d4 csky: remove "default n" in Kconfig
2467575 csky: use asm-generic/signal.h
77438e5 csky: coding conventions for irq.c
2e4a2b4 csky: optimize the cache flush ops.
96e1c58 csky: add CONFIG_CPU_ASID_BITS.
9339666 csky: add cprcr() cpwcr() for abiv1
ff05be4 csky: add THREAD_SHIFT define in asm/page.h
52ab022 csky: add mfcr() mtcr() in asm/reg_ops.h
bdcd8f3 csky: revert back Kconfig select.
590c7e6 csky: bugfix compile error with CONFIG_AUDIT
1989292 csky: revert some back with cleanup unistd.h
f1454fe csky: cleanup unistd.h
5d2985f csky: cleanup Kconfig and Makefile.
423d97e csky: cancel subdirectories
cae2af4 csky: use asm-generic/fcntl.h
Guo Ren (26):
csky: Build infrastructure
csky: defconfig
csky: Kernel booting
csky: Exception handling
csky: System Call
csky: Cache and TLB routines
csky: MMU and page table management
csky: Process management and Signal
csky: VDSO and rt_sigreturn
csky: IRQ handling
csky: Atomic operations
csky: ELF and module probe
csky: Library functions
csky: User access
csky: Debug and Ptrace GDB
csky: SMP support
csky: Misc headers
dt-bindings: csky CPU Bindings
dt-bindings: timer: gx6605s SOC timer
dt-bindings: timer: C-SKY Multi-processor timer
dt-bindings: interrupt-controller: C-SKY APB intc
dt-bindings: interrupt-controller: C-SKY SMP intc
clocksource: add gx6605s SOC system timer
clocksource: add C-SKY SMP timer
clocksource: add C-SKY timers' build infrastructure
irqchip: add C-SKY irqchip drivers
Documentation/devicetree/bindings/csky/cpus.txt | 70 ++++ .../interrupt-controller/csky,apb-intc.txt | 45 +++ .../bindings/interrupt-controller/csky,mpintc.txt | 40 +++ .../bindings/timer/csky,gx6605s-timer.txt | 46 +++ .../devicetree/bindings/timer/csky,mptimer.txt | 46 +++ arch/csky/Kconfig | 230 ++++++++++++ arch/csky/Kconfig.debug | 14 + arch/csky/Makefile | 93 +++++ arch/csky/abiv1/Makefile | 8 + arch/csky/abiv1/alignment.c | 331 +++++++++++++++++ arch/csky/abiv1/bswapdi.c | 18 + arch/csky/abiv1/bswapsi.c | 14 + arch/csky/abiv1/cacheflush.c | 50 +++ arch/csky/abiv1/inc/abi/cacheflush.h | 41 +++ arch/csky/abiv1/inc/abi/ckmmu.h | 74 ++++ arch/csky/abiv1/inc/abi/entry.h | 159 +++++++++ arch/csky/abiv1/inc/abi/page.h | 26 ++ arch/csky/abiv1/inc/abi/pgtable-bits.h | 36 ++ arch/csky/abiv1/inc/abi/reg_ops.h | 26 ++ arch/csky/abiv1/inc/abi/regdef.h | 25 ++ arch/csky/abiv1/inc/abi/string.h | 13 + arch/csky/abiv1/inc/abi/tlb.h | 11 + arch/csky/abiv1/inc/abi/vdso.h | 17 + arch/csky/abiv1/memcpy.S | 344 ++++++++++++++++++ arch/csky/abiv1/memset.c | 38 ++ arch/csky/abiv1/mmap.c | 65 ++++ arch/csky/abiv1/strksyms.c | 7 + arch/csky/abiv2/Makefile | 10 + arch/csky/abiv2/cacheflush.c | 54 +++ arch/csky/abiv2/fpu.c | 281 +++++++++++++++ arch/csky/abiv2/inc/abi/cacheflush.h | 38 ++ arch/csky/abiv2/inc/abi/ckmmu.h | 87 +++++ arch/csky/abiv2/inc/abi/entry.h | 157 ++++++++ arch/csky/abiv2/inc/abi/fpu.h | 66 ++++ arch/csky/abiv2/inc/abi/page.h | 14 + arch/csky/abiv2/inc/abi/pgtable-bits.h | 37 ++ arch/csky/abiv2/inc/abi/reg_ops.h | 17 + arch/csky/abiv2/inc/abi/regdef.h | 26 ++ arch/csky/abiv2/inc/abi/string.h | 28 ++ arch/csky/abiv2/inc/abi/tlb.h | 12 + arch/csky/abiv2/inc/abi/vdso.h | 24 ++ arch/csky/abiv2/memcmp.S | 151 ++++++++ arch/csky/abiv2/memcpy.S | 110 ++++++ arch/csky/abiv2/memcpy.c | 40 +++ arch/csky/abiv2/memmove.S | 108 ++++++ arch/csky/abiv2/memset.S | 83 +++++ arch/csky/abiv2/strcmp.S | 168 +++++++++ arch/csky/abiv2/strcpy.S | 123 +++++++ arch/csky/abiv2/strksyms.c | 12 + arch/csky/abiv2/strlen.S | 97 +++++ arch/csky/abiv2/sysdep.h | 29 ++ arch/csky/boot/Makefile | 24 ++ arch/csky/boot/dts/Makefile | 13 + arch/csky/boot/dts/include/dt-bindings | 1 + arch/csky/boot/dts/qemu.dts | 77 ++++ arch/csky/configs/defconfig | 76 ++++ arch/csky/include/asm/Kbuild | 69 ++++ arch/csky/include/asm/addrspace.h | 10 + arch/csky/include/asm/atomic.h | 215 +++++++++++ arch/csky/include/asm/barrier.h | 45 +++ arch/csky/include/asm/bitops.h | 281 +++++++++++++++ arch/csky/include/asm/bug.h | 26 ++ arch/csky/include/asm/cache.h | 28 ++ arch/csky/include/asm/cacheflush.h | 8 + arch/csky/include/asm/checksum.h | 54 +++ arch/csky/include/asm/cmpxchg.h | 70 ++++ arch/csky/include/asm/compat.h | 11 + arch/csky/include/asm/elf.h | 149 ++++++++ arch/csky/include/asm/fixmap.h | 26 ++ arch/csky/include/asm/highmem.h | 50 +++ arch/csky/include/asm/io.h | 23 ++ arch/csky/include/asm/irq.h | 10 + arch/csky/include/asm/irqflags.h | 49 +++ arch/csky/include/asm/mmu.h | 11 + arch/csky/include/asm/mmu_context.h | 148 ++++++++ arch/csky/include/asm/page.h | 101 ++++++ arch/csky/include/asm/pgalloc.h | 108 ++++++ arch/csky/include/asm/pgtable.h | 299 ++++++++++++++++ arch/csky/include/asm/processor.h | 120 +++++++ arch/csky/include/asm/reg_ops.h | 22 ++ arch/csky/include/asm/segment.h | 18 + arch/csky/include/asm/shmparam.h | 10 + arch/csky/include/asm/smp.h | 26 ++ arch/csky/include/asm/spinlock.h | 286 +++++++++++++++ arch/csky/include/asm/spinlock_types.h | 35 ++ arch/csky/include/asm/string.h | 13 + arch/csky/include/asm/switch_to.h | 35 ++ arch/csky/include/asm/syscall.h | 69 ++++ arch/csky/include/asm/syscalls.h | 14 + arch/csky/include/asm/thread_info.h | 74 ++++ arch/csky/include/asm/tlb.h | 19 + arch/csky/include/asm/tlbflush.h | 22 ++ arch/csky/include/asm/traps.h | 39 ++ arch/csky/include/asm/uaccess.h | 396 +++++++++++++++++++++ arch/csky/include/asm/unistd.h | 3 + arch/csky/include/asm/vdso.h | 12 + arch/csky/include/uapi/asm/Kbuild | 33 ++ arch/csky/include/uapi/asm/byteorder.h | 14 + arch/csky/include/uapi/asm/cachectl.h | 13 + arch/csky/include/uapi/asm/ptrace.h | 103 ++++++ arch/csky/include/uapi/asm/sigcontext.h | 13 + arch/csky/include/uapi/asm/unistd.h | 10 + arch/csky/kernel/Makefile | 8 + arch/csky/kernel/asm-offsets.c | 85 +++++ arch/csky/kernel/atomic.S | 86 +++++ arch/csky/kernel/cpu-probe.c | 78 ++++ arch/csky/kernel/dumpstack.c | 64 ++++ arch/csky/kernel/entry.S | 396 +++++++++++++++++++++ arch/csky/kernel/head.S | 78 ++++ arch/csky/kernel/irq.c | 31 ++ arch/csky/kernel/module.c | 82 +++++ arch/csky/kernel/platform.c | 17 + arch/csky/kernel/power.c | 30 ++ arch/csky/kernel/process.c | 134 +++++++ arch/csky/kernel/ptrace.c | 317 +++++++++++++++++ arch/csky/kernel/setup.c | 150 ++++++++ arch/csky/kernel/signal.c | 350 ++++++++++++++++++ arch/csky/kernel/smp.c | 234 ++++++++++++ arch/csky/kernel/syscall.c | 63 ++++ arch/csky/kernel/syscall_table.c | 13 + arch/csky/kernel/time.c | 11 + arch/csky/kernel/traps.c | 168 +++++++++ arch/csky/kernel/vdso.c | 88 +++++ arch/csky/kernel/vmlinux.lds.S | 64 ++++ arch/csky/lib/Makefile | 1 + arch/csky/lib/delay.c | 40 +++ arch/csky/lib/usercopy.c | 271 ++++++++++++++ arch/csky/mm/Makefile | 13 + arch/csky/mm/cachev1.c | 126 +++++++ arch/csky/mm/cachev2.c | 79 ++++ arch/csky/mm/dma-mapping.c | 254 +++++++++++++ arch/csky/mm/fault.c | 220 ++++++++++++ arch/csky/mm/highmem.c | 195 ++++++++++ arch/csky/mm/init.c | 116 ++++++ arch/csky/mm/ioremap.c | 48 +++ arch/csky/mm/syscache.c | 28 ++ arch/csky/mm/tlb.c | 214 +++++++++++ drivers/clocksource/Kconfig | 15 + drivers/clocksource/Makefile | 2 + drivers/clocksource/csky_mptimer.c | 178 +++++++++ drivers/clocksource/timer-gx6605s.c | 150 ++++++++ drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-csky-apb-intc.c | 243 +++++++++++++ drivers/irqchip/irq-csky-mpintc.c | 191 ++++++++++ 144 files changed, 11972 insertions(+) create mode 100644 Documentation/devicetree/bindings/csky/cpus.txt create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt create mode 100644 Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt create mode 100644 Documentation/devicetree/bindings/timer/csky,mptimer.txt create mode 100644 arch/csky/Kconfig create mode 100644 arch/csky/Kconfig.debug create mode 100644 arch/csky/Makefile create mode 100644 arch/csky/abiv1/Makefile create mode 100644 arch/csky/abiv1/alignment.c create mode 100644 arch/csky/abiv1/bswapdi.c create mode 100644 arch/csky/abiv1/bswapsi.c create mode 100644 arch/csky/abiv1/cacheflush.c create mode 100644 arch/csky/abiv1/inc/abi/cacheflush.h create mode 100644 arch/csky/abiv1/inc/abi/ckmmu.h create mode 100644 arch/csky/abiv1/inc/abi/entry.h create mode 100644 arch/csky/abiv1/inc/abi/page.h create mode 100644 arch/csky/abiv1/inc/abi/pgtable-bits.h create mode 100644 arch/csky/abiv1/inc/abi/reg_ops.h create mode 100644 arch/csky/abiv1/inc/abi/regdef.h create mode 100644 arch/csky/abiv1/inc/abi/string.h create mode 100644 arch/csky/abiv1/inc/abi/tlb.h create mode 100644 arch/csky/abiv1/inc/abi/vdso.h create mode 100644 arch/csky/abiv1/memcpy.S create mode 100644 arch/csky/abiv1/memset.c create mode 100644 arch/csky/abiv1/mmap.c create mode 100644 arch/csky/abiv1/strksyms.c create mode 100644 arch/csky/abiv2/Makefile create mode 100644 arch/csky/abiv2/cacheflush.c create mode 100644 arch/csky/abiv2/fpu.c create mode 100644 arch/csky/abiv2/inc/abi/cacheflush.h create mode 100644 arch/csky/abiv2/inc/abi/ckmmu.h create mode 100644 arch/csky/abiv2/inc/abi/entry.h create mode 100644 arch/csky/abiv2/inc/abi/fpu.h create mode 100644 arch/csky/abiv2/inc/abi/page.h create mode 100644 arch/csky/abiv2/inc/abi/pgtable-bits.h create mode 100644 arch/csky/abiv2/inc/abi/reg_ops.h create mode 100644 arch/csky/abiv2/inc/abi/regdef.h create mode 100644 arch/csky/abiv2/inc/abi/string.h create mode 100644 arch/csky/abiv2/inc/abi/tlb.h create mode 100644 arch/csky/abiv2/inc/abi/vdso.h create mode 100644 arch/csky/abiv2/memcmp.S create mode 100644 arch/csky/abiv2/memcpy.S create mode 100644 arch/csky/abiv2/memcpy.c create mode 100644 arch/csky/abiv2/memmove.S create mode 100644 arch/csky/abiv2/memset.S create mode 100644 arch/csky/abiv2/strcmp.S create mode 100644 arch/csky/abiv2/strcpy.S create mode 100644 arch/csky/abiv2/strksyms.c create mode 100644 arch/csky/abiv2/strlen.S create mode 100644 arch/csky/abiv2/sysdep.h create mode 100644 arch/csky/boot/Makefile create mode 100644 arch/csky/boot/dts/Makefile create mode 120000 arch/csky/boot/dts/include/dt-bindings create mode 100644 arch/csky/boot/dts/qemu.dts create mode 100644 arch/csky/configs/defconfig create mode 100644 arch/csky/include/asm/Kbuild create mode 100644 arch/csky/include/asm/addrspace.h create mode 100644 arch/csky/include/asm/atomic.h create mode 100644 arch/csky/include/asm/barrier.h create mode 100644 arch/csky/include/asm/bitops.h create mode 100644 arch/csky/include/asm/bug.h create mode 100644 arch/csky/include/asm/cache.h create mode 100644 arch/csky/include/asm/cacheflush.h create mode 100644 arch/csky/include/asm/checksum.h create mode 100644 arch/csky/include/asm/cmpxchg.h create mode 100644 arch/csky/include/asm/compat.h create mode 100644 arch/csky/include/asm/elf.h create mode 100644 arch/csky/include/asm/fixmap.h create mode 100644 arch/csky/include/asm/highmem.h create mode 100644 arch/csky/include/asm/io.h create mode 100644 arch/csky/include/asm/irq.h create mode 100644 arch/csky/include/asm/irqflags.h create mode 100644 arch/csky/include/asm/mmu.h create mode 100644 arch/csky/include/asm/mmu_context.h create mode 100644 arch/csky/include/asm/page.h create mode 100644 arch/csky/include/asm/pgalloc.h create mode 100644 arch/csky/include/asm/pgtable.h create mode 100644 arch/csky/include/asm/processor.h create mode 100644 arch/csky/include/asm/reg_ops.h create mode 100644 arch/csky/include/asm/segment.h create mode 100644 arch/csky/include/asm/shmparam.h create mode 100644 arch/csky/include/asm/smp.h create mode 100644 arch/csky/include/asm/spinlock.h create mode 100644 arch/csky/include/asm/spinlock_types.h create mode 100644 arch/csky/include/asm/string.h create mode 100644 arch/csky/include/asm/switch_to.h create mode 100644 arch/csky/include/asm/syscall.h create mode 100644 arch/csky/include/asm/syscalls.h create mode 100644 arch/csky/include/asm/thread_info.h create mode 100644 arch/csky/include/asm/tlb.h create mode 100644 arch/csky/include/asm/tlbflush.h create mode 100644 arch/csky/include/asm/traps.h create mode 100644 arch/csky/include/asm/uaccess.h create mode 100644 arch/csky/include/asm/unistd.h create mode 100644 arch/csky/include/asm/vdso.h create mode 100644 arch/csky/include/uapi/asm/Kbuild create mode 100644 arch/csky/include/uapi/asm/byteorder.h create mode 100644 arch/csky/include/uapi/asm/cachectl.h create mode 100644 arch/csky/include/uapi/asm/ptrace.h create mode 100644 arch/csky/include/uapi/asm/sigcontext.h create mode 100644 arch/csky/include/uapi/asm/unistd.h create mode 100644 arch/csky/kernel/Makefile create mode 100644 arch/csky/kernel/asm-offsets.c create mode 100644 arch/csky/kernel/atomic.S create mode 100644 arch/csky/kernel/cpu-probe.c create mode 100644 arch/csky/kernel/dumpstack.c create mode 100644 arch/csky/kernel/entry.S create mode 100644 arch/csky/kernel/head.S create mode 100644 arch/csky/kernel/irq.c create mode 100644 arch/csky/kernel/module.c create mode 100644 arch/csky/kernel/platform.c create mode 100644 arch/csky/kernel/power.c create mode 100644 arch/csky/kernel/process.c create mode 100644 arch/csky/kernel/ptrace.c create mode 100644 arch/csky/kernel/setup.c create mode 100644 arch/csky/kernel/signal.c create mode 100644 arch/csky/kernel/smp.c create mode 100644 arch/csky/kernel/syscall.c create mode 100644 arch/csky/kernel/syscall_table.c create mode 100644 arch/csky/kernel/time.c create mode 100644 arch/csky/kernel/traps.c create mode 100644 arch/csky/kernel/vdso.c create mode 100644 arch/csky/kernel/vmlinux.lds.S create mode 100644 arch/csky/lib/Makefile create mode 100644 arch/csky/lib/delay.c create mode 100644 arch/csky/lib/usercopy.c create mode 100644 arch/csky/mm/Makefile create mode 100644 arch/csky/mm/cachev1.c create mode 100644 arch/csky/mm/cachev2.c create mode 100644 arch/csky/mm/dma-mapping.c create mode 100644 arch/csky/mm/fault.c create mode 100644 arch/csky/mm/highmem.c create mode 100644 arch/csky/mm/init.c create mode 100644 arch/csky/mm/ioremap.c create mode 100644 arch/csky/mm/syscache.c create mode 100644 arch/csky/mm/tlb.c create mode 100644 drivers/clocksource/csky_mptimer.c create mode 100644 drivers/clocksource/timer-gx6605s.c create mode 100644 drivers/irqchip/irq-csky-apb-intc.c create mode 100644 drivers/irqchip/irq-csky-mpintc.c
Signature · 1 line
2.7.4
PATCH v3 1/26 csky: Build infrastructure
--- arch/csky/Kconfig | 230 +++++++++++++++++++++++++++++++++ arch/csky/Kconfig.debug | 14 ++ arch/csky/Makefile | 93 +++++++++++++ arch/csky/abiv1/Makefile | 8 ++ arch/csky/abiv2/Makefile | 10 ++ arch/csky/boot/Makefile | 24 ++++ arch/csky/boot/dts/Makefile | 13 ++ arch/csky/boot/dts/include/dt-bindings | 1 + arch/csky/include/asm/Kbuild | 69 ++++++++++ arch/csky/include/uapi/asm/Kbuild | 33 +++++ arch/csky/kernel/Makefile | 8 ++ arch/csky/lib/Makefile | 1 + arch/csky/mm/Makefile | 13 ++ 13 files changed, 517 insertions(+) create mode 100644 arch/csky/Kconfig create mode 100644 arch/csky/Kconfig.debug create mode 100644 arch/csky/Makefile create mode 100644 arch/csky/abiv1/Makefile create mode 100644 arch/csky/abiv2/Makefile create mode 100644 arch/csky/boot/Makefile create mode 100644 arch/csky/boot/dts/Makefile create mode 120000 arch/csky/boot/dts/include/dt-bindings create mode 100644 arch/csky/include/asm/Kbuild create mode 100644 arch/csky/include/uapi/asm/Kbuild create mode 100644 arch/csky/kernel/Makefile create mode 100644 arch/csky/lib/Makefile create mode 100644 arch/csky/mm/Makefile
arch/csky/Kconfig new file +230 -0
@@ -0,0 +1,230 @@ +config CSKY + def_bool y + select ARCH_HAS_SYNC_DMA_FOR_CPU + select ARCH_HAS_SYNC_DMA_FOR_DEVICE + select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_QUEUED_RWLOCKS if NR_CPUS>2 + select COMMON_CLK + select CLKSRC_MMIO + select CLKSRC_OF + select DMA_NONCOHERENT_OPS + select IRQ_DOMAIN + select HANDLE_DOMAIN_IRQ + select DW_APB_TIMER_OF + select GENERIC_LIB_ASHLDI3 + select GENERIC_LIB_ASHRDI3 + select GENERIC_LIB_LSHRDI3 + select GENERIC_LIB_MULDI3 + select GENERIC_LIB_CMPDI2 + select GENERIC_LIB_UCMPDI2 + select GENERIC_ALLOCATOR + select GENERIC_ATOMIC64 + select GENERIC_CLOCKEVENTS + select GENERIC_CPU_DEVICES + select GENERIC_IRQ_CHIP + select GENERIC_IRQ_PROBE + select GENERIC_IRQ_SHOW + select GENERIC_SCHED_CLOCK + select GENERIC_SMP_IDLE_THREAD + select HAVE_ARCH_TRACEHOOK + select HAVE_GENERIC_DMA_COHERENT + select HAVE_KERNEL_GZIP + select HAVE_KERNEL_LZO + select HAVE_KERNEL_LZMA + select HAVE_C_RECORDMCOUNT + select HAVE_DMA_API_DEBUG + select HAVE_DMA_CONTIGUOUS + select HAVE_MEMBLOCK + select MAY_HAVE_SPARSE_IRQ + select MODULES_USE_ELF_RELA if MODULES + select NO_BOOTMEM + select OF + select OF_EARLY_FLATTREE + select OF_RESERVED_MEM + select PERF_USE_VMALLOC + select RTC_LIB + select TIMER_OF + select USB_ARCH_HAS_EHCI + select USB_ARCH_HAS_OHCI + +config CPU_HAS_CACHEV2 + bool + +config CPU_HAS_FPUV2 + bool + +config CPU_HAS_HILO + bool + +config CPU_HAS_TLBI + bool + +config CPU_HAS_LDSTEX + bool + help + For SMP, CPU needs "ldex&stex" instrcutions to atomic operations. + +config CPU_NEED_TLBSYNC + bool + +config CPU_NEED_SOFTALIGN + bool + +config CPU_NO_USER_BKPT + bool + help + For abiv2 we couldn't use "trap 1" as user space bkpt in gdbserver, because + abiv2 is 16/32bit instruction set and "trap 1" is 32bit. + So we need a 16bit instruction as user space bkpt, and it will cause an illegal + instruction exception. + In kernel we parse the *regs->pc to determine whether to send SIGTRAP or not. + +config GENERIC_CALIBRATE_DELAY + def_bool y + +config GENERIC_CSUM + def_bool y + +config GENERIC_HWEIGHT + def_bool y + +config MMU + def_bool y + +config RWSEM_GENERIC_SPINLOCK + def_bool y + +config TIME_LOW_RES + def_bool y + +config TRACE_IRQFLAGS_SUPPORT + def_bool y + +config CPU_TLB_SIZE + int + default "128" if (CPU_CK610 || CPU_CK807 || CPU_CK810) + default "1024" if (CPU_CK860) + +config CPU_ASID_BITS + int + default "8" if (CPU_CK610 || CPU_CK807 || CPU_CK810) + default "12" if (CPU_CK860) + +config L1_CACHE_SHIFT + int + default "4" if (CPU_CK610) + default "5" if (CPU_CK807 || CPU_CK810) + default "6" if (CPU_CK860) + +source "init/Kconfig" + +source "kernel/Kconfig.freezer" + +menu "Processor type and features" + +choice + prompt "CPU MODEL" + default CPU_CK610 + +config CPU_CK610 + bool "CSKY CPU ck610" + select CPU_NEED_TLBSYNC + select CPU_NEED_SOFTALIGN + select CPU_NO_USER_BKPT + +config CPU_CK810 + bool "CSKY CPU ck810" + select CPU_HAS_HILO + select CPU_NEED_TLBSYNC + +config CPU_CK807 + bool "CSKY CPU ck807" + select CPU_HAS_HILO + +config CPU_CK860 + bool "CSKY CPU ck860" + select CPU_HAS_TLBI + select CPU_HAS_CACHEV2 + select CPU_HAS_LDSTEX + select CPU_HAS_FPUV2 +endchoice + +choice + prompt "Power Manager Instruction (wait/doze/stop)" + default CPU_PM_NONE + +config CPU_PM_NONE + bool "None" + +config CPU_PM_WAIT + bool "wait" + +config CPU_PM_DOZE + bool "doze" + +config CPU_PM_STOP + bool "stop" +endchoice + +config CPU_HAS_VDSP + bool "CPU has VDSP coprocessor" + depends on CPU_HAS_FPU && CPU_HAS_FPUV2 + +config CPU_HAS_FPU + bool "CPU has FPU coprocessor" + depends on CPU_CK807 || CPU_CK810 || CPU_CK860 + +config CPU_HAS_TEE + bool "CPU has Trusted Execution Environment" + depends on CPU_CK810 + +config SMP + bool "Symmetric Multi-Processing (SMP) support for C-SKY" + depends on CPU_CK860 + default n + +config NR_CPUS + int "Maximum number of CPUs (2-32)" + range 2 32 + depends on SMP + default "2" + +config HIGHMEM + bool "High Memory Support" + depends on !CPU_CK610 + default y + +config RAM_BASE + hex "DRAM start addr (the same with memory-section in dts)" + default 0x0 +endmenu + +menu "Power management options" + +source "kernel/power/Kconfig" + +config ARCH_SUSPEND_POSSIBLE + def_bool y +endmenu + +source "mm/Kconfig" + +source "fs/Kconfig.binfmt" + +source "kernel/Kconfig.preempt" + +source "kernel/Kconfig.hz" + +source "net/Kconfig" + +source "drivers/Kconfig" + +source "fs/Kconfig" + +source "arch/csky/Kconfig.debug" + +source "security/Kconfig" + +source "crypto/Kconfig" + +source "lib/Kconfig"
arch/csky/Kconfig.debug new file +14 -0
@@ -0,0 +1,14 @@ +menu "Kernel hacking" + +menu "C-SKY Debug Options" +config CSKY_BUILTIN_DTB + bool "Use kernel builtin dtb" + +config CSKY_BUILTIN_DTB_NAME + string "kernel builtin dtb name" + depends on CSKY_BUILTIN_DTB +endmenu + +source "lib/Kconfig.debug" + +endmenu
arch/csky/Makefile new file +93 -0
93 lines not on this page · raw message
arch/csky/abiv1/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +obj-$(CONFIG_CPU_NEED_SOFTALIGN) += alignment.o +obj-y += bswapdi.o +obj-y += bswapsi.o +obj-y += cacheflush.o +obj-y += mmap.o +obj-y += memcpy.o +obj-y += memset.o +obj-y += strksyms.o
arch/csky/abiv2/Makefile new file +10 -0
@@ -0,0 +1,10 @@ +obj-y += cacheflush.o +obj-$(CONFIG_CPU_HAS_FPU) += fpu.o +obj-y += memcmp.o +obj-y += memcpy.o +obj-y += memmove.o +obj-y += memset.o +obj-y += strcmp.o +obj-y += strcpy.o +obj-y += strlen.o +obj-y += strksyms.o
arch/csky/boot/Makefile new file +24 -0
@@ -0,0 +1,24 @@ +targets := Image zImage uImage +targets += $(dtb-y) + +$(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) + @echo ' Kernel: $@ is ready' + +compress-$(CONFIG_KERNEL_GZIP) = gzip +compress-$(CONFIG_KERNEL_LZO) = lzo +compress-$(CONFIG_KERNEL_LZMA) = lzma +compress-$(CONFIG_KERNEL_XZ) = xzkern +compress-$(CONFIG_KERNEL_LZ4) = lz4 + +$(obj)/zImage: $(obj)/Image FORCE + $(call if_changed,$(compress-y)) + @echo ' Kernel: $@ is ready' + +UIMAGE_ARCH = sandbox +UIMAGE_COMPRESSION = $(compress-y) +UIMAGE_LOADADDR = $(shell $(NM) vmlinux | awk '$$NF == "_start" {print $$1}') + +$(obj)/uImage: $(obj)/zImage + $(call if_changed,uimage) + @echo 'Image: $@ is ready'
arch/csky/boot/dts/Makefile new file +13 -0
@@ -0,0 +1,13 @@ +dtstree := $(srctree)/$(src) + +ifdef CONFIG_CSKY_BUILTIN_DTB +builtindtb-y := $(patsubst "%",%,$(CONFIG_CSKY_BUILTIN_DTB_NAME)) +dtb-y += $(builtindtb-y).dtb +obj-y += $(builtindtb-y).dtb.o +.SECONDARY: $(obj)/$(builtindtb-y).dtb.S +else +dtb-y := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts)) +endif + +always += $(dtb-y) +clean-files += *.dtb *.dtb.S
arch/csky/boot/dts/include/dt-bindings new file +1 -0
@@ -0,0 +1 @@ +../../../../../include/dt-bindings
arch/csky/include/asm/Kbuild new file +69 -0
69 lines not on this page · raw message
arch/csky/include/uapi/asm/Kbuild new file +33 -0
@@ -0,0 +1,33 @@ +include include/uapi/asm-generic/Kbuild.asm + +header-y += cachectl.h +header-y += stat.h + +generic-y += auxvec.h +generic-y += param.h +generic-y += bpf_perf_event.h +generic-y += errno.h +generic-y += fcntl.h +generic-y += ioctl.h +generic-y += ioctls.h +generic-y += ipcbuf.h +generic-y += shmbuf.h +generic-y += bitsperlong.h +generic-y += mman.h +generic-y += msgbuf.h +generic-y += poll.h +generic-y += posix_types.h +generic-y += resource.h +generic-y += sembuf.h +generic-y += siginfo.h +generic-y += signal.h +generic-y += socket.h +generic-y += sockios.h +generic-y += statfs.h +generic-y += stat.h +generic-y += setup.h +generic-y += swab.h +generic-y += termbits.h +generic-y += termios.h +generic-y += types.h +generic-y += ucontext.h
arch/csky/kernel/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +extra-y := head.o vmlinux.lds + +obj-y += entry.o atomic.o signal.o traps.o irq.o time.o vdso.o \ + power.o syscall.o platform.o syscall_table.o setup.o \ + process.o cpu-probe.o ptrace.o dumpstack.o + +obj-$(CONFIG_MODULES) += module.o +obj-$(CONFIG_SMP) += smp.o
arch/csky/lib/Makefile new file +1 -0
@@ -0,0 +1 @@ +lib-y := usercopy.o delay.o
arch/csky/mm/Makefile new file +13 -0
@@ -0,0 +1,13 @@ +ifeq ($(CONFIG_CPU_HAS_CACHEV2),y) +obj-y += cachev2.o +else +obj-y += cachev1.o +endif + +obj-y += dma-mapping.o +obj-y += fault.o +obj-$(CONFIG_HIGHMEM) += highmem.o +obj-y += init.o +obj-y += ioremap.o +obj-y += syscache.o +obj-y += tlb.o
Signature · 1 line
2.7.4
PATCH v3 2/26 csky: defconfig
In reply to Guo Ren--- arch/csky/configs/defconfig | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 arch/csky/configs/defconfig
arch/csky/configs/defconfig new file +76 -0
@@ -0,0 +1,76 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_DEFAULT_HOSTNAME="csky" +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_USELIB=y +CONFIG_AUDIT=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_RELAY=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS_ALL=y +CONFIG_USERFAULTFD=y +CONFIG_EMBEDDED=y +CONFIG_PROFILING=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_DEFAULT_DEADLINE=y +CONFIG_CPU_CK807=y +CONFIG_CPU_HAS_FPU=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_TTY_PRINTK=y +# CONFIG_VGA_CONSOLE is not set +CONFIG_CSKY_MPTIMER=y +CONFIG_GX6605S_TIMER=y +CONFIG_PM_DEVFREQ=y +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +CONFIG_GENERIC_PHY=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_FANOTIFY=y +CONFIG_QUOTA=y +CONFIG_FSCACHE=m +CONFIG_FSCACHE_STATS=y +CONFIG_CACHEFILES=m +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_NTFS_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_CHILDREN=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_CONFIGFS_FS=y +CONFIG_CRAMFS=y +CONFIG_ROMFS_FS=y +CONFIG_NFS_FS=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_UNUSED_SYMBOLS=y +CONFIG_DEBUG_FS=y +CONFIG_MAGIC_SYSRQ=y
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 02/26] csky: defconfig
Quoted 13 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- arch/csky/configs/defconfig | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 arch/csky/configs/defconfigarch/csky/configs/defconfig new file +0
-0
arch/csky/configs/defconfig line 6
Quoted 6 lines
arch/csky/configs/defconfig new file +6
-0@@ -0,0 +1,76 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_DEFAULT_HOSTNAME="csky" +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_USELIB=y
CONFIG_USELIB seems misplaced here, very few architectures can even call that, and it's not in the asm-generic/unistd.h file.
arch/csky/configs/defconfig line 12
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_RELAY=y
relay is selected by drivers that need it, you should not need to turn it on here.
arch/csky/configs/defconfig line 13
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_SYSCTL_SYSCALL=y
Also not in the asm-generic syscall table. We should probably hide the CONFIG_USELIB and CONFIG_SYSCTL_SYSCALL options so they only appear on architectures that can use them (patches welcome).
arch/csky/configs/defconfig line 14
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_KALLSYMS_ALL=y
While useful for debugging, this is also something I would not expect in the defconfig file
arch/csky/configs/defconfig line 15
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_USERFAULTFD=y
Probably not needed either, unless you have a specific use case.
arch/csky/configs/defconfig line 16
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_EMBEDDED=y
This (and CONFIG_EXPERT) is mostly there to expose options that are otherwise hidden for good reasons. Is there any option you tweak that depends on this? If not, then remove this as well.
arch/csky/configs/defconfig line 17
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_PROFILING=y
This is only for oprofile, which new architectures should generally no longer implement. Better implement PERF only.
arch/csky/configs/defconfig line 20
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_BLK_DEV_INTEGRITY=y
This is also fairly unusual.
arch/csky/configs/defconfig line 54
Quoted 7 lines
arch/csky/configs/defconfig new file +7
-0+CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y
Better enable only EXT4 and drop EXT2/EXT3.
arch/csky/configs/defconfig line 74
Quoted 1 line
arch/csky/configs/defconfig new file +1
-0+CONFIG_UNUSED_SYMBOLS=y
You should only need this to work around bugs, so
I'd turn it off.
Arnd
Re: [PATCH V3 02/26] csky: defconfig
Quoted 9 lines · Arnd Bergmann
Quoted 5 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- arch/csky/configs/defconfig | 76 ++++++++++++++++++++++++++++++++++++++++++++++CONFIG_USELIB=y
CONFIG_USELIBseems misplaced here, very few architectures can even call that, and it's not in theasm-generic/unistd.hfile.
Ok, remove it.
Quoted 4 lines
Quoted 1 line
+CONFIG_RELAY=y
relay is selected by drivers that need it, you should not need to turn it on here.
Ok, remove it.
Quoted 5 lines
Quoted 1 line
+CONFIG_SYSCTL_SYSCALL=y
Also not in the asm-generic syscall table. We should probably hide the
CONFIG_USELIBandCONFIG_SYSCTL_SYSCALLoptions so they only appear on architectures that can use them (patches welcome).
Ok, remove it.
Quoted 5 lines
Quoted 2 lines
+CONFIG_KALLSYMS_ALL=y
While useful for debugging, this is also something I would not expect in the defconfig file
Ok, remove it.
Quoted 4 lines
Quoted 1 line
+CONFIG_USERFAULTFD=y
Probably not needed either, unless you have a specific use case.
Ok, remove it.
Quoted 5 lines
Quoted 1 line
+CONFIG_EMBEDDED=y
This (and
CONFIG_EXPERT) is mostly there to expose options that are otherwise hidden for good reasons. Is there any option you tweak that depends on this? If not, then remove this as well.
Ok, remove it.
Quoted 4 lines
Quoted 1 line
+CONFIG_PROFILING=y
This is only for oprofile, which new architectures should generally no longer implement. Better implement PERF only.
Ok, remove it and we will only implement perf in future.
Quoted 3 lines
Quoted 1 line
+CONFIG_BLK_DEV_INTEGRITY=y
This is also fairly unusual.
Ok, remove it.
Quoted 9 lines
arch/csky/configs/defconfig line 54
Quoted 7 lines
arch/csky/configs/defconfig new file +7
-0+CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=yBetter enable only EXT4 and drop EXT2/EXT3.
Ok.
Quoted 4 lines
Quoted 1 line
+CONFIG_UNUSED_SYMBOLS=y
You should only need this to work around bugs, so
I'd turn it off.
Ok, remove it.
Guo Ren
PATCH v3 3/26 csky: Kernel booting
In reply to Guo Ren--- arch/csky/kernel/head.S | 78 +++++++++++++++++++++ arch/csky/kernel/setup.c | 150 +++++++++++++++++++++++++++++++++++++++++ arch/csky/kernel/vmlinux.lds.S | 64 ++++++++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 arch/csky/kernel/head.S create mode 100644 arch/csky/kernel/setup.c create mode 100644 arch/csky/kernel/vmlinux.lds.S
arch/csky/kernel/head.S new file +78 -0
@@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/linkage.h> +#include <linux/init.h> +#include <asm/page.h> +#include <abi/entry.h> + +__HEAD +ENTRY(_start) + /* set super user mode */ + lrw a3, DEFAULT_PSR_VALUE + mtcr a3, psr + psrset ee + + SETUP_MMU a3 + + /* set stack point */ + lrw a3, init_thread_union + THREAD_SIZE + mov sp, a3 + + jmpi csky_start +END(_start) + +#ifdef CONFIG_SMP +.align 10 +ENTRY(_start_smp_secondary) + /* Invalid I/Dcache BTB BHT */ + movi a3, 7 + lsli a3, 16 + addi a3, (1<<4) | 3 + mtcr a3, cr17 + + tlbi.alls + + /* setup PAGEMASK */ + movi a3, 0 + mtcr a3, cr<6, 15> + + /* setup MEL0/MEL1 */ + grs a0, _start_smp_pc +_start_smp_pc: + bmaski a1, 13 + andn a0, a1 + movi a1, 0x00000006 + movi a2, 0x00001006 + or a1, a0 + or a2, a0 + mtcr a1, cr<2, 15> + mtcr a2, cr<3, 15> + + /* setup MEH */ + mtcr a0, cr<4, 15> + + /* write TLB */ + bgeni a3, 28 + mtcr a3, cr<8, 15> + + SETUP_MMU a3 + + /* enable MMU */ + movi a3, 1 + mtcr a3, cr18 + + jmpi _goto_mmu_on +_goto_mmu_on: + lrw a3, DEFAULT_PSR_VALUE + mtcr a3, psr + psrset ee + + /* set stack point */ + lrw a3, secondary_stack + ld.w a3, (a3, 0) + mov sp, a3 + + jmpi csky_start_secondary +END(_start_smp_secondary) +#endif
arch/csky/kernel/setup.c new file +150 -0
150 lines not on this page · raw message
arch/csky/kernel/vmlinux.lds.S new file +64 -0
64 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 4/26 csky: Exception handling
In reply to Guo Ren--- arch/csky/abiv1/alignment.c | 331 +++++++++++++++++++++++++++++++++ arch/csky/abiv1/inc/abi/entry.h | 159 ++++++++++++++++ arch/csky/abiv2/inc/abi/entry.h | 157 ++++++++++++++++ arch/csky/include/asm/traps.h | 39 ++++ arch/csky/include/asm/unistd.h | 3 + arch/csky/kernel/cpu-probe.c | 78 ++++++++ arch/csky/kernel/entry.S | 396 ++++++++++++++++++++++++++++++++++++++++ arch/csky/kernel/traps.c | 168 +++++++++++++++++ arch/csky/mm/fault.c | 220 ++++++++++++++++++++++ 9 files changed, 1551 insertions(+) create mode 100644 arch/csky/abiv1/alignment.c create mode 100644 arch/csky/abiv1/inc/abi/entry.h create mode 100644 arch/csky/abiv2/inc/abi/entry.h create mode 100644 arch/csky/include/asm/traps.h create mode 100644 arch/csky/include/asm/unistd.h create mode 100644 arch/csky/kernel/cpu-probe.c create mode 100644 arch/csky/kernel/entry.S create mode 100644 arch/csky/kernel/traps.c create mode 100644 arch/csky/mm/fault.c
arch/csky/abiv1/alignment.c new file +331 -0
@@ -0,0 +1,331 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/kernel.h> +#include <linux/uaccess.h> +#include <linux/ptrace.h> + +static int align_enable =1 ; +static int align_count =0 ; + +static inline uint32_t get_ptreg (struct pt_regs *regs,uint32_t rx) +{ +return *((int *)&(regs->a0) -2 + rx); +} + +static inline void put_ptreg (struct pt_regs *regs,uint32_t rx,uint32_t val) +{ + *((int *)&(regs->a0) -2 + rx) = val; +} + +/* +* Get byte-value from addr and set it to *valp. +* +* Success: return 0 +* Failure: return 1 +*/ +static int ldb_asm (uint32_t addr,uint32_t *valp) +{ +uint32_t val; +int err; + +if (!access_ok (VERIFY_READ , (void *)addr,1 )) +return 1 ; + + asmvolatile ( +"movi %0, 0 \n" +"1: \n" +"ldb %1, (%2) \n" +"br 3f \n" +"2: \n" +"movi %0, 1 \n" +"br 3f \n" +".section __ex_table,\"a\" \n" +".align 2 \n" +".long 1b, 2b \n" +".previous \n" +"3: \n" + :"=&r" (err),"=r" (val) + :"r" (addr) + ); + + *valp = val; + +return err; +} + +/* +* Put byte-value to addr. +* +* Success: return 0 +* Failure: return 1 +*/ +static volatile int stb_asm (uint32_t addr,uint32_t val) +{ +int err; + +if (!access_ok (VERIFY_WRITE , (void *)addr,1 )) +return 1 ; + + asmvolatile ( +"movi %0, 0 \n" +"1: \n" +"stb %1, (%2) \n" +"br 3f \n" +"2: \n" +"movi %0, 1 \n" +"br 3f \n" +".section __ex_table,\"a\" \n" +".align 2 \n" +".long 1b, 2b \n" +".previous \n" +"3: \n" + :"=&r" (err) + :"r" (val),"r" (addr) + ); + +return err; +} + +/* +* Get half-word from [rx + imm] +* +* Success: return 0 +* Failure: return 1 +*/ +static int ldh_c (struct pt_regs *regs,uint32_t rz,uint32_t addr) +{ +uint32_t byte0, byte1; + +if (ldb_asm (addr, &byte0)) +return 1 ; + addr +=1 ; +if (ldb_asm (addr, &byte1)) +return 1 ; + + byte0 |= byte1 <<8 ; +put_ptreg (regs, rz, byte0); + +return 0 ; +} + +/* +* Store half-word to [rx + imm] +* +* Success: return 0 +* Failure: return 1 +*/ +static int sth_c (struct pt_regs *regs,uint32_t rz,uint32_t addr) +{ +uint32_t byte0, byte1; + + byte0 = byte1 =get_ptreg (regs, rz); + + byte0 &=0xff ; + +if (stb_asm (addr, byte0)) +return 1 ; + + addr +=1 ; + byte1 = (byte1 >>8 ) &0xff ; +if (stb_asm (addr, byte1)) +return 1 ; + +return 0 ; +} + +/* +* Get word from [rx + imm] +* +* Success: return 0 +* Failure: return 1 +*/ +static int ldw_c (struct pt_regs *regs,uint32_t rz,uint32_t addr) +{ +uint32_t byte0, byte1, byte2, byte3; + +if (ldb_asm (addr, &byte0)) +return 1 ; + + addr +=1 ; +if (ldb_asm (addr, &byte1)) +return 1 ; + + addr +=1 ; +if (ldb_asm (addr, &byte2)) +return 1 ; + + addr +=1 ; +if (ldb_asm (addr, &byte3)) +return 1 ; + + byte0 |= byte1 <<8 ; + byte0 |= byte2 <<16 ; + byte0 |= byte3 <<24 ; + +put_ptreg (regs, rz, byte0); + +return 0 ; +} + +/* +* Store word to [rx + imm] +* +* Success: return 0 +* Failure: return 1 +*/ +static int stw_c (struct pt_regs *regs,uint32_t rz,uint32_t addr) +{ +uint32_t byte0, byte1, byte2, byte3; + + byte0 = byte1 = byte2 = byte3 =get_ptreg (regs, rz); + + byte0 &=0xff ; + +if (stb_asm (addr, byte0)) +return 1 ; + + addr +=1 ; + byte1 = (byte1 >>8 ) &0xff ; +if (stb_asm (addr, byte1)) +return 1 ; + + addr +=1 ; + byte2 = (byte2 >>16 ) &0xff ; +if (stb_asm (addr, byte2)) +return 1 ; + + addr +=1 ; + byte3 = (byte3 >>24 ) &0xff ; +if (stb_asm (addr, byte3)) +return 1 ; + + align_count++; + +return 0 ; +} + +extern int fixup_exception (struct pt_regs *regs); + +#define OP_LDH 0xc000 +#define OP_STH 0xd000 +#define OP_LDW 0x8000 +#define OP_STW 0x9000 + +void csky_alignment (struct pt_regs *regs) +{ +int ret; +uint16_t tmp; +uint32_t opcode =0 ; +uint32_t rx =0 ; +uint32_t rz =0 ; +uint32_t imm =0 ; +uint32_t addr =0 ; + +siginfo_t info; + +if (!user_mode (regs)) + goto bad_area; + + ret =get_user (tmp, (uint16_t *)instruction_pointer (regs)); +if (ret) { +pr_err ("%s get_user failed.\n" , __func__); + goto bad_area; + } + + opcode = (uint32_t )tmp; + + rx = opcode &0xf ; + imm = (opcode >>4 ) &0xf ; + rz = (opcode >>8 ) &0xf ; + opcode &=0xf000 ; + +if (rx ==0 || rx ==15 || rz ==0 || rz ==15 ) + goto bad_area; + +switch (opcode) { +case OP_LDH : + addr =get_ptreg (regs, rx) + (imm <<1 ); + ret =ldh_c (regs, rz, addr); +break ; +case OP_LDW : + addr =get_ptreg (regs, rx) + (imm <<2 ); + ret =ldw_c (regs, rz, addr); +break ; +case OP_STH : + addr =get_ptreg (regs, rx) + (imm <<1 ); + ret =sth_c (regs, rz, addr); +break ; +case OP_STW : + addr =get_ptreg (regs, rx) + (imm <<2 ); + ret =stw_c (regs, rz, addr); +break ; + } + +if (ret) + goto bad_area; + + regs->pc +=2 ; + +return ; + +bad_area: +if (!user_mode (regs)) { +if (fixup_exception (regs)) +return ; + +bust_spinlocks (1 ); +pr_alert ("%s opcode: %x, rz: %d, rx: %d, imm: %d, addr: %x.\n" , + __func__, opcode, rz, rx, imm, addr); +show_regs (regs); +bust_spinlocks (0 ); +do_exit (SIGKILL ); + } + + info.si_signo =SIGBUS ; + info.si_errno =0 ; + info.si_code =BUS_ADRALN ; + info.si_addr = (void __user *)addr; + +force_sig_info (info.si_signo, &info, current); + +return ; +} + +static struct ctl_table alignment_tbl[4 ] = { + { + .procname ="enable" , + .data = &align_enable, + .maxlen =sizeof (align_enable), + .mode =0666 , + .proc_handler = &proc_dointvec + }, + { + .procname ="count" , + .data = &align_count, + .maxlen =sizeof (align_count), + .mode =0666 , + .proc_handler = &proc_dointvec + }, + {} +}; + +static struct ctl_table sysctl_table[2 ] = { + { + .procname ="csky_alignment" , + .mode =0555 , + .child = alignment_tbl}, + {} +}; + +static struct ctl_path sysctl_path[2 ] = { + {.procname ="csky" }, + {} +}; + +static int __init csky_alignment_init (void ) +{ +register_sysctl_paths (sysctl_path, sysctl_table); +return 0 ; +} + +arch_initcall (csky_alignment_init);
arch/csky/abiv1/inc/abi/entry.h new file +159 -0
159 lines not on this page · raw message
arch/csky/abiv2/inc/abi/entry.h new file +157 -0
157 lines not on this page · raw message
arch/csky/include/asm/traps.h new file +39 -0
@@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_TRAPS_H +#define __ASM_CSKY_TRAPS_H + +#define VEC_RESET 0 +#define VEC_ALIGN 1 +#define VEC_ACCESS 2 +#define VEC_ZERODIV 3 +#define VEC_ILLEGAL 4 +#define VEC_PRIV 5 +#define VEC_TRACE 6 +#define VEC_BREAKPOINT 7 +#define VEC_UNRECOVER 8 +#define VEC_SOFTRESET 9 +#define VEC_AUTOVEC 10 +#define VEC_FAUTOVEC 11 +#define VEC_HWACCEL 12 + +#define VEC_TLBMISS 14 +#define VEC_TLBMODIFIED 15 + +#define VEC_TRAP0 16 +#define VEC_TRAP1 17 +#define VEC_TRAP2 18 +#define VEC_TRAP3 19 + +#define VEC_TLBINVALIDL 20 +#define VEC_TLBINVALIDS 21 + +#define VEC_PRFL 29 +#define VEC_FPE 30 + +extern void * vec_base[]; +#define VEC_INIT (i, func) vec_base[i] = (void *)func + +void csky_alignment (struct pt_regs *); + +#endif /* __ASM_CSKY_TRAPS_H */
arch/csky/include/asm/unistd.h new file +3 -0
@@ -0,0 +1,3 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <uapi/asm/unistd.h>
arch/csky/kernel/cpu-probe.c new file +78 -0
78 lines not on this page · raw message
arch/csky/kernel/entry.S new file +396 -0
396 lines not on this page · raw message
arch/csky/kernel/traps.c new file +168 -0
168 lines not on this page · raw message
arch/csky/mm/fault.c new file +220 -0
220 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 5/26 csky: System Call
In reply to Guo Ren--- arch/csky/include/asm/syscall.h | 69 +++++++++++++++++++++++++++++++++++++ arch/csky/include/asm/syscalls.h | 14 ++++++++ arch/csky/include/uapi/asm/unistd.h | 10 ++++++ arch/csky/kernel/syscall.c | 63 +++++++++++++++++++++++++++++++++ arch/csky/kernel/syscall_table.c | 13 +++++++ 5 files changed, 169 insertions(+) create mode 100644 arch/csky/include/asm/syscall.h create mode 100644 arch/csky/include/asm/syscalls.h create mode 100644 arch/csky/include/uapi/asm/unistd.h create mode 100644 arch/csky/kernel/syscall.c create mode 100644 arch/csky/kernel/syscall_table.c
arch/csky/include/asm/syscall.h new file +69 -0
@@ -0,0 +1,69 @@ +#ifndef __ASM_SYSCALL_H +#define __ASM_SYSCALL_H + +#include <linux/sched.h> +#include <linux/err.h> +#include <abi/regdef.h> + +static inline int +syscall_get_nr (struct task_struct *task,struct pt_regs *regs) +{ +return regs_syscallid (regs); +} + +static inline void +syscall_rollback (struct task_struct *task,struct pt_regs *regs) +{ + regs->a0 = regs->orig_a0; +} + +static inline long +syscall_get_error (struct task_struct *task,struct pt_regs *regs) +{ +unsigned long error = regs->a0; + +return IS_ERR_VALUE (error) ? error :0 ; +} + +static inline long +syscall_get_return_value (struct task_struct *task,struct pt_regs *regs) +{ +return regs->a0; +} + +static inline void +syscall_set_return_value (struct task_struct *task,struct pt_regs *regs, +int error,long val) +{ + regs->a0 = (long ) error ?: val; +} + +static inline void +syscall_get_arguments (struct task_struct *task,struct pt_regs *regs, +unsigned int i,unsigned int n,unsigned long *args) +{ +BUG_ON (i + n >6 ); +if (i ==0 ) { + args[0 ] = regs->orig_a0; + args++; + i++; + n--; + } +memcpy (args, ®s->a1 + i *sizeof (regs->a1), n *sizeof (args[0 ])); +} + +static inline void +syscall_set_arguments (struct task_struct *task,struct pt_regs *regs, +unsigned int i,unsigned int n,const unsigned long *args) +{ +BUG_ON (i + n >6 ); +if (i ==0 ) { + regs->orig_a0 = args[0 ]; + args++; + i++; + n--; + } +memcpy (®s->a1 + i *sizeof (regs->a1), args, n *sizeof (regs->a0)); +} + +#endif /* __ASM_SYSCALL_H */
arch/csky/include/asm/syscalls.h new file +14 -0
@@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_SYSCALLS_H +#define __ASM_CSKY_SYSCALLS_H + +#include <asm-generic/syscalls.h> + +long sys_cacheflush (void __user *,unsigned long ,int ); + +long sys_set_thread_area (unsigned long addr); + +long sys_csky_fadvise64_64 (int fd,int advice,loff_t offset,loff_t len); + +#endif /* __ASM_CSKY_SYSCALLS_H */
arch/csky/include/uapi/asm/unistd.h new file +10 -0
@@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#define __ARCH_WANT_SYS_CLONE +#include <asm-generic/unistd.h> + +#define __NR_set_thread_area (__NR_arch_specific_syscall + 0) +__SYSCALL(__NR_set_thread_area, sys_set_thread_area) +#define __NR_cacheflush (__NR_arch_specific_syscall + 4) +__SYSCALL (__NR_cacheflush, sys_cacheflush)
arch/csky/kernel/syscall.c new file +63 -0
63 lines not on this page · raw message
arch/csky/kernel/syscall_table.c new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/syscalls.h> +#include <asm/syscalls.h> + +#undef __SYSCALL +#define __SYSCALL (nr, call) [nr] = (call), + +#define sys_fadvise64_64 sys_csky_fadvise64_64 +void * const sys_call_table[__NR_syscalls] __page_aligned_data = { + [0 ... __NR_syscalls -1 ] = sys_ni_syscall, +#include <asm/unistd.h> +};
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 05/26] csky: System Call
arch/csky/kernel/syscall.c line 28
Quoted 13 lines · Guo Ren
arch/csky/kernel/syscall.c new file +13
-0+SYSCALL_DEFINE6 (mmap2, + unsigned long, addr, + unsigned long, len, + unsigned long, prot, + unsigned long, flags, + unsigned long, fd, + off_t, offset) +{ +if (unlikely (offset & (~PAGE_MASK >>12 ))) +return -EINVAL ; +return sys_mmap_pgoff (addr, len, prot, flags, fd, + offset >> (PAGE_SHIFT -12 )); +}
Please call ksys_mmap_pgoff() instead of sys_mmap_pgoff() here.
The prototype in include/asm-generic/syscalls.h uses 'unsigned long' for the last argument as well, not off_t.
arch/csky/kernel/syscall.c line 40
Quoted 11 lines
arch/csky/kernel/syscall.c new file +11
-0+struct mmap_arg_struct { +unsigned long addr; +unsigned long len; +unsigned long prot; +unsigned long flags; +unsigned long fd; +unsigned long offset; +}; + +SYSCALL_DEFINE1 (mmap, + struct mmap_arg_struct *, arg)
Something is still wrong here, there should be no way to call sys_mmap(), since it's not in the syscall table.
arch/csky/kernel/syscall.c line 63
Quoted 11 lines
arch/csky/kernel/syscall.c new file +11
-0+/* +* for abiv1 the 64bits args should be even th, So we need mov the advice forward. +*/ +SYSCALL_DEFINE4 (csky_fadvise64_64, + int, fd, + int, advice, + loff_t, offset, + loff_t, len) +{ +return sys_fadvise64_64 (fd, offset, len, advice); +}
And call ksys_fadvise64_64() here.
arch/csky/kernel/syscall_table.c line 13
Quoted 8 lines
arch/csky/kernel/syscall_table.c new file +8
-0+#undef __SYSCALL +#define __SYSCALL (nr, call) [nr] = (call), + +#define sys_fadvise64_64 sys_csky_fadvise64_64 +void * const sys_call_table[__NR_syscalls] __page_aligned_data = { + [0 ... __NR_syscalls -1 ] = sys_ni_syscall, +#include <asm/unistd.h> +};
This looks good now.
Arnd
Re: [PATCH V3 05/26] csky: System Call
Quoted 17 lines · Arnd Bergmann
arch/csky/kernel/syscall.c line 28
Quoted 13 lines · Guo Ren
arch/csky/kernel/syscall.c new file +13
-0+SYSCALL_DEFINE6 (mmap2, + unsigned long, addr, + unsigned long, len, + unsigned long, prot, + unsigned long, flags, + unsigned long, fd, + off_t, offset) +{ +if (unlikely (offset & (~PAGE_MASK >>12 ))) +return -EINVAL ; +return sys_mmap_pgoff (addr, len, prot, flags, fd, + offset >> (PAGE_SHIFT -12 )); +}Please call
ksys_mmap_pgoff()instead ofsys_mmap_pgoff()here.
Ok.
Quoted 2 lines
The prototype in
include/asm-generic/syscalls.huses 'unsigned long' for the last argument as well, notoff_t.
Ok, unsigned long for last argument.
Quoted 6 lines
Quoted 6 lines
arch/csky/kernel/syscall.c new file +6
-0+struct mmap_arg_struct { +unsigned long addr; +unsigned long len; +unsigned long prot; +unsigned long flags; +unsigned long fd;
Quoted 8 lines
arch/csky/kernel/syscall.c line 40
Quoted 5 lines
arch/csky/kernel/syscall.c new file +5
-0+unsigned long offset; +}; + +SYSCALL_DEFINE1 (mmap, + struct mmap_arg_struct *, arg)Something is still wrong here, there should be no way to call
sys_mmap(), since it's not in the syscall table.
You are right, remove it.
Quoted 4 lines
arch/csky/kernel/syscall.c line 63
Quoted 2 lines
arch/csky/kernel/syscall.c new file +2
-0+return sys_fadvise64_64 (fd, offset, len, advice); +}And call
ksys_fadvise64_64()here.
Ok.
Guo Ren
PATCH v3 6/26 csky: Cache and TLB routines
In reply to Guo Ren--- arch/csky/abiv1/cacheflush.c | 50 ++++++++ arch/csky/abiv1/inc/abi/cacheflush.h | 41 +++++++ arch/csky/abiv1/inc/abi/tlb.h | 11 ++ arch/csky/abiv2/cacheflush.c | 54 +++++++++ arch/csky/abiv2/inc/abi/cacheflush.h | 38 ++++++ arch/csky/abiv2/inc/abi/tlb.h | 12 ++ arch/csky/include/asm/barrier.h | 45 +++++++ arch/csky/include/asm/cache.h | 28 +++++ arch/csky/include/asm/cacheflush.h | 8 ++ arch/csky/include/asm/io.h | 23 ++++ arch/csky/include/asm/tlb.h | 19 +++ arch/csky/include/asm/tlbflush.h | 22 ++++ arch/csky/include/uapi/asm/cachectl.h | 13 +++ arch/csky/mm/cachev1.c | 126 ++++++++++++++++++++ arch/csky/mm/cachev2.c | 79 +++++++++++++ arch/csky/mm/syscache.c | 28 +++++ arch/csky/mm/tlb.c | 214 ++++++++++++++++++++++++++++++++++ 17 files changed, 811 insertions(+) create mode 100644 arch/csky/abiv1/cacheflush.c create mode 100644 arch/csky/abiv1/inc/abi/cacheflush.h create mode 100644 arch/csky/abiv1/inc/abi/tlb.h create mode 100644 arch/csky/abiv2/cacheflush.c create mode 100644 arch/csky/abiv2/inc/abi/cacheflush.h create mode 100644 arch/csky/abiv2/inc/abi/tlb.h create mode 100644 arch/csky/include/asm/barrier.h create mode 100644 arch/csky/include/asm/cache.h create mode 100644 arch/csky/include/asm/cacheflush.h create mode 100644 arch/csky/include/asm/io.h create mode 100644 arch/csky/include/asm/tlb.h create mode 100644 arch/csky/include/asm/tlbflush.h create mode 100644 arch/csky/include/uapi/asm/cachectl.h create mode 100644 arch/csky/mm/cachev1.c create mode 100644 arch/csky/mm/cachev2.c create mode 100644 arch/csky/mm/syscache.c create mode 100644 arch/csky/mm/tlb.c
arch/csky/abiv1/cacheflush.c new file +50 -0
@@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/fs.h> +#include <linux/syscalls.h> +#include <linux/spinlock.h> +#include <asm/page.h> +#include <asm/cache.h> +#include <asm/cacheflush.h> +#include <asm/cachectl.h> + +void flush_dcache_page (struct page *page) +{ +struct address_space *mapping =page_mapping (page); +unsigned long addr; + +if (mapping && !mapping_mapped (mapping)) { +set_bit (PG_arch_1, &(page)->flags); +return ; + } + +/* +* We could delay the flush for the !page_mapping case too. But that +* case is for exec env/arg pages and those are %99 certainly going to +* get faulted into the tlb (and thus flushed) anyways. +*/ + addr = (unsigned long )page_address (page); +dcache_wb_range (addr, addr +PAGE_SIZE ); +} + +void update_mmu_cache (struct vm_area_struct *vma,unsigned long address,pte_t *pte) +{ +unsigned long addr; +struct page *page; +unsigned long pfn; + + pfn =pte_pfn (*pte); +if (unlikely (!pfn_valid (pfn))) +return ; + + page =pfn_to_page (pfn); + addr = (unsigned long )page_address (page); + +if (vma->vm_flags &VM_EXEC || +pages_do_alias (addr, address &PAGE_MASK )) +cache_wbinv_all (); + +clear_bit (PG_arch_1, &(page)->flags); +}
arch/csky/abiv1/inc/abi/cacheflush.h new file +41 -0
41 lines not on this page · raw message
arch/csky/abiv1/inc/abi/tlb.h new file +11 -0
@@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ABI_CSKY_TLB_H +#define __ABI_CSKY_TLB_H + +#define tlb_start_vma (tlb, vma) \ + do { \ + if (!tlb->fullmm) \ + cache_wbinv_all(); \ + } while (0) +#endif /* __ABI_CSKY_TLB_H */
arch/csky/abiv2/cacheflush.c new file +54 -0
54 lines not on this page · raw message
arch/csky/abiv2/inc/abi/cacheflush.h new file +38 -0
@@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 + +#ifndef __ABI_CSKY_CACHEFLUSH_H +#define __ABI_CSKY_CACHEFLUSH_H + +/* Keep includes the same across arches. */ +#include <linux/mm.h> + +/* +* The cache doesn't need to be flushed when TLB entries change when +* the cache is mapped to physical memory, not virtual memory +*/ +#define flush_cache_all () do { } while (0) +#define flush_cache_mm (mm) do { } while (0) +#define flush_cache_dup_mm (mm) do { } while (0) +#define flush_cache_range (vma, start, end) do { } while (0) +#define flush_cache_page (vma, vmaddr, pfn) do { } while (0) +#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 +#define flush_dcache_page (page) do { } while (0) +#define flush_dcache_mmap_lock (mapping) do { } while (0) +#define flush_dcache_mmap_unlock (mapping) do { } while (0) + +#define flush_icache_range (start, end) cache_wbinv_range(start, end) +#define flush_icache_user_range (vma,pg,adr,len) cache_wbinv_range(adr, adr + len) +void flush_icache_page (struct vm_area_struct *vma,struct page *page); + +#define flush_cache_vmap (start, end) do { } while (0) +#define flush_cache_vunmap (start, end) do { } while (0) + +#define copy_to_user_page (vma, page, vaddr, dst, src, len) \ + do { \ + memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ + } while (0) +#define copy_from_user_page (vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + +#endif /* __ABI_CSKY_CACHEFLUSH_H */
arch/csky/abiv2/inc/abi/tlb.h new file +12 -0
@@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ABI_CSKY_TLB_H +#define __ABI_CSKY_TLB_H + +#define tlb_start_vma (tlb, vma) \ + do { \ + if (!tlb->fullmm && (vma->vm_flags & VM_EXEC)) \ + icache_inv_all(); \ + } while (0) + +#endif /* __ABI_CSKY_TLB_H */
arch/csky/include/asm/barrier.h new file +45 -0
45 lines not on this page · raw message
arch/csky/include/asm/cache.h new file +28 -0
@@ -0,0 +1,28 @@ +#ifndef __ASM_CSKY_CACHE_H +#define __ASM_CSKY_CACHE_H + +/* bytes per L1 cache line */ +#define L1_CACHE_SHIFT CONFIG_L1_CACHE_SHIFT + +#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) + +#define ARCH_DMA_MINALIGN L1_CACHE_BYTES + +#ifndef __ASSEMBLY__ + +void dcache_wb_line (unsigned long start); + +void icache_inv_range (unsigned long start,unsigned long end); +void icache_inv_all (void ); + +void dcache_wb_range (unsigned long start,unsigned long end); +void dcache_wbinv_all (void ); + +void cache_wbinv_range (unsigned long start,unsigned long end); +void cache_wbinv_all (void ); + +void dma_wbinv_range (unsigned long start,unsigned long end); +void dma_wb_range (unsigned long start,unsigned long end); + +#endif +#endif /* __ASM_CSKY_CACHE_H */
arch/csky/include/asm/cacheflush.h new file +8 -0
@@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_CACHEFLUSH_H +#define __ASM_CSKY_CACHEFLUSH_H + +#include <abi/cacheflush.h> + +#endif /* __ASM_CSKY_CACHEFLUSH_H */
arch/csky/include/asm/io.h new file +23 -0
@@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_IO_H +#define __ASM_CSKY_IO_H + +#include <abi/pgtable-bits.h> +#include <linux/types.h> +#include <linux/version.h> + +extern void __iomem *ioremap (phys_addr_t offset,size_t size); + +extern void iounmap (void *addr); + +extern int remap_area_pages (unsigned long address,phys_addr_t phys_addr, +size_t size,unsigned long flags); + +#define ioremap_nocache (phy, sz) ioremap(phy, sz) +#define ioremap_wc ioremap_nocache +#define ioremap_wt ioremap_nocache + +#include <asm-generic/io.h> + +#endif /* __ASM_CSKY_IO_H */
arch/csky/include/asm/tlb.h new file +19 -0
@@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_TLB_H +#define __ASM_CSKY_TLB_H + +#include <asm/cacheflush.h> +#include <abi/tlb.h> + +#define tlb_end_vma (tlb, vma) \ + do { \ + if (!tlb->fullmm) \ + flush_tlb_range(vma, vma->vm_start, vma->vm_end); \ + } while (0) + +#define tlb_flush (tlb) flush_tlb_mm((tlb)->mm) + +#include <asm-generic/tlb.h> + +#endif /* __ASM_CSKY_TLB_H */
arch/csky/include/asm/tlbflush.h new file +22 -0
@@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_TLBFLUSH_H +#define __ASM_TLBFLUSH_H +/* +* TLB flushing: +* +* - flush_tlb_all() flushes all processes TLB entries +* - flush_tlb_mm(mm) flushes the specified mm context TLB entries +* - flush_tlb_page(vma, vmaddr) flushes one page +* - flush_tlb_range(vma, start, end) flushes a range of pages +* - flush_tlb_kernel_range(start, end) flushes a range of kernel pages +*/ +extern void flush_tlb_all (void ); +extern void flush_tlb_mm (struct mm_struct *mm); +extern void flush_tlb_page (struct vm_area_struct *vma,unsigned long page); +extern void flush_tlb_range (struct vm_area_struct *vma,unsigned long start,unsigned long end); +extern void flush_tlb_kernel_range (unsigned long start,unsigned long end); + +extern void flush_tlb_one (unsigned long vaddr); + +#endif
arch/csky/include/uapi/asm/cachectl.h new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_CACHECTL_H +#define __ASM_CSKY_CACHECTL_H + +/* +* See "man cacheflush" +*/ +#define ICACHE (1<<0) +#define DCACHE (1<<1) +#define BCACHE (ICACHE|DCACHE) + +#endif /* __ASM_CSKY_CACHECTL_H */
arch/csky/mm/cachev1.c new file +126 -0
126 lines not on this page · raw message
arch/csky/mm/cachev2.c new file +79 -0
79 lines not on this page · raw message
arch/csky/mm/syscache.c new file +28 -0
@@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/syscalls.h> +#include <asm/page.h> +#include <asm/cache.h> +#include <asm/cachectl.h> + +SYSCALL_DEFINE3 (cacheflush, + void __user *, addr, + unsigned long, bytes, + int, cache) +{ +switch (cache) { +case ICACHE : +icache_inv_range ((unsigned long )addr, (unsigned long )addr + bytes); +break ; +case DCACHE : +dcache_wb_range ((unsigned long )addr, (unsigned long )addr + bytes); +break ; +case BCACHE : +cache_wbinv_range ((unsigned long )addr, (unsigned long )addr + bytes); +break ; +default : +return -EINVAL ; + } + +return 0 ; +}
arch/csky/mm/tlb.c new file +214 -0
214 lines not on this page · raw message
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 17 lines · Guo Ren
arch/csky/include/asm/io.h new file +11
-0@@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_IO_H +#define __ASM_CSKY_IO_H + +#include <abi/pgtable-bits.h> +#include <linux/types.h> +#include <linux/version.h> + +extern void __iomem *ioremap (phys_addr_t offset,size_t size); +
arch/csky/include/asm/io.h line 21
Quoted 10 lines
arch/csky/include/asm/io.h new file +10
-0+extern void iounmap (void *addr); + +extern int remap_area_pages (unsigned long address,phys_addr_t phys_addr, +size_t size,unsigned long flags); + +#define ioremap_nocache (phy, sz) ioremap(phy, sz) +#define ioremap_wc ioremap_nocache +#define ioremap_wt ioremap_nocache + +#include <asm-generic/io.h>
It is very unusual for an architecture to not need special handling in asm/io.h, to do the proper barriers etc.
Can you describe how C-Sky hardware implements MMIO?
In particular:
- Is a read from uncached memory always serialized with DMA, and with other CPUs doing MMIO access to a different address?
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Arnd
Re: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 33 lines · Arnd Bergmann
Quoted 17 lines · Guo Ren
arch/csky/include/asm/io.h new file +11
-0@@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_IO_H +#define __ASM_CSKY_IO_H + +#include <abi/pgtable-bits.h> +#include <linux/types.h> +#include <linux/version.h> + +extern void __iomem *ioremap (phys_addr_t offset,size_t size); +arch/csky/include/asm/io.h line 21
Quoted 10 lines
arch/csky/include/asm/io.h new file +10
-0+extern void iounmap (void *addr); + +extern int remap_area_pages (unsigned long address,phys_addr_t phys_addr, +size_t size,unsigned long flags); + +#define ioremap_nocache (phy, sz) ioremap(phy, sz) +#define ioremap_wc ioremap_nocache +#define ioremap_wt ioremap_nocache + +#include <asm-generic/io.h> It is very unusual for an architecture to not need special handling in
asm/io.h, to do the proper barriers etc.
Quoted 1 line
Can you describe how C-Sky hardware implements MMIO?
Our mmio is uncachable and strong-order address, so there is no need barriers for access these io addr.
#define ioremap_wc ioremap_nocache
#define ioremap_wt ioremap_nocache
Current ioremap_wc and ioremap_wt implementation are too simple and we'll improve it in future.
Quoted 4 lines
In particular:
- Is a read from uncached memory always serialized with DMA, and with other CPUs doing MMIO access to a different address?
CPU use ld.w to get data from uncached strong order memory. Other CPUs use the same mmio vaddr to access the uncachable strong order memory paddr.
Quoted 2 lines
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Currently we only support little-endian and soc will follow it.
Guo Ren
Arnd Bergmann
maintainerRe: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 14 lines · Guo Ren
Quoted 3 lines · Arnd Bergmann
On Wed, Sep 5, 2018 at 2:08 PM Guo Ren <[email protected]> wrote:
Can you describe how C-Sky hardware implements MMIO?
Our mmio is uncachable and strong-order address, so there is no need barriers for access these io addr.
#define
ioremap_wcioremap_nocache
#defineioremap_wtioremap_nocacheCurrent
ioremap_wcandioremap_wtimplementation are too simple and we'll improve it in future.
Quoted 7 lines
Quoted 4 lines
In particular:
- Is a read from uncached memory always serialized with DMA, and with other CPUs doing MMIO access to a different address?
CPU use ld.w to get data from uncached strong order memory. Other CPUs use the same mmio vaddr to access the uncachable strong order memory paddr.
Ok, but what about the DMA? The most common requirement for serialization here is with a DMA transfer, where you first write into a buffer in memory, then write to an MMIO register to trigger a DMA-load, and then the device reads the data from memory. Without a barrier before the MMIO, the data may still be in a store queue of the CPU, and the DMA gets stale data.
Similarly, an MMIO read may be used to see if a DMA has completed and the device register tells you that the DMA has left the device, but without a barrier, the CPU may have prefetched the DMA data while waiting for the MMIO-read to complete. The __io_ar() barrier() in asm-generic/io.h prevents the compiler from reordering the two reads, but if an weakly ordered read (in coherent DMA buffer) can bypass a strongly ordered read (MMIO), then it's still still broken.
Quoted 3 lines
Quoted 2 lines
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Currently we only support little-endian and soc will follow it.
Ok, that makes it easier. If you think that you won't even need big-endian support in the long run, you could also remove your asm/byteorder.h header. If you're not sure, it doesn't hurt to keep it of course.
Arnd
Re: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 31 lines · Arnd Bergmann
Quoted 14 lines · Guo Ren
Quoted 3 lines · Arnd Bergmann
On Wed, Sep 5, 2018 at 2:08 PM Guo Ren <[email protected]> wrote:
Can you describe how C-Sky hardware implements MMIO?
Our mmio is uncachable and strong-order address, so there is no need barriers for access these io addr.
#define
ioremap_wcioremap_nocache
#defineioremap_wtioremap_nocacheCurrent
ioremap_wcandioremap_wtimplementation are too simple and we'll improve it in future.Quoted 7 lines
Quoted 4 lines
In particular:
- Is a read from uncached memory always serialized with DMA, and with other CPUs doing MMIO access to a different address?
CPU use ld.w to get data from uncached strong order memory. Other CPUs use the same mmio vaddr to access the uncachable strong order memory paddr.
Ok, but what about the DMA? The most common requirement for serialization here is with a DMA transfer, where you first write into a buffer in memory, then write to an MMIO register to trigger a DMA-load, and then the device reads the data from memory. Without a barrier before the MMIO, the data may still be in a store queue of the CPU, and the DMA gets stale data.
Quoted 8 lines
Similarly, an MMIO read may be used to see if a DMA has completed and the device register tells you that the DMA has left the device, but without a barrier, the CPU may have prefetched the DMA data while waiting for the MMIO-read to complete. The
__io_ar()barrier()inasm-generic/io.hprevents the compiler from reordering the two reads, but if an weakly ordered read (in coherent DMA buffer) can bypass a strongly ordered read (MMIO), then it's still still broken.
__io_ar() barrier()? not rmb() ?! I've defined the rmb in asm/barrier, So I got rmb() here not barrier().
Only __io_br() is barrier().
Quoted 7 lines
Quoted 3 lines
Quoted 2 lines
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Currently we only support little-endian and soc will follow it.
Ok, that makes it easier. If you think that you won't even need big-endian support in the long run, you could also remove your
asm/byteorder.hheader. If you're not sure, it doesn't hurt to keep it of course.
Em... I'm not sure, so let me keep it for a while.
Best Regards
Guo Ren
Arnd Bergmann
maintainerRe: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 12 lines · Guo Ren
Quoted 10 lines · Arnd Bergmann
Quoted 1 line · Guo Ren
On Thu, Sep 06, 2018 at 04:31:16PM +0200, Arnd Bergmann wrote:
Similarly, an MMIO read may be used to see if a DMA has completed and the device register tells you that the DMA has left the device, but without a barrier, the CPU may have prefetched the DMA data while waiting for the MMIO-read to complete. The
__io_ar()barrier()inasm-generic/io.hprevents the compiler from reordering the two reads, but if an weakly ordered read (in coherent DMA buffer) can bypass a strongly ordered read (MMIO), then it's still still broken.
Quoted 4 lines
__io_ar()barrier()? notrmb()?! I've defined the rmb in asm/barrier, So I gotrmb()here notbarrier().Only
__io_br()isbarrier().
Ah right, I misremembered the defaults. It's probably ok then.
Quoted 8 lines
Quoted 7 lines
Quoted 3 lines
Quoted 2 lines
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Currently we only support little-endian and soc will follow it.
Ok, that makes it easier. If you think that you won't even need big-endian support in the long run, you could also remove your
asm/byteorder.hheader. If you're not sure, it doesn't hurt to keep it of course.Em... I'm not sure, so let me keep it for a while.
Ok. I think overall the trend is to be little-endian only for most
architectures: powerpc64 moved from big-endian only to little-endian by default, ARM rarely uses big-endian (basically only for legacy applications ported from BE MIPS or ppc), and all new architectures we added in the last years are little-endian (OpenRISC being the main exception).
Arnd
Re: [PATCH V3 06/26] csky: Cache and TLB routines
Quoted 13 lines · Arnd Bergmann
Quoted 12 lines · Guo Ren
Quoted 10 lines · Arnd Bergmann
Quoted 1 line · Guo Ren
On Thu, Sep 06, 2018 at 04:31:16PM +0200, Arnd Bergmann wrote:
Similarly, an MMIO read may be used to see if a DMA has completed and the device register tells you that the DMA has left the device, but without a barrier, the CPU may have prefetched the DMA data while waiting for the MMIO-read to complete. The
__io_ar()barrier()inasm-generic/io.hprevents the compiler from reordering the two reads, but if an weakly ordered read (in coherent DMA buffer) can bypass a strongly ordered read (MMIO), then it's still still broken.
Quoted 6 lines
Quoted 4 lines
__io_ar()barrier()? notrmb()?! I've defined the rmb in asm/barrier, So I gotrmb()here notbarrier().Only
__io_br()isbarrier().Ah right, I misremembered the defaults. It's probably ok then.
Thx for the review and comments. These let me re-consider the mmio issues and help to improve the csky asm/io.h in future.
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 4 lines
Quoted 3 lines
- How does endianess work? Are there any buses that flip bytes around when running big-endian, or do you always do that in software?
Currently we only support little-endian and soc will follow it.
Ok, that makes it easier. If you think that you won't even need big-endian support in the long run, you could also remove your
asm/byteorder.hheader. If you're not sure, it doesn't hurt to keep it of course.
Quoted 8 lines
Quoted 1 line
Em... I'm not sure, so let me keep it for a while.
Ok. I think overall the trend is to be little-endian only for most
architectures: powerpc64 moved from big-endian only to little-endian by default, ARM rarely uses big-endian (basically only for legacy applications ported from BE MIPS or ppc), and all new architectures we added in the last years are little-endian (OpenRISC being the main exception).
Good news, I really don't want to support big-endian and it makes CI double.
Best Regards
Guo Ren
PATCH v3 7/26 csky: MMU and page table management
In reply to Guo Ren - abiv1 CPU (CK610) is VIPT cache and it doesn't support highmem.
- abiv2 CPUs are all PIPT cache and they could support highmem.
Here is our memory layout plan:
Fixmap : 0xffc02000 – 0xfffff000 (4 MB - 12KB) Pkmap : 0xff800000 – 0xffc00000 (4 MB) Vmalloc : 0xf0200000 – 0xff000000 (238 MB) Lowmem : 0x80000000 – 0xc0000000 (1GB)
Lowmem is directly mapped by msa0 & msa1 reg, and we needn't setup page-table for it.
--- arch/csky/abiv1/inc/abi/ckmmu.h | 74 ++++++++ arch/csky/abiv1/inc/abi/page.h | 26 +++ arch/csky/abiv1/inc/abi/pgtable-bits.h | 36 ++++ arch/csky/abiv1/mmap.c | 65 +++++++ arch/csky/abiv2/inc/abi/ckmmu.h | 87 ++++++++++ arch/csky/abiv2/inc/abi/page.h | 14 ++ arch/csky/abiv2/inc/abi/pgtable-bits.h | 37 ++++ arch/csky/include/asm/addrspace.h | 10 ++ arch/csky/include/asm/fixmap.h | 26 +++ arch/csky/include/asm/highmem.h | 50 ++++++ arch/csky/include/asm/mmu.h | 11 ++ arch/csky/include/asm/page.h | 101 +++++++++++ arch/csky/include/asm/pgalloc.h | 108 ++++++++++++ arch/csky/include/asm/pgtable.h | 299 +++++++++++++++++++++++++++++++++ arch/csky/include/asm/segment.h | 18 ++ arch/csky/include/asm/shmparam.h | 10 ++ arch/csky/mm/dma-mapping.c | 254 ++++++++++++++++++++++++++++ arch/csky/mm/highmem.c | 195 +++++++++++++++++++++ arch/csky/mm/init.c | 116 +++++++++++++ arch/csky/mm/ioremap.c | 48 ++++++ 20 files changed, 1585 insertions(+) create mode 100644 arch/csky/abiv1/inc/abi/ckmmu.h create mode 100644 arch/csky/abiv1/inc/abi/page.h create mode 100644 arch/csky/abiv1/inc/abi/pgtable-bits.h create mode 100644 arch/csky/abiv1/mmap.c create mode 100644 arch/csky/abiv2/inc/abi/ckmmu.h create mode 100644 arch/csky/abiv2/inc/abi/page.h create mode 100644 arch/csky/abiv2/inc/abi/pgtable-bits.h create mode 100644 arch/csky/include/asm/addrspace.h create mode 100644 arch/csky/include/asm/fixmap.h create mode 100644 arch/csky/include/asm/highmem.h create mode 100644 arch/csky/include/asm/mmu.h create mode 100644 arch/csky/include/asm/page.h create mode 100644 arch/csky/include/asm/pgalloc.h create mode 100644 arch/csky/include/asm/pgtable.h create mode 100644 arch/csky/include/asm/segment.h create mode 100644 arch/csky/include/asm/shmparam.h create mode 100644 arch/csky/mm/dma-mapping.c create mode 100644 arch/csky/mm/highmem.c create mode 100644 arch/csky/mm/init.c create mode 100644 arch/csky/mm/ioremap.c
arch/csky/abiv1/inc/abi/ckmmu.h new file +74 -0
@@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_CKMMUV1_H +#define __ASM_CSKY_CKMMUV1_H +#include <abi/reg_ops.h> + +static inline int read_mmu_index (void ) +{ +return cprcr ("cpcr0" ); +} + +static inline void write_mmu_index (int value) +{ +cpwcr ("cpcr0" , value); +} + +static inline int read_mmu_entrylo0 (void ) +{ +return cprcr ("cpcr2" ) <<6 ; +} + +static inline int read_mmu_entrylo1 (void ) +{ +return cprcr ("cpcr3" ) <<6 ; +} + +static inline void write_mmu_pagemask (int value) +{ +cpwcr ("cpcr6" , value); +} + +static inline int read_mmu_entryhi (void ) +{ +return cprcr ("cpcr4" ); +} + +static inline void write_mmu_entryhi (int value) +{ +cpwcr ("cpcr4" , value); +} + +/* +* TLB operations. +*/ +static inline void tlb_probe (void ) +{ +cpwcr ("cpcr8" ,0x80000000 ); +} + +static inline void tlb_read (void ) +{ +cpwcr ("cpcr8" ,0x40000000 ); +} + +static inline void tlb_invalid_all (void ) +{ +cpwcr ("cpcr8" ,0x04000000 ); +} + +static inline void tlb_invalid_indexed (void ) +{ +cpwcr ("cpcr8" ,0x02000000 ); +} + +static inline void setup_pgd (unsigned long pgd,bool kernel) +{ +cpwcr ("cpcr29" , pgd); +} + +static inline unsigned long get_pgd (void ) +{ +return cprcr ("cpcr29" ); +} +#endif /* __ASM_CSKY_CKMMUV1_H */
arch/csky/abiv1/inc/abi/page.h new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +extern unsigned long shm_align_mask; +extern void flush_dcache_page (struct page *); + +static inline unsigned long pages_do_alias (unsigned long addr1, +unsigned long addr2) +{ +return (addr1 ^ addr2) & shm_align_mask; +} + +static inline void clear_user_page (void *addr,unsigned long vaddr, +struct page *page) +{ +clear_page (addr); +if (pages_do_alias ((unsigned long ) addr, vaddr &PAGE_MASK )) +flush_dcache_page (page); +} + +static inline void copy_user_page (void *to,void *from,unsigned long vaddr, +struct page *page) +{ +copy_page (to, from); +if (pages_do_alias ((unsigned long ) to, vaddr &PAGE_MASK )) +flush_dcache_page (page); +}
arch/csky/abiv1/inc/abi/pgtable-bits.h new file +36 -0
@@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_PGTABLE_BITS_H +#define __ASM_CSKY_PGTABLE_BITS_H + +/* implemented in software */ +#define _PAGE_ACCESSED (1<<3) +#define PAGE_ACCESSED_BIT (3) + +#define _PAGE_READ (1<<1) +#define _PAGE_WRITE (1<<2) +#define _PAGE_PRESENT (1<<0) + +#define _PAGE_MODIFIED (1<<4) +#define PAGE_MODIFIED_BIT (4) + +/* implemented in hardware */ +#define _PAGE_GLOBAL (1<<6) + +#define _PAGE_VALID (1<<7) +#define PAGE_VALID_BIT (7) + +#define _PAGE_DIRTY (1<<8) +#define PAGE_DIRTY_BIT (8) + +#define _PAGE_CACHE (3<<9) +#define _PAGE_UNCACHE (2<<9) + +#define _CACHE_MASK (7<<9) + +#define _CACHE_CACHED (_PAGE_VALID | _PAGE_CACHE) +#define _CACHE_UNCACHED (_PAGE_VALID | _PAGE_UNCACHE) + +#define HAVE_ARCH_UNMAPPED_AREA + +#endif /* __ASM_CSKY_PGTABLE_BITS_H */
arch/csky/abiv1/mmap.c new file +65 -0
65 lines not on this page · raw message
arch/csky/abiv2/inc/abi/ckmmu.h new file +87 -0
87 lines not on this page · raw message
arch/csky/abiv2/inc/abi/page.h new file +14 -0
@@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +static inline void clear_user_page (void *addr,unsigned long vaddr, +struct page *page) +{ +clear_page (addr); +} + +static inline void copy_user_page (void *to,void *from,unsigned long vaddr, +struct page *page) +{ +copy_page (to, from); +}
arch/csky/abiv2/inc/abi/pgtable-bits.h new file +37 -0
@@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_PGTABLE_BITS_H +#define __ASM_CSKY_PGTABLE_BITS_H + +/* implemented in software */ +#define _PAGE_ACCESSED (1<<7) +#define PAGE_ACCESSED_BIT (7) + +#define _PAGE_READ (1<<8) +#define _PAGE_WRITE (1<<9) +#define _PAGE_PRESENT (1<<10) + +#define _PAGE_MODIFIED (1<<11) +#define PAGE_MODIFIED_BIT (11) + +/* implemented in hardware */ +#define _PAGE_GLOBAL (1<<0) + +#define _PAGE_VALID (1<<1) +#define PAGE_VALID_BIT (1) + +#define _PAGE_DIRTY (1<<2) +#define PAGE_DIRTY_BIT (2) + +#define _PAGE_SO (1<<5) +#define _PAGE_BUF (1<<6) + +#define _PAGE_CACHE (1<<3) + +#define _CACHE_MASK _PAGE_CACHE + +#define _CACHE_CACHED (_PAGE_VALID | _PAGE_CACHE | _PAGE_BUF) +#define _CACHE_UNCACHED (_PAGE_VALID | _PAGE_SO) + +#endif /* __ASM_CSKY_PGTABLE_BITS_H */
arch/csky/include/asm/addrspace.h new file +10 -0
@@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_ADDRSPACE_H +#define __ASM_CSKY_ADDRSPACE_H + +#define KSEG0 0x80000000ul +#define KSEG0ADDR (a) (((unsigned long)a & 0x1fffffff) | KSEG0) + +#endif /* __ASM_CSKY_ADDRSPACE_H */
arch/csky/include/asm/fixmap.h new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_FIXMAP_H +#define __ASM_CSKY_FIXMAP_H + +#include <asm/page.h> +#ifdef CONFIG_HIGHMEM +#include <linux/threads.h> +#include <asm/kmap_types.h> +#endif + +enum fixed_addresses { +#ifdef CONFIG_HIGHMEM +FIX_KMAP_BEGIN , +FIX_KMAP_END =FIX_KMAP_BEGIN + (KM_TYPE_NR *NR_CPUS ) -1 , +#endif + __end_of_fixed_addresses +}; + +#define FIXADDR_TOP 0xffffc000 +#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) + +#include <asm-generic/fixmap.h> + +#endif /* __ASM_CSKY_FIXMAP_H */
arch/csky/include/asm/highmem.h new file +50 -0
50 lines not on this page · raw message
arch/csky/include/asm/mmu.h new file +11 -0
@@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_MMU_H +#define __ASM_CSKY_MMU_H + +typedef struct { +unsigned long asid[NR_CPUS ]; +void *vdso; +}mm_context_t ; + +#endif /* __ASM_CSKY_MMU_H */
arch/csky/include/asm/page.h new file +101 -0
101 lines not on this page · raw message
arch/csky/include/asm/pgalloc.h new file +108 -0
108 lines not on this page · raw message
arch/csky/include/asm/pgtable.h new file +299 -0
299 lines not on this page · raw message
arch/csky/include/asm/segment.h new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_SEGMENT_H +#define __ASM_CSKY_SEGMENT_H + +typedef struct { +unsigned long seg; +}mm_segment_t ; + +#define KERNEL_DS ((mm_segment_t) { 0xFFFFFFFF }) +#define get_ds () KERNEL_DS + +#define USER_DS ((mm_segment_t) { 0x80000000UL }) +#define get_fs () (current_thread_info()->addr_limit) +#define set_fs (x) (current_thread_info()->addr_limit = (x)) +#define segment_eq (a,b) ((a).seg == (b).seg) + +#endif /* __ASM_CSKY_SEGMENT_H */
arch/csky/include/asm/shmparam.h new file +10 -0
@@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_SHMPARAM_H +#define __ASM_CSKY_SHMPARAM_H + +#define SHMLBA (4 * PAGE_SIZE) + +#define __ARCH_FORCE_SHMLBA + +#endif /* __ASM_CSKY_SHMPARAM_H */
arch/csky/mm/dma-mapping.c new file +254 -0
254 lines not on this page · raw message
arch/csky/mm/highmem.c new file +195 -0
195 lines not on this page · raw message
arch/csky/mm/init.c new file +116 -0
116 lines not on this page · raw message
arch/csky/mm/ioremap.c new file +48 -0
48 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 8/26 csky: Process management and Signal
In reply to Guo Ren--- arch/csky/abiv2/fpu.c | 281 +++++++++++++++++++++++++ arch/csky/abiv2/inc/abi/fpu.h | 66 ++++++ arch/csky/include/asm/mmu_context.h | 148 ++++++++++++++ arch/csky/include/asm/processor.h | 120 +++++++++++ arch/csky/include/asm/switch_to.h | 35 ++++ arch/csky/include/asm/thread_info.h | 74 +++++++ arch/csky/include/uapi/asm/sigcontext.h | 13 ++ arch/csky/kernel/process.c | 134 ++++++++++++ arch/csky/kernel/signal.c | 350 ++++++++++++++++++++++++++++++++ arch/csky/kernel/time.c | 11 + 10 files changed, 1232 insertions(+) create mode 100644 arch/csky/abiv2/fpu.c create mode 100644 arch/csky/abiv2/inc/abi/fpu.h create mode 100644 arch/csky/include/asm/mmu_context.h create mode 100644 arch/csky/include/asm/processor.h create mode 100644 arch/csky/include/asm/switch_to.h create mode 100644 arch/csky/include/asm/thread_info.h create mode 100644 arch/csky/include/uapi/asm/sigcontext.h create mode 100644 arch/csky/kernel/process.c create mode 100644 arch/csky/kernel/signal.c create mode 100644 arch/csky/kernel/time.c
arch/csky/abiv2/fpu.c new file +281 -0
@@ -0,0 +1,281 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/ptrace.h> +#include <linux/uaccess.h> +#include <abi/reg_ops.h> + +#define MTCR_MASK 0xFC00FFE0 +#define MFCR_MASK 0xFC00FFE0 +#define MTCR_DIST 0xC0006420 +#define MFCR_DIST 0xC0006020 + +void __init init_fpu (void ) +{ +mtcr ("cr<1, 2>" ,0 ); +} + +/* +* fpu_libc_helper() is to help libc to excute: +* - mfcr %a, cr<1, 2> +* - mfcr %a, cr<2, 2> +* - mtcr %a, cr<1, 2> +* - mtcr %a, cr<2, 2> +*/ +int fpu_libc_helper (struct pt_regs * regs) +{ +int fault; +unsigned long instrptr, regx =0 ; +unsigned long index =0 , tmp =0 ; +unsigned long tinstr =0 ; +u16 instr_hi, instr_low; + + instrptr =instruction_pointer (regs); +if (instrptr &1 )return 0 ; + + fault =__get_user (instr_low, (u16 *)instrptr); +if (fault)return 0 ; + + fault =__get_user (instr_hi, (u16 *)(instrptr +2 )); +if (fault)return 0 ; + + tinstr = instr_hi | ((unsigned long )instr_low <<16 ); + +if (((tinstr >>21 ) &0x1F ) !=2 )return 0 ; + +if ((tinstr &MTCR_MASK ) ==MTCR_DIST ) + { + index = (tinstr >>16 ) &0x1F ; +if (index >13 )return 0 ; + + tmp = tinstr &0x1F ; +if (tmp >2 )return 0 ; + + regx = *(®s->a0 + index); + +if (tmp ==1 ) +mtcr ("cr<1, 2>" , regx); +else if (tmp ==2 ) +mtcr ("cr<2, 2>" , regx); +else +return 0 ; + + regs->pc +=4 ; +return 1 ; + } + +if ((tinstr &MFCR_MASK ) ==MFCR_DIST ) { + index = tinstr &0x1F ; +if (index >13 )return 0 ; + + tmp = ((tinstr >>16 ) &0x1F ); +if (tmp >2 )return 0 ; + +if (tmp ==1 ) + regx =mfcr ("cr<1, 2>" ); +else if (tmp ==2 ) + regx =mfcr ("cr<2, 2>" ); +else +return 0 ; + + *(®s->a0 + index) = regx; + + regs->pc +=4 ; +return 1 ; + } + +return 0 ; +} + +void fpu_fpe (struct pt_regs * regs) +{ +int sig; +unsigned int fesr; +siginfo_t info; + + fesr =mfcr ("cr<2, 2>" ); + +if (fesr &FPE_ILLE ){ + info.si_code =ILL_ILLOPC ; + sig =SIGILL ; + } +else if (fesr &FPE_IDC ){ + info.si_code =ILL_ILLOPN ; + sig =SIGILL ; + } +else if (fesr &FPE_FEC ){ + sig =SIGFPE ; +if (fesr &FPE_IOC ){ + info.si_code =FPE_FLTINV ; + } +else if (fesr &FPE_DZC ){ + info.si_code =FPE_FLTDIV ; + } +else if (fesr &FPE_UFC ){ + info.si_code =FPE_FLTUND ; + } +else if (fesr &FPE_OFC ){ + info.si_code =FPE_FLTOVF ; + } +else if (fesr &FPE_IXC ){ + info.si_code =FPE_FLTRES ; + } +else { + info.si_code =NSIGFPE ; + } + } +else { + info.si_code =NSIGFPE ; + sig =SIGFPE ; + } + info.si_signo =SIGFPE ; + info.si_errno =0 ; + info.si_addr = (void *)regs->pc; +force_sig_info (sig, &info, current); +} + +#define FMFVR_FPU_REGS (vrx, vry) \ + "fmfvrl %0, "#vrx" \n" \ + "fmfvrh %1, "#vrx" \n" \ + "fmfvrl %2, "#vry" \n" \ + "fmfvrh %3, "#vry" \n" + +#define FMTVR_FPU_REGS (vrx, vry) \ + "fmtvrl "#vrx", %0 \n" \ + "fmtvrh "#vrx", %1 \n" \ + "fmtvrl "#vry", %2 \n" \ + "fmtvrh "#vry", %3 \n" + +#define STW_FPU_REGS (a, b, c, d) \ + "stw %0, (%4, "#a") \n" \ + "stw %1, (%4, "#b") \n" \ + "stw %2, (%4, "#c") \n" \ + "stw %3, (%4, "#d") \n" + +#define LDW_FPU_REGS (a, b, c, d) \ + "ldw %0, (%4, "#a") \n" \ + "ldw %1, (%4, "#b") \n" \ + "ldw %2, (%4, "#c") \n" \ + "ldw %3, (%4, "#d") \n" + +void save_to_user_fp (struct user_fp *user_fp) +{ +unsigned long flg; +unsigned long tmp1, tmp2; +unsigned long *fpregs; + +local_irq_save (flg); + + tmp1 =mfcr ("cr<1, 2>" ); + tmp2 =mfcr ("cr<2, 2>" ); + + user_fp->fcr = tmp1; + user_fp->fesr = tmp2; + + fpregs = &user_fp->vr[0 ]; +#ifdef CONFIG_CPU_HAS_FPUV2 +#ifdef CONFIG_CPU_HAS_VDSP + asmvolatile ( +"vstmu.32 vr0-vr3, (%0) \n" +"vstmu.32 vr4-vr7, (%0) \n" +"vstmu.32 vr8-vr11, (%0) \n" +"vstmu.32 vr12-vr15, (%0) \n" +"fstmu.64 vr16-vr31, (%0) \n" + :"+a" (fpregs) + ::"memory" ); +#else + asmvolatile ( +"fstmu.64 vr0-vr31, (%0) \n" + :"+a" (fpregs) + ::"memory" ); +#endif +#else + { +unsigned long tmp3, tmp4; + asm volatile( + FMFVR_FPU_REGS(vr0, vr1) + STW_FPU_REGS(0, 4, 16, 20) + FMFVR_FPU_REGS(vr2, vr3) + STW_FPU_REGS(32, 36, 48, 52) + FMFVR_FPU_REGS(vr4, vr5) + STW_FPU_REGS(64, 68, 80, 84) + FMFVR_FPU_REGS(vr6, vr7) + STW_FPU_REGS(96, 100, 112, 116) +"addi %4, 128\n" + FMFVR_FPU_REGS(vr8, vr9) + STW_FPU_REGS(0, 4, 16, 20) + FMFVR_FPU_REGS(vr10, vr11) + STW_FPU_REGS(32, 36, 48, 52) + FMFVR_FPU_REGS(vr12, vr13) + STW_FPU_REGS(64, 68, 80, 84) + FMFVR_FPU_REGS(vr14, vr15) + STW_FPU_REGS(96, 100, 112, 116) + :"=a"(tmp1),"=a"(tmp2),"=a"(tmp3), + "=a"(tmp4),"+a"(fpregs) + ::"memory"); + } +#endif + +local_irq_restore (flg); +} + +void restore_from_user_fp (struct user_fp *user_fp) +{ +unsigned long flg; +unsigned long tmp1, tmp2; +unsigned long *fpregs; + +local_irq_save (flg); + + tmp1 = user_fp->fcr; + tmp2 = user_fp->fesr; + +mtcr ("cr<1, 2>" , tmp1); +mtcr ("cr<2, 2>" , tmp2); + + fpregs = &user_fp->vr[0 ]; +#ifdef CONFIG_CPU_HAS_FPUV2 +#ifdef CONFIG_CPU_HAS_VDSP + asmvolatile ( +"vldmu.32 vr0-vr3, (%0) \n" +"vldmu.32 vr4-vr7, (%0) \n" +"vldmu.32 vr8-vr11, (%0) \n" +"vldmu.32 vr12-vr15, (%0) \n" +"fldmu.64 vr16-vr31, (%0) \n" + :"+a" (fpregs) + ::"memory" ); +#else + asmvolatile ( +"fldmu.64 vr0-vr31, (%0) \n" + :"+a" (fpregs) + ::"memory" ); +#endif +#else + { +unsigned long tmp3, tmp4; + asm volatile( + LDW_FPU_REGS(0, 4, 16, 20) + FMTVR_FPU_REGS(vr0, vr1) + LDW_FPU_REGS(32, 36, 48, 52) + FMTVR_FPU_REGS(vr2, vr3) + LDW_FPU_REGS(64, 68, 80, 84) + FMTVR_FPU_REGS(vr4, vr5) + LDW_FPU_REGS(96, 100, 112, 116) + FMTVR_FPU_REGS(vr6, vr7) +"addi %4, 128\n" + LDW_FPU_REGS(0, 4, 16, 20) + FMTVR_FPU_REGS(vr8, vr9) + LDW_FPU_REGS(32, 36, 48, 52) + FMTVR_FPU_REGS(vr10, vr11) + LDW_FPU_REGS(64, 68, 80, 84) + FMTVR_FPU_REGS(vr12, vr13) + LDW_FPU_REGS(96, 100, 112, 116) + FMTVR_FPU_REGS(vr14, vr15) + :"=a"(tmp1),"=a"(tmp2),"=a"(tmp3), + "=a"(tmp4),"+a"(fpregs) + ::"memory"); + } +#endif + +local_irq_restore (flg); +}
arch/csky/abiv2/inc/abi/fpu.h new file +66 -0
66 lines not on this page · raw message
arch/csky/include/asm/mmu_context.h new file +148 -0
148 lines not on this page · raw message
arch/csky/include/asm/processor.h new file +120 -0
120 lines not on this page · raw message
arch/csky/include/asm/switch_to.h new file +35 -0
@@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_SWITCH_TO_H +#define __ASM_CSKY_SWITCH_TO_H + +#include <linux/thread_info.h> +#ifdef CONFIG_CPU_HAS_FPU +#include <abi/fpu.h> +static inline void __switch_to_fpu (struct task_struct *prev, +struct task_struct *next) +{ +save_to_user_fp (&prev->thread.user_fp); +restore_from_user_fp (&next->thread.user_fp); +} +#else +static inline void __switch_to_fpu (struct task_struct *prev, +struct task_struct *next) +{} +#endif + +/* +* Context switching is now performed out-of-line in switch_to.S +*/ +extern struct task_struct *__switch_to (struct task_struct *, +struct task_struct *); + +#define switch_to (prev, next, last) \ + do { \ + struct task_struct *__prev = (prev); \ + struct task_struct *__next = (next); \ + __switch_to_fpu(__prev, __next); \ + ((last) = __switch_to((prev), (next))); \ + } while (0) + +#endif /* __ASM_CSKY_SWITCH_TO_H */
arch/csky/include/asm/thread_info.h new file +74 -0
74 lines not on this page · raw message
arch/csky/include/uapi/asm/sigcontext.h new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_SIGCONTEXT_H +#define __ASM_CSKY_SIGCONTEXT_H + +#include <asm/ptrace.h> + +struct sigcontext { +struct pt_regs sc_pt_regs; +struct user_fp sc_user_fp; +}; + +#endif /* __ASM_CSKY_SIGCONTEXT_H */
arch/csky/kernel/process.c new file +134 -0
134 lines not on this page · raw message
arch/csky/kernel/signal.c new file +350 -0
350 lines not on this page · raw message
arch/csky/kernel/time.c new file +11 -0
@@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/clk-provider.h> +#include <linux/clocksource.h> + +void __init time_init (void ) +{ +of_clk_init (NULL ); +timer_probe (); +}
Signature · 1 line
2.7.4
PATCH v3 9/26 csky: VDSO and rt_sigreturn
In reply to Guo Ren--- arch/csky/abiv1/inc/abi/vdso.h | 17 ++++++++ arch/csky/abiv2/inc/abi/vdso.h | 24 ++++++++++++ arch/csky/include/asm/vdso.h | 12 ++++++ arch/csky/kernel/vdso.c | 88 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 arch/csky/abiv1/inc/abi/vdso.h create mode 100644 arch/csky/abiv2/inc/abi/vdso.h create mode 100644 arch/csky/include/asm/vdso.h create mode 100644 arch/csky/kernel/vdso.c
arch/csky/abiv1/inc/abi/vdso.h new file +17 -0
@@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/uaccess.h> + +static inline int setup_vdso_page (unsigned short *ptr) +{ +int err =0 ; + +/* movi r1, 127 */ + err |=__put_user (0x67f1 , ptr +0 ); +/* addi r1, (139 - 127) */ + err |=__put_user (0x20b1 , ptr +1 ); +/* trap 0 */ + err |=__put_user (0x0008 , ptr +2 ); + +return err; +}
arch/csky/abiv2/inc/abi/vdso.h new file +24 -0
@@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_CSKY_VDSO_H +#define __ABI_CSKY_VDSO_H + +#include <linux/uaccess.h> + +static inline int setup_vdso_page (unsigned short *ptr) +{ +int err =0 ; + +/* movi r7, 173 */ + err |=__put_user (0xea07 , ptr); + err |=__put_user (0x008b , ptr+1 ); + +/* trap 0 */ + err |=__put_user (0xc000 , ptr+2 ); + err |=__put_user (0x2020 , ptr+3 ); + +return err; +} + +#endif /* __ABI_CSKY_STRING_H */
arch/csky/include/asm/vdso.h new file +12 -0
@@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_VDSO_H +#define __ASM_CSKY_VDSO_H + +#include <abi/vdso.h> + +struct csky_vdso { +unsigned short rt_signal_retcode[4 ]; +}; + +#endif /* __ASM_CSKY_VDSO_H */
arch/csky/kernel/vdso.c new file +88 -0
88 lines not on this page · raw message
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 09/26] csky: VDSO and rt_sigreturn
arch/csky/kernel/vdso.c line 39
Quoted 7 lines · Guo Ren
arch/csky/kernel/vdso.c new file +7
-0+ +/* +* __NR_rt_sigreturn must be 173 +* Because gcc/config/csky/linux-unwind.h use hard code to parse rt_sigframe. +*/ + err =setup_vdso_page (vdso->rt_signal_retcode); +if (err)panic ("Cannot set signal return code, err: %x." , err);
__NR_rt_sigreturn is 139
I think you need to update the comment, and probably check your gcc sources to ensure it still does the right thing.
Arnd
Re: [PATCH V3 09/26] csky: VDSO and rt_sigreturn
Quoted 11 lines · Arnd Bergmann
arch/csky/kernel/vdso.c line 39
Quoted 7 lines · Guo Ren
arch/csky/kernel/vdso.c new file +7
-0+ +/* +* __NR_rt_sigreturn must be 173 +* Because gcc/config/csky/linux-unwind.h use hard code to parse rt_sigframe. +*/ + err =setup_vdso_page (vdso->rt_signal_retcode); +if (err)panic ("Cannot set signal return code, err: %x." , err);
__NR_rt_sigreturnis 139
Yes, we've changed to use asm-generic define, and I forgot to update the comment.
Guo Ren
PATCH v3 10/26 csky: IRQ handling
In reply to Guo Ren--- arch/csky/include/asm/irq.h | 10 ++++++++ arch/csky/include/asm/irqflags.h | 49 ++++++++++++++++++++++++++++++++++++++++ arch/csky/kernel/irq.c | 31 +++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 arch/csky/include/asm/irq.h create mode 100644 arch/csky/include/asm/irqflags.h create mode 100644 arch/csky/kernel/irq.c
arch/csky/include/asm/irq.h new file +10 -0
@@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_IRQ_H +#define __ASM_CSKY_IRQ_H + +#include <asm-generic/irq.h> + +extern void set_handle_irq (void (*handle_irq)(struct pt_regs *)); + +#endif /* __ASM_CSKY_IRQ_H */
arch/csky/include/asm/irqflags.h new file +49 -0
49 lines not on this page · raw message
arch/csky/kernel/irq.c new file +31 -0
@@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/irq.h> +#include <linux/irqchip.h> +#include <asm/traps.h> +#include <asm/smp.h> + +static void (*handle_arch_irq)(struct pt_regs *regs) =NULL ; + +void __init set_handle_irq (void (*handle_irq)(struct pt_regs *)) +{ +if (handle_arch_irq) +return ; + + handle_arch_irq = handle_irq; +} + +void __init init_IRQ (void ) +{ +irqchip_init (); +#ifdef CONFIG_SMP +setup_smp_ipi (); +#endif +} + +asmlinkage void __irq_entry csky_do_IRQ(struct pt_regs *regs) +{ +handle_arch_irq (regs); +}
Signature · 1 line
2.7.4
Re: [PATCH V3 10/26] csky: IRQ handling
arch/csky/kernel/irq.c line 18
Quoted 9 lines · Guo Ren
arch/csky/kernel/irq.c new file +9
-0+static void (*handle_arch_irq)(struct pt_regs *regs) =NULL ; + +void __init set_handle_irq (void (*handle_irq)(struct pt_regs *)) +{ +if (handle_arch_irq) +return ; + + handle_arch_irq = handle_irq; +}
Please don't introduce yet another variant of that. Please use CONFIG_GENERIC_IRQ_MULTI_HANDLER which provides that in the generic code.
Btw, some of your patches have tab vs. space inconsistencies, e.g.
+ siginfo_t info;
+ int fault;
+ unsigned long address = mmu_meh & PAGE_MASK;
Thanks,
tglx
Re: [PATCH V3 10/26] csky: IRQ handling
Quoted 14 lines · Thomas Gleixner
arch/csky/kernel/irq.c line 18
Quoted 9 lines · Guo Ren
arch/csky/kernel/irq.c new file +9
-0+static void (*handle_arch_irq)(struct pt_regs *regs) =NULL ; + +void __init set_handle_irq (void (*handle_irq)(struct pt_regs *)) +{ +if (handle_arch_irq) +return ; + + handle_arch_irq = handle_irq; +}Please don't introduce yet another variant of that. Please use
CONFIG_GENERIC_IRQ_MULTI_HANDLERwhich provides that in the generic code.
Ok.
Review
Quoted 6 lines
Btw, some of your patches have tab vs. space inconsistencies, e.g.
(quoted diff) +3
-0+ siginfo_t info; + int fault; + unsigned long address = mmu_meh & PAGE_MASK
Thx, I'll re-check.
Best Regards
Guo Ren
PATCH v3 11/26 csky: Atomic operations
In reply to Guo Ren--- arch/csky/include/asm/atomic.h | 215 +++++++++++++++++++++++++ arch/csky/include/asm/cmpxchg.h | 70 ++++++++ arch/csky/include/asm/spinlock.h | 286 +++++++++++++++++++++++++++++++++ arch/csky/include/asm/spinlock_types.h | 35 ++++ arch/csky/kernel/atomic.S | 86 ++++++++++ 5 files changed, 692 insertions(+) create mode 100644 arch/csky/include/asm/atomic.h create mode 100644 arch/csky/include/asm/cmpxchg.h create mode 100644 arch/csky/include/asm/spinlock.h create mode 100644 arch/csky/include/asm/spinlock_types.h create mode 100644 arch/csky/kernel/atomic.S
arch/csky/include/asm/atomic.h new file +215 -0
@@ -0,0 +1,215 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_ATOMIC_H +#define __ASM_CSKY_ATOMIC_H + +#include <linux/version.h> +#include <asm/cmpxchg.h> +#include <asm/barrier.h> + +#ifdef CONFIG_CPU_HAS_LDSTEX + +#define __atomic_add_unless __atomic_add_unless +static inline int __atomic_add_unless(atomic_t *v, int a, int u) +{ + unsigned long tmp, ret; + + smp_mb(); + + asm volatile ( + "1: ldex.w %0, (%3) \n" + " mov %1, %0 \n" + " cmpne %0, %4 \n" + " bf 2f \n" + " add %0, %2 \n" + " stex.w %0, (%3) \n" + " bez %0, 1b \n" + "2: \n" + : "=&r" (tmp), "=&r" (ret) + : "r" (a), "r"(&v->counter), "r"(u) + : "memory"); + + if (ret != u) + smp_mb(); + + return ret; +} + +#define ATOMIC_OP(op, c_op) \ +static inline void atomic_##op(int i, atomic_t *v) \ +{ \ + unsigned long tmp; \ + \ + smp_mb(); \ + asm volatile ( \ + "1: ldex.w %0, (%2) \n" \ + " " #op " %0, %1 \n" \ + " stex.w %0, (%2) \n" \ + " bez %0, 1b \n" \ + : "=&r" (tmp) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + smp_mb(); \ +} + +#define ATOMIC_OP_RETURN(op, c_op) \ +static inline int atomic_##op##_return(int i, atomic_t *v) \ +{ \ + unsigned long tmp, ret; \ + \ + smp_mb(); \ + asm volatile ( \ + "1: ldex.w %0, (%3) \n" \ + " " #op " %0, %2 \n" \ + " mov %1, %0 \n" \ + " stex.w %0, (%3) \n" \ + " bez %0, 1b \n" \ + : "=&r" (tmp), "=&r" (ret) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + smp_mb(); \ + \ + return ret; \ +} + +#define ATOMIC_FETCH_OP(op, c_op) \ +static inline int atomic_fetch_##op(int i, atomic_t *v) \ +{ \ + unsigned long tmp, ret; \ + \ + smp_mb(); \ + asm volatile ( \ + "1: ldex.w %0, (%3) \n" \ + " mov %1, %0 \n" \ + " " #op " %0, %2 \n" \ + " stex.w %0, (%3) \n" \ + " bez %0, 1b \n" \ + : "=&r" (tmp), "=&r" (ret) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + smp_mb(); \ + \ + return ret; \ +} + +#else /* CONFIG_CPU_HAS_LDSTEX */ + +#include <linux/irqflags.h> + +#define __atomic_add_unless __atomic_add_unless +static inline int __atomic_add_unless(atomic_t *v, int a, int u) +{ + unsigned long tmp, ret, flags; + + raw_local_irq_save(flags); + + asm volatile ( + " ldw %0, (%3) \n" + " mov %1, %0 \n" + " cmpne %0, %4 \n" + " bf 2f \n" + " add %0, %2 \n" + " stw %0, (%3) \n" + "2: \n" + : "=&r" (tmp), "=&r" (ret) + : "r" (a), "r"(&v->counter), "r"(u) + : "memory"); + + raw_local_irq_restore(flags); + + return ret; +} + +#define ATOMIC_OP(op, c_op) \ +static inline void atomic_##op(int i, atomic_t *v) \ +{ \ + unsigned long tmp, flags; \ + \ + raw_local_irq_save(flags); \ + \ + asm volatile ( \ + " ldw %0, (%2) \n" \ + " " #op " %0, %1 \n" \ + " stw %0, (%2) \n" \ + : "=&r" (tmp) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + \ + raw_local_irq_restore(flags); \ +} + +#define ATOMIC_OP_RETURN(op, c_op) \ +static inline int atomic_##op##_return(int i, atomic_t *v) \ +{ \ + unsigned long tmp, ret, flags; \ + \ + raw_local_irq_save(flags); \ + \ + asm volatile ( \ + " ldw %0, (%3) \n" \ + " " #op " %0, %2 \n" \ + " stw %0, (%3) \n" \ + " mov %1, %0 \n" \ + : "=&r" (tmp), "=&r" (ret) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + \ + raw_local_irq_restore(flags); \ + \ + return ret; \ +} + +#define ATOMIC_FETCH_OP(op, c_op) \ +static inline int atomic_fetch_##op(int i, atomic_t *v) \ +{ \ + unsigned long tmp, ret, flags; \ + \ + raw_local_irq_save(flags); \ + \ + asm volatile ( \ + " ldw %0, (%3) \n" \ + " mov %1, %0 \n" \ + " " #op " %0, %2 \n" \ + " stw %0, (%3) \n" \ + : "=&r" (tmp), "=&r" (ret) \ + : "r" (i), "r"(&v->counter) \ + : "memory"); \ + \ + raw_local_irq_restore(flags); \ + \ + return ret; \ +} + +#endif /* CONFIG_CPU_HAS_LDSTEX */ + +#define atomic_add_return atomic_add_return +ATOMIC_OP_RETURN(add, +) +#define atomic_sub_return atomic_sub_return +ATOMIC_OP_RETURN(sub, -) + +#define atomic_fetch_add atomic_fetch_add +ATOMIC_FETCH_OP(add, +) +#define atomic_fetch_sub atomic_fetch_sub +ATOMIC_FETCH_OP(sub, -) +#define atomic_fetch_and atomic_fetch_and +ATOMIC_FETCH_OP(and, &) +#define atomic_fetch_or atomic_fetch_or +ATOMIC_FETCH_OP(or, |) +#define atomic_fetch_xor atomic_fetch_xor +ATOMIC_FETCH_OP(xor, ^) + +#define atomic_and atomic_and +ATOMIC_OP(and, &) +#define atomic_or atomic_or +ATOMIC_OP(or, |) +#define atomic_xor atomic_xor +ATOMIC_OP(xor, ^) + +#undef ATOMIC_FETCH_OP +#undef ATOMIC_OP_RETURN +#undef ATOMIC_OP + +#include <asm-generic/atomic.h> + +#endif /* __ASM_CSKY_ATOMIC_H */
arch/csky/include/asm/cmpxchg.h new file +70 -0
70 lines not on this page · raw message
arch/csky/include/asm/spinlock.h new file +286 -0
286 lines not on this page · raw message
arch/csky/include/asm/spinlock_types.h new file +35 -0
@@ -0,0 +1,35 @@ +#ifndef __ASM_CSKY_SPINLOCK_TYPES_H +#define __ASM_CSKY_SPINLOCK_TYPES_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +# error "please don't include this file directly" +#endif + +#define TICKET_NEXT 16 + +typedef struct { +union { +u32 lock; +struct __raw_tickets { +/* little endian */ +u16 owner; +u16 next; + } tickets; + }; +}arch_spinlock_t ; + +#define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } + +#ifdef CONFIG_QUEUED_RWLOCKS +#include <asm-generic/qrwlock_types.h> + +#else /* CONFIG_NR_CPUS > 2 */ + +typedef struct { +u32 lock; +}arch_rwlock_t ; + +#define __ARCH_RW_LOCK_UNLOCKED { 0 } + +#endif /* CONFIG_QUEUED_RWLOCKS */ +#endif /* __ASM_CSKY_SPINLOCK_TYPES_H */
arch/csky/kernel/atomic.S new file +86 -0
86 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 12/26 csky: ELF and module probe
In reply to Guo Ren--- arch/csky/include/asm/elf.h | 149 ++++++++++++++++++++++++++++++++++++++++++++ arch/csky/kernel/module.c | 82 ++++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 arch/csky/include/asm/elf.h create mode 100644 arch/csky/kernel/module.c
arch/csky/include/asm/elf.h new file +149 -0
@@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASMCSKY_ELF_H +#define __ASMCSKY_ELF_H + +/* +* ELF register definitions.. +*/ + +#include <asm/ptrace.h> +#include <abi/regdef.h> + +#define ELF_ARCH 252 + +/* CSKY Relocations */ +#define R_CSKY_NONE 0 +#define R_CSKY_32 1 +#define R_CSKY_PCIMM8BY4 2 +#define R_CSKY_PCIMM11BY2 3 +#define R_CSKY_PCIMM4BY2 4 +#define R_CSKY_PC32 5 +#define R_CSKY_PCRELJSR_IMM11BY2 6 +#define R_CSKY_GNU_VTINHERIT 7 +#define R_CSKY_GNU_VTENTRY 8 +#define R_CSKY_RELATIVE 9 +#define R_CSKY_COPY 10 +#define R_CSKY_GLOB_DAT 11 +#define R_CSKY_JUMP_SLOT 12 +#define R_CSKY_ADDR_HI16 24 +#define R_CSKY_ADDR_LO16 25 +#define R_CSKY_PCRELJSR_IMM26BY2 40 + +typedef unsigned long elf_greg_t ; + +typedef struct user_fp elf_fpregset_t ; + +#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) + +typedef elf_greg_t elf_gregset_t [ELF_NGREG ]; + +/* +* This is used to ensure we don't load something for the wrong architecture. +*/ +#define elf_check_arch (x) ((x)->e_machine == ELF_ARCH) + +/* +* These are used to set parameters in the core dumps. +*/ +#define USE_ELF_CORE_DUMP +#define ELF_EXEC_PAGESIZE 4096 +#define ELF_CLASS ELFCLASS32 +#define ELF_PLAT_INIT (_r, load_addr) _r->a0 = 0 + +#ifdef __cskyBE__ +#define ELF_DATA ELFDATA2MSB +#else +#define ELF_DATA ELFDATA2LSB +#endif + +/* This is the location that an ET_DYN program is loaded if exec'ed. Typical +use of this is to invoke "./ld.so someprog" to test out a new version of +the loader. We need to make sure that it is out of the way of the program +that it will "exec", and that there is sufficient room for the brk. */ + +#define ELF_ET_DYN_BASE 0x0UL + +/* The member sort in array pr_reg[x] is pc, r1, r0, psr, r2, r3,r4, +r5, r6...... Because GDB difine */ +#if defined(__CSKYABIV2__) +#define ELF_CORE_COPY_REGS (pr_reg, regs) \ + pr_reg[0] = regs->pc; \ + pr_reg[1] = regs->a1; \ + pr_reg[2] = regs->a0; \ + pr_reg[3] = regs->sr; \ + pr_reg[4] = regs->a2; \ + pr_reg[5] = regs->a3; \ + pr_reg[6] = regs->regs[0]; \ + pr_reg[7] = regs->regs[1]; \ + pr_reg[8] = regs->regs[2]; \ + pr_reg[9] = regs->regs[3]; \ + pr_reg[10] = regs->regs[4]; \ + pr_reg[11] = regs->regs[5]; \ + pr_reg[12] = regs->regs[6]; \ + pr_reg[13] = regs->regs[7]; \ + pr_reg[14] = regs->regs[8]; \ + pr_reg[15] = regs->regs[9]; \ + pr_reg[16] = regs->usp; \ + pr_reg[17] = regs->lr; \ + pr_reg[18] = regs->exregs[0]; \ + pr_reg[19] = regs->exregs[1]; \ + pr_reg[20] = regs->exregs[2]; \ + pr_reg[21] = regs->exregs[3]; \ + pr_reg[22] = regs->exregs[4]; \ + pr_reg[23] = regs->exregs[5]; \ + pr_reg[24] = regs->exregs[6]; \ + pr_reg[25] = regs->exregs[7]; \ + pr_reg[26] = regs->exregs[8]; \ + pr_reg[27] = regs->exregs[9]; \ + pr_reg[28] = regs->exregs[10]; \ + pr_reg[29] = regs->exregs[11]; \ + pr_reg[30] = regs->exregs[12]; \ + pr_reg[31] = regs->exregs[13]; \ + pr_reg[32] = regs->exregs[14]; \ + pr_reg[33] = regs->tls; +#else +#define ELF_CORE_COPY_REGS (pr_reg, regs) \ + pr_reg[0] = regs->pc; \ + pr_reg[1] = regs->regs[9]; \ + pr_reg[2] = regs->usp; \ + pr_reg[3] = regs->sr; \ + pr_reg[4] = regs->a0; \ + pr_reg[5] = regs->a1; \ + pr_reg[6] = regs->a2; \ + pr_reg[7] = regs->a3; \ + pr_reg[8] = regs->regs[0]; \ + pr_reg[9] = regs->regs[1]; \ + pr_reg[10] = regs->regs[2]; \ + pr_reg[11] = regs->regs[3]; \ + pr_reg[12] = regs->regs[4]; \ + pr_reg[13] = regs->regs[5]; \ + pr_reg[14] = regs->regs[6]; \ + pr_reg[15] = regs->regs[7]; \ + pr_reg[16] = regs->regs[8]; \ + pr_reg[17] = regs->lr; +#endif + +/* Similar, but for a thread other than current. */ +struct task_struct ; +extern int dump_task_regs (struct task_struct *,elf_gregset_t *); +#define ELF_CORE_COPY_TASK_REGS (tsk, elf_regs) dump_task_regs(tsk, elf_regs) + +/* This yields a mask that user programs can use to figure out what +instruction set this cpu supports. */ + +#define ELF_HWCAP (0) + +/* This yields a string that ld.so will use to load implementation +specific libraries for optimization. This is more specific in +intent than poking at uname or /proc/cpuinfo. */ + +#define ELF_PLATFORM (NULL) +#define SET_PERSONALITY (ex) set_personality(PER_LINUX) +#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 +struct linux_binprm ; +extern int arch_setup_additional_pages ( +struct linux_binprm *bprm, +int uses_interp); + +#endif
arch/csky/kernel/module.c new file +82 -0
82 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 13/26 csky: Library functions
In reply to Guo Ren--- arch/csky/abiv1/bswapdi.c | 18 ++ arch/csky/abiv1/bswapsi.c | 14 ++ arch/csky/abiv1/inc/abi/string.h | 13 ++ arch/csky/abiv1/memcpy.S | 344 +++++++++++++++++++++++++++++++++++++++ arch/csky/abiv1/memset.c | 38 +++++ arch/csky/abiv1/strksyms.c | 7 + arch/csky/abiv2/inc/abi/string.h | 28 ++++ arch/csky/abiv2/memcmp.S | 151 +++++++++++++++++ arch/csky/abiv2/memcpy.S | 110 +++++++++++++ arch/csky/abiv2/memcpy.c | 40 +++++ arch/csky/abiv2/memmove.S | 108 ++++++++++++ arch/csky/abiv2/memset.S | 83 ++++++++++ arch/csky/abiv2/strcmp.S | 168 +++++++++++++++++++ arch/csky/abiv2/strcpy.S | 123 ++++++++++++++ arch/csky/abiv2/strksyms.c | 12 ++ arch/csky/abiv2/strlen.S | 97 +++++++++++ arch/csky/abiv2/sysdep.h | 29 ++++ arch/csky/include/asm/string.h | 13 ++ arch/csky/kernel/platform.c | 17 ++ arch/csky/kernel/power.c | 30 ++++ arch/csky/lib/delay.c | 40 +++++ 21 files changed, 1483 insertions(+) create mode 100644 arch/csky/abiv1/bswapdi.c create mode 100644 arch/csky/abiv1/bswapsi.c create mode 100644 arch/csky/abiv1/inc/abi/string.h create mode 100644 arch/csky/abiv1/memcpy.S create mode 100644 arch/csky/abiv1/memset.c create mode 100644 arch/csky/abiv1/strksyms.c create mode 100644 arch/csky/abiv2/inc/abi/string.h create mode 100644 arch/csky/abiv2/memcmp.S create mode 100644 arch/csky/abiv2/memcpy.S create mode 100644 arch/csky/abiv2/memcpy.c create mode 100644 arch/csky/abiv2/memmove.S create mode 100644 arch/csky/abiv2/memset.S create mode 100644 arch/csky/abiv2/strcmp.S create mode 100644 arch/csky/abiv2/strcpy.S create mode 100644 arch/csky/abiv2/strksyms.c create mode 100644 arch/csky/abiv2/strlen.S create mode 100644 arch/csky/abiv2/sysdep.h create mode 100644 arch/csky/include/asm/string.h create mode 100644 arch/csky/kernel/platform.c create mode 100644 arch/csky/kernel/power.c create mode 100644 arch/csky/lib/delay.c
arch/csky/abiv1/bswapdi.c new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/export.h> +#include <linux/compiler.h> + +unsigned long long notrace __bswapdi2 (unsigned long long u) +{ +return (((u) &0xff00000000000000ull ) >>56 ) | + (((u) &0x00ff000000000000ull ) >>40 ) | + (((u) &0x0000ff0000000000ull ) >>24 ) | + (((u) &0x000000ff00000000ull ) >>8 ) | + (((u) &0x00000000ff000000ull ) <<8 ) | + (((u) &0x0000000000ff0000ull ) <<24 ) | + (((u) &0x000000000000ff00ull ) <<40 ) | + (((u) &0x00000000000000ffull ) <<56 ); +} + +EXPORT_SYMBOL (__bswapdi2);
arch/csky/abiv1/bswapsi.c new file +14 -0
@@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/export.h> +#include <linux/compiler.h> + +unsigned int notrace __bswapsi2(unsigned int u) +{ +return (((u) &0xff000000 ) >>24 ) | + (((u) &0x00ff0000 ) >>8 ) | + (((u) &0x0000ff00 ) <<8 ) | + (((u) &0x000000ff ) <<24 ); +} + +EXPORT_SYMBOL (__bswapsi2);
arch/csky/abiv1/inc/abi/string.h new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_CSKY_STRING_H +#define __ABI_CSKY_STRING_H + +#define __HAVE_ARCH_MEMCPY +extern void *memcpy (void *,const void *,__kernel_size_t ); + +#define __HAVE_ARCH_MEMSET +extern void *memset (void *,int ,__kernel_size_t ); + +#endif /* __ABI_CSKY_STRING_H */
arch/csky/abiv1/memcpy.S new file +344 -0
344 lines not on this page · raw message
arch/csky/abiv1/memset.c new file +38 -0
@@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/types.h> + +void *memset (void *dest,int c,size_t l) +{ +char *d = dest; +int ch = c; +int tmp; + +if ((long )d &0x3 ) +while (l--) *d++ = ch; +else { + ch &=0xff ; + tmp = (ch | ch <<8 | ch <<16 | ch <<24 ); + +while (l >=16 ) { + *(((long *)d)) = tmp; + *(((long *)d)+1 ) = tmp; + *(((long *)d)+2 ) = tmp; + *(((long *)d)+3 ) = tmp; + l -=16 ; + d +=16 ; + } + +while (l >3 ) { + *(((long *)d)) = tmp; + d = d +4 ; + l -=4 ; + } + +while (l) { + *d++ = ch; + l--; + } + } +return dest; +}
arch/csky/abiv1/strksyms.c new file +7 -0
@@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/module.h> + +EXPORT_SYMBOL (memcpy); +EXPORT_SYMBOL (memset);
arch/csky/abiv2/inc/abi/string.h new file +28 -0
@@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_CSKY_STRING_H +#define __ABI_CSKY_STRING_H + +#define __HAVE_ARCH_MEMCMP +extern int memcmp (const void *,const void *,__kernel_size_t ); + +#define __HAVE_ARCH_MEMCPY +extern void *memcpy (void *,const void *,__kernel_size_t ); + +#define __HAVE_ARCH_MEMMOVE +extern void *memmove (void *,const void *,__kernel_size_t ); + +#define __HAVE_ARCH_MEMSET +extern void *memset (void *,int ,__kernel_size_t ); + +#define __HAVE_ARCH_STRCMP +extern int strcmp (const char *,const char *); + +#define __HAVE_ARCH_STRCPY +extern char *strcpy (char *,const char *); + +#define __HAVE_ARCH_STRLEN +extern __kernel_size_t strlen (const char *); + +#endif /* __ABI_CSKY_STRING_H */
arch/csky/abiv2/memcmp.S new file +151 -0
151 lines not on this page · raw message
arch/csky/abiv2/memcpy.S new file +110 -0
110 lines not on this page · raw message
arch/csky/abiv2/memcpy.c new file +40 -0
@@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/types.h> + +/* +* memory copy function. +*/ +void *memcpy (void *to,const void *from,size_t l) +{ +char *d = to; +const char *s = from; + +if (((long )d | (long )s) &0x3 ) { +while (l--) *d++ = *s++; + }else { +while (l >=16 ) { + *(((long *)d)) = *(((long *)s)); + *(((long *)d)+1 ) = *(((long *)s)+1 ); + *(((long *)d)+2 ) = *(((long *)s)+2 ); + *(((long *)d)+3 ) = *(((long *)s)+3 ); + l -=16 ; + d +=16 ; + s +=16 ; + } + +while (l >3 ) { + *(((long *)d)) = *(((long *)s)); + d = d +4 ; + s = s +4 ; + l -=4 ; + } + +while (l) { + *d++ = *s++; + l--; + } + } +return to; +}
arch/csky/abiv2/memmove.S new file +108 -0
108 lines not on this page · raw message
arch/csky/abiv2/memset.S new file +83 -0
83 lines not on this page · raw message
arch/csky/abiv2/strcmp.S new file +168 -0
168 lines not on this page · raw message
arch/csky/abiv2/strcpy.S new file +123 -0
123 lines not on this page · raw message
arch/csky/abiv2/strksyms.c new file +12 -0
@@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/module.h> + +EXPORT_SYMBOL (memcpy); +EXPORT_SYMBOL (memset); +EXPORT_SYMBOL (memcmp); +EXPORT_SYMBOL (memmove); +EXPORT_SYMBOL (strcmp); +EXPORT_SYMBOL (strcpy); +EXPORT_SYMBOL (strlen);
arch/csky/abiv2/strlen.S new file +97 -0
97 lines not on this page · raw message
arch/csky/abiv2/sysdep.h new file +29 -0
@@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __SYSDEP_H +#define __SYSDEP_H + +#ifdef __ASSEMBLER__ + +#if defined (__CK860__) +#define LABLE_ALIGN \ + .balignw 16, 0x6c03 + +#define PRE_BNEZAD (R ) + +#define BNEZAD (R ,L ) \ + bnezad R, L +#else +#define LABLE_ALIGN \ + .balignw 8, 0x6c03 + +#define PRE_BNEZAD (R ) \ + subi R, 1 + +#define BNEZAD (R ,L ) \ + bnez R, L +#endif + +#endif + +#endif
arch/csky/include/asm/string.h new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef _CSKY_STRING_MM_H_ +#define _CSKY_STRING_MM_H_ + +#ifndef __ASSEMBLY__ +#include <linux/types.h> +#include <linux/compiler.h> +#include <abi/string.h> +#endif + +#endif /* _CSKY_STRING_MM_H_ */
arch/csky/kernel/platform.c new file +17 -0
@@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/init.h> +#include <linux/of_platform.h> +#include <linux/of_address.h> +#include <linux/of_fdt.h> +#include <linux/err.h> +#include <linux/slab.h> +#include <linux/sys_soc.h> +#include <linux/io.h> + +static int __init csky_platform_init (void ) +{ +return of_platform_default_populate (NULL ,NULL ,NULL ); +} +device_initcall (csky_platform_init);
arch/csky/kernel/power.c new file +30 -0
@@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/reboot.h> + +void (*pm_power_off)(void ); +EXPORT_SYMBOL (pm_power_off); + +void machine_power_off (void ) +{ +local_irq_disable (); +if (pm_power_off) +pm_power_off (); + asmvolatile ("bkpt" ); +} + +void machine_halt (void ) +{ +local_irq_disable (); +if (pm_power_off) +pm_power_off (); + asmvolatile ("bkpt" ); +} + +void machine_restart (char *cmd) +{ +local_irq_disable (); +do_kernel_restart (cmd); + asmvolatile ("bkpt" ); +}
arch/csky/lib/delay.c new file +40 -0
@@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/init.h> + +void __delay (unsigned long loops) +{ + asmvolatile ( +"mov r0, r0\n" +"1:declt %0\n" +"bf 1b" + :"=r" (loops) + :"0" (loops)); +} +EXPORT_SYMBOL (__delay); + +extern unsigned long loops_per_jiffy; + +void __const_udelay (unsigned long xloops) +{ +unsigned long long loops; + + loops = (unsigned long long )xloops * loops_per_jiffy *HZ ; + +__delay (loops >>32 ); +} +EXPORT_SYMBOL (__const_udelay); + +void __udelay (unsigned long usecs) +{ +__const_udelay (usecs *0x10C7UL );/* 2**32 / 1000000 (rounded up) */ +} +EXPORT_SYMBOL (__udelay); + +void __ndelay (unsigned long nsecs) +{ +__const_udelay (nsecs *0x5UL );/* 2**32 / 1000000000 (rounded up) */ +} +EXPORT_SYMBOL (__ndelay);
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 13/26] csky: Library functions
Quoted 31 lines · Guo Ren
arch/csky/abiv1/memset.c new file +28
-0@@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/types.h> + +void *memset (void *dest,int c,size_t l) +{ +char *d = dest; +int ch = c; +int tmp; + +if ((long )d &0x3 ) +while (l--) *d++ = ch; +else { + ch &=0xff ; + tmp = (ch | ch <<8 | ch <<16 | ch <<24 ); + +while (l >=16 ) { + *(((long *)d)) = tmp; + *(((long *)d)+1 ) = tmp; + *(((long *)d)+2 ) = tmp; + *(((long *)d)+3 ) = tmp; + l -=16 ; + d +=16 ; + } + +while (l >3 ) { + *(((long *)d)) = tmp; + d = d +4 ;
arch/csky/abiv1/memset.c line 38
Quoted 10 lines
arch/csky/abiv1/memset.c new file +10
-0+ l -=4 ; + } + +while (l) { + *d++ = ch; + l--; + } + } +return dest; +}
I see that we have a trivial memset() implementation in lib/string.c, but yours seems to be better optimized. Where did you get it from? Is this a version that works particularly well on C-Sky, or is this a generic optimized memset that others could use as well? In the latter case, we could add it to lib/string.c and let architectures select it in place of the triivial version.
Arnd
Re: [PATCH V3 13/26] csky: Library functions
Quoted 16 lines · Arnd Bergmann
Quoted 5 lines · Guo Ren
arch/csky/abiv1/memset.c new file +2
-0@@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. arch/csky/abiv1/memset.c line 12
Quoted 10 lines
arch/csky/abiv1/memset.c new file +10
-0+#include <linux/types.h> + +void *memset (void *dest,int c,size_t l) +{ +char *d = dest; +int ch = c; +int tmp; + +if ((long )d &0x3 ) +while (l--) *d++ = ch;
while ((uintptr_t)d & 0x3) && l--)
*d++ =ch;
and remove the else below?
Quoted 9 lines
arch/csky/abiv1/memset.c line 21
Quoted 9 lines
arch/csky/abiv1/memset.c new file +9
-0+else { + ch &=0xff ; + tmp = (ch | ch <<8 | ch <<16 | ch <<24 ); + +while (l >=16 ) { + *(((long *)d)) = tmp; + *(((long *)d)+1 ) = tmp; + *(((long *)d)+2 ) = tmp; + *(((long *)d)+3 ) = tmp;
s/long/u32/
Quoted 15 lines
Quoted 15 lines
arch/csky/abiv1/memset.c new file +15
-0+ l -=16 ; + d +=16 ; + } + +while (l >3 ) { + *(((long *)d)) = tmp; + d = d +4 ; + l -=4 ; + } + +while (l) { + *d++ = ch; + l--; + } + }
Quoted 8 lines
arch/csky/abiv1/memset.c line 38
Quoted 2 lines
arch/csky/abiv1/memset.c new file +2
-0+return dest; +}I see that we have a trivial
memset()implementation inlib/string.c, but yours seems to be better optimized. Where did you get it from? Is this a version that works particularly well on C-Sky, or is this a generic optimized memset that others could use as well? In the latter case, we could add it tolib/string.cand let architectures select it in place of the triivial version.
Sounds good to me, after removing the 32-bit-isms.
Gr{oetje,eeting}s,
Geert
Signature · 5 lines
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected] In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Re: [PATCH V3 13/26] csky: Library functions
Quoted 6 lines · Geert Uytterhoeven
Quoted 4 lines · Arnd Bergmann
Quoted 3 lines · Guo Ren
arch/csky/abiv1/memset.c new file +0
-0@@ -0,0 +1,38 @@
Quoted 7 lines
Quoted 2 lines
arch/csky/abiv1/memset.c line 12
Quoted 2 lines
arch/csky/abiv1/memset.c new file +2
-0+if ((long )d &0x3 ) +while (l--) *d++ = ch;while ((uintptr_t)d &
0x3) && l--)*d++ =ch;and remove the else below?
Ok
Quoted 3 lines
Quoted 1 line
arch/csky/abiv1/memset.c line 21
Quoted 1 line
arch/csky/abiv1/memset.c new file +1
-0+ *(((long *)d)+3 ) = tmp;s/long/u32/
Ok
Thx
Guo Ren
Re: [PATCH V3 13/26] csky: Library functions
In reply to Arnd BergmannQuoted 38 lines · Arnd Bergmann
Quoted 36 lines · Guo Ren
arch/csky/abiv1/memset.c new file +33
-0@@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#include <linux/types.h> + +void *memset (void *dest,int c,size_t l) +{ +char *d = dest; +int ch = c; +int tmp; + +if ((long )d &0x3 ) +while (l--) *d++ = ch; +else { + ch &=0xff ; + tmp = (ch | ch <<8 | ch <<16 | ch <<24 ); + +while (l >=16 ) { + *(((long *)d)) = tmp; + *(((long *)d)+1 ) = tmp; + *(((long *)d)+2 ) = tmp; + *(((long *)d)+3 ) = tmp; + l -=16 ; + d +=16 ; + } + +while (l >3 ) { + *(((long *)d)) = tmp; + d = d +4 ; + l -=4 ; + } + +while (l) { + *d++ = ch;
Quoted 8 lines
arch/csky/abiv1/memset.c line 38
Quoted 5 lines
arch/csky/abiv1/memset.c new file +5
-0+ l--; + } + } +return dest; +}I see that we have a trivial
memset()implementation inlib/string.c, but yours seems to be better optimized. Where did you get it from?
We write it for our ck610 to improve the performance, but I think a lot of other arch done it in asm style.
Quoted 3 lines
Is this a version
that works particularly well on C-Sky, or is this a generic optimized memset that others could use as well?
We only test it on C-SKY, but I think it will also work better on other arch CPU than current lib/string.c memset implement.
I see that in lib/string.c:
void *memset(void *s, int c, size_t count)
{
char *xs = s;
while (count--)
*xs++ = c;
return s;
}The most problem is "char *xs;" and it will cause "st.b" in asm. "st.b" is very slow.
Our key improvement is:
Quoted 4 lines
arch/csky/abiv1/memset.c line 21
Quoted 4 lines
arch/csky/abiv1/memset.c new file +4
-0+ *(((long *)d)) = tmp; + *(((long *)d)+1 ) = tmp; + *(((long *)d)+2 ) = tmp; + *(((long *)d)+3 ) = tmp;
It will cause SOC AXI burst transfer.
Quoted 2 lines
In the latter case, we could add it to
lib/string.cand let architectures select it in place of the triivial version.
Good idea.
Guo Ren
PATCH v3 14/26 csky: User access
In reply to Guo Ren--- arch/csky/include/asm/uaccess.h | 396 ++++++++++++++++++++++++++++++++++++++++ arch/csky/lib/usercopy.c | 271 +++++++++++++++++++++++++++ 2 files changed, 667 insertions(+) create mode 100644 arch/csky/include/asm/uaccess.h create mode 100644 arch/csky/lib/usercopy.c
arch/csky/include/asm/uaccess.h new file +396 -0
@@ -0,0 +1,396 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_UACCESS_H +#define __ASM_CSKY_UACCESS_H + +/* +* User space memory access functions +*/ +#include <linux/compiler.h> +#include <linux/errno.h> +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/mm.h> +#include <linux/string.h> +#include <linux/version.h> +#include <asm/segment.h> + +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 + +static inline int access_ok (int type,const void * addr,unsigned long size) +{ +return (((unsigned long )addr <current_thread_info ()->addr_limit.seg) && + ((unsigned long )(addr + size) <current_thread_info ()->addr_limit.seg)); +} + +static inline int verify_area (int type,const void * addr,unsigned long size) +{ +return access_ok (type, addr, size) ?0 : -EFAULT ; +} + +#define __addr_ok (addr) (access_ok(VERIFY_READ, addr,0)) + +extern int __put_user_bad (void ); + +/* +* Tell gcc we read from memory instead of writing: this is because +* we do not write to any memory gcc knows about, so there are no +* aliasing issues. +*/ + +/* +* These are the main single-value transfer routines. They automatically +* use the right size if we just have the right pointer type. +* +* This gets kind of ugly. We want to return _two_ values in "get_user()" +* and yet we don't want to do any pointers, because that is too much +* of a performance impact. Thus we have a few rather ugly macros here, +* and hide all the ugliness from the user. +* +* The "__xxx" versions of the user access functions are versions that +* do not verify the address space, that must have been done previously +* with a separate "access_ok()" call (this is used when we do multiple +* accesses to the same area of user memory). +* +* As we use the same address space for kernel and user data on +* Ckcore, we can just do these as direct assignments. (Of course, the +* exception handling means that it's no longer "just"...) +*/ + +#define put_user (x,ptr) \ + __put_user_check((x), (ptr), sizeof(*(ptr))) + +#define __put_user (x,ptr) \ + __put_user_nocheck((x), (ptr), sizeof(*(ptr))) + +#define __ptr (x) ((unsigned long *)(x)) + +#define get_user (x,ptr) \ + __get_user_check((x), (ptr), sizeof(*(ptr))) + +#define __get_user (x,ptr) \ + __get_user_nocheck((x), (ptr), sizeof(*(ptr))) + +#define __put_user_nocheck (x, ptr, size) \ +({ \ + long __pu_err=0; \ + typeof(*(ptr)) *__pu_addr = (ptr); \ + typeof(*(ptr)) __pu_val = (typeof(*(ptr)))(x); \ + if(__pu_addr){ \ + __put_user_size(__pu_val, (__pu_addr), (size), __pu_err); \ + } \ + __pu_err; \ +}) + +#define __put_user_check (x,ptr,size) \ +({ \ + long __pu_err = -EFAULT; \ + typeof(*(ptr)) *__pu_addr = (ptr); \ + typeof(*(ptr)) __pu_val = (typeof(*(ptr)))(x); \ + if (access_ok(VERIFY_WRITE, __pu_addr, size) && __pu_addr) \ + __put_user_size(__pu_val, __pu_addr, (size), __pu_err); \ + __pu_err; \ +}) + +#define __put_user_size (x,ptr,size,retval) \ +do { \ + retval = 0; \ + switch (size) { \ + case 1: __put_user_asm_b(x, ptr, retval); break; \ + case 2: __put_user_asm_h(x, ptr, retval); break; \ + case 4: __put_user_asm_w(x, ptr, retval); break; \ + case 8: __put_user_asm_64(x, ptr, retval); break; \ + default: __put_user_bad(); \ + } \ +} while (0) + +/* +* We don't tell gcc that we are accessing memory, but this is OK +* because we do not write to any memory gcc knows about, so there +* are no aliasing issues. +* +* Note that PC at a fault is the address *after* the faulting +* instruction. +*/ +#define __put_user_asm_b (x, ptr, err) \ +do{ \ + int errcode; \ + asm volatile( \ + "1: stb %1, (%2,0) \n" \ + " br 3f \n" \ + "2: mov %0, %3 \n" \ + " br 3f \n" \ + ".section __ex_table,\"a\" \n" \ + ".align 2 \n" \ + ".long 1b,2b \n" \ + ".previous \n" \ + "3: \n" \ + : "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \ + : "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \ + : "memory"); \ +}while(0) + +#define __put_user_asm_h (x, ptr, err) \ +do{ \ + int errcode; \ + asm volatile( \ + "1: sth %1, (%2,0) \n" \ + " br 3f \n" \ + "2: mov %0, %3 \n" \ + " br 3f \n" \ + ".section __ex_table,\"a\" \n" \ + ".align 2 \n" \ + ".long 1b,2b \n" \ + ".previous \n" \ + "3: \n" \ + :"=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \ + :"0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \ + : "memory"); \ +}while(0) + +#define __put_user_asm_w (x, ptr, err) \ +do{ \ + int errcode; \ + asm volatile( \ + "1: stw %1, (%2,0) \n" \ + " br 3f \n" \ + "2: mov %0, %3 \n" \ + " br 3f \n" \ + ".section __ex_table,\"a\" \n" \ + ".align 2 \n" \ + ".long 1b,2b \n" \ + ".previous \n" \ + "3: \n" \ + :"=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \ + :"0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \ + : "memory"); \ +}while(0) + +#define __put_user_asm_64 (x, ptr, err) \ +do{ \ + int tmp; \ + int errcode; \ + typeof(*(ptr)) src = ( typeof(*(ptr)))x; \ + typeof(*(ptr)) *psrc = &src; \ + \ + asm volatile( \ + " ldw %3, (%1, 0) \n" \ + "1: stw %3, (%2, 0) \n" \ + " ldw %3, (%1, 4) \n" \ + "2: stw %3, (%2, 4) \n" \ + " br 4f \n" \ + "3: mov %0, %4 \n" \ + " br 4f \n" \ + ".section __ex_table, \"a\" \n" \ + ".align 2 \n" \ + ".long 1b, 3b \n" \ + ".long 2b, 3b \n" \ + ".previous \n" \ + "4: \n" \ + :"=r"(err),"=r"(psrc),"=r"(ptr),"=r"(tmp),"=r"(errcode) \ + : "0"(err), "1"(psrc), "2"(ptr), "3"(0), "4"(-EFAULT) \ + : "memory" ); \ +}while (0) + +#define __get_user_nocheck (x, ptr, size) \ +({ \ + long __gu_err; \ + __get_user_size(x, (ptr), (size), __gu_err); \ + __gu_err; \ +}) + +#define __get_user_check (x, ptr, size) \ +({ \ + int __gu_err = -EFAULT; \ + const __typeof__(*(ptr)) __user * __gu_ptr = (ptr); \ + if (access_ok(VERIFY_READ, __gu_ptr, size) && __gu_ptr) \ + __get_user_size(x, __gu_ptr, (size), __gu_err); \ + __gu_err; \ +}) + +#define __get_user_size (x, ptr, size, retval) \ +do { \ + switch (size) { \ + case 1: __get_user_asm_common((x),ptr,"ldb",retval); break; \ + case 2: __get_user_asm_common((x),ptr,"ldh",retval); break; \ + case 4: __get_user_asm_common((x),ptr,"ldw",retval); break; \ + default: \ + x=0; \ + (retval) = __get_user_bad(); \ + } \ +} while (0) + +#define __get_user_asm_common (x, ptr, ins, err) \ +do{ \ + int errcode; \ + asm volatile( \ + "1: " ins " %1, (%4,0) \n" \ + " br 3f \n" \ +/* Fix up codes */ \ + "2: mov %0, %2 \n" \ + " movi %1, 0 \n" \ + " br 3f \n" \ + ".section __ex_table,\"a\" \n" \ + ".align 2 \n" \ + ".long 1b,2b \n" \ + ".previous \n" \ + "3: \n" \ + :"=r"(err), "=r"(x), "=r"(errcode) \ + :"0"(0), "r"(ptr), "2"(-EFAULT) \ + : "memory"); \ +}while(0) + +extern int __get_user_bad(void); + +#define __copy_user (to, from, n) \ +do{ \ + int w0, w1, w2, w3; \ + asm volatile( \ + "0: cmpnei %1, 0 \n" \ + " bf 8f \n" \ + " mov %3, %1 \n" \ + " or %3, %2 \n" \ + " andi %3, 3 \n" \ + " cmpnei %3, 0 \n" \ + " bf 1f \n" \ + " br 5f \n" \ + "1: cmplti %0, 16 \n"/* 4W */ \ +" bt 3f \n" \ +" ldw %3, (%2, 0) \n" \ +" ldw %4, (%2, 4) \n" \ +" ldw %5, (%2, 8) \n" \ +" ldw %6, (%2, 12) \n" \ +"2: stw %3, (%1, 0) \n" \ +"9: stw %4, (%1, 4) \n" \ +"10: stw %5, (%1, 8) \n" \ +"11: stw %6, (%1, 12) \n" \ +" addi %2, 16 \n" \ +" addi %1, 16 \n" \ +" subi %0, 16 \n" \ +" br 1b \n" \ +"3: cmplti %0, 4 \n" /* 1W */ \ +" bt 5f \n" \ +" ldw %3, (%2, 0) \n" \ +"4: stw %3, (%1, 0) \n" \ +" addi %2, 4 \n" \ +" addi %1, 4 \n" \ +" subi %0, 4 \n" \ +" br 3b \n" \ +"5: cmpnei %0, 0 \n" /* 1B */ \ +" bf 8f \n" \ +" ldb %3, (%2, 0) \n" \ +"6: stb %3, (%1, 0) \n" \ +" addi %2, 1 \n" \ +" addi %1, 1 \n" \ +" subi %0, 1 \n" \ +" br 5b \n" \ +"7: br 8f \n" \ +".section __ex_table, \"a\" \n" \ +".align 2 \n" \ +".long 2b, 7b \n" \ +".long 9b, 7b \n" \ +".long 10b, 7b \n" \ +".long 11b, 7b \n" \ +".long 4b, 7b \n" \ +".long 6b, 7b \n" \ +".previous \n" \ +"8: \n" \ + : "=r"(n), "=r"(to), "=r"(from), "=r"(w0), "=r"(w1), "=r"(w2), "=r"(w3) \ + : "0"(n), "1"(to), "2"(from) \ + : "memory" ); \ +} while (0) + +#define __copy_user_zeroing (to, from, n) \ +do{ \ + int tmp; \ + int nsave; \ + asm volatile( \ + "0: cmpnei %1, 0 \n" \ + " bf 7f \n" \ + " mov %3, %1 \n" \ + " or %3, %2 \n" \ + " andi %3, 3 \n" \ + " cmpnei %3, 0 \n" \ + " bf 1f \n" \ + " br 5f \n" \ + "1: cmplti %0, 16 \n"/* 4W */ \ +" bt 3f \n" \ +"2: ldw %3, (%2, 0) \n" \ +"10: ldw %4, (%2, 4) \n" \ +" stw %3, (%1, 0) \n" \ +" stw %4, (%1, 4) \n" \ +"11: ldw %3, (%2, 8) \n" \ +"12: ldw %4, (%2, 12) \n" \ +" stw %3, (%1, 8) \n" \ +" stw %4, (%1, 12) \n" \ +" addi %2, 16 \n" \ +" addi %1, 16 \n" \ +" subi %0, 16 \n" \ +" br 1b \n" \ +"3: cmplti %0, 4 \n" /* 1W */ \ +" bt 5f \n" \ +"4: ldw %3, (%2, 0) \n" \ +" stw %3, (%1, 0) \n" \ +" addi %2, 4 \n" \ +" addi %1, 4 \n" \ +" subi %0, 4 \n" \ +" br 3b \n" \ +"5: cmpnei %0, 0 \n" /* 1B */ \ +" bf 7f \n" \ +"6: ldb %3, (%2, 0) \n" \ +" stb %3, (%1, 0) \n" \ +" addi %2, 1 \n" \ +" addi %1, 1 \n" \ +" subi %0, 1 \n" \ +" br 5b \n" \ +"8: mov %3, %0 \n" /* zero */ \ +" movi %4, 0 \n" \ +"9: stb %4, (%1, 0) \n" \ +" addi %1, 1 \n" \ +" subi %3, 1 \n" \ +" cmpnei %3, 0 \n" \ +" bt 9b \n" \ +" br 7f \n" \ +".section __ex_table, \"a\" \n" \ +".align 2 \n" \ +".long 2b, 8b \n" \ +".long 10b, 8b \n" \ +".long 11b, 8b \n" \ +".long 12b, 8b \n" \ +".long 4b, 8b \n" \ +".long 6b, 8b \n" \ +".previous \n" \ +"7: \n" \ + : "=r"(n), "=r"(to), "=r"(from), "=r"(nsave), "=r"(tmp) \ + : "0"(n), "1"(to), "2"(from) \ + : "memory" ); \ +} while (0) + +unsigned long raw_copy_from_user(void *to, const void *from, unsigned long n); +unsigned long raw_copy_to_user (void *to,const void *from,unsigned long n); + +unsigned long clear_user (void *to,unsigned long n); +unsigned long __clear_user (void __user *to,unsigned long n); + +long strncpy_from_user (char *dst,const char *src,long count); +long __strncpy_from_user (char *dst,const char *src,long count); + +/* +* Return the size of a string (including the ending 0) +* +* Return 0 on exception, a value greater than N if too long +*/ +long strnlen_user (const char *src,long n); + +#define strlen_user (str) strnlen_user(str, 32767) + +struct exception_table_entry +{ +unsigned long insn; +unsigned long nextinsn; +}; + +extern int fixup_exception (struct pt_regs *regs); + +#endif /* __ASM_CSKY_UACCESS_H */
arch/csky/lib/usercopy.c new file +271 -0
271 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 15/26 csky: Debug and Ptrace GDB
In reply to Guo Ren--- arch/csky/include/asm/bug.h | 26 +++ arch/csky/include/uapi/asm/ptrace.h | 103 ++++++++++++ arch/csky/kernel/dumpstack.c | 64 ++++++++ arch/csky/kernel/ptrace.c | 317 ++++++++++++++++++++++++++++++++++++ 4 files changed, 510 insertions(+) create mode 100644 arch/csky/include/asm/bug.h create mode 100644 arch/csky/include/uapi/asm/ptrace.h create mode 100644 arch/csky/kernel/dumpstack.c create mode 100644 arch/csky/kernel/ptrace.c
arch/csky/include/asm/bug.h new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_BUG_H +#define __ASM_CSKY_BUG_H + +#include <linux/compiler.h> +#include <linux/const.h> +#include <linux/types.h> + +#define BUG () \ +do { \ + asm volatile ("bkpt\n"); \ + unreachable(); \ +} while (0) + +#define HAVE_ARCH_BUG + +#include <asm-generic/bug.h> + +struct pt_regs ; + +void die_if_kernel (char *str,struct pt_regs *regs,int nr); +void show_regs (struct pt_regs *); + +#endif /* __ASM_CSKY_BUG_H */
arch/csky/include/uapi/asm/ptrace.h new file +103 -0
103 lines not on this page · raw message
arch/csky/kernel/dumpstack.c new file +64 -0
64 lines not on this page · raw message
arch/csky/kernel/ptrace.c new file +317 -0
317 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 16/26 csky: SMP support
In reply to Guo Ren--- arch/csky/include/asm/smp.h | 26 +++++ arch/csky/kernel/smp.c | 234 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 arch/csky/include/asm/smp.h create mode 100644 arch/csky/kernel/smp.c
arch/csky/include/asm/smp.h new file +26 -0
@@ -0,0 +1,26 @@ +#ifndef __ASM_CSKY_SMP_H +#define __ASM_CSKY_SMP_H + +#include <linux/cpumask.h> +#include <linux/irqreturn.h> +#include <linux/threads.h> + +#ifdef CONFIG_SMP + +void __init setup_smp (void ); + +void __init setup_smp_ipi (void ); + +void __init enable_smp_ipi (void ); + +void arch_send_call_function_ipi_mask (struct cpumask *mask); + +void arch_send_call_function_single_ipi (int cpu); + +void __init set_send_ipi (void (*func)(const unsigned long *,unsigned long )); + +#define raw_smp_processor_id () (current_thread_info()->cpu) + +#endif /* CONFIG_SMP */ + +#endif /* __ASM_CSKY_SMP_H */
arch/csky/kernel/smp.c new file +234 -0
234 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 17/26 csky: Misc headers
In reply to Guo Ren--- arch/csky/abiv1/inc/abi/reg_ops.h | 26 +++ arch/csky/abiv1/inc/abi/regdef.h | 25 +++ arch/csky/abiv2/inc/abi/reg_ops.h | 17 ++ arch/csky/abiv2/inc/abi/regdef.h | 26 +++ arch/csky/boot/dts/qemu.dts | 77 +++++++++ arch/csky/include/asm/bitops.h | 281 +++++++++++++++++++++++++++++++++ arch/csky/include/asm/checksum.h | 54 +++++++ arch/csky/include/asm/compat.h | 11 ++ arch/csky/include/asm/reg_ops.h | 22 +++ arch/csky/include/uapi/asm/byteorder.h | 14 ++ arch/csky/kernel/asm-offsets.c | 85 ++++++++++ 11 files changed, 638 insertions(+) create mode 100644 arch/csky/abiv1/inc/abi/reg_ops.h create mode 100644 arch/csky/abiv1/inc/abi/regdef.h create mode 100644 arch/csky/abiv2/inc/abi/reg_ops.h create mode 100644 arch/csky/abiv2/inc/abi/regdef.h create mode 100644 arch/csky/boot/dts/qemu.dts create mode 100644 arch/csky/include/asm/bitops.h create mode 100644 arch/csky/include/asm/checksum.h create mode 100644 arch/csky/include/asm/compat.h create mode 100644 arch/csky/include/asm/reg_ops.h create mode 100644 arch/csky/include/uapi/asm/byteorder.h create mode 100644 arch/csky/kernel/asm-offsets.c
arch/csky/abiv1/inc/abi/reg_ops.h new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ABI_REG_OPS_H +#define __ABI_REG_OPS_H +#include <asm/reg_ops.h> + +#define cprcr (reg) \ +({ \ + unsigned int tmp; \ + asm volatile("cprcr %0, "reg"\n":"=b"(tmp)); \ + tmp; \ +}) + +#define cpwcr (reg, val) \ +({ \ + asm volatile("cpwcr %0, "reg"\n"::"b"(val)); \ +}) + +static inline unsigned int mfcr_hint (void ) +{ +return mfcr ("cr30" ); +} + +static inline unsigned int mfcr_ccr2 (void ){return 0 ;} + +#endif /* __ABI_REG_OPS_H */
arch/csky/abiv1/inc/abi/regdef.h new file +25 -0
@@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_REGDEF_H +#define __ASM_CSKY_REGDEF_H + +#define syscallid r1 +#define r11_sig r11 + +#define regs_syscallid (regs) regs->regs[9] + +/* +* PSR format: +* | 31 | 30-24 | 23-16 | 15 14 | 13-0 | +* S CPID VEC TM +* +* S: Super Mode +* CPID: Coprocessor id, only 15 for MMU +* VEC: Exception Number +* TM: Trace Mode +*/ +#define DEFAULT_PSR_VALUE 0x8f000000 + +#define SYSTRACE_SAVENUM 2 + +#endif /* __ASM_CSKY_REGDEF_H */
arch/csky/abiv2/inc/abi/reg_ops.h new file +17 -0
@@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ABI_REG_OPS_H +#define __ABI_REG_OPS_H +#include <asm/reg_ops.h> + +static inline unsigned int mfcr_hint (void ) +{ +return mfcr ("cr31" ); +} + +static inline unsigned int mfcr_ccr2 (void ) +{ +return mfcr ("cr23" ); +} +#endif /* __ABI_REG_OPS_H */
arch/csky/abiv2/inc/abi/regdef.h new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_REGDEF_H +#define __ASM_CSKY_REGDEF_H + +#define syscallid r7 +#define r11_sig r11 + +#define regs_syscallid (regs) regs->regs[3] + +/* +* PSR format: +* | 31 | 30-24 | 23-16 | 15 14 | 13-10 | 9 | 8-0 | +* S VEC TM MM +* +* S: Super Mode +* VEC: Exception Number +* TM: Trace Mode +* MM: Memory unaligned addr access +*/ +#define DEFAULT_PSR_VALUE 0x80000200 + +#define SYSTRACE_SAVENUM 5 + +#endif /* __ASM_CSKY_REGDEF_H */
arch/csky/boot/dts/qemu.dts new file +77 -0
77 lines not on this page · raw message
arch/csky/include/asm/bitops.h new file +281 -0
281 lines not on this page · raw message
arch/csky/include/asm/checksum.h new file +54 -0
54 lines not on this page · raw message
arch/csky/include/asm/compat.h new file +11 -0
@@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_COMPAT_H +#define __ASM_CSKY_COMPAT_H + +#ifdef CONFIG_COMPAT +#define COMPAT_UTS_MACHINE "csky\0\0" +#endif + +#endif /* __ASM_CSKY_COMPAT_H */
arch/csky/include/asm/reg_ops.h new file +22 -0
@@ -0,0 +1,22 @@ +#ifndef __ASM_REGS_OPS_H +#define __ASM_REGS_OPS_H + +#define mfcr (reg) \ +({ \ + unsigned int tmp; \ + asm volatile("mfcr %0, "reg"\n" \ + :"=r"(tmp) \ + : \ + :"memory"); \ + tmp; \ +}) + +#define mtcr (reg, val) \ +({ \ + asm volatile("mtcr %0, "reg"\n" \ + : \ + :"r"(val) \ + :"memory"); \ +}) + +#endif /* __ASM_REGS_OPS_H */
arch/csky/include/uapi/asm/byteorder.h new file +14 -0
@@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASM_CSKY_BYTEORDER_H +#define __ASM_CSKY_BYTEORDER_H + +#if defined(__cskyBE__) +#include <linux/byteorder/big_endian.h> +#elif defined(__cskyLE__) +#include <linux/byteorder/little_endian.h> +#else +# error "There is no __cskyBE__, __cskyLE__" +#endif + +#endif /* __ASM_CSKY_BYTEORDER_H */
arch/csky/kernel/asm-offsets.c new file +85 -0
85 lines not on this page · raw message
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerRe: [PATCH V3 17/26] csky: Misc headers
arch/csky/boot/dts/qemu.dts line 6
Quoted 12 lines · Guo Ren
arch/csky/boot/dts/qemu.dts new file +6
-0@@ -0,0 +1,77 @@ +/dts-v1/; +/ { + compatible = "csky,qemu"; + #address-cells = <1>; + #size-cells = <1>; + interrupt-parent = <&intc>;
Ideally, qemu would supply a dtb file that matches the current configuration, as we do for instance on the ARM 'virt' machine. This allows you much more flexibility in running all kinds of options, as well as extending qemu later with new features.
arch/csky/boot/dts/qemu.dts line 39
Quoted 10 lines
arch/csky/boot/dts/qemu.dts new file +10
-0+ + timer0: timer@0xffffd000 { + compatible = "snps,dw-apb-timer"; + reg = <0xffffd000 0x1000>; + clocks = <&dummy_apb>; + clock-names = "timer"; + interrupts = <1>; + }; + + timer1: timer@0xffffd014 {
Drop the leading '0x' in the unit-address here (in all devices)
Arnd
Re: [PATCH V3 17/26] csky: Misc headers
Quoted 11 lines · Arnd Bergmann
Quoted 9 lines · Guo Ren
arch/csky/boot/dts/qemu.dts new file +3
-0@@ -0,0 +1,77 @@ +/dts-v1/; +/ { + compatible = "csky,qemu";
Quoted 8 lines
arch/csky/boot/dts/qemu.dts line 6
Quoted 3 lines
arch/csky/boot/dts/qemu.dts new file +3
-0+ #address-cells = <1>; + #size-cells = <1>; + interrupt-parent = <&intc>;Ideally, qemu would supply a dtb file that matches the current configuration, as we do for instance on the ARM 'virt' machine. This allows you much more flexibility in running all kinds of options, as well as extending qemu later with new features.
So, I should remove qemu.dts in next version patch?
Quoted 4 lines
Quoted 4 lines
arch/csky/boot/dts/qemu.dts new file +4
-0+ + timer0: timer@0xffffd000 { + compatible = "snps,dw-apb-timer"; + reg = <0xffffd000 0x1000>;
Quoted 8 lines
arch/csky/boot/dts/qemu.dts line 39
Quoted 6 lines
arch/csky/boot/dts/qemu.dts new file +6
-0+ clocks = <&dummy_apb>; + clock-names = "timer"; + interrupts = <1>; + }; + + timer1: timer@0xffffd014 {Drop the leading '0x' in the unit-address here (in all devices)
Ok
Arnd Bergmann
maintainerRe: [PATCH V3 17/26] csky: Misc headers
Quoted 21 lines · Guo Ren
Quoted 11 lines · Arnd Bergmann
Quoted 9 lines · Guo Ren
arch/csky/boot/dts/qemu.dts new file +3
-0@@ -0,0 +1,77 @@ +/dts-v1/; +/ { + compatible = "csky,qemu";Quoted 8 lines
arch/csky/boot/dts/qemu.dts line 6
Quoted 3 lines
arch/csky/boot/dts/qemu.dts new file +3
-0+ #address-cells = <1>; + #size-cells = <1>; + interrupt-parent = <&intc>;Ideally, qemu would supply a dtb file that matches the current configuration, as we do for instance on the ARM 'virt' machine. This allows you much more flexibility in running all kinds of options, as well as extending qemu later with new features.
Quoted 1 line
So, I should remove
qemu.dtsin next version patch?
It's up to you really. If you won't have a version of qemu that can do this by itself, it may make sense to keep it around for a while. You might want to include the version of your current qemu port is based on qemu-2.x but not upstream, you could include a qemu-2.x.dts file here, and have the future 3.x port provide its own.
Arnd
Re: [PATCH V3 17/26] csky: Misc headers
Quoted 22 lines · Arnd Bergmann
Quoted 21 lines · Guo Ren
Quoted 19 lines · Arnd Bergmann
arch/csky/boot/dts/qemu.dts line 6
Quoted 12 lines · Guo Ren
arch/csky/boot/dts/qemu.dts new file +6
-0@@ -0,0 +1,77 @@ +/dts-v1/; +/ { + compatible = "csky,qemu"; + #address-cells = <1>; + #size-cells = <1>; + interrupt-parent = <&intc>;Ideally, qemu would supply a dtb file that matches the current configuration, as we do for instance on the ARM 'virt' machine. This allows you much more flexibility in running all kinds of options, as well as extending qemu later with new features.
Quoted 7 lines
Quoted 1 line
So, I should remove
qemu.dtsin next version patch?It's up to you really. If you won't have a version of qemu that can do this by itself, it may make sense to keep it around for a while. You might want to include the version of your current qemu port is based on qemu-2.x but not upstream, you could include a
qemu-2.x.dtsfile here, and have the future 3.x port provide its own.
Ok, thx for the tips.
Guo Ren
PATCH v3 18/26 dt-bindings: csky CPU Bindings
In reply to Guo Ren--- Documentation/devicetree/bindings/csky/cpus.txt | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/csky/cpus.txt
Documentation/devicetree/bindings/csky/cpus.txt new file +70 -0
@@ -0,0 +1,70 @@ +================== +C-SKY CPU Bindings +================== + +The device tree allows to describe the layout of CPUs in a system through +the "cpus" node, which in turn contains a number of subnodes (ie "cpu") +defining properties for every cpu. + +Only SMP system need to care about the cpus node and single processor +needn't define cpus node at all. + +===================================== +cpus and cpu node bindings definition +===================================== + +- cpus node + + Description: Container of cpu nodes + + The node name must be "cpus". + + A cpus node must define the following properties: + + - #address-cells + Usage: required + Value type: <u32> + Definition: must be set to 1 + - #size-cells + Usage: required + Value type: <u32> + Definition: must be set to 0 + +- cpu node + + Description: Describes one of SMP cores + + PROPERTIES + + - device_type + Usage: required + Value type: <string> + Definition: must be "cpu" + - reg + Usage: required + Value type: <u32> + Definition: CPU index + - status: + Usage: required + Value type: <string> + Definition: "ok" means enable the cpu-core + "disabled" means disable the cpu-core + +Example: +-------- + + cpus { + #address-cells = <1>; + #size-cells = <0>; + cpu@0 { + device_type = "cpu"; + reg = <0>; + status = "ok"; + }; + + cpu@1 { + device_type = "cpu"; + reg = <1>; + status = "ok"; + }; + };
Signature · 1 line
2.7.4
Re: [PATCH V3 18/26] dt-bindings: csky CPU Bindings
Quoted 6 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- Documentation/devicetree/bindings/csky/cpus.txt | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/csky/cpus.txt
Please make sure DT bindings are sent to DT list.
Thanks,
Rob
Re: [PATCH V3 18/26] dt-bindings: csky CPU Bindings
Quoted 9 lines · Rob Herring
Quoted 6 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- Documentation/devicetree/bindings/csky/cpus.txt | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/csky/cpus.txtPlease make sure DT bindings are sent to DT list.
Oh, I forgot add [email protected]. Thx for mentioned.
Guo Ren
PATCH v3 19/26 dt-bindings: timer: gx6605s SOC timer
In reply to Guo Ren--- .../bindings/timer/csky,gx6605s-timer.txt | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +46 -0
@@ -0,0 +1,46 @@ +================= +gx6605s SOC Timer +================= + +The timer is used in gx6605s soc as system timer and the driver +contain clk event and clk source. + +============================== +timer node bindings definition +============================== + + Description: Describes gx6605s SOC timer + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,gx6605s" + - reg + Usage: required + Value type: <u32 u32> + Definition: <phyaddr size> in soc from cpu view + - clocks + Usage: required + Value type: <node> + Definition: must be input clk node + - interrupt + Usage: required + Value type: <u32> + Definition: must be timer irq num defined by soc + - interrupt-parent: + Usage: required + Value type: <node> + Definition: must be interrupt controller node + +Examples: +--------- + + timer:timer { + compatible = "csky,gx6605s-timer"; + reg = <0x0020a000 0x400>; + clocks = <&dummy_apb_clk>; + interrupts = <10>; + interrupt-parent = <&intc>; + };
Signature · 1 line
2.7.4
Re: [PATCH V3 19/26] dt-bindings: timer: gx6605s SOC timer
Quoted 22 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../bindings/timer/csky,gx6605s-timer.txt | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txtDocumentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +9
-0@@ -0,0 +1,46 @@ +================= +gx6605s SOC Timer +================= + +The timer is used in gx6605s soc as system timer and the driver +contain clk event and clk source. + +============================== +timer node bindings definition
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 19
Quoted 10 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +10
-0+============================== + + Description: Describes gx6605s SOC timer + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,gx6605s"
-timer?
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 26
Quoted 7 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +7
-0+ - reg + Usage: required + Value type: <u32 u32> + Definition: <phyaddr size> in soc from cpu view + - clocks + Usage: required + Value type: <node>
phandle + clock specifier cells
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 32
Quoted 6 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +6
-0+ Definition: must be input clk node + - interrupt + Usage: required + Value type: <u32> + Definition: must be timer irq num defined by soc + - interrupt-parent:
This is implied. Don't need to document it here.
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 40
Quoted 8 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +8
-0+ Usage: required + Value type: <node> + Definition: must be interrupt controller node + +Examples: +--------- + + timer:timer {
Needs a unit-address.
Quoted 9 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +6
-1+ compatible = "csky,gx6605s-timer"; + reg = <0x0020a000 0x400>; + clocks = <&dummy_apb_clk>; + interrupts = <10>; + interrupt-parent = <&intc>; + }; --2.7.4
Re: [PATCH V3 19/26] dt-bindings: timer: gx6605s SOC timer
Quoted 27 lines · Rob Herring
Quoted 26 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../bindings/timer/csky,gx6605s-timer.txt | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txtDocumentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +13
-0@@ -0,0 +1,46 @@ +================= +gx6605s SOC Timer +================= + +The timer is used in gx6605s soc as system timer and the driver +contain clk event and clk source. + +============================== +timer node bindings definition +============================== + + Description: Describes gx6605s SOC timer +
Quoted 8 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 19
Quoted 6 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +6
-0+ PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,gx6605s"-timer?
Yes, thx. must be "csky,gx6605s-timer"
Quoted 10 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 26
Quoted 8 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +7
-0+ - reg + Usage: required + Value type: <u32 u32> + Definition: <phyaddr size> in soc from cpu view + - clocks + Usage: required + Value type: <node>phandle + clock specifier cells
Sorry, I don't got it. Do you mean:
Value type: <phandle + clock specifier cells>
?
Quoted 9 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 32
Quoted 7 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +6
-0+ Definition: must be input clk node + - interrupt + Usage: required + Value type: <u32> + Definition: must be timer irq num defined by soc + - interrupt-parent:This is implied. Don't need to document it here.
Ok, remove interrupt-parent
Quoted 11 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt line 40
Quoted 9 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +8
-0+ Usage: required + Value type: <node> + Definition: must be interrupt controller node + +Examples: +--------- + + timer:timer {Needs a unit-address.
Ok, change to "timer0: timer@0x0020a000"
Quoted 10 lines
Quoted 10 lines
Documentation/devicetree/bindings/timer/csky,gx6605s-timer.txt new file +6
-1+ compatible = "csky,gx6605s-timer"; + reg = <0x0020a000 0x400>; + clocks = <&dummy_apb_clk>; + interrupts = <10>; + interrupt-parent = <&intc>; + }; --2.7.4
Re: [PATCH V3 19/26] dt-bindings: timer: gx6605s SOC timer
Quoted 9 lines · Guo Ren
Quoted 6 lines · Rob Herring
Quoted 5 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../bindings/timer/csky,gx6605s-timer.txt | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+)Ok, change to "timer0: timer@0x0020a000"
Ok, change to "timer0: timer@20a000"
PATCH v3 20/26 dt-bindings: timer: C-SKY Multi-processor timer
In reply to Guo Ren--- .../devicetree/bindings/timer/csky,mptimer.txt | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/csky,mptimer.txt
Documentation/devicetree/bindings/timer/csky,mptimer.txt new file +46 -0
@@ -0,0 +1,46 @@ +============================ +C-SKY Multi-processors Timer +============================ + +C-SKY multi-processors timer is designed for C-SKY SMP system and the +regs is accessed by cpu co-processor 4 registers with mtcr/mfcr. + + - PTIM_CTLR "cr<0, 14>" Control reg to start reset timer. + - PTIM_TSR "cr<1, 14>" Interrupt cleanup status reg. + - PTIM_CCVR "cr<3, 14>" Current counter value reg. + - PTIM_LVR "cr<6, 14>" Window value reg to triger next event. + +============================== +timer node bindings definition +============================== + + Description: Describes SMP timer + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,mptimer" + - clocks + Usage: required + Value type: <node> + Definition: must be input clk node + - interrupt + Usage: required + Value type: <u32> + Definition: must be timer irq num defined by soc + - interrupt-parent: + Usage: required + Value type: <node> + Definition: must be interrupt controller node + +Examples: +--------- + + timer: timer { + compatible = "csky,mptimer"; + clocks = <&dummy_apb_clk>; + interrupts = <16>; + interrupt-parent = <&intc>; + };
Signature · 1 line
2.7.4
PATCH v3 21/26 dt-bindings: interrupt-controller: C-SKY APB intc
In reply to Guo Ren--- .../interrupt-controller/csky,apb-intc.txt | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +45 -0
@@ -0,0 +1,45 @@ +============================== +C-SKY APB Interrupt Controller +============================== + +C-SKY APB Interrupt Controller is a simple soc interrupt controller +on the apb bus and we only use it as root irq controller. + + - csky,apb-intc is used in a lot of csky fpgas and socs, it support 64 irq nums. + - csky,dual-apb-intc consists of 2 apb-intc and 128 irq nums supported. + - csky,gx6605s-intc is gx6605s soc internal irq interrupt controller, 64 irq nums. + +============================= +intc node bindings definition +============================= + + Description: Describes APB interrupt controller + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,apb-intc" + "csky,dual-apb-intc" + "csky,gx6605s-intc" + - interrupt-cells + Usage: required + Value type: <u32> + Definition: must be <1> + - reg + Usage: required + Value type: <u32 u32> + Definition: <phyaddr size> in soc from cpu view + - interrupt-controller: + Usage: required + +Examples: +--------- + + intc: interrupt-controller { + compatible = "csky,apb-intc"; + #interrupt-cells = <1>; + reg = <0x00500000 0x400>; + interrupt-controller; + };
Signature · 1 line
2.7.4
Rob Herring
maintainerRe: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
Quoted 13 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../interrupt-controller/csky,apb-intc.txt | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txtDocumentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +0
-0
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 9
Quoted 9 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +9
-0@@ -0,0 +1,45 @@ +============================== +C-SKY APB Interrupt Controller +============================== + +C-SKY APB Interrupt Controller is a simple soc interrupt controller +on the apb bus and we only use it as root irq controller. + + - csky,apb-intc is used in a lot of csky fpgas and socs, it support 64 irq nums. + - csky,dual-apb-intc consists of 2 apb-intc and 128 irq nums supported.
Can't this be described in DT as 2 csky,apb-intc nodes?
Quoted 7 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +7
-0+ - csky,gx6605s-intc is gx6605s soc internal irq interrupt controller, 64 irq nums. + +============================= +intc node bindings definition +============================= + + Description: Describes APB interrupt controller
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 26
Quoted 10 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +10
-0+ + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,apb-intc" + "csky,dual-apb-intc" + "csky,gx6605s-intc" + - interrupt-cells
#interrupt-cells
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 29
Quoted 3 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +3
-0+ Usage: required + Value type: <u32> + Definition: must be <1>
No edge or level configuration?
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 40
Quoted 11 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +11
-0+ - reg + Usage: required + Value type: <u32 u32> + Definition: <phyaddr size> in soc from cpu view + - interrupt-controller: + Usage: required + +Examples: +--------- + + intc: interrupt-controller {
Needs a unit-address.
Quoted 8 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +5
-1+ compatible = "csky,apb-intc"; + #interrupt-cells = <1>; + reg = <0x00500000 0x400>; + interrupt-controller; + }; --2.7.4
Re: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
Quoted 17 lines · Rob Herring
Quoted 16 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../interrupt-controller/csky,apb-intc.txt | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txtDocumentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +3
-0@@ -0,0 +1,45 @@ +============================== +C-SKY APB Interrupt Controller +==============================
Quoted 8 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 9
Quoted 6 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +6
-0+ +C-SKY APB Interrupt Controller is a simple soc interrupt controller +on the apb bus and we only use it as root irq controller. + + - csky,apb-intc is used in a lot of csky fpgas and socs, it support 64 irq nums. + - csky,dual-apb-intc consists of 2 apb-intc and 128 irq nums supported.Can't this be described in DT as 2 csky,apb-intc nodes?
In detail, dual-apb-intc is not the same as two apb-intc, so I still want to name them separately, so I will keep this and it is clearer.
Quoted 9 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 26
Quoted 7 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +7
-0+ - compatible + Usage: required + Value type: <string> + Definition: must be "csky,apb-intc" + "csky,dual-apb-intc" + "csky,gx6605s-intc" + - interrupt-cells#interrupt-cells
Yes, I forgot #.
- #interrupt-cells
Quoted 5 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 29
Quoted 3 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +3
-0+ Usage: required + Value type: <u32> + Definition: must be <1>No edge or level configuration?
No, also no support in hardware.
Quoted 4 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt line 21
Quoted 2 lines
Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.txt new file +2
-0+ + intc: interrupt-controller {Needs a unit-address.
Ok, change it to:
intc: interrupt-controller@0x00500000 {Guo Ren
Arnd Bergmann
maintainerRe: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
Quoted 11 lines · Guo Ren
Quoted 7 lines · Rob Herring
Review
Quoted 4 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>(quoted diff) +2
-0+ + intc: interrupt-controller {Needs a unit-address.
Ok, change it to:
intc: interrupt-controller@0x00500000 {
The unit address has no leading 0x or leading zeroes, so interrupt-controller@500000
Arnd
Re: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
Quoted 9 lines · Arnd Bergmann
Quoted 8 lines · Guo Ren
Quoted 6 lines · Rob Herring
Quoted 4 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>(quoted diff) +2
-0+ + intc: interrupt-controller {
Quoted 6 lines
Quoted 3 lines
Quoted 1 line
Needs a unit-address.
Ok, change it to:
intc: interrupt-controller@0x00500000 {The unit address has no leading 0x or leading zeroes, so interrupt-controller@500000
Ok
Guo Ren
Rob Herring
maintainerRe: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
In reply to Arnd BergmannQuoted 10 lines · Arnd Bergmann
Quoted 8 lines · Guo Ren
Quoted 6 lines · Rob Herring
Quoted 4 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>(quoted diff) +2
-0+ + intc: interrupt-controller {
Quoted 6 lines
Quoted 3 lines
Quoted 1 line
Needs a unit-address.
Ok, change it to:
intc: interrupt-controller@0x00500000 {The unit address has no leading 0x or leading zeroes, so interrupt-controller@500000
Please build your dts files with W=12 and it will tell you this and other errors. And then update any examples based on that.
Rob
Re: [PATCH V3 21/26] dt-bindings: interrupt-controller: C-SKY APB intc
Quoted 12 lines · Rob Herring
Quoted 11 lines · Arnd Bergmann
Quoted 9 lines · Guo Ren
Quoted 7 lines · Rob Herring
Review
Quoted 4 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>(quoted diff) +2
-0+ + intc: interrupt-controller {Needs a unit-address.
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Ok, change it to:
intc: interrupt-controller@0x00500000 {The unit address has no leading 0x or leading zeroes, so interrupt-controller@500000
Please build your dts files with W=12 and it will tell you this and other errors. And then update any examples based on that.
Got it, thx for the tip.
Guo Ren
PATCH v3 22/26 dt-bindings: interrupt-controller: C-SKY SMP intc
In reply to Guo Ren--- .../bindings/interrupt-controller/csky,mpintc.txt | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +40 -0
@@ -0,0 +1,40 @@ +=========================================== +C-SKY Multi-processors Interrupt Controller +=========================================== + +C-SKY Multi-processors Interrupt Controller is designed for ck807/ck810/ck860 +SMP soc, and it also could be used in non-SMP system. + +Interrupt number definition: + + 0-15 : software irq, and we use 15 as our IPI_IRQ. + 16-31 : private irq, and we use 16 as the co-processor timer. + 31-1024: common irq for soc ip. + +============================= +intc node bindings definition +============================= + + Description: Describes SMP interrupt controller + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,mpintc" + - interrupt-cells + Usage: required + Value type: <u32> + Definition: must be <1> + - interrupt-controller: + Usage: required + +Examples: +--------- + + intc: interrupt-controller { + compatible = "csky,mpintc"; + #interrupt-cells = <1>; + interrupt-controller; + };
Signature · 1 line
2.7.4
Rob Herring
maintainerRe: [PATCH V3 22/26] dt-bindings: interrupt-controller: C-SKY SMP intc
Quoted 13 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../bindings/interrupt-controller/csky,mpintc.txt | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txtDocumentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +0
-0
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt line 6
Quoted 6 lines
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +6
-0@@ -0,0 +1,40 @@ +=========================================== +C-SKY Multi-processors Interrupt Controller +=========================================== + +C-SKY Multi-processors Interrupt Controller is designed for ck807/ck810/ck860 +SMP soc, and it also could be used in non-SMP system.
How is it accessed? No mmio registers?
Quoted 37 lines
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +34
-1+ +Interrupt number definition: + + 0-15 : software irq, and we use 15 as our IPI_IRQ. + 16-31 : private irq, and we use 16 as the co-processor timer. + 31-1024: common irq for soc ip. + +============================= +intc node bindings definition +============================= + + Description: Describes SMP interrupt controller + + PROPERTIES + + - compatible + Usage: required + Value type: <string> + Definition: must be "csky,mpintc" + - interrupt-cells + Usage: required + Value type: <u32> + Definition: must be <1> + - interrupt-controller: + Usage: required + +Examples: +--------- + + intc: interrupt-controller { + compatible = "csky,mpintc"; + #interrupt-cells = <1>; + interrupt-controller; + }; --2.7.4
Re: [PATCH V3 22/26] dt-bindings: interrupt-controller: C-SKY SMP intc
Quoted 8 lines · Rob Herring
Quoted 7 lines · Guo Ren
Signed-off-by Guo Ren <[email protected]>--- .../bindings/interrupt-controller/csky,mpintc.txt | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt
Quoted 14 lines
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt line 6
Quoted 12 lines
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +6
-0@@ -0,0 +1,40 @@ +=========================================== +C-SKY Multi-processors Interrupt Controller +=========================================== + +C-SKY Multi-processors Interrupt Controller is designed for ck807/ck810/ck860 +SMP soc, and it also could be used in non-SMP system.How is it accessed? No mmio registers?
Mmio reg base is got from cpu-coprocessor register and I'll detail it here in next version patch.
csky_mpintc_init(struct device_node *node, struct device_node *parent)
{
...
INTCG_base = ioremap(mfcr("cr<31, 14>"), INTC_SIZE);Arnd Bergmann
maintainerRe: [PATCH V3 22/26] dt-bindings: interrupt-controller: C-SKY SMP intc
Quoted 7 lines · Guo Ren
Quoted 6 lines · Rob Herring
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt line 6
Quoted 3 lines · Guo Ren
Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.txt new file +3
-0+ +C-SKY Multi-processors Interrupt Controller is designed for ck807/ck810/ck860 +SMP soc, and it also could be used in non-SMP system.How is it accessed? No mmio registers?
Quoted 7 lines
Mmio reg base is got from cpu-coprocessor register and I'll detail it here in next version patch.
csky_mpintc_init(struct device_node *node, struct device_node *parent){ ... INTCG_base = ioremap(mfcr("cr<31, 14>"), INTC_SIZE);
It that reliable? I remember a similar situation with some registers on ARM that are usually identified through a special CPU register, but in some cases the SoC integrator put the wrong address in there, so we need to look up the address in DT anyway.
Arnd
Re: [PATCH V3 22/26] dt-bindings: interrupt-controller: C-SKY SMP intc
Quoted 6 lines · Arnd Bergmann
Quoted 1 line
INTCG_base = ioremap(mfcr("cr<31, 14>"), INTC_SIZE);It that reliable? I remember a similar situation with some registers on ARM that are usually identified through a special CPU register, but in some cases the SoC integrator put the wrong address in there, so we need to look up the address in DT anyway.
Yes, it's reliable. This interrupt is combined with CPU and not on AXI or APB. Soc just give a hole in the address space and tell the CPU where the address is with 20 wire-signals.
Guo Ren
PATCH v3 23/26 clocksource: add gx6605s SOC system timer
In reply to Guo RenChangelog:
- Add License and Copyright
- Use timer-of framework
- Change name with upstream feedback
- Use clksource_mmio framework
--- drivers/clocksource/timer-gx6605s.c | 150 ++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 drivers/clocksource/timer-gx6605s.c
drivers/clocksource/timer-gx6605s.c new file +150 -0
@@ -0,0 +1,150 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/sched_clock.h> + +#include "timer-of.h" + +#define CLKSRC_OFFSET 0x40 + +#define TIMER_STATUS 0x00 +#define TIMER_VALUE 0x04 +#define TIMER_CONTRL 0x10 +#define TIMER_CONFIG 0x20 +#define TIMER_DIV 0x24 +#define TIMER_INI 0x28 + +#define GX6605S_STATUS_CLR BIT(0) +#define GX6605S_CONTRL_RST BIT(0) +#define GX6605S_CONTRL_START BIT(1) +#define GX6605S_CONFIG_EN BIT(0) +#define GX6605S_CONFIG_IRQ_EN BIT(1) + +static irqreturn_t gx6605s_timer_interrupt (int irq,void *dev) +{ +struct clock_event_device *ce = (struct clock_event_device *) dev; +void __iomem *base =timer_of_base (to_timer_of (ce)); + +writel_relaxed (GX6605S_STATUS_CLR , base +TIMER_STATUS ); + + ce->event_handler (ce); + +return IRQ_HANDLED ; +} + +static int gx6605s_timer_set_oneshot (struct clock_event_device *ce) +{ +void __iomem *base =timer_of_base (to_timer_of (ce)); + +/* reset and stop counter */ +writel_relaxed (GX6605S_CONTRL_RST , base +TIMER_CONTRL ); + +/* enable with irq and start */ +writel_relaxed (GX6605S_CONFIG_EN |GX6605S_CONFIG_IRQ_EN , base +TIMER_CONFIG ); + +return 0 ; +} + +static int gx6605s_timer_set_next_event (unsigned long delta,struct clock_event_device *ce) +{ +void __iomem *base =timer_of_base (to_timer_of (ce)); + +/* use reset to pause timer */ +writel_relaxed (GX6605S_CONTRL_RST , base +TIMER_CONTRL ); + +/* config next timeout value */ +writel_relaxed (ULONG_MAX - delta, base +TIMER_INI ); +writel_relaxed (GX6605S_CONTRL_START , base +TIMER_CONTRL ); + +return 0 ; +} + +static int gx6605s_timer_shutdown (struct clock_event_device *ce) +{ +void __iomem *base =timer_of_base (to_timer_of (ce)); + +writel_relaxed (0 , base +TIMER_CONTRL ); +writel_relaxed (0 , base +TIMER_CONFIG ); + +return 0 ; +} + +static struct timer_of to = { + .flags =TIMER_OF_IRQ |TIMER_OF_BASE |TIMER_OF_CLOCK , + .clkevt = { + .rating =300 , + .features =CLOCK_EVT_FEAT_DYNIRQ | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = gx6605s_timer_shutdown, + .set_state_oneshot = gx6605s_timer_set_oneshot, + .set_next_event = gx6605s_timer_set_next_event, + .cpumask = cpu_possible_mask, + }, + .of_irq = { + .handler = gx6605s_timer_interrupt, + .flags =IRQF_TIMER |IRQF_IRQPOLL , + }, +}; + +static u64 notrace gx6605s_sched_clock_read(void) +{ +void __iomem *base; + + base =timer_of_base (&to) +CLKSRC_OFFSET ; + +return (u64 )readl_relaxed (base +TIMER_VALUE ); +} + +static void gx6605s_clkevt_init (void __iomem *base) +{ +writel_relaxed (0 , base +TIMER_DIV ); +writel_relaxed (0 , base +TIMER_CONFIG ); + +clockevents_config_and_register (&to.clkevt,timer_of_rate (&to),2 ,ULONG_MAX ); +} + +static int gx6605s_clksrc_init (void __iomem *base) +{ +writel_relaxed (0 , base +TIMER_DIV ); +writel_relaxed (0 , base +TIMER_INI ); + +writel_relaxed (GX6605S_CONTRL_RST , base +TIMER_CONTRL ); + +writel_relaxed (GX6605S_CONFIG_EN , base +TIMER_CONFIG ); + +writel_relaxed (GX6605S_CONTRL_START , base +TIMER_CONTRL ); + +sched_clock_register (gx6605s_sched_clock_read,32 ,timer_of_rate (&to)); + +return clocksource_mmio_init (base +TIMER_VALUE ,"gx6605s" ,timer_of_rate (&to), +200 ,32 , clocksource_mmio_readl_up); +} + +static int __init gx6605s_timer_init (struct device_node *np) +{ +int ret; + +/* +* The timer driver is for nationalchip gx6605s SOC and there are two same timer +* in gx6605s. We use one for clkevt and another for clksrc. +* +* The timer is mmio map to access, so we need give mmio addres in dts. +* +* It provides a 32bit countup timer and interrupt will be caused by count-overflow. +* So we need set-next-event by ULONG_MAX - delta in TIMER_INI reg. +* +* The counter at 0x0 offset is clock event. +* The counter at 0x40 offset is clock source. +* They are the same in hardware, just different used by driver. +*/ + ret =timer_of_init (np, &to); +if (ret) +return ret; + +gx6605s_clkevt_init (timer_of_base (&to)); + +return gx6605s_clksrc_init (timer_of_base (&to) +CLKSRC_OFFSET ); +} +TIMER_OF_DECLARE (csky_gx6605s_timer,"csky,gx6605s-timer" , gx6605s_timer_init);
Signature · 1 line
2.7.4
PATCH v3 24/26 clocksource: add C-SKY SMP timer
In reply to Guo RenThis timer is used by SMP system and use mfcr/mtcr instruction to access the regs.
Changelog:
- Support csky mp timer alpha version.
- Just use low-counter with 32bit width as clocksource.
- Coding convention with upstream feed-back.
--- drivers/clocksource/csky_mptimer.c | 178 +++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 drivers/clocksource/csky_mptimer.c
drivers/clocksource/csky_mptimer.c new file +178 -0
@@ -0,0 +1,178 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/sched_clock.h> +#include <linux/cpu.h> +#include <asm/reg_ops.h> + +#include "timer-of.h" + +#define PTIM_CCVR "cr<3, 14>" +#define PTIM_CTLR "cr<0, 14>" +#define PTIM_LVR "cr<6, 14>" +#define PTIM_TSR "cr<1, 14>" + +static int csky_mptimer_set_next_event (unsigned long delta,struct clock_event_device *ce) +{ +mtcr (PTIM_LVR , delta); + +return 0 ; +} + +static int csky_mptimer_shutdown (struct clock_event_device *ce) +{ +mtcr (PTIM_CTLR ,0 ); + +return 0 ; +} + +static int csky_mptimer_oneshot (struct clock_event_device *ce) +{ +mtcr (PTIM_CTLR ,1 ); + +return 0 ; +} + +static int csky_mptimer_oneshot_stopped (struct clock_event_device *ce) +{ +mtcr (PTIM_CTLR ,0 ); + +return 0 ; +} + +static DEFINE_PER_CPU(struct timer_of, csky_to) = { + .flags =TIMER_OF_CLOCK , + .clkevt = { + .rating =300 , + .features =CLOCK_EVT_FEAT_PERCPU | +CLOCK_EVT_FEAT_ONESHOT , + .set_state_shutdown = csky_mptimer_shutdown, + .set_state_oneshot = csky_mptimer_oneshot, + .set_state_oneshot_stopped = csky_mptimer_oneshot_stopped, + .set_next_event = csky_mptimer_set_next_event, + }, + .of_irq = { + .flags =IRQF_TIMER , + .percpu =1 , + }, +}; + +static irqreturn_t timer_interrupt (int irq,void *dev) +{ +struct timer_of *to =this_cpu_ptr (&csky_to); + +mtcr (PTIM_TSR ,0 ); + + to->clkevt.event_handler (&to->clkevt); + +return IRQ_HANDLED ; +} + +/* +* clock event for percpu +*/ +static int csky_mptimer_starting_cpu (unsigned int cpu) +{ +struct timer_of *to =per_cpu_ptr (&csky_to, cpu); + + to->clkevt.cpumask =cpumask_of (cpu); + +clockevents_config_and_register (&to->clkevt,timer_of_rate (to),2 ,ULONG_MAX ); + +enable_percpu_irq (timer_of_irq (to),0 ); + +return 0 ; +} + +static int csky_mptimer_dying_cpu (unsigned int cpu) +{ +struct timer_of *to =per_cpu_ptr (&csky_to, cpu); + +disable_percpu_irq (timer_of_irq (to)); + +return 0 ; +} + +/* +* clock source +*/ +static u64 sched_clock_read (void ) +{ +return (u64 )mfcr (PTIM_CCVR ); +} + +static u64 clksrc_read (struct clocksource *c) +{ +return (u64 )mfcr (PTIM_CCVR ); +} + +struct clocksource csky_clocksource = { + .name ="csky" , + .rating =400 , + .mask =CLOCKSOURCE_MASK (32 ), + .flags =CLOCK_SOURCE_IS_CONTINUOUS , + .read = clksrc_read, +}; + +#define CPUHP_AP_CSKY_TIMER_STARTING CPUHP_AP_DUMMY_TIMER_STARTING + +static int __init csky_mptimer_init (struct device_node *np) +{ +int ret, cpu; +struct timer_of *to; +int rate =0 ; +int irq =0 ; + +/* +* Csky_mptimer is designed for C-SKY SMP multi-processors and +* every core has it's own private irq and regs for clkevt and +* clksrc. +* +* The regs is accessed by cpu instruction: mfcr/mtcr instead of +* mmio map style. So we needn't mmio-address in dts, but we still +* need to give clk and irq number. +* +* We use private irq for the mptimer and irq number is the same +* for every core. So we use request_percpu_irq() in timer_of_init. +*/ + +for_each_possible_cpu (cpu) { + to =per_cpu_ptr (&csky_to, cpu); + +if (cpu ==0 ) { + to->flags |=TIMER_OF_IRQ ; + to->of_irq.handler = timer_interrupt; + + ret =timer_of_init (np, to); +if (ret) +return ret; + + rate =timer_of_rate (to); + irq = to->of_irq.irq; + }else { + ret =timer_of_init (np, to); +if (ret) +return ret; + + to->of_clk.rate = rate; + to->of_irq.irq = irq; + } + } + + ret =cpuhp_setup_state (CPUHP_AP_CSKY_TIMER_STARTING , +"clockevents/csky/timer:starting" , + csky_mptimer_starting_cpu, + csky_mptimer_dying_cpu); +if (ret) { +pr_err ("%s: Failed to cpuhp_setup_state.\n" , __func__); +return ret; + } + +clocksource_register_hz (&csky_clocksource, rate); +sched_clock_register (sched_clock_read,32 , rate); + +return 0 ; +} +TIMER_OF_DECLARE (csky_mptimer,"csky,mptimer" , csky_mptimer_init);
Signature · 1 line
2.7.4
PATCH v3 25/26 clocksource: add C-SKY timers' build infrastructure
In reply to Guo Ren--- drivers/clocksource/Kconfig | 15 +++++++++++++++ drivers/clocksource/Makefile | 2 ++ 2 files changed, 17 insertions(+)
drivers/clocksource/Kconfig +15 -0
@@ -609,4 +609,19 @@ config ATCPIT100_TIMER help This option enables support for the Andestech ATCPIT100 timers. +config CSKY_MPTIMER + bool "C-SKY mptimer driver" + depends on CSKY + select TIMER_OF + help + This option enables support for C-SKY mptimer. + +config GX6605S_TIMER + bool "Gx6605s SOC system timer driver" + depends on CSKY + select CLKSRC_MMIO + select TIMER_OF + help + This option enables support for gx6605s timer. + endmenu
drivers/clocksource/Makefile +2 -0
@@ -78,3 +78,5 @@ obj-$(CONFIG_H8300_TPU) += h8300_tpu.o obj-$(CONFIG_CLKSRC_ST_LPC) += clksrc_st_lpc.o obj-$(CONFIG_X86_NUMACHIP) += numachip.o obj-$(CONFIG_ATCPIT100_TIMER) += timer-atcpit100.o +obj-$(CONFIG_CSKY_MPTIMER) += csky_mptimer.o +obj-$(CONFIG_GX6605S_TIMER) += timer-gx6605s.o
Signature · 1 line
2.7.4
PATCH v3 26/26 irqchip: add C-SKY irqchip drivers
In reply to Guo RenThis patch add C-SKY two interrupt conrollers.
- irq-csky-apb-intc is a simple SOC interrupt controller which is used in a lot of C-SKY SOC products.
- irq-csky-mpintc is C-SKY smp system interrupt controller and it could support 16 soft irqs, 16 private irqs, and 992 irqs.
Changelog:
- change name with upstream feed-back.
- remove CSKY_VECIRQ_LEGENCY.
- change irq map, reserve soft_irq&private_irq space.
- add License and Copyright
- change to generic irq chip framework.
- support set_affinity for irq balance in SMP
- add INTC_IFR to clear irq-pending
- use irq_domain_add_linear instead of leagcy.
- add set_handle_irq(), ref from openrisc & arm.
--- drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-csky-apb-intc.c | 243 ++++++++++++++++++++++++++++++++++++ drivers/irqchip/irq-csky-mpintc.c | 191 ++++++++++++++++++++++++++++ 3 files changed, 435 insertions(+) create mode 100644 drivers/irqchip/irq-csky-apb-intc.c create mode 100644 drivers/irqchip/irq-csky-mpintc.c
drivers/irqchip/Makefile +1 -0
@@ -87,3 +87,4 @@ obj-$(CONFIG_MESON_IRQ_GPIO) += irq-meson-gpio.o obj-$(CONFIG_GOLDFISH_PIC) += irq-goldfish-pic.o obj-$(CONFIG_NDS32) += irq-ativic32.o obj-$(CONFIG_QCOM_PDC) += qcom-pdc.o +obj-$(CONFIG_CSKY) += irq-csky-mpintc.o irq-csky-apb-intc.o
drivers/irqchip/irq-csky-apb-intc.c new file +243 -0
243 lines not on this page · raw message
drivers/irqchip/irq-csky-mpintc.c new file +191 -0
191 lines not on this page · raw message
Signature · 1 line
2.7.4
Arnd Bergmann
maintainerQuoted 6 lines · Guo Ren
This is the 3th version patchset to add the Linux kernel port for C-SKY(csky). Thanks to everyone who provided feedback on the previous version.
This patchset adds architecture support to Linux for C-SKY's 32-bit embedded CPU cores and the patches are based on linux-4.18.4
I looked at all patches again, overall this seems well done, thanks for addressing
all the prior feedback.
Most of my comments are are for fairly unimportant issues, the one thing I found that needs to be properly addressed is the asm/io.h header, which should implement the I/O accessors as your hardware requires them.
Arnd
Hi,
Quoted 11 lines · Guo Ren
This is the 3th version patchset to add the Linux kernel port for C-SKY(csky). Thanks to everyone who provided feedback on the previous version.
This patchset adds architecture support to Linux for C-SKY's 32-bit embedded CPU cores and the patches are based on linux-4.18.4
There are two ABI versions with several CPU cores in this patchset:
ABIv1: ck610 (16-bit instruction, 32-bit data path, VIPT Cache ...)
ABIv2: ck807 ck810 ck860 (16/32-bit variable length instruction, PIPT Cache,SMP ...)
My key question is about upstream toolchain support. The buildroot clone tells me
$ git describe csky/master 2017.11-2111-ge9cc5a5
and
$ git log --oneline origin/master..csky/master | wc 1180 7436 57104
with
$ git remote -v csky https://gitlab.com/c-sky/buildroot.git origin git://git.buildroot.net/buildroot
So it looks like there are more thasn a thousand patches on top of buildroot. Adding an architecture to buildroot should only take a single patch, or maybe a few, but not more than a thousand. This strongly suggests that a lot of changes are not upstream but only available in the buildroot clone.
When are we going to see all those changes in upstream gcc, binutils, and qemu ? I don't really want to dig through more than a thousand patches in a buildroot clone to find out details about the status of upstream toolchain support.
Thanks,
Guenter
Quoted 31 lines · Guenter Roeck
Hi,
Quoted 11 lines · Guo Ren
This is the 3th version patchset to add the Linux kernel port for C-SKY(csky). Thanks to everyone who provided feedback on the previous version.
This patchset adds architecture support to Linux for C-SKY's 32-bit embedded CPU cores and the patches are based on linux-4.18.4
There are two ABI versions with several CPU cores in this patchset:
ABIv1: ck610 (16-bit instruction, 32-bit data path, VIPT Cache ...)
ABIv2: ck807 ck810 ck860 (16/32-bit variable length instruction, PIPT Cache,SMP ...)My key question is about upstream toolchain support. The buildroot clone tells me
$ git describe csky/master 2017.11-2111-ge9cc5a5and
$ git log --oneline origin/master..csky/master | wc 1180 7436 57104with
$ git remote -v csky https://gitlab.com/c-sky/buildroot.git origin git://git.buildroot.net/buildroot
Quoted 5 lines
So it looks like there are more thasn a thousand patches on top of buildroot. Adding an architecture to buildroot should only take a single patch, or maybe a few, but not more than a thousand. This strongly suggests that a lot of changes are not upstream but only available in the buildroot clone.
csky https://gitlab.com/c-sky/buildroot.git is our CI environment
based on buildroot and it's so miscellaneous.
We won't upstream it directly and we'll prepare another patch set for buildroot.org update after kernel, glibc upstreamed.
Quoted 4 lines
When are we going to see all those changes in upstream gcc, binutils, and qemu ? I don't really want to dig through more than a thousand patches in a buildroot clone to find out details about the status of upstream toolchain support.
Ok, you want to use upstream gcc, binutils to build the kernel. I'll give the tips in next version patch.
Best Regards
Guo Ren