From: "Guan Xuetao" <guanxuetao@mprc.pku.edu.cn> To: <linux-arch@vger.kernel.org>, <linux-kernel@vger.kernel.org> Subject: [PATCHv1 5/8] unicore32 additional architecture files: low-level lib: io Date: Mon, 3 Jan 2011 19:52:27 +0800 [thread overview] Message-ID: <012d01cbab3c$b180b220$14821660$@mprc.pku.edu.cn> (raw) From: Guan Xuetao <guanxuetao@mprc.pku.edu.cn> Patch 5 implements low-level io libraries. Signed-off-by: Guan Xuetao <guanxuetao@mprc.pku.edu.cn> --- arch/unicore32/include/asm/io.h | 83 +++++++++++++++++++++++++ arch/unicore32/lib/io-readsb.S | 130 +++++++++++++++++++++++++++++++++++++++ arch/unicore32/lib/io-readsl.S | 83 +++++++++++++++++++++++++ arch/unicore32/lib/io-readsw.S | 110 +++++++++++++++++++++++++++++++++ arch/unicore32/lib/io-writesb.S | 90 +++++++++++++++++++++++++++ arch/unicore32/lib/io-writesl.S | 69 +++++++++++++++++++++ arch/unicore32/lib/io-writesw.S | 87 ++++++++++++++++++++++++++ 7 files changed, 652 insertions(+), 0 deletions(-) diff --git a/arch/unicore32/include/asm/io.h b/arch/unicore32/include/asm/io.h new file mode 100644 index 0000000..67c5c03 --- /dev/null +++ b/arch/unicore32/include/asm/io.h @@ -0,0 +1,83 @@ +/* + * linux/arch/unicore32/include/asm/io.h + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __UNICORE_IO_H__ +#define __UNICORE_IO_H__ + +#ifdef __KERNEL__ + +#include <linux/types.h> +#include <asm/byteorder.h> +#include <asm/memory.h> +#include <asm/system.h> + +/* + * IO port access primitives + * ------------------------- + * + * The UniCore doesn't have special IO access instructions; all IO is memory + * mapped. Note that these are defined to perform little endian accesses + * only. Their primary purpose is to access PCI peripherals. + * + * Note that we prevent GCC re-ordering or caching values in expressions + * by introducing sequence points into the in*() definitions. Note that + * __raw_* do not guarantee this behaviour. + * + * The {in,out}[bwl] macros are for emulating x86-style PCI IO space. + */ +extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen); +extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen); +extern void __raw_writesl(void __iomem *addr, const void *data, int longlen); + +extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen); +extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); +extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); + +#define outsb(p, d, l) __raw_writesb((void __iomem *)p, d, l) +#define outsw(p, d, l) __raw_writesw((void __iomem *)p, d, l) +#define outsl(p, d, l) __raw_writesl((void __iomem *)p, d, l) + +#define insb(p, d, l) __raw_readsb((void __iomem *)p, d, l) +#define insw(p, d, l) __raw_readsw((void __iomem *)p, d, l) +#define insl(p, d, l) __raw_readsl((void __iomem *)p, d, l) + +#include <asm-generic/io.h> + +/* + * __uc32_ioremap and __uc32_ioremap_cached takes CPU physical address. + */ +extern void __iomem *__uc32_ioremap(unsigned long, size_t); +extern void __iomem *__uc32_ioremap_cached(unsigned long, size_t); +extern void __uc32_iounmap(volatile void __iomem *addr); + +/* + * ioremap and friends. + * + * ioremap takes a PCI memory address, as specified in + * Documentation/IO-mapping.txt. + * + */ +#define ioremap(cookie, size) __uc32_ioremap(cookie, size) +#define ioremap_cached(cookie, size) __uc32_ioremap_cached(cookie, size) +#define iounmap(cookie) __uc32_iounmap(cookie) + +extern void __iomem *ioport_map(unsigned long port, unsigned int nr); +extern void ioport_unmap(void __iomem *addr); + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#undef xlate_dev_mem_ptr +#define xlate_dev_mem_ptr(p) __va(p) + +#endif /* __KERNEL__ */ +#endif /* __UNICORE_IO_H__ */ diff --git a/arch/unicore32/lib/io-readsb.S b/arch/unicore32/lib/io-readsb.S new file mode 100644 index 0000000..ff85be3 --- /dev/null +++ b/arch/unicore32/lib/io-readsb.S @@ -0,0 +1,130 @@ +/* + * linux/arch/unicore32/lib/io-readsb.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +.Linsb_align: rsub ip, ip, #4 + csub.a ip, r2 + cmovsg ip, r2 + csub.a ip, #2 + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bsl 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bel 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 +201: + sub.a r2, r2, ip + bne .Linsb_aligned + +ENTRY(__raw_readsb) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne .Linsb_align + +.Linsb_aligned: + + sub.a r2, r2, #16 + bfs .Linsb_no_16 + +.Linsb_16_lp: ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + mov r3, r3 put_byte_0 + ldb r6, [r0] + or r3, r3, r4 put_byte_1 + ldb r4, [r0] + or r3, r3, r5 put_byte_2 + ldb r5, [r0] + or r3, r3, r6 put_byte_3 + ldb r6, [r0] + mov r4, r4 put_byte_0 + ldb ip, [r0] + or r4, r4, r5 put_byte_1 + ldb r5, [r0] + or r4, r4, r6 put_byte_2 + ldb r6, [r0] + or r4, r4, ip put_byte_3 + ldb ip, [r0] + mov r5, r5 put_byte_0 + ldb r15, [r0] + or r5, r5, r6 put_byte_1 + ldb r6, [r0] + or r5, r5, ip put_byte_2 + ldb ip, [r0] + or r5, r5, r15 put_byte_3 + ldb r15, [r0] + mov r6, r6 put_byte_0 + or r6, r6, ip put_byte_1 + ldb ip, [r0] + or r6, r6, r15 put_byte_2 + or r6, r6, ip put_byte_3 + stm.w (r3 - r6), [r1]+ + + sub.a r2, r2, #16 + bns .Linsb_16_lp + + cand.a r2, #15 + cmoveq pc, lr + +.Linsb_no_16: cand.a r2, #8 + beq .Linsb_no_8 + + ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + mov r3, r3 put_byte_0 + ldb r6, [r0] + or r3, r3, r4 put_byte_1 + ldb r4, [r0] + or r3, r3, r5 put_byte_2 + ldb r5, [r0] + or r3, r3, r6 put_byte_3 + ldb r6, [r0] + mov r4, r4 put_byte_0 + ldb ip, [r0] + or r4, r4, r5 put_byte_1 + or r4, r4, r6 put_byte_2 + or r4, r4, ip put_byte_3 + stm.w (r3, r4), [r1]+ + +.Linsb_no_8: cand.a r2, #4 + beq .Linsb_no_4 + + ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + ldb r6, [r0] + mov r3, r3 put_byte_0 + or r3, r3, r4 put_byte_1 + or r3, r3, r5 put_byte_2 + or r3, r3, r6 put_byte_3 + stw.w r3, [r1]+, #4 + +.Linsb_no_4: and.a r2, r2, #3 + cmoveq pc, lr + + csub.a r2, #2 + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bsl 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bel 201f + ldb r3, [r0] + stb r3, [r1] +201: + mov pc, lr +ENDPROC(__raw_readsb) diff --git a/arch/unicore32/lib/io-readsl.S b/arch/unicore32/lib/io-readsl.S new file mode 100644 index 0000000..980b0fc --- /dev/null +++ b/arch/unicore32/lib/io-readsl.S @@ -0,0 +1,83 @@ +/* + * linux/arch/unicore32/lib/io-readsl.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +ENTRY(__raw_readsl) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne 3f + + sub.a r2, r2, #4 + bfs 2f +1: ldw r3, [r0+], #0 + ldw r4, [r0+], #0 + ldw r14, [r0+], #0 + ldw r15, [r0+], #0 + sub.a r2, r2, #4 + stm.w (r3, r4, r14, r15), [r1]+ + bns 1b +2: mov.a r2, r2 << #31 + bub 201f + ldw r3, [r0+], #0 + ldw r14, [r0+], #0 + stm.w (r3, r14), [r1]+ +201: beq 202f + ldw r3, [r0+], #0 + stw r3, [r1+], #0 +202: + mov pc, lr + +3: ldw r3, [r0] + csub.a ip, #2 + mov ip, r3 get_byte_0 + stb.w ip, [r1]+, #1 + bsg 6f + mov ip, r3 get_byte_1 + stb.w ip, [r1]+, #1 + beq 5f + mov ip, r3 get_byte_2 + stb.w ip, [r1]+, #1 + +4: sub.a r2, r2, #1 + mov ip, r3 pull #24 + beq 8f + ldw r3, [r0] + or ip, ip, r3 push #8 + stw.w ip, [r1]+, #4 + b 4b + +5: sub.a r2, r2, #1 + mov ip, r3 pull #16 + beq 7f + ldw r3, [r0] + or ip, ip, r3 push #16 + stw.w ip, [r1]+, #4 + b 5b + +6: sub.a r2, r2, #1 + mov ip, r3 pull #8 + beq 201f + ldw r3, [r0] + or ip, ip, r3 push #24 + stw.w ip, [r1]+, #4 + b 6b +201: + mov r3, ip get_byte_2 + stb r3, [r1+], #2 +7: mov r3, ip get_byte_1 + stb r3, [r1+], #1 +8: mov r3, ip get_byte_0 + stb r3, [r1+], #0 + mov pc, lr +ENDPROC(__raw_readsl) diff --git a/arch/unicore32/lib/io-readsw.S b/arch/unicore32/lib/io-readsw.S new file mode 100644 index 0000000..7d0b49d --- /dev/null +++ b/arch/unicore32/lib/io-readsw.S @@ -0,0 +1,110 @@ +/* + * linux/arch/unicore32/lib/io-readsw.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro pack, rd, hw1, hw2 + or \rd, \hw1, \hw2 << #16 + .endm + +.Linsw_align: mov.a ip, r1 << #31 + bne .Linsw_noalign + ldh ip, [r0] + sub r2, r2, #1 + sth.w ip, [r1]+, #2 + +ENTRY(__raw_readsw) + cxor.a r2, #0 + cmoveq pc, lr + cand.a r1, #3 + bne .Linsw_align + + sub.a r2, r2, #8 + bfs .Lno_insw_8 + +.Linsw_8_lp: ldh r3, [r0] + ldh r4, [r0] + pack r3, r3, r4 + + ldh r4, [r0] + ldh r5, [r0] + pack r4, r4, r5 + + ldh r5, [r0] + ldh ip, [r0] + pack r5, r5, ip + + ldh ip, [r0] + ldh r15, [r0] + pack ip, ip, r15 + + sub.a r2, r2, #8 + stm.w (r3 - r5), [r1]+ + stm.w (ip), [r1]+ + bns .Linsw_8_lp + +.Lno_insw_8: cand.a r2, #4 + beq .Lno_insw_4 + + ldh r3, [r0] + ldh r4, [r0] + pack r3, r3, r4 + + ldh r4, [r0] + ldh ip, [r0] + pack r4, r4, ip + + stm.w (r3, r4), [r1]+ + +.Lno_insw_4: mov.a r2, r2 << #31 + bub .Lno_insw_2 + + ldh r3, [r0] + ldh ip, [r0] + pack r3, r3, ip + stw.w r3, [r1]+, #4 + +.Lno_insw_2: cmoveq pc, lr + ldh r3, [r0] + sth r3, [r1] + mov pc, lr + +.Linsw_noalign: bea 201f + ldb.w ip, [r1+], #-1 + b 1f +201: + ldh ip, [r0] + sub r2, r2, #1 + stb.w ip, [r1]+, #1 + mov ip, ip >> #8 + +1: sub.a r2, r2, #2 + bfs 3f + +2: ldh r3, [r0] + ldh r4, [r0] + sub.a r2, r2, #2 + or ip, ip, r3 << #8 + or ip, ip, r4 << #24 + stw.w ip, [r1]+, #4 + mov ip, r4 >> #8 + bns 2b + +3: cand.a r2, #1 + stb.w ip, [r1]+, #1 + cmoveq pc, lr + ldh ip, [r0] + stb.w ip, [r1]+, #1 + mov ip, ip >> #8 + stb ip, [r1] + mov pc, lr +ENDPROC(__raw_readsw) diff --git a/arch/unicore32/lib/io-writesb.S b/arch/unicore32/lib/io-writesb.S new file mode 100644 index 0000000..bfcb91e --- /dev/null +++ b/arch/unicore32/lib/io-writesb.S @@ -0,0 +1,90 @@ +/* + * linux/arch/unicore32/lib/io-writesb.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro outword, rd + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + .endm + +.Loutsb_align: rsub ip, ip, #4 + csub.a ip, r2 + cmovsg ip, r2 + csub.a ip, #2 + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bsl 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bel 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] +201: + sub.a r2, r2, ip + bne .Loutsb_aligned + +ENTRY(__raw_writesb) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne .Loutsb_align + +.Loutsb_aligned: + + sub.a r2, r2, #16 + bfs .Loutsb_no_16 + +.Loutsb_16_lp: ldm.w (r3, r4, r5, r14), [r1]+ + outword r3 + outword r4 + outword r5 + outword r14 + sub.a r2, r2, #16 + bns .Loutsb_16_lp + + cand.a r2, #15 + cmoveq pc, lr + +.Loutsb_no_16: cand.a r2, #8 + beq .Loutsb_no_8 + + ldm.w (r3, r4), [r1]+ + outword r3 + outword r4 + +.Loutsb_no_8: cand.a r2, #4 + beq .Loutsb_no_4 + + ldw.w r3, [r1]+, #4 + outword r3 + +.Loutsb_no_4: and.a r2, r2, #3 + cmoveq pc, lr + + csub.a r2, #2 + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bsl 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bel 201f + ldb r3, [r1] + stb r3, [r0] +201: + mov pc, lr +ENDPROC(__raw_writesb) diff --git a/arch/unicore32/lib/io-writesl.S b/arch/unicore32/lib/io-writesl.S new file mode 100644 index 0000000..a880b47 --- /dev/null +++ b/arch/unicore32/lib/io-writesl.S @@ -0,0 +1,69 @@ +/* + * linux/arch/unicore32/lib/io-writesl.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +ENTRY(__raw_writesl) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne 3f + + sub.a r2, r2, #4 + bfs 2f +1: ldm.w (r3, r4, r14, r15), [r1]+ + sub.a r2, r2, #4 + stw r3, [r0+], #0 + stw r4, [r0+], #0 + stw r14, [r0+], #0 + stw r15, [r0+], #0 + bns 1b +2: mov.a r2, r2 << #31 + bub 201f + ldm.w (r3, r14), [r1]+ + stw r3, [r0+], #0 + stw r14, [r0+], #0 +201: cmoveq pc, lr + ldw r3, [r1+], #0 + stw r3, [r0+], #0 + mov pc, lr + +3: andn r1, r1, #3 + ldw.w r3, [r1]+, #4 + csub.a ip, #2 + bsl 5f + bsg 6f + +4: mov ip, r3 pull #16 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #16 + stw ip, [r0] + bne 4b + mov pc, lr + +5: mov ip, r3 pull #8 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #24 + stw ip, [r0] + bne 5b + mov pc, lr + +6: mov ip, r3 pull #24 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #8 + stw ip, [r0] + bne 6b + mov pc, lr +ENDPROC(__raw_writesl) diff --git a/arch/unicore32/lib/io-writesw.S b/arch/unicore32/lib/io-writesw.S new file mode 100644 index 0000000..23e1f16 --- /dev/null +++ b/arch/unicore32/lib/io-writesw.S @@ -0,0 +1,87 @@ +/* + * linux/arch/unicore32/lib/io-writesw.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro outword, rd + sth \rd, [r0] + mov \rd, \rd >> #16 + sth \rd, [r0] + .endm + +.Loutsw_align: mov.a ip, r1 << #31 + bne .Loutsw_noalign + + ldh.w r3, [r1]+, #2 + sub r2, r2, #1 + sth r3, [r0] + +ENTRY(__raw_writesw) + cxor.a r2, #0 + cmoveq pc, lr + and.a r3, r1, #3 + bne .Loutsw_align + + sub.a r2, r2, #8 + bfs .Lno_outsw_8 + +.Loutsw_8_lp: ldm.w (r3, r4, r5, r14), [r1]+ + sub.a r2, r2, #8 + outword r3 + outword r4 + outword r5 + outword r14 + bns .Loutsw_8_lp + +.Lno_outsw_8: cand.a r2, #4 + beq .Lno_outsw_4 + + ldm.w (r3, r14), [r1]+ + outword r3 + outword r14 + +.Lno_outsw_4: mov.a r2, r2 << #31 + bub .Lno_outsw_2 + + ldw.w r3, [r1]+, #4 + outword r3 + +.Lno_outsw_2: cmoveq pc, lr + ldh r3, [r1] + sth r3, [r0] + + mov pc, lr + +.Loutsw_noalign: + ldw.w r3, [r1-], r3 + bub 201f + sub r2, r2, #1 + b 2f +201: + sub.a r2, r2, #2 + bfs 3f + +1: mov ip, r3 >> #8 + sth ip, [r0] +2: mov ip, r3 >> #24 + ldw.w r3, [r1+], #4 + sub.a r2, r2, #2 + or ip, ip, r3 << #8 + sth ip, [r0] + bns 1b + + cand.a r2, #1 +3: cmoveq pc, lr + mov ip, r3 >> #8 + sth ip, [r0] + mov pc, lr +ENDPROC(__raw_writesw)
WARNING: multiple messages have this Message-ID (diff)
From: "Guan Xuetao" <guanxuetao@mprc.pku.edu.cn> To: linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCHv1 5/8] unicore32 additional architecture files: low-level lib: io Date: Mon, 3 Jan 2011 19:52:27 +0800 [thread overview] Message-ID: <012d01cbab3c$b180b220$14821660$@mprc.pku.edu.cn> (raw) From: Guan Xuetao <guanxuetao@mprc.pku.edu.cn> Patch 5 implements low-level io libraries. Signed-off-by: Guan Xuetao <guanxuetao@mprc.pku.edu.cn> --- arch/unicore32/include/asm/io.h | 83 +++++++++++++++++++++++++ arch/unicore32/lib/io-readsb.S | 130 +++++++++++++++++++++++++++++++++++++++ arch/unicore32/lib/io-readsl.S | 83 +++++++++++++++++++++++++ arch/unicore32/lib/io-readsw.S | 110 +++++++++++++++++++++++++++++++++ arch/unicore32/lib/io-writesb.S | 90 +++++++++++++++++++++++++++ arch/unicore32/lib/io-writesl.S | 69 +++++++++++++++++++++ arch/unicore32/lib/io-writesw.S | 87 ++++++++++++++++++++++++++ 7 files changed, 652 insertions(+), 0 deletions(-) diff --git a/arch/unicore32/include/asm/io.h b/arch/unicore32/include/asm/io.h new file mode 100644 index 0000000..67c5c03 --- /dev/null +++ b/arch/unicore32/include/asm/io.h @@ -0,0 +1,83 @@ +/* + * linux/arch/unicore32/include/asm/io.h + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __UNICORE_IO_H__ +#define __UNICORE_IO_H__ + +#ifdef __KERNEL__ + +#include <linux/types.h> +#include <asm/byteorder.h> +#include <asm/memory.h> +#include <asm/system.h> + +/* + * IO port access primitives + * ------------------------- + * + * The UniCore doesn't have special IO access instructions; all IO is memory + * mapped. Note that these are defined to perform little endian accesses + * only. Their primary purpose is to access PCI peripherals. + * + * Note that we prevent GCC re-ordering or caching values in expressions + * by introducing sequence points into the in*() definitions. Note that + * __raw_* do not guarantee this behaviour. + * + * The {in,out}[bwl] macros are for emulating x86-style PCI IO space. + */ +extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen); +extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen); +extern void __raw_writesl(void __iomem *addr, const void *data, int longlen); + +extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen); +extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); +extern void __raw_readsl(const void __iomem *addr, void *data, int longlen); + +#define outsb(p, d, l) __raw_writesb((void __iomem *)p, d, l) +#define outsw(p, d, l) __raw_writesw((void __iomem *)p, d, l) +#define outsl(p, d, l) __raw_writesl((void __iomem *)p, d, l) + +#define insb(p, d, l) __raw_readsb((void __iomem *)p, d, l) +#define insw(p, d, l) __raw_readsw((void __iomem *)p, d, l) +#define insl(p, d, l) __raw_readsl((void __iomem *)p, d, l) + +#include <asm-generic/io.h> + +/* + * __uc32_ioremap and __uc32_ioremap_cached takes CPU physical address. + */ +extern void __iomem *__uc32_ioremap(unsigned long, size_t); +extern void __iomem *__uc32_ioremap_cached(unsigned long, size_t); +extern void __uc32_iounmap(volatile void __iomem *addr); + +/* + * ioremap and friends. + * + * ioremap takes a PCI memory address, as specified in + * Documentation/IO-mapping.txt. + * + */ +#define ioremap(cookie, size) __uc32_ioremap(cookie, size) +#define ioremap_cached(cookie, size) __uc32_ioremap_cached(cookie, size) +#define iounmap(cookie) __uc32_iounmap(cookie) + +extern void __iomem *ioport_map(unsigned long port, unsigned int nr); +extern void ioport_unmap(void __iomem *addr); + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#undef xlate_dev_mem_ptr +#define xlate_dev_mem_ptr(p) __va(p) + +#endif /* __KERNEL__ */ +#endif /* __UNICORE_IO_H__ */ diff --git a/arch/unicore32/lib/io-readsb.S b/arch/unicore32/lib/io-readsb.S new file mode 100644 index 0000000..ff85be3 --- /dev/null +++ b/arch/unicore32/lib/io-readsb.S @@ -0,0 +1,130 @@ +/* + * linux/arch/unicore32/lib/io-readsb.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +.Linsb_align: rsub ip, ip, #4 + csub.a ip, r2 + cmovsg ip, r2 + csub.a ip, #2 + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bsl 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bel 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 +201: + sub.a r2, r2, ip + bne .Linsb_aligned + +ENTRY(__raw_readsb) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne .Linsb_align + +.Linsb_aligned: + + sub.a r2, r2, #16 + bfs .Linsb_no_16 + +.Linsb_16_lp: ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + mov r3, r3 put_byte_0 + ldb r6, [r0] + or r3, r3, r4 put_byte_1 + ldb r4, [r0] + or r3, r3, r5 put_byte_2 + ldb r5, [r0] + or r3, r3, r6 put_byte_3 + ldb r6, [r0] + mov r4, r4 put_byte_0 + ldb ip, [r0] + or r4, r4, r5 put_byte_1 + ldb r5, [r0] + or r4, r4, r6 put_byte_2 + ldb r6, [r0] + or r4, r4, ip put_byte_3 + ldb ip, [r0] + mov r5, r5 put_byte_0 + ldb r15, [r0] + or r5, r5, r6 put_byte_1 + ldb r6, [r0] + or r5, r5, ip put_byte_2 + ldb ip, [r0] + or r5, r5, r15 put_byte_3 + ldb r15, [r0] + mov r6, r6 put_byte_0 + or r6, r6, ip put_byte_1 + ldb ip, [r0] + or r6, r6, r15 put_byte_2 + or r6, r6, ip put_byte_3 + stm.w (r3 - r6), [r1]+ + + sub.a r2, r2, #16 + bns .Linsb_16_lp + + cand.a r2, #15 + cmoveq pc, lr + +.Linsb_no_16: cand.a r2, #8 + beq .Linsb_no_8 + + ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + mov r3, r3 put_byte_0 + ldb r6, [r0] + or r3, r3, r4 put_byte_1 + ldb r4, [r0] + or r3, r3, r5 put_byte_2 + ldb r5, [r0] + or r3, r3, r6 put_byte_3 + ldb r6, [r0] + mov r4, r4 put_byte_0 + ldb ip, [r0] + or r4, r4, r5 put_byte_1 + or r4, r4, r6 put_byte_2 + or r4, r4, ip put_byte_3 + stm.w (r3, r4), [r1]+ + +.Linsb_no_8: cand.a r2, #4 + beq .Linsb_no_4 + + ldb r3, [r0] + ldb r4, [r0] + ldb r5, [r0] + ldb r6, [r0] + mov r3, r3 put_byte_0 + or r3, r3, r4 put_byte_1 + or r3, r3, r5 put_byte_2 + or r3, r3, r6 put_byte_3 + stw.w r3, [r1]+, #4 + +.Linsb_no_4: and.a r2, r2, #3 + cmoveq pc, lr + + csub.a r2, #2 + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bsl 201f + ldb r3, [r0] + stb.w r3, [r1]+, #1 + bel 201f + ldb r3, [r0] + stb r3, [r1] +201: + mov pc, lr +ENDPROC(__raw_readsb) diff --git a/arch/unicore32/lib/io-readsl.S b/arch/unicore32/lib/io-readsl.S new file mode 100644 index 0000000..980b0fc --- /dev/null +++ b/arch/unicore32/lib/io-readsl.S @@ -0,0 +1,83 @@ +/* + * linux/arch/unicore32/lib/io-readsl.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +ENTRY(__raw_readsl) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne 3f + + sub.a r2, r2, #4 + bfs 2f +1: ldw r3, [r0+], #0 + ldw r4, [r0+], #0 + ldw r14, [r0+], #0 + ldw r15, [r0+], #0 + sub.a r2, r2, #4 + stm.w (r3, r4, r14, r15), [r1]+ + bns 1b +2: mov.a r2, r2 << #31 + bub 201f + ldw r3, [r0+], #0 + ldw r14, [r0+], #0 + stm.w (r3, r14), [r1]+ +201: beq 202f + ldw r3, [r0+], #0 + stw r3, [r1+], #0 +202: + mov pc, lr + +3: ldw r3, [r0] + csub.a ip, #2 + mov ip, r3 get_byte_0 + stb.w ip, [r1]+, #1 + bsg 6f + mov ip, r3 get_byte_1 + stb.w ip, [r1]+, #1 + beq 5f + mov ip, r3 get_byte_2 + stb.w ip, [r1]+, #1 + +4: sub.a r2, r2, #1 + mov ip, r3 pull #24 + beq 8f + ldw r3, [r0] + or ip, ip, r3 push #8 + stw.w ip, [r1]+, #4 + b 4b + +5: sub.a r2, r2, #1 + mov ip, r3 pull #16 + beq 7f + ldw r3, [r0] + or ip, ip, r3 push #16 + stw.w ip, [r1]+, #4 + b 5b + +6: sub.a r2, r2, #1 + mov ip, r3 pull #8 + beq 201f + ldw r3, [r0] + or ip, ip, r3 push #24 + stw.w ip, [r1]+, #4 + b 6b +201: + mov r3, ip get_byte_2 + stb r3, [r1+], #2 +7: mov r3, ip get_byte_1 + stb r3, [r1+], #1 +8: mov r3, ip get_byte_0 + stb r3, [r1+], #0 + mov pc, lr +ENDPROC(__raw_readsl) diff --git a/arch/unicore32/lib/io-readsw.S b/arch/unicore32/lib/io-readsw.S new file mode 100644 index 0000000..7d0b49d --- /dev/null +++ b/arch/unicore32/lib/io-readsw.S @@ -0,0 +1,110 @@ +/* + * linux/arch/unicore32/lib/io-readsw.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro pack, rd, hw1, hw2 + or \rd, \hw1, \hw2 << #16 + .endm + +.Linsw_align: mov.a ip, r1 << #31 + bne .Linsw_noalign + ldh ip, [r0] + sub r2, r2, #1 + sth.w ip, [r1]+, #2 + +ENTRY(__raw_readsw) + cxor.a r2, #0 + cmoveq pc, lr + cand.a r1, #3 + bne .Linsw_align + + sub.a r2, r2, #8 + bfs .Lno_insw_8 + +.Linsw_8_lp: ldh r3, [r0] + ldh r4, [r0] + pack r3, r3, r4 + + ldh r4, [r0] + ldh r5, [r0] + pack r4, r4, r5 + + ldh r5, [r0] + ldh ip, [r0] + pack r5, r5, ip + + ldh ip, [r0] + ldh r15, [r0] + pack ip, ip, r15 + + sub.a r2, r2, #8 + stm.w (r3 - r5), [r1]+ + stm.w (ip), [r1]+ + bns .Linsw_8_lp + +.Lno_insw_8: cand.a r2, #4 + beq .Lno_insw_4 + + ldh r3, [r0] + ldh r4, [r0] + pack r3, r3, r4 + + ldh r4, [r0] + ldh ip, [r0] + pack r4, r4, ip + + stm.w (r3, r4), [r1]+ + +.Lno_insw_4: mov.a r2, r2 << #31 + bub .Lno_insw_2 + + ldh r3, [r0] + ldh ip, [r0] + pack r3, r3, ip + stw.w r3, [r1]+, #4 + +.Lno_insw_2: cmoveq pc, lr + ldh r3, [r0] + sth r3, [r1] + mov pc, lr + +.Linsw_noalign: bea 201f + ldb.w ip, [r1+], #-1 + b 1f +201: + ldh ip, [r0] + sub r2, r2, #1 + stb.w ip, [r1]+, #1 + mov ip, ip >> #8 + +1: sub.a r2, r2, #2 + bfs 3f + +2: ldh r3, [r0] + ldh r4, [r0] + sub.a r2, r2, #2 + or ip, ip, r3 << #8 + or ip, ip, r4 << #24 + stw.w ip, [r1]+, #4 + mov ip, r4 >> #8 + bns 2b + +3: cand.a r2, #1 + stb.w ip, [r1]+, #1 + cmoveq pc, lr + ldh ip, [r0] + stb.w ip, [r1]+, #1 + mov ip, ip >> #8 + stb ip, [r1] + mov pc, lr +ENDPROC(__raw_readsw) diff --git a/arch/unicore32/lib/io-writesb.S b/arch/unicore32/lib/io-writesb.S new file mode 100644 index 0000000..bfcb91e --- /dev/null +++ b/arch/unicore32/lib/io-writesb.S @@ -0,0 +1,90 @@ +/* + * linux/arch/unicore32/lib/io-writesb.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro outword, rd + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + mov \rd, \rd >> #8 + stb \rd, [r0] + .endm + +.Loutsb_align: rsub ip, ip, #4 + csub.a ip, r2 + cmovsg ip, r2 + csub.a ip, #2 + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bsl 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bel 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] +201: + sub.a r2, r2, ip + bne .Loutsb_aligned + +ENTRY(__raw_writesb) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne .Loutsb_align + +.Loutsb_aligned: + + sub.a r2, r2, #16 + bfs .Loutsb_no_16 + +.Loutsb_16_lp: ldm.w (r3, r4, r5, r14), [r1]+ + outword r3 + outword r4 + outword r5 + outword r14 + sub.a r2, r2, #16 + bns .Loutsb_16_lp + + cand.a r2, #15 + cmoveq pc, lr + +.Loutsb_no_16: cand.a r2, #8 + beq .Loutsb_no_8 + + ldm.w (r3, r4), [r1]+ + outword r3 + outword r4 + +.Loutsb_no_8: cand.a r2, #4 + beq .Loutsb_no_4 + + ldw.w r3, [r1]+, #4 + outword r3 + +.Loutsb_no_4: and.a r2, r2, #3 + cmoveq pc, lr + + csub.a r2, #2 + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bsl 201f + ldb.w r3, [r1]+, #1 + stb r3, [r0] + bel 201f + ldb r3, [r1] + stb r3, [r0] +201: + mov pc, lr +ENDPROC(__raw_writesb) diff --git a/arch/unicore32/lib/io-writesl.S b/arch/unicore32/lib/io-writesl.S new file mode 100644 index 0000000..a880b47 --- /dev/null +++ b/arch/unicore32/lib/io-writesl.S @@ -0,0 +1,69 @@ +/* + * linux/arch/unicore32/lib/io-writesl.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + +ENTRY(__raw_writesl) + cxor.a r2, #0 @ do we have to check for the zero len? + cmoveq pc, lr + and.a ip, r1, #3 + bne 3f + + sub.a r2, r2, #4 + bfs 2f +1: ldm.w (r3, r4, r14, r15), [r1]+ + sub.a r2, r2, #4 + stw r3, [r0+], #0 + stw r4, [r0+], #0 + stw r14, [r0+], #0 + stw r15, [r0+], #0 + bns 1b +2: mov.a r2, r2 << #31 + bub 201f + ldm.w (r3, r14), [r1]+ + stw r3, [r0+], #0 + stw r14, [r0+], #0 +201: cmoveq pc, lr + ldw r3, [r1+], #0 + stw r3, [r0+], #0 + mov pc, lr + +3: andn r1, r1, #3 + ldw.w r3, [r1]+, #4 + csub.a ip, #2 + bsl 5f + bsg 6f + +4: mov ip, r3 pull #16 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #16 + stw ip, [r0] + bne 4b + mov pc, lr + +5: mov ip, r3 pull #8 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #24 + stw ip, [r0] + bne 5b + mov pc, lr + +6: mov ip, r3 pull #24 + ldw.w r3, [r1]+, #4 + sub.a r2, r2, #1 + or ip, ip, r3 push #8 + stw ip, [r0] + bne 6b + mov pc, lr +ENDPROC(__raw_writesl) diff --git a/arch/unicore32/lib/io-writesw.S b/arch/unicore32/lib/io-writesw.S new file mode 100644 index 0000000..23e1f16 --- /dev/null +++ b/arch/unicore32/lib/io-writesw.S @@ -0,0 +1,87 @@ +/* + * linux/arch/unicore32/lib/io-writesw.S + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/linkage.h> +#include <asm/assembler.h> + + .macro outword, rd + sth \rd, [r0] + mov \rd, \rd >> #16 + sth \rd, [r0] + .endm + +.Loutsw_align: mov.a ip, r1 << #31 + bne .Loutsw_noalign + + ldh.w r3, [r1]+, #2 + sub r2, r2, #1 + sth r3, [r0] + +ENTRY(__raw_writesw) + cxor.a r2, #0 + cmoveq pc, lr + and.a r3, r1, #3 + bne .Loutsw_align + + sub.a r2, r2, #8 + bfs .Lno_outsw_8 + +.Loutsw_8_lp: ldm.w (r3, r4, r5, r14), [r1]+ + sub.a r2, r2, #8 + outword r3 + outword r4 + outword r5 + outword r14 + bns .Loutsw_8_lp + +.Lno_outsw_8: cand.a r2, #4 + beq .Lno_outsw_4 + + ldm.w (r3, r14), [r1]+ + outword r3 + outword r14 + +.Lno_outsw_4: mov.a r2, r2 << #31 + bub .Lno_outsw_2 + + ldw.w r3, [r1]+, #4 + outword r3 + +.Lno_outsw_2: cmoveq pc, lr + ldh r3, [r1] + sth r3, [r0] + + mov pc, lr + +.Loutsw_noalign: + ldw.w r3, [r1-], r3 + bub 201f + sub r2, r2, #1 + b 2f +201: + sub.a r2, r2, #2 + bfs 3f + +1: mov ip, r3 >> #8 + sth ip, [r0] +2: mov ip, r3 >> #24 + ldw.w r3, [r1+], #4 + sub.a r2, r2, #2 + or ip, ip, r3 << #8 + sth ip, [r0] + bns 1b + + cand.a r2, #1 +3: cmoveq pc, lr + mov ip, r3 >> #8 + sth ip, [r0] + mov pc, lr +ENDPROC(__raw_writesw)
next reply other threads:[~2011-01-03 11:52 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-01-03 11:52 Guan Xuetao [this message] 2011-01-03 11:52 ` [PATCHv1 5/8] unicore32 additional architecture files: low-level lib: io Guan Xuetao 2011-01-25 16:22 ` Arnd Bergmann
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='012d01cbab3c$b180b220$14821660$@mprc.pku.edu.cn' \ --to=guanxuetao@mprc.pku.edu.cn \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.