From 5439779e84e352f20ee2d3e26daec81292f1b59a Mon Sep 17 00:00:00 2001 From: edgar_igl Date: Tue, 27 May 2008 21:04:41 +0000 Subject: ETRAX: Allow boot from flash. Support the watchdog timer and resets through it. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4592 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/etraxfs.c | 112 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 55 insertions(+), 57 deletions(-) (limited to 'hw/etraxfs.c') diff --git a/hw/etraxfs.c b/hw/etraxfs.c index 9886ae9623..942892c019 100644 --- a/hw/etraxfs.c +++ b/hw/etraxfs.c @@ -32,25 +32,29 @@ #include "etraxfs_dma.h" -static void main_cpu_reset(void *opaque) -{ - CPUState *env = opaque; - cpu_reset(env); -} - /* Init functions for different blocks. */ extern qemu_irq *etraxfs_pic_init(CPUState *env, target_phys_addr_t base); void etraxfs_timer_init(CPUState *env, qemu_irq *irqs, - target_phys_addr_t base); -void *etraxfs_eth_init(NICInfo *nd, CPUState *env, - qemu_irq *irq, target_phys_addr_t base); + target_phys_addr_t base); +void *etraxfs_eth_init(NICInfo *nd, CPUState *env, + qemu_irq *irq, target_phys_addr_t base); void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr, - target_phys_addr_t base); + target_phys_addr_t base); #define FLASH_SIZE 0x2000000 #define INTMEM_SIZE (128 * 1024) static void *etraxfs_dmac; +static uint32_t bootstrap_pc; + +static void main_cpu_reset(void *opaque) +{ + CPUState *env = opaque; + cpu_reset(env); + + env->pregs[PR_CCS] &= ~I_FLAG; + env->pc = bootstrap_pc; +} static void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, @@ -64,6 +68,7 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, int kernel_size; int i; ram_addr_t phys_ram; + ram_addr_t phys_flash; ram_addr_t phys_intmem; /* init CPUs */ @@ -83,40 +88,42 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the internal memory. Cached and uncached mappings. */ phys_intmem = qemu_ram_alloc(INTMEM_SIZE); - cpu_register_physical_memory(0xb8000000, INTMEM_SIZE, - phys_intmem | IO_MEM_RAM); - cpu_register_physical_memory(0x38000000, INTMEM_SIZE, - phys_intmem | IO_MEM_RAM); - - cpu_register_physical_memory(0, FLASH_SIZE, IO_MEM_ROM); - cpu_register_physical_memory(0x80000000, FLASH_SIZE, IO_MEM_ROM); - cpu_register_physical_memory(0x04000000, FLASH_SIZE, IO_MEM_ROM); - cpu_register_physical_memory(0x84000000, FLASH_SIZE, - 0x04000000 | IO_MEM_ROM); - i = drive_get_index(IF_PFLASH, 0, 0); - pflash_cfi02_register(0x80000000, qemu_ram_alloc(FLASH_SIZE), - drives_table[i].bdrv, (64 * 1024), - FLASH_SIZE >> 16, - 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, 0x555, 0x2aa); + cpu_register_physical_memory(0xb8000000, INTMEM_SIZE, + phys_intmem | IO_MEM_RAM); + cpu_register_physical_memory(0x38000000, INTMEM_SIZE, + phys_intmem | IO_MEM_RAM); + + phys_flash = qemu_ram_alloc(FLASH_SIZE); + i = drive_get_index(IF_PFLASH, 0, 0); + pflash_cfi02_register(0x80000000, phys_flash, + drives_table[i].bdrv, (64 * 1024), + FLASH_SIZE >> 16, + 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x555, 0x2aa); + pflash_cfi02_register(0x0, phys_flash, + drives_table[i].bdrv, (64 * 1024), + FLASH_SIZE >> 16, + 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x555, 0x2aa); pic = etraxfs_pic_init(env, 0xb001c000); etraxfs_dmac = etraxfs_dmac_init(env, 0xb0000000, 10); for (i = 0; i < 10; i++) { - /* On ETRAX, odd numbered channels are inputs. */ - etraxfs_dmac_connect(etraxfs_dmac, i, pic + 7 + i, i & 1); + /* On ETRAX, odd numbered channels are inputs. */ + etraxfs_dmac_connect(etraxfs_dmac, i, pic + 7 + i, i & 1); } /* Add the two ethernet blocks. */ eth[0] = etraxfs_eth_init(&nd_table[0], env, pic + 25, 0xb0034000); if (nb_nics > 1) - eth[1] = etraxfs_eth_init(&nd_table[1], env, pic + 26, 0xb0036000); - + eth[1] = etraxfs_eth_init(&nd_table[1], env, pic + 26, 0xb0036000); + /* The DMA Connector block is missing, hardwire things for now. */ etraxfs_dmac_connect_client(etraxfs_dmac, 0, eth[0]); etraxfs_dmac_connect_client(etraxfs_dmac, 1, eth[0] + 1); if (eth[1]) { - etraxfs_dmac_connect_client(etraxfs_dmac, 6, eth[1]); - etraxfs_dmac_connect_client(etraxfs_dmac, 7, eth[1] + 1); + etraxfs_dmac_connect_client(etraxfs_dmac, 6, eth[1]); + etraxfs_dmac_connect_client(etraxfs_dmac, 7, eth[1] + 1); } /* 2 timers. */ @@ -124,40 +131,31 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, etraxfs_timer_init(env, pic + 0x1b, 0xb005e000); for (i = 0; i < 4; i++) { - if (serial_hds[i]) { - etraxfs_ser_init(env, pic + 0x14 + i, - serial_hds[i], 0xb0026000 + i * 0x2000); - } + if (serial_hds[i]) { + etraxfs_ser_init(env, pic + 0x14 + i, + serial_hds[i], 0xb0026000 + i * 0x2000); + } } + if (kernel_filename) { #if 1 - /* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis devboard - SDK. */ - kernel_size = load_elf(kernel_filename, 0, &env->pc, NULL, NULL); + /* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis + devboard SDK. */ + kernel_size = load_elf(kernel_filename, 0, + &bootstrap_pc, NULL, NULL); #else - /* Takes a kimage from the axis devboard SDK. */ - kernel_size = load_image(kernel_filename, phys_ram_base + 0x4000); - env->pc = 0x40004000; + /* Takes a kimage from the axis devboard SDK. */ + kernel_size = load_image(kernel_filename, phys_ram_base + 0x4000); + bootstrap_pc = 0x40004000; + /* magic for boot. */ + env->regs[8] = 0x56902387; + env->regs[9] = 0x40004000 + kernel_size; #endif - /* magic for boot. */ - env->regs[8] = 0x56902387; - env->regs[9] = 0x40004000 + kernel_size; - - { - unsigned char *ptr = phys_ram_base + 0x4000; - int i; - for (i = 0; i < 8; i++) - { - printf ("%2.2x ", ptr[i]); - } - printf("\n"); } + env->pc = bootstrap_pc; printf ("pc =%x\n", env->pc); printf ("ram size =%ld\n", ram_size); - printf ("kernel name =%s\n", kernel_filename); - printf ("kernel size =%d\n", kernel_size); - printf ("cpu haltd =%d\n", env->halted); } void DMA_run(void) @@ -169,5 +167,5 @@ QEMUMachine bareetraxfs_machine = { "bareetraxfs", "Bare ETRAX FS board", bareetraxfs_init, - 0x4000000, + 0x8000000, }; -- cgit v1.2.1