From 0764c164fed6277d359cf132d55187ea34290114 Mon Sep 17 00:00:00 2001 From: Vlad Lungu Date: Wed, 16 Jan 2008 19:27:51 +0200 Subject: [PATCH] MIPS:Target support for qemu -M mips With serial, NE2000, IDE support. Tested in big-endian mode. Memory size hard-coded to 128M for now, so don't play with the -m option. Signed-off-by: Vlad Lungu --- MAINTAINERS | 3 + MAKEALL | 1 + Makefile | 6 ++ board/qemu-mips/Makefile | 45 +++++++++++ board/qemu-mips/README | 11 +++ board/qemu-mips/config.mk | 10 +++ board/qemu-mips/flash.c | 40 ++++++++++ board/qemu-mips/lowlevel_init.S | 41 ++++++++++ board/qemu-mips/qemu-mips.c | 89 ++++++++++++++++++++++ board/qemu-mips/u-boot.lds | 72 ++++++++++++++++++ include/configs/qemu-mips.h | 164 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 482 insertions(+) create mode 100644 board/qemu-mips/Makefile create mode 100644 board/qemu-mips/README create mode 100644 board/qemu-mips/config.mk create mode 100644 board/qemu-mips/flash.c create mode 100644 board/qemu-mips/lowlevel_init.S create mode 100644 board/qemu-mips/qemu-mips.c create mode 100644 board/qemu-mips/u-boot.lds create mode 100644 include/configs/qemu-mips.h diff --git a/MAINTAINERS b/MAINTAINERS index fed45f7..fb10ff7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -583,6 +583,9 @@ Thomas Lange dbau1x00 MIPS32 Au1000 gth2 MIPS32 Au1000 +Vlad Lungu + qemu_mips MIPS32 + ######################################################################### # Nios-32 Systems: # # # diff --git a/MAKEALL b/MAKEALL index 8e6713e..a4384b9 100755 --- a/MAKEALL +++ b/MAKEALL @@ -543,6 +543,7 @@ LIST_arm=" \ LIST_mips4kc=" \ incaip \ + qemu_mips \ " LIST_mips5kc=" \ diff --git a/Makefile b/Makefile index 1b3d2e6..f45c326 100644 --- a/Makefile +++ b/Makefile @@ -2601,6 +2601,12 @@ pb1000_config : unconfig @echo "#define CONFIG_PB1000 1" >>$(obj)include/config.h @$(MKCONFIG) -a pb1x00 mips mips pb1x00 +qemu_mips_config: unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_QEMU_MIPS 1" >>$(obj)include/config.h + @$(MKCONFIG) -a qemu-mips mips mips qemu-mips + ######################################################################### ## MIPS64 5Kc ######################################################################### diff --git a/board/qemu-mips/Makefile b/board/qemu-mips/Makefile new file mode 100644 index 0000000..23be447 --- /dev/null +++ b/board/qemu-mips/Makefile @@ -0,0 +1,45 @@ +# +# (C) Copyright 2003-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# 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., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).a + +COBJS = $(BOARD).o flash.o +SOBJS = lowlevel_init.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(OBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/qemu-mips/README b/board/qemu-mips/README new file mode 100644 index 0000000..39570b1 --- /dev/null +++ b/board/qemu-mips/README @@ -0,0 +1,11 @@ +By Vlad Lungu vlad@comsys.ro 2007-Oct-01 +---------------------------------------- +Qemu is a full system emulator. See + +http://fabrice.bellard.free.fr/qemu + +Limitations & comments +---------------------- +Supports the "-m mips" configuration of qemu: serial,NE2000,IDE. +Support is big endian only for now (or at least this is what I tested). +Derived from au1x00 with a lot of things cut out. diff --git a/board/qemu-mips/config.mk b/board/qemu-mips/config.mk new file mode 100644 index 0000000..4d4078a --- /dev/null +++ b/board/qemu-mips/config.mk @@ -0,0 +1,10 @@ +# +# Qemu -M mips system emulator +# See http://fabrice.bellard.free.fr/qemu +# + +# ROM version +TEXT_BASE = 0xbfc00000 + +# RAM version +#TEXT_BASE = 0x80001000 diff --git a/board/qemu-mips/flash.c b/board/qemu-mips/flash.c new file mode 100644 index 0000000..e988272 --- /dev/null +++ b/board/qemu-mips/flash.c @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +/*----------------------------------------------------------------------- + * flash_init() + * + * sets up flash_info and returns size of FLASH (bytes) + */ +unsigned long flash_init(void) +{ + printf("Skipping flash_init\n"); + return(0); +} + +int write_buff(void *info, uchar *src, ulong addr, ulong cnt) +{ + printf("write_buff not implemented\n"); + return(-1); +} diff --git a/board/qemu-mips/lowlevel_init.S b/board/qemu-mips/lowlevel_init.S new file mode 100644 index 0000000..28166bc --- /dev/null +++ b/board/qemu-mips/lowlevel_init.S @@ -0,0 +1,41 @@ +/* Memory sub-system initialization code */ + +#include +#include +#include +#include + + .text + .set noreorder + .set mips32 + + .globl lowlevel_init +lowlevel_init: + + /* + * Step 2) Establish Status Register + * (set BEV, clear ERL, clear EXL, clear IE) + */ + li t1, 0x00400000 + mtc0 t1, CP0_STATUS + + /* + * Step 3) Establish CP0 Config0 + * (set K0=3) + */ + li t1, 0x00000003 + mtc0 t1, CP0_CONFIG + + /* + * Step 7) Establish Cause + * (set IV bit) + */ + li t1, 0x00800000 + mtc0 t1, CP0_CAUSE + + /* Establish Wired (and Random) */ + mtc0 zero, CP0_WIRED + nop + + j ra + nop diff --git a/board/qemu-mips/qemu-mips.c b/board/qemu-mips/qemu-mips.c new file mode 100644 index 0000000..a6ad7b9 --- /dev/null +++ b/board/qemu-mips/qemu-mips.c @@ -0,0 +1,89 @@ +/* + * (C) Copyright 2007 + * Vlad Lungu vlad@comsys.ro + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include +#include +#include + +long int initdram(int board_type) +{ + /* Sdram is setup by assembler code */ + /* If memory could be changed, we should return the true value here */ + return MEM_SIZE*1024*1024; +} + +int checkboard(void) +{ + u32 proc_id; + u32 config1; + + proc_id = read_32bit_cp0_register(CP0_PRID); + printf("Board: Qemu -M mips CPU: "); + switch (proc_id) { + case 0x00018000: + printf("4Kc"); + break; + case 0x00018400: + printf("4KEcR1"); + break; + case 0x00019000: + printf("4KEc"); + break; + case 0x00019300: + config1 = read_mips32_cp0_config1(); + if (config1 & 1) + printf("24Kf"); + else + printf("24Kc"); + break; + case 0x00019500: + printf("34Kf"); + break; + case 0x00000400: + printf("R4000"); + break; + case 0x00018100: + config1 = read_mips32_cp0_config1(); + if (config1 & 1) + printf("5Kf"); + else + printf("5Kc"); + break; + case 0x000182a0: + printf("20Kc"); + break; + + default: + printf("unknown"); + } + printf(" proc_id=0x%x\n", proc_id); + + return 0; +} + +int misc_init_r(void) +{ + set_io_port_base(0); + return 0; +} diff --git a/board/qemu-mips/u-boot.lds b/board/qemu-mips/u-boot.lds new file mode 100644 index 0000000..c2a8566 --- /dev/null +++ b/board/qemu-mips/u-boot.lds @@ -0,0 +1,72 @@ +/* + * (C) Copyright 2003 + * Wolfgang Denk Engineering, + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* +OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips") +*/ +OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips") +OUTPUT_ARCH(mips) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + . = ALIGN(4); + .text : + { + *(.text) + } + + . = ALIGN(4); + .rodata : { *(.rodata) } + + . = ALIGN(4); + .data : { *(.data) } + + . = .; + _gp = ALIGN(16) +0x7ff0; + + .got : { + __got_start = .; + *(.got) + __got_end = .; + } + + . = ALIGN(4); + .sdata : { *(.sdata) } + + . = .; + .u_boot_cmd : { + __u_boot_cmd_start = .; + *(.u_boot_cmd) + __u_boot_cmd_end = .; + } + + uboot_end_data = .; + num_got_entries = (__got_end - __got_start) >> 2; + + . = ALIGN(4); + .sbss : { *(.sbss) } + .bss : { *(.bss) } + uboot_end = .; +} diff --git a/include/configs/qemu-mips.h b/include/configs/qemu-mips.h new file mode 100644 index 0000000..8fdb8e3 --- /dev/null +++ b/include/configs/qemu-mips.h @@ -0,0 +1,164 @@ +/* + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * This file contains the configuration parameters for the dbau1x00 board. + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + +#define CONFIG_MIPS32 1 /* MIPS32 CPU core */ +#define CONFIG_QEMU_MIPS 1 +#define CONFIG_MISC_INIT_R + +#undef DEBUG + +/*IP address is default used by Qemu*/ +#define CONFIG_IPADDR 10.0.2.15 /* Our IP address */ +#define CONFIG_SERVERIP 10.0.2.2 /* Server IP address*/ + +#define CONFIG_BOOTDELAY 10 /* autoboot after 10 seconds */ + +#define CONFIG_BAUDRATE 115200 + +/* valid baudrates */ +#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } + +#define CONFIG_TIMESTAMP /* Print image info with timestamp */ +#undef CONFIG_BOOTARGS + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "addmisc=setenv bootargs ${bootargs} " \ + "console=ttyS0,${baudrate} " \ + "panic=1\0" \ + "bootfile=/tftpboot/vmlinux\0" \ + "load=tftp 80500000 ${u-boot}\0" \ + "" + +#define CONFIG_BOOTCOMMAND "bootp;bootelf" + + +/* + * BOOTP options + */ +#define CONFIG_BOOTP_BOOTFILESIZE +#define CONFIG_BOOTP_BOOTPATH +#define CONFIG_BOOTP_GATEWAY +#define CONFIG_BOOTP_HOSTNAME + + +/* + * Command line configuration. + */ +#include + +#define CONFIG_CMD_ELF +#define CONFIG_CMD_FAT +#define CONFIG_CMD_EXT2 +#undef CONFIG_CMD_IMLS +#undef CONFIG_CMD_FLASH +#undef CONFIG_CMD_LOADB +#undef CONFIG_CMD_LOADS +#define CONFIG_CMD_DHCP + +#define CONFIG_DRIVER_NE2000 +#define CONFIG_DRIVER_NE2000_BASE (0xb4000300) + +#define CFG_NO_FLASH +#define CFG_NS16550 +#define CFG_NS16550_SERIAL +#define CFG_NS16550_REG_SIZE 1 +#define CFG_NS16550_CLK 115200 +#define CFG_NS16550_COM1 (0xb40003f8) +#define CONFIG_CONS_INDEX 1 + +#define CONFIG_CMD_IDE +#define CONFIG_DOS_PARTITION + +#define CFG_IDE_MAXBUS 2 +#define CFG_ATA_IDE0_OFFSET (0x1f0) +#define CFG_ATA_IDE1_OFFSET (0x170) +#define CFG_ATA_DATA_OFFSET (0) +#define CFG_ATA_REG_OFFSET (0) +#define CFG_ATA_BASE_ADDR (0xb4000000) + +#define CFG_IDE_MAXDEVICE (4) + +/* + * Miscellaneous configurable options + */ +#define CFG_LONGHELP /* undef to save memory */ + +#define CFG_PROMPT "qemu-mips # " /* Monitor Command Prompt */ + +#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ +#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ +#define CFG_MAXARGS 16 /* max number of command args*/ + +#define CFG_MALLOC_LEN 128*1024 + +#define CFG_BOOTPARAMS_LEN 128*1024 + +#define CFG_MHZ 132 + +#define CFG_HZ (CFG_MHZ * 1000000) + +#define CFG_SDRAM_BASE 0x80000000 /* Cached addr */ + +#define CFG_LOAD_ADDR 0x81000000 /* default load address */ + +#define CFG_MEMTEST_START 0x80100000 +#define CFG_MEMTEST_END 0x80800000 + +/*----------------------------------------------------------------------- + * FLASH and environment organization + */ + +/* The following #defines are needed to get flash environment right */ +#define CFG_MONITOR_BASE TEXT_BASE +#define CFG_MONITOR_LEN (192 << 10) + +#define CFG_INIT_SP_OFFSET 0x400000 + +/* We boot from this flash, selected with dip switch */ +#define CFG_FLASH_BASE 0xbfc00000 + +#define CFG_ENV_IS_NOWHERE 1 + +/* Address and size of Primary Environment Sector */ +#define CFG_ENV_SIZE 0x10000 +#undef CONFIG_NET_MULTI + +#define MEM_SIZE 128 + +#undef CONFIG_MEMSIZE_IN_BYTES + +/*----------------------------------------------------------------------- + * Cache Configuration + */ +#define CFG_DCACHE_SIZE 16384 +#define CFG_ICACHE_SIZE 16384 +#define CFG_CACHELINE_SIZE 32 + +#endif /* __CONFIG_H */