MIPS: Loongson: Split common loongson source code out
To share common loongson source code between all of the loongson-based machines. there is a need to split it out of the fuloong-2e/ directory. at the same time, other according tuning is needed. the machine-specific parts are defined as macros in relative header file, pci.h, mem.h, machine.h. Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
8e4971175a
commit
85749d24bc
24 changed files with 351 additions and 133 deletions
|
@ -174,30 +174,15 @@ config LASAT
|
||||||
select SYS_SUPPORTS_64BIT_KERNEL if BROKEN
|
select SYS_SUPPORTS_64BIT_KERNEL if BROKEN
|
||||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||||
|
|
||||||
config LEMOTE_FULOONG2E
|
config MACH_LOONGSON
|
||||||
bool "Lemote Fuloong2e mini-PC"
|
bool "Loongson family of machines"
|
||||||
select ARCH_SPARSEMEM_ENABLE
|
|
||||||
select CEVT_R4K
|
|
||||||
select CSRC_R4K
|
|
||||||
select SYS_HAS_CPU_LOONGSON2
|
|
||||||
select DMA_NONCOHERENT
|
|
||||||
select BOOT_ELF32
|
|
||||||
select BOARD_SCACHE
|
|
||||||
select HAVE_STD_PC_SERIAL_PORT
|
|
||||||
select HW_HAS_PCI
|
|
||||||
select I8259
|
|
||||||
select ISA
|
|
||||||
select IRQ_CPU
|
|
||||||
select SYS_SUPPORTS_32BIT_KERNEL
|
|
||||||
select SYS_SUPPORTS_64BIT_KERNEL
|
|
||||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
||||||
select SYS_SUPPORTS_HIGHMEM
|
|
||||||
select SYS_HAS_EARLY_PRINTK
|
|
||||||
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
|
||||||
select CPU_HAS_WB
|
|
||||||
help
|
help
|
||||||
Lemote Fuloong2e mini-PC board based on the Chinese Loongson-2E CPU and
|
This enables the support of Loongson family of machines.
|
||||||
an FPGA northbridge
|
|
||||||
|
Loongson is a family of general-purpose MIPS-compatible CPUs.
|
||||||
|
developed at Institute of Computing Technology (ICT),
|
||||||
|
Chinese Academy of Sciences (CAS) in the People's Republic
|
||||||
|
of China. The chief architect is Professor Weiwu Hu.
|
||||||
|
|
||||||
config MIPS_MALTA
|
config MIPS_MALTA
|
||||||
bool "MIPS Malta board"
|
bool "MIPS Malta board"
|
||||||
|
@ -668,6 +653,7 @@ source "arch/mips/sibyte/Kconfig"
|
||||||
source "arch/mips/txx9/Kconfig"
|
source "arch/mips/txx9/Kconfig"
|
||||||
source "arch/mips/vr41xx/Kconfig"
|
source "arch/mips/vr41xx/Kconfig"
|
||||||
source "arch/mips/cavium-octeon/Kconfig"
|
source "arch/mips/cavium-octeon/Kconfig"
|
||||||
|
source "arch/mips/loongson/Kconfig"
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
|
|
@ -314,11 +314,12 @@ cflags-$(CONFIG_WR_PPMC) += -I$(srctree)/arch/mips/include/asm/mach-wrppmc
|
||||||
load-$(CONFIG_WR_PPMC) += 0xffffffff80100000
|
load-$(CONFIG_WR_PPMC) += 0xffffffff80100000
|
||||||
|
|
||||||
#
|
#
|
||||||
# lemote fuloong2e mini-PC board
|
# Loongson family
|
||||||
#
|
#
|
||||||
core-$(CONFIG_LEMOTE_FULOONG2E) +=arch/mips/loongson/fuloong-2e/
|
core-$(CONFIG_MACH_LOONGSON) +=arch/mips/loongson/
|
||||||
|
cflags-$(CONFIG_MACH_LOONGSON) += -I$(srctree)/arch/mips/include/asm/mach-loongson \
|
||||||
|
-mno-branch-likely
|
||||||
load-$(CONFIG_LEMOTE_FULOONG2E) +=0xffffffff80100000
|
load-$(CONFIG_LEMOTE_FULOONG2E) +=0xffffffff80100000
|
||||||
cflags-$(CONFIG_LEMOTE_FULOONG2E) += -I$(srctree)/arch/mips/include/asm/mach-loongson/
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# MIPS Malta board
|
# MIPS Malta board
|
||||||
|
|
|
@ -21,6 +21,10 @@
|
||||||
/* loongson internal northbridge initialization */
|
/* loongson internal northbridge initialization */
|
||||||
extern void bonito_irq_init(void);
|
extern void bonito_irq_init(void);
|
||||||
|
|
||||||
|
/* machine-specific reboot/halt operation */
|
||||||
|
extern void mach_prepare_reboot(void);
|
||||||
|
extern void mach_prepare_shutdown(void);
|
||||||
|
|
||||||
/* environment arguments from bootloader */
|
/* environment arguments from bootloader */
|
||||||
extern unsigned long bus_clock, cpu_clock_freq;
|
extern unsigned long bus_clock, cpu_clock_freq;
|
||||||
extern unsigned long memsize, highmemsize;
|
extern unsigned long memsize, highmemsize;
|
||||||
|
@ -30,6 +34,13 @@ extern void __init prom_init_memory(void);
|
||||||
extern void __init prom_init_cmdline(void);
|
extern void __init prom_init_cmdline(void);
|
||||||
extern void __init prom_init_env(void);
|
extern void __init prom_init_env(void);
|
||||||
|
|
||||||
|
/* irq operation functions */
|
||||||
|
extern void bonito_irqdispatch(void);
|
||||||
|
extern void __init bonito_irq_init(void);
|
||||||
|
extern void __init set_irq_trigger_mode(void);
|
||||||
|
extern void __init mach_init_irq(void);
|
||||||
|
extern void mach_irq_dispatch(unsigned int pending);
|
||||||
|
|
||||||
/* PCI Configuration Registers */
|
/* PCI Configuration Registers */
|
||||||
#define LOONGSON_PCI_ISR4C BONITO_PCI_REG(0x4c)
|
#define LOONGSON_PCI_ISR4C BONITO_PCI_REG(0x4c)
|
||||||
|
|
||||||
|
|
22
arch/mips/include/asm/mach-loongson/machine.h
Normal file
22
arch/mips/include/asm/mach-loongson/machine.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
|
||||||
|
* Author: Wu Zhangjin <wuzj@lemote.com>
|
||||||
|
*
|
||||||
|
* 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_LOONGSON_MACHINE_H
|
||||||
|
#define __ASM_MACH_LOONGSON_MACHINE_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_LEMOTE_FULOONG2E
|
||||||
|
|
||||||
|
#define LOONGSON_UART_BASE (BONITO_PCIIO_BASE + 0x3f8)
|
||||||
|
|
||||||
|
#define LOONGSON_MACHNAME "lemote-fuloong-2e-box"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASM_MACH_LOONGSON_MACHINE_H */
|
30
arch/mips/include/asm/mach-loongson/mem.h
Normal file
30
arch/mips/include/asm/mach-loongson/mem.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
|
||||||
|
* Author: Wu Zhangjin <wuzj@lemote.com>
|
||||||
|
*
|
||||||
|
* 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_LOONGSON_MEM_H
|
||||||
|
#define __ASM_MACH_LOONGSON_MEM_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On Lemote Loongson 2e
|
||||||
|
*
|
||||||
|
* the high memory space starts from 512M.
|
||||||
|
* the peripheral registers reside between 0x1000:0000 and 0x2000:0000.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_LEMOTE_FULOONG2E
|
||||||
|
|
||||||
|
#define LOONGSON_HIGHMEM_START 0x20000000
|
||||||
|
|
||||||
|
#define LOONGSON_MMIO_MEM_START 0x10000000
|
||||||
|
#define LOONGSON_MMIO_MEM_END 0x20000000
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASM_MACH_LOONGSON_MEM_H */
|
|
@ -24,8 +24,14 @@
|
||||||
|
|
||||||
extern struct pci_ops bonito64_pci_ops;
|
extern struct pci_ops bonito64_pci_ops;
|
||||||
|
|
||||||
#define LOONGSON2E_PCI_MEM_START BONITO_PCILO1_BASE
|
#ifdef CONFIG_LEMOTE_FULOONG2E
|
||||||
#define LOONGSON2E_PCI_MEM_END (BONITO_PCILO1_BASE + 0x04000000 * 2)
|
|
||||||
#define LOONGSON2E_PCI_IO_START 0x00004000UL
|
/* this pci memory space is mapped by pcimap in pci.c */
|
||||||
|
#define LOONGSON_PCI_MEM_START BONITO_PCILO1_BASE
|
||||||
|
#define LOONGSON_PCI_MEM_END (BONITO_PCILO1_BASE + 0x04000000 * 2)
|
||||||
|
/* this is an offset from mips_io_port_base */
|
||||||
|
#define LOONGSON_PCI_IO_START 0x00004000UL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* !__ASM_MACH_LOONGSON_PCI_H_ */
|
#endif /* !__ASM_MACH_LOONGSON_PCI_H_ */
|
||||||
|
|
31
arch/mips/loongson/Kconfig
Normal file
31
arch/mips/loongson/Kconfig
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
choice
|
||||||
|
prompt "Machine Type"
|
||||||
|
depends on MACH_LOONGSON
|
||||||
|
|
||||||
|
config LEMOTE_FULOONG2E
|
||||||
|
bool "Lemote Fuloong(2e) mini-PC"
|
||||||
|
select ARCH_SPARSEMEM_ENABLE
|
||||||
|
select CEVT_R4K
|
||||||
|
select CSRC_R4K
|
||||||
|
select SYS_HAS_CPU_LOONGSON2
|
||||||
|
select DMA_NONCOHERENT
|
||||||
|
select BOOT_ELF32
|
||||||
|
select BOARD_SCACHE
|
||||||
|
select HW_HAS_PCI
|
||||||
|
select I8259
|
||||||
|
select ISA
|
||||||
|
select IRQ_CPU
|
||||||
|
select SYS_SUPPORTS_32BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_64BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||||
|
select SYS_SUPPORTS_HIGHMEM
|
||||||
|
select SYS_HAS_EARLY_PRINTK
|
||||||
|
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
|
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
||||||
|
select CPU_HAS_WB
|
||||||
|
help
|
||||||
|
Lemote Fuloong(2e) mini-PC board based on the Chinese Loongson-2E CPU and
|
||||||
|
an FPGA northbridge
|
||||||
|
|
||||||
|
Lemote Fuloong(2e) mini PC have a VIA686B south bridge.
|
||||||
|
endchoice
|
11
arch/mips/loongson/Makefile
Normal file
11
arch/mips/loongson/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#
|
||||||
|
# Common code for all Loongson based systems
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_MACH_LOONGSON) += common/
|
||||||
|
|
||||||
|
#
|
||||||
|
# Lemote Fuloong mini-PC (Loongson 2E-based)
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_LEMOTE_FULOONG2E) += fuloong-2e/
|
11
arch/mips/loongson/common/Makefile
Normal file
11
arch/mips/loongson/common/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#
|
||||||
|
# Makefile for loongson based machines.
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
|
||||||
|
pci.o bonito-irq.o mem.o
|
||||||
|
|
||||||
|
#
|
||||||
|
# Early printk support
|
||||||
|
#
|
||||||
|
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
|
@ -12,8 +12,7 @@
|
||||||
#include <linux/serial_reg.h>
|
#include <linux/serial_reg.h>
|
||||||
|
|
||||||
#include <loongson.h>
|
#include <loongson.h>
|
||||||
|
#include <machine.h>
|
||||||
#define UART_BASE (BONITO_PCIIO_BASE + 0x3f8)
|
|
||||||
|
|
||||||
#define PORT(base, offset) (u8 *)(base + offset)
|
#define PORT(base, offset) (u8 *)(base + offset)
|
||||||
|
|
||||||
|
@ -30,7 +29,7 @@ static inline void serial_out(phys_addr_t base, int offset, int value)
|
||||||
void prom_putchar(char c)
|
void prom_putchar(char c)
|
||||||
{
|
{
|
||||||
phys_addr_t uart_base =
|
phys_addr_t uart_base =
|
||||||
(phys_addr_t) ioremap_nocache(UART_BASE, 8);
|
(phys_addr_t) ioremap_nocache(LOONGSON_UART_BASE, 8);
|
||||||
|
|
||||||
while ((serial_in(uart_base, UART_LSR) & UART_LSR_THRE) == 0)
|
while ((serial_in(uart_base, UART_LSR) & UART_LSR_THRE) == 0)
|
||||||
;
|
;
|
74
arch/mips/loongson/common/irq.c
Normal file
74
arch/mips/loongson/common/irq.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
|
||||||
|
* Author: Fuxin Zhang, zhangfx@lemote.com
|
||||||
|
*
|
||||||
|
* 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/delay.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
|
#include <loongson.h>
|
||||||
|
/*
|
||||||
|
* the first level int-handler will jump here if it is a bonito irq
|
||||||
|
*/
|
||||||
|
void bonito_irqdispatch(void)
|
||||||
|
{
|
||||||
|
u32 int_status;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* workaround the IO dma problem: let cpu looping to allow DMA finish */
|
||||||
|
int_status = BONITO_INTISR;
|
||||||
|
if (int_status & (1 << 10)) {
|
||||||
|
while (int_status & (1 << 10)) {
|
||||||
|
udelay(1);
|
||||||
|
int_status = BONITO_INTISR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get pending sources, masked by current enables */
|
||||||
|
int_status = BONITO_INTISR & BONITO_INTEN;
|
||||||
|
|
||||||
|
if (int_status != 0) {
|
||||||
|
i = __ffs(int_status);
|
||||||
|
int_status &= ~(1 << i);
|
||||||
|
do_IRQ(BONITO_IRQ_BASE + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int pending;
|
||||||
|
|
||||||
|
pending = read_c0_cause() & read_c0_status() & ST0_IM;
|
||||||
|
|
||||||
|
/* machine-specific plat_irq_dispatch */
|
||||||
|
mach_irq_dispatch(pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init arch_init_irq(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Clear all of the interrupts while we change the able around a bit.
|
||||||
|
* int-handler is not on bootstrap
|
||||||
|
*/
|
||||||
|
clear_c0_status(ST0_IM | ST0_BEV);
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
|
/* setting irq trigger mode */
|
||||||
|
set_irq_trigger_mode();
|
||||||
|
|
||||||
|
/* no steer */
|
||||||
|
BONITO_INTSTEER = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mask out all interrupt by writing "1" to all bit position in
|
||||||
|
* the interrupt reset reg.
|
||||||
|
*/
|
||||||
|
BONITO_INTENCLR = ~0;
|
||||||
|
|
||||||
|
/* machine specific irq init */
|
||||||
|
mach_init_irq();
|
||||||
|
}
|
|
@ -8,8 +8,10 @@
|
||||||
* option) any later version.
|
* option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
const char *get_system_type(void)
|
const char *get_system_type(void)
|
||||||
{
|
{
|
||||||
return "lemote-fuloong-2e-box";
|
return LOONGSON_MACHNAME;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,13 +11,15 @@
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
#include <loongson.h>
|
#include <loongson.h>
|
||||||
|
#include <mem.h>
|
||||||
|
|
||||||
void __init prom_init_memory(void)
|
void __init prom_init_memory(void)
|
||||||
{
|
{
|
||||||
add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM);
|
add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM);
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
if (highmemsize > 0)
|
if (highmemsize > 0)
|
||||||
add_memory_region(0x20000000, highmemsize << 20, BOOT_MEM_RAM);
|
add_memory_region(LOONGSON_HIGHMEM_START,
|
||||||
|
highmemsize << 20, BOOT_MEM_RAM);
|
||||||
#endif /* CONFIG_64BIT */
|
#endif /* CONFIG_64BIT */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,10 +29,7 @@ int __uncached_access(struct file *file, unsigned long addr)
|
||||||
if (file->f_flags & O_SYNC)
|
if (file->f_flags & O_SYNC)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
|
||||||
* On the Lemote Loongson 2e system, the peripheral registers
|
|
||||||
* reside between 0x1000:0000 and 0x2000:0000.
|
|
||||||
*/
|
|
||||||
return addr >= __pa(high_memory) ||
|
return addr >= __pa(high_memory) ||
|
||||||
((addr >= 0x10000000) && (addr < 0x20000000));
|
((addr >= LOONGSON_MMIO_MEM_START) &&
|
||||||
|
(addr < LOONGSON_MMIO_MEM_END));
|
||||||
}
|
}
|
|
@ -12,24 +12,24 @@
|
||||||
#include <pci.h>
|
#include <pci.h>
|
||||||
#include <loongson.h>
|
#include <loongson.h>
|
||||||
|
|
||||||
static struct resource loongson2e_pci_mem_resource = {
|
static struct resource loongson_pci_mem_resource = {
|
||||||
.name = "LOONGSON2E PCI MEM",
|
.name = "pci memory space",
|
||||||
.start = LOONGSON2E_PCI_MEM_START,
|
.start = LOONGSON_PCI_MEM_START,
|
||||||
.end = LOONGSON2E_PCI_MEM_END,
|
.end = LOONGSON_PCI_MEM_END,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource loongson2e_pci_io_resource = {
|
static struct resource loongson_pci_io_resource = {
|
||||||
.name = "LOONGSON2E PCI IO MEM",
|
.name = "pci io space",
|
||||||
.start = LOONGSON2E_PCI_IO_START,
|
.start = LOONGSON_PCI_IO_START,
|
||||||
.end = IO_SPACE_LIMIT,
|
.end = IO_SPACE_LIMIT,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_IO,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_controller loongson2e_pci_controller = {
|
static struct pci_controller loongson_pci_controller = {
|
||||||
.pci_ops = &bonito64_pci_ops,
|
.pci_ops = &bonito64_pci_ops,
|
||||||
.io_resource = &loongson2e_pci_io_resource,
|
.io_resource = &loongson_pci_io_resource,
|
||||||
.mem_resource = &loongson2e_pci_mem_resource,
|
.mem_resource = &loongson_pci_mem_resource,
|
||||||
.mem_offset = 0x00000000UL,
|
.mem_offset = 0x00000000UL,
|
||||||
.io_offset = 0x00000000UL,
|
.io_offset = 0x00000000UL,
|
||||||
};
|
};
|
||||||
|
@ -73,9 +73,9 @@ static int __init pcibios_init(void)
|
||||||
{
|
{
|
||||||
setup_pcimap();
|
setup_pcimap();
|
||||||
|
|
||||||
loongson2e_pci_controller.io_map_base = mips_io_port_base;
|
loongson_pci_controller.io_map_base = mips_io_port_base;
|
||||||
|
|
||||||
register_pci_controller(&loongson2e_pci_controller);
|
register_pci_controller(&loongson_pci_controller);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
44
arch/mips/loongson/common/reset.c
Normal file
44
arch/mips/loongson/common/reset.c
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
|
||||||
|
* Author: Fuxin Zhang, zhangfx@lemote.com
|
||||||
|
* Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
|
||||||
|
* Author: Zhangjin Wu, wuzj@lemote.com
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
|
|
||||||
|
#include <asm/reboot.h>
|
||||||
|
|
||||||
|
#include <loongson.h>
|
||||||
|
|
||||||
|
static void loongson_restart(char *command)
|
||||||
|
{
|
||||||
|
/* do preparation for reboot */
|
||||||
|
mach_prepare_reboot();
|
||||||
|
|
||||||
|
/* reboot via jumping to boot base address */
|
||||||
|
((void (*)(void))ioremap_nocache(BONITO_BOOT_BASE, 4)) ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void loongson_halt(void)
|
||||||
|
{
|
||||||
|
mach_prepare_shutdown();
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init mips_reboot_setup(void)
|
||||||
|
{
|
||||||
|
_machine_restart = loongson_restart;
|
||||||
|
_machine_halt = loongson_halt;
|
||||||
|
pm_power_off = loongson_halt;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(mips_reboot_setup);
|
58
arch/mips/loongson/common/setup.c
Normal file
58
arch/mips/loongson/common/setup.c
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
|
||||||
|
* Author: Fuxin Zhang, zhangfx@lemote.com
|
||||||
|
*
|
||||||
|
* 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 <asm/wbflush.h>
|
||||||
|
|
||||||
|
#include <loongson.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_VT
|
||||||
|
#include <linux/console.h>
|
||||||
|
#include <linux/screen_info.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void (*__wbflush)(void);
|
||||||
|
EXPORT_SYMBOL(__wbflush);
|
||||||
|
|
||||||
|
static void wbflush_loongson(void)
|
||||||
|
{
|
||||||
|
asm(".set\tpush\n\t"
|
||||||
|
".set\tnoreorder\n\t"
|
||||||
|
".set mips3\n\t"
|
||||||
|
"sync\n\t"
|
||||||
|
"nop\n\t"
|
||||||
|
".set\tpop\n\t"
|
||||||
|
".set mips0\n\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init plat_mem_setup(void)
|
||||||
|
{
|
||||||
|
__wbflush = wbflush_loongson;
|
||||||
|
|
||||||
|
#ifdef CONFIG_VT
|
||||||
|
#if defined(CONFIG_VGA_CONSOLE)
|
||||||
|
conswitchp = &vga_con;
|
||||||
|
|
||||||
|
screen_info = (struct screen_info) {
|
||||||
|
0, 25, /* orig-x, orig-y */
|
||||||
|
0, /* unused */
|
||||||
|
0, /* orig-video-page */
|
||||||
|
0, /* orig-video-mode */
|
||||||
|
80, /* orig-video-cols */
|
||||||
|
0, 0, 0, /* ega_ax, ega_bx, ega_cx */
|
||||||
|
25, /* orig-video-lines */
|
||||||
|
VIDEO_TYPE_VGAC, /* orig-video-isVGA */
|
||||||
|
16 /* orig-video-points */
|
||||||
|
};
|
||||||
|
#elif defined(CONFIG_DUMMY_CONSOLE)
|
||||||
|
conswitchp = &dummy_con;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -2,12 +2,6 @@
|
||||||
# Makefile for Lemote Fuloong2e mini-PC board.
|
# Makefile for Lemote Fuloong2e mini-PC board.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y += setup.o init.o reset.o irq.o pci.o bonito-irq.o mem.o \
|
obj-y += irq.o reset.o machtype.o
|
||||||
env.o cmdline.o time.o machtype.o
|
|
||||||
|
|
||||||
#
|
|
||||||
# Early printk support
|
|
||||||
#
|
|
||||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
|
||||||
|
|
||||||
EXTRA_CFLAGS += -Werror
|
EXTRA_CFLAGS += -Werror
|
||||||
|
|
|
@ -7,39 +7,12 @@
|
||||||
* Free Software Foundation; either version 2 of the License, or (at your
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
* option) any later version.
|
* option) any later version.
|
||||||
*/
|
*/
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include <asm/irq_cpu.h>
|
#include <asm/irq_cpu.h>
|
||||||
#include <asm/i8259.h>
|
#include <asm/i8259.h>
|
||||||
|
|
||||||
#include <loongson.h>
|
#include <loongson.h>
|
||||||
/*
|
|
||||||
* the first level int-handler will jump here if it is a bonito irq
|
|
||||||
*/
|
|
||||||
static void bonito_irqdispatch(void)
|
|
||||||
{
|
|
||||||
u32 int_status;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* workaround the IO dma problem: let cpu looping to allow DMA finish */
|
|
||||||
int_status = BONITO_INTISR;
|
|
||||||
if (int_status & (1 << 10)) {
|
|
||||||
while (int_status & (1 << 10)) {
|
|
||||||
udelay(1);
|
|
||||||
int_status = BONITO_INTISR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get pending sources, masked by current enables */
|
|
||||||
int_status = BONITO_INTISR & BONITO_INTEN;
|
|
||||||
|
|
||||||
if (int_status != 0) {
|
|
||||||
i = __ffs(int_status);
|
|
||||||
int_status &= ~(1 << i);
|
|
||||||
do_IRQ(BONITO_IRQ_BASE + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i8259_irqdispatch(void)
|
static void i8259_irqdispatch(void)
|
||||||
{
|
{
|
||||||
|
@ -52,10 +25,8 @@ static void i8259_irqdispatch(void)
|
||||||
spurious_interrupt();
|
spurious_interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void plat_irq_dispatch(void)
|
asmlinkage void mach_irq_dispatch(unsigned int pending)
|
||||||
{
|
{
|
||||||
unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
|
|
||||||
|
|
||||||
if (pending & CAUSEF_IP7)
|
if (pending & CAUSEF_IP7)
|
||||||
do_IRQ(MIPS_CPU_IRQ_BASE + 7);
|
do_IRQ(MIPS_CPU_IRQ_BASE + 7);
|
||||||
else if (pending & CAUSEF_IP6) /* perf counter loverflow */
|
else if (pending & CAUSEF_IP6) /* perf counter loverflow */
|
||||||
|
@ -73,26 +44,15 @@ static struct irqaction cascade_irqaction = {
|
||||||
.name = "cascade",
|
.name = "cascade",
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init arch_init_irq(void)
|
void __init set_irq_trigger_mode(void)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Clear all of the interrupts while we change the able around a bit.
|
|
||||||
* int-handler is not on bootstrap
|
|
||||||
*/
|
|
||||||
clear_c0_status(ST0_IM | ST0_BEV);
|
|
||||||
local_irq_disable();
|
|
||||||
|
|
||||||
/* most bonito irq should be level triggered */
|
/* most bonito irq should be level triggered */
|
||||||
BONITO_INTEDGE = BONITO_ICU_SYSTEMERR | BONITO_ICU_MASTERERR |
|
BONITO_INTEDGE = BONITO_ICU_SYSTEMERR | BONITO_ICU_MASTERERR |
|
||||||
BONITO_ICU_RETRYERR | BONITO_ICU_MBOXES;
|
BONITO_ICU_RETRYERR | BONITO_ICU_MBOXES;
|
||||||
BONITO_INTSTEER = 0;
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Mask out all interrupt by writing "1" to all bit position in
|
|
||||||
* the interrupt reset reg.
|
|
||||||
*/
|
|
||||||
BONITO_INTENCLR = ~0;
|
|
||||||
|
|
||||||
|
void __init mach_init_irq(void)
|
||||||
|
{
|
||||||
/* init all controller
|
/* init all controller
|
||||||
* 0-15 ------> i8259 interrupt
|
* 0-15 ------> i8259 interrupt
|
||||||
* 16-23 ------> mips cpu interrupt
|
* 16-23 ------> mips cpu interrupt
|
||||||
|
|
|
@ -1,44 +1,23 @@
|
||||||
/*
|
/* Board-specific reboot/shutdown routines
|
||||||
|
* Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
|
||||||
|
* Author: Wu Zhangjin, wuzj@lemote.com
|
||||||
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
* 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
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
* option) any later version.
|
* option) any later version.
|
||||||
*
|
|
||||||
* Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
|
|
||||||
* Author: Fuxin Zhang, zhangfx@lemote.com
|
|
||||||
* Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
|
|
||||||
* Author: Zhangjin Wu, wuzj@lemote.com
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/pm.h>
|
|
||||||
|
|
||||||
#include <asm/reboot.h>
|
|
||||||
|
|
||||||
#include <loongson.h>
|
#include <loongson.h>
|
||||||
|
|
||||||
static void loongson2e_restart(char *command)
|
void mach_prepare_reboot(void)
|
||||||
{
|
{
|
||||||
/* do preparation for reboot */
|
|
||||||
BONITO_BONGENCFG &= ~(1 << 2);
|
BONITO_BONGENCFG &= ~(1 << 2);
|
||||||
BONITO_BONGENCFG |= (1 << 2);
|
BONITO_BONGENCFG |= (1 << 2);
|
||||||
|
|
||||||
/* reboot via jumping to boot base address */
|
|
||||||
((void (*)(void))ioremap_nocache(BONITO_BOOT_BASE, 4)) ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loongson2e_halt(void)
|
void mach_prepare_shutdown(void)
|
||||||
{
|
{
|
||||||
while (1)
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init mips_reboot_setup(void)
|
|
||||||
{
|
|
||||||
_machine_restart = loongson2e_restart;
|
|
||||||
_machine_halt = loongson2e_halt;
|
|
||||||
pm_power_off = loongson2e_halt;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
arch_initcall(mips_reboot_setup);
|
|
||||||
|
|
Loading…
Reference in a new issue