On Thu, Sep 15, 2011 at 5:53 PM, <keguang.zhang@xxxxxxxxx> wrote: > From: Zhang, Keguang <keguang.zhang@xxxxxxxxx> > > This patch adds basic support for Loongson1B > including serial, timer and interrupt handler. > > Loongson 1B is a 32-bit SoC designed by Institute of > Computing Technology (ICT), Chinese Academy of Sciences (CAS), > which implements the MIPS32 release 2 instruction set. > > Signed-off-by: Zhang, Keguang <keguang.zhang@xxxxxxxxx> > --- > arch/mips/Kbuild.platforms | 1 + > arch/mips/Kconfig | 31 + > arch/mips/configs/ls1b_defconfig | 830 ++++++++++++++++++++++ > arch/mips/include/asm/cpu.h | 3 +- > arch/mips/include/asm/mach-loongson1/irq.h | 70 ++ > arch/mips/include/asm/mach-loongson1/loongson1.h | 48 ++ > arch/mips/include/asm/mach-loongson1/platform.h | 20 + > arch/mips/include/asm/mach-loongson1/prom.h | 24 + > arch/mips/include/asm/mach-loongson1/regs-clk.h | 32 + > arch/mips/include/asm/mach-loongson1/regs-intc.h | 24 + > arch/mips/include/asm/mach-loongson1/regs-wdt.h | 21 + > arch/mips/include/asm/mach-loongson1/war.h | 25 + > arch/mips/include/asm/module.h | 2 + > arch/mips/kernel/cpu-probe.c | 15 + > arch/mips/kernel/perf_event_mipsxx.c | 6 + > arch/mips/kernel/traps.c | 1 + > arch/mips/loongson1/Kconfig | 29 + > arch/mips/loongson1/Makefile | 11 + > arch/mips/loongson1/Platform | 7 + > arch/mips/loongson1/common/Makefile | 5 + > arch/mips/loongson1/common/clock.c | 165 +++++ > arch/mips/loongson1/common/irq.c | 135 ++++ > arch/mips/loongson1/common/platform.c | 50 ++ > arch/mips/loongson1/common/prom.c | 89 +++ > arch/mips/loongson1/common/reset.c | 46 ++ > arch/mips/loongson1/common/setup.c | 29 + > arch/mips/loongson1/ls1b/Makefile | 5 + > arch/mips/loongson1/ls1b/board.c | 30 + > arch/mips/oprofile/common.c | 1 + > arch/mips/oprofile/op_model_mipsxx.c | 4 + > 30 files changed, 1758 insertions(+), 1 deletions(-) > create mode 100644 arch/mips/configs/ls1b_defconfig > create mode 100644 arch/mips/include/asm/mach-loongson1/irq.h > create mode 100644 arch/mips/include/asm/mach-loongson1/loongson1.h > create mode 100644 arch/mips/include/asm/mach-loongson1/platform.h > create mode 100644 arch/mips/include/asm/mach-loongson1/prom.h > create mode 100644 arch/mips/include/asm/mach-loongson1/regs-clk.h > create mode 100644 arch/mips/include/asm/mach-loongson1/regs-intc.h > create mode 100644 arch/mips/include/asm/mach-loongson1/regs-wdt.h > create mode 100644 arch/mips/include/asm/mach-loongson1/war.h > create mode 100644 arch/mips/loongson1/Kconfig > create mode 100644 arch/mips/loongson1/Makefile > create mode 100644 arch/mips/loongson1/Platform > create mode 100644 arch/mips/loongson1/common/Makefile > create mode 100644 arch/mips/loongson1/common/clock.c > create mode 100644 arch/mips/loongson1/common/irq.c > create mode 100644 arch/mips/loongson1/common/platform.c > create mode 100644 arch/mips/loongson1/common/prom.c > create mode 100644 arch/mips/loongson1/common/reset.c > create mode 100644 arch/mips/loongson1/common/setup.c > create mode 100644 arch/mips/loongson1/ls1b/Makefile > create mode 100644 arch/mips/loongson1/ls1b/board.c > > diff --git a/arch/mips/Kbuild.platforms b/arch/mips/Kbuild.platforms > index 5ce8029..d64786d 100644 > --- a/arch/mips/Kbuild.platforms > +++ b/arch/mips/Kbuild.platforms > @@ -14,6 +14,7 @@ platforms += jz4740 > platforms += lantiq > platforms += lasat > platforms += loongson > +platforms += loongson1 > platforms += mipssim > platforms += mti-malta > platforms += netlogic > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig > index b122adc..d693f48 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -259,6 +259,17 @@ config MACH_LOONGSON > Chinese Academy of Sciences (CAS) in the People's Republic > of China. The chief architect is Professor Weiwu Hu. > > +config MACH_LOONGSON1 > + bool "Loongson1 family of machines" > + select SYS_SUPPORTS_ZBOOT > + help > + This enables the support of Loongson1 family of machines. > + > + Loongson1 is a family of 32-bit MIPS-compatible SoCs. > + developed at Institute of Computing Technology (ICT), > + Chinese Academy of Sciences (CAS) in the People's Republic > + of China. > + > config MIPS_MALTA > bool "MIPS Malta board" > select ARCH_MAY_HAVE_PC_FDC > @@ -804,6 +815,7 @@ source "arch/mips/txx9/Kconfig" > source "arch/mips/vr41xx/Kconfig" > source "arch/mips/cavium-octeon/Kconfig" > source "arch/mips/loongson/Kconfig" > +source "arch/mips/loongson1/Kconfig" > source "arch/mips/netlogic/Kconfig" > > endmenu > @@ -1197,6 +1209,14 @@ config CPU_LOONGSON2F > have a similar programming interface with FPGA northbridge used in > Loongson2E. > > +config CPU_LOONGSON1B > + bool "Loongson 1B" > + depends on SYS_HAS_CPU_LOONGSON1B > + select CPU_LOONGSON1 > + help > + The Loongson 1B is a 32-bit SoC, which implements the MIPS32 release 2 > + instruction set. > + > config CPU_MIPS32_R1 > bool "MIPS32 Release 1" > depends on SYS_HAS_CPU_MIPS32_R1 > @@ -1525,6 +1545,14 @@ config CPU_LOONGSON2 > select CPU_SUPPORTS_64BIT_KERNEL > select CPU_SUPPORTS_HIGHMEM > > +config CPU_LOONGSON1 > + bool > + select CPU_MIPS32 > + select CPU_MIPSR2 > + select CPU_HAS_PREFETCH > + select CPU_SUPPORTS_32BIT_KERNEL > + select CPU_SUPPORTS_HIGHMEM > + > config SYS_HAS_CPU_LOONGSON2E > bool > > @@ -1534,6 +1562,9 @@ config SYS_HAS_CPU_LOONGSON2F > select CPU_SUPPORTS_ADDRWINCFG if 64BIT > select CPU_SUPPORTS_UNCACHED_ACCELERATED > > +config SYS_HAS_CPU_LOONGSON1B > + bool > + > config SYS_HAS_CPU_MIPS32_R1 > bool > > diff --git a/arch/mips/configs/ls1b_defconfig b/arch/mips/configs/ls1b_defconfig > new file mode 100644 > index 0000000..6463311 > --- /dev/null > +++ b/arch/mips/configs/ls1b_defconfig > @@ -0,0 +1,830 @@ > +# > +# Automatically generated make config: don't edit > +# Linux/mips 3.0.3 Kernel Configuration > +# > +CONFIG_MIPS=y > + > +# > +# Machine selection > +# > +# CONFIG_MIPS_ALCHEMY is not set > +# CONFIG_AR7 is not set > +# CONFIG_ATH79 is not set > +# CONFIG_BCM47XX is not set > +# CONFIG_BCM63XX is not set > +# CONFIG_MIPS_COBALT is not set > +# CONFIG_MACH_DECSTATION is not set > +# CONFIG_MACH_JAZZ is not set > +# CONFIG_MACH_JZ4740 is not set > +# CONFIG_LANTIQ is not set > +# CONFIG_LASAT is not set > +# CONFIG_MACH_LOONGSON is not set > +CONFIG_MACH_LOONGSON1=y > +# CONFIG_MIPS_MALTA is not set > +# CONFIG_MIPS_SIM is not set > +# CONFIG_NEC_MARKEINS is not set > +# CONFIG_MACH_VR41XX is not set > +# CONFIG_NXP_STB220 is not set > +# CONFIG_NXP_STB225 is not set > +# CONFIG_PNX8550_JBS is not set > +# CONFIG_PNX8550_STB810 is not set > +# CONFIG_PMC_MSP is not set > +# CONFIG_PMC_YOSEMITE is not set > +# CONFIG_POWERTV is not set > +# CONFIG_SGI_IP22 is not set > +# CONFIG_SGI_IP27 is not set > +# CONFIG_SGI_IP28 is not set > +# CONFIG_SGI_IP32 is not set > +# CONFIG_SIBYTE_CRHINE is not set > +# CONFIG_SIBYTE_CARMEL is not set > +# CONFIG_SIBYTE_CRHONE is not set > +# CONFIG_SIBYTE_RHONE is not set > +# CONFIG_SIBYTE_SWARM is not set > +# CONFIG_SIBYTE_LITTLESUR is not set > +# CONFIG_SIBYTE_SENTOSA is not set > +# CONFIG_SIBYTE_BIGSUR is not set > +# CONFIG_SNI_RM is not set > +# CONFIG_MACH_TX39XX is not set > +# CONFIG_MACH_TX49XX is not set > +# CONFIG_MIKROTIK_RB532 is not set > +# CONFIG_WR_PPMC is not set > +# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set > +# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set > +# CONFIG_NLM_XLR_BOARD is not set > +# CONFIG_ALCHEMY_GPIO_INDIRECT is not set > +CONFIG_ARCH_SPARSEMEM_ENABLE=y > +CONFIG_LOONGSON1_LS1B=y > +CONFIG_RWSEM_GENERIC_SPINLOCK=y > +# CONFIG_ARCH_HAS_ILOG2_U32 is not set > +# CONFIG_ARCH_HAS_ILOG2_U64 is not set > +CONFIG_ARCH_SUPPORTS_OPROFILE=y > +CONFIG_GENERIC_HWEIGHT=y > +CONFIG_GENERIC_CALIBRATE_DELAY=y > +CONFIG_GENERIC_CLOCKEVENTS=y > +CONFIG_GENERIC_CMOS_UPDATE=y > +CONFIG_SCHED_OMIT_FRAME_POINTER=y > +CONFIG_CEVT_R4K_LIB=y > +CONFIG_CEVT_R4K=y > +CONFIG_CSRC_R4K_LIB=y > +CONFIG_CSRC_R4K=y > +# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set > +CONFIG_DMA_NONCOHERENT=y > +CONFIG_NEED_DMA_MAP_STATE=y > +CONFIG_SYS_HAS_EARLY_PRINTK=y > +# CONFIG_MIPS_MACHINE is not set > +# CONFIG_NO_IOPORT is not set > +CONFIG_CPU_LITTLE_ENDIAN=y > +CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y > +CONFIG_IRQ_CPU=y > +CONFIG_BOOT_ELF32=y > +CONFIG_MIPS_L1_CACHE_SHIFT=5 > + > +# > +# CPU selection > +# > +CONFIG_CPU_LOONGSON1B=y > +CONFIG_SYS_SUPPORTS_ZBOOT=y > +CONFIG_CPU_LOONGSON1=y > +CONFIG_SYS_HAS_CPU_LOONGSON1B=y > +CONFIG_CPU_MIPS32=y > +CONFIG_CPU_MIPSR2=y > +CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y > +CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y > +CONFIG_HARDWARE_WATCHPOINTS=y > + > +# > +# Kernel type > +# > +CONFIG_32BIT=y > +CONFIG_PAGE_SIZE_4KB=y > +# CONFIG_PAGE_SIZE_16KB is not set > +# CONFIG_PAGE_SIZE_64KB is not set > +CONFIG_FORCE_MAX_ZONEORDER=11 > +CONFIG_CPU_HAS_PREFETCH=y > +CONFIG_MIPS_MT_DISABLED=y > +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set > +CONFIG_CPU_HAS_SYNC=y > +# CONFIG_HIGHMEM is not set > +CONFIG_CPU_SUPPORTS_HIGHMEM=y > +CONFIG_SYS_SUPPORTS_HIGHMEM=y > +CONFIG_ARCH_FLATMEM_ENABLE=y > +CONFIG_ARCH_POPULATES_NODE_MAP=y > +CONFIG_HW_PERF_EVENTS=y > +CONFIG_SELECT_MEMORY_MODEL=y > +CONFIG_FLATMEM_MANUAL=y > +# CONFIG_SPARSEMEM_MANUAL is not set > +CONFIG_FLATMEM=y > +CONFIG_FLAT_NODE_MEM_MAP=y > +CONFIG_SPARSEMEM_STATIC=y > +CONFIG_PAGEFLAGS_EXTENDED=y > +CONFIG_SPLIT_PTLOCK_CPUS=4 > +# CONFIG_COMPACTION is not set > +# CONFIG_PHYS_ADDR_T_64BIT is not set > +CONFIG_ZONE_DMA_FLAG=0 > +CONFIG_VIRT_TO_BUS=y > +# CONFIG_KSM is not set > +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 > +CONFIG_NEED_PER_CPU_KM=y > +# CONFIG_CLEANCACHE is not set > +CONFIG_TICK_ONESHOT=y > +# CONFIG_NO_HZ is not set > +CONFIG_HIGH_RES_TIMERS=y > +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y > +# CONFIG_HZ_48 is not set > +# CONFIG_HZ_100 is not set > +# CONFIG_HZ_128 is not set > +CONFIG_HZ_250=y > +# CONFIG_HZ_256 is not set > +# CONFIG_HZ_1000 is not set > +# CONFIG_HZ_1024 is not set > +CONFIG_SYS_SUPPORTS_ARBIT_HZ=y > +CONFIG_HZ=250 > +# CONFIG_PREEMPT_NONE is not set > +CONFIG_PREEMPT_VOLUNTARY=y > +# CONFIG_PREEMPT is not set > +CONFIG_KEXEC=y > +# CONFIG_SECCOMP is not set > +# CONFIG_USE_OF is not set > +CONFIG_LOCKDEP_SUPPORT=y > +CONFIG_STACKTRACE_SUPPORT=y > +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" > +CONFIG_HAVE_IRQ_WORK=y > +CONFIG_IRQ_WORK=y > + > +# > +# General setup > +# > +CONFIG_EXPERIMENTAL=y > +CONFIG_BROKEN_ON_SMP=y > +CONFIG_INIT_ENV_ARG_LIMIT=32 > +CONFIG_CROSS_COMPILE="" > +CONFIG_LOCALVERSION="" > +# CONFIG_LOCALVERSION_AUTO is not set > +CONFIG_HAVE_KERNEL_GZIP=y > +CONFIG_HAVE_KERNEL_BZIP2=y > +CONFIG_HAVE_KERNEL_LZMA=y > +CONFIG_HAVE_KERNEL_LZO=y > +CONFIG_KERNEL_GZIP=y > +# CONFIG_KERNEL_BZIP2 is not set > +# CONFIG_KERNEL_LZMA is not set > +# CONFIG_KERNEL_LZO is not set > +CONFIG_DEFAULT_HOSTNAME="(none)" > +CONFIG_SWAP=y > +CONFIG_SYSVIPC=y > +CONFIG_SYSVIPC_SYSCTL=y > +# CONFIG_POSIX_MQUEUE is not set > +CONFIG_BSD_PROCESS_ACCT=y > +CONFIG_BSD_PROCESS_ACCT_V3=y > +# CONFIG_FHANDLE is not set > +# CONFIG_TASKSTATS is not set > +# CONFIG_AUDIT is not set > +CONFIG_HAVE_GENERIC_HARDIRQS=y > + > +# > +# IRQ subsystem > +# > +CONFIG_GENERIC_HARDIRQS=y > +CONFIG_GENERIC_IRQ_PROBE=y > +CONFIG_GENERIC_IRQ_SHOW=y > + > +# > +# RCU Subsystem > +# > +CONFIG_TINY_RCU=y > +# CONFIG_PREEMPT_RCU is not set > +# CONFIG_RCU_TRACE is not set > +# CONFIG_TREE_RCU_TRACE is not set > +CONFIG_IKCONFIG=y > +CONFIG_IKCONFIG_PROC=y > +CONFIG_LOG_BUF_SHIFT=16 > +# CONFIG_CGROUPS is not set > +# CONFIG_NAMESPACES is not set > +# CONFIG_SCHED_AUTOGROUP is not set > +# CONFIG_SYSFS_DEPRECATED is not set > +# CONFIG_RELAY is not set > +CONFIG_BLK_DEV_INITRD=y > +CONFIG_INITRAMFS_SOURCE="" > +CONFIG_RD_GZIP=y > +CONFIG_RD_BZIP2=y > +CONFIG_RD_LZMA=y > +CONFIG_RD_XZ=y > +CONFIG_RD_LZO=y > +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set > +CONFIG_SYSCTL=y > +CONFIG_ANON_INODES=y > +CONFIG_EXPERT=y > +CONFIG_SYSCTL_SYSCALL=y > +CONFIG_KALLSYMS=y > +CONFIG_KALLSYMS_ALL=y > +CONFIG_HOTPLUG=y > +CONFIG_PRINTK=y > +CONFIG_BUG=y > +CONFIG_ELF_CORE=y > +CONFIG_PCSPKR_PLATFORM=y > +CONFIG_BASE_FULL=y > +CONFIG_FUTEX=y > +CONFIG_EPOLL=y > +CONFIG_SIGNALFD=y > +CONFIG_TIMERFD=y > +CONFIG_EVENTFD=y > +CONFIG_SHMEM=y > +CONFIG_AIO=y > +# CONFIG_EMBEDDED is not set > +CONFIG_HAVE_PERF_EVENTS=y > +CONFIG_PERF_USE_VMALLOC=y > + > +# > +# Kernel Performance Events And Counters > +# > +CONFIG_PERF_EVENTS=y > +# CONFIG_PERF_COUNTERS is not set > +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set > +CONFIG_VM_EVENT_COUNTERS=y > +CONFIG_SLUB_DEBUG=y > +# CONFIG_COMPAT_BRK is not set > +# CONFIG_SLAB is not set > +CONFIG_SLUB=y > +# CONFIG_SLOB is not set > +# CONFIG_PROFILING is not set > +CONFIG_HAVE_OPROFILE=y > +# CONFIG_KPROBES is not set > +# CONFIG_JUMP_LABEL is not set > +CONFIG_HAVE_KPROBES=y > +CONFIG_HAVE_KRETPROBES=y > +CONFIG_HAVE_DMA_ATTRS=y > +CONFIG_HAVE_DMA_API_DEBUG=y > +CONFIG_HAVE_ARCH_JUMP_LABEL=y > + > +# > +# GCOV-based kernel profiling > +# > +# CONFIG_GCOV_KERNEL is not set > +CONFIG_HAVE_GENERIC_DMA_COHERENT=y > +CONFIG_SLABINFO=y > +CONFIG_RT_MUTEXES=y > +CONFIG_BASE_SMALL=0 > +CONFIG_MODULES=y > +# CONFIG_MODULE_FORCE_LOAD is not set > +CONFIG_MODULE_UNLOAD=y > +# CONFIG_MODULE_FORCE_UNLOAD is not set > +CONFIG_MODVERSIONS=y > +# CONFIG_MODULE_SRCVERSION_ALL is not set > +CONFIG_BLOCK=y > +# CONFIG_LBDAF is not set > +# CONFIG_BLK_DEV_BSG is not set > +# CONFIG_BLK_DEV_INTEGRITY is not set > + > +# > +# IO Schedulers > +# > +CONFIG_IOSCHED_NOOP=y > +CONFIG_IOSCHED_DEADLINE=y > +CONFIG_IOSCHED_CFQ=y > +# CONFIG_DEFAULT_DEADLINE is not set > +CONFIG_DEFAULT_CFQ=y > +# CONFIG_DEFAULT_NOOP is not set > +CONFIG_DEFAULT_IOSCHED="cfq" > +# CONFIG_INLINE_SPIN_TRYLOCK is not set > +# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set > +# CONFIG_INLINE_SPIN_LOCK is not set > +# CONFIG_INLINE_SPIN_LOCK_BH is not set > +# CONFIG_INLINE_SPIN_LOCK_IRQ is not set > +# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set > +CONFIG_INLINE_SPIN_UNLOCK=y > +# CONFIG_INLINE_SPIN_UNLOCK_BH is not set > +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y > +# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set > +# CONFIG_INLINE_READ_TRYLOCK is not set > +# CONFIG_INLINE_READ_LOCK is not set > +# CONFIG_INLINE_READ_LOCK_BH is not set > +# CONFIG_INLINE_READ_LOCK_IRQ is not set > +# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set > +CONFIG_INLINE_READ_UNLOCK=y > +# CONFIG_INLINE_READ_UNLOCK_BH is not set > +CONFIG_INLINE_READ_UNLOCK_IRQ=y > +# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set > +# CONFIG_INLINE_WRITE_TRYLOCK is not set > +# CONFIG_INLINE_WRITE_LOCK is not set > +# CONFIG_INLINE_WRITE_LOCK_BH is not set > +# CONFIG_INLINE_WRITE_LOCK_IRQ is not set > +# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set > +CONFIG_INLINE_WRITE_UNLOCK=y > +# CONFIG_INLINE_WRITE_UNLOCK_BH is not set > +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y > +# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set > +# CONFIG_MUTEX_SPIN_ON_OWNER is not set > +# CONFIG_FREEZER is not set > + > +# > +# Bus options (PCI, PCMCIA, EISA, ISA, TC) > +# > +# CONFIG_ARCH_SUPPORTS_MSI is not set > +CONFIG_MMU=y > +# CONFIG_PCCARD is not set > + > +# > +# Executable file formats > +# > +CONFIG_BINFMT_ELF=y > +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set > +# CONFIG_HAVE_AOUT is not set > +# CONFIG_BINFMT_MISC is not set > +CONFIG_TRAD_SIGNALS=y > + > +# > +# Power management options > +# > +CONFIG_ARCH_HIBERNATION_POSSIBLE=y > +CONFIG_ARCH_SUSPEND_POSSIBLE=y > +# CONFIG_SUSPEND is not set > +# CONFIG_HIBERNATION is not set > +# CONFIG_PM_RUNTIME is not set > +CONFIG_NET=y > + > +# > +# Networking options > +# > +CONFIG_PACKET=y > +CONFIG_UNIX=y > +# CONFIG_NET_KEY is not set > +CONFIG_INET=y > +# CONFIG_IP_MULTICAST is not set > +# CONFIG_IP_ADVANCED_ROUTER is not set > +CONFIG_IP_PNP=y > +CONFIG_IP_PNP_DHCP=y > +# CONFIG_IP_PNP_BOOTP is not set > +# CONFIG_IP_PNP_RARP is not set > +# CONFIG_NET_IPIP is not set > +# CONFIG_NET_IPGRE_DEMUX is not set > +# CONFIG_ARPD is not set > +CONFIG_SYN_COOKIES=y > +# CONFIG_INET_AH is not set > +# CONFIG_INET_ESP is not set > +# CONFIG_INET_IPCOMP is not set > +# CONFIG_INET_XFRM_TUNNEL is not set > +# CONFIG_INET_TUNNEL is not set > +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set > +# CONFIG_INET_XFRM_MODE_TUNNEL is not set > +# CONFIG_INET_XFRM_MODE_BEET is not set > +CONFIG_INET_LRO=y > +# CONFIG_INET_DIAG is not set > +# CONFIG_TCP_CONG_ADVANCED is not set > +CONFIG_TCP_CONG_CUBIC=y > +CONFIG_DEFAULT_TCP_CONG="cubic" > +# CONFIG_TCP_MD5SIG is not set > +# CONFIG_IPV6 is not set > +# CONFIG_NETWORK_SECMARK is not set > +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set > +# CONFIG_NETFILTER is not set > +# CONFIG_IP_DCCP is not set > +# CONFIG_IP_SCTP is not set > +# CONFIG_RDS is not set > +# CONFIG_TIPC is not set > +# CONFIG_ATM is not set > +# CONFIG_L2TP is not set > +# CONFIG_BRIDGE is not set > +# CONFIG_VLAN_8021Q is not set > +# CONFIG_DECNET is not set > +# CONFIG_LLC2 is not set > +# CONFIG_IPX is not set > +# CONFIG_ATALK is not set > +# CONFIG_X25 is not set > +# CONFIG_LAPB is not set > +# CONFIG_ECONET is not set > +# CONFIG_WAN_ROUTER is not set > +# CONFIG_PHONET is not set > +# CONFIG_IEEE802154 is not set > +# CONFIG_NET_SCHED is not set > +# CONFIG_DCB is not set > +# CONFIG_DNS_RESOLVER is not set > +# CONFIG_BATMAN_ADV is not set > + > +# > +# Network testing > +# > +# CONFIG_NET_PKTGEN is not set > +# CONFIG_HAMRADIO is not set > +# CONFIG_CAN is not set > +# CONFIG_IRDA is not set > +# CONFIG_BT is not set > +# CONFIG_AF_RXRPC is not set > +# CONFIG_WIRELESS is not set > +# CONFIG_WIMAX is not set > +# CONFIG_RFKILL is not set > +# CONFIG_NET_9P is not set > +# CONFIG_CAIF is not set > +# CONFIG_CEPH_LIB is not set > + > +# > +# Device Drivers > +# > + > +# > +# Generic Driver Options > +# > +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" > +CONFIG_DEVTMPFS=y > +CONFIG_DEVTMPFS_MOUNT=y > +# CONFIG_STANDALONE is not set > +CONFIG_PREVENT_FIRMWARE_BUILD=y > +CONFIG_FW_LOADER=y > +CONFIG_FIRMWARE_IN_KERNEL=y > +CONFIG_EXTRA_FIRMWARE="" > +# CONFIG_DEBUG_DRIVER is not set > +# CONFIG_DEBUG_DEVRES is not set > +# CONFIG_SYS_HYPERVISOR is not set > +# CONFIG_CONNECTOR is not set > +# CONFIG_MTD is not set > +# CONFIG_PARPORT is not set > +CONFIG_BLK_DEV=y > +# CONFIG_BLK_DEV_COW_COMMON is not set > +CONFIG_BLK_DEV_LOOP=y > +# CONFIG_BLK_DEV_CRYPTOLOOP is not set > + > +# > +# DRBD disabled because PROC_FS, INET or CONNECTOR not selected > +# > +# CONFIG_BLK_DEV_NBD is not set > +# CONFIG_BLK_DEV_RAM is not set > +# CONFIG_CDROM_PKTCDVD is not set > +# CONFIG_ATA_OVER_ETH is not set > +# CONFIG_BLK_DEV_HD is not set > +# CONFIG_BLK_DEV_RBD is not set > +# CONFIG_SENSORS_LIS3LV02D is not set > +# CONFIG_MISC_DEVICES is not set > +CONFIG_HAVE_IDE=y > +# CONFIG_IDE is not set > + > +# > +# SCSI device support > +# > +CONFIG_SCSI_MOD=y > +# CONFIG_RAID_ATTRS is not set > +# CONFIG_SCSI is not set > +# CONFIG_SCSI_DMA is not set > +# CONFIG_SCSI_NETLINK is not set > +# CONFIG_ATA is not set > +# CONFIG_MD is not set > +# CONFIG_NETDEVICES is not set > +# CONFIG_ISDN is not set > +# CONFIG_PHONE is not set > + > +# > +# Input device support > +# > +CONFIG_INPUT=y > +# CONFIG_INPUT_FF_MEMLESS is not set > +# CONFIG_INPUT_POLLDEV is not set > +# CONFIG_INPUT_SPARSEKMAP is not set > + > +# > +# Userland interfaces > +# > +# CONFIG_INPUT_MOUSEDEV is not set > +# CONFIG_INPUT_JOYDEV is not set > +# CONFIG_INPUT_EVDEV is not set > +# CONFIG_INPUT_EVBUG is not set > + > +# > +# Input Device Drivers > +# > +# CONFIG_INPUT_KEYBOARD is not set > +# CONFIG_INPUT_MOUSE is not set > +# CONFIG_INPUT_JOYSTICK is not set > +# CONFIG_INPUT_TABLET is not set > +# CONFIG_INPUT_TOUCHSCREEN is not set > +# CONFIG_INPUT_MISC is not set > + > +# > +# Hardware I/O ports > +# > +# CONFIG_SERIO is not set > +# CONFIG_GAMEPORT is not set > + > +# > +# Character devices > +# > +CONFIG_VT=y > +CONFIG_CONSOLE_TRANSLATIONS=y > +CONFIG_VT_CONSOLE=y > +CONFIG_HW_CONSOLE=y > +CONFIG_VT_HW_CONSOLE_BINDING=y > +CONFIG_UNIX98_PTYS=y > +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set > +CONFIG_LEGACY_PTYS=y > +CONFIG_LEGACY_PTY_COUNT=8 > +# CONFIG_SERIAL_NONSTANDARD is not set > +# CONFIG_N_GSM is not set > +# CONFIG_TRACE_SINK is not set > +# CONFIG_DEVKMEM is not set > + > +# > +# Serial drivers > +# > +CONFIG_SERIAL_8250=y > +CONFIG_SERIAL_8250_CONSOLE=y > +CONFIG_SERIAL_8250_NR_UARTS=4 > +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 > +# CONFIG_SERIAL_8250_EXTENDED is not set > + > +# > +# Non-8250 serial port support > +# > +CONFIG_SERIAL_CORE=y > +CONFIG_SERIAL_CORE_CONSOLE=y > +CONFIG_CONSOLE_POLL=y > +# CONFIG_SERIAL_TIMBERDALE is not set > +# CONFIG_SERIAL_ALTERA_JTAGUART is not set > +# CONFIG_SERIAL_ALTERA_UART is not set > +# CONFIG_SERIAL_XILINX_PS_UART is not set > +# CONFIG_TTY_PRINTK is not set > +# CONFIG_IPMI_HANDLER is not set > +# CONFIG_HW_RANDOM is not set > +# CONFIG_R3964 is not set > +# CONFIG_RAW_DRIVER is not set > +# CONFIG_TCG_TPM is not set > +CONFIG_RAMOOPS=y > +# CONFIG_I2C is not set > +# CONFIG_SPI is not set > + > +# > +# PPS support > +# > +# CONFIG_PPS is not set > + > +# > +# PPS generators support > +# > + > +# > +# PTP clock support > +# > + > +# > +# Enable Device Drivers -> PPS to see the PTP clock options. > +# > +# CONFIG_W1 is not set > +# CONFIG_POWER_SUPPLY is not set > +# CONFIG_HWMON is not set > +# CONFIG_THERMAL is not set > +# CONFIG_WATCHDOG is not set > +CONFIG_SSB_POSSIBLE=y > + > +# > +# Sonics Silicon Backplane > +# > +# CONFIG_SSB is not set > +CONFIG_BCMA_POSSIBLE=y > + > +# > +# Broadcom specific AMBA > +# > +# CONFIG_BCMA is not set > +# CONFIG_MFD_SUPPORT is not set > +# CONFIG_REGULATOR is not set > +# CONFIG_MEDIA_SUPPORT is not set > + > +# > +# Graphics support > +# > +# CONFIG_DRM is not set > +# CONFIG_VGASTATE is not set > +# CONFIG_VIDEO_OUTPUT_CONTROL is not set > +# CONFIG_FB is not set > +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set > + > +# > +# Display device support > +# > +# CONFIG_DISPLAY_SUPPORT is not set > + > +# > +# Console display driver support > +# > +# CONFIG_VGA_CONSOLE is not set > +CONFIG_DUMMY_CONSOLE=y > +# CONFIG_SOUND is not set > +# CONFIG_HID_SUPPORT is not set > +# CONFIG_USB_SUPPORT is not set > +# CONFIG_MMC is not set > +# CONFIG_MEMSTICK is not set > +# CONFIG_NEW_LEDS is not set > +# CONFIG_NFC_DEVICES is not set > +# CONFIG_ACCESSIBILITY is not set > +CONFIG_RTC_LIB=y > +# CONFIG_RTC_CLASS is not set > +# CONFIG_DMADEVICES is not set > +# CONFIG_AUXDISPLAY is not set > +# CONFIG_UIO is not set > +# CONFIG_STAGING is not set > + > +# > +# File systems > +# > +CONFIG_EXT2_FS=y > +CONFIG_EXT2_FS_XATTR=y > +CONFIG_EXT2_FS_POSIX_ACL=y > +CONFIG_EXT2_FS_SECURITY=y > +# CONFIG_EXT2_FS_XIP is not set > +CONFIG_EXT3_FS=y > +CONFIG_EXT3_DEFAULTS_TO_ORDERED=y > +CONFIG_EXT3_FS_XATTR=y > +CONFIG_EXT3_FS_POSIX_ACL=y > +CONFIG_EXT3_FS_SECURITY=y > +# CONFIG_EXT4_FS is not set > +CONFIG_JBD=y > +# CONFIG_JBD_DEBUG is not set > +CONFIG_FS_MBCACHE=y > +# CONFIG_REISERFS_FS is not set > +# CONFIG_JFS_FS is not set > +# CONFIG_XFS_FS is not set > +# CONFIG_BTRFS_FS is not set > +# CONFIG_NILFS2_FS is not set > +CONFIG_FS_POSIX_ACL=y > +CONFIG_FILE_LOCKING=y > +CONFIG_FSNOTIFY=y > +# CONFIG_DNOTIFY is not set > +CONFIG_INOTIFY_USER=y > +# CONFIG_FANOTIFY is not set > +# CONFIG_QUOTA is not set > +# CONFIG_QUOTACTL is not set > +# CONFIG_AUTOFS4_FS is not set > +# CONFIG_FUSE_FS is not set > +CONFIG_GENERIC_ACL=y > + > +# > +# Caches > +# > +# CONFIG_FSCACHE is not set > + > +# > +# CD-ROM/DVD Filesystems > +# > +# CONFIG_ISO9660_FS is not set > +# CONFIG_UDF_FS is not set > + > +# > +# DOS/FAT/NT Filesystems > +# > +# CONFIG_MSDOS_FS is not set > +# CONFIG_VFAT_FS is not set > +# CONFIG_NTFS_FS is not set > + > +# > +# Pseudo filesystems > +# > +CONFIG_PROC_FS=y > +CONFIG_PROC_KCORE=y > +CONFIG_PROC_SYSCTL=y > +CONFIG_PROC_PAGE_MONITOR=y > +CONFIG_SYSFS=y > +CONFIG_TMPFS=y > +CONFIG_TMPFS_POSIX_ACL=y > +CONFIG_TMPFS_XATTR=y > +# CONFIG_HUGETLB_PAGE is not set > +# CONFIG_CONFIGFS_FS is not set > +# CONFIG_MISC_FILESYSTEMS is not set > +# CONFIG_NETWORK_FILESYSTEMS is not set > + > +# > +# Partition Types > +# > +# CONFIG_PARTITION_ADVANCED is not set > +CONFIG_MSDOS_PARTITION=y > +# CONFIG_NLS is not set > + > +# > +# Kernel hacking > +# > +CONFIG_TRACE_IRQFLAGS_SUPPORT=y > +# CONFIG_PRINTK_TIME is not set > +CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 > +# CONFIG_ENABLE_WARN_DEPRECATED is not set > +# CONFIG_ENABLE_MUST_CHECK is not set > +CONFIG_FRAME_WARN=1024 > +CONFIG_MAGIC_SYSRQ=y > +# CONFIG_STRIP_ASM_SYMS is not set > +CONFIG_UNUSED_SYMBOLS=y > +CONFIG_DEBUG_FS=y > +# CONFIG_HEADERS_CHECK is not set > +# CONFIG_DEBUG_SECTION_MISMATCH is not set > +CONFIG_DEBUG_KERNEL=y > +# CONFIG_DEBUG_SHIRQ is not set > +# CONFIG_LOCKUP_DETECTOR is not set > +# CONFIG_HARDLOCKUP_DETECTOR is not set > +CONFIG_DETECT_HUNG_TASK=y > +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 > +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set > +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 > +CONFIG_SCHED_DEBUG=y > +CONFIG_SCHEDSTATS=y > +CONFIG_TIMER_STATS=y > +# CONFIG_DEBUG_OBJECTS is not set > +# CONFIG_SLUB_DEBUG_ON is not set > +# CONFIG_SLUB_STATS is not set > +# CONFIG_DEBUG_KMEMLEAK is not set > +# CONFIG_DEBUG_RT_MUTEXES is not set > +# CONFIG_RT_MUTEX_TESTER is not set > +# CONFIG_DEBUG_SPINLOCK is not set > +# CONFIG_DEBUG_MUTEXES is not set > +# CONFIG_DEBUG_LOCK_ALLOC is not set > +# CONFIG_PROVE_LOCKING is not set > +# CONFIG_SPARSE_RCU_POINTER is not set > +# CONFIG_LOCK_STAT is not set > +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set > +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set > +# CONFIG_DEBUG_STACK_USAGE is not set > +# CONFIG_DEBUG_KOBJECT is not set > +CONFIG_DEBUG_INFO=y > +# CONFIG_DEBUG_INFO_REDUCED is not set > +# CONFIG_DEBUG_VM is not set > +# CONFIG_DEBUG_WRITECOUNT is not set > +CONFIG_DEBUG_MEMORY_INIT=y > +# CONFIG_DEBUG_LIST is not set > +# CONFIG_TEST_LIST_SORT is not set > +# CONFIG_DEBUG_SG is not set > +# CONFIG_DEBUG_NOTIFIERS is not set > +# CONFIG_DEBUG_CREDENTIALS is not set > +CONFIG_BOOT_PRINTK_DELAY=y > +# CONFIG_RCU_TORTURE_TEST is not set > +# CONFIG_BACKTRACE_SELF_TEST is not set > +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set > +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set > +# CONFIG_LKDTM is not set > +# CONFIG_FAULT_INJECTION is not set > +CONFIG_SYSCTL_SYSCALL_CHECK=y > +# CONFIG_DEBUG_PAGEALLOC is not set > +CONFIG_HAVE_FUNCTION_TRACER=y > +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y > +CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y > +CONFIG_HAVE_DYNAMIC_FTRACE=y > +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y > +CONFIG_HAVE_C_RECORDMCOUNT=y > +CONFIG_TRACING_SUPPORT=y > +# CONFIG_FTRACE is not set > +# CONFIG_DYNAMIC_DEBUG is not set > +# CONFIG_DMA_API_DEBUG is not set > +# CONFIG_ATOMIC64_SELFTEST is not set > +# CONFIG_SAMPLES is not set > +CONFIG_HAVE_ARCH_KGDB=y > +CONFIG_KGDB=y > +CONFIG_KGDB_SERIAL_CONSOLE=y > +# CONFIG_KGDB_TESTS is not set > +CONFIG_KGDB_LOW_LEVEL_TRAP=y > +CONFIG_KGDB_KDB=y > +CONFIG_KDB_KEYBOARD=y > +# CONFIG_TEST_KSTRTOX is not set > +# CONFIG_EARLY_PRINTK is not set > +# CONFIG_CMDLINE_BOOL is not set > +# CONFIG_DEBUG_STACKOVERFLOW is not set > +# CONFIG_RUNTIME_DEBUG is not set > +# CONFIG_DEBUG_ZBOOT is not set > +# CONFIG_SPINLOCK_TEST is not set > + > +# > +# Security options > +# > +CONFIG_KEYS=y > +# CONFIG_KEYS_DEBUG_PROC_KEYS is not set > +# CONFIG_SECURITY_DMESG_RESTRICT is not set > +# CONFIG_SECURITY is not set > +# CONFIG_SECURITYFS is not set > +CONFIG_DEFAULT_SECURITY_DAC=y > +CONFIG_DEFAULT_SECURITY="" > +# CONFIG_CRYPTO is not set > +# CONFIG_VIRTUALIZATION is not set > +# CONFIG_BINARY_PRINTF is not set > + > +# > +# Library routines > +# > +CONFIG_BITREVERSE=y > +# CONFIG_CRC_CCITT is not set > +# CONFIG_CRC16 is not set > +# CONFIG_CRC_T10DIF is not set > +# CONFIG_CRC_ITU_T is not set > +CONFIG_CRC32=y > +# CONFIG_CRC7 is not set > +# CONFIG_LIBCRC32C is not set > +CONFIG_ZLIB_INFLATE=y > +CONFIG_LZO_DECOMPRESS=y > +CONFIG_XZ_DEC=y > +CONFIG_XZ_DEC_X86=y > +CONFIG_XZ_DEC_POWERPC=y > +CONFIG_XZ_DEC_IA64=y > +CONFIG_XZ_DEC_ARM=y > +CONFIG_XZ_DEC_ARMTHUMB=y > +CONFIG_XZ_DEC_SPARC=y > +CONFIG_XZ_DEC_BCJ=y > +# CONFIG_XZ_DEC_TEST is not set > +CONFIG_DECOMPRESS_GZIP=y > +CONFIG_DECOMPRESS_BZIP2=y > +CONFIG_DECOMPRESS_LZMA=y > +CONFIG_DECOMPRESS_XZ=y > +CONFIG_DECOMPRESS_LZO=y > +CONFIG_HAS_IOMEM=y > +CONFIG_HAS_IOPORT=y > +CONFIG_HAS_DMA=y > +CONFIG_NLATTR=y > +CONFIG_GENERIC_ATOMIC64=y > +# CONFIG_AVERAGE is not set We should use the 'minimal' defconfig now, please get it with the following command: $ make savedefconfig > diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h > index 5f95a4b..975f372 100644 > --- a/arch/mips/include/asm/cpu.h > +++ b/arch/mips/include/asm/cpu.h > @@ -191,6 +191,7 @@ > #define PRID_REV_34K_V1_0_2 0x0022 > #define PRID_REV_LOONGSON2E 0x0002 > #define PRID_REV_LOONGSON2F 0x0003 > +#define PRID_REV_LOONGSON1B 0x0020 > > /* > * Older processors used to encode processor version and revision in two > @@ -253,7 +254,7 @@ enum cpu_type_enum { > */ > CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, > CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, > - CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, > + CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_LOONGSON1, > > /* > * MIPS64 class processors > diff --git a/arch/mips/include/asm/mach-loongson1/irq.h b/arch/mips/include/asm/mach-loongson1/irq.h > new file mode 100644 > index 0000000..3f1053e > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/irq.h > @@ -0,0 +1,70 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * IRQ mappings for Loongson1. > + * > + * 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. > + */ > + > + > +#ifndef __ASM_MACH_LOONGSON1_IRQ_H > +#define __ASM_MACH_LOONGSON1_IRQ_H > + > +/* > + * CPU core Interrupt Numbers > + */ > +#define MIPS_CPU_IRQ_BASE 0 > +#define MIPS_CPU_IRQ(x) (MIPS_CPU_IRQ_BASE + (x)) > +#define SOFTINT0_IRQ MIPS_CPU_IRQ(0) > +#define SOFTINT1_IRQ MIPS_CPU_IRQ(1) > +#define INT0_IRQ MIPS_CPU_IRQ(2) > +#define INT1_IRQ MIPS_CPU_IRQ(3) > +#define INT2_IRQ MIPS_CPU_IRQ(4) > +#define INT3_IRQ MIPS_CPU_IRQ(5) > +#define INT4_IRQ MIPS_CPU_IRQ(6) > +#define TIMER_IRQ MIPS_CPU_IRQ(7) /* cpu timer */ > + > +/* > + * INT0~3 Interrupt Numbers > + */ > +#define LOONGSON1_IRQ_BASE 8 > +#define LOONGSON1_IRQ(n,x) (LOONGSON1_IRQ_BASE + (n << 5) + (x)) > + > +#define LOONGSON1_UART0_IRQ LOONGSON1_IRQ(0,2) > +#define LOONGSON1_UART1_IRQ LOONGSON1_IRQ(0,3) > +#define LOONGSON1_UART2_IRQ LOONGSON1_IRQ(0,4) > +#define LOONGSON1_UART3_IRQ LOONGSON1_IRQ(0,5) > +#define LOONGSON1_CAN0_IRQ LOONGSON1_IRQ(0,6) > +#define LOONGSON1_CAN1_IRQ LOONGSON1_IRQ(0,7) > +#define LOONGSON1_SPI0_IRQ LOONGSON1_IRQ(0,8) > +#define LOONGSON1_SPI1_IRQ LOONGSON1_IRQ(0,9) > +#define LOONGSON1_AC97_IRQ LOONGSON1_IRQ(0,10) > +#define LOONGSON1_DMA0_IRQ LOONGSON1_IRQ(0,13) > +#define LOONGSON1_DMA1_IRQ LOONGSON1_IRQ(0,14) > +#define LOONGSON1_DMA2_IRQ LOONGSON1_IRQ(0,15) > +#define LOONGSON1_PWM0_IRQ LOONGSON1_IRQ(0,17) > +#define LOONGSON1_PWM1_IRQ LOONGSON1_IRQ(0,18) > +#define LOONGSON1_PWM2_IRQ LOONGSON1_IRQ(0,19) > +#define LOONGSON1_PWM3_IRQ LOONGSON1_IRQ(0,20) > +#define LOONGSON1_RTC_INT0_IRQ LOONGSON1_IRQ(0,21) > +#define LOONGSON1_RTC_INT1_IRQ LOONGSON1_IRQ(0,22) > +#define LOONGSON1_RTC_INT2_IRQ LOONGSON1_IRQ(0,23) > +#define LOONGSON1_TOY_INT0_IRQ LOONGSON1_IRQ(0,24) > +#define LOONGSON1_TOY_INT1_IRQ LOONGSON1_IRQ(0,25) > +#define LOONGSON1_TOY_INT2_IRQ LOONGSON1_IRQ(0,26) > +#define LOONGSON1_RTC_TICK_IRQ LOONGSON1_IRQ(0,27) > +#define LOONGSON1_TOY_TICK_IRQ LOONGSON1_IRQ(0,28) > +#define LOONGSON1_UART4_IRQ LOONGSON1_IRQ(0,29) > +#define LOONGSON1_UART5_IRQ LOONGSON1_IRQ(0,30) > + > +#define LOONGSON1_OHCI_IRQ LOONGSON1_IRQ(1,0) > +#define LOONGSON1_EHCI_IRQ LOONGSON1_IRQ(1,1) > +#define LOONGSON1_GMAC0_IRQ LOONGSON1_IRQ(1,2) > +#define LOONGSON1_GMAC1_IRQ LOONGSON1_IRQ(1,3) > + > +#define NR_IRQS LOONGSON1_GMAC1_IRQ > + > +#endif /* __ASM_MACH_LOONGSON1_IRQ_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/loongson1.h b/arch/mips/include/asm/mach-loongson1/loongson1.h > new file mode 100644 > index 0000000..466136d > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/loongson1.h > @@ -0,0 +1,48 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * Register mappings for Loongson1. > + * > + * 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. > + */ > + > + > +#ifndef __ASM_MACH_LOONGSON1_LOONGSON1_H > +#define __ASM_MACH_LOONGSON1_LOONGSON1_H > + > +#define DEFAULT_MEMSIZE (256) /* If no memsize provided */ > + > +/* Loongson1 Register Bases */ > +/* All regs are accessed in KSEG1 */ > +#define LOONGSON1_REGBASE (0xa0000000ul + 0x1fe00000ul) > + > +#define LOONGSON1_INTC_BASE (0xbfd01040) > +#define LOONGSON1_USB_BASE (0xbfe00000) > +#define LOONGSON1_GMAC0_BASE (0xbfe10000) > +#define LOONGSON1_GMAC1_BASE (0xbfe20000) > +#define LOONGSON1_UART0_BASE (0xbfe40000) > +#define LOONGSON1_UART1_BASE (0xbfe44000) > +#define LOONGSON1_UART2_BASE (0xbfe48000) > +#define LOONGSON1_UART3_BASE (0xbfe4c000) > +#define LOONGSON1_UART4_BASE (0xbfe6c000) > +#define LOONGSON1_UART5_BASE (0xbfe7c000) > +#define LOONGSON1_CAN0_BASE (0xbfe50000) > +#define LOONGSON1_CAN1_BASE (0xbfe54000) > +#define LOONGSON1_I2C0_BASE (0xbfe58000) > +#define LOONGSON1_I2C1_BASE (0xbfe68000) > +#define LOONGSON1_I2C2_BASE (0xbfe70000) > +#define LOONGSON1_PWM_BASE (0xbfe5c000) > +#define LOONGSON1_WDT_BASE (0xbfe5c060) > +#define LOONGSON1_RTC_BASE (0xbfe64000) > +#define LOONGSON1_AC97_BASE (0xbfe74000) > +#define LOONGSON1_NAND_BASE (0xbfe78000) > +#define LOONGSON1_CLK_BASE (0xbfe78030) > + > +#include <regs-clk.h> > +#include <regs-intc.h> > +#include <regs-wdt.h> > + > +#endif /* __ASM_MACH_LOONGSON1_LOONGSON1_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/platform.h b/arch/mips/include/asm/mach-loongson1/platform.h > new file mode 100644 > index 0000000..db4f02e > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/platform.h > @@ -0,0 +1,20 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > + > +#ifndef __ASM_MACH_LOONGSON1_PLATFORM_H > +#define __ASM_MACH_LOONGSON1_PLATFORM_H > + > +#include <linux/platform_device.h> > + > +extern struct platform_device loongson1_uart_device; > + > +void loongson1_serial_setup(void); > + > +#endif /* __ASM_MACH_LOONGSON1_PLATFORM_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/prom.h b/arch/mips/include/asm/mach-loongson1/prom.h > new file mode 100644 > index 0000000..b871dc4 > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/prom.h > @@ -0,0 +1,24 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#ifndef __ASM_MACH_LOONGSON1_PROM_H > +#define __ASM_MACH_LOONGSON1_PROM_H > + > +#include <linux/io.h> > +#include <linux/init.h> > +#include <linux/irq.h> > + > +/* environment arguments from bootloader */ > +extern unsigned long memsize, highmemsize; > + > +/* loongson-specific command line, env and memory initialization */ > +extern char *prom_getenv(char *name); > +extern void __init prom_init_cmdline(void); > + > +#endif /* __ASM_MACH_LOONGSON1_PROM_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/regs-clk.h b/arch/mips/include/asm/mach-loongson1/regs-clk.h > new file mode 100644 > index 0000000..8a14d97 > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/regs-clk.h > @@ -0,0 +1,32 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * Loongson1 Clock Register Definitions. > + * > + * 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. > + */ > + > +#ifndef __ASM_MACH_LOONGSON1_REGS_CLK_H > +#define __ASM_MACH_LOONGSON1_REGS_CLK_H > + > +#define LOONGSON1_CLK_REG(x) ((void __iomem *)(LOONGSON1_CLK_BASE + (x))) > + > +#define LS1_CLK_PLL_FREQ LOONGSON1_CLK_REG(0x0) > +#define LS1_CLK_PLL_DIV LOONGSON1_CLK_REG(0x4) > + > +/* Clock PLL Divisor Register Bits */ > +#define DIV_DC_EN (0x1 << 31) > +#define DIV_DC (0x1f << 26) > +#define DIV_CPU_EN (0x1 << 25) > +#define DIV_CPU (0x1f << 20) > +#define DIV_DDR_EN (0x1 << 19) > +#define DIV_DDR (0x1f << 14) > + > +#define DIV_DC_SHIFT (26) > +#define DIV_CPU_SHIFT (20) > +#define DIV_DDR_SHIFT (14) > + > +#endif /* __ASM_MACH_LOONGSON1_REGS_CLK_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/regs-intc.h b/arch/mips/include/asm/mach-loongson1/regs-intc.h > new file mode 100644 > index 0000000..69d1b4a > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/regs-intc.h > @@ -0,0 +1,24 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * Loongson1 Interrupt register definitions. > + * > + * 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. > + */ > + > +#ifndef __ASM_MACH_LOONGSON1_REGS_INTC_H > +#define __ASM_MACH_LOONGSON1_REGS_INTC_H > + > +#define LOONGSON1_INTC_REG(x) ((void __iomem *)(LOONGSON1_INTC_BASE + n * 0x18 + x)) > + > +#define LS1_INTC_INTISR(n) LOONGSON1_INTC_REG(0x0) > +#define LS1_INTC_INTIEN(n) LOONGSON1_INTC_REG(0x4) > +#define LS1_INTC_INTSET(n) LOONGSON1_INTC_REG(0x8) > +#define LS1_INTC_INTCLR(n) LOONGSON1_INTC_REG(0xc) > +#define LS1_INTC_INTPOL(n) LOONGSON1_INTC_REG(0x10) > +#define LS1_INTC_INTEDGE(n) LOONGSON1_INTC_REG(0x14) > + > +#endif /* __ASM_MACH_LOONGSON1_REGS_INTC_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/regs-wdt.h b/arch/mips/include/asm/mach-loongson1/regs-wdt.h > new file mode 100644 > index 0000000..3e5a51a > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/regs-wdt.h > @@ -0,0 +1,21 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * Loongson1 Watchdog register definitions. > + * > + * 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. > + */ > + > +#ifndef __ASM_MACH_LOONGSON1_REGS_WDT_H > +#define __ASM_MACH_LOONGSON1_REGS_WDT_H > + > +#define LOONGSON1_WDT_REG(x) ((void __iomem *)(LOONGSON1_WDT_BASE + (x))) > + > +#define LS1_WDT_EN LOONGSON1_WDT_REG(0x0) > +#define LS1_WDT_SET LOONGSON1_WDT_REG(0x4) > +#define LS1_WDT_TIMER LOONGSON1_WDT_REG(0x8) > + > +#endif /* __ASM_MACH_LOONGSON1_REGS_WDT_H */ > diff --git a/arch/mips/include/asm/mach-loongson1/war.h b/arch/mips/include/asm/mach-loongson1/war.h > new file mode 100644 > index 0000000..e3680a8 > --- /dev/null > +++ b/arch/mips/include/asm/mach-loongson1/war.h > @@ -0,0 +1,25 @@ > +/* > + * This file is subject to the terms and conditions of the GNU General Public > + * License. See the file "COPYING" in the main directory of this archive > + * for more details. > + * > + * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@xxxxxxxxxxxxxx> > + */ > +#ifndef __ASM_MACH_LOONGSON1_WAR_H > +#define __ASM_MACH_LOONGSON1_WAR_H > + > +#define R4600_V1_INDEX_ICACHEOP_WAR 0 > +#define R4600_V1_HIT_CACHEOP_WAR 0 > +#define R4600_V2_HIT_CACHEOP_WAR 0 > +#define R5432_CP0_INTERRUPT_WAR 0 > +#define BCM1250_M3_WAR 0 > +#define SIBYTE_1956_WAR 0 > +#define MIPS4K_ICACHE_REFILL_WAR 0 > +#define MIPS_CACHE_SYNC_WAR 0 > +#define TX49XX_ICACHE_INDEX_INV_WAR 0 > +#define RM9000_CDEX_SMP_WAR 0 > +#define ICACHE_REFILLS_WORKAROUND_WAR 0 > +#define R10000_LLSC_WAR 0 > +#define MIPS34K_MISSED_ITLB_WAR 0 > + > +#endif /* __ASM_MACH_LOONGSON1_WAR_H */ What about add a new cpu-feature-overrides.h for Loongson1, it may help a little to the kernel image size and boot speed. Please see arch/mips/include/asm/mach-loongson/cpu-feature-overrides.h and show_cpuinfo() function defined in arch/mips/kernel/proc.c > diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h > index bc01a02..b53d642 100644 > --- a/arch/mips/include/asm/module.h > +++ b/arch/mips/include/asm/module.h > @@ -116,6 +116,8 @@ search_module_dbetables(unsigned long addr) > #define MODULE_PROC_FAMILY "SB1 " > #elif defined CONFIG_CPU_LOONGSON2 > #define MODULE_PROC_FAMILY "LOONGSON2 " > +#elif defined CONFIG_CPU_LOONGSON1 > +#define MODULE_PROC_FAMILY "LOONGSON1 " > #elif defined CONFIG_CPU_CAVIUM_OCTEON > #define MODULE_PROC_FAMILY "OCTEON " > #elif defined CONFIG_CPU_XLR > diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c > index ebc0cd2..c886e0d 100644 > --- a/arch/mips/kernel/cpu-probe.c > +++ b/arch/mips/kernel/cpu-probe.c > @@ -37,6 +37,8 @@ > void (*cpu_wait)(void); > EXPORT_SYMBOL(cpu_wait); > > +static void __cpuinit decode_configs(struct cpuinfo_mips *c); > + > static void r3081_wait(void) > { > unsigned long cfg = read_c0_conf(); > @@ -190,6 +192,7 @@ void __init check_wait(void) > case CPU_CAVIUM_OCTEON_PLUS: > case CPU_CAVIUM_OCTEON2: > case CPU_JZRISC: > + case CPU_LOONGSON1: > cpu_wait = r4k_wait; > break; > > @@ -635,6 +638,18 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) > MIPS_CPU_32FPR; > c->tlbsize = 64; > break; > + case PRID_IMP_LOONGSON1: > + decode_configs(c); > + > + c->cputype = CPU_LOONGSON1; > + > + switch (c->processor_id & PRID_REV_MASK) { > + case PRID_REV_LOONGSON1B: > + __cpu_name[cpu] = "Loongson 1B"; > + break; > + } > + > + break; > } > } > > diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c > index e5ad09a..e316b0e 100644 > --- a/arch/mips/kernel/perf_event_mipsxx.c > +++ b/arch/mips/kernel/perf_event_mipsxx.c > @@ -1062,6 +1062,12 @@ init_hw_perf_events(void) > mipsxxcore_pmu.irq = irq; > mipspmu = &mipsxxcore_pmu; > break; > + case CPU_LOONGSON1: > + mipsxxcore_pmu.name = "mips/loongson1"; > + mipsxxcore_pmu.num_counters = counters; > + mipsxxcore_pmu.irq = irq; > + mipspmu = &mipsxxcore_pmu; > + break; > default: > pr_cont("Either hardware does not support performance " > "counters, or not yet implemented.\n"); > diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c > index 01eff7e..cd55823 100644 > --- a/arch/mips/kernel/traps.c > +++ b/arch/mips/kernel/traps.c > @@ -1241,6 +1241,7 @@ static inline void parity_protection_init(void) > break; > > case CPU_5KC: > + case CPU_LOONGSON1: > write_c0_ecc(0x80000000); > back_to_back_c0_hazard(); > /* Set the PE bit (bit 31) in the c0_errctl register. */ > diff --git a/arch/mips/loongson1/Kconfig b/arch/mips/loongson1/Kconfig > new file mode 100644 > index 0000000..c22ceac > --- /dev/null > +++ b/arch/mips/loongson1/Kconfig > @@ -0,0 +1,29 @@ > +if MACH_LOONGSON1 > + > +choice > + prompt "Machine Type" > + > +config LOONGSON1_LS1B > + bool "Loongson LS1B board" > + select ARCH_SPARSEMEM_ENABLE > + select CEVT_R4K > + select CSRC_R4K > + select SYS_HAS_CPU_LOONGSON1B > + select DMA_NONCOHERENT > + select BOOT_ELF32 > + select IRQ_CPU > + select SYS_SUPPORTS_32BIT_KERNEL > + select SYS_SUPPORTS_LITTLE_ENDIAN > + select SYS_SUPPORTS_HIGHMEM > + select SYS_HAS_EARLY_PRINTK > +# select USB_ARCH_HAS_OHCI > +# select USB_ARCH_HAS_EHCI > + > +endchoice > + > +#config LOONGSON_SUSPEND > +# bool > +# default y > +# depends on CPU_SUPPORTS_CPUFREQ && SUSPEND > + Do we need the above lines commented with #? > +endif # MACH_LOONGSON1 > diff --git a/arch/mips/loongson1/Makefile b/arch/mips/loongson1/Makefile > new file mode 100644 > index 0000000..e9123c2 > --- /dev/null > +++ b/arch/mips/loongson1/Makefile > @@ -0,0 +1,11 @@ > +# > +# Common code for all Loongson1 based systems > +# > + > +obj-$(CONFIG_MACH_LOONGSON1) += common/ > + > +# > +# Loongson LS1B board > +# > + > +obj-$(CONFIG_LOONGSON1_LS1B) += ls1b/ > diff --git a/arch/mips/loongson1/Platform b/arch/mips/loongson1/Platform > new file mode 100644 > index 0000000..92804c6 > --- /dev/null > +++ b/arch/mips/loongson1/Platform > @@ -0,0 +1,7 @@ > +cflags-$(CONFIG_CPU_LOONGSON1) += \ > + $(call cc-option,-march=mips32r2,-mips32r2 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \ > + -Wa,-mips32r2 -Wa,--trap > + > +platform-$(CONFIG_MACH_LOONGSON1) += loongson1/ > +cflags-$(CONFIG_MACH_LOONGSON1) += -I$(srctree)/arch/mips/include/asm/mach-loongson1 > +load-$(CONFIG_LOONGSON1_LS1B) += 0xffffffff80010000 > diff --git a/arch/mips/loongson1/common/Makefile b/arch/mips/loongson1/common/Makefile > new file mode 100644 > index 0000000..b279770 > --- /dev/null > +++ b/arch/mips/loongson1/common/Makefile > @@ -0,0 +1,5 @@ > +# > +# Makefile for common code of loongson1 based machines. > +# > + > +obj-y += clock.o irq.o platform.o prom.o reset.o setup.o > diff --git a/arch/mips/loongson1/common/clock.c b/arch/mips/loongson1/common/clock.c > new file mode 100644 > index 0000000..cd8d151 > --- /dev/null > +++ b/arch/mips/loongson1/common/clock.c > @@ -0,0 +1,165 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <linux/module.h> > +#include <linux/list.h> > +#include <linux/mutex.h> > +#include <linux/clk.h> > +#include <linux/err.h> > +#include <asm/clock.h> > +#include <asm/time.h> > + > +#include <loongson1.h> > + > +static LIST_HEAD(clocks); > +static DEFINE_MUTEX(clocks_mutex); > + > +struct clk *clk_get(struct device *dev, const char *name) > +{ > + struct clk *c; > + struct clk *ret = NULL; > + > + mutex_lock(&clocks_mutex); > + list_for_each_entry(c, &clocks, node) { > + if (!strcmp(c->name, name)) { > + ret = c; > + break; > + } > + } > + mutex_unlock(&clocks_mutex); > + > + return ret; > +} > +EXPORT_SYMBOL(clk_get); > + > +unsigned long clk_get_rate(struct clk *clk) > +{ > + return clk->rate; > +} > +EXPORT_SYMBOL(clk_get_rate); > + > +static void pll_clk_init(struct clk *clk) > +{ > + u32 pll; > + > + pll = __raw_readl(LS1_CLK_PLL_FREQ); > + clk->rate = (12 + (pll & 0x3f)) * 33 / 2 > + + ((pll >>8 ) & 0x3ff) * 33 / 1024 / 2; > + clk->rate *= 1000000; > +} > + > +static void cpu_clk_init(struct clk *clk) > +{ > + u32 pll, ctrl; > + > + pll = clk_get_rate(clk->parent); > + ctrl = __raw_readl(LS1_CLK_PLL_DIV) & DIV_CPU; > + clk->rate = pll / (ctrl >> DIV_CPU_SHIFT); > +} > + > +static void ddr_clk_init(struct clk *clk) > +{ > + u32 pll, ctrl; > + > + pll = clk_get_rate(clk->parent); > + ctrl = __raw_readl(LS1_CLK_PLL_DIV) & DIV_DDR; > + clk->rate = pll / (ctrl >> DIV_DDR_SHIFT); > +} > + > +static void dc_clk_init(struct clk *clk) > +{ > + u32 pll, ctrl; > + > + pll = clk_get_rate(clk->parent); > + ctrl = __raw_readl(LS1_CLK_PLL_DIV) & DIV_DC; > + clk->rate = pll / (ctrl >> DIV_DC_SHIFT); > +} > + > +static struct clk_ops pll_clk_ops = { > + .init = pll_clk_init, > +}; > + > +static struct clk_ops cpu_clk_ops = { > + .init = cpu_clk_init, > +}; > + > +static struct clk_ops ddr_clk_ops = { > + .init = ddr_clk_init, > +}; > + > +static struct clk_ops dc_clk_ops = { > + .init = dc_clk_init, > +}; > + > +static struct clk pll_clk = { > + .name = "pll", > + .ops = &pll_clk_ops, > +}; > + > +static struct clk cpu_clk = { > + .name = "cpu", > + .parent = &pll_clk, > + .ops = &cpu_clk_ops, > +}; > + > +static struct clk ddr_clk = { > + .name = "ddr", > + .parent = &pll_clk, > + .ops = &ddr_clk_ops, > +}; > + > +static struct clk dc_clk = { > + .name = "dc", > + .parent = &pll_clk, > + .ops = &dc_clk_ops, > +}; > + > +int clk_register(struct clk *clk) > +{ > + mutex_lock(&clocks_mutex); > + list_add(&clk->node, &clocks); > + if (clk->ops->init) > + clk->ops->init(clk); > + mutex_unlock(&clocks_mutex); > + > + return 0; > +} > +EXPORT_SYMBOL(clk_register); > + > +static struct clk *loongson1_clks[] = { > + &pll_clk, > + &cpu_clk, > + &ddr_clk, > + &dc_clk, > +}; > + > +int __init loongson1_clock_init(void) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(loongson1_clks); i++) > + clk_register(loongson1_clks[i]); > + > + return 0; > +} > + > +void __init plat_time_init(void) > +{ > + struct clk *clk; > + > + /* Initialize loongson1 clocks */ > + loongson1_clock_init(); > + > + /* setup mips r4k timer */ > + clk = clk_get(NULL, "cpu"); > + if (IS_ERR(clk)) > + panic("unable to get dc clock, err=%ld", PTR_ERR(clk)); > + > + mips_hpt_frequency = clk_get_rate(clk) / 2; > +} > diff --git a/arch/mips/loongson1/common/irq.c b/arch/mips/loongson1/common/irq.c > new file mode 100644 > index 0000000..688d7b9 > --- /dev/null > +++ b/arch/mips/loongson1/common/irq.c > @@ -0,0 +1,135 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <linux/interrupt.h> > +#include <linux/irq.h> > +#include <asm/irq_cpu.h> > + > +#include <loongson1.h> > +#include <irq.h> > + > +static void loongson1_irq_ack(struct irq_data *d) > +{ > + unsigned int bit = (d->irq - LOONGSON1_IRQ_BASE) & 0x1f; > + unsigned int n = (d->irq - LOONGSON1_IRQ_BASE) >> 5; > + > + __raw_writel(__raw_readl(LS1_INTC_INTCLR(n)) > + | (1 << bit), LS1_INTC_INTCLR(n)); > +} > + > +static void loongson1_irq_mask(struct irq_data *d) > +{ > + unsigned int bit = (d->irq - LOONGSON1_IRQ_BASE) & 0x1f; > + unsigned int n = (d->irq - LOONGSON1_IRQ_BASE) >> 5; > + > + __raw_writel(__raw_readl(LS1_INTC_INTIEN(n)) > + & ~(1 << bit), LS1_INTC_INTIEN(n)); > +} > + > +static void loongson1_irq_mask_ack(struct irq_data *d) > +{ > + unsigned int bit = (d->irq - LOONGSON1_IRQ_BASE) & 0x1f; > + unsigned int n = (d->irq - LOONGSON1_IRQ_BASE) >> 5; > + > + __raw_writel(__raw_readl(LS1_INTC_INTIEN(n)) > + & ~(1 << bit), LS1_INTC_INTIEN(n)); > + __raw_writel(__raw_readl(LS1_INTC_INTCLR(n)) > + | (1 << bit), LS1_INTC_INTCLR(n)); > +} > + > +static void loongson1_irq_unmask(struct irq_data *d) > +{ > + unsigned int bit = (d->irq - LOONGSON1_IRQ_BASE) & 0x1f; > + unsigned int n = (d->irq - LOONGSON1_IRQ_BASE) >> 5; > + > + __raw_writel(__raw_readl(LS1_INTC_INTIEN(n)) > + | (1 << bit), LS1_INTC_INTIEN(n)); > +} > + > +static struct irq_chip loongson1_irq_chip = { > + .name = "LOONGSON1-INTC", > + .irq_ack = loongson1_irq_ack, > + .irq_mask = loongson1_irq_mask, > + .irq_mask_ack = loongson1_irq_mask_ack, > + .irq_unmask = loongson1_irq_unmask, > +}; > + > +static void loongson1_irq_dispatch(int n) > +{ > + u32 int_status, irq; > + > + /* Get pending sources, masked by current enables */ > + int_status = __raw_readl(LS1_INTC_INTISR(n)) & > + __raw_readl(LS1_INTC_INTIEN(n)); > + > + if (int_status) { > + irq = LOONGSON1_IRQ(n, __ffs(int_status)); > + do_IRQ(irq); > + } > +} > + > +asmlinkage void plat_irq_dispatch(void) > +{ > + unsigned int pending; > + > + pending = read_c0_cause() & read_c0_status() & ST0_IM; > + > + if (pending & CAUSEF_IP7) > + do_IRQ(TIMER_IRQ); > + else if (pending & CAUSEF_IP2) > + loongson1_irq_dispatch(0); /* INT0 */ > + else if (pending & CAUSEF_IP3) > + loongson1_irq_dispatch(1); /* INT1 */ > + else if (pending & CAUSEF_IP4) > + loongson1_irq_dispatch(2); /* INT2 */ > + else if (pending & CAUSEF_IP5) > + loongson1_irq_dispatch(3); /* INT3 */ > + else if (pending & CAUSEF_IP6) > + loongson1_irq_dispatch(4); /* INT4 */ > + else > + spurious_interrupt(); > + > +} > + > +struct irqaction cascade_irqaction = { > + .handler = no_action, > + .name = "cascade", > +}; The short no_action handler should be unthreaded, please mark it with the following line. + .flags = IRQF_NO_THREAD, Please see the kernel patch "mips: i8259: Mark cascade interrupt non-threaded" as a reference in MIPS mailing list or patchwork sent by Thomas. > + > +static void __init loongson1_irq_init(int base) > +{ > + int n; > + > + /* Disable interrupts and clear pending, > + * setup all IRQs as high level triggered > + */ > + for (n = 0; n < 4; n++) { > + __raw_writel(0x0, LS1_INTC_INTIEN(n)); > + __raw_writel(0xffffffff, LS1_INTC_INTCLR(n)); > + __raw_writel(0xffffffff, LS1_INTC_INTPOL(n)); > + __raw_writel(0x0, LS1_INTC_INTEDGE(n)); > + } > + > + > + for (n = base; n < NR_IRQS; n++) { > + irq_set_chip_and_handler(n, &loongson1_irq_chip, > + handle_level_irq); > + } > + > + setup_irq(INT0_IRQ, &cascade_irqaction); > + setup_irq(INT1_IRQ, &cascade_irqaction); > + setup_irq(INT2_IRQ, &cascade_irqaction); > + setup_irq(INT3_IRQ, &cascade_irqaction); > +} > + > +void __init arch_init_irq(void) > +{ > + mips_cpu_irq_init(); > + loongson1_irq_init(LOONGSON1_IRQ_BASE); > +} > diff --git a/arch/mips/loongson1/common/platform.c b/arch/mips/loongson1/common/platform.c > new file mode 100644 > index 0000000..4ea477d > --- /dev/null > +++ b/arch/mips/loongson1/common/platform.c > @@ -0,0 +1,50 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <linux/clk.h> > +#include <linux/err.h> > +#include <linux/serial_8250.h> > + > +#include <loongson1.h> > + > +#define LOONGSON1_UART_PORT(_id) \ > + { \ > + .mapbase = LOONGSON1_UART ## _id ## _BASE, \ > + .membase = (void *)(LOONGSON1_UART ## _id ## _BASE), \ > + .irq = LOONGSON1_UART ## _id ## _IRQ, \ > + .iotype = UPIO_MEM, \ > + .flags = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE, \ > + .type = PORT_16550A, \ > + } > + > +static struct plat_serial8250_port loongson1_serial8250_port[] = { > + LOONGSON1_UART_PORT(0), > + {}, > +}; > + > +struct platform_device loongson1_uart_device = { > + .name = "serial8250", > + .id = PLAT8250_DEV_PLATFORM, > + .dev = { > + .platform_data = loongson1_serial8250_port, > + }, > +}; > + > +void __init loongson1_serial_setup(void) > +{ > + struct clk *clk; > + struct plat_serial8250_port *p; > + > + clk = clk_get(NULL, "dc"); > + if (IS_ERR(clk)) > + panic("unable to get dc clock, err=%ld", PTR_ERR(clk)); > + > + for (p = loongson1_serial8250_port; p->flags != 0; ++p) > + p->uartclk = clk_get_rate(clk); > +} > diff --git a/arch/mips/loongson1/common/prom.c b/arch/mips/loongson1/common/prom.c > new file mode 100644 > index 0000000..a7422f4 > --- /dev/null > +++ b/arch/mips/loongson1/common/prom.c > @@ -0,0 +1,89 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * Modified from arch/mips/pnx833x/common/prom.c. > + * > + * 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. > + */ > + > +#include <linux/serial_reg.h> > +#include <asm/bootinfo.h> > + > +#include <loongson1.h> > +#include <prom.h> > + > +int prom_argc; > +char **prom_argv, **prom_envp; > +unsigned long memsize, highmemsize; > + > +char *prom_getenv(char *envname) > +{ > + extern char **prom_envp; > + char **env = prom_envp; > + int i; > + > + i = strlen(envname); > + > + while (*env) { > + if (strncmp(envname, *env, i) == 0 && *(*env+i) == '=') > + return *env + i + 1; > + env++; > + } > + > + return 0; > +} > + > +static inline unsigned long env_or_default(char *env, unsigned long dfl) > +{ > + char *str = prom_getenv(env); > + return str ? simple_strtol(str, 0, 0) : dfl; > +} > + > +void __init prom_init_cmdline(void) > +{ > + char *c = &(arcs_cmdline[0]); > + int i; > + > + for (i = 1; i < prom_argc; i++) { > + strcpy(c, prom_argv[i]); > + c += strlen(prom_argv[i]); > + if (i < prom_argc-1) > + *c++ = ' '; > + } > + *c = 0; > +} > + > +void __init prom_init(void) > +{ > + prom_argc = fw_arg0; > + prom_argv = (char **)fw_arg1; > + prom_envp = (char **)fw_arg2; > + > + prom_init_cmdline(); > + > + memsize = env_or_default("memsize", DEFAULT_MEMSIZE); > + highmemsize = env_or_default("highmemsize", 0x0); > +} > + > +void __init prom_free_prom_memory(void) > +{ > +} > + > +#define UART_BASE LOONGSON1_UART0_BASE > +#define PORT(base, offset) (u8 *)(base + offset) > + > +void __init prom_putchar(char c) > +{ > + int timeout; > + > + timeout = 1024; > + > + while (((readb(PORT(UART_BASE, UART_LSR)) & UART_LSR_THRE) == 0) > + && (timeout-- > 0)) > + ; > + > + writeb(c, PORT(UART_BASE, UART_TX)); > +} > diff --git a/arch/mips/loongson1/common/reset.c b/arch/mips/loongson1/common/reset.c > new file mode 100644 > index 0000000..75f550f > --- /dev/null > +++ b/arch/mips/loongson1/common/reset.c > @@ -0,0 +1,46 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <linux/io.h> > +#include <linux/pm.h> > +#include <asm/reboot.h> > + > +#include <loongson1.h> > + > +static void loongson1_restart(char *command) > +{ > + __raw_writel(0x1, LS1_WDT_EN); > + __raw_writel(0x5000000, LS1_WDT_TIMER); > + __raw_writel(0x1, LS1_WDT_SET); > +} > + > +static void loongson1_halt(void) > +{ > + pr_notice("\n\n** You can safely turn off the power now **\n\n"); > + while (1) { > + if (cpu_wait) > + cpu_wait(); > + } > +} > + > +static void loongson1_power_off(void) > +{ > + loongson1_halt(); > +} > + > +static int __init loongson1_reboot_setup(void) > +{ > + _machine_restart = loongson1_restart; > + _machine_halt = loongson1_halt; > + pm_power_off = loongson1_power_off; > + > + return 0; > +} > + > +arch_initcall(loongson1_reboot_setup); > diff --git a/arch/mips/loongson1/common/setup.c b/arch/mips/loongson1/common/setup.c > new file mode 100644 > index 0000000..62128cc > --- /dev/null > +++ b/arch/mips/loongson1/common/setup.c > @@ -0,0 +1,29 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <asm/bootinfo.h> > + > +#include <prom.h> > + > +void __init plat_mem_setup(void) > +{ > + add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM); > +} > + > +const char *get_system_type(void) > +{ > + unsigned int processor_id = (¤t_cpu_data)->processor_id; > + > + switch (processor_id & PRID_REV_MASK) { > + case PRID_REV_LOONGSON1B: > + return "LOONGSON LS1B"; > + default: > + return "LOONGSON (unknown)"; > + } > +} > diff --git a/arch/mips/loongson1/ls1b/Makefile b/arch/mips/loongson1/ls1b/Makefile > new file mode 100644 > index 0000000..891eac4 > --- /dev/null > +++ b/arch/mips/loongson1/ls1b/Makefile > @@ -0,0 +1,5 @@ > +# > +# Makefile for loongson1B based machines. > +# > + > +obj-y += board.o > diff --git a/arch/mips/loongson1/ls1b/board.c b/arch/mips/loongson1/ls1b/board.c > new file mode 100644 > index 0000000..b1a602f > --- /dev/null > +++ b/arch/mips/loongson1/ls1b/board.c > @@ -0,0 +1,30 @@ > +/* > + * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@xxxxxxxxx> > + * > + * 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. > + */ > + > +#include <platform.h> > + > +#include <linux/serial_8250.h> > +#include <loongson1.h> > + > +static struct platform_device *loongson1_platform_devices[] __initdata = { > + &loongson1_uart_device, > +}; > + > +static int __init loongson1_platform_init(void) > +{ > + int err; > + > + loongson1_serial_setup(); > + > + err = platform_add_devices(loongson1_platform_devices, > + ARRAY_SIZE(loongson1_platform_devices)); > + return err; > +} > + > +arch_initcall(loongson1_platform_init); > diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c > index d1f2d4c..99216f0 100644 > --- a/arch/mips/oprofile/common.c > +++ b/arch/mips/oprofile/common.c > @@ -89,6 +89,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) > case CPU_R10000: > case CPU_R12000: > case CPU_R14000: > + case CPU_LOONGSON1: > lmodel = &op_model_mipsxx_ops; > break; > > diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c > index 54759f1..03be670 100644 > --- a/arch/mips/oprofile/op_model_mipsxx.c > +++ b/arch/mips/oprofile/op_model_mipsxx.c > @@ -365,6 +365,10 @@ static int __init mipsxx_init(void) > op_model_mipsxx_ops.cpu_type = "mips/sb1"; > break; > > + case CPU_LOONGSON1: > + op_model_mipsxx_ops.cpu_type = "mips/loongson1"; > + break; > + > default: > printk(KERN_ERR "Profiling unsupported for this CPU\n"); > > -- > 1.7.1 > > It may still be possible to reduce duplications if we consider applying dtb for Loongson ;) Best Regards, Wu Zhangjin