summaryrefslogtreecommitdiff
path: root/libcpu
diff options
context:
space:
mode:
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/mips/common/cache.c114
-rw-r--r--libcpu/mips/common/mips.h39
-rw-r--r--libcpu/mips/common/mips_addrspace.h207
-rw-r--r--libcpu/mips/common/mips_asm.h447
-rw-r--r--libcpu/mips/common/mips_cache.c153
-rw-r--r--libcpu/mips/common/mips_cache.h234
-rw-r--r--libcpu/mips/common/mips_cfg.h48
-rw-r--r--libcpu/mips/common/mips_context.h280
-rw-r--r--libcpu/mips/common/mips_def.h2310
-rw-r--r--libcpu/mips/common/mips_excpt.h39
-rw-r--r--libcpu/mips/common/mips_regs.h1168
-rw-r--r--libcpu/mips/common/mips_types.h118
-rw-r--r--libcpu/mips/x1000/cache.c217
-rw-r--r--libcpu/mips/x1000/cache.h41
-rw-r--r--libcpu/mips/x1000/cpu.c131
-rw-r--r--libcpu/mips/x1000/interrupt.c215
-rw-r--r--libcpu/mips/x1000/mips_backtrace.c208
-rw-r--r--libcpu/mips/x1000/mips_cache_gcc.S62
-rw-r--r--libcpu/mips/x1000/mips_context_gcc.S95
-rw-r--r--libcpu/mips/x1000/mips_excpt.c382
-rw-r--r--libcpu/mips/x1000/mips_excpt_gcc.S102
-rw-r--r--libcpu/mips/x1000/mips_fp_gcc.S197
-rw-r--r--libcpu/mips/x1000/stack.c82
-rw-r--r--libcpu/mips/x1000/startup_gcc.S328
-rw-r--r--libcpu/mips/x1000/x1000.h284
-rw-r--r--libcpu/mips/x1000/x1000_aic.h794
-rw-r--r--libcpu/mips/x1000/x1000_cpm.h511
-rw-r--r--libcpu/mips/x1000/x1000_intc.h120
-rw-r--r--libcpu/mips/x1000/x1000_otg_dwc.h306
-rw-r--r--libcpu/mips/x1000/x1000_slcdc.h463
30 files changed, 9581 insertions, 114 deletions
diff --git a/libcpu/mips/common/cache.c b/libcpu/mips/common/cache.c
deleted file mode 100644
index e5a9945e3e..0000000000
--- a/libcpu/mips/common/cache.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * File : cache.c
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2010, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2010-05-17 swkyer first version
- */
-#include <rtthread.h>
-#include "mipscfg.h"
-#include "cache.h"
-
-
-extern void cache_init(rt_ubase_t cache_size, rt_ubase_t cache_line_size);
-void r4k_cache_init(void)
-{
- cache_init(dcache_size, cpu_dcache_line_size());
-}
-
-void r4k_cache_flush_all(void)
-{
- blast_dcache16();
- blast_icache16();
-}
-
-void r4k_icache_flush_all(void)
-{
- blast_icache16();
-}
-
-void r4k_icache_flush_range(rt_ubase_t addr, rt_ubase_t size)
-{
- rt_ubase_t end, a;
-
- if (size > icache_size)
- {
- blast_icache16();
- }
- else
- {
- rt_ubase_t ic_lsize = cpu_icache_line_size();
-
- a = addr & ~(ic_lsize - 1);
- end = ((addr + size) - 1) & ~(ic_lsize - 1);
- while (1)
- {
- flush_icache_line(a);
- if (a == end)
- break;
- a += ic_lsize;
- }
- }
-}
-
-void r4k_icache_lock_range(rt_ubase_t addr, rt_ubase_t size)
-{
- rt_ubase_t end, a;
- rt_ubase_t ic_lsize = cpu_icache_line_size();
-
- a = addr & ~(ic_lsize - 1);
- end = ((addr + size) - 1) & ~(ic_lsize - 1);
- while (1)
- {
- lock_icache_line(a);
- if (a == end)
- break;
- a += ic_lsize;
- }
-}
-
-void r4k_dcache_inv(rt_ubase_t addr, rt_ubase_t size)
-{
- rt_ubase_t end, a;
- rt_ubase_t dc_lsize = cpu_dcache_line_size();
-
- a = addr & ~(dc_lsize - 1);
- end = ((addr + size) - 1) & ~(dc_lsize - 1);
- while (1)
- {
- invalidate_dcache_line(a);
- if (a == end)
- break;
- a += dc_lsize;
- }
-}
-
-void r4k_dcache_wback_inv(rt_ubase_t addr, rt_ubase_t size)
-{
- rt_ubase_t end, a;
-
- if (size >= dcache_size)
- {
- blast_dcache16();
- }
- else
- {
- rt_ubase_t dc_lsize = cpu_dcache_line_size();
-
- a = addr & ~(dc_lsize - 1);
- end = ((addr + size) - 1) & ~(dc_lsize - 1);
- while (1)
- {
- flush_dcache_line(a);
- if (a == end)
- break;
- a += dc_lsize;
- }
- }
-}
diff --git a/libcpu/mips/common/mips.h b/libcpu/mips/common/mips.h
new file mode 100644
index 0000000000..6a9811ae7e
--- /dev/null
+++ b/libcpu/mips/common/mips.h
@@ -0,0 +1,39 @@
+/*
+ * File : mips.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _COMMON_MIPS_H_
+#define _COMMON_MIPS_H_
+
+#include "mips_cfg.h"
+
+#include "mips_types.h"
+#include "mips_asm.h"
+#include "mips_def.h"
+#include "mips_regs.h"
+#include "mips_addrspace.h"
+#include "mips_cache.h"
+#include "mips_context.h"
+#include "mips_excpt.h"
+
+#endif /* _COMMON_MIPS_H_ */
diff --git a/libcpu/mips/common/mips_addrspace.h b/libcpu/mips/common/mips_addrspace.h
new file mode 100644
index 0000000000..3b82a4e371
--- /dev/null
+++ b/libcpu/mips/common/mips_addrspace.h
@@ -0,0 +1,207 @@
+/*
+ * File : mips_addrspace.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��12�� Urey the first version
+ */
+
+#ifndef _MIPS_ADDRSPACE_H_
+#define _MIPS_ADDRSPACE_H_
+
+
+/*
+ * Configure language
+ */
+#ifdef __ASSEMBLY__
+#define _ATYPE_
+#define _ATYPE32_
+#define _ATYPE64_
+#define _CONST64_(x) x
+#else
+#define _ATYPE_ __PTRDIFF_TYPE__
+#define _ATYPE32_ int
+#define _ATYPE64_ __s64
+#ifdef CONFIG_64BIT
+#define _CONST64_(x) x ## L
+#else
+#define _CONST64_(x) x ## LL
+#endif
+#endif
+
+/*
+ * 32-bit MIPS address spaces
+ */
+#ifdef __ASSEMBLY__
+#define _ACAST32_
+#define _ACAST64_
+#else
+#define _ACAST32_ (_ATYPE_)(_ATYPE32_) /* widen if necessary */
+#define _ACAST64_ (_ATYPE64_) /* do _not_ narrow */
+#endif
+
+/*
+ * Returns the kernel segment base of a given address
+ */
+#define KSEGX(a) ((_ACAST32_ (a)) & 0xe0000000)
+
+/*
+ * Returns the physical address of a CKSEGx / XKPHYS address
+ */
+#define CPHYSADDR(a) ((_ACAST32_(a)) & 0x1fffffff)
+#define XPHYSADDR(a) ((_ACAST64_(a)) & \
+ _CONST64_(0x000000ffffffffff))
+
+#ifdef CONFIG_64BIT
+
+/*
+ * Memory segments (64bit kernel mode addresses)
+ * The compatibility segments use the full 64-bit sign extended value. Note
+ * the R8000 doesn't have them so don't reference these in generic MIPS code.
+ */
+#define XKUSEG _CONST64_(0x0000000000000000)
+#define XKSSEG _CONST64_(0x4000000000000000)
+#define XKPHYS _CONST64_(0x8000000000000000)
+#define XKSEG _CONST64_(0xc000000000000000)
+#define CKSEG0 _CONST64_(0xffffffff80000000)
+#define CKSEG1 _CONST64_(0xffffffffa0000000)
+#define CKSSEG _CONST64_(0xffffffffc0000000)
+#define CKSEG3 _CONST64_(0xffffffffe0000000)
+
+#define CKSEG0ADDR(a) (CPHYSADDR(a) | CKSEG0)
+#define CKSEG1ADDR(a) (CPHYSADDR(a) | CKSEG1)
+#define CKSEG2ADDR(a) (CPHYSADDR(a) | CKSEG2)
+#define CKSEG3ADDR(a) (CPHYSADDR(a) | CKSEG3)
+
+#else
+
+#define CKSEG0ADDR(a) (CPHYSADDR(a) | KSEG0BASE)
+#define CKSEG1ADDR(a) (CPHYSADDR(a) | KSEG1BASE)
+#define CKSEG2ADDR(a) (CPHYSADDR(a) | KSEG2BASE)
+#define CKSEG3ADDR(a) (CPHYSADDR(a) | KSEG3BASE)
+
+/*
+ * Map an address to a certain kernel segment
+ */
+#define KSEG0ADDR(a) (CPHYSADDR(a) | KSEG0BASE)
+#define KSEG1ADDR(a) (CPHYSADDR(a) | KSEG1BASE)
+#define KSEG2ADDR(a) (CPHYSADDR(a) | KSEG2BASE)
+#define KSEG3ADDR(a) (CPHYSADDR(a) | KSEG3BASE)
+
+/*
+ * Memory segments (32bit kernel mode addresses)
+ * These are the traditional names used in the 32-bit universe.
+ */
+//#define KUSEGBASE 0x00000000
+//#define KSEG0BASE 0x80000000
+//#define KSEG1BASE 0xa0000000
+//#define KSEG2BASE 0xc0000000
+//#define KSEG3BASE 0xe0000000
+
+#define CKUSEG 0x00000000
+#define CKSEG0 0x80000000
+#define CKSEG1 0xa0000000
+#define CKSEG2 0xc0000000
+#define CKSEG3 0xe0000000
+
+#endif
+
+/*
+ * Cache modes for XKPHYS address conversion macros
+ */
+#define K_CALG_COH_EXCL1_NOL2 0
+#define K_CALG_COH_SHRL1_NOL2 1
+#define K_CALG_UNCACHED 2
+#define K_CALG_NONCOHERENT 3
+#define K_CALG_COH_EXCL 4
+#define K_CALG_COH_SHAREABLE 5
+#define K_CALG_NOTUSED 6
+#define K_CALG_UNCACHED_ACCEL 7
+
+/*
+ * 64-bit address conversions
+ */
+#define PHYS_TO_XKSEG_UNCACHED(p) PHYS_TO_XKPHYS(K_CALG_UNCACHED, (p))
+#define PHYS_TO_XKSEG_CACHED(p) PHYS_TO_XKPHYS(K_CALG_COH_SHAREABLE, (p))
+#define XKPHYS_TO_PHYS(p) ((p) & TO_PHYS_MASK)
+#define PHYS_TO_XKPHYS(cm, a) (_CONST64_(0x8000000000000000) | \
+ (_CONST64_(cm) << 59) | (a))
+
+/*
+ * Returns the uncached address of a sdram address
+ */
+#ifndef __ASSEMBLY__
+#if defined(CONFIG_SOC_AU1X00) || defined(CONFIG_TB0229)
+/* We use a 36 bit physical address map here and
+ cannot access physical memory directly from core */
+#define UNCACHED_SDRAM(a) (((unsigned long)(a)) | 0x20000000)
+#else /* !CONFIG_SOC_AU1X00 */
+#define UNCACHED_SDRAM(a) CKSEG1ADDR(a)
+#endif /* CONFIG_SOC_AU1X00 */
+#endif /* __ASSEMBLY__ */
+
+/*
+ * The ultimate limited of the 64-bit MIPS architecture: 2 bits for selecting
+ * the region, 3 bits for the CCA mode. This leaves 59 bits of which the
+ * R8000 implements most with its 48-bit physical address space.
+ */
+#define TO_PHYS_MASK _CONST64_(0x07ffffffffffffff) /* 2^^59 - 1 */
+
+#ifndef CONFIG_CPU_R8000
+
+/*
+ * The R8000 doesn't have the 32-bit compat spaces so we don't define them
+ * in order to catch bugs in the source code.
+ */
+
+#define COMPAT_K1BASE32 _CONST64_(0xffffffffa0000000)
+#define PHYS_TO_COMPATK1(x) ((x) | COMPAT_K1BASE32) /* 32-bit compat k1 */
+
+#endif
+
+#define KDM_TO_PHYS(x) (_ACAST64_ (x) & TO_PHYS_MASK)
+#define PHYS_TO_K0(x) (_ACAST64_ (x) | CAC_BASE)
+
+
+#ifndef __ASSEMBLY__
+/*
+ * Change virtual addresses to physical addresses and vv.
+ * These are trivial on the 1:1 Linux/MIPS mapping
+ */
+static inline phys_addr_t virt_to_phys(volatile void * address)
+{
+#ifndef CONFIG_64BIT
+ return CPHYSADDR(address);
+#else
+ return XPHYSADDR(address);
+#endif
+}
+
+static inline void * phys_to_virt(unsigned long address)
+{
+#ifndef CONFIG_64BIT
+ return (void *)KSEG0ADDR(address);
+#else
+ return (void *)CKSEG0ADDR(address);
+#endif
+}
+#endif
+
+
+#endif /* _MIPS_ADDRSPACE_H_ */
diff --git a/libcpu/mips/common/mips_asm.h b/libcpu/mips/common/mips_asm.h
new file mode 100644
index 0000000000..8f97e370ab
--- /dev/null
+++ b/libcpu/mips/common/mips_asm.h
@@ -0,0 +1,447 @@
+/*
+ * File : mips_asm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _MIPS_ASM_H_
+#define _MIPS_ASM_H_
+
+
+/* ********************************************************************* */
+/* Interface macro & data definition */
+
+#ifdef __ASSEMBLY__
+
+/******** ASSEMBLER SPECIFIC DEFINITIONS ********/
+
+#ifdef __ghs__
+#define ALIGN(x) .##align (1 << (x))
+#else
+#define ALIGN(x) .##align (x)
+#endif
+
+#ifdef __ghs__
+#define SET_MIPS3()
+#define SET_MIPS0()
+#define SET_PUSH()
+#define SET_POP()
+#else
+#define SET_MIPS3() .##set mips3
+#define SET_MIPS0() .##set mips0
+#define SET_PUSH() .##set push
+#define SET_POP() .##set pop
+#endif
+
+/* Different assemblers have different requirements for how to
+ * indicate that the next section is bss :
+ *
+ * Some use : .bss
+ * Others use : .section bss
+ *
+ * We select which to use based on _BSS_OLD_, which may be defined
+ * in makefile.
+ */
+#ifdef _BSS_OLD_
+#define BSS .##section bss
+#else
+#define BSS .##bss
+#endif
+
+#define LEAF(name)\
+ .##text;\
+ .##globl name;\
+ .##ent name;\
+name:
+
+
+#define SLEAF(name)\
+ .##text;\
+ .##ent name;\
+name:
+
+
+#ifdef __ghs__
+#define END(name)\
+ .##end name
+#else
+#define END(name)\
+ .##size name,.-name;\
+ .##end name
+#endif
+
+
+#define EXTERN(name)
+
+#else
+
+#define U64 unsigned long long
+#define U32 unsigned int
+#define U16 unsigned short
+#define U8 unsigned char
+#define S64 signed long long
+#define S32 int
+#define S16 short int
+#define S8 signed char
+//#define bool U8
+
+#ifndef _SIZE_T_
+#define _SIZE_T_
+#ifdef __ghs__
+ typedef unsigned int size_t;
+#else
+ typedef unsigned long size_t;
+#endif
+#endif
+
+/* Sets the result on bPort */
+#define BIT_SET(bPort,bBitMask) (bPort |= bBitMask)
+#define BIT_CLR(bPort,bBitMask) (bPort &= ~bBitMask)
+
+/* Returns the result */
+#define GET_BIT_SET(bPort,bBitMask) (bPort | bBitMask)
+#define GET_BIT_CLR(bPort,bBitMask) (bPort & ~bBitMask)
+
+/* Returns 0 if the condition is False & a non-zero value if it is True */
+#define TEST_BIT_SET(bPort,bBitMask) (bPort & bBitMask)
+#define TEST_BIT_CLR(bPort,bBitMask) ((~bPort) & bBitMask)
+
+/* Split union definitions */
+typedef union tunSU16
+{
+ U16 hwHW;
+ struct tst2U8
+ {
+ U8 bB0;
+ U8 bB1;
+ }st2U8;
+}tunSU16;
+
+typedef union tunSU32
+{
+ U32 wW;
+ struct tst2U16
+ {
+ U16 hwHW0;
+ U16 hwHW1;
+ }st2U16;
+ struct tst4U8
+ {
+ U8 bB0;
+ U8 bB1;
+ U8 bB2;
+ U8 bB3;
+ }st4U8;
+}tunSU32;
+
+#endif /* #ifdef __ASSEMBLY__ */
+
+
+/******** DEFINITIONS FOR BOTH ASSEMBLER AND C ********/
+
+
+#define NO_ERR 0x00000000 /* operation completed successfully */
+#define ERR 0xffffffff /* operation completed not successfully */
+
+#define False 0
+#define True !False
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif//NULL
+
+#ifndef MIN
+#define MIN(x,y) ((x) < (y) ? (x) : (y))
+#endif//MIN
+
+#ifndef MAX
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+#endif//MAX
+
+#define MAXUINT(w) (\
+ ((w) == sizeof(U8)) ? 0xFFU :\
+ ((w) == sizeof(U16)) ? 0xFFFFU :\
+ ((w) == sizeof(U32)) ? 0xFFFFFFFFU : 0\
+ )
+
+#define MAXINT(w) (\
+ ((w) == sizeof(S8)) ? 0x7F :\
+ ((w) == sizeof(S16)) ? 0x7FFF :\
+ ((w) == sizeof(S32)) ? 0x7FFFFFFF : 0\
+ )
+
+#define MSK(n) ((1 << (n)) - 1)
+
+#define KUSEG_MSK 0x80000000
+#define KSEG_MSK 0xE0000000
+
+#define KUSEGBASE 0x00000000
+#define KSEG0BASE 0x80000000
+#define KSEG1BASE 0xA0000000
+#define KSSEGBASE 0xC0000000
+#define KSEG3BASE 0xE0000000
+
+/* Below macros perform the following functions :
+ *
+ * KSEG0 : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG0.
+ * KSEG1 : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG1.
+ * PHYS : Converts KSEG0/1 or physical addr (below 0.5GB) to physical address.
+ * KSSEG : Not relevant for converting, but used for determining range.
+ * KSEG3 : Not relevant for converting, but used for determining range.
+ * KUSEG : Not relevant for converting, but used for determining range.
+ * KSEG0A : Same as KSEG0 but operates on register rather than constant.
+ * KSEG1A : Same as KSEG1 but operates on register rather than constant.
+ * PHYSA : Same as PHYS but operates on register rather than constant.
+ * CACHED : Alias for KSEG0 macro .
+ * (Note that KSEG0 cache attribute is determined by K0
+ * field of Config register, but this is typically cached).
+ * UNCACHED : Alias for KSEG1 macro .
+ */
+#ifdef __ASSEMBLY__
+#define KSEG0(addr) (((addr) & ~KSEG_MSK) | KSEG0BASE)
+#define KSEG1(addr) (((addr) & ~KSEG_MSK) | KSEG1BASE)
+#define KSSEG(addr) (((addr) & ~KSEG_MSK) | KSSEGBASE)
+#define KSEG3(addr) (((addr) & ~KSEG_MSK) | KSEG3BASE)
+#define KUSEG(addr) (((addr) & ~KUSEG_MSK) | KUSEGBASE)
+#define PHYS(addr) ( (addr) & ~KSEG_MSK)
+#define KSEG0A(reg) and reg, ~KSEG_MSK; or reg, KSEG0BASE
+#define KSEG1A(reg) and reg, ~KSEG_MSK; or reg, KSEG1BASE
+#define PHYSA(reg) and reg, ~KSEG_MSK
+#else
+#define KSEG0(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG0BASE)
+#define KSEG1(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG1BASE)
+#define KSSEG(addr) (((U32)(addr) & ~KSEG_MSK) | KSSEGBASE)
+#define KSEG3(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG3BASE)
+#define KUSEG(addr) (((U32)(addr) & ~KUSEG_MSK) | KUSEGBASE)
+#define PHYS(addr) ((U32)(addr) & ~KSEG_MSK)
+#endif
+
+#define CACHED(addr) KSEG0(addr)
+#define UNCACHED(addr) KSEG1(addr)
+
+
+#ifdef __ASSEMBLY__
+/* Macroes to access variables at constant addresses
+ * Compensates for signed 16 bit displacement
+ * Typical use: li a0, HIKSEG1(ATLAS_ASCIIWORD)
+ * sw v1, LO_OFFS(ATLAS_ASCIIWORD)(a0)
+ */
+#define HIKSEG0(addr) ((KSEG0(addr) + 0x8000) & 0xffff0000)
+#define HIKSEG1(addr) ((KSEG1(addr) + 0x8000) & 0xffff0000)
+#define HI_PART(addr) (((addr) + 0x8000) & 0xffff0000)
+#define LO_OFFS(addr) ((addr) & 0xffff)
+#endif
+
+
+/* Most/Least significant 32 bit from 64 bit double word */
+#define HI32(data64) ((U32)(data64 >> 32))
+#define LO32(data64) ((U32)(data64 & 0xFFFFFFFF))
+
+#if ((!defined(__ASSEMBLY__)) && (!defined(__LANGUAGE_ASSEMBLY)))
+#define REG8( addr ) (*(volatile U8 *) (addr))
+#define REG16( addr ) (*(volatile U16 *)(addr))
+#define REG32( addr ) (*(volatile U32 *)(addr))
+#define REG64( addr ) (*(volatile U64 *)(addr))
+#endif
+
+/* Register field mapping */
+#define REGFIELD(reg, rfld) (((reg) & rfld##_MSK) >> rfld##_SHF)
+
+/* absolute register address, access */
+#define REGA(addr) REG32(addr)
+
+/* physical register address, access: base address + offsett */
+#define REGP(base,phys) REG32( (U32)(base) + (phys) )
+
+/* relative register address, access: base address + offsett */
+#define REG(base,offs) REG32( (U32)(base) + offs##_##OFS )
+
+/* relative register address, access: base address + offsett */
+#define REG_8(base,offs) REG8( (U32)(base) + offs##_##OFS )
+
+/* relative register address, access: base address + offsett */
+#define REG_16(base,offs) REG16( (U32)(base) + offs##_##OFS )
+
+/* relative register address, access: base address + offsett */
+#define REG_64(base,offs) REG64( (U32)(base) + offs##_##OFS )
+
+/**************************************
+ * Macroes not used by YAMON any more
+ * (kept for backwards compatibility)
+ */
+/* register read field */
+#define REGARD(addr,fld) ((REGA(addr) & addr##_##fld##_##MSK) \
+ >> addr##_##fld##_##SHF)
+
+/* register write numeric field value */
+#define REGAWRI(addr,fld,intval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\
+ | ((intval) << addr##_##fld##_##SHF))
+
+/* register write enumerated field value */
+#define REGAWRE(addr,fld,enumval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\
+ | ((addr##_##fld##_##enumval) << addr##_##fld##_##SHF))
+
+
+/* Examples:
+ *
+ * exccode = REGARD(CPU_CAUSE,EXC);
+ *
+ * REGA(SDR_CONTROL) = REGAWRI(OSG_CONTROL,TMO,17)
+ * | REGAWRE(OSG_CONTROL,DTYPE,PC1);
+ */
+
+
+/* register read field */
+#define REGRD(base,offs,fld) ((REG(base,offs) & offs##_##fld##_##MSK) \
+ >> offs##_##fld##_##SHF)
+
+/* register write numeric field value */
+#define REGWRI(base,offs,fld,intval)((REG(base,offs)& ~(offs##_##fld##_##MSK))\
+ | (((intval) << offs##_##fld##_##SHF) & offs##_##fld##_##MSK))
+
+/* register write enumerated field value */
+#define REGWRE(base,offs,fld,enumval)((REG(base,offs) & ~(offs##_##fld##_##MSK))\
+ | ((offs##_##fld##_##enumval) << offs##_##fld##_##SHF))
+
+
+/* physical register read field */
+#define REGPRD(base,phys,fld) ((REGP(base,phys) & phys##_##fld##_##MSK) \
+ >> phys##_##fld##_##SHF)
+
+/* physical register write numeric field value */
+#define REGPWRI(base,phys,fld,intval)((REGP(base,phys)& ~(phys##_##fld##_##MSK))\
+ | ((intval) << phys##_##fld##_##SHF))
+
+/* physical register write enumerated field value */
+#define REGPWRE(base,phys,fld,enumval)((REGP(base,phys) & ~(phys##_##fld##_##MSK))\
+ | ((phys##_##fld##_##enumval) << phys##_##fld##_##SHF))
+/*
+ * End of macroes not used by YAMON any more
+ *********************************************/
+
+/* Endian related macros */
+
+#define SWAP_BYTEADDR32( addr ) ( (addr) ^ 0x3 )
+#define SWAP_U16ADDR32( addr ) ( (addr) ^ 0x2 )
+
+/* Set byte address to little endian format */
+#ifdef EL
+#define SWAP_BYTEADDR_EL(addr) addr
+#else
+#define SWAP_BYTEADDR_EL(addr) SWAP_BYTEADDR32( addr )
+#endif
+
+/* Set byte address to big endian format */
+#ifdef EB
+#define SWAP_BYTEADDR_EB(addr) addr
+#else
+#define SWAP_BYTEADDR_EB(addr) SWAP_BYTEADDR32( addr )
+#endif
+
+/* Set U16 address to little endian format */
+#ifdef EL
+#define SWAP_U16ADDR_EL(addr) addr
+#else
+#define SWAP_U16ADDR_EL(addr) SWAP_U16ADDR32( addr )
+#endif
+
+/* Set U16 address to big endian format */
+#ifdef EB
+#define SWAP_U16ADDR_EB(addr) addr
+#else
+#define SWAP_U16ADDR_EB(addr) SWAP_U16ADDR32( addr )
+#endif
+
+#ifdef EL
+#define REGW32LE(addr, data) REG32(addr) = (data)
+#define REGR32LE(addr, data) (data) = REG32(addr)
+#else
+#define REGW32LE(addr, data) REG32(addr) = SWAPEND32(data)
+#define REGR32LE(addr, data) (data) = REG32(addr), (data) = SWAPEND32(data)
+#endif
+
+/* Set of 'LE'-macros, convert by BE: */
+#ifdef EL
+#define CPU_TO_LE32( value ) (value)
+#define LE32_TO_CPU( value ) (value)
+
+#define CPU_TO_LE16( value ) (value)
+#define LE16_TO_CPU( value ) (value)
+#else
+#define CPU_TO_LE32( value ) ( ( ((U32)value) << 24) | \
+ ((0x0000FF00UL & ((U32)value)) << 8) | \
+ ((0x00FF0000UL & ((U32)value)) >> 8) | \
+ ( ((U32)value) >> 24) )
+#define LE32_TO_CPU( value ) CPU_TO_LE32( value )
+
+#define CPU_TO_LE16( value ) ( ((U16)(((U16)value) << 8)) | \
+ ((U16)(((U16)value) >> 8)) )
+#define LE16_TO_CPU( value ) CPU_TO_LE16( value )
+#endif
+
+/* Set of 'BE'-macros, convert by LE: */
+#ifdef EB
+#define CPU_TO_BE32( value ) (value)
+#define BE32_TO_CPU( value ) (value)
+
+#define CPU_TO_BE16( value ) (value)
+#define BE16_TO_CPU( value ) (value)
+#else
+#define CPU_TO_BE32( value ) ( ( ((U32)value) << 24) | \
+ ((0x0000FF00UL & ((U32)value)) << 8) | \
+ ((0x00FF0000UL & ((U32)value)) >> 8) | \
+ ( ((U32)value) >> 24) )
+#define BE32_TO_CPU( value ) CPU_TO_BE32( value )
+
+#define CPU_TO_BE16( value ) ( ((U16)(((U16)value) << 8)) | \
+ ((U16)(((U16)value) >> 8)) )
+#define BE16_TO_CPU( value ) CPU_TO_BE16( value )
+#endif
+
+
+/* Control characters */
+#define CTRL_A ('A'-0x40)
+#define CTRL_B ('B'-0x40)
+#define CTRL_C ('C'-0x40)
+#define CTRL_D ('D'-0x40)
+#define CTRL_E ('E'-0x40)
+#define CTRL_F ('F'-0x40)
+#define CTRL_H ('H'-0x40)
+#define CTRL_K ('K'-0x40)
+#define CTRL_N ('N'-0x40)
+#define CTRL_P ('P'-0x40)
+#define CTRL_U ('U'-0x40)
+#define BACKSPACE 0x08
+#define DEL 0x7F
+#define TAB 0x09
+#define CR 0x0D /* Enter Key */
+#define LF 0x0A
+#define ESC 0x1B
+#define SP 0x20
+#define CSI 0x9B
+
+
+/* DEF2STR(x) converts #define symbol to string */
+#define DEF2STR1(x) #x
+#define DEF2STR(x) DEF2STR1(x)
+
+
+#endif /* _MIPS_ASM_H_ */
diff --git a/libcpu/mips/common/mips_cache.c b/libcpu/mips/common/mips_cache.c
new file mode 100644
index 0000000000..1c979b7106
--- /dev/null
+++ b/libcpu/mips/common/mips_cache.c
@@ -0,0 +1,153 @@
+/*
+ * File : mips_cache.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#include <rtthread.h>
+#include "mips.h"
+
+extern void cache_init(rt_ubase_t cache_size, rt_ubase_t cache_line_size);
+void r4k_cache_init(void)
+{
+// cache_init(dcache_size, cpu_dcache_line_size);
+}
+
+void r4k_cache_flush_all(void)
+{
+ blast_dcache16();
+ blast_icache16();
+}
+
+
+void r4k_icache_flush_all(void)
+{
+ blast_icache16();
+}
+
+void r4k_icache_flush_range(rt_ubase_t addr, rt_ubase_t size)
+{
+ rt_ubase_t end, a;
+
+ if (size > g_mips_core.icache_size)
+ {
+ blast_icache16();
+ }
+ else
+ {
+ rt_ubase_t ic_lsize = g_mips_core.icache_line_size;
+
+ a = addr & ~(ic_lsize - 1);
+ end = ((addr + size) - 1) & ~(ic_lsize - 1);
+ while (1)
+ {
+ flush_icache_line(a);
+ if (a == end)
+ break;
+ a += ic_lsize;
+ }
+ }
+}
+
+void r4k_icache_lock_range(rt_ubase_t addr, rt_ubase_t size)
+{
+ rt_ubase_t end, a;
+ rt_ubase_t ic_lsize = g_mips_core.icache_line_size;
+
+ a = addr & ~(ic_lsize - 1);
+ end = ((addr + size) - 1) & ~(ic_lsize - 1);
+ while (1)
+ {
+ lock_icache_line(a);
+ if (a == end)
+ break;
+ a += ic_lsize;
+ }
+}
+
+void r4k_dcache_inv(rt_ubase_t addr, rt_ubase_t size)
+{
+ rt_ubase_t end, a;
+ rt_ubase_t dc_lsize = g_mips_core.dcache_line_size;
+
+ a = addr & ~(dc_lsize - 1);
+ end = ((addr + size) - 1) & ~(dc_lsize - 1);
+ while (1)
+ {
+ invalidate_dcache_line(a);
+ if (a == end)
+ break;
+ a += dc_lsize;
+ }
+}
+
+void r4k_dcache_wback_inv(rt_ubase_t addr, rt_ubase_t size)
+{
+ rt_ubase_t end, a;
+
+ if (size >= g_mips_core.dcache_size)
+ {
+ blast_dcache16();
+ }
+ else
+ {
+ rt_ubase_t dc_lsize = g_mips_core.dcache_line_size;
+
+ a = addr & ~(dc_lsize - 1);
+ end = ((addr + size) - 1) & ~(dc_lsize - 1);
+ while (1)
+ {
+ flush_dcache_line(a);
+ if (a == end)
+ break;
+ a += dc_lsize;
+ }
+ }
+}
+
+#define dma_cache_wback_inv(start,size) \
+ do { (void) (start); (void) (size); } while (0)
+#define dma_cache_wback(start,size) \
+ do { (void) (start); (void) (size); } while (0)
+#define dma_cache_inv(start,size) \
+ do { (void) (start); (void) (size); } while (0)
+
+
+void r4k_dma_cache_sync(rt_ubase_t addr, rt_size_t size, enum dma_data_direction direction)
+{
+ switch (direction)
+ {
+ case DMA_TO_DEVICE:
+ r4k_dcache_wback_inv(addr, size);
+ break;
+
+ case DMA_FROM_DEVICE:
+ r4k_dcache_wback_inv(addr, size);
+ break;
+
+ case DMA_BIDIRECTIONAL:
+ dma_cache_wback_inv(addr, size);
+ break;
+ default:
+ RT_ASSERT(0) ;
+ }
+}
+
diff --git a/libcpu/mips/common/mips_cache.h b/libcpu/mips/common/mips_cache.h
new file mode 100644
index 0000000000..a947041073
--- /dev/null
+++ b/libcpu/mips/common/mips_cache.h
@@ -0,0 +1,234 @@
+/*
+ * File : mips_cache.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��10�� Urey the first version
+ */
+
+#ifndef _MIPS_CACHE_H_
+#define _MIPS_CACHE_H_
+
+#ifndef __ASSEMBLER__
+#include <rtdef.h>
+#include <mips_cfg.h>
+
+/*
+ * Cache Operations available on all MIPS processors with R4000-style caches
+ */
+#define INDEX_INVALIDATE_I 0x00
+#define INDEX_WRITEBACK_INV_D 0x01
+#define INDEX_LOAD_TAG_I 0x04
+#define INDEX_LOAD_TAG_D 0x05
+#define INDEX_STORE_TAG_I 0x08
+#define INDEX_STORE_TAG_D 0x09
+#if defined(CONFIG_CPU_LOONGSON2)
+#define HIT_INVALIDATE_I 0x00
+#else
+#define HIT_INVALIDATE_I 0x10
+#endif
+#define HIT_INVALIDATE_D 0x11
+#define HIT_WRITEBACK_INV_D 0x15
+
+/*
+ *The lock state is cleared by executing an Index
+Invalidate, Index Writeback Invalidate, Hit
+Invalidate, or Hit Writeback Invalidate
+operation to the locked line, or via an Index
+Store Tag operation with the lock bit reset in
+the TagLo register.
+ */
+#define FETCH_AND_LOCK_I 0x1c
+#define FETCH_AND_LOCK_D 0x1d
+
+
+enum dma_data_direction
+{
+ DMA_BIDIRECTIONAL = 0,
+ DMA_TO_DEVICE = 1,
+ DMA_FROM_DEVICE = 2,
+ DMA_NONE = 3,
+};
+
+/*
+ * R4000-specific cacheops
+ */
+#define CREATE_DIRTY_EXCL_D 0x0d
+#define FILL 0x14
+#define HIT_WRITEBACK_I 0x18
+#define HIT_WRITEBACK_D 0x19
+
+/*
+ * R4000SC and R4400SC-specific cacheops
+ */
+#define INDEX_INVALIDATE_SI 0x02
+#define INDEX_WRITEBACK_INV_SD 0x03
+#define INDEX_LOAD_TAG_SI 0x06
+#define INDEX_LOAD_TAG_SD 0x07
+#define INDEX_STORE_TAG_SI 0x0A
+#define INDEX_STORE_TAG_SD 0x0B
+#define CREATE_DIRTY_EXCL_SD 0x0f
+#define HIT_INVALIDATE_SI 0x12
+#define HIT_INVALIDATE_SD 0x13
+#define HIT_WRITEBACK_INV_SD 0x17
+#define HIT_WRITEBACK_SD 0x1b
+#define HIT_SET_VIRTUAL_SI 0x1e
+#define HIT_SET_VIRTUAL_SD 0x1f
+
+/*
+ * R5000-specific cacheops
+ */
+#define R5K_PAGE_INVALIDATE_S 0x17
+
+/*
+ * RM7000-specific cacheops
+ */
+#define PAGE_INVALIDATE_T 0x16
+
+/*
+ * R10000-specific cacheops
+ *
+ * Cacheops 0x02, 0x06, 0x0a, 0x0c-0x0e, 0x16, 0x1a and 0x1e are unused.
+ * Most of the _S cacheops are identical to the R4000SC _SD cacheops.
+ */
+#define INDEX_WRITEBACK_INV_S 0x03
+#define INDEX_LOAD_TAG_S 0x07
+#define INDEX_STORE_TAG_S 0x0B
+#define HIT_INVALIDATE_S 0x13
+#define CACHE_BARRIER 0x14
+#define HIT_WRITEBACK_INV_S 0x17
+#define INDEX_LOAD_DATA_I 0x18
+#define INDEX_LOAD_DATA_D 0x19
+#define INDEX_LOAD_DATA_S 0x1b
+#define INDEX_STORE_DATA_I 0x1c
+#define INDEX_STORE_DATA_D 0x1d
+#define INDEX_STORE_DATA_S 0x1f
+
+#define cache_op(op, addr) \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips3\n" \
+ "cache %0, %1\n" \
+ ".set pop\n" \
+ : \
+ : "i" (op), "R" (*(unsigned char *)(addr)))
+
+#define cache16_unroll32(base, op) \
+ __asm__ __volatile__( \
+ " .set noreorder \n" \
+ " .set mips3 \n" \
+ " cache %1, 0x000(%0); cache %1, 0x010(%0) \n" \
+ " cache %1, 0x020(%0); cache %1, 0x030(%0) \n" \
+ " cache %1, 0x040(%0); cache %1, 0x050(%0) \n" \
+ " cache %1, 0x060(%0); cache %1, 0x070(%0) \n" \
+ " cache %1, 0x080(%0); cache %1, 0x090(%0) \n" \
+ " cache %1, 0x0a0(%0); cache %1, 0x0b0(%0) \n" \
+ " cache %1, 0x0c0(%0); cache %1, 0x0d0(%0) \n" \
+ " cache %1, 0x0e0(%0); cache %1, 0x0f0(%0) \n" \
+ " cache %1, 0x100(%0); cache %1, 0x110(%0) \n" \
+ " cache %1, 0x120(%0); cache %1, 0x130(%0) \n" \
+ " cache %1, 0x140(%0); cache %1, 0x150(%0) \n" \
+ " cache %1, 0x160(%0); cache %1, 0x170(%0) \n" \
+ " cache %1, 0x180(%0); cache %1, 0x190(%0) \n" \
+ " cache %1, 0x1a0(%0); cache %1, 0x1b0(%0) \n" \
+ " cache %1, 0x1c0(%0); cache %1, 0x1d0(%0) \n" \
+ " cache %1, 0x1e0(%0); cache %1, 0x1f0(%0) \n" \
+ " .set mips0 \n" \
+ " .set reorder \n" \
+ : \
+ : "r" (base), \
+ "i" (op));
+
+
+static inline void flush_icache_line_indexed(rt_ubase_t addr)
+{
+ cache_op(INDEX_INVALIDATE_I, addr);
+}
+
+static inline void flush_dcache_line_indexed(rt_ubase_t addr)
+{
+ cache_op(INDEX_WRITEBACK_INV_D, addr);
+}
+
+static inline void flush_icache_line(rt_ubase_t addr)
+{
+ cache_op(HIT_INVALIDATE_I, addr);
+}
+
+static inline void lock_icache_line(rt_ubase_t addr)
+{
+ cache_op(FETCH_AND_LOCK_I, addr);
+}
+
+static inline void lock_dcache_line(rt_ubase_t addr)
+{
+ cache_op(FETCH_AND_LOCK_D, addr);
+}
+
+static inline void flush_dcache_line(rt_ubase_t addr)
+{
+ cache_op(HIT_WRITEBACK_INV_D, addr);
+}
+
+static inline void invalidate_dcache_line(rt_ubase_t addr)
+{
+ cache_op(HIT_INVALIDATE_D, addr);
+}
+static inline void blast_dcache16(void)
+{
+ rt_ubase_t start = KSEG0BASE;
+ rt_ubase_t end = start + g_mips_core.dcache_size;
+ rt_ubase_t addr;
+
+ for (addr = start; addr < end; addr += g_mips_core.dcache_line_size)
+ cache16_unroll32(addr, INDEX_WRITEBACK_INV_D);
+}
+
+static inline void inv_dcache16(void)
+{
+ rt_ubase_t start = KSEG0BASE;
+ rt_ubase_t end = start + g_mips_core.dcache_size;
+ rt_ubase_t addr;
+
+ for (addr = start; addr < end; addr += g_mips_core.dcache_line_size)
+ cache16_unroll32(addr, HIT_INVALIDATE_D);
+}
+
+static inline void blast_icache16(void)
+{
+ rt_ubase_t start = KSEG0BASE;
+ rt_ubase_t end = start + g_mips_core.icache_size;
+ rt_ubase_t addr;
+
+ for (addr = start; addr < end; addr += g_mips_core.icache_line_size)
+ cache16_unroll32(addr, INDEX_INVALIDATE_I);
+}
+
+void r4k_cache_init(void);
+void r4k_cache_flush_all(void);
+void r4k_icache_flush_all(void);
+void r4k_icache_flush_range(rt_ubase_t addr, rt_ubase_t size);
+void r4k_icache_lock_range(rt_ubase_t addr, rt_ubase_t size);
+void r4k_dcache_inv(rt_ubase_t addr, rt_ubase_t size);
+void r4k_dcache_wback_inv(rt_ubase_t addr, rt_ubase_t size);
+void r4k_dma_cache_sync(rt_ubase_t addr, rt_size_t size, enum dma_data_direction direction);
+#endif
+
+#endif /* _MIPS_CACHE_H_ */
diff --git a/libcpu/mips/common/mips_cfg.h b/libcpu/mips/common/mips_cfg.h
new file mode 100644
index 0000000000..3f0575d65a
--- /dev/null
+++ b/libcpu/mips/common/mips_cfg.h
@@ -0,0 +1,48 @@
+/*
+ * File : mips_cfg.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��10�� Urey the first version
+ */
+
+#ifndef _MIPS_CFG_H_
+#define _MIPS_CFG_H_
+
+#ifndef __ASSEMBLY__
+#include <stdint.h>
+typedef struct mips32_core_cfg
+{
+ uint16_t icache_line_size;
+// uint16_t icache_lines_per_way;
+// uint16_t icache_ways;
+ uint16_t icache_size;
+ uint16_t dcache_line_size;
+// uint16_t dcache_lines_per_way;
+// uint16_t dcache_ways;
+ uint16_t dcache_size;
+
+ uint16_t max_tlb_entries; /* number of tlb entry */
+} mips32_core_cfg_t;
+
+extern mips32_core_cfg_t g_mips_core;
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _MIPS_CFG_H_ */
diff --git a/libcpu/mips/common/mips_context.h b/libcpu/mips/common/mips_context.h
new file mode 100644
index 0000000000..60d573784d
--- /dev/null
+++ b/libcpu/mips/common/mips_context.h
@@ -0,0 +1,280 @@
+/*
+ * File : mips_context_asm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _MIPS_CONTEXT_ASM_H_
+#define _MIPS_CONTEXT_ASM_H_
+
+#define CONTEXT_SIZE ( STK_CTX_SIZE + FPU_ADJ )
+#ifdef __mips_hard_float
+#define FPU_ADJ (32 * 4 + 8) /* FP0-FP31 + CP1_STATUS */
+#define FPU_CTX ( CONTEXT_SIZE - FPU_ADJ )
+#else
+#define FPU_ADJ 0
+#endif
+
+
+
+#ifdef __ASSEMBLY__
+
+#ifdef __mips_hard_float
+.global _fpctx_save
+.global _fpctx_load
+#endif
+
+.macro SAVE_CONTEXT
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ //save SP
+ move k1, sp
+ move k0, sp
+ subu sp, k1, CONTEXT_SIZE
+ sw k0, (29 * 4)(sp)
+
+ //save REG
+ sw $0, ( 0 * 4)(sp)
+ sw $1, ( 1 * 4)(sp)
+ sw $2, ( 2 * 4)(sp)
+ sw $3, ( 3 * 4)(sp)
+ sw $4, ( 4 * 4)(sp)
+ sw $5, ( 5 * 4)(sp)
+ sw $6, ( 6 * 4)(sp)
+ sw $7, ( 7 * 4)(sp)
+ sw $8, ( 8 * 4)(sp)
+ sw $9, ( 9 * 4)(sp)
+ sw $10, (10 * 4)(sp)
+ sw $11, (11 * 4)(sp)
+ sw $12, (12 * 4)(sp)
+ sw $13, (13 * 4)(sp)
+ sw $14, (14 * 4)(sp)
+ sw $15, (15 * 4)(sp)
+ sw $16, (16 * 4)(sp)
+ sw $17, (17 * 4)(sp)
+ sw $18, (18 * 4)(sp)
+ sw $19, (19 * 4)(sp)
+ sw $20, (20 * 4)(sp)
+ sw $21, (21 * 4)(sp)
+ sw $22, (22 * 4)(sp)
+ sw $23, (23 * 4)(sp)
+ sw $24, (24 * 4)(sp)
+ sw $25, (25 * 4)(sp)
+ /* K0 K1 */
+ sw $28, (28 * 4)(sp)
+ /* SP */
+ sw $30, (30 * 4)(sp)
+ sw $31, (31 * 4)(sp)
+
+ /* STATUS CAUSE EPC.... */
+ mfc0 $2, CP0_STATUS
+ sw $2, STK_OFFSET_SR(sp)
+
+ mfc0 $2, CP0_CAUSE
+ sw $2, STK_OFFSET_CAUSE(sp)
+
+ mfc0 $2, CP0_BADVADDR
+ sw $2, STK_OFFSET_BADVADDR(sp)
+
+ MFC0 $2, CP0_EPC
+ sw $2, STK_OFFSET_EPC(sp)
+
+ mfhi $2
+ sw $2, STK_OFFSET_HI(sp)
+
+ mflo $2
+ sw $2, STK_OFFSET_LO(sp)
+#ifdef __mips_hard_float
+ add a0, sp,STK_CTX_SIZE
+
+ mfc0 t0, CP0_STATUS
+ .set push
+ .set at
+ or t0, M_StatusCU1
+ .set push
+ mtc0 t0, CP0_STATUS
+
+ cfc1 t0, CP1_STATUS
+ sw t0 , 0x00(a0)
+ swc1 $f0,(0x04 * 1)(a0)
+ swc1 $f1,(0x04 * 2)(a0)
+ swc1 $f2,(0x04 * 3)(a0)
+ swc1 $f3,(0x04 * 4)(a0)
+ swc1 $f4,(0x04 * 5)(a0)
+ swc1 $f5,(0x04 * 6)(a0)
+ swc1 $f6,(0x04 * 7)(a0)
+ swc1 $f7,(0x04 * 8)(a0)
+ swc1 $f8,(0x04 * 9)(a0)
+ swc1 $f9,(0x04 * 10)(a0)
+ swc1 $f10,(0x04 * 11)(a0)
+ swc1 $f11,(0x04 * 12)(a0)
+ swc1 $f12,(0x04 * 13)(a0)
+ swc1 $f13,(0x04 * 14)(a0)
+ swc1 $f14,(0x04 * 15)(a0)
+ swc1 $f15,(0x04 * 16)(a0)
+ swc1 $f16,(0x04 * 17)(a0)
+ swc1 $f17,(0x04 * 18)(a0)
+ swc1 $f18,(0x04 * 19)(a0)
+ swc1 $f19,(0x04 * 20)(a0)
+ swc1 $f20,(0x04 * 21)(a0)
+ swc1 $f21,(0x04 * 22)(a0)
+ swc1 $f22,(0x04 * 23)(a0)
+ swc1 $f23,(0x04 * 24)(a0)
+ swc1 $f24,(0x04 * 25)(a0)
+ swc1 $f25,(0x04 * 26)(a0)
+ swc1 $f26,(0x04 * 27)(a0)
+ swc1 $f27,(0x04 * 28)(a0)
+ swc1 $f28,(0x04 * 29)(a0)
+ swc1 $f29,(0x04 * 30)(a0)
+ swc1 $f30,(0x04 * 31)(a0)
+ swc1 $f31,(0x04 * 32)(a0)
+
+ nop
+#endif
+
+ //restore a0
+ lw a0, (REG_A0 * 4)(sp)
+
+ .set pop
+.endm
+
+
+.macro RESTORE_CONTEXT
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+#ifdef __mips_hard_float
+ add a0, sp,STK_CTX_SIZE
+
+ mfc0 t0, CP0_STATUS
+ .set push
+ .set at
+ or t0, M_StatusCU1
+ .set noat
+ mtc0 t0, CP0_STATUS
+
+ lw t0 , 0x00(a0)
+ lwc1 $f0,(0x04 * 1)(a0)
+ lwc1 $f1,(0x04 * 2)(a0)
+ lwc1 $f2,(0x04 * 3)(a0)
+ lwc1 $f3,(0x04 * 4)(a0)
+ lwc1 $f4,(0x04 * 5)(a0)
+ lwc1 $f5,(0x04 * 6)(a0)
+ lwc1 $f6,(0x04 * 7)(a0)
+ lwc1 $f7,(0x04 * 8)(a0)
+ lwc1 $f8,(0x04 * 9)(a0)
+ lwc1 $f9,(0x04 * 10)(a0)
+ lwc1 $f10,(0x04 * 11)(a0)
+ lwc1 $f11,(0x04 * 12)(a0)
+ lwc1 $f12,(0x04 * 13)(a0)
+ lwc1 $f13,(0x04 * 14)(a0)
+ lwc1 $f14,(0x04 * 15)(a0)
+ lwc1 $f15,(0x04 * 16)(a0)
+ lwc1 $f16,(0x04 * 17)(a0)
+ lwc1 $f17,(0x04 * 18)(a0)
+ lwc1 $f18,(0x04 * 19)(a0)
+ lwc1 $f19,(0x04 * 20)(a0)
+ lwc1 $f20,(0x04 * 21)(a0)
+ lwc1 $f21,(0x04 * 22)(a0)
+ lwc1 $f22,(0x04 * 23)(a0)
+ lwc1 $f23,(0x04 * 24)(a0)
+ lwc1 $f24,(0x04 * 25)(a0)
+ lwc1 $f25,(0x04 * 26)(a0)
+ lwc1 $f26,(0x04 * 27)(a0)
+ lwc1 $f27,(0x04 * 28)(a0)
+ lwc1 $f28,(0x04 * 29)(a0)
+ lwc1 $f29,(0x04 * 30)(a0)
+ lwc1 $f30,(0x04 * 31)(a0)
+ lwc1 $f31,(0x04 * 32)(a0)
+ ctc1 t0, CP1_STATUS ;/* restore fpp status reg */
+
+ nop
+#endif
+
+ /* ͨ�üĴ��� */
+ /* ZERO */
+ lw $1, ( 1 * 4)(sp)
+ /* V0 */
+ lw $3, ( 3 * 4)(sp)
+ lw $4, ( 4 * 4)(sp)
+ lw $5, ( 5 * 4)(sp)
+ lw $6, ( 6 * 4)(sp)
+ lw $7, ( 7 * 4)(sp)
+ lw $8, ( 8 * 4)(sp)
+ lw $9, ( 9 * 4)(sp)
+ lw $10, (10 * 4)(sp)
+ lw $11, (11 * 4)(sp)
+ lw $12, (12 * 4)(sp)
+ lw $13, (13 * 4)(sp)
+ lw $14, (14 * 4)(sp)
+ lw $15, (15 * 4)(sp)
+ lw $16, (16 * 4)(sp)
+ lw $17, (17 * 4)(sp)
+ lw $18, (18 * 4)(sp)
+ lw $19, (19 * 4)(sp)
+ lw $20, (20 * 4)(sp)
+ lw $21, (21 * 4)(sp)
+ lw $22, (22 * 4)(sp)
+ lw $23, (23 * 4)(sp)
+ lw $24, (24 * 4)(sp)
+ lw $25, (25 * 4)(sp)
+ lw $26, (26 * 4)(sp)
+ lw $27, (27 * 4)(sp)
+ lw $28, (28 * 4)(sp)
+ /* SP */
+ lw $30, (30 * 4)(sp)
+ lw $31, (31 * 4)(sp)
+
+
+ /* STATUS CAUSE EPC.... */
+ lw $2, STK_OFFSET_HI(sp)
+ mthi $2
+ lw $2, STK_OFFSET_LO(sp)
+ mtlo $2
+
+ lw $2, STK_OFFSET_SR(sp)
+ mtc0 $2, CP0_STATUS
+
+ lw $2, STK_OFFSET_BADVADDR(sp)
+ mtc0 $2, CP0_BADVADDR
+
+ lw $2, STK_OFFSET_CAUSE(sp)
+ mtc0 $2, CP0_CAUSE
+
+ lw $2, STK_OFFSET_EPC(sp)
+ MTC0 $2, CP0_EPC
+
+ //restore $2
+ lw $2, ( 2 * 4)(sp)
+ //restore sp
+ lw $29, (29 * 4)(sp)
+
+ eret
+ nop
+ .set pop
+.endm
+#endif
+#endif /* _MIPS_CONTEXT_ASM_H_ */
diff --git a/libcpu/mips/common/mips_def.h b/libcpu/mips/common/mips_def.h
new file mode 100644
index 0000000000..70da2deccf
--- /dev/null
+++ b/libcpu/mips/common/mips_def.h
@@ -0,0 +1,2310 @@
+/*
+ * File : mips_def.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _COMMON_MIPS_DEF_H_
+#define _COMMON_MIPS_DEF_H_
+
+
+/*
+ ************************************************************************
+ * I N S T R U C T I O N F O R M A T S *
+ ************************************************************************
+ *
+ * The following definitions describe each field in an instruction. There
+ * is one diagram for each type of instruction, with field definitions
+ * following the diagram for that instruction. Note that if a field of
+ * the same name and position is defined in an earlier diagram, it is
+ * not defined again in the subsequent diagram. Only new fields are
+ * defined for each diagram.
+ *
+ * R-Type (operate)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | | rs | rt | rd | sa | |
+ * | Opcode | | | Tcode | func |
+ * | | Bcode | | sel |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnOpcode 26
+#define M_InstnOpcode (0x3f << S_InstnOpcode)
+#define S_InstnRS 21
+#define M_InstnRS (0x1f << S_InstnRS)
+#define S_InstnRT 16
+#define M_InstnRT (0x1f << S_InstnRT)
+#define S_InstnRD 11
+#define M_InstnRD (0x1f << S_InstnRD)
+#define S_InstnSA 6
+#define M_InstnSA (0x1f << S_InstnSA)
+#define S_InstnTcode 6
+#define M_InstnTcode (0x3ff << S_InstnTcode)
+#define S_InstnBcode 6
+#define M_InstnBcode (0xfffff << S_InstnBcode)
+#define S_InstnFunc 0
+#define M_InstnFunc (0x3f << S_InstnFunc)
+#define S_InstnSel 0
+#define M_InstnSel (0x7 << S_InstnSel)
+
+/*
+ * I-Type (load, store, branch, immediate)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | rt | Offset |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnOffset 0
+#define M_InstnOffset (0xffff << S_InstnOffset)
+
+/*
+ * I-Type (pref)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | hint | Offset |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnHint S_InstnRT
+#define M_InstnHint M_InstnRT
+
+/*
+ * J-Type (jump)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | JIndex |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnJIndex 0
+#define M_InstnJIndex (0x03ffffff << S_InstnJIndex)
+
+/*
+ * FP R-Type (operate)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | fmt | ft | fs | fd | func |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnFmt S_InstnRS
+#define M_InstnFmt M_InstnRS
+#define S_InstnFT S_InstnRT
+#define M_InstnFT M_InstnRT
+#define S_InstnFS S_InstnRD
+#define M_InstnFS M_InstnRD
+#define S_InstnFD S_InstnSA
+#define M_InstnFD M_InstnSA
+
+/*
+ * FP R-Type (cpu <-> cpu data movement))
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | sub | rt | fs | 0 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnSub S_InstnRS
+#define M_InstnSub M_InstnRS
+
+/*
+ * FP R-Type (compare)
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | | | | | | |C| |
+ * | Opcode | fmt | ft | fs | cc |0|A| func |
+ * | | | | | | |B| |
+ * | | | | | | |S| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnCCcmp 8
+#define M_InstnCCcmp (0x7 << S_InstnCCcmp)
+#define S_InstnCABS 6
+#define M_InstnCABS (0x1 << S_InstnCABS)
+
+/*
+ * FP R-Type (FPR conditional move on FP cc)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | fmt | cc |n|t| fs | fd | func |
+ * | | | |d|f| | | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnCC 18
+#define M_InstnCC (0x7 << S_InstnCC)
+#define S_InstnND 17
+#define M_InstnND (0x1 << S_InstnND)
+#define S_InstnTF 16
+#define M_InstnTF (0x1 << S_InstnTF)
+
+/*
+ * FP R-Type (3-operand operate)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | fr | ft | fs | fd | op4 | fmt3|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnFR S_InstnRS
+#define M_InstnFR M_InstnRS
+#define S_InstnOp4 3
+#define M_InstnOp4 (0x7 << S_InstnOp4)
+#define S_InstnFmt3 0
+#define M_InstnFmt3 (0x7 << S_InstnFmt3)
+
+/*
+ * FP R-Type (Indexed load, store)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | rt | 0 | fd | func |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+/*
+ * FP R-Type (prefx)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | rt | hint | 0 | func |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define S_InstnHintX S_InstnRD
+#define M_InstnHintX M_InstnRD
+
+/*
+ * FP R-Type (GPR conditional move on FP cc)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | cc |n|t| rd | 0 | func |
+ * | | | |d|f| | | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+/*
+ * FP I-Type (load, store)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | rs | ft | Offset |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+/*
+ * FP I-Type (branch)
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Opcode | fmt | cc |n|t| Offset |
+ * | | | |d|f| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+
+/*
+ *************************************************************************
+ * V I R T U A L A D D R E S S D E F I N I T I O N S *
+ *************************************************************************
+ */
+
+#ifdef MIPSADDR64
+#define A_K0BASE UNS64Const(0xffffffff80000000)
+#define A_K1BASE UNS64Const(0xffffffffa0000000)
+#define A_K2BASE UNS64Const(0xffffffffc0000000)
+#define A_K3BASE UNS64Const(0xffffffffe0000000)
+#define A_REGION UNS64Const(0xc000000000000000)
+#define A_XKPHYS_ATTR UNS64Const(0x3800000000000000)
+#else
+#define A_K0BASE 0x80000000
+#define A_K1BASE 0xa0000000
+#define A_K2BASE 0xc0000000
+#define A_K3BASE 0xe0000000
+#endif
+#define M_KMAPPED 0x40000000 /* KnSEG address is mapped if bit is one */
+
+
+#ifdef MIPS_Model64
+
+#define S_VMAP64 62
+#define M_VMAP64 UNS64Const(0xc000000000000000)
+
+#define K_VMode11 3
+#define K_VMode10 2
+#define K_VMode01 1
+#define K_VMode00 0
+
+#define S_KSEG3 29
+#define M_KSEG3 (0x7 << S_KSEG3)
+#define K_KSEG3 7
+
+#define S_SSEG 29
+#define M_SSEG (0x7 << S_KSEG3)
+#define K_SSEG 6
+
+#define S_KSSEG 29
+#define M_KSSEG (0x7 << S_KSEG3)
+#define K_KSSEG 6
+
+#define S_KSEG1 29
+#define M_KSEG1 (0x7 << S_KSEG3)
+#define K_KSEG1 5
+
+#define S_KSEG0 29
+#define M_KSEG0 (0x7 << S_KSEG3)
+#define K_KSEG0 4
+
+#define S_XKSEG 29
+#define M_XKSEG (0x7 << S_KSEG3)
+#define K_XKSEG 3
+
+#define S_USEG 31
+#define M_USEG (0x1 << S_USEG)
+#define K_USEG 0
+
+#define S_EjtagProbeMem 20
+#define M_EjtagProbeMem (0x1 << S_EjtagProbeMem)
+#define K_EjtagProbeMem 0
+
+
+
+#else
+
+#define S_KSEG3 29
+#define M_KSEG3 (0x7 << S_KSEG3)
+#define K_KSEG3 7
+
+#define S_KSSEG 29
+#define M_KSSEG (0x7 << S_KSSEG)
+#define K_KSSEG 6
+
+#define S_SSEG 29
+#define M_SSEG (0x7 << S_SSEG)
+#define K_SSEG 6
+
+#define S_KSEG1 29
+#define M_KSEG1 (0x7 << S_KSEG1)
+#define K_KSEG1 5
+
+#define S_KSEG0 29
+#define M_KSEG0 (0x7 << S_KSEG0)
+#define K_KSEG0 4
+
+#define S_KUSEG 31
+#define M_KUSEG (0x1 << S_KUSEG)
+#define K_KUSEG 0
+
+#define S_SUSEG 31
+#define M_SUSEG (0x1 << S_SUSEG)
+#define K_SUSEG 0
+
+#define S_USEG 31
+#define M_USEG (0x1 << S_USEG)
+#define K_USEG 0
+
+#define K_EjtagLower 0xff200000
+#define K_EjtagUpper 0xff3fffff
+
+#define S_EjtagProbeMem 20
+#define M_EjtagProbeMem (0x1 << S_EjtagProbeMem)
+#define K_EjtagProbeMem 0
+
+#endif
+
+
+
+/*
+ *************************************************************************
+ * C A C H E I N S T R U C T I O N O P E R A T I O N C O D E S *
+ *************************************************************************
+ */
+
+/*
+ * Cache encodings
+ */
+#define K_CachePriI 0 /* Primary Icache */
+#define K_CachePriD 1 /* Primary Dcache */
+#define K_CachePriU 1 /* Unified primary */
+#define K_CacheTerU 2 /* Unified Tertiary */
+#define K_CacheSecU 3 /* Unified secondary */
+
+
+/*
+ * Function encodings
+ */
+#define S_CacheFunc 2 /* Amount to shift function encoding within 5-bit field */
+#define K_CacheIndexInv 0 /* Index invalidate */
+#define K_CacheIndexWBInv 0 /* Index writeback invalidate */
+#define K_CacheIndexLdTag 1 /* Index load tag */
+#define K_CacheIndexStTag 2 /* Index store tag */
+#define K_CacheHitInv 4 /* Hit Invalidate */
+#define K_CacheFill 5 /* Fill (Icache only) */
+#define K_CacheHitWBInv 5 /* Hit writeback invalidate */
+#define K_CacheHitWB 6 /* Hit writeback */
+#define K_CacheFetchLock 7 /* Fetch and lock */
+
+#define ICIndexInv ((K_CacheIndexInv << S_CacheFunc) | K_CachePriI)
+#define DCIndexWBInv ((K_CacheIndexWBInv << S_CacheFunc) | K_CachePriD)
+#define DCIndexInv DCIndexWBInv
+#define ICIndexLdTag ((K_CacheIndexLdTag << S_CacheFunc) | K_CachePriI)
+#define DCIndexLdTag ((K_CacheIndexLdTag << S_CacheFunc) | K_CachePriD)
+#define ICIndexStTag ((K_CacheIndexStTag << S_CacheFunc) | K_CachePriI)
+#define DCIndexStTag ((K_CacheIndexStTag << S_CacheFunc) | K_CachePriD)
+#define ICHitInv ((K_CacheHitInv << S_CacheFunc) | K_CachePriI)
+#define DCHitInv ((K_CacheHitInv << S_CacheFunc) | K_CachePriD)
+#define ICFill ((K_CacheFill << S_CacheFunc) | K_CachePriI)
+#define DCHitWBInv ((K_CacheHitWBInv << S_CacheFunc) | K_CachePriD)
+#define DCHitWB ((K_CacheHitWB << S_CacheFunc) | K_CachePriD)
+#define ICFetchLock ((K_CacheFetchLock << S_CacheFunc) | K_CachePriI)
+#define DCFetchLock ((K_CacheFetchLock << S_CacheFunc) | K_CachePriD)
+
+
+/*
+ *************************************************************************
+ * P R E F E T C H I N S T R U C T I O N H I N T S *
+ *************************************************************************
+ */
+
+#define PrefLoad 0
+#define PrefStore 1
+#define PrefLoadStreamed 4
+#define PrefStoreStreamed 5
+#define PrefLoadRetained 6
+#define PrefStoreRetained 7
+#define PrefWBInval 25
+#define PrefNudge 25
+
+
+/*
+ *************************************************************************
+ * C P U R E G I S T E R D E F I N I T I O N S *
+ *************************************************************************
+ */
+
+
+/*
+ *************************************************************************
+ * S O F T W A R E G P R N A M E S *
+ *************************************************************************
+ */
+#ifdef __ASSEMBLY__
+#define zero $0
+#define AT $1
+#define v0 $2
+#define v1 $3
+#define a0 $4
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26
+#define k1 $27
+#define gp $28
+#define sp $29
+#define fp $30
+#define ra $31
+
+/*
+ * The following registers are used by the AVP environment and
+ * are not part of the normal software definitions.
+ */
+
+#ifdef MIPSAVPENV
+#define repc $25 /* Expected exception PC */
+#define tid $30 /* Current test case address */
+#endif
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E G P R N A M E S *
+ *************************************************************************
+ *
+ * In the AVP environment, several of the `r' names are removed from the
+ * name space because they are used by the kernel for special purposes.
+ * Removing them causes assembly rather than runtime errors for tests that
+ * use the `r' names.
+ *
+ * - r25 (repc) is used as the expected PC on an exception
+ * - r26-r27 (k0, k1) are used in the exception handler
+ * - r30 (tid) is used as the current test address
+ */
+
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#ifdef MIPSAVPENV
+#define r25 r25_unknown
+#define r26 r26_unknown
+#define r27 r27_unknown
+#else
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#endif
+#define r28 $28
+#define r29 $29
+#ifdef MIPSAVPENV
+#define r30 r30_unknown
+#else
+#define r30 $30
+#endif
+#define r31 $31
+
+#endif
+
+/*
+ *************************************************************************
+ * H A R D W A R E G P R I N D I C E S *
+ *************************************************************************
+ *
+ * These definitions provide the index (number) of the GPR, as opposed
+ * to the assembler register name ($n).
+ */
+
+#define R_r0 0
+#define R_r1 1
+#define R_r2 2
+#define R_r3 3
+#define R_r4 4
+#define R_r5 5
+#define R_r6 6
+#define R_r7 7
+#define R_r8 8
+#define R_r9 9
+#define R_r10 10
+#define R_r11 11
+#define R_r12 12
+#define R_r13 13
+#define R_r14 14
+#define R_r15 15
+#define R_r16 16
+#define R_r17 17
+#define R_r18 18
+#define R_r19 19
+#define R_r20 20
+#define R_r21 21
+#define R_r22 22
+#define R_r23 23
+#define R_r24 24
+#define R_r25 25
+#define R_r26 26
+#define R_r27 27
+#define R_r28 28
+#define R_r29 29
+#define R_r30 30
+#define R_r31 31
+#define R_hi 32 /* Hi register */
+#define R_lo 33 /* Lo register */
+
+
+/*
+ *************************************************************************
+ * S O F T W A R E G P R M A S K S *
+ *************************************************************************
+ *
+ * These definitions provide the bit mask corresponding to the GPR number
+ */
+
+#define M_AT (1<<1)
+#define M_v0 (1<<2)
+#define M_v1 (1<<3)
+#define M_a0 (1<<4)
+#define M_a1 (1<<5)
+#define M_a2 (1<<6)
+#define M_a3 (1<<7)
+#define M_t0 (1<<8)
+#define M_t1 (1<<9)
+#define M_t2 (1<<10)
+#define M_t3 (1<<11)
+#define M_t4 (1<<12)
+#define M_t5 (1<<13)
+#define M_t6 (1<<14)
+#define M_t7 (1<<15)
+#define M_s0 (1<<16)
+#define M_s1 (1<<17)
+#define M_s2 (1<<18)
+#define M_s3 (1<<19)
+#define M_s4 (1<<20)
+#define M_s5 (1<<21)
+#define M_s6 (1<<22)
+#define M_s7 (1<<23)
+#define M_t8 (1<<24)
+#define M_t9 (1<<25)
+#define M_k0 (1<<26)
+#define M_k1 (1<<27)
+#define M_gp (1<<28)
+#define M_sp (1<<29)
+#define M_fp (1<<30)
+#define M_ra (1<<31)
+
+
+/*
+ *************************************************************************
+ * C P 0 R E G I S T E R D E F I N I T I O N S *
+ *************************************************************************
+ * Each register has the following definitions:
+ *
+ * C0_rrr The register number (as a $n value)
+ * R_C0_rrr The register index (as an integer corresponding
+ * to the register number)
+ *
+ * Each field in a register has the following definitions:
+ *
+ * S_rrrfff The shift count required to right-justify
+ * the field. This corresponds to the bit
+ * number of the right-most bit in the field.
+ * M_rrrfff The Mask required to isolate the field.
+ *
+ * Register diagrams included below as comments correspond to the
+ * MIPS32 and MIPS64 architecture specifications. Refer to other
+ * sources for register diagrams for older architectures.
+ */
+
+
+/*
+ ************************************************************************
+ * I N D E X R E G I S T E R ( 0 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |P| 0 | Index | Index
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Index $0
+#define R_C0_Index 0
+#define C0_INX C0_Index /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_IndexP 31 /* Probe failure (R)*/
+#define M_IndexP (0x1 << S_IndexP)
+
+#define S_IndexIndex 0 /* TLB index (R/W)*/
+#define M_IndexIndex (0x3f << S_IndexIndex)
+
+#define M_Index0Fields 0x7fffffc0
+#define M_IndexRFields 0x80000000
+
+
+/*
+ ************************************************************************
+ * R A N D O M R E G I S T E R ( 1 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | Index | Random
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Random $1
+#define R_C0_Random 1
+#define C0_RAND $1 /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_RandomIndex 0 /* TLB random index (R)*/
+#define M_RandomIndex (0x3f << S_RandomIndex)
+
+#define M_Random0Fields 0xffffffc0
+#define M_RandomRFields 0x0000003f
+
+
+/*
+ ************************************************************************
+ * E N T R Y L O 0 R E G I S T E R ( 2 ) *
+ ************************************************************************
+ *
+ * 6 6 6 6 5 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 2 1 0 9 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Fill (0) //| 0 | PFN | C |D|V|G| EntryLo0
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_EntryLo0 $2
+#define R_C0_EntryLo0 2
+#define C0_TLBLO_0 C0_EntryLo0 /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_EntryLoPFN 6 /* PFN (R/W) */
+#define M_EntryLoPFN (0xffffff << S_EntryLoPFN)
+#define S_EntryLoC 3 /* Coherency attribute (R/W) */
+#define M_EntryLoC (0x7 << S_EntryLoC)
+#define S_EntryLoD 2 /* Dirty (R/W) */
+#define M_EntryLoD (0x1 << S_EntryLoD)
+#define S_EntryLoV 1 /* Valid (R/W) */
+#define M_EntryLoV (0x1 << S_EntryLoV)
+#define S_EntryLoG 0 /* Global (R/W) */
+#define M_EntryLoG (0x1 << S_EntryLoG)
+#define M_EntryLoOddPFN (0x1 << S_EntryLoPFN) /* Odd PFN bit */
+#define S_EntryLo_RS K_PageAlign /* Right-justify PFN */
+#define S_EntryLo_LS S_EntryLoPFN /* Position PFN to appropriate position */
+
+#define M_EntryLo0Fields 0x00000000
+#define M_EntryLoRFields 0xc0000000
+#define M_EntryLo0Fields64 UNS64Const(0x0000000000000000)
+#define M_EntryLoRFields64 UNS64Const(0xffffffffc0000000)
+
+/*
+ * Cache attribute values in the C field of EntryLo and the
+ * K0 field of Config
+ */
+#define K_CacheAttrCWTnWA 0 /* Cacheable, write-thru, no write allocate */
+#define K_CacheAttrCWTWA 1 /* Cacheable, write-thru, write allocate */
+#define K_CacheAttrU 2 /* Uncached */
+#define K_CacheAttrC 3 /* Cacheable */
+#define K_CacheAttrCN 3 /* Cacheable, non-coherent */
+#define K_CacheAttrCCE 4 /* Cacheable, coherent, exclusive */
+#define K_CacheAttrCCS 5 /* Cacheable, coherent, shared */
+#define K_CacheAttrCCU 6 /* Cacheable, coherent, update */
+#define K_CacheAttrUA 7 /* Uncached accelerated */
+
+
+/*
+ ************************************************************************
+ * E N T R Y L O 1 R E G I S T E R ( 3 ) *
+ ************************************************************************
+ *
+ * 6 6 6 6 5 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 2 1 0 9 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Fill (0) //| 0 | PFN | C |D|V|G| EntryLo1
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_EntryLo1 $3
+#define R_C0_EntryLo1 3
+#define C0_TLBLO_1 C0_EntryLo1 /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+/*
+ * Field definitions are as given for EntryLo0 above
+ */
+
+
+/*
+ ************************************************************************
+ * C O N T E X T R E G I S T E R ( 4 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // PTEBase | BadVPN<31:13> | 0 | Context
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Context $4
+#define R_C0_Context 4
+#define C0_CTXT C0_Context /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_ContextPTEBase 23 /* PTE base (R/W) */
+#define M_ContextPTEBase (0x1ff << S_ContextPTEBase)
+#define S_ContextBadVPN 4 /* BadVPN2 (R) */
+#define M_ContextBadVPN (0x7ffff << S_ContextBadVPN)
+#define S_ContextBadVPN_LS 9 /* Position BadVPN to bit 31 */
+#define S_ContextBadVPN_RS 13 /* Right-justify shifted BadVPN field */
+
+#define M_Context0Fields 0x0000000f
+#define M_ContextRFields 0x007ffff0
+#define M_Context0Fields64 UNS64Const(0x000000000000000f)
+#define M_ContextRFields64 UNS64Const(0x00000000007ffff0)
+
+
+/*
+ ************************************************************************
+ * P A G E M A S K R E G I S T E R ( 5 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | Mask | 0 | PageMask
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_PageMask $5
+#define R_C0_PageMask 5 /* Mask (R/W) */
+#define C0_PGMASK C0_PageMask /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_PageMaskMask 13
+#define M_PageMaskMask (0xfff << S_PageMaskMask)
+
+#define M_PageMask0Fields 0xfe001fff
+#define M_PageMaskRFields 0x00000000
+
+/*
+ * Values in the Mask field
+ */
+#define K_PageMask4K 0x000 /* K_PageMasknn values are values for use */
+#define K_PageMask16K 0x003 /* with KReqPageAttributes or KReqPageMask macros */
+#define K_PageMask64K 0x00f
+#define K_PageMask256K 0x03f
+#define K_PageMask1M 0x0ff
+#define K_PageMask4M 0x3ff
+#define K_PageMask16M 0xfff
+
+#define M_PageMask4K (K_PageMask4K << S_PageMaskMask) /* M_PageMasknn values are masks */
+#define M_PageMask16K (K_PageMask16K << S_PageMaskMask) /* in position in the PageMask register */
+#define M_PageMask64K (K_PageMask64K << S_PageMaskMask)
+#define M_PageMask256K (K_PageMask256K << S_PageMaskMask)
+#define M_PageMask1M (K_PageMask1M << S_PageMaskMask)
+#define M_PageMask4M (K_PageMask4M << S_PageMaskMask)
+#define M_PageMask16M (K_PageMask16M << S_PageMaskMask)
+
+
+/*
+ ************************************************************************
+ * W I R E D R E G I S T E R ( 6 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | Index | Wired
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Wired $6
+#define R_C0_Wired 6
+#define C0_TLBWIRED C0_Wired /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_WiredIndex 0 /* TLB wired boundary (R/W) */
+#define M_WiredIndex (0x3f << S_WiredIndex)
+
+#define M_Wired0Fields 0xffffffc0
+#define M_WiredRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * B A D V A D D R R E G I S T E R ( 8 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // Bad Virtual Address | BadVAddr
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_BadVAddr $8
+#define R_C0_BadVAddr 8
+#define C0_BADVADDR C0_BadVAddr /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_BadVAddrOddPage K_PageSize /* Even/Odd VA bit for pair of PAs */
+
+#define M_BadVAddr0Fields 0x00000000
+#define M_BadVAddrRFields 0xffffffff
+#define M_BadVAddr0Fields64 UNS64Const(0x0000000000000000)
+#define M_BadVAddrRFields64 UNS64Const(0xffffffffffffffff)
+
+/*
+ ************************************************************************
+ * C O U N T R E G I S T E R ( 9 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Count Value | Count
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Count $9
+#define R_C0_Count 9
+#define C0_COUNT C0_Count /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_Count0Fields 0x00000000
+#define M_CountRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * E N T R Y H I R E G I S T E R ( 1 0 ) *
+ ************************************************************************
+ *
+ * 6 6 6 6 5 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 2 1 0 9 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | R | Fill // VPN2 | 0 | ASID | EntryHi
+ * +-+-+-+-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_EntryHi $10
+#define R_C0_EntryHi 10
+#define C0_TLBHI C0_EntryHi /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_EntryHiR64 62 /* Region (R/W) */
+#define M_EntryHiR64 UNS64Const(0xc000000000000000)
+#define S_EntryHiVPN2 13 /* VPN/2 (R/W) */
+#define M_EntryHiVPN2 (0x7ffff << S_EntryHiVPN2)
+#define M_EntryHiVPN264 UNS64Const(0x000000ffffffe000)
+#define S_EntryHiASID 0 /* ASID (R/W) */
+#define M_EntryHiASID (0xff << S_EntryHiASID)
+#define S_EntryHiVPN_Shf S_EntryHiVPN2
+
+#define M_EntryHi0Fields 0x00001f00
+#define M_EntryHiRFields 0x00000000
+#define M_EntryHi0Fields64 UNS64Const(0x0000000000001f00)
+#define M_EntryHiRFields64 UNS64Const(0x3fffff0000000000)
+
+
+/*
+ ************************************************************************
+ * C O M P A R E R E G I S T E R ( 1 1 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Compare Value | Compare
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Compare $11
+#define R_C0_Compare 11
+#define C0_COMPARE C0_Compare /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_Compare0Fields 0x00000000
+#define M_CompareRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * S T A T U S R E G I S T E R ( 1 2 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |C|C|C|C|R|F|R|M|P|B|T|S|M| | R |I|I|I|I|I|I|I|I|K|S|U|U|R|E|E|I|
+ * |U|U|U|U|P|R|E|X|X|E|S|R|M| | s |M|M|M|M|M|M|M|M|X|X|X|M|s|R|X|E| Status
+ * |3|2|1|0| | | | | |V| | |I| | v |7|6|5|4|3|2|1|0| | | | |v|L|L| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Status $12
+#define R_C0_Status 12
+#define C0_SR C0_Status /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_StatusCU 28 /* Coprocessor enable (R/W) */
+#define M_StatusCU (0xf << S_StatusCU)
+#define S_StatusCU3 31
+#define M_StatusCU3 (0x1 << S_StatusCU3)
+#define S_StatusCU2 30
+#define M_StatusCU2 (0x1 << S_StatusCU2)
+#define S_StatusCU1 29
+#define M_StatusCU1 (0x1 << S_StatusCU1)
+#define S_StatusCU0 28
+#define M_StatusCU0 (0x1 << S_StatusCU0)
+#define S_StatusRP 27 /* Enable reduced power mode (R/W) */
+#define M_StatusRP (0x1 << S_StatusRP)
+#define S_StatusFR 26 /* Enable 64-bit FPRs (MIPS64 only) (R/W) */
+#define M_StatusFR (0x1 << S_StatusFR)
+#define S_StatusRE 25 /* Enable reverse endian (R/W) */
+#define M_StatusRE (0x1 << S_StatusRE)
+#define S_StatusMX 24 /* Enable access to MDMX resources (MIPS64 only) (R/W) */
+#define M_StatusMX (0x1 << S_StatusMX)
+#define S_StatusPX 23 /* Enable access to 64-bit instructions/data (MIPS64 only) (R/W) */
+#define M_StatusPX (0x1 << S_StatusPX)
+#define S_StatusBEV 22 /* Enable Boot Exception Vectors (R/W) */
+#define M_StatusBEV (0x1 << S_StatusBEV)
+#define S_StatusTS 21 /* Denote TLB shutdown (R/W) */
+#define M_StatusTS (0x1 << S_StatusTS)
+#define S_StatusSR 20 /* Denote soft reset (R/W) */
+#define M_StatusSR (0x1 << S_StatusSR)
+#define S_StatusNMI 19
+#define M_StatusNMI (0x1 << S_StatusNMI) /* Denote NMI (R/W) */
+#define S_StatusIM 8 /* Interrupt mask (R/W) */
+#define M_StatusIM (0xff << S_StatusIM)
+#define S_StatusIM7 15
+#define M_StatusIM7 (0x1 << S_StatusIM7)
+#define S_StatusIM6 14
+#define M_StatusIM6 (0x1 << S_StatusIM6)
+#define S_StatusIM5 13
+#define M_StatusIM5 (0x1 << S_StatusIM5)
+#define S_StatusIM4 12
+#define M_StatusIM4 (0x1 << S_StatusIM4)
+#define S_StatusIM3 11
+#define M_StatusIM3 (0x1 << S_StatusIM3)
+#define S_StatusIM2 10
+#define M_StatusIM2 (0x1 << S_StatusIM2)
+#define S_StatusIM1 9
+#define M_StatusIM1 (0x1 << S_StatusIM1)
+#define S_StatusIM0 8
+#define M_StatusIM0 (0x1 << S_StatusIM0)
+#define S_StatusKX 7 /* Enable access to extended kernel addresses (MIPS64 only) (R/W) */
+#define M_StatusKX (0x1 << S_StatusKX)
+#define S_StatusSX 6 /* Enable access to extended supervisor addresses (MIPS64 only) (R/W) */
+#define M_StatusSX (0x1 << S_StatusSX)
+#define S_StatusUX 5 /* Enable access to extended user addresses (MIPS64 only) (R/W) */
+#define M_StatusUX (0x1 << S_StatusUX)
+#define S_StatusKSU 3 /* Two-bit current mode (R/W) */
+#define M_StatusKSU (0x3 << S_StatusKSU)
+#define S_StatusUM 4 /* User mode if supervisor mode not implemented (R/W) */
+#define M_StatusUM (0x1 << S_StatusUM)
+#define S_StatusSM 3 /* Supervisor mode (R/W) */
+#define M_StatusSM (0x1 << S_StatusSM)
+#define S_StatusERL 2 /* Denotes error level (R/W) */
+#define M_StatusERL (0x1 << S_StatusERL)
+#define S_StatusEXL 1 /* Denotes exception level (R/W) */
+#define M_StatusEXL (0x1 << S_StatusEXL)
+#define S_StatusIE 0 /* Enables interrupts (R/W) */
+#define M_StatusIE (0x1 << S_StatusIE)
+
+#define M_Status0Fields 0x00040000
+#define M_StatusRFields 0x058000e0 /* FR, MX, PX, KX, SX, UX unused in MIPS32 */
+#define M_Status0Fields64 0x00040000
+#define M_StatusRFields64 0x00000000
+
+/*
+ * Values in the KSU field
+ */
+#define K_StatusKSU_U 2 /* User mode in KSU field */
+#define K_StatusKSU_S 1 /* Supervisor mode in KSU field */
+#define K_StatusKSU_K 0 /* Kernel mode in KSU field */
+
+
+/*
+ ************************************************************************
+ * C A U S E R E G I S T E R ( 1 3 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |B| | C | |I|W| |I|I|I|I|I|I|I|I| | | R |
+ * |D| | E | Rsvd |V|P| Rsvd |P|P|P|P|P|P|P|P| | ExcCode | s | Cause
+ * | | | | | | | |7|6|5|4|3|2|1|0| | | v |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Cause $13
+#define R_C0_Cause 13
+#define C0_CAUSE C0_Cause /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_CauseBD 31
+#define M_CauseBD (0x1 << S_CauseBD)
+#define S_CauseCE 28
+#define M_CauseCE (0x3<< S_CauseCE)
+#define S_CauseIV 23
+#define M_CauseIV (0x1 << S_CauseIV)
+#define S_CauseWP 22
+#define M_CauseWP (0x1 << S_CauseWP)
+#define S_CauseIP 8
+#define M_CauseIP (0xff << S_CauseIP)
+#define S_CauseIPEXT 10
+#define M_CauseIPEXT (0x3f << S_CauseIPEXT)
+#define S_CauseIP7 15
+#define M_CauseIP7 (0x1 << S_CauseIP7)
+#define S_CauseIP6 14
+#define M_CauseIP6 (0x1 << S_CauseIP6)
+#define S_CauseIP5 13
+#define M_CauseIP5 (0x1 << S_CauseIP5)
+#define S_CauseIP4 12
+#define M_CauseIP4 (0x1 << S_CauseIP4)
+#define S_CauseIP3 11
+#define M_CauseIP3 (0x1 << S_CauseIP3)
+#define S_CauseIP2 10
+#define M_CauseIP2 (0x1 << S_CauseIP2)
+#define S_CauseIP1 9
+#define M_CauseIP1 (0x1 << S_CauseIP1)
+#define S_CauseIP0 8
+#define M_CauseIP0 (0x1 << S_CauseIP0)
+#define S_CauseExcCode 2
+#define M_CauseExcCode (0x1f << S_CauseExcCode)
+
+#define M_Cause0Fields 0x4f3f0083
+#define M_CauseRFields 0xb000fc7c
+
+/*
+ * Values in the CE field
+ */
+#define K_CauseCE0 0 /* Coprocessor 0 in the CE field */
+#define K_CauseCE1 1 /* Coprocessor 1 in the CE field */
+#define K_CauseCE2 2 /* Coprocessor 2 in the CE field */
+#define K_CauseCE3 3 /* Coprocessor 3 in the CE field */
+
+/*
+ * Values in the ExcCode field
+ */
+#define EX_INT 0 /* Interrupt */
+#define EXC_INT (EX_INT << S_CauseExcCode)
+#define EX_MOD 1 /* TLB modified */
+#define EXC_MOD (EX_MOD << S_CauseExcCode)
+#define EX_TLBL 2 /* TLB exception (load or ifetch) */
+#define EXC_TLBL (EX_TLBL << S_CauseExcCode)
+#define EX_TLBS 3 /* TLB exception (store) */
+#define EXC_TLBS (EX_TLBS << S_CauseExcCode)
+#define EX_ADEL 4 /* Address error (load or ifetch) */
+#define EXC_ADEL (EX_ADEL << S_CauseExcCode)
+#define EX_ADES 5 /* Address error (store) */
+#define EXC_ADES (EX_ADES << S_CauseExcCode)
+#define EX_IBE 6 /* Instruction Bus Error */
+#define EXC_IBE (EX_IBE << S_CauseExcCode)
+#define EX_DBE 7 /* Data Bus Error */
+#define EXC_DBE (EX_DBE << S_CauseExcCode)
+#define EX_SYS 8 /* Syscall */
+#define EXC_SYS (EX_SYS << S_CauseExcCode)
+#define EX_SYSCALL EX_SYS
+#define EXC_SYSCALL EXC_SYS
+#define EX_BP 9 /* Breakpoint */
+#define EXC_BP (EX_BP << S_CauseExcCode)
+#define EX_BREAK EX_BP
+#define EXC_BREAK EXC_BP
+#define EX_RI 10 /* Reserved instruction */
+#define EXC_RI (EX_RI << S_CauseExcCode)
+#define EX_CPU 11 /* CoProcessor Unusable */
+#define EXC_CPU (EX_CPU << S_CauseExcCode)
+#define EX_OV 12 /* OVerflow */
+#define EXC_OV (EX_OV << S_CauseExcCode)
+#define EX_TR 13 /* Trap instruction */
+#define EXC_TR (EX_TR << S_CauseExcCode)
+#define EX_TRAP EX_TR
+#define EXC_TRAP EXC_TR
+#define EX_FPE 15 /* floating point exception */
+#define EXC_FPE (EX_FPE << S_CauseExcCode)
+#define EX_C2E 18 /* COP2 exception */
+#define EXC_C2E (EX_C2E << S_CauseExcCode)
+#define EX_MDMX 22 /* MDMX exception */
+#define EXC_MDMX (EX_MDMX << S_CauseExcCode)
+#define EX_WATCH 23 /* Watch exception */
+#define EXC_WATCH (EX_WATCH << S_CauseExcCode)
+#define EX_MCHECK 24 /* Machine check exception */
+#define EXC_MCHECK (EX_MCHECK << S_CauseExcCode)
+#define EX_CacheErr 30 /* Cache error caused re-entry to Debug Mode */
+#define EXC_CacheErr (EX_CacheErr << S_CauseExcCode)
+
+
+/*
+ ************************************************************************
+ * E P C R E G I S T E R ( 1 4 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // Exception PC | EPC
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_EPC $14
+#define R_C0_EPC 14
+
+#define M_EPC0Fields 0x00000000
+#define M_EPCRFields 0x00000000
+#define M_EPC0Fields64 UNS64Const(0x0000000000000000)
+#define M_EPCRFields64 UNS64Const(0x0000000000000000)
+
+/*
+ ************************************************************************
+ * P R I D R E G I S T E R ( 1 5 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Company Opts | Company ID | Procesor ID | Revision | PRId
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_PRId $15
+#define R_C0_PRId 15
+#define C0_PRID C0_PRID /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_PRIdCoOpt 24 /* Company options (R) */
+#define M_PRIdCoOpt (0xff << S_PRIdCoOpt)
+#define S_PRIdCoID 16 /* Company ID (R) */
+#define M_PRIdCoID (0xff << S_PRIdCoID)
+#define S_PRIdImp 8 /* Implementation ID (R) */
+#define M_PRIdImp (0xff << S_PRIdImp)
+#define S_PRIdRev 0 /* Revision (R) */
+#define M_PRIdRev (0xff << S_PRIdRev)
+
+#define M_PRId0Fields 0x00000000
+#define M_PRIdRFields 0xffffffff
+/*
+ * Values in the Company ID field
+ */
+#define K_PRIdCoID_MIPS 1
+#define K_PRIdCoID_Broadcom 2
+#define K_PRIdCoID_Alchemy 3
+#define K_PRIdCoID_SiByte 4
+#define K_PRIdCoID_SandCraft 5
+#define K_PRIdCoID_Philips 6
+#define K_PRIdCoID_NextAvailable 7 /* Next available encoding */
+
+
+/*
+ * Values in the implementation number field
+ */
+#define K_PRIdImp_Jade 0x80
+#define K_PRIdImp_Opal 0x81
+#define K_PRIdImp_Ruby 0x82
+#define K_PRIdImp_JadeLite 0x83
+#define K_PRIdImp_4KEc 0x84 /* Emerald with TLB MMU */
+#define K_PRIdImp_4KEmp 0x85 /* Emerald with FM MMU */
+#define K_PRIdImp_4KSc 0x86 /* Coral */
+
+#define K_PRIdImp_R3000 0x01
+#define K_PRIdImp_R4000 0x04
+#define K_PRIdImp_R10000 0x09
+#define K_PRIdImp_R4300 0x0b
+#define K_PRIdImp_R5000 0x23
+#define K_PRIdImp_R5200 0x28
+#define K_PRIdImp_R5400 0x54
+
+/*
+ ************************************************************************
+ * C O N F I G R E G I S T E R ( 1 6 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |M| |B| A | A | | K | Config
+ * | | Reserved for Implementations|E| T | R | Reserved | 0 |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Config $16
+#define R_C0_Config 16
+#define C0_CONFIG C0_Config /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_ConfigMore 31 /* Additional config registers present (R) */
+#define M_ConfigMore (0x1 << S_ConfigMore)
+#define S_ConfigImpl 16 /* Implementation-specific fields */
+#define M_ConfigImpl (0x7fff << S_ConfigImpl)
+#define S_ConfigBE 15 /* Denotes big-endian operation (R) */
+#define M_ConfigBE (0x1 << S_ConfigBE)
+#define S_ConfigAT 13 /* Architecture type (R) */
+#define M_ConfigAT (0x3 << S_ConfigAT)
+#define S_ConfigAR 10 /* Architecture revision (R) */
+#define M_ConfigAR (0x7 << S_ConfigAR)
+#define S_ConfigMT 7 /* MMU Type (R) */
+#define M_ConfigMT (0x7 << S_ConfigMT)
+#define S_ConfigK0 0 /* Kseg0 coherency algorithm (R/W) */
+#define M_ConfigK0 (0x7 << S_ConfigK0)
+
+/*
+ * The following definitions are technically part of the "reserved for
+ * implementations" field, but are the semi-standard definition used in
+ * fixed-mapping MMUs to control the cacheability of kuseg and kseg2/3
+ * references. For that reason, they are included here, but may be
+ * overridden by true implementation-specific definitions
+ */
+#define S_ConfigK23 28 /* Kseg2/3 coherency algorithm (FM MMU only) (R/W) */
+#define M_ConfigK23 (0x7 << S_ConfigK23)
+#define S_ConfigKU 25 /* Kuseg coherency algorithm (FM MMU only) (R/W) */
+#define M_ConfigKU (0x7 << S_ConfigKU)
+
+#define M_Config0Fields 0x00000078
+#define M_ConfigRFields 0x8000ff80
+
+/*
+ * Values in the AT field
+ */
+#define K_ConfigAT_MIPS32 0 /* MIPS32 */
+#define K_ConfigAT_MIPS64S 1 /* MIPS64 with 32-bit addresses */
+#define K_ConfigAT_MIPS64 2 /* MIPS64 with 32/64-bit addresses */
+
+/*
+ * Values in the MT field
+ */
+#define K_ConfigMT_NoMMU 0 /* No MMU */
+#define K_ConfigMT_TLBMMU 1 /* Standard TLB MMU */
+#define K_ConfigMT_BATMMU 2 /* Standard BAT MMU */
+#define K_ConfigMT_FMMMU 3 /* Standard Fixed Mapping MMU */
+
+
+/*
+ ************************************************************************
+ * C O N F I G 1 R E G I S T E R ( 1 6, SELECT 1 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |M| MMU Size | IS | IL | IA | DS | DL | DA |C|M|P|W|C|E|F| Config1
+ * | | | | | | | | |2|D|C|R|A|P|P|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Config1 $16,1
+#define R_C0_Config1 16
+
+#define S_Config1More 31 /* Additional Config registers present (R) */
+#define M_Config1More (0x1 << S_Config1More)
+#define S_Config1MMUSize 25 /* Number of MMU entries - 1 (R) */
+#define M_Config1MMUSize (0x3f << S_Config1MMUSize)
+#define S_Config1IS 22 /* Icache sets per way (R) */
+#define M_Config1IS (0x7 << S_Config1IS)
+#define S_Config1IL 19 /* Icache line size (R) */
+#define M_Config1IL (0x7 << S_Config1IL)
+#define S_Config1IA 16 /* Icache associativity - 1 (R) */
+#define M_Config1IA (0x7 << S_Config1IA)
+#define S_Config1DS 13 /* Dcache sets per way (R) */
+#define M_Config1DS (0x7 << S_Config1DS)
+#define S_Config1DL 10 /* Dcache line size (R) */
+#define M_Config1DL (0x7 << S_Config1DL)
+#define S_Config1DA 7 /* Dcache associativity (R) */
+#define M_Config1DA (0x7 << S_Config1DA)
+#define S_Config1C2 6 /* Coprocessor 2 present (R) */
+#define M_Config1C2 (0x1 << S_Config1C2)
+#define S_Config1MD 5 /* Denotes MDMX present (R) */
+#define M_Config1MD (0x1 << S_Config1MD)
+#define S_Config1PC 4 /* Denotes performance counters present (R) */
+#define M_Config1PC (0x1 << S_Config1PC)
+#define S_Config1WR 3 /* Denotes watch registers present (R) */
+#define M_Config1WR (0x1 << S_Config1WR)
+#define S_Config1CA 2 /* Denotes MIPS-16 present (R) */
+#define M_Config1CA (0x1 << S_Config1CA)
+#define S_Config1EP 1 /* Denotes EJTAG present (R) */
+#define M_Config1EP (0x1 << S_Config1EP)
+#define S_Config1FP 0 /* Denotes floating point present (R) */
+#define M_Config1FP (0x1 << S_Config1FP)
+
+#define M_Config10Fields 0x00000060
+#define M_Config1RFields 0x7fffff9f
+
+/*
+ * The following macro generates a table that is indexed
+ * by the Icache or Dcache sets field in Config1 and
+ * contains the decoded value of sets per way
+ */
+#define Config1CacheSets() \
+ HALF(64); \
+ HALF(128); \
+ HALF(256); \
+ HALF(512); \
+ HALF(1024); \
+ HALF(2048); \
+ HALF(4096); \
+ HALF(8192);
+
+/*
+ * The following macro generates a table that is indexed
+ * by the Icache or Dcache line size field in Config1 and
+ * contains the decoded value of the cache line size, in bytes
+ */
+#define Config1CacheLineSize() \
+ HALF(0); \
+ HALF(4); \
+ HALF(8); \
+ HALF(16); \
+ HALF(32); \
+ HALF(64); \
+ HALF(128); \
+ HALF(256);
+
+
+/*
+ ************************************************************************
+ * C O N F I G 2 R E G I S T E R ( 1 6, SELECT 2 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |M| | | | | | | | | | | | |S|T| Config1
+ * | | | | | | | | | | | | | |M|L|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Config2 $16,2
+#define R_C0_Config2 16
+
+#define S_Config2More 31 /* Additional Config registers present (R) */
+#define M_Config2More (0x1 << S_Config2More)
+#define S_Config2SM 1 /* Denotes SmartMIPS ASE present (R) */
+#define M_Config2SM (0x1 << S_Config2SM)
+#define S_Config2TL 0 /* Denotes Tracing Logic present (R) */
+#define M_Config2TL (0x1 << S_Config2TL)
+
+#define M_Config20Fields 0xfffffffc
+#define M_Config2RFields 0x00000003
+
+/*
+ ************************************************************************
+ * L L A D D R R E G I S T E R ( 1 7 ) *
+ ************************************************************************
+ *
+ * 6 6 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // LL Physical Address | LLAddr
+ * +-+-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_LLAddr $17
+#define R_C0_LLAddr 17
+#define C0_LLADDR C0_LLAddr /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_LLAddr0Fields 0x00000000
+#define M_LLAddrRFields 0x00000000
+#define M_LLAddr0Fields64 UNS64Const(0x0000000000000000)
+#define M_LLAddrRFields64 UNS64Const(0x0000000000000000)
+
+
+/*
+ ************************************************************************
+ * W A T C H L O R E G I S T E R ( 1 8 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // Watch Virtual Address |I|R|W| WatchLo
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_WatchLo $18
+#define R_C0_WatchLo 18
+#define C0_WATCHLO C0_WatchLo /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_WatchLoVAddr 3 /* Watch virtual address (R/W) */
+#define M_WatchLoVAddr (0x1fffffff << S_WatchLoVAddr)
+#define S_WatchLoI 2 /* Enable Istream watch (R/W) */
+#define M_WatchLoI (0x1 << S_WatchLoI)
+#define S_WatchLoR 1 /* Enable data read watch (R/W) */
+#define M_WatchLoR (0x1 << S_WatchLoR)
+#define S_WatchLoW 0 /* Enable data write watch (R/W) */
+#define M_WatchLoW (0x1 << S_WatchLoW)
+
+#define M_WatchLo0Fields 0x00000000
+#define M_WatchLoRFields 0x00000000
+#define M_WatchLo0Fields64 UNS64Const(0x0000000000000000)
+#define M_WatchLoRFields64 UNS64Const(0x0000000000000000)
+
+#define M_WatchLoEnables (M_WatchLoI | M_WatchLoR | M_WatchLoW)
+
+
+/*
+ ************************************************************************
+ * W A T C H H I R E G I S T E R ( 1 9 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |M|G| Rsvd | ASID | Rsvd | Mask | 0 | WatchHi
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_WatchHi $19
+#define R_C0_WatchHi 19
+#define C0_WATCHHI C0_WatchHi /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_WatchHiM 31 /* Denotes additional Watch registers present (R) */
+#define M_WatchHiM (0x1 << S_WatchHiM)
+#define S_WatchHiG 30 /* Enable ASID-independent Watch match (R/W) */
+#define M_WatchHiG (0x1 << S_WatchHiG)
+#define S_WatchHiASID 16 /* ASID value to match (R/W) */
+#define M_WatchHiASID (0xff << S_WatchHiASID)
+#define S_WatchHiMask 3 /* Address inhibit mask (R/W) */
+#define M_WatchHiMask (0x1ff << S_WatchHiMask)
+
+#define M_WatchHi0Fields 0x3f00f007
+#define M_WatchHiRFields 0x80000000
+
+
+/*
+ ************************************************************************
+ * X C O N T E X T R E G I S T E R ( 2 0 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // PTEBase | R | BadVPN2<39:13> | 0 | XContext
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_XContext $20
+#define R_C0_XContext 20
+#define C0_EXTCTXT C0_XContext /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_XContextBadVPN2 4 /* BadVPN2 (R) */
+#define S_XContextBadVPN S_XContextBadVPN2
+
+#define M_XContext0Fields 0x0000000f
+
+
+/*
+ ************************************************************************
+ * D E B U G R E G I S T E R ( 2 3 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |D|D|N|L|D|H|C|I|M|C|D|I|D|D| | |N|S| |D|D|D|D|D|D|
+ * |B|M|o|S|o|a|o|B|C|a|B|E|D|D|EJTAG|DExcCode |o|S| |I|I|D|D|B|S|
+ * |D| |D|N|z|l|u|u|h|c|u|X|B|B| ver | |S|t| |N|B|B|B|p|S|
+ * | | |C|M|e|t|n|s|e|h|s|I|S|L| | |S| | 0 |T| |S|L| | | Debug
+ * | | |R| | | |t|E|c|e|E| |I|I| | |t| | | | | | | | |
+ * | | | | | | |D|P|k|E|P| |m|m| | | | | | | | | | | |
+ * | | | | | | |M| |P|P| | |p|p| | | | | | | | | | | |
+ * | | | | | | | | | | | | |r|r| | | | | | | | | | | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_Debug $23 /* EJTAG */
+#define R_C0_Debug 23
+
+#define S_DebugDBD 31 /* Debug branch delay (R) */
+#define M_DebugDBD (0x1 << S_DebugDBD)
+#define S_DebugDM 30 /* Debug mode (R) */
+#define M_DebugDM (0x1 << S_DebugDM)
+#define S_DebugNoDCR 29 /* No debug control register present (R) */
+#define M_DebugNoDCR (0x1 << S_DebugNoDCR)
+#define S_DebugLSNM 28 /* Load/Store Normal Memory (R/W) */
+#define M_DebugLSNM (0x1 << S_DebugLSNM)
+#define S_DebugDoze 27 /* Doze (R) */
+#define M_DebugDoze (0x1 << S_DebugDoze)
+#define S_DebugHalt 26 /* Halt (R) */
+#define M_DebugHalt (0x1 << S_DebugHalt)
+#define S_DebugCountDM 25 /* Count register behavior in debug mode (R/W) */
+#define M_DebugCountDM (0x1 << S_DebugCountDM)
+#define S_DebugIBusEP 24 /* Imprecise Instn Bus Error Pending (R/W) */
+#define M_DebugIBusEP (0x1 << S_DebugIBusEP)
+#define S_DebugMCheckP 23 /* Imprecise Machine Check Pending (R/W) */
+#define M_DebugMCheckP (0x1 << S_DebugMCheckP)
+#define S_DebugCacheEP 22 /* Imprecise Cache Error Pending (R/W) */
+#define M_DebugCacheEP (0x1 << S_DebugCacheEP)
+#define S_DebugDBusEP 21 /* Imprecise Data Bus Error Pending (R/W) */
+#define M_DebugDBusEP (0x1 << S_DebugDBusEP)
+#define S_DebugIEXI 20 /* Imprecise Exception Inhibit (R/W) */
+#define M_DebugIEXI (0x1 << S_DebugIEXI)
+#define S_DebugDDBSImpr 19 /* Debug data break store imprecise (R) */
+#define M_DebugDDBSImpr (0x1 << S_DebugDDBSImpr)
+#define S_DebugDDBLImpr 18 /* Debug data break load imprecise (R) */
+#define M_DebugDDBLImpr (0x1 << S_DebugDDBLImpr)
+#define S_DebugEJTAGver 15 /* EJTAG version number (R) */
+#define M_DebugEJTAGver (0x7 << S_DebugEJTAGver)
+#define S_DebugDExcCode 10 /* Debug exception code (R) */
+#define M_DebugDExcCode (0x1f << S_DebugDExcCode)
+#define S_DebugNoSSt 9 /* No single step implemented (R) */
+#define M_DebugNoSSt (0x1 << S_DebugNoSSt)
+#define S_DebugSSt 8 /* Single step enable (R/W) */
+#define M_DebugSSt (0x1 << S_DebugSSt)
+#define S_DebugDINT 5 /* Debug interrupt (R) */
+#define M_DebugDINT (0x1 << S_DebugDINT)
+#define S_DebugDIB 4 /* Debug instruction break (R) */
+#define M_DebugDIB (0x1 << S_DebugDIB)
+#define S_DebugDDBS 3 /* Debug data break store (R) */
+#define M_DebugDDBS (0x1 << S_DebugDDBS)
+#define S_DebugDDBL 2 /* Debug data break load (R) */
+#define M_DebugDDBL (0x1 << S_DebugDDBL)
+#define S_DebugDBp 1 /* Debug breakpoint (R) */
+#define M_DebugDBp (0x1 << S_DebugDBp)
+#define S_DebugDSS 0 /* Debug single step (R) */
+#define M_DebugDSS (0x1 << S_DebugDSS)
+
+#define M_Debug0Fields 0x01f000c0
+#define M_DebugRFields 0xec0ffe3f
+
+
+/*
+ ************************************************************************
+ * D E P C R E G I S T E R ( 2 4 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // EJTAG Debug Exception PC | DEPC
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+
+#define C0_DEPC $24
+#define R_C0_DEPC 24
+
+#define M_DEEPC0Fields 0x00000000
+#define M_DEEPCRFields 0x00000000
+#define M_DEEPC0Fields64 UNS64Const(0x0000000000000000)
+#define M_DEEPCRFields64 UNS64Const(0x0000000000000000)
+
+
+/*
+ ************************************************************************
+ * P E R F C N T R E G I S T E R ( 2 5 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | | | |I| | | |E|
+ * |M| 0 | Event |E|U|S|K|X| PerfCnt
+ * | | | | | | | |L|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Event Count | PerfCnt
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_PerfCnt $25
+#define R_C0_PerfCnt 25
+#define C0_PRFCNT0 C0_PerfCnt /* OBSOLETE - DO NOT USE IN NEW CODE */
+#define C0_PRFCNT1 C0_PerfCnt /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define S_PerfCntM 31 /* More performance counters exist (R) */
+#define M_PerfCntM (1 << S_PerfCntM)
+#define S_PerfCntEvent 5 /* Enabled event (R/W) */
+#define M_PerfCntEvent (0x3f << S_PerfCntEvent)
+#define S_PerfCntIE 4 /* Interrupt Enable (R/W) */
+#define M_PerfCntIE (1 << S_PerfCntIE)
+#define S_PerfCntU 3 /* Enable counting in User Mode (R/W) */
+#define M_PerfCntU (1 << S_PerfCntU)
+#define S_PerfCntS 2 /* Enable counting in Supervisor Mode (R/W) */
+#define M_PerfCntS (1 << S_PerfCntS)
+#define S_PerfCntK 1 /* Enable counting in Kernel Mode (R/W) */
+#define M_PerfCntK (1 << S_PerfCntK)
+#define S_PerfCntEXL 0 /* Enable counting while EXL==1 (R/W) */
+#define M_PerfCntEXL (1 << S_PerfCntEXL)
+
+#define M_PerfCnt0Fields 0x7ffff800
+#define M_PerfCntRFields 0x80000000
+
+
+/*
+ ************************************************************************
+ * E R R C T L R E G I S T E R ( 2 6 ) *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Error Control | ErrCtl
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_ErrCtl $26
+#define R_C0_ErrCtl 26
+#define C0_ECC $26 /* OBSOLETE - DO NOT USE IN NEW CODE */
+#define R_C0_ECC 26 /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_ErrCtl0Fields 0x00000000
+#define M_ErrCtlRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * C A C H E E R R R E G I S T E R ( 2 7 ) * CacheErr
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Cache Error Control | CacheErr
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_CacheErr $27
+#define R_C0_CacheErr 27
+#define C0_CACHE_ERR C0_CacheErr /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_CacheErr0Fields 0x00000000
+#define M_CachErrRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * T A G L O R E G I S T E R ( 2 8 ) * TagLo
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TagLo | TagLo
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_TagLo $28
+#define R_C0_TagLo 28
+#define C0_TAGLO C0_TagLo /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+/*
+ * Some implementations use separate TagLo registers for the
+ * instruction and data caches. In those cases, the following
+ * definitions can be used in relevant code
+ */
+
+#define C0_ITagLo $28,0
+#define C0_DTagLo $28,2
+
+#define M_TagLo0Fields 0x00000000
+#define M_TagLoRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * D A T A L O R E G I S T E R ( 2 8, SELECT 1 ) * DataLo
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | DataLo | DataLo
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_DataLo $28,1
+#define R_C0_DataLo 28
+
+/*
+ * Some implementations use separate DataLo registers for the
+ * instruction and data caches. In those cases, the following
+ * definitions can be used in relevant code
+ */
+
+#define C0_IDataLo $28,1
+#define C0_DDataLo $28,3
+
+#define M_DataLo0Fields 0x00000000
+#define M_DataLoRFields 0xffffffff
+
+
+/*
+ ************************************************************************
+ * T A G H I R E G I S T E R ( 2 9 ) * TagHi
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | TagHi | TagHi
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_TagHi $29
+#define R_C0_TagHi 29
+#define C0_TAGHI C0_TagHi /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+/*
+ * Some implementations use separate TagHi registers for the
+ * instruction and data caches. In those cases, the following
+ * definitions can be used in relevant code
+ */
+
+#define C0_ITagHi $29,0
+#define C0_DTagHi $29,2
+
+#define M_TagHi0Fields 0x00000000
+#define M_TagHiRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * D A T A H I R E G I S T E R ( 2 9, SELECT 1 ) * DataHi
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | DataHi | DataHi
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_DataHi $29,1
+#define R_C0_DataHi 29
+
+/*
+ * Some implementations use separate DataHi registers for the
+ * instruction and data caches. In those cases, the following
+ * definitions can be used in relevant code
+ */
+
+#define C0_IDataHi $29,1
+#define C0_DDataHi $29,3
+
+#define M_DataHi0Fields 0x00000000
+#define M_DataHiRFields 0xffffffff
+
+
+/*
+ ************************************************************************
+ * E R R O R E P C R E G I S T E R ( 3 0 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // Error PC | ErrorEPC
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_ErrorEPC $30
+#define R_C0_ErrorEPC 30
+#define C0_ERROR_EPC C0_ErrorEPC /* OBSOLETE - DO NOT USE IN NEW CODE */
+
+#define M_ErrorEPC0Fields 0x00000000
+#define M_ErrorEPCRFields 0x00000000
+#define M_ErrorEPC0Fields64 UNS64Const(0x0000000000000000)
+#define M_ErrorEPCRFields64 UNS64Const(0x0000000000000000)
+
+
+/*
+ ************************************************************************
+ * D E S A V E R E G I S T E R ( 3 1 ) *
+ ************************************************************************
+ *
+ * 6 // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 3 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | // EJTAG Register Save Value | DESAVE
+ * +-+//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C0_DESAVE $31
+#define R_C0_DESAVE 31
+
+#define M_DESAVE0Fields 0x00000000
+#define M_DESAVERFields 0x00000000
+#define M_DESAVE0Fields64 UNS64Const(0x0000000000000000)
+#define M_DESAVERFields64 UNS64Const(0x0000000000000000)
+
+
+/*
+ *************************************************************************
+ * C P 1 R E G I S T E R D E F I N I T I O N S *
+ *************************************************************************
+ */
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F P R N A M E S *
+ *************************************************************************
+ */
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+/*
+ * The following definitions are used to convert an FPR name
+ * into the corresponding even or odd name, respectively.
+ * This is used in macro substitution in the AVPs.
+ */
+
+#define fp1_even $f0
+#define fp3_even $f2
+#define fp5_even $f4
+#define fp7_even $f6
+#define fp9_even $f8
+#define fp11_even $f10
+#define fp13_even $f12
+#define fp15_even $f14
+#define fp17_even $f16
+#define fp19_even $f18
+#define fp21_even $f20
+#define fp23_even $f22
+#define fp25_even $f24
+#define fp27_even $f26
+#define fp29_even $f28
+#define fp31_even $f30
+
+#define fp0_odd $f1
+#define fp2_odd $f3
+#define fp4_odd $f5
+#define fp6_odd $f7
+#define fp8_odd $f9
+#define fp10_odd $f11
+#define fp12_odd $f13
+#define fp14_odd $f15
+#define fp16_odd $f17
+#define fp18_odd $f19
+#define fp20_odd $f21
+#define fp22_odd $f23
+#define fp24_odd $f25
+#define fp26_odd $f27
+#define fp28_odd $f29
+#define fp30_odd $f31
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F P R I N D I C E S *
+ *************************************************************************
+ *
+ * These definitions provide the index (number) of the FPR, as opposed
+ * to the assembler register name ($n).
+ */
+
+#define R_fp0 0
+#define R_fp1 1
+#define R_fp2 2
+#define R_fp3 3
+#define R_fp4 4
+#define R_fp5 5
+#define R_fp6 6
+#define R_fp7 7
+#define R_fp8 8
+#define R_fp9 9
+#define R_fp10 10
+#define R_fp11 11
+#define R_fp12 12
+#define R_fp13 13
+#define R_fp14 14
+#define R_fp15 15
+#define R_fp16 16
+#define R_fp17 17
+#define R_fp18 18
+#define R_fp19 19
+#define R_fp20 20
+#define R_fp21 21
+#define R_fp22 22
+#define R_fp23 23
+#define R_fp24 24
+#define R_fp25 25
+#define R_fp26 26
+#define R_fp27 27
+#define R_fp28 28
+#define R_fp29 29
+#define R_fp30 30
+#define R_fp31 31
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F C R N A M E S *
+ *************************************************************************
+ */
+
+#define fc0 $0
+#define fc25 $25
+#define fc26 $26
+#define fc28 $28
+#define fc31 $31
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F C R I N D I C E S *
+ *************************************************************************
+ *
+ * These definitions provide the index (number) of the FCR, as opposed
+ * to the assembler register name ($n).
+ */
+
+#define R_fc0 0
+#define R_fc25 25
+#define R_fc26 26
+#define R_fc28 28
+#define R_fc31 31
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F C C N A M E S *
+ *************************************************************************
+ */
+
+#define cc0 $fcc0
+#define cc1 $fcc1
+#define cc2 $fcc2
+#define cc3 $fcc3
+#define cc4 $fcc4
+#define cc5 $fcc5
+#define cc6 $fcc6
+#define cc7 $fcc7
+
+
+/*
+ *************************************************************************
+ * H A R D W A R E F C C I N D I C E S *
+ *************************************************************************
+ *
+ * These definitions provide the index (number) of the CC, as opposed
+ * to the assembler register name ($n).
+ */
+
+#define R_cc0 0
+#define R_cc1 1
+#define R_cc2 2
+#define R_cc3 3
+#define R_cc4 4
+#define R_cc5 5
+#define R_cc6 6
+#define R_cc7 7
+
+
+/*
+ ************************************************************************
+ * I M P L E M E N T A T I O N R E G I S T E R *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |Reserved for Additional|3|P|D|S| Implementation| Revision | FIR
+ * | Configuration Bits |D|S| | | | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C1_FIR $0
+#define R_C1_FIR 0
+
+#define S_FIRConfigS 16
+#define M_FIRConfigS (0x1 << S_FIRConfigS)
+#define S_FIRConfigD 17
+#define M_FIRConfigD (0x1 << S_FIRConfigD)
+#define S_FIRConfigPS 18
+#define M_FIRConfigPS (0x1 << S_FIRConfigPS)
+#define S_FIRConfig3D 19
+#define M_FIRConfig3D (0x1 << S_FIRConfig3D)
+#define M_FIRConfigAll (M_FIRConfigS|M_FIRConfigD|M_FIRConfigPS|M_FIRConfig3D)
+
+#define S_FIRImp 8
+#define M_FIRImp (0xff << S_FIRImp)
+
+#define S_FIRRev 0
+#define M_FIRRev (0xff << S_FIRRev)
+
+#define M_FIR0Fields 0xfff00000
+#define M_FIRRFields 0x000fffff
+
+/*
+ ************************************************************************
+ * C O N D I T I O N C O D E S R E G I S T E R *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | CC | FCCR
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C1_FCCR $25
+#define R_C1_FCCR 25
+
+#define S_FCCRCC 0
+#define M_FCCRCC (0xff << S_FCCRCC)
+#define S_FCCRCC7 7
+#define M_FCCRCC7 (0x1 << S_FCCRCC7)
+#define S_FCCRCC6 6
+#define M_FCCRCC6 (0x1 << S_FCCRCC6)
+#define S_FCCRCC5 5
+#define M_FCCRCC5 (0x1 << S_FCCRCC5)
+#define S_FCCRCC4 4
+#define M_FCCRCC4 (0x1 << S_FCCRCC4)
+#define S_FCCRCC3 3
+#define M_FCCRCC3 (0x1 << S_FCCRCC3)
+#define S_FCCRCC2 2
+#define M_FCCRCC2 (0x1 << S_FCCRCC2)
+#define S_FCCRCC1 1
+#define M_FCCRCC1 (0x1 << S_FCCRCC1)
+#define S_FCCRCC0 0
+#define M_FCCRCC0 (0x1 << S_FCCRCC0)
+
+#define M_FCCR0Fields 0xffffff00
+#define M_FCCRRFields 0x000000ff
+
+
+/*
+ ************************************************************************
+ * E X C E P T I O N S R E G I S T E R *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | Cause | 0 | Flags | 0 | FEXR
+ * | |E|V|Z|O|U|I| |V|Z|O|U|I| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C1_FEXR $26
+#define R_C1_FEXR 26
+
+#define S_FEXRExc 12
+#define M_FEXRExc (0x3f << S_FEXRExc)
+#define S_FEXRExcE 17
+#define M_FEXRExcE (0x1 << S_FEXRExcE)
+#define S_FEXRExcV 16
+#define M_FEXRExcV (0x1 << S_FEXRExcV)
+#define S_FEXRExcZ 15
+#define M_FEXRExcZ (0x1 << S_FEXRExcZ)
+#define S_FEXRExcO 14
+#define M_FEXRExcO (0x1 << S_FEXRExcO)
+#define S_FEXRExcU 13
+#define M_FEXRExcU (0x1 << S_FEXRExcU)
+#define S_FEXRExcI 12
+#define M_FEXRExcI (0x1 << S_FEXRExcI)
+
+#define S_FEXRFlg 2
+#define M_FEXRFlg (0x1f << S_FEXRFlg)
+#define S_FEXRFlgV 6
+#define M_FEXRFlgV (0x1 << S_FEXRFlgV)
+#define S_FEXRFlgZ 5
+#define M_FEXRFlgZ (0x1 << S_FEXRFlgZ)
+#define S_FEXRFlgO 4
+#define M_FEXRFlgO (0x1 << S_FEXRFlgO)
+#define S_FEXRFlgU 3
+#define M_FEXRFlgU (0x1 << S_FEXRFlgU)
+#define S_FEXRFlgI 2
+#define M_FEXRFlgI (0x1 << S_FEXRFlgI)
+
+#define M_FEXR0Fields 0xfffc0f83
+#define M_FEXRRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * E N A B L E S R E G I S T E R *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | 0 | Enables | 0 |F|RM | FENR
+ * | |V|Z|O|U|I| |S| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C1_FENR $28
+#define R_C1_FENR 28
+
+#define S_FENREna 7
+#define M_FENREna (0x1f << S_FENREna)
+#define S_FENREnaV 11
+#define M_FENREnaV (0x1 << S_FENREnaV)
+#define S_FENREnaZ 10
+#define M_FENREnaZ (0x1 << S_FENREnaZ)
+#define S_FENREnaO 9
+#define M_FENREnaO (0x1 << S_FENREnaO)
+#define S_FENREnaU 8
+#define M_FENREnaU (0x1 << S_FENREnaU)
+#define S_FENREnaI 7
+#define M_FENREnaI (0x1 << S_FENREnaI)
+
+#define S_FENRFS 2
+#define M_FENRFS (0x1 << S_FENRFS)
+
+#define S_FENRRM 0
+#define M_FENRRM (0x3 << S_FENRRM)
+
+#define M_FENR0Fields 0xfffff078
+#define M_FENRRFields 0x00000000
+
+
+/*
+ ************************************************************************
+ * C O N T R O L / S T A T U S R E G I S T E R *
+ ************************************************************************
+ *
+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | FCC |F|C|Imp| 0 | Cause | Enables | Flags | RM| FCSR
+ * |7|6|5|4|3|2|1|S|C| | |E|V|Z|O|U|I|V|Z|O|U|I|V|Z|O|U|I| |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+#define C1_FCSR $31
+#define R_C1_FCSR 31
+
+#define S_FCSRFCC7_1 25 /* Floating point condition codes 7..1 (R/W) */
+#define M_FCSRFCC7_1 (0x7f << S_FCSRFCC7_1)
+#define S_FCSRCC7 31
+#define M_FCSRCC7 (0x1 << S_FCSRCC7)
+#define S_FCSRCC6 30
+#define M_FCSRCC6 (0x1 << S_FCSRCC6)
+#define S_FCSRCC5 29
+#define M_FCSRCC5 (0x1 << S_FCSRCC5)
+#define S_FCSRCC4 28
+#define M_FCSRCC4 (0x1 << S_FCSRCC4)
+#define S_FCSRCC3 27
+#define M_FCSRCC3 (0x1 << S_FCSRCC3)
+#define S_FCSRCC2 26
+#define M_FCSRCC2 (0x1 << S_FCSRCC2)
+#define S_FCSRCC1 25
+#define M_FCSRCC1 (0x1 << S_FCSRCC1)
+
+#define S_FCSRFS 24 /* Flush denorms to zero (R/W) */
+#define M_FCSRFS (0x1 << S_FCSRFS)
+
+#define S_FCSRCC0 23 /* Floating point condition code 0 (R/W) */
+#define M_FCSRCC0 (0x1 << S_FCSRCC0)
+#define S_FCSRCC S_FCSRCC0
+#define M_FCSRCC M_FCSRCC0
+
+#define S_FCSRImpl 21 /* Implementation-specific control bits (R/W) */
+#define M_FCSRImpl (0x3 << S_FCSRImpl)
+
+#define S_FCSRExc 12 /* Exception cause (R/W) */
+#define M_FCSRExc (0x3f << S_FCSRExc)
+#define S_FCSRExcE 17
+#define M_FCSRExcE (0x1 << S_FCSRExcE)
+#define S_FCSRExcV 16
+#define M_FCSRExcV (0x1 << S_FCSRExcV)
+#define S_FCSRExcZ 15
+#define M_FCSRExcZ (0x1 << S_FCSRExcZ)
+#define S_FCSRExcO 14
+#define M_FCSRExcO (0x1 << S_FCSRExcO)
+#define S_FCSRExcU 13
+#define M_FCSRExcU (0x1 << S_FCSRExcU)
+#define S_FCSRExcI 12
+#define M_FCSRExcI (0x1 << S_FCSRExcI)
+
+#define S_FCSREna 7 /* Exception enable (R/W) */
+#define M_FCSREna (0x1f << S_FCSREna)
+#define S_FCSREnaV 11
+#define M_FCSREnaV (0x1 << S_FCSREnaV)
+#define S_FCSREnaZ 10
+#define M_FCSREnaZ (0x1 << S_FCSREnaZ)
+#define S_FCSREnaO 9
+#define M_FCSREnaO (0x1 << S_FCSREnaO)
+#define S_FCSREnaU 8
+#define M_FCSREnaU (0x1 << S_FCSREnaU)
+#define S_FCSREnaI 7
+#define M_FCSREnaI (0x1 << S_FCSREnaI)
+
+#define S_FCSRFlg 2 /* Exception flags (R/W) */
+#define M_FCSRFlg (0x1f << S_FCSRFlg)
+#define S_FCSRFlgV 6
+#define M_FCSRFlgV (0x1 << S_FCSRFlgV)
+#define S_FCSRFlgZ 5
+#define M_FCSRFlgZ (0x1 << S_FCSRFlgZ)
+#define S_FCSRFlgO 4
+#define M_FCSRFlgO (0x1 << S_FCSRFlgO)
+#define S_FCSRFlgU 3
+#define M_FCSRFlgU (0x1 << S_FCSRFlgU)
+#define S_FCSRFlgI 2
+#define M_FCSRFlgI (0x1 << S_FCSRFlgI)
+
+#define S_FCSRRM 0 /* Rounding mode (R/W) */
+#define M_FCSRRM (0x3 << S_FCSRRM)
+
+#define M_FCSR0Fields 0x001c0000
+#define M_FCSRRFields 0x00000000
+
+/*
+ * Values in the rounding mode field (of both FCSR and FCCR)
+ */
+#define K_FCSRRM_RN 0
+#define K_FCSRRM_RZ 1
+#define K_FCSRRM_RP 2
+#define K_FCSRRM_RM 3
+
+#endif /* _COMMON_MIPS_DEF_H_ */
diff --git a/libcpu/mips/common/mips_excpt.h b/libcpu/mips/common/mips_excpt.h
new file mode 100644
index 0000000000..868b046d3c
--- /dev/null
+++ b/libcpu/mips/common/mips_excpt.h
@@ -0,0 +1,39 @@
+/*
+ * File : mips_excpt.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _MIPS_EXCPT_H_
+#define _MIPS_EXCPT_H_
+
+#include "mips_regs.h"
+
+#ifndef __ASSEMBLY__
+typedef void (* exception_func_t)(mips_reg_ctx *regs);
+
+//extern exception_func_t mips_exception_handlers[];
+
+int rt_hw_exception_init(void);
+exception_func_t rt_set_except_vector(int n, exception_func_t func);
+void install_default_execpt_handle(void);
+#endif /* __ASSEMBLY__ */
+#endif /* _MIPS_EXCPT_H_ */
diff --git a/libcpu/mips/common/mips_regs.h b/libcpu/mips/common/mips_regs.h
new file mode 100644
index 0000000000..7ea07d3869
--- /dev/null
+++ b/libcpu/mips/common/mips_regs.h
@@ -0,0 +1,1168 @@
+/*
+ * File : mips_regs.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _MIPS_REGS_H_
+#define _MIPS_REGS_H_
+
+
+#if !defined(__ASSEMBLY__) && !defined(ASSEMBLY)
+#include <rtdef.h>
+
+#define MIPS_REG_NR 32
+typedef struct {
+ rt_uint32_t regs[MIPS_REG_NR]; /* 32 ��ͨ��Ŀ�ļĴ��� */
+ rt_uint32_t CP0Status; /* CP0 Э������״̬�Ĵ��� */
+ rt_uint32_t CP0DataHI; /* ������λ�Ĵ��� */
+ rt_uint32_t CP0DataLO; /* ������λ�Ĵ��� */
+ rt_uint32_t CP0BadVAddr; /* ������ַ�Ĵ��� */
+ rt_uint32_t CP0Cause; /* �����жϻ����쳣�鿴�ļĴ���*/
+ rt_uint32_t CP0EPC; /* ����������Ĵ��� */
+} mips_reg_ctx;
+
+#define MIPS_ARG_REG_NR 4
+typedef struct
+{
+ rt_uint32_t args[MIPS_ARG_REG_NR]; /* 4 �������Ĵ��� */
+} mips_arg_ctx;
+
+struct linkctx
+{
+ rt_uint32_t id;
+ struct linkctx *next;
+};
+
+struct fpctx
+{
+ struct linkctx link;
+ rt_uint32_t fcsr;
+ rt_uint32_t reserved;
+};
+
+
+struct fp32ctx
+{
+ struct fpctx fp;
+ union
+ {
+ double d[16]; /* even doubles */
+ float s[32]; /* even singles, padded */
+ };
+};
+
+struct fp64ctx
+{
+ struct fpctx fp;
+ union
+ {
+ double d[32]; /* even doubles, followed by odd doubles */
+ float s[64]; /* even singles, followed by odd singles, padded */
+ };
+};
+
+#endif /* !defined(__ASSEMBLY__) && !defined(ASSEMBLY) */
+
+#define MIPS_STK_CTX_WORD_SIZE 38
+#define SZREG 4
+/*********************************************************************************************************
+ MIPS �ļĴ�������
+*********************************************************************************************************/
+#define REG_ZERO 0 /* wired zero */
+#define REG_AT 1 /* assembler temp */
+#define REG_V0 2 /* return reg 0 */
+#define REG_V1 3 /* return reg 1 */
+#define REG_A0 4 /* arg reg 0 */
+#define REG_A1 5 /* arg reg 1 */
+#define REG_A2 6 /* arg reg 2 */
+#define REG_A3 7 /* arg reg 3 */
+#define REG_T0 8 /* caller saved 0 */
+#define REG_T1 9 /* caller saved 1 */
+#define REG_T2 10 /* caller saved 2 */
+#define REG_T3 11 /* caller saved 3 */
+#define REG_T4 12 /* caller saved 4 */
+#define REG_T5 13 /* caller saved 5 */
+#define REG_T6 14 /* caller saved 6 */
+#define REG_T7 15 /* caller saved 7 */
+#define REG_S0 16 /* callee saved 0 */
+#define REG_S1 17 /* callee saved 1 */
+#define REG_S2 18 /* callee saved 2 */
+#define REG_S3 19 /* callee saved 3 */
+#define REG_S4 20 /* callee saved 4 */
+#define REG_S5 21 /* callee saved 5 */
+#define REG_S6 22 /* callee saved 6 */
+#define REG_S7 23 /* callee saved 7 */
+#define REG_T8 24 /* caller saved 8 */
+#define REG_T9 25 /* caller saved 9 */
+#define REG_K0 26 /* kernel temp 0 */
+#define REG_K1 27 /* kernel temp 1 */
+#define REG_GP 28 /* global pointer */
+#define REG_SP 29 /* stack pointer */
+#define REG_S8 30 /* callee saved 8 */
+#define REG_FP REG_S8 /* callee saved 8 */
+#define REG_RA 31 /* return address */
+
+#define STK_CTX_SIZE (MIPS_STK_CTX_WORD_SIZE * SZREG)
+#define STK_OFFSET_SR ((32 + 0) * SZREG)
+#define STK_OFFSET_HI ((32 + 1) * SZREG)
+#define STK_OFFSET_LO ((32 + 2) * SZREG)
+#define STK_OFFSET_BADVADDR ((32 + 3) * SZREG)
+#define STK_OFFSET_CAUSE ((32 + 4) * SZREG)
+#define STK_OFFSET_EPC ((32 + 5) * SZREG)
+
+#define STK_OFFSET_LAST ((MIPS_STK_CTX_WORD_SIZE - 1) * SZREG)
+
+#define FP32CTX_CSR ((SZREG)*2)
+#define FP64CTX_CSR ((SZREG)*2)
+
+#define LINKCTX_ID ((SZREG)*0)
+#define LINKCTX_NEXT ((SZREG)*1)
+#define LINKCTX_TYPE_MSA 0x004D5341
+#define LINKCTX_TYPE_FP32 0x46503332
+#define LINKCTX_TYPE_FP64 0x46503634
+#define LINKCTX_TYPE_FMSA 0x463D5341
+#define LINKCTX_TYPE_DSP 0x00445350
+#define LINKCTX_TYPE_STKSWP 0x53574150
+#define LINKCTX_TYPE_XPA 0x00585041
+
+#define FP32CTX_0 ((SZREG)*4)
+#define FP32CTX_2 (FP32CTX_0 + (1 * 8))
+#define FP32CTX_4 (FP32CTX_0 + (2 * 8))
+#define FP32CTX_6 (FP32CTX_0 + (3 * 8))
+#define FP32CTX_8 (FP32CTX_0 + (4 * 8))
+#define FP32CTX_10 (FP32CTX_0 + (5 * 8))
+#define FP32CTX_12 (FP32CTX_0 + (6 * 8))
+#define FP32CTX_14 (FP32CTX_0 + (7 * 8))
+#define FP32CTX_16 (FP32CTX_0 + (8 * 8))
+#define FP32CTX_18 (FP32CTX_0 + (9 * 8))
+#define FP32CTX_20 (FP32CTX_0 + (10 * 8))
+#define FP32CTX_22 (FP32CTX_0 + (11 * 8))
+#define FP32CTX_24 (FP32CTX_0 + (12 * 8))
+#define FP32CTX_26 (FP32CTX_0 + (13 * 8))
+#define FP32CTX_28 (FP32CTX_0 + (14 * 8))
+#define FP32CTX_30 (FP32CTX_0 + (15 * 8))
+#define FP32CTX_SIZE (FP32CTX_30 + (17 * 8))
+
+#define FP64CTX_0 ((SZREG)*4)
+#define FP64CTX_2 (FP64CTX_0 + (1 * 8))
+#define FP64CTX_4 (FP64CTX_0 + (2 * 8))
+#define FP64CTX_6 (FP64CTX_0 + (3 * 8))
+#define FP64CTX_8 (FP64CTX_0 + (4 * 8))
+#define FP64CTX_10 (FP64CTX_0 + (5 * 8))
+#define FP64CTX_12 (FP64CTX_0 + (6 * 8))
+#define FP64CTX_14 (FP64CTX_0 + (7 * 8))
+#define FP64CTX_16 (FP64CTX_0 + (8 * 8))
+#define FP64CTX_18 (FP64CTX_0 + (9 * 8))
+#define FP64CTX_20 (FP64CTX_0 + (10 * 8))
+#define FP64CTX_22 (FP64CTX_0 + (11 * 8))
+#define FP64CTX_24 (FP64CTX_0 + (12 * 8))
+#define FP64CTX_26 (FP64CTX_0 + (13 * 8))
+#define FP64CTX_28 (FP64CTX_0 + (14 * 8))
+#define FP64CTX_30 (FP64CTX_0 + (15 * 8))
+#define FP64CTX_1 (FP64CTX_30 + (1 * 8))
+#define FP64CTX_3 (FP64CTX_30 + (2 * 8))
+#define FP64CTX_5 (FP64CTX_30 + (3 * 8))
+#define FP64CTX_7 (FP64CTX_30 + (4 * 8))
+#define FP64CTX_9 (FP64CTX_30 + (5 * 8))
+#define FP64CTX_11 (FP64CTX_30 + (6 * 8))
+#define FP64CTX_13 (FP64CTX_30 + (7 * 8))
+#define FP64CTX_15 (FP64CTX_30 + (8 * 8))
+#define FP64CTX_17 (FP64CTX_30 + (9 * 8))
+#define FP64CTX_19 (FP64CTX_30 + (10 * 8))
+#define FP64CTX_21 (FP64CTX_30 + (11 * 8))
+#define FP64CTX_23 (FP64CTX_30 + (12 * 8))
+#define FP64CTX_25 (FP64CTX_30 + (13 * 8))
+#define FP64CTX_27 (FP64CTX_30 + (14 * 8))
+#define FP64CTX_29 (FP64CTX_30 + (15 * 8))
+#define FP64CTX_31 (FP64CTX_30 + (16 * 8))
+#define FP64CTX_SIZE (FP64CTX_31 + (17 * 8))
+
+#define FPCTX_SIZE() (mips_getsr() & ST0_FR ? FP64CTX_SIZE : FP32CTX_SIZE)
+
+/*
+ * The following macros are especially useful for __asm__
+ * inline assembler.
+ */
+#ifndef __STR
+#define __STR(x) #x
+#endif
+#ifndef STR
+#define STR(x) __STR(x)
+#endif
+
+/*
+ * Configure language
+ */
+#ifdef __ASSEMBLY__
+#define _ULCAST_
+#else
+#define _ULCAST_ (unsigned long)
+#endif
+
+/*
+ * Coprocessor 0 register names
+ */
+#define CP0_INDEX $0
+#define CP0_RANDOM $1
+#define CP0_ENTRYLO0 $2
+#define CP0_ENTRYLO1 $3
+#define CP0_CONF $3
+#define CP0_CONTEXT $4
+#define CP0_PAGEMASK $5
+#define CP0_WIRED $6
+#define CP0_INFO $7
+#define CP0_BADVADDR $8
+#define CP0_COUNT $9
+#define CP0_ENTRYHI $10
+#define CP0_COMPARE $11
+#define CP0_STATUS $12
+#define CP0_CAUSE $13
+#define CP0_EPC $14
+#define CP0_PRID $15
+#define CP0_CONFIG $16
+#define CP0_LLADDR $17
+#define CP0_WATCHLO $18
+#define CP0_WATCHHI $19
+#define CP0_XCONTEXT $20
+#define CP0_FRAMEMASK $21
+#define CP0_DIAGNOSTIC $22
+#define CP0_DEBUG $23
+#define CP0_DEPC $24
+#define CP0_PERFORMANCE $25
+#define CP0_ECC $26
+#define CP0_CACHEERR $27
+#define CP0_TAGLO $28
+#define CP0_TAGHI $29
+#define CP0_ERROREPC $30
+#define CP0_DESAVE $31
+
+/*
+ * R4640/R4650 cp0 register names. These registers are listed
+ * here only for completeness; without MMU these CPUs are not useable
+ * by Linux. A future ELKS port might take make Linux run on them
+ * though ...
+ */
+#define CP0_IBASE $0
+#define CP0_IBOUND $1
+#define CP0_DBASE $2
+#define CP0_DBOUND $3
+#define CP0_CALG $17
+#define CP0_IWATCH $18
+#define CP0_DWATCH $19
+
+/*
+ * Coprocessor 0 Set 1 register names
+ */
+#define CP0_S1_DERRADDR0 $26
+#define CP0_S1_DERRADDR1 $27
+#define CP0_S1_INTCONTROL $20
+
+/*
+ * TX39 Series
+ */
+#define CP0_TX39_CACHE $7
+
+/*
+ * Coprocessor 1 (FPU) register names
+ */
+#define CP1_REVISION $0
+#define CP1_STATUS $31
+
+/*
+ * FPU Status Register Values
+ */
+/*
+ * Status Register Values
+ */
+
+#define FPU_CSR_FLUSH 0x01000000 /* flush denormalised results to 0 */
+#define FPU_CSR_COND 0x00800000 /* $fcc0 */
+#define FPU_CSR_COND0 0x00800000 /* $fcc0 */
+#define FPU_CSR_COND1 0x02000000 /* $fcc1 */
+#define FPU_CSR_COND2 0x04000000 /* $fcc2 */
+#define FPU_CSR_COND3 0x08000000 /* $fcc3 */
+#define FPU_CSR_COND4 0x10000000 /* $fcc4 */
+#define FPU_CSR_COND5 0x20000000 /* $fcc5 */
+#define FPU_CSR_COND6 0x40000000 /* $fcc6 */
+#define FPU_CSR_COND7 0x80000000 /* $fcc7 */
+
+/*
+ * X the exception cause indicator
+ * E the exception enable
+ * S the sticky/flag bit
+*/
+#define FPU_CSR_ALL_X 0x0003f000
+#define FPU_CSR_UNI_X 0x00020000
+#define FPU_CSR_INV_X 0x00010000
+#define FPU_CSR_DIV_X 0x00008000
+#define FPU_CSR_OVF_X 0x00004000
+#define FPU_CSR_UDF_X 0x00002000
+#define FPU_CSR_INE_X 0x00001000
+
+#define FPU_CSR_ALL_E 0x00000f80
+#define FPU_CSR_INV_E 0x00000800
+#define FPU_CSR_DIV_E 0x00000400
+#define FPU_CSR_OVF_E 0x00000200
+#define FPU_CSR_UDF_E 0x00000100
+#define FPU_CSR_INE_E 0x00000080
+
+#define FPU_CSR_ALL_S 0x0000007c
+#define FPU_CSR_INV_S 0x00000040
+#define FPU_CSR_DIV_S 0x00000020
+#define FPU_CSR_OVF_S 0x00000010
+#define FPU_CSR_UDF_S 0x00000008
+#define FPU_CSR_INE_S 0x00000004
+
+/* rounding mode */
+#define FPU_CSR_RN 0x0 /* nearest */
+#define FPU_CSR_RZ 0x1 /* towards zero */
+#define FPU_CSR_RU 0x2 /* towards +Infinity */
+#define FPU_CSR_RD 0x3 /* towards -Infinity */
+
+
+/*
+ * Values for PageMask register
+ */
+#ifdef CONFIG_CPU_VR41XX
+
+/* Why doesn't stupidity hurt ... */
+
+#define PM_1K 0x00000000
+#define PM_4K 0x00001800
+#define PM_16K 0x00007800
+#define PM_64K 0x0001f800
+#define PM_256K 0x0007f800
+
+#else
+
+#define PM_4K 0x00000000
+#define PM_16K 0x00006000
+#define PM_64K 0x0001e000
+#define PM_256K 0x0007e000
+#define PM_1M 0x001fe000
+#define PM_4M 0x007fe000
+#define PM_16M 0x01ffe000
+#define PM_64M 0x07ffe000
+#define PM_256M 0x1fffe000
+
+#endif
+
+/*
+ * Values used for computation of new tlb entries
+ */
+#define PL_4K 12
+#define PL_16K 14
+#define PL_64K 16
+#define PL_256K 18
+#define PL_1M 20
+#define PL_4M 22
+#define PL_16M 24
+#define PL_64M 26
+#define PL_256M 28
+
+/*
+ * R4x00 interrupt enable / cause bits
+ */
+#define IE_SW0 (_ULCAST_(1) << 8)
+#define IE_SW1 (_ULCAST_(1) << 9)
+#define IE_IRQ0 (_ULCAST_(1) << 10)
+#define IE_IRQ1 (_ULCAST_(1) << 11)
+#define IE_IRQ2 (_ULCAST_(1) << 12)
+#define IE_IRQ3 (_ULCAST_(1) << 13)
+#define IE_IRQ4 (_ULCAST_(1) << 14)
+#define IE_IRQ5 (_ULCAST_(1) << 15)
+
+/*
+ * R4x00 interrupt cause bits
+ */
+#define C_SW0 (_ULCAST_(1) << 8)
+#define C_SW1 (_ULCAST_(1) << 9)
+#define C_IRQ0 (_ULCAST_(1) << 10)
+#define C_IRQ1 (_ULCAST_(1) << 11)
+#define C_IRQ2 (_ULCAST_(1) << 12)
+#define C_IRQ3 (_ULCAST_(1) << 13)
+#define C_IRQ4 (_ULCAST_(1) << 14)
+#define C_IRQ5 (_ULCAST_(1) << 15)
+
+/*
+ * Bitfields in the R4xx0 cp0 status register
+ */
+#define ST0_IE 0x00000001
+#define ST0_EXL 0x00000002
+#define ST0_ERL 0x00000004
+#define ST0_KSU 0x00000018
+# define KSU_USER 0x00000010
+# define KSU_SUPERVISOR 0x00000008
+# define KSU_KERNEL 0x00000000
+#define ST0_UX 0x00000020
+#define ST0_SX 0x00000040
+#define ST0_KX 0x00000080
+#define ST0_DE 0x00010000
+#define ST0_CE 0x00020000
+
+/*
+ * Bitfields in the R[23]000 cp0 status register.
+ */
+#define ST0_IEC 0x00000001
+#define ST0_KUC 0x00000002
+#define ST0_IEP 0x00000004
+#define ST0_KUP 0x00000008
+#define ST0_IEO 0x00000010
+#define ST0_KUO 0x00000020
+/* bits 6 & 7 are reserved on R[23]000 */
+#define ST0_ISC 0x00010000
+#define ST0_SWC 0x00020000
+#define ST0_CM 0x00080000
+
+/*
+ * Bits specific to the R4640/R4650
+ */
+#define ST0_UM (_ULCAST_(1) << 4)
+#define ST0_IL (_ULCAST_(1) << 23)
+#define ST0_DL (_ULCAST_(1) << 24)
+
+/*
+ * Bitfields in the TX39 family CP0 Configuration Register 3
+ */
+#define TX39_CONF_ICS_SHIFT 19
+#define TX39_CONF_ICS_MASK 0x00380000
+#define TX39_CONF_ICS_1KB 0x00000000
+#define TX39_CONF_ICS_2KB 0x00080000
+#define TX39_CONF_ICS_4KB 0x00100000
+#define TX39_CONF_ICS_8KB 0x00180000
+#define TX39_CONF_ICS_16KB 0x00200000
+
+#define TX39_CONF_DCS_SHIFT 16
+#define TX39_CONF_DCS_MASK 0x00070000
+#define TX39_CONF_DCS_1KB 0x00000000
+#define TX39_CONF_DCS_2KB 0x00010000
+#define TX39_CONF_DCS_4KB 0x00020000
+#define TX39_CONF_DCS_8KB 0x00030000
+#define TX39_CONF_DCS_16KB 0x00040000
+
+#define TX39_CONF_CWFON 0x00004000
+#define TX39_CONF_WBON 0x00002000
+#define TX39_CONF_RF_SHIFT 10
+#define TX39_CONF_RF_MASK 0x00000c00
+#define TX39_CONF_DOZE 0x00000200
+#define TX39_CONF_HALT 0x00000100
+#define TX39_CONF_LOCK 0x00000080
+#define TX39_CONF_ICE 0x00000020
+#define TX39_CONF_DCE 0x00000010
+#define TX39_CONF_IRSIZE_SHIFT 2
+#define TX39_CONF_IRSIZE_MASK 0x0000000c
+#define TX39_CONF_DRSIZE_SHIFT 0
+#define TX39_CONF_DRSIZE_MASK 0x00000003
+
+/*
+ * Status register bits available in all MIPS CPUs.
+ */
+#define ST0_IM 0x0000ff00
+#define STATUSB_IP0 8
+#define STATUSF_IP0 (_ULCAST_(1) << 8)
+#define STATUSB_IP1 9
+#define STATUSF_IP1 (_ULCAST_(1) << 9)
+#define STATUSB_IP2 10
+#define STATUSF_IP2 (_ULCAST_(1) << 10)
+#define STATUSB_IP3 11
+#define STATUSF_IP3 (_ULCAST_(1) << 11)
+#define STATUSB_IP4 12
+#define STATUSF_IP4 (_ULCAST_(1) << 12)
+#define STATUSB_IP5 13
+#define STATUSF_IP5 (_ULCAST_(1) << 13)
+#define STATUSB_IP6 14
+#define STATUSF_IP6 (_ULCAST_(1) << 14)
+#define STATUSB_IP7 15
+#define STATUSF_IP7 (_ULCAST_(1) << 15)
+#define STATUSB_IP8 0
+#define STATUSF_IP8 (_ULCAST_(1) << 0)
+#define STATUSB_IP9 1
+#define STATUSF_IP9 (_ULCAST_(1) << 1)
+#define STATUSB_IP10 2
+#define STATUSF_IP10 (_ULCAST_(1) << 2)
+#define STATUSB_IP11 3
+#define STATUSF_IP11 (_ULCAST_(1) << 3)
+#define STATUSB_IP12 4
+#define STATUSF_IP12 (_ULCAST_(1) << 4)
+#define STATUSB_IP13 5
+#define STATUSF_IP13 (_ULCAST_(1) << 5)
+#define STATUSB_IP14 6
+#define STATUSF_IP14 (_ULCAST_(1) << 6)
+#define STATUSB_IP15 7
+#define STATUSF_IP15 (_ULCAST_(1) << 7)
+#define ST0_CH 0x00040000
+#define ST0_SR 0x00100000
+#define ST0_TS 0x00200000
+#define ST0_BEV 0x00400000
+#define ST0_RE 0x02000000
+#define ST0_FR 0x04000000
+#define ST0_CU 0xf0000000
+#define ST0_CU0 0x10000000
+#define ST0_CU1 0x20000000
+#define ST0_CU1_SHIFT 29
+#define ST0_CU2 0x40000000
+#define ST0_CU3 0x80000000
+#define ST0_XX 0x80000000 /* MIPS IV naming */
+
+/*
+ * Bitfields and bit numbers in the coprocessor 0 cause register.
+ *
+ * Refer to your MIPS R4xx0 manual, chapter 5 for explanation.
+ */
+#define CAUSEB_EXCCODE 2
+#define CAUSEF_EXCCODE (_ULCAST_(31) << 2)
+#define CAUSEB_IP 8
+#define CAUSEF_IP (_ULCAST_(255) << 8)
+#define CAUSEB_IP0 8
+#define CAUSEF_IP0 (_ULCAST_(1) << 8)
+#define CAUSEB_IP1 9
+#define CAUSEF_IP1 (_ULCAST_(1) << 9)
+#define CAUSEB_IP2 10
+#define CAUSEF_IP2 (_ULCAST_(1) << 10)
+#define CAUSEB_IP3 11
+#define CAUSEF_IP3 (_ULCAST_(1) << 11)
+#define CAUSEB_IP4 12
+#define CAUSEF_IP4 (_ULCAST_(1) << 12)
+#define CAUSEB_IP5 13
+#define CAUSEF_IP5 (_ULCAST_(1) << 13)
+#define CAUSEB_IP6 14
+#define CAUSEF_IP6 (_ULCAST_(1) << 14)
+#define CAUSEB_IP7 15
+#define CAUSEF_IP7 (_ULCAST_(1) << 15)
+#define CAUSEB_IV 23
+#define CAUSEF_IV (_ULCAST_(1) << 23)
+#define CAUSEB_CE 28
+#define CAUSEF_CE (_ULCAST_(3) << 28)
+#define CAUSEB_BD 31
+#define CAUSEF_BD (_ULCAST_(1) << 31)
+
+/*
+ * Bits in the coprocessor 0 config register.
+ */
+/* Generic bits. */
+#define CONF_CM_CACHABLE_NO_WA 0
+#define CONF_CM_CACHABLE_WA 1
+#define CONF_CM_UNCACHED 2
+#define CONF_CM_CACHABLE_NONCOHERENT 3
+#define CONF_CM_CACHABLE_CE 4
+#define CONF_CM_CACHABLE_COW 5
+#define CONF_CM_CACHABLE_CUW 6
+#define CONF_CM_CACHABLE_ACCELERATED 7
+#define CONF_CM_CMASK 7
+#define CONF_BE (_ULCAST_(1) << 15)
+
+/* Bits common to various processors. */
+#define CONF_CU (_ULCAST_(1) << 3)
+#define CONF_DB (_ULCAST_(1) << 4)
+#define CONF_IB (_ULCAST_(1) << 5)
+#define CONF_DC (_ULCAST_(7) << 6)
+#define CONF_IC (_ULCAST_(7) << 9)
+#define CONF_EB (_ULCAST_(1) << 13)
+#define CONF_EM (_ULCAST_(1) << 14)
+#define CONF_SM (_ULCAST_(1) << 16)
+#define CONF_SC (_ULCAST_(1) << 17)
+#define CONF_EW (_ULCAST_(3) << 18)
+#define CONF_EP (_ULCAST_(15)<< 24)
+#define CONF_EC (_ULCAST_(7) << 28)
+#define CONF_CM (_ULCAST_(1) << 31)
+
+/* Bits specific to the R4xx0. */
+#define R4K_CONF_SW (_ULCAST_(1) << 20)
+#define R4K_CONF_SS (_ULCAST_(1) << 21)
+#define R4K_CONF_SB (_ULCAST_(3) << 22)
+
+/* Bits specific to the R5000. */
+#define R5K_CONF_SE (_ULCAST_(1) << 12)
+#define R5K_CONF_SS (_ULCAST_(3) << 20)
+
+/* Bits specific to the R10000. */
+#define R10K_CONF_DN (_ULCAST_(3) << 3)
+#define R10K_CONF_CT (_ULCAST_(1) << 5)
+#define R10K_CONF_PE (_ULCAST_(1) << 6)
+#define R10K_CONF_PM (_ULCAST_(3) << 7)
+#define R10K_CONF_EC (_ULCAST_(15)<< 9)
+#define R10K_CONF_SB (_ULCAST_(1) << 13)
+#define R10K_CONF_SK (_ULCAST_(1) << 14)
+#define R10K_CONF_SS (_ULCAST_(7) << 16)
+#define R10K_CONF_SC (_ULCAST_(7) << 19)
+#define R10K_CONF_DC (_ULCAST_(7) << 26)
+#define R10K_CONF_IC (_ULCAST_(7) << 29)
+
+/* Bits specific to the VR41xx. */
+#define VR41_CONF_CS (_ULCAST_(1) << 12)
+#define VR41_CONF_M16 (_ULCAST_(1) << 20)
+#define VR41_CONF_AD (_ULCAST_(1) << 23)
+
+/* Bits specific to the R30xx. */
+#define R30XX_CONF_FDM (_ULCAST_(1) << 19)
+#define R30XX_CONF_REV (_ULCAST_(1) << 22)
+#define R30XX_CONF_AC (_ULCAST_(1) << 23)
+#define R30XX_CONF_RF (_ULCAST_(1) << 24)
+#define R30XX_CONF_HALT (_ULCAST_(1) << 25)
+#define R30XX_CONF_FPINT (_ULCAST_(7) << 26)
+#define R30XX_CONF_DBR (_ULCAST_(1) << 29)
+#define R30XX_CONF_SB (_ULCAST_(1) << 30)
+#define R30XX_CONF_LOCK (_ULCAST_(1) << 31)
+
+/* Bits specific to the TX49. */
+#define TX49_CONF_DC (_ULCAST_(1) << 16)
+#define TX49_CONF_IC (_ULCAST_(1) << 17) /* conflict with CONF_SC */
+#define TX49_CONF_HALT (_ULCAST_(1) << 18)
+#define TX49_CONF_CWFON (_ULCAST_(1) << 27)
+
+/* Bits specific to the MIPS32/64 PRA. */
+#define MIPS_CONF_MT (_ULCAST_(7) << 7)
+#define MIPS_CONF_AR (_ULCAST_(7) << 10)
+#define MIPS_CONF_AT (_ULCAST_(3) << 13)
+#define MIPS_CONF_M (_ULCAST_(1) << 31)
+
+/*
+ * R10000 performance counter definitions.
+ *
+ * FIXME: The R10000 performance counter opens a nice way to implement CPU
+ * time accounting with a precission of one cycle. I don't have
+ * R10000 silicon but just a manual, so ...
+ */
+
+/*
+ * Events counted by counter #0
+ */
+#define CE0_CYCLES 0
+#define CE0_INSN_ISSUED 1
+#define CE0_LPSC_ISSUED 2
+#define CE0_S_ISSUED 3
+#define CE0_SC_ISSUED 4
+#define CE0_SC_FAILED 5
+#define CE0_BRANCH_DECODED 6
+#define CE0_QW_WB_SECONDARY 7
+#define CE0_CORRECTED_ECC_ERRORS 8
+#define CE0_ICACHE_MISSES 9
+#define CE0_SCACHE_I_MISSES 10
+#define CE0_SCACHE_I_WAY_MISSPREDICTED 11
+#define CE0_EXT_INTERVENTIONS_REQ 12
+#define CE0_EXT_INVALIDATE_REQ 13
+#define CE0_VIRTUAL_COHERENCY_COND 14
+#define CE0_INSN_GRADUATED 15
+
+/*
+ * Events counted by counter #1
+ */
+#define CE1_CYCLES 0
+#define CE1_INSN_GRADUATED 1
+#define CE1_LPSC_GRADUATED 2
+#define CE1_S_GRADUATED 3
+#define CE1_SC_GRADUATED 4
+#define CE1_FP_INSN_GRADUATED 5
+#define CE1_QW_WB_PRIMARY 6
+#define CE1_TLB_REFILL 7
+#define CE1_BRANCH_MISSPREDICTED 8
+#define CE1_DCACHE_MISS 9
+#define CE1_SCACHE_D_MISSES 10
+#define CE1_SCACHE_D_WAY_MISSPREDICTED 11
+#define CE1_EXT_INTERVENTION_HITS 12
+#define CE1_EXT_INVALIDATE_REQ 13
+#define CE1_SP_HINT_TO_CEXCL_SC_BLOCKS 14
+#define CE1_SP_HINT_TO_SHARED_SC_BLOCKS 15
+
+/*
+ * These flags define in which priviledge mode the counters count events
+ */
+#define CEB_USER 8 /* Count events in user mode, EXL = ERL = 0 */
+#define CEB_SUPERVISOR 4 /* Count events in supvervisor mode EXL = ERL = 0 */
+#define CEB_KERNEL 2 /* Count events in kernel mode EXL = ERL = 0 */
+#define CEB_EXL 1 /* Count events with EXL = 1, ERL = 0 */
+
+#ifndef __ASSEMBLY__
+
+#define CAUSE_EXCCODE(x) ((CAUSEF_EXCCODE & (x->cp0_cause)) >> CAUSEB_EXCCODE)
+#define CAUSE_EPC(x) (x->cp0_epc + (((x->cp0_cause & CAUSEF_BD) >> CAUSEB_BD) << 2))
+
+/*
+ * Functions to access the r10k performance counter and control registers
+ */
+#define read_r10k_perf_cntr(counter) \
+({ unsigned int __res; \
+ __asm__ __volatile__( \
+ "mfpc\t%0, "STR(counter) \
+ : "=r" (__res)); \
+ __res;})
+
+#define write_r10k_perf_cntr(counter,val) \
+ __asm__ __volatile__( \
+ "mtpc\t%0, "STR(counter) \
+ : : "r" (val));
+
+#define read_r10k_perf_cntl(counter) \
+({ unsigned int __res; \
+ __asm__ __volatile__( \
+ "mfps\t%0, "STR(counter) \
+ : "=r" (__res)); \
+ __res;})
+
+#define write_r10k_perf_cntl(counter,val) \
+ __asm__ __volatile__( \
+ "mtps\t%0, "STR(counter) \
+ : : "r" (val));
+
+/*
+ * Macros to access the system control coprocessor
+ */
+
+#define __read_32bit_c0_register(source, sel) \
+({ int __res; \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ "mfc0\t%0, " #source "\n\t" \
+ : "=r" (__res)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips32\n\t" \
+ "mfc0\t%0, " #source ", " #sel "\n\t" \
+ ".set\tmips0\n\t" \
+ : "=r" (__res)); \
+ __res; \
+})
+
+#define __read_64bit_c0_register(source, sel) \
+({ unsigned long __res; \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ ".set\tmips3\n\t" \
+ "dmfc0\t%0, " #source "\n\t" \
+ ".set\tmips0" \
+ : "=r" (__res)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dmfc0\t%0, " #source ", " #sel "\n\t" \
+ ".set\tmips0" \
+ : "=r" (__res)); \
+ __res; \
+})
+
+#define __write_32bit_c0_register(register, sel, value) \
+do { \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ "mtc0\t%z0, " #register "\n\t" \
+ : : "Jr" (value)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips32\n\t" \
+ "mtc0\t%z0, " #register ", " #sel "\n\t" \
+ ".set\tmips0" \
+ : : "Jr" (value)); \
+} while (0)
+
+#define __write_64bit_c0_register(register, sel, value) \
+do { \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ ".set\tmips3\n\t" \
+ "dmtc0\t%z0, " #register "\n\t" \
+ ".set\tmips0" \
+ : : "Jr" (value)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dmtc0\t%z0, " #register ", " #sel "\n\t" \
+ ".set\tmips0" \
+ : : "Jr" (value)); \
+} while (0)
+
+#define __read_ulong_c0_register(reg, sel) \
+ ((sizeof(unsigned long) == 4) ? \
+ __read_32bit_c0_register(reg, sel) : \
+ __read_64bit_c0_register(reg, sel))
+
+#define __write_ulong_c0_register(reg, sel, val) \
+do { \
+ if (sizeof(unsigned long) == 4) \
+ __write_32bit_c0_register(reg, sel, val); \
+ else \
+ __write_64bit_c0_register(reg, sel, val); \
+} while (0)
+
+/*
+ * These versions are only needed for systems with more than 38 bits of
+ * physical address space running the 32-bit kernel. That's none atm :-)
+ */
+#define __read_64bit_c0_split(source, sel) \
+({ \
+ unsigned long long val; \
+ unsigned long flags; \
+ \
+ local_irq_save(flags); \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dmfc0\t%M0, " #source "\n\t" \
+ "dsll\t%L0, %M0, 32\n\t" \
+ "dsrl\t%M0, %M0, 32\n\t" \
+ "dsrl\t%L0, %L0, 32\n\t" \
+ ".set\tmips0" \
+ : "=r" (val)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dmfc0\t%M0, " #source ", " #sel "\n\t" \
+ "dsll\t%L0, %M0, 32\n\t" \
+ "dsrl\t%M0, %M0, 32\n\t" \
+ "dsrl\t%L0, %L0, 32\n\t" \
+ ".set\tmips0" \
+ : "=r" (val)); \
+ local_irq_restore(flags); \
+ \
+ val; \
+})
+
+#define __write_64bit_c0_split(source, sel, val) \
+do { \
+ unsigned long flags; \
+ \
+ local_irq_save(flags); \
+ if (sel == 0) \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dsll\t%L0, %L0, 32\n\t" \
+ "dsrl\t%L0, %L0, 32\n\t" \
+ "dsll\t%M0, %M0, 32\n\t" \
+ "or\t%L0, %L0, %M0\n\t" \
+ "dmtc0\t%L0, " #source "\n\t" \
+ ".set\tmips0" \
+ : : "r" (val)); \
+ else \
+ __asm__ __volatile__( \
+ ".set\tmips64\n\t" \
+ "dsll\t%L0, %L0, 32\n\t" \
+ "dsrl\t%L0, %L0, 32\n\t" \
+ "dsll\t%M0, %M0, 32\n\t" \
+ "or\t%L0, %L0, %M0\n\t" \
+ "dmtc0\t%L0, " #source ", " #sel "\n\t" \
+ ".set\tmips0" \
+ : : "r" (val)); \
+ local_irq_restore(flags); \
+} while (0)
+
+#define read_c0_index() __read_32bit_c0_register($0, 0)
+#define write_c0_index(val) __write_32bit_c0_register($0, 0, val)
+
+#define read_c0_entrylo0() __read_ulong_c0_register($2, 0)
+#define write_c0_entrylo0(val) __write_ulong_c0_register($2, 0, val)
+
+#define read_c0_entrylo1() __read_ulong_c0_register($3, 0)
+#define write_c0_entrylo1(val) __write_ulong_c0_register($3, 0, val)
+
+#define read_c0_conf() __read_32bit_c0_register($3, 0)
+#define write_c0_conf(val) __write_32bit_c0_register($3, 0, val)
+
+#define read_c0_context() __read_ulong_c0_register($4, 0)
+#define write_c0_context(val) __write_ulong_c0_register($4, 0, val)
+
+#define read_c0_pagemask() __read_32bit_c0_register($5, 0)
+#define write_c0_pagemask(val) __write_32bit_c0_register($5, 0, val)
+
+#define read_c0_wired() __read_32bit_c0_register($6, 0)
+#define write_c0_wired(val) __write_32bit_c0_register($6, 0, val)
+
+#define read_c0_info() __read_32bit_c0_register($7, 0)
+
+#define read_c0_cache() __read_32bit_c0_register($7, 0) /* TX39xx */
+#define write_c0_cache(val) __write_32bit_c0_register($7, 0, val)
+
+#define read_c0_count() __read_32bit_c0_register($9, 0)
+#define write_c0_count(val) __write_32bit_c0_register($9, 0, val)
+
+#define read_c0_entryhi() __read_ulong_c0_register($10, 0)
+#define write_c0_entryhi(val) __write_ulong_c0_register($10, 0, val)
+
+#define read_c0_compare() __read_32bit_c0_register($11, 0)
+#define write_c0_compare(val) __write_32bit_c0_register($11, 0, val)
+
+#define read_c0_status() __read_32bit_c0_register($12, 0)
+#define write_c0_status(val) __write_32bit_c0_register($12, 0, val)
+
+#define read_c0_cause() __read_32bit_c0_register($13, 0)
+#define write_c0_cause(val) __write_32bit_c0_register($13, 0, val)
+
+#define read_c0_prid() __read_32bit_c0_register($15, 0)
+
+#define read_c0_config() __read_32bit_c0_register($16, 0)
+#define read_c0_config1() __read_32bit_c0_register($16, 1)
+#define read_c0_config2() __read_32bit_c0_register($16, 2)
+#define read_c0_config3() __read_32bit_c0_register($16, 3)
+#define write_c0_config(val) __write_32bit_c0_register($16, 0, val)
+#define write_c0_config1(val) __write_32bit_c0_register($16, 1, val)
+#define write_c0_config2(val) __write_32bit_c0_register($16, 2, val)
+#define write_c0_config3(val) __write_32bit_c0_register($16, 3, val)
+
+/*
+ * The WatchLo register. There may be upto 8 of them.
+ */
+#define read_c0_watchlo0() __read_ulong_c0_register($18, 0)
+#define read_c0_watchlo1() __read_ulong_c0_register($18, 1)
+#define read_c0_watchlo2() __read_ulong_c0_register($18, 2)
+#define read_c0_watchlo3() __read_ulong_c0_register($18, 3)
+#define read_c0_watchlo4() __read_ulong_c0_register($18, 4)
+#define read_c0_watchlo5() __read_ulong_c0_register($18, 5)
+#define read_c0_watchlo6() __read_ulong_c0_register($18, 6)
+#define read_c0_watchlo7() __read_ulong_c0_register($18, 7)
+#define write_c0_watchlo0(val) __write_ulong_c0_register($18, 0, val)
+#define write_c0_watchlo1(val) __write_ulong_c0_register($18, 1, val)
+#define write_c0_watchlo2(val) __write_ulong_c0_register($18, 2, val)
+#define write_c0_watchlo3(val) __write_ulong_c0_register($18, 3, val)
+#define write_c0_watchlo4(val) __write_ulong_c0_register($18, 4, val)
+#define write_c0_watchlo5(val) __write_ulong_c0_register($18, 5, val)
+#define write_c0_watchlo6(val) __write_ulong_c0_register($18, 6, val)
+#define write_c0_watchlo7(val) __write_ulong_c0_register($18, 7, val)
+
+/*
+ * The WatchHi register. There may be upto 8 of them.
+ */
+#define read_c0_watchhi0() __read_32bit_c0_register($19, 0)
+#define read_c0_watchhi1() __read_32bit_c0_register($19, 1)
+#define read_c0_watchhi2() __read_32bit_c0_register($19, 2)
+#define read_c0_watchhi3() __read_32bit_c0_register($19, 3)
+#define read_c0_watchhi4() __read_32bit_c0_register($19, 4)
+#define read_c0_watchhi5() __read_32bit_c0_register($19, 5)
+#define read_c0_watchhi6() __read_32bit_c0_register($19, 6)
+#define read_c0_watchhi7() __read_32bit_c0_register($19, 7)
+
+#define write_c0_watchhi0(val) __write_32bit_c0_register($19, 0, val)
+#define write_c0_watchhi1(val) __write_32bit_c0_register($19, 1, val)
+#define write_c0_watchhi2(val) __write_32bit_c0_register($19, 2, val)
+#define write_c0_watchhi3(val) __write_32bit_c0_register($19, 3, val)
+#define write_c0_watchhi4(val) __write_32bit_c0_register($19, 4, val)
+#define write_c0_watchhi5(val) __write_32bit_c0_register($19, 5, val)
+#define write_c0_watchhi6(val) __write_32bit_c0_register($19, 6, val)
+#define write_c0_watchhi7(val) __write_32bit_c0_register($19, 7, val)
+
+#define read_c0_xcontext() __read_ulong_c0_register($20, 0)
+#define write_c0_xcontext(val) __write_ulong_c0_register($20, 0, val)
+
+#define read_c0_intcontrol() __read_32bit_c0_register($20, 1)
+#define write_c0_intcontrol(val) __write_32bit_c0_register($20, 1, val)
+
+#define read_c0_framemask() __read_32bit_c0_register($21, 0)
+#define write_c0_framemask(val) __write_32bit_c0_register($21, 0, val)
+
+#define read_c0_debug() __read_32bit_c0_register($23, 0)
+#define write_c0_debug(val) __write_32bit_c0_register($23, 0, val)
+
+#define read_c0_depc() __read_ulong_c0_register($24, 0)
+#define write_c0_depc(val) __write_ulong_c0_register($24, 0, val)
+
+#define read_c0_ecc() __read_32bit_c0_register($26, 0)
+#define write_c0_ecc(val) __write_32bit_c0_register($26, 0, val)
+
+#define read_c0_derraddr0() __read_ulong_c0_register($26, 1)
+#define write_c0_derraddr0(val) __write_ulong_c0_register($26, 1, val)
+
+#define read_c0_cacheerr() __read_32bit_c0_register($27, 0)
+
+#define read_c0_derraddr1() __read_ulong_c0_register($27, 1)
+#define write_c0_derraddr1(val) __write_ulong_c0_register($27, 1, val)
+
+#define read_c0_taglo() __read_32bit_c0_register($28, 0)
+#define write_c0_taglo(val) __write_32bit_c0_register($28, 0, val)
+
+#define read_c0_taghi() __read_32bit_c0_register($29, 0)
+#define write_c0_taghi(val) __write_32bit_c0_register($29, 0, val)
+
+#define read_c0_errorepc() __read_ulong_c0_register($30, 0)
+#define write_c0_errorepc(val) __write_ulong_c0_register($30, 0, val)
+
+#define read_c0_epc() __read_ulong_c0_register($14, 0)
+#define write_c0_epc(val) __write_ulong_c0_register($14, 0, val)
+
+#if 1
+/*
+ * Macros to access the system control coprocessor
+ */
+#define read_32bit_cp0_register(source) \
+({ int __res; \
+ __asm__ __volatile__( \
+ ".set\tpush\n\t" \
+ ".set\treorder\n\t" \
+ "mfc0\t%0,"STR(source)"\n\t" \
+ ".set\tpop" \
+ : "=r" (__res)); \
+ __res;})
+
+#define read_32bit_cp0_set1_register(source) \
+({ int __res; \
+ __asm__ __volatile__( \
+ ".set\tpush\n\t" \
+ ".set\treorder\n\t" \
+ "cfc0\t%0,"STR(source)"\n\t" \
+ ".set\tpop" \
+ : "=r" (__res)); \
+ __res;})
+
+/*
+ * For now use this only with interrupts disabled!
+ */
+#define read_64bit_cp0_register(source) \
+({ int __res; \
+ __asm__ __volatile__( \
+ ".set\tmips3\n\t" \
+ "dmfc0\t%0,"STR(source)"\n\t" \
+ ".set\tmips0" \
+ : "=r" (__res)); \
+ __res;})
+
+#define write_32bit_cp0_register(register,value) \
+ __asm__ __volatile__( \
+ "mtc0\t%0,"STR(register)"\n\t" \
+ "nop" \
+ : : "r" (value));
+
+#define write_32bit_cp0_set1_register(register,value) \
+ __asm__ __volatile__( \
+ "ctc0\t%0,"STR(register)"\n\t" \
+ "nop" \
+ : : "r" (value));
+
+#define write_64bit_cp0_register(register,value) \
+ __asm__ __volatile__( \
+ ".set\tmips3\n\t" \
+ "dmtc0\t%0,"STR(register)"\n\t" \
+ ".set\tmips0" \
+ : : "r" (value))
+
+/*
+ * This should be changed when we get a compiler that support the MIPS32 ISA.
+ */
+#define read_mips32_cp0_config1() \
+({ int __res; \
+ __asm__ __volatile__( \
+ ".set\tnoreorder\n\t" \
+ ".set\tnoat\n\t" \
+ "#.set\tmips64\n\t" \
+ "#mfc0\t$1, $16, 1\n\t" \
+ "#.set\tmips0\n\t" \
+ ".word\t0x40018001\n\t" \
+ "move\t%0,$1\n\t" \
+ ".set\tat\n\t" \
+ ".set\treorder" \
+ :"=r" (__res)); \
+ __res;})
+
+#endif
+/*
+ * Macros to access the floating point coprocessor control registers
+ */
+#define read_32bit_cp1_register(source) \
+({ int __res; \
+ __asm__ __volatile__( \
+ ".set\tpush\n\t" \
+ ".set\treorder\n\t" \
+ "cfc1\t%0,"STR(source)"\n\t" \
+ ".set\tpop" \
+ : "=r" (__res)); \
+ __res;})
+
+/* TLB operations. */
+static inline void tlb_probe(void)
+{
+ __asm__ __volatile__(
+ ".set noreorder\n\t"
+ "tlbp\n\t"
+ ".set reorder");
+}
+
+static inline void tlb_read(void)
+{
+ __asm__ __volatile__(
+ ".set noreorder\n\t"
+ "tlbr\n\t"
+ ".set reorder");
+}
+
+static inline void tlb_write_indexed(void)
+{
+ __asm__ __volatile__(
+ ".set noreorder\n\t"
+ "tlbwi\n\t"
+ ".set reorder");
+}
+
+static inline void tlb_write_random(void)
+{
+ __asm__ __volatile__(
+ ".set noreorder\n\t"
+ "tlbwr\n\t"
+ ".set reorder");
+}
+
+/*
+ * Manipulate bits in a c0 register.
+ */
+#define __BUILD_SET_C0(name,register) \
+static inline unsigned int \
+set_c0_##name(unsigned int set) \
+{ \
+ unsigned int res; \
+ \
+ res = read_c0_##name(); \
+ res |= set; \
+ write_c0_##name(res); \
+ \
+ return res; \
+} \
+ \
+static inline unsigned int \
+clear_c0_##name(unsigned int clear) \
+{ \
+ unsigned int res; \
+ \
+ res = read_c0_##name(); \
+ res &= ~clear; \
+ write_c0_##name(res); \
+ \
+ return res; \
+} \
+ \
+static inline unsigned int \
+change_c0_##name(unsigned int change, unsigned int new) \
+{ \
+ unsigned int res; \
+ \
+ res = read_c0_##name(); \
+ res &= ~change; \
+ res |= (new & change); \
+ write_c0_##name(res); \
+ \
+ return res; \
+}
+
+__BUILD_SET_C0(status,CP0_STATUS)
+__BUILD_SET_C0(cause,CP0_CAUSE)
+__BUILD_SET_C0(config,CP0_CONFIG)
+
+#define set_cp0_status(x) set_c0_status(x)
+#define set_cp0_cause(x) set_c0_cause(x)
+#define set_cp0_config(x) set_c0_config(x)
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* _MIPS_REGS_H_ */
diff --git a/libcpu/mips/common/mips_types.h b/libcpu/mips/common/mips_types.h
new file mode 100644
index 0000000000..7f0b8a6855
--- /dev/null
+++ b/libcpu/mips/common/mips_types.h
@@ -0,0 +1,118 @@
+/*
+ * File : mips_types.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef _MIPS_TYPES_H_
+#define _MIPS_TYPES_H_
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if (_MIPS_SZLONG == 64)
+
+typedef __signed__ long __s64;
+typedef unsigned long __u64;
+
+#else
+
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
+#endif
+
+#endif
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+
+#define BITS_PER_LONG _MIPS_SZLONG
+
+
+typedef __signed char s8;
+typedef unsigned char u8;
+
+typedef __signed short s16;
+typedef unsigned short u16;
+
+typedef __signed int s32;
+typedef unsigned int u32;
+
+#if (_MIPS_SZLONG == 64)
+
+typedef __signed__ long s64;
+typedef unsigned long u64;
+
+#else
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long s64;
+typedef unsigned long long u64;
+#endif
+
+#endif
+
+#if (defined(CONFIG_HIGHMEM) && defined(CONFIG_64BIT_PHYS_ADDR)) \
+ || defined(CONFIG_64BIT)
+typedef u64 dma_addr_t;
+
+typedef u64 phys_addr_t;
+typedef u64 phys_size_t;
+
+#else
+typedef u32 dma_addr_t;
+
+typedef u32 phys_addr_t;
+typedef u32 phys_size_t;
+
+#endif
+typedef u64 dma64_addr_t;
+
+/*
+ * Don't use phys_t. You've been warned.
+ */
+#ifdef CONFIG_64BIT_PHYS_ADDR
+typedef unsigned long long phys_t;
+#else
+typedef unsigned long phys_t;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+
+#endif /* _MIPS_TYPES_H_ */
diff --git a/libcpu/mips/x1000/cache.c b/libcpu/mips/x1000/cache.c
new file mode 100644
index 0000000000..5fc9682810
--- /dev/null
+++ b/libcpu/mips/x1000/cache.c
@@ -0,0 +1,217 @@
+/*
+ * File : cache.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016/11/02 Urey the first version
+ */
+
+#include <rtthread.h>
+#include <board.h>
+#include <rthw.h>
+
+#include "../common/mips.h"
+
+
+#define CONFIG_SYS_DCACHE_SIZE 16384
+#define CONFIG_SYS_ICACHE_SIZE 16384
+#define CONFIG_SYS_CACHELINE_SIZE 32
+
+#define K0_TO_K1() \
+do { \
+ unsigned long __k0_addr; \
+ \
+ __asm__ __volatile__( \
+ "la %0, 1f\n\t" \
+ "or %0, %0, %1\n\t" \
+ "jr %0\n\t" \
+ "nop\n\t" \
+ "1: nop\n" \
+ : "=&r"(__k0_addr) \
+ : "r" (0x20000000) ); \
+} while(0)
+
+#define K1_TO_K0() \
+do { \
+ unsigned long __k0_addr; \
+ __asm__ __volatile__( \
+ "nop;nop;nop;nop;nop;nop;nop\n\t" \
+ "la %0, 1f\n\t" \
+ "jr %0\n\t" \
+ "nop\n\t" \
+ "1: nop\n" \
+ : "=&r" (__k0_addr)); \
+} while (0)
+
+#define INVALIDATE_BTB() \
+do { \
+ unsigned long tmp; \
+ __asm__ __volatile__( \
+ ".set mips32\n\t" \
+ "mfc0 %0, $16, 7\n\t" \
+ "nop\n\t" \
+ "ori %0, 2\n\t" \
+ "mtc0 %0, $16, 7\n\t" \
+ "nop\n\t" \
+ ".set mips2\n\t" \
+ : "=&r" (tmp)); \
+} while (0)
+
+#define __sync() \
+ __asm__ __volatile__( \
+ ".set push\n\t" \
+ ".set noreorder\n\t" \
+ ".set mips2\n\t" \
+ "sync\n\t" \
+ ".set pop" \
+ : /* no output */ \
+ : /* no input */ \
+ : "memory")
+
+#if defined(JZ4775) || defined(X1000)
+#define SYNC_WB() \
+do { \
+ __asm__ __volatile__ ( \
+ "sync\n\t" \
+ "lw $0, %0\n\t" \
+ : \
+ :"m"(*(int *)0xa0000000) \
+ :"memory"); \
+} while (0)
+#else
+#error "not define sync wb"
+#define SYNC_WB() __asm__ __volatile__ ("sync")
+#endif
+
+
+#undef cache_op
+#define cache_op(op, addr) \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips3\n" \
+ "cache %0, %1\n" \
+ ".set pop\n" \
+ : \
+ : "i" (op), "R" (*(unsigned char *)(addr)))
+
+
+void rt_hw_dcache_flush_line(rt_uint32_t addr)
+{
+ cache_op(HIT_WRITEBACK_INV_D, addr);
+ SYNC_WB();
+}
+
+void rt_hw_dcache_flush_range(rt_uint32_t start_addr, rt_uint32_t size)
+{
+ rt_uint32_t lsize = CONFIG_SYS_CACHELINE_SIZE;
+ rt_uint32_t addr = start_addr & ~(lsize - 1);
+ rt_uint32_t aend = (start_addr + size - 1) & ~(lsize - 1);
+ rt_uint32_t writebuffer;
+
+ for (; addr <= aend; addr += lsize)
+ {
+ cache_op(HIT_WRITEBACK_INV_D, addr);
+ }
+ SYNC_WB();
+}
+
+void rt_hw_dcache_flush_all(void)
+{
+ rt_uint32_t addr;
+
+ for (addr = CKSEG0; addr < CKSEG0 + CONFIG_SYS_DCACHE_SIZE; addr += CONFIG_SYS_CACHELINE_SIZE)
+ {
+ cache_op(INDEX_WRITEBACK_INV_D, addr);
+ }
+
+ SYNC_WB();
+}
+
+void rt_hw_dcache_invalidate_range(rt_uint32_t start_addr,rt_uint32_t size)
+{
+ rt_uint32_t lsize = CONFIG_SYS_CACHELINE_SIZE;
+ rt_uint32_t addr = start_addr & ~(lsize - 1);
+ rt_uint32_t aend = (start_addr + size - 1) & ~(lsize - 1);
+
+ for (; addr <= aend; addr += lsize)
+ cache_op(HIT_INVALIDATE_D, addr);
+}
+
+void rt_hw_dcache_invalidate_all(void)
+{
+ rt_uint32_t addr;
+
+ for (addr = CKSEG0; addr < CKSEG0 + CONFIG_SYS_DCACHE_SIZE; addr += CONFIG_SYS_CACHELINE_SIZE)
+ {
+ cache_op(INDEX_STORE_TAG_D, addr);
+ }
+
+ SYNC_WB();
+}
+
+void rt_hw_icache_flush_line(rt_uint32_t addr)
+{
+ cache_op(HIT_INVALIDATE_I, addr);
+}
+
+void rt_hw_icache_flush_all(void)
+{
+ rt_uint32_t addr;
+
+ asm volatile ("mtc0 $0, $28"); /* Clear Taglo */
+ asm volatile ("mtc0 $0, $29"); /* Clear TagHi */
+
+ for (addr = CKSEG0; addr < CKSEG0 + CONFIG_SYS_DCACHE_SIZE; addr += CONFIG_SYS_CACHELINE_SIZE)
+ {
+ cache_op(INDEX_STORE_TAG_I, addr);
+ }
+
+ INVALIDATE_BTB();
+}
+
+void rt_hw_icache_invalidate_all(void)
+{
+ rt_uint32_t i;
+
+ K0_TO_K1();
+
+ asm volatile (".set noreorder\n"
+ ".set mips32\n\t"
+ "mtc0\t$0,$28\n\t"
+ "mtc0\t$0,$29\n"
+ ".set mips0\n"
+ ".set reorder\n");
+ for (i = CKSEG0; i < CKSEG0 + CONFIG_SYS_ICACHE_SIZE; i += CONFIG_SYS_CACHELINE_SIZE)
+ cache_op(INDEX_STORE_TAG_I, i);
+
+ K1_TO_K0();
+
+ INVALIDATE_BTB();
+}
+
+
+void rt_hw_flush_cache_all(void)
+{
+ rt_hw_dcache_flush_all();
+ rt_hw_icache_flush_all();
+}
+
+
+
diff --git a/libcpu/mips/x1000/cache.h b/libcpu/mips/x1000/cache.h
new file mode 100644
index 0000000000..0454527d91
--- /dev/null
+++ b/libcpu/mips/x1000/cache.h
@@ -0,0 +1,41 @@
+/*
+ * File : cache.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��19�� Urey the first version
+ */
+
+#ifndef _X1000_CACHE_H_
+#define _X1000_CACHE_H_
+
+#include "../common/mips.h"
+#include "../common/mips_cache.h"
+
+
+void rt_hw_icache_invalidate_all(void);
+void rt_hw_icache_flush_all(void);
+
+void rt_hw_dcache_flush_all(void);
+void rt_hw_dcache_flush_range(rt_uint32_t addr, rt_uint32_t size);
+void rt_hw_dcache_invalidate_all(void);
+void rt_hw_dcache_invalidate_range(rt_uint32_t addr,rt_uint32_t size);
+
+void rt_hw_flush_cache_all(void);
+#endif /* _X1000_CACHE_H_ */
diff --git a/libcpu/mips/x1000/cpu.c b/libcpu/mips/x1000/cpu.c
new file mode 100644
index 0000000000..e1a51b9fe7
--- /dev/null
+++ b/libcpu/mips/x1000/cpu.c
@@ -0,0 +1,131 @@
+/*
+ * File : cpu.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��8�� Urey the first version
+ */
+
+
+#include <rtthread.h>
+#include <board.h>
+#include <rthw.h>
+
+#include "../common/mips.h"
+
+mips32_core_cfg_t g_mips_core =
+{
+ .icache_line_size = 32,
+ .icache_size = 16384,
+
+ .dcache_line_size = 32,
+ .dcache_size = 16384,
+
+ .max_tlb_entries = 16, /* max_tlb_entries */
+};
+
+void rt_hw_tlb_init(void)
+{
+//----------------------------------------------------------------------------------
+//cchappy tlb 0x30000000 to 0xC0000000
+//----------------------------------------------------------------------------------
+ unsigned int pagemask = 0x007fe000;//0x01ffe000; /* 4MB */
+ /* cached D:allow-W V:valid G */
+ unsigned int entrylo0 = (0x30000000 >> 6) | (3 << 3) + (1 << 2) + (1 << 1) + 1;
+ unsigned int entrylo1 = (0x30400000 >> 6) | (3 << 3) + (1 << 2) + (1 << 1) + 1;
+ unsigned int entryhi = 0xc0000000; /* kseg2 base */
+ int i;
+ __write_32bit_c0_register($5, 4, 0xa9000000);
+ write_c0_pagemask(pagemask);
+ write_c0_wired(0);
+/* indexed write 32 tlb entry */
+ for(i = 0; i < 32; i++)
+ {
+ asm (
+ ".macro _ssnop; sll $0, $0, 1; .endm\n\t"
+ ".macro _ehb; sll $0, $0, 3; .endm\n\t"
+ ".macro mtc0_tlbw_hazard; _ssnop; _ssnop; _ehb; .endm\n\t"
+ ".macro tlbw_use_hazard; _ssnop; _ssnop; _ssnop; _ehb; .endm\n\t"
+ "\n\t"
+ "mtc0 %0, $0\n\t" /* write Index */
+ "tlbw_use_hazard\n\t"
+ "mtc0 %1, $5\n\t" /* write PageMask */
+ "mtc0 %2, $10\n\t" /* write EntryHi */
+ "mtc0 %3, $2\n\t" /* write EntryLo0 */
+ "mtc0 %4, $3\n\t" /* write EntryLo1 */
+ "mtc0_tlbw_hazard\n\t"
+ "tlbwi \n\t" /* TLB indexed write */
+ "tlbw_use_hazard\n\t"
+ : : "Jr" (i), "r" (pagemask), "r" (entryhi),
+ "r" (entrylo0), "r" (entrylo1)
+ );
+ entryhi += 0x0800000; /* 32MB */
+ entrylo0 += (0x0800000 >> 6);
+ entrylo1 += (0x0800000 >> 6);
+ }
+}
+
+void rt_hw_cache_init(void)
+{
+ r4k_cache_flush_all();
+}
+
+/**
+ * this function will reset CPU
+ *
+ */
+RT_WEAK void rt_hw_cpu_reset()
+{
+ /* open the watch-dog */
+ REG_WDT_TCSR = WDT_TCSR_EXT_EN;
+ REG_WDT_TCSR |= WDT_TCSR_PRESCALE_1024;
+ REG_WDT_TDR = 0x03;
+ REG_WDT_TCNT = 0x00;
+ REG_WDT_TCER |= WDT_TCER_TCEN;
+
+ rt_kprintf("reboot system...\n");
+ rt_hw_interrupt_disable();
+ while (1);
+}
+
+/**
+ * this function will shutdown CPU
+ *
+ */
+RT_WEAK void rt_hw_cpu_shutdown()
+{
+ rt_kprintf("shutdown...\n");
+ rt_hw_interrupt_disable();
+ while (1);
+}
+
+/**
+ * This function finds the first bit set (beginning with the least significant bit)
+ * in value and return the index of that bit.
+ *
+ * Bits are numbered starting at 1 (the least significant bit). A return value of
+ * zero from any of these functions means that the argument was zero.
+ *
+ * @return return the index of the first bit set. If value is 0, then this function
+ * shall return 0.
+ */
+RT_WEAK int __rt_ffs(int value)
+{
+ return __builtin_ffs(value);
+}
diff --git a/libcpu/mips/x1000/interrupt.c b/libcpu/mips/x1000/interrupt.c
new file mode 100644
index 0000000000..394cd6cd1c
--- /dev/null
+++ b/libcpu/mips/x1000/interrupt.c
@@ -0,0 +1,215 @@
+/*
+ * File : cpu_intc.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016/09/07 Urey the first version
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <rtthread.h>
+#include <rthw.h>
+#include <board.h>
+
+#include "../common/mips.h"
+
+#define INTERRUPTS_MAX 64
+
+extern rt_uint32_t rt_interrupt_nest;
+rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
+rt_uint32_t rt_thread_switch_interrupt_flag;
+
+static struct rt_irq_desc isr_table[INTERRUPTS_MAX];
+
+static void rt_hw_interrupt_handler(int vector, void *param)
+{
+ rt_kprintf("Unhandled interrupt %d occured!!!\n", vector);
+}
+
+void rt_hw_interrupt_init(void)
+{
+ rt_int32_t idx;
+
+ clear_c0_status(0xff04); /* clear ERL */
+ set_c0_status(0x0400); /* set IP2 */
+
+
+ rt_memset(isr_table, 0x00, sizeof(isr_table));
+ for (idx = 0; idx < INTERRUPTS_MAX; idx ++)
+ {
+ isr_table[idx].handler = rt_hw_interrupt_handler;
+ }
+
+ /* init interrupt nest, and context in thread sp */
+ rt_interrupt_nest = 0;
+ rt_interrupt_from_thread = 0;
+ rt_interrupt_to_thread = 0;
+ rt_thread_switch_interrupt_flag = 0;
+
+ /* enable cpu interrupt mask */
+ set_c0_status(IE_IRQ0 | IE_IRQ1);
+}
+
+void rt_hw_interrupt_mask(int vector)
+{
+ /* mask interrupt */
+ __intc_mask_irq(vector);
+}
+
+void rt_hw_interrupt_umask(int vector)
+{
+ __intc_unmask_irq(vector);
+}
+
+rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
+ void *param, char *name)
+{
+ rt_isr_handler_t old_handler = RT_NULL;
+
+ if(vector < INTERRUPTS_MAX)
+ {
+ old_handler = isr_table[vector].handler;
+
+#ifdef RT_USING_INTERRUPT_INFO
+ rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX);
+#endif /* RT_USING_INTERRUPT_INFO */
+ isr_table[vector].handler = handler;
+ isr_table[vector].param = param;
+ }
+
+ return old_handler;
+}
+
+rt_inline int fls(int x)
+{
+ __asm__("clz %0, %1" : "=r" (x) : "r" (x));
+
+ return 32 - x;
+}
+
+void rt_interrupt_dispatch(void *ptreg)
+{
+ void *param;
+ rt_isr_handler_t irq_func;
+
+ int irq = 0, group;
+ rt_uint32_t intc_ipr0 = 0, intc_ipr1 = 0, vpu_pending = 0;
+
+ rt_uint32_t c0_status, c0_cause;
+ rt_uint32_t pending_im;
+
+ /* check os timer */
+ c0_status = read_c0_status();
+ c0_cause = read_c0_cause();
+
+ pending_im = (c0_cause & ST0_IM) & (c0_status & ST0_IM);
+
+ if (pending_im & CAUSEF_IP3)
+ {
+ extern void rt_hw_ost_handler(void);
+ rt_hw_ost_handler();
+ return;
+ }
+ if (pending_im & CAUSEF_IP2)
+ {
+ intc_ipr0 = REG_INTC_IPR(0);
+ intc_ipr1 = REG_INTC_IPR(1);
+
+ if (intc_ipr0)
+ {
+ irq = fls(intc_ipr0) - 1;
+ intc_ipr0 &= ~(1<<irq);
+ }
+ else if(intc_ipr1)
+ {
+ irq = fls(intc_ipr1) - 1;
+ intc_ipr1 &= ~(1<<irq);
+ irq += 32;
+ }
+ else
+ {
+ //VPU
+ }
+
+ if (irq >= INTERRUPTS_MAX)
+ rt_kprintf("max interrupt, irq=%d\n", irq);
+
+ /* do interrupt */
+ irq_func = isr_table[irq].handler;
+ param = isr_table[irq].param;
+ (*irq_func)(irq, param);
+
+#ifdef RT_USING_INTERRUPT_INFO
+ isr_table[irq].counter++;
+#endif /* RT_USING_INTERRUPT_INFO */
+
+ /* ack interrupt */
+ __intc_ack_irq(irq);
+ }
+
+ if (pending_im & CAUSEF_IP0)
+ rt_kprintf("CAUSEF_IP0\n");
+ if (pending_im & CAUSEF_IP1)
+ rt_kprintf("CAUSEF_IP1\n");
+ if (pending_im & CAUSEF_IP4)
+ rt_kprintf("CAUSEF_IP4\n");
+ if (pending_im & CAUSEF_IP5)
+ rt_kprintf("CAUSEF_IP5\n");
+ if (pending_im & CAUSEF_IP6)
+ rt_kprintf("CAUSEF_IP6\n");
+ if (pending_im & CAUSEF_IP7)
+ rt_kprintf("CAUSEF_IP7\n");
+}
+
+#ifdef RT_USING_INTERRUPT_INFO
+#include <finsh.h>
+int list_irqs(void)
+{
+ int index;
+
+ rt_kprintf("interrupt list:\n");
+ rt_kprintf("----------------\n");
+ rt_kprintf("name counter\n");
+ for (index = 0; index < INTERRUPTS_MAX; index ++)
+ {
+ if (isr_table[index].handler != rt_hw_interrupt_handler)
+ {
+ rt_kprintf("%-*.*s %d\n", RT_NAME_MAX, RT_NAME_MAX, isr_table[index].name, isr_table[index].counter);
+ }
+ }
+
+ return 0;
+}
+MSH_CMD_EXPORT(list_irqs, list interrupt counter);
+#endif
+
+unsigned int spin_lock_irqsave(void)
+{
+ register unsigned int t;
+ t = read_c0_status();
+ write_c0_status((t & (~1)));
+ return (t);
+}
+
+void spin_unlock_irqrestore(unsigned int val)
+{
+ write_c0_status(val);
+}
diff --git a/libcpu/mips/x1000/mips_backtrace.c b/libcpu/mips/x1000/mips_backtrace.c
new file mode 100644
index 0000000000..b8a861bad5
--- /dev/null
+++ b/libcpu/mips/x1000/mips_backtrace.c
@@ -0,0 +1,208 @@
+/*
+ * File : mips_backtrace.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��11�� Urey the first version
+ */
+
+#include <rtthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include "mips.h"
+
+/*********************************************************************************************************
+ ָ���
+*********************************************************************************************************/
+#define ADDUI_SP_INST 0x27bd0000
+#define SW_RA_INST 0xafbf0000
+#define JR_RA_INST 0x03e00008
+
+#define INST_OP_MASK 0xffff0000
+#define INST_OFFSET_MASK 0x0000ffff
+
+#define abs(s) ((s) < 0 ? -(s):(s))
+
+int backtrace_ctx(mips_reg_ctx *ctx)
+{
+ unsigned long *addr;
+ unsigned long *pc, *ra, *sp;
+ size_t ra_offset;
+ size_t stack_size;
+ int depth;
+ int size = 8;
+
+ pc = (unsigned long *)(unsigned long)ctx->CP0EPC;
+ ra = (unsigned long *)(unsigned long)ctx->regs[REG_RA];
+ sp = (unsigned long *)(unsigned long)ctx->regs[REG_SP];
+
+ rt_kprintf("[0x%08x]\n", pc);
+
+ if (size == 1) return 1;
+
+ ra_offset = stack_size = 0;
+
+ for (addr = ra; !ra_offset || !stack_size; --addr)
+ {
+ switch (*addr & INST_OP_MASK) {
+ case ADDUI_SP_INST:
+ stack_size = abs((short)(*addr&INST_OFFSET_MASK));
+ break;
+
+ case SW_RA_INST:
+ ra_offset = (short)(*addr&INST_OFFSET_MASK);
+ break;
+
+ case 0x3c1c0000:
+ goto out_of_loop;
+
+ default:
+ break;
+ }
+ }
+
+out_of_loop:
+ if (ra_offset) ra = *(unsigned long **)((unsigned long)sp + ra_offset);
+ if (stack_size) sp = (unsigned long *)((unsigned long)sp + stack_size);
+
+ // repeat backwar scanning
+ for (depth = 1; depth < size && ra && ra != (unsigned long *)0xffffffff; ++depth)
+ {
+ rt_kprintf("RA[%2d] : [0x%08x]\n", depth ,ra);
+
+ ra_offset = 0;
+ stack_size = 0;
+
+ for ( addr = ra; !ra_offset || !stack_size; -- addr )
+ {
+ switch( *addr & INST_OP_MASK)
+ {
+ case ADDUI_SP_INST:
+ stack_size = abs((short)(*addr&INST_OFFSET_MASK));
+ break;
+
+ case SW_RA_INST:
+ ra_offset = abs((short)(*addr&INST_OFFSET_MASK));
+ break;
+
+ case 0x3c1c0000:
+ return depth +1;
+
+ default:
+ break;
+ }
+ }
+
+ ra = *(unsigned long **)((unsigned long)sp + ra_offset);
+ sp = (unsigned long *)((unsigned long)sp + stack_size);
+ }
+
+ return depth;
+}
+
+int backtrace(void)
+{
+ unsigned long *addr;
+ unsigned long *ra;
+ unsigned long *sp;
+ int size = 8, depth;
+
+ size_t ra_offset;
+ size_t stack_size;
+
+ // get current $a and $sp
+ __asm__ __volatile__ (
+ " move %0, $ra\n"
+ " move %1, $sp\n"
+ : "=r"(ra), "=r"(sp)
+ );
+
+ // scanning to find the size of hte current stack frame
+ stack_size = 0;
+
+ for ( addr = (unsigned long *)backtrace; !stack_size; ++addr)
+ {
+ if ((*addr & INST_OP_MASK ) == ADDUI_SP_INST )
+ stack_size = abs((short)(*addr&INST_OFFSET_MASK));
+ else if ( *addr == JR_RA_INST )
+ break;
+ }
+
+ sp = (unsigned long *) (( unsigned long )sp + stack_size);
+
+ // repeat backwar scanning
+ for ( depth = 0; depth < size && ((( unsigned long )ra > KSEG0BASE) && (( unsigned long )ra < KSEG1BASE)); ++ depth )
+ {
+ rt_kprintf("RA[%2d] : [0x%08x]\n", depth, ra);
+ {
+ extern void rt_thread_exit(void);
+ if ((uint32_t)ra == (uint32_t)(rt_thread_exit))
+ return depth;
+ }
+
+ ra_offset = 0;
+ stack_size = 0;
+
+ for ( addr = ra; !ra_offset || !stack_size; -- addr )
+ {
+ switch( *addr & INST_OP_MASK)
+ {
+ case ADDUI_SP_INST:
+ stack_size = abs((short)(*addr&INST_OFFSET_MASK));
+ break;
+
+ case SW_RA_INST:
+ ra_offset = (short)(*addr&INST_OFFSET_MASK);
+ break;
+
+ case 0x3c1c0000:
+ return depth +1;
+
+ default:
+ break;
+ }
+ }
+
+ ra = *(unsigned long **)((unsigned long)sp + ra_offset);
+ sp = (unsigned long*) ((unsigned long)sp+stack_size );
+ }
+
+ return depth;
+}
+
+#include <rtthread.h>
+extern long list_thread(void);
+void assert_hook(const char* ex, const char* func, rt_size_t line)
+{
+ backtrace();
+
+ list_thread();
+ rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex, func, line);
+}
+
+int backtrace_init(void)
+{
+#ifdef RT_DEBUG
+ rt_assert_set_hook(assert_hook);
+#endif
+ return 0;
+}
+INIT_DEVICE_EXPORT(backtrace_init);
diff --git a/libcpu/mips/x1000/mips_cache_gcc.S b/libcpu/mips/x1000/mips_cache_gcc.S
new file mode 100644
index 0000000000..671f193af0
--- /dev/null
+++ b/libcpu/mips/x1000/mips_cache_gcc.S
@@ -0,0 +1,62 @@
+/*
+ * File : mips_cache_gcc.S
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��19�� Urey the first version
+ */
+
+#ifndef __ASSEMBLY__
+# define __ASSEMBLY__
+#endif
+
+#include "../common/mips.h"
+
+ .text
+ .set noreorder
+
+ .globl cache_init
+ .ent cache_init
+cache_init:
+ .set noreorder
+ mtc0 zero, CP0_TAGLO
+ move t0, a0 // cache total size
+ move t1, a1 // cache line size
+ li t2, 0x80000000
+ addu t3, t0, t2
+
+_cache_init_loop:
+ cache 8, 0(t2) // icache_index_store_tag
+ cache 9, 0(t2) // dcache_index_store_tag
+ addu t2, t1
+ bne t2, t3, _cache_init_loop
+ nop
+
+ mfc0 t0, CP0_CONFIG
+ li t1, 0x7
+ not t1
+ and t0, t0, t1
+ or t0, 0x3 // cacheable, noncoherent, write-back, write allocate
+ mtc0 t0, CP0_CONFIG
+
+ jr ra
+ nop
+
+ .set reorder
+ .end cache_init
diff --git a/libcpu/mips/x1000/mips_context_gcc.S b/libcpu/mips/x1000/mips_context_gcc.S
new file mode 100644
index 0000000000..d4c314ab65
--- /dev/null
+++ b/libcpu/mips/x1000/mips_context_gcc.S
@@ -0,0 +1,95 @@
+/*
+ * File : mips_context_asm.S
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef __ASSEMBLY__
+# define __ASSEMBLY__
+#endif
+
+#include "../common/mips.h"
+
+ .global rt_thread_switch_interrupt_flag
+ .global rt_interrupt_from_thread
+ .global rt_interrupt_to_thread
+
+ .section .text,"ax",@progbits
+ .set noreorder
+ .set noat
+
+ .globl rt_hw_interrupt_disable
+rt_hw_interrupt_disable:
+ mfc0 v0,CP0_STATUS
+ srl v1,v0,1
+ sll v1,v1,1
+# and v1,v0,0xfffffffe
+ mtc0 v1,CP0_STATUS
+ jr ra
+ nop
+
+LEAF(rt_hw_interrupt_enable)
+ mtc0 a0,CP0_STATUS
+ jr ra
+ nop
+END(rt_hw_interrupt_enable)
+
+/*
+ * void rt_hw_context_switch_to(rt_uint32 to)/*
+ * a0 --> to
+ */
+LEAF(rt_hw_context_switch_to)
+ lw sp , 0(a0) /* switch to the new stack */
+ RESTORE_CONTEXT
+END(rt_hw_context_switch_to)
+
+/*
+ * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to)
+ * a0 --> from
+ * a1 --> to
+ */
+LEAF(rt_hw_context_switch)
+ mtc0 ra, CP0_EPC
+ SAVE_CONTEXT
+
+ sw sp, 0(a0) /* store sp in preempted tasks TCB */
+ lw sp, 0(a1) /* get new task stack pointer */
+
+ RESTORE_CONTEXT
+END(rt_hw_context_switch)
+
+LEAF(rt_hw_context_switch_interrupt)
+ la t0, rt_thread_switch_interrupt_flag
+ lw t1, 0(t0)
+ nop
+ bnez t1, _reswitch
+ nop
+ li t1, 0x01 /* set rt_thread_switch_interrupt_flag to 1 */
+ sw t1, 0(t0)
+ la t0, rt_interrupt_from_thread /* set rt_interrupt_from_thread */
+ sw a0, 0(t0)
+_reswitch:
+ la t0, rt_interrupt_to_thread /* set rt_interrupt_to_thread */
+ sw a1, 0(t0)
+ jr ra
+ nop
+END(rt_hw_context_switch_interrupt)
+
diff --git a/libcpu/mips/x1000/mips_excpt.c b/libcpu/mips/x1000/mips_excpt.c
new file mode 100644
index 0000000000..5d2a3dce6d
--- /dev/null
+++ b/libcpu/mips/x1000/mips_excpt.c
@@ -0,0 +1,382 @@
+/*
+ * File : mips_excpt.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#include <rtthread.h>
+#include <rthw.h>
+#include <stdio.h>
+
+#include "mips.h"
+#include "mips_excpt.h"
+
+extern int backtrace(void);
+int backtrace_ctx(mips_reg_ctx *ctx);
+
+extern long list_thread(void);
+
+const static char *regstr[] = {
+ "$0 zero", "$1 at", "$2 v0", "$3 v1", "$4 a0", "$5 a1", "$6 a2", "$7 a3",
+ "$8 t0", "$9 t1", "$10 t2", "$11 t3", "$12 t4", "$13 t5", "$14 t6", "$15 t7",
+ "$16 s0", "$17 s1", "$18 s2", "$19 s3", "$20 s4", "$21 s5", "$22 s6", "$23 s7",
+ "$24 t8", "$25 t9", "$26 k0", "$27 k1", "$28 gp", "$29 sp", "$30 fp", "$31 ra"
+};
+
+static const char *cause_strings[32] =
+{
+ /* 0 */ "Int",
+ /* 1 */ "TLB Mods",
+ /* 2 */ "TLB Load",
+ /* 3 */ "TLB Store",
+ /* 4 */ "Address Load",
+ /* 5 */ "Address Store",
+ /* 6 */ "Instruction Bus Error",
+ /* 7 */ "Data Bus Error",
+ /* 8 */ "Syscall",
+ /* 9 */ "Breakpoint",
+ /* 10 */ "Reserved Instruction",
+ /* 11 */ "Coprocessor Unuseable",
+ /* 12 */ "Overflow",
+ /* 13 */ "Trap",
+ /* 14 */ "Instruction Virtual Coherency Error",
+ /* 15 */ "FP Exception",
+ /* 16 */ "Reserved 16",
+ /* 17 */ "Reserved 17",
+ /* 18 */ "Reserved 18",
+ /* 19 */ "Reserved 19",
+ /* 20 */ "Reserved 20",
+ /* 21 */ "Reserved 21",
+ /* 22 */ "Reserved 22",
+ /* 23 */ "Watch",
+ /* 24 */ "Reserved 24",
+ /* 25 */ "Reserved 25",
+ /* 26 */ "Reserved 26",
+ /* 27 */ "Reserved 27",
+ /* 28 */ "Reserved 28",
+ /* 29 */ "Reserved 29",
+ /* 30 */ "Reserved 30",
+ /* 31 */ "Data Virtual Coherency Error"
+};
+
+
+/**
+ * exception handle table
+ */
+exception_func_t sys_exception_handlers[32];
+
+static void mod_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("tlb modification exception\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+static void tlbl_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("tlb exception: load\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+static void tlbs_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("tlb exception: store\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+static void adel_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("address error exception: load\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+ rt_kprintf("current thread: %.*s\n", RT_NAME_MAX, rt_thread_self()->name);
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+static void ades_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("address error exception: store\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+static void fpe_handler(mips_reg_ctx *regs)
+{
+ rt_kprintf("floating point exception\n");
+ rt_kprintf("exception happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+
+ list_thread();
+
+ printf("-----------------------------------------------------\n");
+ printf("BACKTRACE:\n");
+ backtrace();
+ printf("-----------------------------------------------------\n");
+
+ rt_hw_cpu_shutdown();
+}
+
+
+static void unhandled_exception_handle(mips_reg_ctx *regs)
+{
+ int i;
+ unsigned int cause = read_c0_cause();
+ unsigned int exc = (cause >> 2) & 0x1f;
+
+ rt_kprintf("exception happens, epc: 0x%08x\n", regs->CP0EPC);
+ rt_kprintf(" cause: 0x%08x\n", regs->CP0Cause);
+
+ for (i = 0; i < 32; i++)
+ {
+ if (i % 4 == 0)
+ printf("\n");
+ printf("%8s %08x ", regstr[i], regs->regs[i]);
+ }
+ printf("\n");
+
+ list_thread();
+ rt_hw_cpu_shutdown();
+}
+
+static void install_default_exception_handler(void)
+{
+ int i;
+
+ for (i=0; i<sizeof(sys_exception_handlers)/sizeof(sys_exception_handlers[0]); i++)
+ sys_exception_handlers[i] = (exception_func_t)unhandled_exception_handle;
+
+ sys_exception_handlers[EX_MOD] = mod_handler;
+ sys_exception_handlers[EX_TLBL] = tlbl_handler;
+ sys_exception_handlers[EX_TLBS] = tlbs_handler;
+ sys_exception_handlers[EX_ADEL] = adel_handler;
+ sys_exception_handlers[EX_ADES] = ades_handler;
+ sys_exception_handlers[EX_FPE] = fpe_handler;
+}
+
+int rt_hw_exception_init(void)
+{
+ /* install the default exception handler */
+ install_default_exception_handler();
+
+ return RT_EOK;
+}
+
+/**
+ * setup the exception handle
+ */
+exception_func_t rt_set_except_vector(int n, exception_func_t func)
+{
+ exception_func_t old_handler = sys_exception_handlers[n];
+
+ if ((n == 0) || (n > 32) || (!func))
+ {
+ return 0;
+ }
+
+ sys_exception_handlers[n] = func;
+
+ return old_handler;
+}
+
+void mips_exception_handler(mips_reg_ctx *ctx)
+{
+ static int read_epc_count = 0;
+ static int epc_save = 0;
+ int i;
+ unsigned int epc;
+
+ //��� read_epc_count>0 ˵�� c_except_handler �ڶ� epc ʱ�����ˣ����� epc ������һ���µ��쳣
+ if (read_epc_count > 0)
+ {
+ printf("ERROR: read epc fail when except handle\n");
+ epc = epc_save;
+ read_epc_count = 0;
+ }
+ else
+ {
+ read_epc_count++;
+ epc_save = 0;
+ epc = read_c0_epc();
+ epc_save = epc;
+
+ if (epc != 0)
+ {
+ printf("-----------------------------------------------------\n");
+ for (i = 0; i < 4; i++)
+ {
+ printf("%08x:\t%08x\n",
+ (epc - 4 * 4 + i * 4),
+ *(unsigned int *) ((epc - 4 * 4 + i * 4) | 0xa0000000));
+ }
+ for (i = 0; i < 4; i++)
+ {
+ printf("%08x:\t%08x\n",
+ (epc + i * 4),
+ *(unsigned int *) ((epc + i * 4) | 0xa0000000));
+ }
+ printf("-----------------------------------------------------\n");
+ }
+
+ read_epc_count--;
+ }
+
+ printf("-----------------------------------------------------\n");
+ unsigned int cause = read_c0_cause();
+ unsigned int exc = (cause >> 2) & 0x1f;
+ printf("CAUSE=%08x --> %s\n", cause, cause_strings[exc]);
+ printf("EPC=%08x\n", epc);
+
+ for (i = 0; i < 32; i++)
+ {
+ if ((i != 0) && (i % 4 == 0))
+ printf("\n");
+ printf("%8s %08x ", regstr[i], ctx->regs[i]);
+ }
+ printf("\n-----------------------------------------------------\n");
+ printf("%s: \t %8x\n","CP0Status ", ctx->CP0Status);
+ printf("%s: \t %8x\n","CP0DataHI ", ctx->CP0DataHI);
+ printf("%s: \t %8x\n","CP0DataLO ", ctx->CP0DataLO);
+ printf("%s: \t %8x\n","CP0BadVAddr", ctx->CP0BadVAddr);
+ printf("%s: \t %8x\n","CP0Cause ", ctx->CP0Cause);
+ printf("%s: \t %8x\n","CP0EPC ", ctx->CP0EPC);
+ printf("-----------------------------------------------------\n");
+
+#if 0
+ switch (exc)
+ {
+ case EX_MOD:
+ /* TLB modified */
+ break;
+
+ case EX_TLBL: /* TLB exc(load or ifetch) */
+ case EX_TLBS: /* TLB exception (store) */
+
+ break;
+
+ case EX_ADEL: /* Address err(load or ifetch) */
+ case EX_ADES: /* Address error (store) */
+
+ break;
+
+ case EX_IBE: /* Instruction Bus Error */
+ case EX_DBE: /* Data Bus Error */
+
+ break;
+
+ case EX_SYS: /* Syscall */
+
+ break;
+
+ case EX_BP: /* Breakpoint */
+ case EX_TR: /* Trap instruction */
+
+ break;
+ case EX_RI: /* Reserved instruction */
+
+ break;
+ case EX_FPE: /* floating point exception */
+ break;
+
+ case EX_CPU: /* CoProcessor Unusable */
+
+ break;
+ case EX_OV: /* OVerflow */
+ case EX_C2E: /* COP2 exception */
+ case EX_MDMX: /* MDMX exception */
+ case EX_WATCH: /* Watch exception */
+ case EX_MCHECK: /* Machine check exception */
+ case EX_CacheErr: /* Cache error caused re-entry */
+ /* to Debug Mode */
+
+ break;
+ default:
+ rt_kprintf("Unknow exception: %d\r\n", exc);
+ break;
+ }
+#else
+ sys_exception_handlers[exc](ctx);
+#endif
+
+ rt_hw_cpu_shutdown();
+}
+
+
+void mips_cache_error_handler (unsigned int Addr)
+{
+ rt_kprintf("cache exception happens, epc: 0x%08x\n", read_c0_epc());
+ list_thread();
+ rt_hw_cpu_shutdown();
+}
+
+void mips_tlb_refill_handler(void)
+{
+ rt_kprintf("tlb-miss happens, epc: 0x%08x\n", read_c0_epc());
+ rt_kprintf(" cause: 0x%08x\n", read_c0_cause());
+ list_thread();
+ rt_kprintf("current thread: %s\n", rt_thread_self()->name);
+ rt_hw_cpu_shutdown();
+}
diff --git a/libcpu/mips/x1000/mips_excpt_gcc.S b/libcpu/mips/x1000/mips_excpt_gcc.S
new file mode 100644
index 0000000000..c403adf93b
--- /dev/null
+++ b/libcpu/mips/x1000/mips_excpt_gcc.S
@@ -0,0 +1,102 @@
+/*
+ * File : mips_excpt_asm.S
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef __ASSEMBLY__
+# define __ASSEMBLY__
+#endif
+
+#include "../common/mips.h"
+
+#define _EXC_STKSIZE 20*1024
+
+;/*********************************************************************************************************
+; PTE BASE ��ض���
+;*********************************************************************************************************/
+
+#define PTE_BASE_OFFSET 23
+#define PTE_BASE_SIZE 9
+#define MIPS32_BADVPN2_SHIFT 2
+
+
+ .section ".text", "ax"
+ .set noreorder
+
+LEAF(mips_tlb_refill_handlerx)
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ ;/*
+ ; * K1 = CP0_CTXT
+ ; * K0 = K1
+ ; */
+ mfc0 k1 , CP0_CONTEXT ;/* K1 ���� Context �Ĵ��� */
+ ehb
+ move k0 , k1 ;/* K0 ���� Context �Ĵ��� */
+
+ ;/*
+ ; * K1 <<= PTE_BASE_SIZE
+ ; * K1 >>= PTE_BASE_SIZE
+ ; * K1 >>= 4
+ ; * K1 >>= MIPS32_BADVPN2_SHIFT
+ ; * K1 <<= 3
+ ; */
+ sll k1 , PTE_BASE_SIZE
+ srl k1 , (PTE_BASE_SIZE + 4 + MIPS32_BADVPN2_SHIFT) ;/* K1 Ϊ BAD VPN2 */
+ sll k1 , (4 - 1)
+
+ ;/*
+ ; * K0 >>= PTE_BASE_OFFSET
+ ; * K0 <<= PTE_BASE_OFFSET
+ ; */
+ srl k0 , PTE_BASE_OFFSET
+ sll k0 , PTE_BASE_OFFSET ;/* K0 Ϊ PTE BASE */
+
+ ;/*
+ ; * K1 = K1 | K0
+ ; */
+ or k1 , k1 , k0 ;/* �ϳ� */
+
+ ;/*
+ ; * K0 = *K1
+ ; * K1 = *(K1 + 4)
+ ; */
+ lw k0 , 0(k1)
+ lw k1 , 4(k1)
+
+ ;/*
+ ; * CP0_TLBLO0 = K0
+ ; * CP0_TLBLO1 = K1
+ ; */
+ mtc0 k0 , CP0_ENTRYLO0 ;/* EntryLo0 */
+ mtc0 k1 , CP0_ENTRYLO1 ;/* EntryLo1 */
+ ehb
+
+ tlbwr ;/* TLB ����滻 */
+
+ eret ;/* �쳣���� */
+
+ .set pop
+END(mips_tlb_refill_handlerx)
diff --git a/libcpu/mips/x1000/mips_fp_gcc.S b/libcpu/mips/x1000/mips_fp_gcc.S
new file mode 100644
index 0000000000..b219084065
--- /dev/null
+++ b/libcpu/mips/x1000/mips_fp_gcc.S
@@ -0,0 +1,197 @@
+/*
+ * File : mips_vfp32_asm.S
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��9�� Urey the first version
+ */
+
+#ifndef __ASSEMBLY__
+# define __ASSEMBLY__
+#endif
+
+#ifdef __mips_hard_float
+
+.module hardfloat
+.module doublefloat
+.set nomips16
+
+#include "../common/mips.h"
+#undef fp
+
+ .global mips_vfp32_init
+LEAF(mips_vfp32_init)
+ mfc0 t0, CP0_STATUS
+ or t0 , M_StatusCU1
+ mtc0 t0, CP0_STATUS
+ jr ra
+ nop
+END(mips_vfp32_init)
+
+#
+# FUNCTION: _fpctx_save
+#
+# DESCRIPTION: save floating point registers to memory starting at a0
+#
+# RETURNS: int
+# 0: No context saved
+# CTX_*: Type of context stored
+#
+ .global _fpctx_save
+LEAF(_fpctx_save)
+ sw zero, LINKCTX_NEXT(a0)
+ mfc0 t0, CP0_STATUS
+ li t1, M_StatusCU1
+ and t1, t0, t1
+ bnez t1, 1f
+ # FP not enabled, bail out
+ move v0, zero
+ jr ra
+
+1: # Save FP32 base
+ li t1, ST0_FR
+ and t0, t0, t1
+ cfc1 t2, $31
+ sw t2, FP32CTX_CSR(a0)
+ sdc1 $f0, FP32CTX_0(a0)
+ sdc1 $f2, FP32CTX_2(a0)
+ sdc1 $f4, FP32CTX_4(a0)
+ sdc1 $f6, FP32CTX_6(a0)
+ sdc1 $f8, FP32CTX_8(a0)
+ sdc1 $f10, FP32CTX_10(a0)
+ sdc1 $f12, FP32CTX_12(a0)
+ sdc1 $f14, FP32CTX_14(a0)
+ sdc1 $f16, FP32CTX_16(a0)
+ sdc1 $f18, FP32CTX_18(a0)
+ sdc1 $f20, FP32CTX_20(a0)
+ sdc1 $f22, FP32CTX_22(a0)
+ sdc1 $f24, FP32CTX_24(a0)
+ sdc1 $f26, FP32CTX_26(a0)
+ sdc1 $f28, FP32CTX_28(a0)
+ sdc1 $f30, FP32CTX_30(a0)
+ bnez t0, 2f
+ li v0, LINKCTX_TYPE_FP32
+ sw v0, LINKCTX_ID(a0)
+ jr ra
+
+2: # Save FP64 extra
+.set push
+.set fp=64
+ sdc1 $f1, FP64CTX_1(a0)
+ sdc1 $f3, FP64CTX_3(a0)
+ sdc1 $f5, FP64CTX_5(a0)
+ sdc1 $f7, FP64CTX_7(a0)
+ sdc1 $f9, FP64CTX_9(a0)
+ sdc1 $f11, FP64CTX_11(a0)
+ sdc1 $f13, FP64CTX_13(a0)
+ sdc1 $f15, FP64CTX_15(a0)
+ sdc1 $f17, FP64CTX_17(a0)
+ sdc1 $f19, FP64CTX_19(a0)
+ sdc1 $f21, FP64CTX_21(a0)
+ sdc1 $f23, FP64CTX_23(a0)
+ sdc1 $f25, FP64CTX_25(a0)
+ sdc1 $f27, FP64CTX_27(a0)
+ sdc1 $f29, FP64CTX_29(a0)
+ sdc1 $f31, FP64CTX_31(a0)
+.set pop
+ li v0, LINKCTX_TYPE_FP64
+ sw v0, LINKCTX_ID(a0)
+ jr ra
+END(_fpctx_save)
+
+#
+# FUNCTION: _fpctx_load
+#
+# DESCRIPTION: load floating point registers from context chain starting at a0
+#
+# RETURNS: int
+# 0: Unrecognised context
+# CTX_*: Type of context restored
+#
+ .global _fpctx_load
+LEAF(_fpctx_load)
+ lw v0, LINKCTX_ID(a0)
+ # Detect type
+ li t0, LINKCTX_TYPE_FP64
+ li t1, LINKCTX_TYPE_FP32
+ li t2, M_StatusCU1
+ beq v0, t0, 0f
+ beq v0, t1, 1f
+ # Don't recognise this context, fail
+ move v0, zero
+ jr ra
+
+0: # FP64 context
+ # Enable CU1
+ di t3
+ ehb
+ or t3, t3, t2
+ mtc0 t3, CP0_STATUS
+ ehb
+ # Load FP64 extra
+.set push
+.set fp=64
+ ldc1 $f1, FP64CTX_1(a0)
+ ldc1 $f3, FP64CTX_3(a0)
+ ldc1 $f5, FP64CTX_5(a0)
+ ldc1 $f7, FP64CTX_7(a0)
+ ldc1 $f9, FP64CTX_9(a0)
+ ldc1 $f11, FP64CTX_11(a0)
+ ldc1 $f13, FP64CTX_13(a0)
+ ldc1 $f15, FP64CTX_15(a0)
+ ldc1 $f17, FP64CTX_17(a0)
+ ldc1 $f19, FP64CTX_19(a0)
+ ldc1 $f21, FP64CTX_21(a0)
+ ldc1 $f23, FP64CTX_23(a0)
+ ldc1 $f25, FP64CTX_25(a0)
+ ldc1 $f27, FP64CTX_27(a0)
+ ldc1 $f29, FP64CTX_29(a0)
+ ldc1 $f31, FP64CTX_31(a0)
+.set pop
+1: # FP32 context
+ # Enable CU1
+ di t3
+ ehb
+ or t3, t3, t2
+ mtc0 t3, CP0_STATUS
+ ehb
+ # Load FP32 base
+ lw t1, FP32CTX_CSR(a0)
+ ctc1 t1, $31
+ ldc1 $f0, FP32CTX_0(a0)
+ ldc1 $f2, FP32CTX_2(a0)
+ ldc1 $f4, FP32CTX_4(a0)
+ ldc1 $f6, FP32CTX_6(a0)
+ ldc1 $f8, FP32CTX_8(a0)
+ ldc1 $f10, FP32CTX_10(a0)
+ ldc1 $f12, FP32CTX_12(a0)
+ ldc1 $f14, FP32CTX_14(a0)
+ ldc1 $f16, FP32CTX_16(a0)
+ ldc1 $f18, FP32CTX_18(a0)
+ ldc1 $f20, FP32CTX_20(a0)
+ ldc1 $f22, FP32CTX_22(a0)
+ ldc1 $f24, FP32CTX_24(a0)
+ ldc1 $f26, FP32CTX_26(a0)
+ ldc1 $f28, FP32CTX_28(a0)
+ ldc1 $f30, FP32CTX_30(a0)
+ # Return CTX_FP32/64
+ jr ra
+END(_fpctx_load)
+
+#endif
diff --git a/libcpu/mips/x1000/stack.c b/libcpu/mips/x1000/stack.c
new file mode 100644
index 0000000000..0043ea2a21
--- /dev/null
+++ b/libcpu/mips/x1000/stack.c
@@ -0,0 +1,82 @@
+/*
+ * File : stack.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��8�� Urey the first version
+ */
+
+#include <rtthread.h>
+
+#include "../common/mips.h"
+
+register U32 $GP __asm__ ("$28");
+
+rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit)
+{
+ static rt_uint32_t wSR=0;
+ static rt_uint32_t wGP;
+
+ mips_reg_ctx *regCtx;
+ mips_arg_ctx *argCtx;
+ rt_uint32_t i;
+
+ if (wSR == 0)
+ {
+ wSR = read_c0_status();
+ wSR &= 0xfffffffe;
+ wSR |= 0x0403;
+
+ wGP = $GP;
+ }
+
+ if ((rt_uint32_t) stack_addr & 0x7)
+ {
+ stack_addr = (rt_uint8_t *)((rt_uint32_t)stack_addr - 4);
+ }
+
+ argCtx = (mips_arg_ctx *)((rt_uint32_t)stack_addr - sizeof(mips_arg_ctx));
+ regCtx = (mips_reg_ctx *)((rt_uint32_t)stack_addr - sizeof(mips_arg_ctx) - sizeof(mips_reg_ctx));
+
+ for (i = 0; i < 4; ++i)
+ {
+ argCtx->args[i] = i;
+ }
+
+ //����ͨ�üĴ���
+ for (i = 0; i < 32; ++i)
+ {
+ regCtx->regs[i] = i;
+ }
+
+ regCtx->regs[REG_SP] = (rt_uint32_t)stack_addr;
+ regCtx->regs[REG_A0] = (rt_uint32_t)parameter;
+ regCtx->regs[REG_GP] = (rt_uint32_t)wGP;
+ regCtx->regs[REG_FP] = (rt_uint32_t)0x0;
+ regCtx->regs[REG_RA] = (rt_uint32_t)texit;
+
+ regCtx->CP0DataLO = 0x00;
+ regCtx->CP0DataHI = 0x00;
+ regCtx->CP0Cause = read_c0_cause();
+ regCtx->CP0Status = wSR;
+ regCtx->CP0EPC = (rt_uint32_t)tentry;
+ regCtx->CP0BadVAddr= 0x00;
+
+ return (rt_uint8_t *)(regCtx);
+}
diff --git a/libcpu/mips/x1000/startup_gcc.S b/libcpu/mips/x1000/startup_gcc.S
new file mode 100644
index 0000000000..1376cb7dd4
--- /dev/null
+++ b/libcpu/mips/x1000/startup_gcc.S
@@ -0,0 +1,328 @@
+/*
+ * File : startup.S
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2016��9��7�� Urey the first version
+ */
+
+#ifndef __ASSEMBLY__
+# define __ASSEMBLY__
+#endif
+
+#include "../common/mips.h"
+
+#define IRQ_STACK_SIZE 0x2000
+#define EXC_STACK_SIZE 0x2000
+
+
+ .section ".bss"
+ ALIGN(4)
+irq_stack_low:
+ .space IRQ_STACK_SIZE
+irq_stack_top:
+ .space 8
+
+ ALIGN(4)
+exc_stack_low:
+ .space EXC_STACK_SIZE
+exc_stack_top:
+ .space 8
+
+#define SYSTEM_STACK 0x80003fe8
+
+;/*********************************************************************************************************
+; ���
+;*********************************************************************************************************/
+ .global rtthread_startup
+ .global mips_vfp32_init
+
+ .global _start
+ .section ".start", "ax"
+ .set noreorder
+_start:
+ .set noreorder
+ la ra, _start
+
+ li t1, 0x00800000
+ mtc0 t1, CP0_CAUSE
+
+ /* init cp0 registers. */
+ li t0, 0x1000FC00 /* BEV = 0 and mask all interrupt */
+ mtc0 t0, CP0_STATUS
+
+#ifdef __mips_hard_float
+ jal mips_vfp32_init
+ nop
+#endif
+
+ /* setup stack pointer */
+ li sp, SYSTEM_STACK
+ la gp, _gp
+
+_cache_init:
+ /* init caches, assumes a 4way * 128set * 32byte I/D cache */
+ mtc0 zero, CP0_TAGLO /* TAGLO reg */
+ mtc0 zero, CP0_TAGHI /* TAGHI reg */
+ li t0, 3 /* enable cache for kseg0 accesses */
+ mtc0 t0, CP0_CONFIG /* CONFIG reg */
+ la t0, 0x80000000 /* an idx op should use an unmappable address */
+ ori t1, t0, 0x4000 /* 16kB cache */
+
+_cache_loop:
+ cache 0x8, 0(t0) /* index store icache tag */
+ cache 0x9, 0(t0) /* index store dcache tag */
+ bne t0, t1, _cache_loop
+ addiu t0, t0, 0x20 /* 32 bytes per cache line */
+ nop
+
+ /* invalidate BTB */
+ mfc0 t0, CP0_CONFIG
+ nop
+ ori t0, 2
+ mtc0 t0, CP0_CONFIG
+ nop
+
+
+ /* jump to RT-Thread RTOS */
+ jal rtthread_startup
+ nop
+
+ /* restart, never die */
+ j _start
+ nop
+ .set reorder
+
+
+;/*********************************************************************************************************
+; �쳣������
+;*********************************************************************************************************/
+ /* 0x0 - TLB refill handler */
+ .section .vectors.1, "ax", %progbits
+ j mips_tlb_refill_entry
+ nop
+
+ /* 0x100 - Cache error handler */
+ .section .vectors.2, "ax", %progbits
+ j mips_cache_error_entry
+ nop
+
+ /* 0x180 - Exception/Interrupt handler */
+ .section .vectors.3, "ax", %progbits
+ j mips_exception_entry
+ nop
+
+ /* 0x200 - Special Exception Interrupt handler (when IV is set in CP0_CAUSE) */
+ .section .vectors.4, "ax", %progbits
+ j mips_interrupt_entry
+ nop
+ .section .vectors, "ax", %progbits
+
+ .global mips_exception_handler
+// .global mips_syscall
+LEAF(mips_exception_entry)
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ mfc0 k0, C0_CAUSE
+ andi k0, k0, 0x7c
+ beq zero, k0, except_do_intr
+ nop
+
+ andi k0,(0x08 << 2)
+ beq zero,k0,except_do
+ nop
+except_do_intr:
+ la k0,mips_interrupt_entry
+ jr k0
+ nop
+except_do_syscall:
+// la k0,mips_syscall
+// jr k0
+ nop
+except_do:
+ //save sp
+ move k0,sp
+ //la sp, exc_stack_top
+ subu sp, sp, CONTEXT_SIZE
+ //save context
+ sw $0, (4*0)(sp);
+ sw $1, (4*1)(sp);
+ sw $2, (4*2)(sp);
+ sw $3, (4*3)(sp);
+ sw $4, (4*4)(sp);
+ sw $5, (4*5)(sp);
+ sw $6, (4*6)(sp);
+ sw $7, (4*7)(sp);
+ sw $8, (4*8)(sp);
+ sw $9, (4*9)(sp);
+ sw $10, (4*10)(sp);
+ sw $11, (4*11)(sp);
+ sw $12, (4*12)(sp);
+ sw $13, (4*13)(sp);
+ sw $14, (4*14)(sp);
+ sw $15, (4*15)(sp);
+ sw $16, (4*16)(sp);
+ sw $17, (4*17)(sp);
+ sw $18, (4*18)(sp);
+ sw $19, (4*19)(sp);
+ sw $20, (4*20)(sp);
+ sw $21, (4*21)(sp);
+ sw $22, (4*22)(sp);
+ sw $23, (4*23)(sp);
+ sw $24, (4*24)(sp);
+ sw $25, (4*25)(sp);
+ sw $26, (4*26)(sp);
+ sw $27, (4*27)(sp);
+ sw $28, (4*28)(sp);
+ sw k0, (4*29)(sp); //old sp
+ sw $30, (4*30)(sp);
+ sw $31, (4*31)(sp);
+
+ /* STATUS CAUSE EPC.... */
+ mfc0 $2, CP0_STATUS
+ sw $2, STK_OFFSET_SR(sp)
+
+ mfc0 $2, CP0_CAUSE
+ sw $2, STK_OFFSET_CAUSE(sp)
+
+ mfc0 $2, CP0_BADVADDR
+ sw $2, STK_OFFSET_BADVADDR(sp)
+
+ MFC0 $2, CP0_EPC
+ sw $2, STK_OFFSET_EPC(sp)
+
+ mfhi $2
+ sw $2, STK_OFFSET_HI(sp)
+
+ mflo $2
+ sw $2, STK_OFFSET_LO(sp)
+
+ move a0, sp
+ la k0, mips_exception_handler
+ j k0
+ nop
+
+ //
+
+ .set pop
+END(mips_exception_entry)
+
+ .global mips_tlb_refill_handler
+LEAF(mips_tlb_refill_entry)
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ la k0,mips_tlb_refill_handler
+ jr k0
+
+ nop
+ eret
+ nop
+
+ .set pop
+END(mips_tlb_refill_entry)
+
+ .global mips_cache_error_handler
+LEAF(mips_cache_error_entry)
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ la k0,mips_cache_error_handler
+ jr k0
+ nop
+ eret
+ nop
+
+ .set pop
+END(mips_cache_error_entry)
+
+
+
+.global rt_interrupt_dispatch
+.global rt_interrupt_enter
+.global rt_interrupt_leave
+LEAF(mips_interrupt_entry)
+ .set push
+ .set noat
+ .set noreorder
+ .set volatile
+
+ //mfc0 k0,CP0_EPC
+ SAVE_CONTEXT
+
+ mfc0 t0, CP0_CAUSE
+ mfc0 t1, CP0_STATUS
+ and t0, t1
+
+ andi t0, 0xff00
+ beqz t0, spurious_interrupt
+ nop
+
+ /* let k0 keep the current context sp */
+ move k0, sp
+
+ /* switch to kernel stack */
+ la sp, irq_stack_top
+ jal rt_interrupt_enter
+ nop
+ jal rt_interrupt_dispatch
+ nop
+ jal rt_interrupt_leave
+ nop
+
+ /* switch sp back to thread's context */
+ move sp, k0
+
+ /*
+ * if rt_thread_switch_interrupt_flag set, jump to
+ * rt_hw_context_switch_interrupt_do and don't return
+ */
+ la k0, rt_thread_switch_interrupt_flag
+ lw k1, 0(k0)
+ beqz k1, spurious_interrupt
+ nop
+ sw zero, 0(k0) /* clear flag */
+ nop
+
+ /*
+ * switch to the new thread
+ */
+ la k0, rt_interrupt_from_thread
+ lw k1, 0(k0)
+ nop
+ sw sp, 0(k1) /* store sp in preempted tasks's TCB */
+
+ la k0, rt_interrupt_to_thread
+ lw k1, 0(k0)
+ nop
+ lw sp, 0(k1) /* get new task's stack pointer */
+ j spurious_interrupt
+ nop
+spurious_interrupt:
+ RESTORE_CONTEXT
+
+ .set pop
+END(mips_interrupt_entry)
diff --git a/libcpu/mips/x1000/x1000.h b/libcpu/mips/x1000/x1000.h
new file mode 100644
index 0000000000..aa18297395
--- /dev/null
+++ b/libcpu/mips/x1000/x1000.h
@@ -0,0 +1,284 @@
+/*
+ * File : x1000.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2015-11-19 Urey the first version
+ */
+
+#ifndef __X1000_H__
+#define __X1000_H__
+
+#include "../common/mips.h"
+
+#ifndef __ASSEMBLY__
+
+#define cache_unroll(base,op) \
+ __asm__ __volatile__(" \
+ .set noreorder; \
+ .set mips3; \
+ cache %1, (%0); \
+ .set mips0; \
+ .set reorder" \
+ : \
+ : "r" (base), \
+ "i" (op));
+
+/* cpu pipeline flush */
+static inline void jz_sync(void)
+{
+ __asm__ volatile ("sync");
+}
+
+static inline void writeb(u8 value, u32 address)
+{
+ *((volatile u8 *) address) = value;
+}
+static inline void writew( u16 value, u32 address)
+{
+ *((volatile u16 *) address) = value;
+}
+static inline void writel(u32 value, u32 address)
+{
+ *((volatile u32 *) address) = value;
+}
+
+static inline u8 readb(u32 address)
+{
+ return *((volatile u8 *)address);
+}
+
+static inline u16 readw(u32 address)
+{
+ return *((volatile u16 *)address);
+}
+
+static inline u32 readl(u32 address)
+{
+ return *((volatile u32 *)address);
+}
+
+static inline void jz_writeb(u32 address, u8 value)
+{
+ *((volatile u8 *)address) = value;
+}
+
+static inline void jz_writew(u32 address, u16 value)
+{
+ *((volatile u16 *)address) = value;
+}
+
+static inline void jz_writel(u32 address, u32 value)
+{
+ *((volatile u32 *)address) = value;
+}
+
+static inline u8 jz_readb(u32 address)
+{
+ return *((volatile u8 *)address);
+}
+
+static inline u16 jz_readw(u32 address)
+{
+ return *((volatile u16 *)address);
+}
+
+static inline u32 jz_readl(u32 address)
+{
+ return *((volatile u32 *)address);
+}
+
+#define BIT(n) (0x01u << (n))
+#define BIT0 (0x01u << 0)
+#define BIT1 (0x01u << 1)
+#define BIT2 (0x01u << 2)
+#define BIT3 (0x01u << 3)
+#define BIT4 (0x01u << 4)
+#define BIT5 (0x01u << 5)
+#define BIT6 (0x01u << 6)
+#define BIT7 (0x01u << 7)
+#define BIT8 (0x01u << 8)
+#define BIT9 (0x01u << 9)
+#define BIT10 (0x01u << 10)
+#define BIT11 (0x01u << 11)
+#define BIT12 (0x01u << 12)
+#define BIT13 (0x01u << 13)
+#define BIT14 (0x01u << 14)
+#define BIT15 (0x01u << 15)
+#define BIT16 (0x01u << 16)
+#define BIT17 (0x01u << 17)
+#define BIT18 (0x01u << 18)
+#define BIT19 (0x01u << 19)
+#define BIT20 (0x01u << 20)
+#define BIT21 (0x01u << 21)
+#define BIT22 (0x01u << 22)
+#define BIT23 (0x01u << 23)
+#define BIT24 (0x01u << 24)
+#define BIT25 (0x01u << 25)
+#define BIT26 (0x01u << 26)
+#define BIT27 (0x01u << 27)
+#define BIT28 (0x01u << 28)
+#define BIT29 (0x01u << 29)
+#define BIT30 (0x01u << 30)
+#define BIT31 (0x01u << 31)
+
+/* Generate the bit field mask from msb to lsb */
+#define BITS_H2L(msb, lsb) ((0xFFFFFFFF >> (32-((msb)-(lsb)+1))) << (lsb))
+
+
+/* Get the bit field value from the data which is read from the register */
+#define get_bf_value(data, lsb, mask) (((data) & (mask)) >> (lsb))
+
+#endif /* !ASSEMBLY */
+
+
+//----------------------------------------------------------------------
+// Register Definitions
+//
+/* AHB0 BUS Devices Base */
+#define HARB0_BASE 0xB3000000
+#define EMC_BASE 0xB3010000
+#define DDRC_BASE 0xB3020000
+#define MDMAC_BASE 0xB3030000
+#define LCD_BASE 0xB3050000
+#define TVE_BASE 0xB3050000
+#define SLCD_BASE 0xB3050000
+#define CIM_BASE 0xB3060000
+#define IPU_BASE 0xB3080000
+/* AHB1 BUS Devices Base */
+#define HARB1_BASE 0xB3200000
+#define DMAGP0_BASE 0xB3210000
+#define DMAGP1_BASE 0xB3220000
+#define DMAGP2_BASE 0xB3230000
+#define MC_BASE 0xB3250000
+#define ME_BASE 0xB3260000
+#define DEBLK_BASE 0xB3270000
+#define IDCT_BASE 0xB3280000
+#define CABAC_BASE 0xB3290000
+#define TCSM0_BASE 0xB32B0000
+#define TCSM1_BASE 0xB32C0000
+#define SRAM_BASE 0xB32D0000
+/* AHB2 BUS Devices Base */
+#define HARB2_BASE 0xB3400000
+#define NEMC_BASE 0xB3410000
+#define DMAC_BASE 0xB3420000
+#define UHC_BASE 0xB3430000
+//#define UDC_BASE 0xB3440000
+#define SFC_BASE 0xB3440000
+#define GPS_BASE 0xB3480000
+#define ETHC_BASE 0xB34B0000
+#define BCH_BASE 0xB34D0000
+#define MSC0_BASE 0xB3450000
+#define MSC1_BASE 0xB3460000
+#define MSC2_BASE 0xB3470000
+#define OTG_BASE 0xb3500000
+
+/* APB BUS Devices Base */
+#define CPM_BASE 0xB0000000
+#define INTC_BASE 0xB0001000
+#define TCU_BASE 0xB0002000
+#define WDT_BASE 0xB0002000
+#define OST_BASE 0xB2000000 /* OS Timer */
+#define RTC_BASE 0xB0003000
+#define GPIO_BASE 0xB0010000
+#define AIC_BASE 0xB0020000
+#define DMIC_BASE 0xB0021000
+#define ICDC_BASE 0xB0020000
+#define UART0_BASE 0xB0030000
+#define UART1_BASE 0xB0031000
+#define UART2_BASE 0xB0032000
+#define SCC_BASE 0xB0040000
+#define SSI0_BASE 0xB0043000
+#define SSI1_BASE 0xB0044000
+#define SSI2_BASE 0xB0045000
+#define I2C0_BASE 0xB0050000
+#define I2C1_BASE 0xB0051000
+#define I2C2_BASE 0xB0052000
+#define PS2_BASE 0xB0060000
+#define SADC_BASE 0xB0070000
+#define OWI_BASE 0xB0072000
+#define TSSI_BASE 0xB0073000
+
+/* NAND CHIP Base Address*/
+#define NEMC_CS1_IOBASE 0Xbb000000
+#define NEMC_CS2_IOBASE 0Xba000000
+#define NEMC_CS3_IOBASE 0Xb9000000
+#define NEMC_CS4_IOBASE 0Xb8000000
+#define NEMC_CS5_IOBASE 0Xb7000000
+#define NEMC_CS6_IOBASE 0Xb6000000
+
+/*********************************************************************************************************
+** WDT
+*********************************************************************************************************/
+#define WDT_TDR (0x00)
+#define WDT_TCER (0x04)
+#define WDT_TCNT (0x08)
+#define WDT_TCSR (0x0C)
+
+#define REG_WDT_TDR REG16(WDT_BASE + WDT_TDR)
+#define REG_WDT_TCER REG8(WDT_BASE + WDT_TCER)
+#define REG_WDT_TCNT REG16(WDT_BASE + WDT_TCNT)
+#define REG_WDT_TCSR REG16(WDT_BASE + WDT_TCSR)
+
+#define WDT_TSCR_WDTSC (1 << 16)
+
+#define WDT_TCSR_PRESCALE_1 (0 << 3)
+#define WDT_TCSR_PRESCALE_4 (1 << 3)
+#define WDT_TCSR_PRESCALE_16 (2 << 3)
+#define WDT_TCSR_PRESCALE_64 (3 << 3)
+#define WDT_TCSR_PRESCALE_256 (4 << 3)
+#define WDT_TCSR_PRESCALE_1024 (5 << 3)
+
+#define WDT_TCSR_EXT_EN (1 << 2)
+#define WDT_TCSR_RTC_EN (1 << 1)
+#define WDT_TCSR_PCK_EN (1 << 0)
+
+#define WDT_TCER_TCEN (1 << 0)
+
+/* RTC Reg */
+#define RTC_RTCCR (0x00) /* rw, 32, 0x00000081 */
+#define RTC_RTCSR (0x04) /* rw, 32, 0x???????? */
+#define RTC_RTCSAR (0x08) /* rw, 32, 0x???????? */
+#define RTC_RTCGR (0x0c) /* rw, 32, 0x0??????? */
+#define RTC_HCR (0x20) /* rw, 32, 0x00000000 */
+#define RTC_HWFCR (0x24) /* rw, 32, 0x0000???0 */
+#define RTC_HRCR (0x28) /* rw, 32, 0x00000??0 */
+#define RTC_HWCR (0x2c) /* rw, 32, 0x00000008 */
+#define RTC_HWRSR (0x30) /* rw, 32, 0x00000000 */
+#define RTC_HSPR (0x34) /* rw, 32, 0x???????? */
+#define RTC_WENR (0x3c) /* rw, 32, 0x00000000 */
+#define RTC_CKPCR (0x40) /* rw, 32, 0x00000010 */
+#define RTC_OWIPCR (0x44) /* rw, 32, 0x00000010 */
+#define RTC_PWRONCR (0x48) /* rw, 32, 0x???????? */
+
+#define RTCCR_WRDY BIT(7)
+#define WENR_WEN BIT(31)
+
+#define RECOVERY_SIGNATURE (0x001a1a)
+#define REBOOT_SIGNATURE (0x003535)
+#define UNMSAK_SIGNATURE (0x7c0000)//do not use these bits
+
+
+#include "x1000_cpm.h"
+#include "x1000_intc.h"
+#include "x1000_otg_dwc.h"
+#include "x1000_aic.h"
+#include "x1000_slcdc.h"
+
+#endif /* _JZ_M150_H_ */
diff --git a/libcpu/mips/x1000/x1000_aic.h b/libcpu/mips/x1000/x1000_aic.h
new file mode 100644
index 0000000000..ed2c8e6f73
--- /dev/null
+++ b/libcpu/mips/x1000/x1000_aic.h
@@ -0,0 +1,794 @@
+/**
+ ******************************************************************************
+ * @file x1000_aic.h
+ * @author Urey
+ * @version V1.0.0
+ * @date 2017��2��20��
+ * @brief TODO
+ ******************************************************************************
+**/
+
+
+#ifndef _X1000_AIC_H_
+#define _X1000_AIC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AIC_FR (AIC_BASE + 0x00)
+#define AIC_CR (AIC_BASE + 0x04)
+#define AIC_ACCR1 (AIC_BASE + 0x08)
+#define AIC_ACCR2 (AIC_BASE + 0x0c)
+#define AIC_I2SCR (AIC_BASE + 0x10)
+#define AIC_SR (AIC_BASE + 0x14)
+#define AIC_ACSR (AIC_BASE + 0x18)
+#define AIC_I2SSR (AIC_BASE + 0x1c)
+#define AIC_ACCAR (AIC_BASE + 0x20)
+#define AIC_ACCDR (AIC_BASE + 0x24)
+#define AIC_ACSAR (AIC_BASE + 0x28)
+#define AIC_ACSDR (AIC_BASE + 0x2c)
+#define AIC_I2SDIV (AIC_BASE + 0x30)
+#define AIC_DR (AIC_BASE + 0x34)
+
+#define SPDIF_ENA (AIC_BASE + 0x80)
+#define SPDIF_CTRL (AIC_BASE + 0x84)
+#define SPDIF_STATE (AIC_BASE + 0x88)
+#define SPDIF_CFG1 (AIC_BASE + 0x8c)
+#define SPDIF_CFG2 (AIC_BASE + 0x90)
+#define SPDIF_FIFO (AIC_BASE + 0x94)
+
+#define ICDC_CKCFG (AIC_BASE + 0xa0)
+#define ICDC_RGADW (AIC_BASE + 0xa4)
+#define ICDC_RGDATA (AIC_BASE + 0xa8)
+
+
+/* AIC_FR definition */
+#define AIC_FR_RFTH_LSB 24
+#define AIC_FR_RFTH(x) ( ( (x)/2 - 1 ) << AIC_FR_RFTH_LSB) // 2, 4, ..., 32
+#define AIC_FR_RFTH_MASK BITS_H2L(27, AIC_FR_RFTH_LSB)
+
+#define AIC_FR_TFTH_LSB 16
+#define AIC_FR_TFTH(x) ( ( (x)/2 ) << AIC_FR_TFTH_LSB) // 2, 4, ..., 32
+#define AIC_FR_TFTH_MASK BITS_H2L(20, AIC_FR_TFTH_LSB)
+
+/* new@4770 */
+#define AIC_FR_IBCKD BIT10
+
+/* new@4770 */
+#define AIC_FR_ISYNCD BIT9
+
+/* new@4770 */
+#define IC_FR_DMODE BIT8
+
+#define AIC_FR_LSMP BIT6
+#define AIC_FR_ICDC BIT5
+#define AIC_FR_AUSEL BIT4
+#define AIC_FR_RST BIT3
+#define AIC_FR_BCKD BIT2
+#define AIC_FR_SYNCD BIT1
+#define AIC_FR_ENB BIT0
+
+
+/* AIC_CR definition */
+#define AIC_CR_PACK16 BIT28
+
+#define AIC_CR_CHANNEL_LSB 24
+#define AIC_CR_CHANNEL_MASK BITS_H2L(26, 24)
+#define AIC_CR_CHANNEL_MONO (0x0 << AIC_CR_CHANNEL_LSB)
+#define AIC_CR_CHANNEL_STEREO (0x1 << AIC_CR_CHANNEL_LSB)
+#define AIC_CR_CHANNEL_4CHNL (0x3 << AIC_CR_CHANNEL_LSB)
+#define AIC_CR_CHANNEL_6CHNL (0x5 << AIC_CR_CHANNEL_LSB)
+#define AIC_CR_CHANNEL_8CHNL (0x7 << AIC_CR_CHANNEL_LSB)
+
+#define AIC_CR_OSS_LSB 19
+#define AIC_CR_OSS_MASK BITS_H2L(21, AIC_CR_OSS_LSB)
+#define AIC_CR_OSS(n) (((n) > 18 ? (n)/6 : (n)/9) << AIC_CR_OSS_LSB) /* n = 8, 16, 18, 20, 24 */
+
+#define AIC_CR_ISS_LSB 16
+#define AIC_CR_ISS_MASK BITS_H2L(18, AIC_CR_ISS_LSB)
+#define AIC_CR_ISS(n) (((n) > 18 ? (n)/6 : (n)/9) << AIC_CR_ISS_LSB) /* n = 8, 16, 18, 20, 24 */
+
+#define AIC_CR_RDMS BIT15
+#define AIC_CR_TDMS BIT14
+#define AIC_CR_M2S BIT11
+#define AIC_CR_ENDSW BIT10
+#define AIC_CR_AVSTSU BIT9
+#define AIC_CR_TFLUSH BIT8
+#define AIC_CR_RFLUSH BIT7
+#define AIC_CR_EROR BIT6
+#define AIC_CR_ETUR BIT5
+#define AIC_CR_ERFS BIT4
+#define AIC_CR_ETFS BIT3
+#define AIC_CR_ENLBF BIT2
+#define AIC_CR_ERPL BIT1
+#define AIC_CR_EREC BIT0
+
+/* AIC controller AC-link control register 1(ACCR1) */
+#define AIC_ACCR1_RS_LSB 16
+#define AIC_ACCR1_RS_MASK BITS_H2L(25, AIC_ACCR1_RS_LSB)
+#define AIC_ACCR1_RS_SLOT(n) ((1 << ((n) - 3)) << AIC_ACCR1_RS_LSB) /* n = 3 .. 12 */
+
+#define AIC_ACCR1_XS_LSB 0
+#define AIC_ACCR1_XS_MASK BITS_H2L(9, AIC_ACCR1_XS_LSB)
+#define AIC_ACCR1_XS_SLOT(n) ((1 << ((n) - 3)) << AIC_ACCR1_XS_LSB) /* n = 3 .. 12 */
+
+/* AIC controller AC-link control register 2 (ACCR2) */
+#define AIC_ACCR2_ERSTO BIT18
+#define AIC_ACCR2_ESADR BIT17
+#define AIC_ACCR2_ECADT BIT16
+#define AIC_ACCR2_SO BIT3
+#define AIC_ACCR2_SR BIT2
+#define AIC_ACCR2_SS BIT1
+#define AIC_ACCR2_SA BIT0
+
+/* AIC controller i2s/msb-justified control register (I2SCR) */
+#define AIC_I2SCR_RFIRST BIT17
+#define AIC_I2SCR_SWLH BIT16
+#define AIC_I2SCR_ISTPBK BIT13
+#define AIC_I2SCR_STPBK BIT12
+#define AIC_I2SCR_ESCLK BIT4
+#define AIC_I2SCR_AMSL BIT0
+
+/* AIC controller FIFO status register (AICSR) */
+#define AIC_SR_RFL_LSB 24
+#define AIC_SR_RFL_MASK BITS_H2L(29, AIC_SR_RFL_LSB)
+
+#define AIC_SR_TFL_LSB 8
+#define AIC_SR_TFL_MASK BITS_H2L(13, AIC_SR_TFL_LSB)
+
+#define AIC_SR_ROR BIT6
+#define AIC_SR_TUR BIT5
+#define AIC_SR_RFS BIT4
+#define AIC_SR_TFS BIT3
+
+/* AIC controller AC-link status register (ACSR) */
+#define AIC_ACSR_SLTERR BIT21
+#define AIC_ACSR_CRDY BIT20
+#define AIC_ACSR_CLPM BIT19
+#define AIC_ACSR_RSTO BIT18
+#define AIC_ACSR_SADR BIT17
+#define AIC_ACSR_CADT BIT16
+
+/* AIC controller I2S/MSB-justified status register (I2SSR) */
+#define AIC_I2SSR_CHBSY BIT5
+#define AIC_I2SSR_TBSY BIT4
+#define AIC_I2SSR_RBSY BIT3
+#define AIC_I2SSR_BSY BIT2
+
+/* AIC controller AC97 codec command address register (ACCAR) */
+#define AIC_ACCAR_CAR_LSB 0
+#define AIC_ACCAR_CAR_MASK BITS_H2L(19, AIC_ACCAR_CAR_LSB)
+
+
+/* AIC controller AC97 codec command data register (ACCDR) */
+#define AIC_ACCDR_CDR_LSB 0
+#define AIC_ACCDR_CDR_MASK BITS_H2L(19, AIC_ACCDR_CDR_LSB)
+
+/* AC97 read and write macro based on ACCAR and ACCDR */
+#define AC97_READ_CMD BIT19
+#define AC97_WRITE_CMD (BIT19 & ~BIT19)
+
+#define AC97_INDEX_LSB 12
+#define AC97_INDEX_MASK BITS_H2L(18, AC97_INDEX_LSB)
+
+#define AC97_DATA_LSB 4
+#define AC97_DATA_MASK BITS_H2L(19, AC97_DATA_LSB)
+
+/* AIC controller AC97 codec status address register (ACSAR) */
+#define AIC_ACSAR_SAR_LSB 0
+#define AIC_ACSAR_SAR_MASK BITS_H2L(19, AIC_ACSAR_SAR_LSB)
+
+/* AIC controller AC97 codec status data register (ACSDR) */
+#define AIC_ACSDR_SDR_LSB 0
+#define AIC_ACSDR_SDR_MASK BITS_H2L(19, AIC_ACSDR_SDR_LSB)
+
+/* AIC controller I2S/MSB-justified clock divider register (I2SDIV) */
+#define AIC_I2SDIV_IDIV_LSB 16
+#define AIC_I2SDIV_IDIV_MASK BITS_H2L(24, AIC_I2SDIV_IDIV_LSB)
+#define AIC_I2SDIV_DIV_LSB 0
+#define AIC_I2SDIV_DIV_MASK BITS_H2L(8, AIC_I2SDIV_DIV_LSB)
+
+/* SPDIF enable register (SPDIF_ENA) */
+#define SPDIF_ENA_SPEN BIT0
+
+/* SPDIF control register (SPDIF_CTRL) */
+#define SPDIF_CTRL_DMAEN BIT15
+#define SPDIF_CTRL_DTYPE BIT14
+#define SPDIF_CTRL_SIGN BIT13
+#define SPDIF_CTRL_INVALID BIT12
+#define SPDIF_CTRL_RST BIT11
+#define SPDIF_CTRL_SPDIFI2S BIT10
+#define SPDIF_CTRL_MTRIG BIT1
+#define SPDIF_CTRL_MFFUR BIT0
+
+/* SPDIF state register (SPDIF_STAT) */
+#define SPDIF_STAT_BUSY BIT7
+#define SPDIF_STAT_FTRIG BIT1
+#define SPDIF_STAT_FUR BIT0
+
+#define SPDIF_STAT_FLVL_LSB 8
+#define SPDIF_STAT_FLVL_MASK BITS_H2L(14, SPDIF_STAT_FLVL_LSB)
+
+/* SPDIF configure 1 register (SPDIF_CFG1) */
+#define SPDIF_CFG1_INITLVL BIT17
+#define SPDIF_CFG1_ZROVLD BIT16
+
+#define SPDIF_CFG1_TRIG_LSB 12
+#define SPDIF_CFG1_TRIG_MASK BITS_H2L(13, SPDIF_CFG1_TRIG_LSB)
+#define SPDIF_CFG1_TRIG(n) (((n) > 16 ? 3 : (n)/8) << SPDIF_CFG1_TRIG_LSB) /* n = 4, 8, 16, 32 */
+
+#define SPDIF_CFG1_SRCNUM_LSB 8
+#define SPDIF_CFG1_SRCNUM_MASK BITS_H2L(11, SPDIF_CFG1_SRCNUM_LSB)
+
+#define SPDIF_CFG1_CH1NUM_LSB 4
+#define SPDIF_CFG1_CH1NUM_MASK BITS_H2L(7, SPDIF_CFG1_CH1NUM_LSB)
+
+#define SPDIF_CFG1_CH2NUM_LSB 0
+#define SPDIF_CFG1_CH2NUM_MASK BITS_H2L(3, SPDIF_CFG1_CH2NUM_LSB)
+
+/* SPDIF configure 2 register (SPDIF_CFG2) */
+#define SPDIF_CFG2_MAXWL BIT18
+#define SPDIF_CFG2_PRE BIT3
+#define SPDIF_CFG2_COPYN BIT2
+#define SPDIF_CFG2_AUDION BIT1
+#define SPDIF_CFG2_CONPRO BIT0
+
+#define SPDIF_CFG2_FS_LSB 26
+#define SPDIF_CFG2_FS_MASK BITS_H2L(29, SPDIF_CFG2_FS_LSB)
+
+#define SPDIF_CFG2_ORGFRQ_LSB 22
+#define SPDIF_CFG2_ORGFRQ_MASK BITS_H2L(25, SPDIF_CFG2_ORGFRQ_LSB)
+
+#define SPDIF_CFG2_SAMWL_LSB 19
+#define SPDIF_CFG2_SAMWL_MASK BITS_H2L(21, SPDIF_CFG2_SAMWL_LSB)
+
+#define SPDIF_CFG2_CLKACU_LSB 16
+#define SPDIF_CFG2_CLKACU_MASK BITS_H2L(17, SPDIF_CFG2_CLKACU_LSB)
+
+#define SPDIF_CFG2_CATCODE_LSB 8
+#define SPDIF_CFG2_CATCODE_MASK BITS_H2L(15, SPDIF_CFG2_CATCODE_LSB)
+
+#define SPDIF_CFG2_CHMD_LSB 6
+#define SPDIF_CFG2_CHMD_MASK BITS_H2L(7, SPDIF_CFG2_CHMD_LSB)
+
+/* ICDC internal register access control register(RGADW) */
+#define ICDC_RGADW_RGWR BIT16
+
+#define ICDC_RGADW_RGADDR_LSB 8
+#define ICDC_RGADW_RGADDR_MASK BITS_H2L(14, ICDC_RGADW_RGADDR_LSB)
+
+#define ICDC_RGADW_RGDIN_LSB 0
+#define ICDC_RGADW_RGDIN_MASK BITS_H2L(7, ICDC_RGADW_RGDIN_LSB)
+
+
+/* ICDC internal register data output register (RGDATA)*/
+#define ICDC_RGDATA_IRQ BIT8
+
+#define ICDC_RGDATA_RGDOUT_LSB 0
+#define ICDC_RGDATA_RGDOUT_MASK BITS_H2L(7, ICDC_RGDATA_RGDOUT_LSB)
+
+
+#ifndef __MIPS_ASSEMBLER
+
+
+#define REG_AIC_FR REG32(AIC_FR)
+#define REG_AIC0_FR REG32(AIC0_FR)
+#define REG_AIC_CR REG32(AIC_CR)
+#define REG_AIC_ACCR1 REG32(AIC_ACCR1)
+#define REG_AIC_ACCR2 REG32(AIC_ACCR2)
+#define REG_AIC_I2SCR REG32(AIC_I2SCR)
+#define REG_AIC_SR REG32(AIC_SR)
+#define REG_AIC_ACSR REG32(AIC_ACSR)
+#define REG_AIC_I2SSR REG32(AIC_I2SSR)
+#define REG_AIC_ACCAR REG32(AIC_ACCAR)
+#define REG_AIC_ACCDR REG32(AIC_ACCDR)
+#define REG_AIC_ACSAR REG32(AIC_ACSAR)
+#define REG_AIC_ACSDR REG32(AIC_ACSDR)
+#define REG_AIC_I2SDIV REG32(AIC_I2SDIV)
+#define REG_AIC_DR REG32(AIC_DR)
+
+#define REG_SPDIF_ENA REG32(SPDIF_ENA)
+#define REG_SPDIF_CTRL REG32(SPDIF_CTRL)
+#define REG_SPDIF_STATE REG32(SPDIF_STATE)
+#define REG_SPDIF_CFG1 REG32(SPDIF_CFG1)
+#define REG_SPDIF_CFG2 REG32(SPDIF_CFG2)
+#define REG_SPDIF_FIFO REG32(SPDIF_FIFO)
+
+#define REG_ICDC_RGADW REG32(ICDC_RGADW)
+#define REG_ICDC_RGDATA REG32(ICDC_RGDATA)
+
+#if 0
+#define __aic_enable() ( REG_AIC_FR |= AIC_FR_ENB )
+#define __aic_disable() ( REG_AIC_FR &= ~AIC_FR_ENB )
+
+#define __aic_select_ac97() ( REG_AIC_FR &= ~AIC_FR_AUSEL )
+#define __aic_select_i2s() ( REG_AIC_FR |= AIC_FR_AUSEL )
+
+#define __aic_play_zero() ( REG_AIC_FR &= ~AIC_FR_LSMP )
+#define __aic_play_lastsample() ( REG_AIC_FR |= AIC_FR_LSMP )
+
+#define __i2s_as_master() ( REG_AIC_FR |= AIC_FR_BCKD | AIC_FR_SYNCD )
+#define __i2s_as_slave() ( REG_AIC_FR &= ~(AIC_FR_BCKD | AIC_FR_SYNCD) )
+
+#define jz_aic_ibck_in (CLRREG32(AIC_FR, AIC_FR_IBCKD))
+#define jz_aic_ibck_out (SETREG32(AIC_FR, AIC_FR_IBCKD))
+
+#define jz_aic_isync_in (CLRREG32(AIC_FR, AIC_FR_ISYNCD))
+#define jz_aic_isync_out (SETREG32(AIC_FR, AIC_FR_ISYNCD))
+
+#define jz_aic_enable_dmode (SETREG32(AIC_FR, AIC_FR_DMODE))
+#define jz_aic_disable_dmode (CLRREG32(AIC_FR, AIC_FR_DMODE))
+
+#define __aic_reset_status() ( REG_AIC_FR & AIC_FR_RST )
+
+#define __aic_reset() \
+do { \
+ REG_AIC_FR |= AIC_FR_RST; \
+} while(0)
+
+
+#define __aic_set_transmit_trigger(n) \
+do { \
+ REG_AIC_FR &= ~AIC_FR_TFTH_MASK; \
+ REG_AIC_FR |= ((n) << AIC_FR_TFTH_LSB); \
+} while(0)
+
+#define __aic_set_receive_trigger(n) \
+do { \
+ REG_AIC_FR &= ~AIC_FR_RFTH_MASK; \
+ REG_AIC_FR |= ((n) << AIC_FR_RFTH_LSB); \
+} while(0)
+
+#define __aic_enable_oldstyle()
+#define __aic_enable_newstyle()
+#define __aic_enable_pack16() ( REG_AIC_CR |= AIC_CR_PACK16 )
+#define __aic_enable_unpack16() ( REG_AIC_CR &= ~AIC_CR_PACK16)
+
+#define jz_aic_set_channel(n) \
+ do { \
+ switch((n)) { \
+ case 1: \
+ case 2: \
+ case 4: \
+ case 6: \
+ case 8: \
+ CLRREG32(AIC_CR, AIC_CR_CHANNEL_MASK); \
+ SETREG32(AIC_CR, ((((n) - 1) << 24) & AIC_CR_CHANNEL_MASK)); \
+ break; \
+ default: \
+ printk("invalid aic channel, must be 1, 2, 4, 6, or 8\n"); \
+ break; \
+ } \
+ } while(0)
+
+/* n = AIC_CR_CHANNEL_MONO,AIC_CR_CHANNEL_STEREO ... */
+#define __aic_out_channel_select(n) \
+do { \
+ REG_AIC_CR &= ~AIC_CR_CHANNEL_MASK; \
+ REG_AIC_CR |= ((n) << AIC_CR_CHANNEL_LSB ); \
+} while(0)
+
+#define __aic_enable_record() ( REG_AIC_CR |= AIC_CR_EREC )
+#define __aic_disable_record() ( REG_AIC_CR &= ~AIC_CR_EREC )
+#define __aic_enable_replay() ( REG_AIC_CR |= AIC_CR_ERPL )
+#define __aic_disable_replay() ( REG_AIC_CR &= ~AIC_CR_ERPL )
+#define __aic_enable_loopback() ( REG_AIC_CR |= AIC_CR_ENLBF )
+#define __aic_disable_loopback() ( REG_AIC_CR &= ~AIC_CR_ENLBF )
+
+#define __aic_flush_tfifo() ( REG_AIC_CR |= AIC_CR_TFLUSH )
+#define __aic_unflush_tfifo() ( REG_AIC_CR &= ~AIC_CR_TFLUSH )
+#define __aic_flush_rfifo() ( REG_AIC_CR |= AIC_CR_RFLUSH )
+#define __aic_unflush_rfifo() ( REG_AIC_CR &= ~AIC_CR_RFLUSH )
+
+#define __aic_enable_transmit_intr() \
+ ( REG_AIC_CR |= (AIC_CR_ETFS | AIC_CR_ETUR) )
+#define __aic_disable_transmit_intr() \
+ ( REG_AIC_CR &= ~(AIC_CR_ETFS | AIC_CR_ETUR) )
+#define __aic_enable_receive_intr() \
+ ( REG_AIC_CR |= (AIC_CR_ERFS | AIC_CR_EROR) )
+#define __aic_disable_receive_intr() \
+ ( REG_AIC_CR &= ~(AIC_CR_ERFS | AIC_CR_EROR) )
+
+#define __aic_enable_transmit_dma() ( REG_AIC_CR |= AIC_CR_TDMS )
+#define __aic_disable_transmit_dma() ( REG_AIC_CR &= ~AIC_CR_TDMS )
+#define __aic_enable_receive_dma() ( REG_AIC_CR |= AIC_CR_RDMS )
+#define __aic_disable_receive_dma() ( REG_AIC_CR &= ~AIC_CR_RDMS )
+
+#define __aic_enable_mono2stereo() ( REG_AIC_CR |= AIC_CR_M2S )
+#define __aic_disable_mono2stereo() ( REG_AIC_CR &= ~AIC_CR_M2S )
+#define __aic_enable_byteswap() ( REG_AIC_CR |= AIC_CR_ENDSW )
+#define __aic_disable_byteswap() ( REG_AIC_CR &= ~AIC_CR_ENDSW )
+#define __aic_enable_unsignadj() ( REG_AIC_CR |= AIC_CR_AVSTSU )
+#define __aic_disable_unsignadj() ( REG_AIC_CR &= ~AIC_CR_AVSTSU )
+
+#define AC97_PCM_XS_L_FRONT AIC_ACCR1_XS_SLOT(3)
+#define AC97_PCM_XS_R_FRONT AIC_ACCR1_XS_SLOT(4)
+#define AC97_PCM_XS_CENTER AIC_ACCR1_XS_SLOT(6)
+#define AC97_PCM_XS_L_SURR AIC_ACCR1_XS_SLOT(7)
+#define AC97_PCM_XS_R_SURR AIC_ACCR1_XS_SLOT(8)
+#define AC97_PCM_XS_LFE AIC_ACCR1_XS_SLOT(9)
+
+#define AC97_PCM_RS_L_FRONT AIC_ACCR1_RS_SLOT(3)
+#define AC97_PCM_RS_R_FRONT AIC_ACCR1_RS_SLOT(4)
+#define AC97_PCM_RS_CENTER AIC_ACCR1_RS_SLOT(6)
+#define AC97_PCM_RS_L_SURR AIC_ACCR1_RS_SLOT(7)
+#define AC97_PCM_RS_R_SURR AIC_ACCR1_RS_SLOT(8)
+#define AC97_PCM_RS_LFE AIC_ACCR1_RS_SLOT(9)
+
+#define __ac97_set_xs_none() ( REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK )
+#define __ac97_set_xs_mono() \
+do { \
+ REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK; \
+ REG_AIC_ACCR1 |= AC97_PCM_XS_R_FRONT; \
+} while(0)
+#define __ac97_set_xs_stereo() \
+do { \
+ REG_AIC_ACCR1 &= ~AIC_ACCR1_XS_MASK; \
+ REG_AIC_ACCR1 |= AC97_PCM_XS_L_FRONT | AC97_PCM_XS_R_FRONT; \
+} while(0)
+
+/* In fact, only stereo is support now. */
+#define __ac97_set_rs_none() ( REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK )
+#define __ac97_set_rs_mono() \
+do { \
+ REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK; \
+ REG_AIC_ACCR1 |= AC97_PCM_RS_R_FRONT; \
+} while(0)
+#define __ac97_set_rs_stereo() \
+do { \
+ REG_AIC_ACCR1 &= ~AIC_ACCR1_RS_MASK; \
+ REG_AIC_ACCR1 |= AC97_PCM_RS_L_FRONT | AC97_PCM_RS_R_FRONT; \
+} while(0)
+
+#define __ac97_warm_reset_codec() \
+ do { \
+ REG_AIC_ACCR2 |= AIC_ACCR2_SA; \
+ REG_AIC_ACCR2 |= AIC_ACCR2_SS; \
+ udelay(2); \
+ REG_AIC_ACCR2 &= ~AIC_ACCR2_SS; \
+ REG_AIC_ACCR2 &= ~AIC_ACCR2_SA; \
+ } while (0)
+
+#define __ac97_cold_reset_codec() \
+ do { \
+ REG_AIC_ACCR2 |= AIC_ACCR2_SR; \
+ udelay(2); \
+ REG_AIC_ACCR2 &= ~AIC_ACCR2_SR; \
+ } while (0)
+
+/* n=8,16,18,20 */
+#define __ac97_set_iass(n) \
+ ( REG_AIC_ACCR2 = (REG_AIC_ACCR2 & ~AIC_ACCR2_IASS_MASK) | AIC_ACCR2_IASS_##n##BIT )
+#define __ac97_set_oass(n) \
+ ( REG_AIC_ACCR2 = (REG_AIC_ACCR2 & ~AIC_ACCR2_OASS_MASK) | AIC_ACCR2_OASS_##n##BIT )
+
+/* This bit should only be set in 2 channels configuration */
+#define __i2s_send_rfirst() ( REG_AIC_I2SCR |= AIC_I2SCR_RFIRST ) /* RL */
+#define __i2s_send_lfirst() ( REG_AIC_I2SCR &= ~AIC_I2SCR_RFIRST ) /* LR */
+
+/* This bit should only be set in 2 channels configuration and 16bit-packed mode */
+#define __i2s_switch_lr() ( REG_AIC_I2SCR |= AIC_I2SCR_SWLH )
+#define __i2s_unswitch_lr() ( REG_AIC_I2SCR &= ~AIC_I2SCR_SWLH )
+
+#define __i2s_select_i2s() ( REG_AIC_I2SCR &= ~AIC_I2SCR_AMSL )
+#define __i2s_select_msbjustified() ( REG_AIC_I2SCR |= AIC_I2SCR_AMSL )
+
+/* n=8,16,18,20,24 */
+/*#define __i2s_set_sample_size(n) \
+ ( REG_AIC_I2SCR |= (REG_AIC_I2SCR & ~AIC_I2SCR_WL_MASK) | AIC_I2SCR_WL_##n##BIT )*/
+
+#define __i2s_out_channel_select(n) __aic_out_channel_select(n)
+
+#define __i2s_set_oss_sample_size(n) \
+ ( REG_AIC_CR = (REG_AIC_CR & ~AIC_CR_OSS_MASK) | AIC_CR_OSS(n))
+#define __i2s_set_iss_sample_size(n) \
+ ( REG_AIC_CR = (REG_AIC_CR & ~AIC_CR_ISS_MASK) | AIC_CR_ISS(n))
+
+#define __i2s_stop_bitclk() ( REG_AIC_I2SCR |= AIC_I2SCR_STPBK )
+#define __i2s_start_bitclk() ( REG_AIC_I2SCR &= ~AIC_I2SCR_STPBK )
+
+#define __i2s_stop_ibitclk() ( REG_AIC_I2SCR |= AIC_I2SCR_ISTPBK )
+#define __i2s_start_ibitclk() ( REG_AIC_I2SCR &= ~AIC_I2SCR_ISTPBK )
+
+#define __aic_transmit_request() ( REG_AIC_SR & AIC_SR_TFS )
+#define __aic_receive_request() ( REG_AIC_SR & AIC_SR_RFS )
+#define __aic_transmit_underrun() ( REG_AIC_SR & AIC_SR_TUR )
+#define __aic_receive_overrun() ( REG_AIC_SR & AIC_SR_ROR )
+
+#define __aic_clear_errors() ( REG_AIC_SR &= ~(AIC_SR_TUR | AIC_SR_ROR) )
+
+#define __aic_get_transmit_resident() \
+ ( (REG_AIC_SR & AIC_SR_TFL_MASK) >> AIC_SR_TFL_LSB )
+#define __aic_get_receive_count() \
+ ( (REG_AIC_SR & AIC_SR_RFL_MASK) >> AIC_SR_RFL_LSB )
+
+#define __ac97_command_transmitted() ( REG_AIC_ACSR & AIC_ACSR_CADT )
+#define __ac97_status_received() ( REG_AIC_ACSR & AIC_ACSR_SADR )
+#define __ac97_status_receive_timeout() ( REG_AIC_ACSR & AIC_ACSR_RSTO )
+#define __ac97_codec_is_low_power_mode() ( REG_AIC_ACSR & AIC_ACSR_CLPM )
+#define __ac97_codec_is_ready() ( REG_AIC_ACSR & AIC_ACSR_CRDY )
+#define __ac97_slot_error_detected() ( REG_AIC_ACSR & AIC_ACSR_SLTERR )
+#define __ac97_clear_slot_error() ( REG_AIC_ACSR &= ~AIC_ACSR_SLTERR )
+
+#define __i2s_is_busy() ( REG_AIC_I2SSR & AIC_I2SSR_BSY )
+
+#define __ac97_out_rcmd_addr(reg) \
+do { \
+ REG_AIC_ACCAR = AC97_READ_CMD | ((reg) << AC97_INDEX_LSB); \
+} while (0)
+
+#define __ac97_out_wcmd_addr(reg) \
+do { \
+ REG_AIC_ACCAR = AC97_WRITE_CMD | ((reg) << AC97_INDEX_LSB); \
+} while (0)
+
+#define __ac97_out_data(value) \
+do { \
+ REG_AIC_ACCDR = ((value) << AC97_DATA_LSB); \
+} while (0)
+
+#define __ac97_in_data() \
+ ( (REG_AIC_ACSDR & CODEC_REG_DATA_MASK) >> AC97_DATA_LSB )
+
+#define __ac97_in_status_addr() \
+ ( (REG_AIC_ACSAR & AC97_INDEX_MASK) >> AC97_INDEX_LSB )
+
+#define __i2s_set_sample_rate(i2sclk, sync) \
+ ( REG_AIC_I2SDIV = ((i2sclk) / (4*64)) / (sync) )
+
+#define __aic_write_tfifo(v) ( REG_AIC_DR = (v) )
+#define __aic_read_rfifo() ( REG_AIC_DR )
+
+#define __aic_internal_codec() ( REG_AIC_FR |= AIC_FR_ICDC )
+#define __aic_external_codec() ( REG_AIC_FR &= ~AIC_FR_ICDC )
+#define __aic0_internal_codec() ( REG_AIC0_FR |= AIC_FR_ICDC )
+#define __aic0_external_codec() ( REG_AIC0_FR &= ~AIC_FR_ICDC )
+
+//
+// Define next ops for AC97 compatible
+//
+
+#define AC97_ACSR AIC_ACSR
+
+#define __ac97_enable() __aic_enable(); __aic_select_ac97()
+#define __ac97_disable() __aic_disable()
+#define __ac97_reset() __aic_reset()
+
+#define __ac97_set_transmit_trigger(n) __aic_set_transmit_trigger(n)
+#define __ac97_set_receive_trigger(n) __aic_set_receive_trigger(n)
+
+#define __ac97_enable_record() __aic_enable_record()
+#define __ac97_disable_record() __aic_disable_record()
+#define __ac97_enable_replay() __aic_enable_replay()
+#define __ac97_disable_replay() __aic_disable_replay()
+#define __ac97_enable_loopback() __aic_enable_loopback()
+#define __ac97_disable_loopback() __aic_disable_loopback()
+
+#define __ac97_enable_transmit_dma() __aic_enable_transmit_dma()
+#define __ac97_disable_transmit_dma() __aic_disable_transmit_dma()
+#define __ac97_enable_receive_dma() __aic_enable_receive_dma()
+#define __ac97_disable_receive_dma() __aic_disable_receive_dma()
+
+#define __ac97_transmit_request() __aic_transmit_request()
+#define __ac97_receive_request() __aic_receive_request()
+#define __ac97_transmit_underrun() __aic_transmit_underrun()
+#define __ac97_receive_overrun() __aic_receive_overrun()
+
+#define __ac97_clear_errors() __aic_clear_errors()
+
+#define __ac97_get_transmit_resident() __aic_get_transmit_resident()
+#define __ac97_get_receive_count() __aic_get_receive_count()
+
+#define __ac97_enable_transmit_intr() __aic_enable_transmit_intr()
+#define __ac97_disable_transmit_intr() __aic_disable_transmit_intr()
+#define __ac97_enable_receive_intr() __aic_enable_receive_intr()
+#define __ac97_disable_receive_intr() __aic_disable_receive_intr()
+
+#define __ac97_write_tfifo(v) __aic_write_tfifo(v)
+#define __ac97_read_rfifo() __aic_read_rfifo()
+
+//
+// Define next ops for I2S compatible
+//
+
+#define I2S_ACSR AIC_I2SSR
+
+#define __i2s_enable() __aic_enable(); __aic_select_i2s()
+#define __i2s_disable() __aic_disable()
+#define __i2s_reset() __aic_reset()
+
+#define __i2s_set_transmit_trigger(n) __aic_set_transmit_trigger(n)
+#define __i2s_set_receive_trigger(n) __aic_set_receive_trigger(n)
+
+#define __i2s_enable_record() __aic_enable_record()
+#define __i2s_disable_record() __aic_disable_record()
+#define __i2s_enable_replay() __aic_enable_replay()
+#define __i2s_disable_replay() __aic_disable_replay()
+#define __i2s_enable_loopback() __aic_enable_loopback()
+#define __i2s_disable_loopback() __aic_disable_loopback()
+
+#define __i2s_enable_transmit_dma() __aic_enable_transmit_dma()
+#define __i2s_disable_transmit_dma() __aic_disable_transmit_dma()
+#define __i2s_enable_receive_dma() __aic_enable_receive_dma()
+#define __i2s_disable_receive_dma() __aic_disable_receive_dma()
+
+#define __i2s_transmit_request() __aic_transmit_request()
+#define __i2s_receive_request() __aic_receive_request()
+#define __i2s_transmit_underrun() __aic_transmit_underrun()
+#define __i2s_receive_overrun() __aic_receive_overrun()
+
+#define __i2s_clear_errors() __aic_clear_errors()
+
+#define __i2s_get_transmit_resident() __aic_get_transmit_resident()
+#define __i2s_get_receive_count() __aic_get_receive_count()
+
+#define __i2s_enable_transmit_intr() __aic_enable_transmit_intr()
+#define __i2s_disable_transmit_intr() __aic_disable_transmit_intr()
+#define __i2s_enable_receive_intr() __aic_enable_receive_intr()
+#define __i2s_disable_receive_intr() __aic_disable_receive_intr()
+
+#define __i2s_write_tfifo(v) __aic_write_tfifo(v)
+#define __i2s_read_rfifo() __aic_read_rfifo()
+
+#define __i2s_reset_codec() \
+ do { \
+ } while (0)
+
+
+/*************************************************************************
+ * SPDIF INTERFACE in AIC Controller
+ *************************************************************************/
+
+#define __spdif_enable() ( REG_SPDIF_ENA |= SPDIF_ENA_SPEN )
+#define __spdif_disable() ( REG_SPDIF_ENA &= ~SPDIF_ENA_SPEN )
+
+#define __spdif_enable_transmit_dma() ( REG_SPDIF_CTRL |= SPDIF_CTRL_DMAEN )
+#define __spdif_disable_transmit_dma() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_DMAEN )
+#define __spdif_enable_dtype() ( REG_SPDIF_CTRL |= SPDIF_CTRL_DTYPE )
+#define __spdif_disable_dtype() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_DTYPE )
+#define __spdif_enable_sign() ( REG_SPDIF_CTRL |= SPDIF_CTRL_SIGN )
+#define __spdif_disable_sign() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_SIGN )
+#define __spdif_enable_invalid() ( REG_SPDIF_CTRL |= SPDIF_CTRL_INVALID )
+#define __spdif_disable_invalid() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_INVALID )
+#define __spdif_enable_reset() ( REG_SPDIF_CTRL |= SPDIF_CTRL_RST )
+#define __spdif_select_spdif() ( REG_SPDIF_CTRL |= SPDIF_CTRL_SPDIFI2S )
+#define __spdif_select_i2s() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_SPDIFI2S )
+#define __spdif_enable_MTRIGmask() ( REG_SPDIF_CTRL |= SPDIF_CTRL_MTRIG )
+#define __spdif_disable_MTRIGmask() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_MTRIG )
+#define __spdif_enable_MFFURmask() ( REG_SPDIF_CTRL |= SPDIF_CTRL_MFFUR )
+#define __spdif_disable_MFFURmask() ( REG_SPDIF_CTRL &= ~SPDIF_CTRL_MFFUR )
+
+#define __spdif_enable_initlvl_high() ( REG_SPDIF_CFG1 |= SPDIF_CFG1_INITLVL )
+#define __spdif_enable_initlvl_low() ( REG_SPDIF_CFG1 &= ~SPDIF_CFG1_INITLVL )
+#define __spdif_enable_zrovld_invald() ( REG_SPDIF_CFG1 |= SPDIF_CFG1_ZROVLD )
+#define __spdif_enable_zrovld_vald() ( REG_SPDIF_CFG1 &= ~SPDIF_CFG1_ZROVLD )
+
+/* 0, 1, 2, 3 */
+#define __spdif_set_transmit_trigger(n) \
+do { \
+ REG_SPDIF_CFG1 &= ~SPDIF_CFG1_TRIG_MASK; \
+ REG_SPDIF_CFG1 |= SPDIF_CFG1_TRIG(n); \
+} while(0)
+
+/* 1 ~ 15 */
+#define __spdif_set_srcnum(n) \
+do { \
+ REG_SPDIF_CFG1 &= ~SPDIF_CFG1_SRCNUM_MASK; \
+ REG_SPDIF_CFG1 |= ((n) << SPDIF_CFG1_SRCNUM_LSB); \
+} while(0)
+
+/* 1 ~ 15 */
+#define __spdif_set_ch1num(n) \
+do { \
+ REG_SPDIF_CFG1 &= ~SPDIF_CFG1_CH1NUM_MASK; \
+ REG_SPDIF_CFG1 |= ((n) << SPDIF_CFG1_CH1NUM_LSB); \
+} while(0)
+
+/* 1 ~ 15 */
+#define __spdif_set_ch2num(n) \
+do { \
+ REG_SPDIF_CFG1 &= ~SPDIF_CFG1_CH2NUM_MASK; \
+ REG_SPDIF_CFG1 |= ((n) << SPDIF_CFG1_CH2NUM_LSB); \
+} while(0)
+
+/* 0x0, 0x2, 0x3, 0xa, 0xe */
+#define __spdif_set_fs(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_FS_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_FS_LSB); \
+} while(0)
+
+/* 0xd, 0xc, 0x5, 0x1 */
+#define __spdif_set_orgfrq(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_ORGFRQ_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_ORGFRQ_LSB); \
+} while(0)
+
+/* 0x1, 0x6, 0x2, 0x4, 0x5 */
+#define __spdif_set_samwl(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_SAMWL_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_SAMWL_LSB); \
+} while(0)
+
+#define __spdif_enable_samwl_24() ( REG_SPDIF_CFG2 |= SPDIF_CFG2_MAXWL )
+#define __spdif_enable_samwl_20() ( REG_SPDIF_CFG1 &= ~SPDIF_CFG2_MAXWL )
+
+/* 0x1, 0x1, 0x2, 0x3 */
+#define __spdif_set_clkacu(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_CLKACU_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_CLKACU_LSB); \
+} while(0)
+
+/* see IEC60958-3 */
+#define __spdif_set_catcode(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_CATCODE_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_CATCODE_LSB); \
+} while(0)
+
+/* n = 0x0, */
+#define __spdif_set_chmode(n) \
+do { \
+ REG_SPDIF_CFG2 &= ~SPDIF_CFG2_CHMD_MASK; \
+ REG_SPDIF_CFG2 |= ((n) << SPDIF_CFG2_CHMD_LSB); \
+} while(0)
+
+#define __spdif_enable_pre() ( REG_SPDIF_CFG2 |= SPDIF_CFG2_PRE )
+#define __spdif_disable_pre() ( REG_SPDIF_CFG2 &= ~SPDIF_CFG2_PRE )
+#define __spdif_enable_copyn() ( REG_SPDIF_CFG2 |= SPDIF_CFG2_COPYN )
+#define __spdif_disable_copyn() ( REG_SPDIF_CFG2 &= ~SPDIF_CFG2_COPYN )
+/* audio sample word represents linear PCM samples */
+#define __spdif_enable_audion() ( REG_SPDIF_CFG2 &= ~SPDIF_CFG2_AUDION )
+/* udio sample word used for other purpose */
+#define __spdif_disable_audion() ( REG_SPDIF_CFG2 |= SPDIF_CFG2_AUDION )
+#define __spdif_enable_conpro() ( REG_SPDIF_CFG2 &= ~SPDIF_CFG2_CONPRO )
+#define __spdif_disable_conpro() ( REG_SPDIF_CFG2 |= SPDIF_CFG2_CONPRO )
+
+/***************************************************************************
+ * ICDC
+ ***************************************************************************/
+#define __i2s_internal_codec() __aic_internal_codec()
+#define __i2s_external_codec() __aic_external_codec()
+
+#define __icdc_clk_ready() ( REG_ICDC_CKCFG & ICDC_CKCFG_CKRDY )
+#define __icdc_sel_adc() ( REG_ICDC_CKCFG |= ICDC_CKCFG_SELAD )
+#define __icdc_sel_dac() ( REG_ICDC_CKCFG &= ~ICDC_CKCFG_SELAD )
+
+#define __icdc_set_rgwr() ( REG_ICDC_RGADW |= ICDC_RGADW_RGWR )
+#define __icdc_clear_rgwr() ( REG_ICDC_RGADW &= ~ICDC_RGADW_RGWR )
+#define __icdc_rgwr_ready() ( REG_ICDC_RGADW & ICDC_RGADW_RGWR )
+
+#define AIC_RW_CODEC_START() while (INREG32(ICDC_RGADW) & ICDC_RGADW_RGWR)
+#define AIC_RW_CODEC_STOP() while (INREG32(ICDC_RGADW) & ICDC_RGADW_RGWR)
+
+
+#define __icdc_set_addr(n) \
+do { \
+ REG_ICDC_RGADW &= ~ICDC_RGADW_RGADDR_MASK; \
+ REG_ICDC_RGADW |= (n) << ICDC_RGADW_RGADDR_LSB; \
+} while(0)
+
+#define __icdc_set_cmd(n) \
+do { \
+ REG_ICDC_RGADW &= ~ICDC_RGADW_RGDIN_MASK; \
+ REG_ICDC_RGADW |= (n) << ICDC_RGADW_RGDIN_LSB; \
+} while(0)
+
+#define __icdc_irq_pending() ( REG_ICDC_RGDATA & ICDC_RGDATA_IRQ )
+#define __icdc_get_value() ( REG_ICDC_RGDATA & ICDC_RGDATA_RGDOUT_MASK )
+
+
+
+#endif /* __MIPS_ASSEMBLER */
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _X1000_AIC_H_ */
diff --git a/libcpu/mips/x1000/x1000_cpm.h b/libcpu/mips/x1000/x1000_cpm.h
new file mode 100644
index 0000000000..da2cc964e5
--- /dev/null
+++ b/libcpu/mips/x1000/x1000_cpm.h
@@ -0,0 +1,511 @@
+/*
+ * File : x1000_cpm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017-02-03 Urey the first version
+ */
+
+#ifndef _X1000_CPM_H_
+#define _X1000_CPM_H_
+
+#define CPM_CPCCR (0x00)
+#define CPM_CPCSR (0xd4)
+
+#define CPM_DDRCDR (0x2c)
+#define CPM_I2SCDR (0x60)
+#define CPM_I2SCDR1 (0x70)
+#define CPM_LPCDR (0x64)
+#define CPM_MSC0CDR (0x68)
+#define CPM_MSC1CDR (0xa4)
+#define CPM_USBCDR (0x50)
+#define CPM_MACCDR (0x54)
+#define CPM_UHCCDR (0x6c)
+#define CPM_SFCCDR (0x74)
+#define CPM_CIMCDR (0x7c)
+#define CPM_PCMCDR (0x84)
+#define CPM_PCMCDR1 (0xe0)
+#define CPM_MPHYC (0xe8)
+
+#define CPM_INTR (0xb0)
+#define CPM_INTRE (0xb4)
+#define CPM_DRCG (0xd0)
+#define CPM_CPSPPR (0x38)
+#define CPM_CPPSR (0x34)
+
+#define CPM_USBPCR (0x3c)
+#define CPM_USBRDT (0x40)
+#define CPM_USBVBFIL (0x44)
+#define CPM_USBPCR1 (0x48)
+
+#define CPM_CPAPCR (0x10)
+#define CPM_CPMPCR (0x14)
+
+#define CPM_LCR (0x04)
+#define CPM_PSWC0ST (0x90)
+#define CPM_PSWC1ST (0x94)
+#define CPM_PSWC2ST (0x98)
+#define CPM_PSWC3ST (0x9c)
+#define CPM_CLKGR (0x20)
+#define CPM_CLKGR0 (0x20)
+#define CPM_MESTSEL (0xec)
+#define CPM_SRBC (0xc4)
+#define CPM_ERNG (0xd8)
+#define CPM_RNG (0xdc)
+#define CPM_SLBC (0xc8)
+#define CPM_SLPC (0xcc)
+#define CPM_OPCR (0x24)
+#define CPM_RSR (0x08)
+
+
+
+
+/*
+ * CPM registers common define
+ */
+
+/* Clock control register(CPCCR) */
+#define CPCCR_SEL_SRC_LSB 30
+#define CPCCR_SEL_SRC_MASK BITS_H2L(31, CPCCR_SEL_SRC_LSB)
+
+#define CPCCR_SEL_CPLL_LSB 28
+#define CPCCR_SEL_CPLL_MASK BITS_H2L(29, CPCCR_SEL_CPLL_LSB)
+
+#define CPCCR_SEL_H0PLL_LSB 26
+#define CPCCR_SEL_H0PLL_MASK BITS_H2L(27, CPCCR_SEL_H0PLL_LSB)
+
+#define CPCCR_SEL_H2PLL_LSB 24
+#define CPCCR_SEL_H2PLL_MASK BITS_H2L(25, CPCCR_SEL_H2PLL_LSB)
+
+#define CPCCR_CE_CPU BIT22
+#define CPCCR_CE_AHB0 BIT21
+#define CPCCR_CE_AHB2 BIT20
+#define CPCCR_CE (CPCCR_CE_CPU | CPCCR_CE_AHB0 | CPCCR_CE_AHB2)
+
+#define CPCCR_PDIV_LSB 16
+#define CPCCR_PDIV_MASK BITS_H2L(19, CPCCR_PDIV_LSB)
+
+#define CPCCR_H2DIV_LSB 12
+#define CPCCR_H2DIV_MASK BITS_H2L(15, CPCCR_H2DIV_LSB)
+
+#define CPCCR_H0DIV_LSB 8
+#define CPCCR_H0DIV_MASK BITS_H2L(11, CPCCR_H0DIV_LSB)
+
+#define CPCCR_L2DIV_LSB 4
+#define CPCCR_L2DIV_MASK BITS_H2L(7, CPCCR_L2DIV_LSB)
+
+#define CPCCR_CDIV_LSB 0
+#define CPCCR_CDIV_MASK BITS_H2L(3, CPCCR_CDIV_LSB)
+
+#define CPM_SRC_SEL_APLL 1
+#define CPM_PLL_SEL_SRC 1
+#define CPM_PLL_SEL_MPLL 2
+
+/* Clock Status register(CPCSR) */
+#define CPCSR_SRC_MUX BIT31
+#define CPCSR_CPU_MUX BIT30
+#define CPCSR_AHB0_MUX BIT29
+#define CPCSR_AHB2_MUX BIT28
+#define CPCSR_DDR_MUX BIT27
+#define CPCSR_H2DIV_BUSY BIT2
+#define CPCSR_H0DIV_BUSY BIT1
+#define CPCSR_CDIV_BUSY BIT0
+#define CPCSR_DIV_BUSY (CPCSR_H2DIV_BUSY | CPCSR_H0DIV_BUSY | CPCSR_CDIV_BUSY)
+
+/* DDR clock divider register(DDCDR) */
+#define DDCDR_DCS_LSB 30
+#define DDCDR_DCS_MASK BITS_H2L(31, DDCDR_DCS_LSB)
+#define DDCDR_DCS_STOP (0 << DDCDR_DCS_LSB)
+#define DDCDR_DCS_APLL (1 << DDCDR_DCS_LSB)
+#define DDCDR_DCS_MPLL (2 << DDCDR_DCS_LSB)
+#define DDCDR_CE_DDR BIT29
+#define DDCDR_DDR_BUSY BIT28
+#define DDCDR_DDR_STOP BIT27
+#define DDCDR_GATE_EN BIT26
+#define DDCDR_DDR_CHANGE_EN BIT25
+#define DDCDR_DDR BIT24
+#define DDCDR_DDRDIV_LSB 0
+#define DDCDR_DDRDIV_MASK BITS_H2L(3, DDCDR_DDRDIV_LSB)
+
+/*MACPHY clock divider Register (MACCDR)*/
+#define MACCDR_MACPCS BIT31
+#define MACCDR_CE_MAC BIT29
+#define MACCDR_MAC_BUSY BIT28
+#define MACCDR_MAC_STOP BIT27
+#define MACCDR_MACCDR_LSB BIT0
+#define MACCDR_MACCDR_MASK BITS_H2L(7,MACCDR_MACCDR_LSB)
+
+/* I2S device clock divider register(I2SCDR) */
+#define I2SCDR_I2PCS BIT31
+#define I2SCDR_I2CS BIT30
+
+#define I2SCDR_I2SDIV_M_LSB 13
+#define I2SCDR_I2SDIV_M_MASK BITS_H2L(21,I2SCDR_I2SDIV_M_LSB)
+#define I2SCDR_I2SDIV_N_LSB 0 /* I2SCDR bit */
+#define I2SCDR_I2SDIV_N_MASK BITS_H2L(7, I2SCDR_I2SDIV_N_LSB)
+
+
+/* I2S device clock divider register(I2SCDR1) */
+#define I2SCDR1_NEN BIT31
+#define I2SCDR1_DEN BIT30
+#define I2SCDR1_I2SDIV_D_LSB 0
+#define I2SCDR1_I2SDIV_D_MASK BITS_H2L(12,I2SCDR1_I2SDIV_D_LSB)
+
+/* LCD pix clock divider register(LPCDR) */
+#define LPCDR_LPCS_LSB 31
+#define LPCDR_LPCS_APLL (0 << LPCDR_LPCS_LSB)
+#define LPCDR_LPCS_MPLL (1 << LPCDR_LPCS_LSB)
+#define LPCDR_CE_LCD BIT28
+#define LPCDR_LCD_BUSY BIT27
+#define LPCDR_LCD_STOP BIT26
+
+#define LPCDR_PIXDIV_LSB 0 /* LPCDR bit */
+#define LPCDR_PIXDIV_MASK BITS_H2L(7, LPCDR_PIXDIV_LSB)
+
+/* MSC clock divider register(MSCCDR) */
+#define MSCCDR_MPCS_LSB 31 /* MPCS bit */
+#define MSCCDR_MPCS_APLL (0 << MSCCDR_MPCS_LSB)
+#define MSCCDR_MPCS_MPLL (1 << MSCCDR_MPCS_LSB)
+
+#define MSCCDR_CE_MSC BIT29
+#define MSCCDR_MSC_BUSY BIT28
+#define MSCCDR_MSC_STOP BIT27
+#define MSCCDR_S_CLK0_SEL BIT15
+
+#define MSCCDR_MSCDIV_LSB 0 /* MSCCDR bit */
+#define MSCCDR_MSCDIV_MASK BITS_H2L(7, MSCCDR_MSCDIV_LSB)
+
+
+/* OTG PHY clock divider register(USBCDR) */
+#define USBCDR_UCS BIT31
+#define USBCDR_UPCS BIT30
+#define USBCDR_CE_USB BIT29
+#define USBCDR_USB_BUSY BIT28
+#define USBCDR_USB_STOP BIT27
+
+#define USBCDR_OTGDIV_LSB 0 /* USBCDR bit */
+#define USBCDR_OTGDIV_MASK BITS_H2L(7, USBCDR_OTGDIV_LSB)
+
+/* SSI clock divider register(SSICDR) */
+#define SSICDR_SPCS BIT31
+#define SSICDR_SCS BIT30
+#define SSICDR_CE_SSI BIT29
+#define SSICDR_SSI_BUSY BIT28
+#define SSICDR_SSI_STOP BIT27
+#define SSICDR_SSIDIV_LSB 0 /* SSICDR bit */
+#define SSICDR_SSIDIV_MASK BITS_H2L(7, SSICDR_SSIDIV_LSB)
+
+/* CIM mclk clock divider register(CIMCDR) */
+#define CIMCDR_CIMPCS_APLL (0 << 31)
+#define CIMCDR_CIMPCS_MPLL BIT31
+#define CIMCDR_CE_CIM BIT29
+#define CIMCDR_CIM_BUSY BIT28
+#define CIMCDR_CIM_STOP BIT27
+
+#define CIMCDR_CIMDIV_LSB 0 /* CIMCDR bit */
+#define CIMCDR_CIMDIV_MASK BITS_H2L(7, CIMCDR_CIMDIV_LSB)
+
+
+/* PCM device clock divider register(PCMCDR) */
+#define PCMCDR_PCMPCS_LSB 30
+#define PCMCDR_PCMPCS_MASK BITS_H2L(31,PCMCDR_PCMPCS_LSB)
+#define PCMCDR_PCMPCS_SCLK_A 0 << PCMCDR_PCMPCS_LSB
+#define PCMCDR_PCMPCS_EXTCLK 1 << PCMCDR_PCMPCS_LSB
+#define PCMCDR_PCMPCS_MPLL 2 << PCMCDR_PCMPCS_LSB
+#define PCMCDR_CE_PCM BIT29
+#define PCMCDR_PCMDIV_M_LSB 13
+#define PCMCDR_PCMDIV_M_MASK BITS_H2L(21,PCMCDR_PCMDIV_M_LSB)
+#define PCMCDR_PCMDIV_N_LSB 0
+#define PCMCDR_PCMDIV_N_MASK BITS_H2L(12,PCMCDR_PCMDIV_N_LSB)
+
+/* PCM device clock divider register(PCMCDR1) */
+
+#define PCMCDR1_PCM_NEN BIT31
+#define PCMCDR1_PCM_DEN BIT30
+#define PCMCDR1_PCMDIV_D_LSB 0
+#define PCMCDR1_PCMDIV_D_MASK BITS_H2L(12,PCMCDR1_PCMDIV_D_LSB)
+
+/* MAC PHY Control Register (MPHYC) */
+#define MPHYC_MODE_SEL BIT31 //useless now
+#define MPHYC_MAC_SPEED_LSB 29
+#define MPHYC_MAC_SPEED_MASK BITS_H2L(30,MPHYC_MAC_SPEED_LSB)
+#define MPHYC_SOFT_RST BIT3
+#define MPHYC_PHY_INTF_LSB 0
+#define MPHYC_PHY_INTF_MASK BITS_H2L(2,MPHYC_PHY_INTF_MASK) //useless now
+
+/* CPM Interrupt Register (CPM_INTR)*/
+#define CPM_INTR_VBUS_INTR BIT1
+#define CPM_INTR_ADEV_INTR BIT0
+
+/* CPM Interrupt Enable Register (CPM_INTRE)*/
+#define CPM_INTRE_VBUS_INTRE BIT1
+#define CPM_INTRE_ADEV_INTRE BIT0
+
+/* CPM scratch pad protected register(CPSPPR) */
+#define CPSPPR_CPSPR_WRITABLE (0x00005a5a)
+
+/* OTG parameter control register(USBPCR) */
+#define USBPCR_USB_MODE BIT31
+#define USBPCR_AVLD_REG BIT30
+#define USBPCR_INCRM BIT27 /* INCR_MASK bit */
+#define USBPCR_TXRISE_TUNE BIT26
+#define USBPCR_COMMONONN BIT25
+#define USBPCR_VBUSVLDEXT BIT24
+#define USBPCR_VBUSVLDEXTSEL BIT23
+#define USBPCR_POR BIT22
+#define USBPCR_SIDDQ BIT21
+#define USBPCR_OTG_DISABLE BIT20
+#define USBPCR_TXPREEMPHTUNE BIT6
+
+#define USBPCR_IDPULLUP_LSB 28 /* IDPULLUP_MASK bit */
+#define USBPCR_IDPULLUP_MASK BITS_H2L(29, USBPCR_IDPULLUP_LSB)
+
+#define USBPCR_COMPDISTUNE_LSB 17
+#define USBPCR_COMPDISTUNE_MASK BITS_H2L(19, USBPCR_COMPDISTUNE_LSB)
+
+#define USBPCR_OTGTUNE_LSB 14
+#define USBPCR_OTGTUNE_MASK BITS_H2L(16, USBPCR_OTGTUNE_LSB)
+
+#define USBPCR_SQRXTUNE_LSB 11
+#define USBPCR_SQRXTUNE_MASK BITS_H2L(13, USBPCR_SQRXTUNE_LSB)
+
+#define USBPCR_TXFSLSTUNE_LSB 7
+#define USBPCR_TXFSLSTUNE_MASK BITS_H2L(10, USBPCR_TXFSLSTUNE_LSB)
+
+#define USBPCR_TXRISETUNE_LSB 4
+#define USBPCR_TXRISETUNE_MASK BITS_H2L(5, USBPCR_TXRISETUNE_LSB)
+
+#define USBPCR_TXVREFTUNE_LSB 0
+#define USBPCR_TXVREFTUNE_MASK BITS_H2L(3, USBPCR_TXVREFTUNE_LSB)
+
+/* OTG reset detect timer register(USBRDT) */
+#define USBRDT_HB_MASK BIT26
+#define USBRDT_VBFIL_LD_EN BIT25
+#define USBRDT_IDDIG_EN BIT24
+#define USBRDT_IDDIG_REG BIT23
+
+#define USBRDT_USBRDT_LSB 0
+#define USBRDT_USBRDT_MASK BITS_H2L(22, USBRDT_USBRDT_LSB)
+
+/* OTG parameter control register(USBPCR1) */
+#define USBPCR1_REG BIT31
+#define USBPCR1_USB_SEL BIT28
+#define USBPCR1_REFCLKSEL_LSB 26
+#define USBPCR1_REFCLKSEL_MASK BITS_H2L(27, USBPCR1_REFCLKSEL_LSB)
+
+#define USBPCR1_REFCLKDIV_LSB 24
+#define USBPCR1_REFCLKDIV_MASK BITS_H2L(25, USBPCR1_REFCLKDIV_LSB)
+
+#define USBPCR1_PORT_RST BIT21
+
+#define USBPCR1_WORD_IF0 BIT19
+#define USBPCR1_WORD_IF1 BIT18
+
+
+/* APLL control register (CPXPCR) */
+#define CPAPCR_BS BIT31
+#define CPAPCR_M_LSB 24
+#define CPAPCR_M_MASK BITS_H2L(30, CPAPCR_M_LSB)
+
+#define CPAPCR_N_LSB 18
+#define CPAPCR_N_MASK BITS_H2L(22, CPAPCR_N_LSB)
+
+#define CPAPCR_OD_LSB 16
+#define CPAPCR_OD_MASK BITS_H2L(17, CPAPCR_OD_LSB)
+
+#define CPAPCR_LOCK BIT15 /* LOCK bit */
+#define CPAPCR_ON BIT10
+#define CPAPCR_BP BIT9
+#define CPAPCR_EN BIT8
+#define CPAPCR_PLLST_LSB 0
+#define CPAPCR_PLLST_MASK BITS_H2L(7,CPAPCR_PLLST_LSB)
+
+#define CPM_CPAPCR_EN CPAPCR_EN
+#define CPM_CPAPCR_ON CPAPCR_ON
+
+/* MPLL control register (CPXPCR) */
+#define CPMPCR_BS BIT31
+#define CPMPCR_M_LSB 24
+#define CPMPCR_M_MASK BITS_H2L(30, CPAPCR_M_LSB)
+
+#define CPMPCR_N_LSB 18
+#define CPMPCR_N_MASK BITS_H2L(22, CPAPCR_N_LSB)
+
+#define CPMPCR_OD_LSB 16
+#define CPMPCR_OD_MASK BITS_H2L(17, CPAPCR_OD_LSB)
+
+#define CPMPCR_EN BIT7
+#define CPMPCR_BP BIT6
+#define CPMPCR_LOCK BIT1 /* LOCK bit */
+#define CPMPCR_ON BIT0
+
+#define CPM_CPMPCR_EN CPMPCR_EN
+#define CPM_CPMPCR_ON CPMPCR_ON
+
+
+
+/* Low power control register(LCR) */
+#define LCR_PST_LSB 8
+#define LCD_PST_MASK BITS_H2L(19,LCR_PST_LSB)
+#define LCR_LPM_LSB 0
+#define LCR_LPM_MASK BITS_H2L(1,LCR_LPM_LSB)
+
+/* Clock gate register 0(CGR0) */
+#define CLKGR0_DDR BIT31
+#define CLKGR0_CPU BIT30
+#define CLKGR0_AHB0 BIT29
+#define CLKGR0_APB0 BIT28
+#define CLKGR0_RTC BIT27
+#define CLKGR0_PCM BIT26
+#define CLKGR0_MAC BIT25
+#define CLKGR0_AES BIT24
+#define CLKGR0_LCD BIT23
+#define CLKGR0_CIM BIT22
+#define CLKGR0_PDMA BIT21
+#define CLKGR0_OST BIT20
+#define CLKGR0_SSI BIT19
+#define CLKGR0_TCU BIT18
+#define CLKGR0_DMIC BIT17
+#define CLKGR0_UART2 BIT16
+#define CLKGR0_UART1 BIT15
+#define CLKGR0_UART0 BIT14
+#define CLKGR0_SADC BIT13
+#define CLKGR0_JPEG BIT12
+#define CLKGR0_AIC BIT11
+#define CLKGR0_I2C3 BIT10
+#define CLKGR0_I2C2 BIT9
+#define CLKGR0_I2C1 BIT8
+#define CLKGR0_I2C0 BIT7
+#define CLKGR0_SCC BIT6
+#define CLKGR0_MSC1 BIT5
+#define CLKGR0_MSC0 BIT4
+#define CLKGR0_OTG BIT3
+#define CLKGR0_SFC BIT2
+#define CLKGR0_EFUSE BIT1
+#define CLKGR0_NEMC BIT0
+
+/* CPM MEST SEL Register */
+
+#define MEST_SEL_TST8 BIT8
+#define MEST_SEL_TST7 BIT7
+#define MEST_SEL_TST4 BIT4
+#define MEST_SEL_TST3 BIT3
+#define MEST_SEL_TST1 BIT1
+#define MEST_SEL_TST0 BIT0
+
+/*Soft Reset and Bus Control Register (SRBC)*/
+
+#define SRBC_JPEG_SR BIT31
+#define SRBC_JPEG_STP BIT30
+#define SRBC_JPEG_ACK BIT29
+#define SRBC_LCD_SR BIT25
+#define SRBC_LCD_STP BIT24
+#define SRBC_LCD_ACK BIT23
+#define SRBC_CIM_STP BIT21
+#define SRBC_CIM_ACK BIT20
+#define SRBC_CPU_STP BIT15
+#define SRBC_CPU_ACK BIT14
+#define SRBC_OTG_SR BIT12
+#define SRBC_AHB2_STP BIT8
+#define SRBC_AHB2_ACK BIT7
+#define SRBC_DDR_STP BIT6
+#define SRBC_DDR_ACK BIT5
+
+
+/* Oscillator and power control register(OPCR) */
+#define OPCR_IDLE_DIS BIT31
+#define OPCR_MASK_INT BIT30
+#define OPCR_MASK_VPU BIT29 //ONLY FOR DEBUG
+#define OPCR_GATE_SCLK_ABUS BIT28
+#define OPCR_L2C_PD BIT25
+#define OPCR_REQ_MODE BIT24
+#define OPCR_GATE_USBPHY_CLK BIT23
+#define OPCR_DIS_STOP_MUX BIT22
+#define OPCR_O1ST_LSB 8
+#define OPCR_O1ST_MASK BITS_H2L(19, OPCR_O1ST_LSB)
+#define OPCR_OTGPHY0_ENABLE BIT7 /* otg */
+#define OPCR_OTGPHY1_ENABLE BIT6 /* uhc */
+#define OPCR_USBPHY_ENABLE (OPCR_OTGPHY0_ENABLE | OPCR_OTGPHY1_ENABLE)
+#define OPCR_O1SE BIT4
+#define OPCR_PD BIT3
+#define OPCR_ERCS BIT2
+#define OPCR_BUSMODE BIT1
+
+
+
+/* Reset status register(RSR) */
+#define RSR_HR BIT3
+#define RSR_P0R BIT2
+#define RSR_WR BIT1
+#define RSR_PR BIT0
+
+
+#ifndef __ASSEMBLY__
+
+#define REG_CPM_CPCCR REG32(CPM_BASE + CPM_CPCCR)
+#define REG_CPM_CPCSR REG32(CPM_BASE + CPM_CPCSR)
+#define REG_CPM_DDCDR REG32(CPM_BASE + CPM_DDCDR)
+#define REG_CPM_MACCDR REG32(CPM_BASE + CPM_MACCDR)
+#define REG_CPM_I2SCDR REG32(CPM_BASE + CPM_I2SCDR)
+#define REG_CPM_I2SCDR1 REG32(CPM_BASE + CPM_I2SCDR1)
+#define REG_CPM_LPCDR REG32(CPM_BASE + CPM_LPCDR)
+#define REG_CPM_MSC0CDR REG32(CPM_BASE + CPM_MSC0CDR)
+#define REG_CPM_MSC1CDR REG32(CPM_BASE + CPM_MSC1CDR)
+#define REG_CPM_USBCDR REG32(CPM_BASE + CPM_USBCDR)
+#define REG_CPM_SSICDR REG32(CPM_BASE + CPM_SSICDR)
+#define REG_CPM_CIMCDR REG32(CPM_BASE + CPM_CIMCDR)
+#define REG_CPM_PCMCDR REG32(CPM_BASE + CPM_PCMCDR)
+#define REG_CPM_PCMCDR1 REG32(CPM_BASE + CPM_PCMCDR1)
+#define REG_CPM_MPHYC REG32(CPM_BASE + CPM_MPHYC)
+#define REG_CPM_INTRCDR REG32(CPM_BASE + CPM_INTRCDR)
+#define REG_CPM_INTRECDR REG32(CPM_BASE + CPM_INTRECDR)
+#define REG_CPM_CPSPR REG32(CPM_BASE + CPM_CPSPR)
+#define REG_CPM_CPSPPR REG32(CPM_BASE + CPM_CPSPPR)
+#define REG_CPM_USBPCR REG32(CPM_BASE + CPM_USBPCR)
+#define REG_CPM_USBRDT REG32(CPM_BASE + CPM_USBRDT)
+#define REG_CPM_USBVBFIL REG32(CPM_BASE + CPM_USBVBFIL)
+#define REG_CPM_USBPCR1 REG32(CPM_BASE + CPM_USBPCR1)
+#define REG_CPM_CPAPCR REG32(CPM_BASE + CPM_CPAPCR)
+#define REG_CPM_CPMPCR REG32(CPM_BASE + CPM_CPMPCR)
+
+#define REG_CPM_LCR REG32(CPM_BASE + CPM_LCR)
+#define REG_CPM_PSWC0ST REG32(CPM_BASE + CPM_PSWC0ST)
+#define REG_CPM_PSWC1ST REG32(CPM_BASE + CPM_PSWC1ST)
+#define REG_CPM_PSWC2ST REG32(CPM_BASE + CPM_PSWC2ST)
+#define REG_CPM_PSWC3ST REG32(CPM_BASE + CPM_PSWC3ST)
+#define REG_CPM_CLKGR0 REG32(CPM_BASE + CPM_CLKGR0)
+#define REG_CPM_SRBC REG32(CPM_BASE + CPM_SRBC)
+#define REG_CPM_SLBC REG32(CPM_BASE + CPM_SLBC)
+#define REG_CPM_SLPC REG32(CPM_BASE + CPM_SLPC)
+#define REG_CPM_OPCR REG32(CPM_BASE + CPM_OPCR)
+#define REG_CPM_RSR REG32(CPM_BASE + CPM_RSR)
+
+#define _REG_CPM_MSCCDR(n) REG_CPM_MSC##n##CDR
+#define REG_CPM_MSCCDR(n) _REG_CPM_MSCCDR(n)
+
+/* CPM read write */
+#define cpm_inl(off) readl(CPM_BASE + off)
+#define cpm_outl(val,off) writel(val, CPM_BASE + off)
+#define cpm_test_bit(bit,off) (cpm_inl(off) & 0x1<<(bit))
+#define cpm_set_bit(bit,off) (cpm_outl((cpm_inl(off) | 0x1<<(bit)),off))
+#define cpm_clear_bit(bit,off) (cpm_outl(cpm_inl(off) & ~(0x1 << bit), off))
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _X1000_CPM_H_ */
diff --git a/libcpu/mips/x1000/x1000_intc.h b/libcpu/mips/x1000/x1000_intc.h
new file mode 100644
index 0000000000..1644b90777
--- /dev/null
+++ b/libcpu/mips/x1000/x1000_intc.h
@@ -0,0 +1,120 @@
+/*
+ * File : x1000_intc.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017-02-03 Urey the first version
+ */
+
+#ifndef _X1000_INTC_H_
+#define _X1000_INTC_H_
+
+
+/*
+ * INTC (Interrupt Controller)
+ */
+#define INTC_ISR(n) (INTC_BASE + 0x00 + (n) * 0x20)
+#define INTC_IMR(n) (INTC_BASE + 0x04 + (n) * 0x20)
+#define INTC_IMSR(n) (INTC_BASE + 0x08 + (n) * 0x20)
+#define INTC_IMCR(n) (INTC_BASE + 0x0c + (n) * 0x20)
+#define INTC_IPR(n) (INTC_BASE + 0x10 + (n) * 0x20)
+
+#define REG_INTC_ISR(n) REG32(INTC_ISR((n)))
+#define REG_INTC_IMR(n) REG32(INTC_IMR((n)))
+#define REG_INTC_IMSR(n) REG32(INTC_IMSR((n)))
+#define REG_INTC_IMCR(n) REG32(INTC_IMCR((n)))
+#define REG_INTC_IPR(n) REG32(INTC_IPR((n)))
+
+// interrupt controller interrupts
+#define IRQ_DMIC 0
+#define IRQ_AIC0 1
+#define IRQ_RESERVED2 2
+#define IRQ_RESERVED3 3
+#define IRQ_RESERVED4 4
+#define IRQ_RESERVED5 5
+#define IRQ_RESERVED6 6
+#define IRQ_SFC 7
+#define IRQ_SSI0 8
+#define IRQ_RESERVED9 9
+#define IRQ_PDMA 10
+#define IRQ_PDMAD 11
+#define IRQ_RESERVED12 12
+#define IRQ_RESERVED13 13
+#define IRQ_GPIO3 14
+#define IRQ_GPIO2 15
+#define IRQ_GPIO1 16
+#define IRQ_GPIO0 17
+#define IRQ_RESERVED18 18
+#define IRQ_RESERVED19 19
+#define IRQ_RESERVED20 20
+#define IRQ_OTG 21
+#define IRQ_RESERVED22 22
+#define IRQ_AES 23
+#define IRQ_RESERVED24 24
+#define IRQ_TCU2 25
+#define IRQ_TCU1 26
+#define IRQ_TCU0 27
+#define IRQ_RESERVED28 28
+#define IRQ_RESERVED29 29
+#define IRQ_CIM 30
+#define IRQ_LCD 31
+#define IRQ_RTC 32
+#define IRQ_RESERVED33 33
+#define IRQ_RESERVED34 34
+#define IRQ_RESERVED35 35
+#define IRQ_MSC1 36
+#define IRQ_MSC0 37
+#define IRQ_SCC 38
+#define IRQ_RESERVED39 39
+#define IRQ_PCM0 40
+#define IRQ_RESERVED41 41
+#define IRQ_RESERVED42 42
+#define IRQ_RESERVED43 43
+#define IRQ_HARB2 44
+#define IRQ_RESERVED45 45
+#define IRQ_HARB0 46
+#define IRQ_CPM 47
+#define IRQ_RESERVED48 48
+#define IRQ_UART2 49
+#define IRQ_UART1 50
+#define IRQ_UART0 51
+#define IRQ_DDR 52
+#define IRQ_RESERVED53 53
+#define IRQ_EFUSE 54
+#define IRQ_MAC 55
+#define IRQ_RESERVED56 56
+#define IRQ_RESERVED57 57
+#define IRQ_I2C2 58
+#define IRQ_I2C1 59
+#define IRQ_I2C0 60
+#define IRQ_PDMAM 61
+#define IRQ_JPEG 62
+#define IRQ_RESERVED63 63
+
+#define IRQ_INTC_MAX 63
+
+#ifndef __ASSEMBLY__
+
+#define __intc_unmask_irq(n) (REG_INTC_IMCR((n)/32) = (1 << ((n)%32)))
+#define __intc_mask_irq(n) (REG_INTC_IMSR((n)/32) = (1 << ((n)%32)))
+#define __intc_ack_irq(n) (REG_INTC_IPR((n)/32) = (1 << ((n)%32))) /* A dummy ack, as the Pending Register is Read Only. Should we remove __intc_ack_irq() */
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* _X1000_INTC_H_ */
diff --git a/libcpu/mips/x1000/x1000_otg_dwc.h b/libcpu/mips/x1000/x1000_otg_dwc.h
new file mode 100644
index 0000000000..bb77981daa
--- /dev/null
+++ b/libcpu/mips/x1000/x1000_otg_dwc.h
@@ -0,0 +1,306 @@
+/*
+ * File : x1000_otg_dwc.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017-02-03 Urey the first version
+ */
+
+#ifndef _X1000_OTG_DWC_H_
+#define _X1000_OTG_DWC_H_
+
+/* Globle Regs define */
+#define GOTG_CTL (OTG_BASE + 0x00)
+#define GOTG_INTR (OTG_BASE + 0x04)
+#define GAHB_CFG (OTG_BASE + 0x08)
+#define GUSB_CFG (OTG_BASE + 0x0c)
+#define GRST_CTL (OTG_BASE + 0x10)
+#define GINT_STS (OTG_BASE + 0x14)
+#define GINT_MASK (OTG_BASE + 0x18)
+#define GRXSTS_READ (OTG_BASE + 0x1c)
+#define GRXSTS_POP (OTG_BASE + 0x20)
+#define GRXFIFO_SIZE (OTG_BASE + 0x24)
+#define GNPTXFIFO_SIZE (OTG_BASE + 0x28)
+#define GDTXFIFO_SIZE (OTG_BASE + 0x104)
+#define GHW_CFG1 (OTG_BASE + 0x44)
+#define GHW_CFG2 (OTG_BASE + 0x48)
+#define GHW_CFG3 (OTG_BASE + 0x4c)
+#define GHW_CFG4 (OTG_BASE + 0x50)
+#define GDFIFO_CFG (OTG_BASE + 0x5c)
+#define PCGC_CTL (OTG_BASE + 0xe00)
+
+/* Fifo number 1 ~ 15 */
+#define GDEIP_TXF(n) (OTG_BASE + (0x104 + ((n-1) * 0x4)))
+
+#define REG_GOTG_CTL REG32(GOTG_CTL)
+#define REG_GOTG_INTR REG32(GOTG_INTR)
+#define REG_GAHB_CFG REG32(GAHB_CFG)
+#define REG_GUSB_CFG REG32(GUSB_CFG)
+#define REG_GRST_CTL REG32(GRST_CTL)
+#define REG_GINT_STS REG32(GINT_STS)
+#define REG_GINT_MASK REG32(GINT_MASK)
+#define REG_GRXSTS_READ REG32(GRXSTS_READ)
+#define REG_GRXSTS_POP REG32(GRXSTS_POP)
+#define REG_GRXFIFO_SIZE REG32(GRXFIFO_SIZE)
+#define REG_GNPTXFIFO_SIZE REG32(GNPTXFIFO_SIZE)
+#define REG_GDTXFIFO_SIZE REG32(GDTXFIFO_SIZE)
+#define REG_GHW_CFG1 REG32(GHW_CFG1)
+#define REG_GHW_CFG2 REG32(GHW_CFG2)
+#define REG_GHW_CFG3 REG32(GHW_CFG3)
+#define REG_GHW_CFG4 REG32(GHW_CFG4)
+#define REG_GDFIFO_CFG REG32(GDFIFO_CFG)
+#define REG_GDIEP_TXF(n) REG32(GDEIP_TXF(n))
+#define REG_PCGC_CTL REG32(PCGC_CTL)
+/* Device Regs define */
+#define EP_FIFO(n) (OTG_BASE + (n+1)*0x1000) // FiX ME
+#define REG_EP_FIFO(n) REG32(EP_FIFO(n))
+
+
+#define OTG_DCFG (OTG_BASE + 0x800)
+#define OTG_DCTL (OTG_BASE + 0x804)
+#define OTG_DSTS (OTG_BASE + 0x808)
+#define DIEP_MASK (OTG_BASE + 0x810)
+#define DOEP_MASK (OTG_BASE + 0x814)
+#define OTG_DAINT (OTG_BASE + 0x818)
+#define DAINT_MASK (OTG_BASE + 0x81c)
+
+#define DIEP_EMPMSK (OTG_BASE + 0x834)
+
+
+/* It's used in OTG_MULT_PROC_INTRPT = 1
+#define DEACH_INT (OTG_BASE + 0x838)
+#define DEACH_INTMASK (OTG_BASE + 0x83c)
+#define DIEP0_INTMASK (OTG_BASE + 0x840)
+#define DIEP1_INTMASK (OTG_BASE + 0x844)
+#define DOEP0_INTMASK (OTG_BASE + 0x880)
+#define DOEP1_INTMASK (OTG_BASE + 0x884)
+*/
+
+#define DIEP_CTL(n) (OTG_BASE + (0x900 + (n)*0x20))
+#define DOEP_CTL(n) (OTG_BASE + (0xb00 + (n)*0x20))
+
+#define DIEP_INT(n) (OTG_BASE + (0x908 + (n)*0x20))
+#define DOEP_INT(n) (OTG_BASE + (0xb08 + (n)*0x20))
+
+#define DIEP_SIZE(n) (OTG_BASE + (0x910 + (n)*0x20))
+#define DOEP_SIZE(n) (OTG_BASE + (0xb10 + (n)*0x20))
+
+#define DIEP_TXFSTS(n) (OTG_BASE + (0x918 + (n)*0x20))
+
+#define DIEP_DMA(n) (OTG_BASE + (0x914 + (n)*0x20))
+#define DOEP_DMA(n) (OTG_BASE + (0xb14 + (n)*0x20))
+
+#define REG_OTG_DCFG REG32(OTG_DCFG)
+#define REG_OTG_DCTL REG32(OTG_DCTL)
+#define REG_OTG_DSTS REG32(OTG_DSTS)
+#define REG_DIEP_MASK REG32(DIEP_MASK)
+#define REG_DOEP_MASK REG32(DOEP_MASK)
+#define REG_OTG_DAINT REG32(OTG_DAINT)
+#define REG_DAINT_MASK REG32(DAINT_MASK)
+#define REG_DIEP_EMPMSK REG32(DIEP_EMPMSK)
+
+#define REG_DIEP_CTL(n) REG32(DIEP_CTL(n))
+#define REG_DOEP_CTL(n) REG32(DOEP_CTL(n))
+
+#define REG_DIEP_INT(n) REG32(DIEP_INT(n))
+#define REG_DOEP_INT(n) REG32(DOEP_INT(n))
+
+#define REG_DIEP_SIZE(n) REG32(DIEP_SIZE(n))
+#define REG_DOEP_SIZE(n) REG32(DOEP_SIZE(n))
+
+#define REG_DIEP_TXFSTS(n) REG32(DIEP_TXFSTS(n))
+
+#define REG_DIEP_DMA(n) REG32(DIEP_DMA(n))
+#define REG_DOEP_DMA(n) REG32(DOEP_DMA(n))
+
+/* Regs macro define */
+/*************************************************/
+#define AHBCFG_TXFE_LVL BIT7
+#define AHBCFG_DMA_ENA BIT5
+#define AHBCFG_GLOBLE_INTRMASK BIT0
+#define USBCFG_FORCE_DEVICE BIT30
+#define USBCFG_TRDTIME_MASK (0xf << 10)
+#define USBCFG_TRDTIME_9 (9 << 10)
+#define USBCFG_TRDTIME_6 (6 << 10)
+
+/* GRSTCTL */
+#define RSTCTL_AHB_IDLE BIT31
+#define RSTCTL_TXFNUM_ALL (0x10 << 6)
+#define RSTCTL_TXFIFO_FLUSH BIT5
+#define RSTCTL_RXFIFO_FLUSH BIT4
+#define RSTCTL_INTK_FLUSH BIT3
+#define RSTCTL_FRMCNT_RST BIT2
+#define RSTCTL_CORE_RST BIT0
+
+/* GINTMSK */
+#define GINTMSK_RSUME_DETE BIT31
+#define GINTMSK_CONID_STSCHG BIT28
+#define GINTMSK_RESET_DETE BIT23
+#define GINTMSK_FETCH_SUSPEND BIT22
+#define GINTMSK_OEP_INTR BIT19
+#define GINTMSK_IEP_INTR BIT18
+#define GINTMSK_EP_MISMATCH BIT17
+#define GINTMSK_ENUM_DONE BIT13
+#define GINTMSK_USB_RESET BIT12
+#define GINTMSK_USB_SUSPEND BIT11
+#define GINTMSK_USB_EARLYSUSPEND BIT10
+#define GINTMSK_I2C_INT BIT9
+#define GINTMSK_ULPK_CKINT BIT8
+#define GINTMSK_GOUTNAK_EFF BIT7
+#define GINTMSK_GINNAK_EFF BIT6
+#define GINTMSK_NPTXFIFO_EMPTY BIT5
+#define GINTMSK_RXFIFO_NEMPTY BIT4
+#define GINTMSK_START_FRAM BIT3
+#define GINTMSK_OTG_INTR BIT2
+#define GINTMSK_MODE_MISMATCH BIT1
+
+/* GINTSTS */
+#define GINTSTS_RSUME_DETE BIT31
+#define GINTSTS_CONID_STSCHG BIT28
+#define GINTSTS_RESET_DETE BIT23
+#define GINTSTS_FETCH_SUSPEND BIT22
+#define GINTSTS_OEP_INTR BIT19
+#define GINTSTS_IEP_INTR BIT18
+#define GINTSTS_EP_MISMATCH BIT17
+#define GINTSTS_ENUM_DONE BIT13
+#define GINTSTS_USB_RESET BIT12
+#define GINTSTS_USB_SUSPEND BIT11
+#define GINTSTS_USB_EARLYSUSPEND BIT10
+#define GINTSTS_I2C_INT BIT9
+#define GINTSTS_ULPK_CKINT BIT8
+#define GINTSTS_GOUTNAK_EFF BIT7
+#define GINTSTS_GINNAK_EFF BIT6
+#define GINTSTS_NPTXFIFO_EMPTY BIT5
+#define GINTSTS_RXFIFO_NEMPTY BIT4
+#define GINTSTS_START_FRAM BIT3
+#define GINTSTS_OTG_INTR BIT2
+#define GINTSTS_MODE_MISMATCH BIT1
+
+/* DCTL */
+#define DCTL_CGOUTNAK BIT10
+#define DCTL_CLR_GNPINNAK BIT8
+#define DCTL_SGNPINNAK BIT7
+#define DCTL_SOFT_DISCONN BIT1
+#define DCTL_SGOUTNAK BIT9
+/* DCFG */
+#define DCFG_DEV_ADDR_MASK (0x7f << 4)
+#define DCFG_DEV_ADDR_BIT 4
+#define DCFG_DEV_DESC_DMA (1 << 23)
+/* DSTS */
+#define DSTS_ERRATIC_ERROR BIT3
+#define DSTS_ENUM_SPEED_MASK (0x3 << 1)
+#define DSTS_ENUM_SPEED_BIT BIT1
+#define DSTS_ENUM_SPEED_HIGH (0x0 << 1)
+#define DSTS_ENUM_SPEED_FULL_30OR60 (0x1 << 1)
+#define DSTS_ENUM_SPEED_LOW (0x2 << 1)
+#define DSTS_ENUM_SPEED_FULL_48 (0x3 << 1)
+
+/* GRXSTSR/GRXSTSP */
+#define GRXSTSP_PKSTS_MASK (0xf << 17)
+#define GRXSTSP_PKSTS_GOUT_NAK (0x1 << 17)
+#define GRXSTSP_PKSTS_GOUT_RECV (0x2 << 17)
+#define GRXSTSP_PKSTS_TX_COMP (0x3 << 17)
+#define GRXSTSP_PKSTS_SETUP_COMP (0x4 << 17)
+#define GRXSTSP_PKSTS_SETUP_RECV (0x6 << 17)
+#define GRXSTSP_BYTE_CNT_MASK (0x7ff << 4)
+#define GRXSTSP_BYTE_CNT_BIT 4
+#define GRXSTSP_EPNUM_MASK (0xf)
+#define GRXSTSP_EPNUM_BIT BIT0
+
+
+/* DIOEPCTL */
+// ep0
+#define DEP_EP0_MAXPKET_SIZE 64
+#define DEP_EP0_MPS_64 (0x0)
+#define DEP_EP0_MPS_32 (0x1)
+#define DEP_EP0_MPS_16 (0x2)
+#define DEP_EP0_MPS_8 (0x3)
+
+#define DEP_ENA_BIT BIT31
+#define DEP_DISENA_BIT BIT30
+#define DEP_SET_NAK BIT27
+#define DEP_CLEAR_NAK BIT26
+#define DEP_SET_STALL BIT21
+#define DEP_TYPE_MASK (0x3 << 18)
+#define DEP_TYPE_CNTL (0x0 << 18)
+#define DEP_TYPE_ISO (0x1 << 18)
+#define DEP_TYPE_BULK (0x2 << 18)
+#define DEP_TYPE_INTR (0x3 << 18)
+#define USB_ACTIVE_EP BIT15
+#define DEP_PKTSIZE_MASK 0x7ff
+#define DEP_FS_PKTSIZE 64
+#define DEP_HS_PKTSIZE 512
+
+/* DIOEPINT */
+#define DEP_NYET_INT BIT14
+#define DEP_NAK_INT BIT13
+#define DEP_BABBLE_ERR_INT BIT12
+#define DEP_PKT_DROP_STATUS BIT11
+#define DEP_BNA_INT BIT9
+#define DEP_TXFIFO_UNDRN BIT8 // Only for INEP
+#define DEP_OUTPKT_ERR BIT8 // Only for OUTEP
+#define DEP_TXFIFO_EMPTY BIT7
+#define DEP_INEP_NAKEFF BIT6 // Only for INEP
+#define DEP_B2B_SETUP_RECV BIT6 // Only for OUTEP0
+#define DEP_INTOKEN_EPMISATCH BIT5 // Only for INEP
+#define DEP_STATUS_PHASE_RECV BIT5 // Only for OUTEP0
+#define DEP_INTOKEN_RECV_TXFIFO_EMPTY BIT4 // Only for INEP
+#define DEP_OUTTOKEN_RECV_EPDIS BIT4 // Only for OUTEP
+#define DEP_TIME_OUT BIT3 // Only for INEP
+#define DEP_SETUP_PHASE_DONE BIT3 // Only for OUTEP0
+#define DEP_AHB_ERR BIT2
+#define DEP_EPDIS_INT BIT1
+#define DEP_XFER_COMP BIT0 // Used by INEP and OUTEP
+
+/* DOEPSIZ0 */
+#define DOEPSIZE0_SUPCNT_1 (0x1 << 29)
+#define DOEPSIZE0_SUPCNT_2 (0x2 << 29)
+#define DOEPSIZE0_SUPCNT_3 (0x3 << 29)
+#define DOEPSIZE0_PKTCNT_BIT BIT19
+
+
+#define DEP_RXFIFO_SIZE 1064
+#define DEP_NPTXFIFO_SIZE 1024
+#define DEP_DTXFIFO_SIZE 768
+
+
+#define DWC_GAHBCFG_INT_DMA_BURST_SINGLE 0
+#define DWC_GAHBCFG_INT_DMA_BURST_INCR 1
+#define DWC_GAHBCFG_INT_DMA_BURST_INCR4 3
+#define DWC_GAHBCFG_INT_DMA_BURST_INCR8 5
+#define DWC_GAHBCFG_INT_DMA_BURST_INCR16 7
+
+#define DWC_GAHBCFG_EXT_DMA_BURST_1word 0x0
+#define DWC_GAHBCFG_EXT_DMA_BURST_4word 0x1
+#define DWC_GAHBCFG_EXT_DMA_BURST_8word 0x2
+#define DWC_GAHBCFG_EXT_DMA_BURST_16word 0x3
+#define DWC_GAHBCFG_EXT_DMA_BURST_32word 0x4
+#define DWC_GAHBCFG_EXT_DMA_BURST_64word 0x5
+#define DWC_GAHBCFG_EXT_DMA_BURST_128word 0x6
+#define DWC_GAHBCFG_EXT_DMA_BURST_256word 0x7
+
+#define DEP_NUM 2
+
+#if 0
+#define UTMI_PHY_WIDTH 8
+#else
+#define UTMI_PHY_WIDTH 16
+#endif
+
+#endif /* _X1000_OTG_DWC_H_ */
diff --git a/libcpu/mips/x1000/x1000_slcdc.h b/libcpu/mips/x1000/x1000_slcdc.h
new file mode 100644
index 0000000000..fab76ffad9
--- /dev/null
+++ b/libcpu/mips/x1000/x1000_slcdc.h
@@ -0,0 +1,463 @@
+/*
+ * File : x1000_slcdc.h
+ * COPYRIGHT (C) 2008 - 2016, RT-Thread Development Team
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017��3��20�� Urey the first version
+ */
+#ifndef _X1000_SLCDC_H_
+#define _X1000_SLCDC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*************************************************************************
+ * SLCD (Smart LCD Controller)
+ *************************************************************************/
+#define LCDC0_BASE LCD_BASE
+
+#define SLCDC_CFG (LCDC0_BASE + 0xA0) /* SLCDC Configure Register */
+#define SLCDC_CTRL (LCDC0_BASE + 0xA4) /* SLCDC Control Register */
+#define SLCDC_STATE (LCDC0_BASE + 0xA8) /* SLCDC Status Register */
+#define SLCDC_DATA (LCDC0_BASE + 0xAC) /* SLCDC Data Register */
+
+#define SLCDC_CFG_NEW (LCDC0_BASE + 0xB8)
+#define SLCDC_WTIME (LCDC0_BASE + 0xB0)
+#define SLCDC_TAS (LCDC0_BASE + 0xB4)
+#define SLCDC_SLOW_TIME (LCDC0_BASE + 0xBC)
+
+/* SLCDC Configure Register */
+#define SLCDC_CFG_DWIDTH_BIT 10
+#define SLCDC_CFG_DWIDTH_MASK (0x7 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_18BIT (0 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_16BIT (1 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_8BIT_x3 (2 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_8BIT_x2 (3 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_8BIT_x1 (4 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_24BIT (5 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_DWIDTH_9BIT_x2 (7 << SLCDC_CFG_DWIDTH_BIT)
+#define SLCDC_CFG_CWIDTH_BIT (8)
+#define SLCDC_CFG_CWIDTH_MASK (0x3 << SLCDC_CFG_CWIDTH_BIT)
+#define SLCDC_CFG_CWIDTH_16BIT (0 << SLCDC_CFG_CWIDTH_BIT)
+#define SLCDC_CFG_CWIDTH_8BIT (1 << SLCDC_CFG_CWIDTH_BIT)
+#define SLCDC_CFG_CWIDTH_18BIT (2 << SLCDC_CFG_CWIDTH_BIT)
+#define SLCDC_CFG_CWIDTH_24BIT (3 << SLCDC_CFG_CWIDTH_BIT)
+#define SLCDC_CFG_CS_ACTIVE_LOW (0 << 4)
+#define SLCDC_CFG_CS_ACTIVE_HIGH (1 << 4)
+#define SLCDC_CFG_RS_CMD_LOW (0 << 3)
+#define SLCDC_CFG_RS_CMD_HIGH (1 << 3)
+#define SLCDC_CFG_CLK_ACTIVE_FALLING (0 << 1)
+#define SLCDC_CFG_CLK_ACTIVE_RISING (1 << 1)
+#define SLCDC_CFG_TYPE_PARALLEL (0 << 0)
+#define SLCDC_CFG_TYPE_SERIAL (1 << 0)
+
+/* SLCD New Configure Register */
+#define SLCDC_NEW_CFG_DWIDTH_BIT 13
+#define SLCDC_NEW_CFG_DWIDTH_MASK (0x7 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_DWIDTH_8BIT (0 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_DWIDTH_9BIT (1 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_DWIDTH_16BIT (2 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_DWIDTH_18BIT (3 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_DWIDTH_24BIT (4 << SLCDC_NEW_CFG_DWIDTH_BIT)
+#define SLCDC_NEW_CFG_6800_MD (1 << 11)
+#define SLCDC_NEW_CFG_CMD_9BIT (1 << 10) /* only use in old slcd */
+#define SLCDC_NEW_CFG_CMD_16BIT (0 << 10) /* only use in old slcd */
+#define SLCDC_NEW_CFG_DTIME_BIT 8
+#define SLCDC_NEW_CFG_DTIME_MASK (0x3 << SLCDC_NEW_CFG_DTIME_BIT)
+#define SLCDC_NEW_CFG_DTIME_ONCE (0 << SLCDC_NEW_CFG_DTIME_BIT)
+#define SLCDC_NEW_CFG_DTIME_TWICE (1 << SLCDC_NEW_CFG_DTIME_BIT)
+#define SLCDC_NEW_CFG_DTIME_THREE (2 << SLCDC_NEW_CFG_DTIME_BIT)
+#define SLCDC_NEW_CFG_CS_HIGH_IDLE (0 << 5)
+#define SLCDC_NEW_CFG_CS_LOW_IDLE (1 << 5)
+#define SLCDC_NEW_CFG_RS_CMD_LOW (0 << 4)
+#define SLCDC_NEW_CFG_RS_CMD_HIGH (1 << 4)
+#define SLCDC_NEW_CFG_CLK_ACTIVE_FALLING (0 << 3)
+#define SLCDC_NEW_CFG_CLK_ACTIVE_RISING (1 << 3)
+#define SLCDC_NEW_CFG_DTYPE_PARALLEL (0 << 2)
+#define SLCDC_NEW_CFG_DTYPE_SERIAL (1 << 2)
+#define SLCDC_NEW_CFG_CTYPE_PARALLEL (0 << 1)
+#define SLCDC_NEW_CFG_CTYPE_SERIAL (1 << 1)
+#define SLCDC_NEW_CFG_FMT_CONV_EN (1 << 0)
+
+/* SLCD Control Register */
+#define SLCDC_CTRL_TE_INV (1 << 9)
+#define SLCDC_CTRL_NOT_USE_TE (1 << 8)
+#define SLCDC_CTRL_DCSI_SEL (1 << 7)
+#define SLCDC_CTRL_MIPI_MODE (1 << 6)
+#define SLCDC_CTRL_NEW_MODE (1 << 5)
+#define SLCDC_CTRL_FAST_MODE (1 << 4)
+#define SLCDC_CTRL_GATE_MASK (1 << 3)
+#define SLCDC_CTRL_DMA_MODE (1 << 2)
+#define SLCDC_CTRL_DMA_START (1 << 1)
+#define SLCDC_CTRL_DMA_EN (1 << 0)
+
+/* SLCD Status Register */
+#define SLCDC_STATE_BUSY (1 << 0)
+
+/* SLCD Data Register */
+#define SLCDC_DATA_RS_DATA (0 << 30)
+#define SLCDC_DATA_RS_COMMAND (1 << 30)
+
+/*************************************************************************
+ * LCDC (LCD Controller)
+ *************************************************************************/
+
+#define LCDC_CFG (LCDC0_BASE + 0x00)
+#define LCDC_CTRL (LCDC0_BASE + 0x30)
+#define LCDC_STATE (LCDC0_BASE + 0x34)
+#define LCDC_OSDC (LCDC0_BASE + 0x100)
+#define LCDC_OSDCTRL (LCDC0_BASE + 0x104)
+#define LCDC_OSDS (LCDC0_BASE + 0x108)
+#define LCDC_BGC0 (LCDC0_BASE + 0x10C)
+#define LCDC_BGC1 (LCDC0_BASE + 0x2C4)
+#define LCDC_KEY0 (LCDC0_BASE + 0x110)
+#define LCDC_KEY1 (LCDC0_BASE + 0x114)
+#define LCDC_ALPHA (LCDC0_BASE + 0x118)
+#define LCDC_RGBC (LCDC0_BASE + 0x90)
+#define LCDC_VAT (LCDC0_BASE + 0x0c)
+#define LCDC_DAH (LCDC0_BASE + 0x10)
+#define LCDC_DAV (LCDC0_BASE + 0x14)
+#define LCDC_XYP0 (LCDC0_BASE + 0x120)
+#define LCDC_XYP1 (LCDC0_BASE + 0x124)
+#define LCDC_SIZE0 (LCDC0_BASE + 0x128)
+#define LCDC_SIZE1 (LCDC0_BASE + 0x12C)
+#define LCDC_VSYNC (LCDC0_BASE + 0x04)
+#define LCDC_HSYNC (LCDC0_BASE + 0x08)
+#define LCDC_PS (LCDC0_BASE + 0x18)
+#define LCDC_CLS (LCDC0_BASE + 0x1c)
+#define LCDC_SPL (LCDC0_BASE + 0x20)
+#define LCDC_REV (LCDC0_BASE + 0x24)
+#define LCDC_IID (LCDC0_BASE + 0x38)
+#define LCDC_DA0 (LCDC0_BASE + 0x40)
+#define LCDC_SA0 (LCDC0_BASE + 0x44)
+#define LCDC_FID0 (LCDC0_BASE + 0x48)
+#define LCDC_CMD0 (LCDC0_BASE + 0x4c)
+#define LCDC_DA1 (LCDC0_BASE + 0x50)
+#define LCDC_SA1 (LCDC0_BASE + 0x54)
+#define LCDC_FID1 (LCDC0_BASE + 0x58)
+#define LCDC_CMD1 (LCDC0_BASE + 0x5c)
+#define LCDC_OFFS0 (LCDC0_BASE + 0x60)
+#define LCDC_PW0 (LCDC0_BASE + 0x64)
+#define LCDC_CNUM0 (LCDC0_BASE + 0x68)
+#define LCDC_DESSIZE0 (LCDC0_BASE + 0x6C)
+#define LCDC_OFFS1 (LCDC0_BASE + 0x70)
+#define LCDC_PW1 (LCDC0_BASE + 0x74)
+#define LCDC_CNUM1 (LCDC0_BASE + 0x78)
+#define LCDC_DESSIZE1 (LCDC0_BASE + 0x7C)
+#define LCDC_PCFG (LCDC0_BASE + 0x2C0)
+#define LCDC_CPOS1 (0x78)
+#define LCDC_DUAL_CTRL (0x2c8)
+#define LCDC_ENH_CFG (0x400)
+#define LCDC_ENH_CSCCFG (0x404)
+#define LCDC_ENH_LUMACFG (0x408)
+#define LCDC_ENH_CHROCFG0 (0x40c)
+#define LCDC_ENH_CHROCFG1 (0x410)
+#define LCDC_ENH_DITHERCFG (0x414)
+#define LCDC_ENH_STATUS (0x418)
+#define LCDC_ENH_GAMMA (0x800)
+#define LCDC_ENH_VEE (0x1000)
+
+/* LCD Configure Register */
+#define LCDC_CFG_LCDPIN_BIT 31
+#define LCDC_CFG_LCDPIN_MASK (0x1 << LCDC_CFG_LCDPIN_BIT)
+#define LCDC_CFG_LCDPIN_LCD (0x0 << LCDC_CFG_LCDPIN_BIT)
+#define LCDC_CFG_LCDPIN_SLCD (0x1 << LCDC_CFG_LCDPIN_BIT)
+#define LCDC_CFG_TVEPEH (1 << 30)
+#define LCDC_CFG_NEWDES (1 << 28)
+#define LCDC_CFG_PALBP (1 << 27)
+#define LCDC_CFG_TVEN (1 << 26)
+#define LCDC_CFG_RECOVER (1 << 25)
+#define LCDC_CFG_PSM (1 << 23)
+#define LCDC_CFG_CLSM (1 << 22)
+#define LCDC_CFG_SPLM (1 << 21)
+#define LCDC_CFG_REVM (1 << 20)
+#define LCDC_CFG_HSYNM (1 << 19)
+#define LCDC_CFG_PCLKM (1 << 18)
+#define LCDC_CFG_INVDAT (1 << 17)
+#define LCDC_CFG_SYNDIR_IN (1 << 16)
+#define LCDC_CFG_PSP (1 << 15)
+#define LCDC_CFG_CLSP (1 << 14)
+#define LCDC_CFG_SPLP (1 << 13)
+#define LCDC_CFG_REVP (1 << 12)
+#define LCDC_CFG_HSP (1 << 11)
+#define LCDC_CFG_PCP (1 << 10)
+#define LCDC_CFG_DEP (1 << 9)
+#define LCDC_CFG_VSP (1 << 8)
+#define LCDC_CFG_MODE_TFT_18BIT (1 << 7)
+#define LCDC_CFG_MODE_TFT_16BIT (0 << 7)
+#define LCDC_CFG_MODE_TFT_24BIT (1 << 6)
+#define LCDC_CFG_MODE_BIT 0
+#define LCDC_CFG_MODE_MASK (0x0f << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_GENERIC_TFT (0 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_SPECIAL_TFT_1 (1 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_SPECIAL_TFT_2 (2 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_SPECIAL_TFT_3 (3 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_NONINTER_CCIR656 (4 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_INTER_CCIR656 (6 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_SERIAL_TFT (12 << LCDC_CFG_MODE_BIT)
+#define LCDC_CFG_MODE_LCM (13 << LCDC_CFG_MODE_BIT)
+/* LCD Control Register */
+#define LCDC_CTRL_PINMD (1 << 31)
+#define LCDC_CTRL_BST_BIT 28
+#define LCDC_CTRL_BST_MASK (0x7 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_BST_4 (0 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_BST_8 (1 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_BST_16 (2 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_BST_32 (3 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_BST_64 (4 << LCDC_CTRL_BST_BIT)
+#define LCDC_CTRL_RGB565 (0 << 27)
+#define LCDC_CTRL_RGB555 (1 << 27)
+#define LCDC_CTRL_OFUP (1 << 26)
+#define LCDC_CTRL_PDD_BIT 16
+#define LCDC_CTRL_PDD_MASK (0xff << LCDC_CTRL_PDD_BIT)
+#define LCDC_CTRL_DACTE (1 << 14)
+#define LCDC_CTRL_EOFM (1 << 13)
+#define LCDC_CTRL_SOFM (1 << 12)
+#define LCDC_CTRL_OFUM (1 << 11)
+#define LCDC_CTRL_IFUM0 (1 << 10)
+#define LCDC_CTRL_IFUM1 (1 << 9)
+#define LCDC_CTRL_LDDM (1 << 8)
+#define LCDC_CTRL_QDM (1 << 7)
+#define LCDC_CTRL_BEDN (1 << 6)
+#define LCDC_CTRL_PEDN (1 << 5)
+#define LCDC_CTRL_DIS (1 << 4)
+#define LCDC_CTRL_ENA (1 << 3)
+#define LCDC_CTRL_BPP_BIT 0
+#define LCDC_CTRL_BPP_MASK (0x07 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_1 (0 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_2 (1 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_4 (2 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_8 (3 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_16 (4 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_18_24 (5 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_CMPS_24 (6 << LCDC_CTRL_BPP_BIT)
+#define LCDC_CTRL_BPP_30 (7 << LCDC_CTRL_BPP_BIT)
+/* LCD Status Register */
+#define LCDC_STATE_QD (1 << 7)
+#define LCDC_STATE_EOF (1 << 5)
+#define LCDC_STATE_SOF (1 << 4)
+#define LCDC_STATE_OFU (1 << 3)
+#define LCDC_STATE_IFU0 (1 << 2)
+#define LCDC_STATE_IFU1 (1 << 1)
+#define LCDC_STATE_LDD (1 << 0)
+/* OSD Configure Register */
+#define LCDC_OSDC_PREMULTI1 (1 << 23)
+#define LCDC_OSDC_COEF_SLE1_BIT 21
+#define LCDC_OSDC_COEF_SLE1_MASK (0x03 << LCDC_OSDC_COEF_SLE1_BIT)
+#define LCDC_OSDC_COEF_SLE1_0 (0 << LCDC_OSDC_COEF_SLE1_BIT)
+#define LCDC_OSDC_COEF_SLE1_1 (1 << LCDC_OSDC_COEF_SLE1_BIT)
+#define LCDC_OSDC_COEF_SLE1_2 (2 << LCDC_OSDC_COEF_SLE1_BIT)
+#define LCDC_OSDC_COEF_SLE1_3 (3 << LCDC_OSDC_COEF_SLE1_BIT)
+#define LCDC_OSDC_PREMULTI0 (1 << 20)
+#define LCDC_OSDC_COEF_SLE0_BIT 18
+#define LCDC_OSDC_COEF_SLE0_MASK (0x03 << LCDC_OSDC_COEF_SLE0_BIT)
+#define LCDC_OSDC_COEF_SLE0_0 (0 << LCDC_OSDC_COEF_SLE0_BIT)
+#define LCDC_OSDC_COEF_SLE0_1 (1 << LCDC_OSDC_COEF_SLE0_BIT)
+#define LCDC_OSDC_COEF_SLE0_2 (2 << LCDC_OSDC_COEF_SLE0_BIT)
+#define LCDC_OSDC_COEF_SLE0_3 (3 << LCDC_OSDC_COEF_SLE0_BIT)
+#define LCDC_OSDC_ALPHAMD1 (1 << 17)
+#define LCDC_OSDC_SOFM1 (1 << 15)
+#define LCDC_OSDC_EOFM1 (1 << 14)
+#define LCDC_OSDC_SOFM0 (1 << 11)
+#define LCDC_OSDC_EOFM0 (1 << 10)
+#define LCDC_OSDC_DENDM (1 << 9)
+#define LCDC_OSDC_F1EN (1 << 4)
+#define LCDC_OSDC_F0EN (1 << 3)
+#define LCDC_OSDC_ALPHAEN (1 << 2)
+#define LCDC_OSDC_ALPHAMD0 (1 << 1)
+#define LCDC_OSDC_OSDEN (1 << 0)
+/* OSD Controll Register */
+#define LCDC_OSDCTRL_IPU_CLKEN (1 << 15)
+#define LCDC_OSDCTRL_RGB0_RGB565 (0 << 5)
+#define LCDC_OSDCTRL_RGB0_RGB555 (1 << 5)
+#define LCDC_OSDCTRL_RGB1_RGB565 (0 << 4)
+#define LCDC_OSDCTRL_RGB1_RGB555 (1 << 4)
+#define LCDC_OSDCTRL_BPP_BIT 0
+#define LCDC_OSDCTRL_BPP_MASK (0x7<<LCDC_OSDCTRL_BPP_BIT)
+#define LCDC_OSDCTRL_BPP_15_16 (4 << LCDC_OSDCTRL_BPP_BIT)
+#define LCDC_OSDCTRL_BPP_18_24 (5 << LCDC_OSDCTRL_BPP_BIT)
+#define LCDC_OSDCTRL_BPP_CMPS_24 (6 << LCDC_OSDCTRL_BPP_BIT)
+#define LCDC_OSDCTRL_BPP_30 (7 << LCDC_OSDCTRL_BPP_BIT)
+/* OSD State Register */
+#define LCDC_OSDS_SOF1 (1 << 15)
+#define LCDC_OSDS_EOF1 (1 << 14)
+#define LCDC_OSDS_SOF0 (1 << 11)
+#define LCDC_OSDS_EOF0 (1 << 10)
+#define LCDC_OSDS_DEND (1 << 8)
+/* Background 0 or Background 1 Color Register */
+#define LCDC_BGC_RED_OFFSET 16
+#define LCDC_BGC_RED_MASK (0xFF << LCDC_BGC_RED_OFFSET)
+#define LCDC_BGC_GREEN_OFFSET 8
+#define LCDC_BGC_GREEN_MASK (0xFF << LCDC_BGC_GREEN_OFFSET)
+#define LCDC_BGC_BLUE_OFFSET 0
+#define LCDC_BGC_BLUE_MASK (0xFF << LCDC_BGC_BLUE_OFFSET)
+/* Foreground 0 or Foreground 1 Color Key Register */
+#define LCDC_KEY_KEYEN (1 << 31)
+#define LCDC_KEY_KEYMD (1 << 30)
+#define LCDC_KEY_RED_OFFSET 16
+#define LCDC_KEY_RED_MASK (0xFF << LCDC_KEY_RED_OFFSET)
+#define LCDC_KEY_GREEN_OFFSET 8
+#define LCDC_KEY_GREEN_MASK (0xFF << LCDC_KEY_GREEN_OFFSET)
+#define LCDC_KEY_BLUE_OFFSET 0
+#define LCDC_KEY_BLUE_MASK (0xFF << LCDC_KEY_BLUE_OFFSET)
+#define LCDC_KEY_MASK (LCDC_KEY_RED_MASK | LCDC_KEY_GREEN_MASK\
+/* ALPHA Register */
+#define LCDC_ALPHA1_OFFSET 8
+#define LCDC_ALPHA1_MASK (0xFF << LCDC_ALPHA1_OFFSET)
+#define LCDC_ALPHA0_OFFSET 0
+#define LCDC_ALPHA0_MASK (0xFF << LCDC_ALPHA0_OFFSET)
+/* IPU Restart Register */
+#define LCDC_IPUR_IPUREN (1 << 31)
+#define LCDC_IPUR_IPURMASK (0xFFFFFF)
+/* RGB Control Register */
+#define LCDC_RGBC_RGBDM (1 << 15)
+#define LCDC_RGBC_DMM (1 << 14)
+#define LCDC_RGBC_RGBFMT (1 << 7)
+#define LCDC_RGBC_ODDRGB_BIT 4
+#define LCDC_RGBC_ODDRGB_MASK (0x7 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_RGB (0 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_RBG (1 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_GRB (2 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_GBR (3 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_BRG (4 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_ODD_BGR (5 << LCDC_RGBC_ODDRGB_BIT)
+#define LCDC_RGBC_EVENRGB_BIT 0
+#define LCDC_RGBC_EVENRGB_MASK (0x7<<LCDC_RGBC_EVENRGB_BIT)
+#define LCDC_RGBC_EVEN_RGB 0
+#define LCDC_RGBC_EVEN_RBG 1
+#define LCDC_RGBC_EVEN_GRB 2
+#define LCDC_RGBC_EVEN_GBR 3
+#define LCDC_RGBC_EVEN_BRG 4
+#define LCDC_RGBC_EVEN_BGR 5
+/* Vertical Synchronize Register */
+#define LCDC_VSYNC_VPS_BIT 16
+#define LCDC_VSYNC_VPS_MASK (0xfff << LCDC_VSYNC_VPS_BIT)
+#define LCDC_VSYNC_VPE_BIT 0
+#define LCDC_VSYNC_VPE_MASK (0xfff << LCDC_VSYNC_VPE_BIT)
+/* Horizontal Synchronize Register */
+#define LCDC_HSYNC_HPS_BIT 16
+#define LCDC_HSYNC_HPS_MASK (0xfff << LCDC_HSYNC_HPS_BIT)
+#define LCDC_HSYNC_HPE_BIT 0
+#define LCDC_HSYNC_HPE_MASK (0xfff << LCDC_HSYNC_HPE_BIT)
+/* Virtual Area Setting Register */
+#define LCDC_VAT_HT_BIT 16
+#define LCDC_VAT_HT_MASK (0xfff << LCDC_VAT_HT_BIT)
+#define LCDC_VAT_VT_BIT 0
+#define LCDC_VAT_VT_MASK (0xfff << LCDC_VAT_VT_BIT)
+/* Display Area Horizontal Start/End Point Register */
+#define LCDC_DAH_HDS_BIT 16
+#define LCDC_DAH_HDS_MASK (0xfff << LCDC_DAH_HDS_BIT)
+#define LCDC_DAH_HDE_BIT 0
+#define LCDC_DAH_HDE_MASK (0xfff << LCDC_DAH_HDE_BIT)
+/* Display Area Vertical Start/End Point Register */
+#define LCDC_DAV_VDS_BIT 16
+#define LCDC_DAV_VDS_MASK (0xfff << LCDC_DAV_VDS_BIT)
+#define LCDC_DAV_VDE_BIT 0
+#define LCDC_DAV_VDE_MASK (0xfff << LCDC_DAV_VDE_BIT)
+/* Foreground 0 or Foreground 1 XY Position Register */
+#define LCDC_XYP_YPOS_BIT 16
+#define LCDC_XYP_YPOS_MASK (0xfff << LCDC_XYP_YPOS_BIT)
+#define LCDC_XYP_XPOS_BIT 0
+#define LCDC_XYP_XPOS_MASK (0xfff << LCDC_XYP_XPOS_BIT)
+/* Foreground 0 or Foreground 1 Size Register */
+#define LCDC_SIZE_HEIGHT_BIT 16
+#define LCDC_SIZE_HEIGHT_MASK (0xfff << LCDC_SIZE_HEIGHT_BIT)
+#define LCDC_SIZE_WIDTH_BIT 0
+#define LCDC_SIZE_WIDTH_MASK (0xfff << LCDC_SIZE_WIDTH_BIT)
+/* PS Signal Setting */
+#define LCDC_PS_PSS_BIT 16
+#define LCDC_PS_PSS_MASK (0xfff << LCDC_PS_PSS_BIT)
+#define LCDC_PS_PSE_BIT 0
+#define LCDC_PS_PSE_MASK (0xfff << LCDC_PS_PSE_BIT)
+/* CLS Signal Setting */
+#define LCDC_CLS_CLSS_BIT 16
+#define LCDC_CLS_CLSS_MASK (0xfff << LCDC_CLS_CLSS_BIT)
+#define LCDC_CLS_CLSE_BIT 0
+#define LCDC_CLS_CLSE_MASK (0xfff << LCDC_CLS_CLSE_BIT)
+/* SPL Signal Setting */
+#define LCDC_SPL_SPLS_BIT 16
+#define LCDC_SPL_SPLS_MASK (0xfff << LCDC_SPL_SPLS_BIT)
+#define LCDC_SPL_SPLE_BIT 0
+#define LCDC_SPL_SPLE_MASK (0xfff << LCDC_SPL_SPLE_BIT)
+/* REV Signal Setting */
+#define LCDC_REV_REVS_BIT 16
+#define LCDC_REV_REVS_MASK (0xfff << LCDC_REV_REVS_BIT)
+/* DMA Command 0 or 1 Register */
+#define LCDC_CMD_SOFINT (1 << 31)
+#define LCDC_CMD_EOFINT (1 << 30)
+#define LCDC_CMD_CMD (1 << 29)
+#define LCDC_CMD_PAL (1 << 28)
+#define LCDC_CMD_COMPEN (1 << 27)
+#define LCDC_CMD_FRM_EN (1 << 26)
+#define LCDC_CMD_FIELD_SEL (1 << 25)
+#define LCDC_CMD_16X16BLOCK (1 << 24)
+#define LCDC_CMD_LEN_BIT 0
+#define LCDC_CMD_LEN_MASK (0xffffff << LCDC_CMD_LEN_BIT)
+/* DMA Offsize Register 0,1 */
+#define LCDC_OFFS_BIT 0
+#define LCDC_OFFS_OFFSIZE_MASK (0xffffff << LCDC_OFFS_BIT)
+/* DMA Page Width Register 0,1 */
+#define LCDC_PW_BIT 0
+#define LCDC_PW_PAGEWIDTH_MASK (0xffffff << LCDC_PW_BIT)
+/* DMA Command Counter Register 0,1 */
+#define LCDC_CNUM_BIT 0
+#define LCDC_CNUM_CNUM_MASK (0xff << LCDC_CNUM_BIT)
+#define LCDC_CPOS_ALPHAMD1 (1 << 31)
+#define LCDC_CPOS_RGB_RGB565 (0 << 30)
+#define LCDC_CPOS_RGB_RGB555 (1 << 30)
+#define LCDC_CPOS_BPP_BIT 27
+#define LCDC_CPOS_BPP_MASK (0x07 << LCDC_CPOS_BPP_BIT)
+#define LCDC_CPOS_BPP_16 (4 << LCDC_CPOS_BPP_BIT)
+#define LCDC_CPOS_BPP_18_24 (5 << LCDC_CPOS_BPP_BIT)
+#define LCDC_CPOS_BPP_CMPS_24 (6 << LCDC_CPOS_BPP_BIT)
+#define LCDC_CPOS_BPP_30 (7 << LCDC_CPOS_BPP_BIT)
+#define LCDC_CPOS_PREMULTI (1 << 26)
+#define LCDC_CPOS_COEF_SLE_BIT 24
+#define LCDC_CPOS_COEF_SLE_MASK (0x3 << LCDC_CPOS_COEF_SLE_BIT)
+#define LCDC_CPOS_COEF_SLE_0 (0 << LCDC_CPOS_COEF_SLE_BIT)
+#define LCDC_CPOS_COEF_SLE_1 (1 << LCDC_CPOS_COEF_SLE_BIT)
+#define LCDC_CPOS_COEF_SLE_2 (2 << LCDC_CPOS_COEF_SLE_BIT)
+#define LCDC_CPOS_COEF_SLE_3 (3 << LCDC_CPOS_COEF_SLE_BIT)
+#define LCDC_CPOS_YPOS_BIT 12
+#define LCDC_CPOS_YPOS_MASK (0xfff << LCDC_CPOS_YPOS_BIT)
+#define LCDC_CPOS_XPOS_BIT 0
+#define LCDC_CPOS_XPOS_MASK (0xfff << LCDC_CPOS_XPOS_BIT)
+/* Foreground 0,1 Size Register */
+#define LCDC_DESSIZE_ALPHA_BIT 24
+#define LCDC_DESSIZE_ALPHA_MASK (0xff << LCDC_DESSIZE_ALPHA_BIT)
+#define LCDC_DESSIZE_HEIGHT_BIT 12
+#define LCDC_DESSIZE_HEIGHT_MASK (0xfff << LCDC_DESSIZE_HEIGHT_BIT)
+#define LCDC_DESSIZE_WIDTH_BIT 0
+#define LCDC_DESSIZE_WIDTH_MASK (0xfff << LCDC_DESSIZE_WIDTH_BIT)
+/* Priority level threshold configure Register */
+#define LCDC_PCFG_LCDC_PRI_MD (1 << 31)
+#define LCDC_PCFG_HP_BST_BIT 28
+#define LCDC_PCFG_HP_BST_MASK (0x7 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_4 (0 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_8 (1 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_16 (2 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_32 (3 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_C16 (5 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_64 (4 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_HP_BST_DIS (7 << LCDC_PCFG_HP_BST_BIT)
+#define LCDC_PCFG_PCFG2_BIT 18
+#define LCDC_PCFG_PCFG2_MASK (0x1ff << LCDC_PCFG_PCFG2_BIT)
+#define LCDC_PCFG_PCFG1_BIT 9
+#define LCDC_PCFG_PCFG1_MASK (0x1ff << LCDC_PCFG_PCFG1_BIT)
+#define LCDC_PCFG_PCFG0_BIT 0
+#define LCDC_PCFG_PCFG0_MASK (0x1ff << LCDC_PCFG_PCFG0_BIT)
+/* Dual LCDC Channel Control register */
+#define LCDC_DUAL_CTRL_IPU_WR_SEL (1 << 8)
+#define LCDC_DUAL_CTRL_TFT_SEL (1 << 6)
+#define LCDC_DUAL_CTRL_PRI_IPU_EN (1 << 5)
+#define LCDC_DUAL_CTRL_PRI_IPU_BIT 3
+#define LCDC_DUAL_CTRL_PRI_IPU_MASK (0x3 << LCDC_DUAL_CTRL_PRI_IPU_BIT)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _X1000_SLCDC_H_ */