Commit fa1bdde4a3db4b0bc21b7ae1a3c8af5678c31dcc

Authored by edgar_igl
1 parent 96768ff7

ETRAX machine updates.

* Move DMA_run into the dma controller to allow for multiple ETRAX/CRIS machines.
* Support both ELF and kimage kernel images.
* Correct emulation of the DMA RW_DATA register.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4678 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 23 additions and 17 deletions
hw/etraxfs.c
@@ -44,7 +44,6 @@ void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr, @@ -44,7 +44,6 @@ void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr,
44 #define FLASH_SIZE 0x2000000 44 #define FLASH_SIZE 0x2000000
45 #define INTMEM_SIZE (128 * 1024) 45 #define INTMEM_SIZE (128 * 1024)
46 46
47 -static void *etraxfs_dmac;  
48 static uint32_t bootstrap_pc; 47 static uint32_t bootstrap_pc;
49 48
50 static void main_cpu_reset(void *opaque) 49 static void main_cpu_reset(void *opaque)
@@ -64,6 +63,7 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, @@ -64,6 +63,7 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size,
64 { 63 {
65 CPUState *env; 64 CPUState *env;
66 qemu_irq *pic; 65 qemu_irq *pic;
  66 + void *etraxfs_dmac;
67 struct etraxfs_dma_client *eth[2] = {NULL, NULL}; 67 struct etraxfs_dma_client *eth[2] = {NULL, NULL};
68 int kernel_size; 68 int kernel_size;
69 int i; 69 int i;
@@ -138,19 +138,20 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, @@ -138,19 +138,20 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size,
138 } 138 }
139 139
140 if (kernel_filename) { 140 if (kernel_filename) {
141 -#if 1 141 + uint64_t entry;
142 /* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis 142 /* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis
143 devboard SDK. */ 143 devboard SDK. */
144 kernel_size = load_elf(kernel_filename, 0, 144 kernel_size = load_elf(kernel_filename, 0,
145 - &bootstrap_pc, NULL, NULL);  
146 -#else  
147 - /* Takes a kimage from the axis devboard SDK. */  
148 - kernel_size = load_image(kernel_filename, phys_ram_base + 0x4000);  
149 - bootstrap_pc = 0x40004000;  
150 - /* magic for boot. */  
151 - env->regs[8] = 0x56902387;  
152 - env->regs[9] = 0x40004000 + kernel_size;  
153 -#endif 145 + &entry, NULL, NULL);
  146 + bootstrap_pc = entry;
  147 + if (kernel_size < 0) {
  148 + /* Takes a kimage from the axis devboard SDK. */
  149 + kernel_size = load_image(kernel_filename, phys_ram_base + 0x4000);
  150 + bootstrap_pc = 0x40004000;
  151 + /* magic for boot. */
  152 + env->regs[8] = 0x56902387;
  153 + env->regs[9] = 0x40004000 + kernel_size;
  154 + }
154 } 155 }
155 env->pc = bootstrap_pc; 156 env->pc = bootstrap_pc;
156 157
@@ -158,11 +159,6 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size, @@ -158,11 +159,6 @@ void bareetraxfs_init (ram_addr_t ram_size, int vga_ram_size,
158 printf ("ram size =%ld\n", ram_size); 159 printf ("ram size =%ld\n", ram_size);
159 } 160 }
160 161
161 -void DMA_run(void)  
162 -{  
163 - etraxfs_dmac_run(etraxfs_dmac);  
164 -}  
165 -  
166 QEMUMachine bareetraxfs_machine = { 162 QEMUMachine bareetraxfs_machine = {
167 "bareetraxfs", 163 "bareetraxfs",
168 "Bare ETRAX FS board", 164 "Bare ETRAX FS board",
hw/etraxfs_dma.c
@@ -273,6 +273,7 @@ static void channel_load_d(struct fs_dma_ctrl *ctrl, int c) @@ -273,6 +273,7 @@ static void channel_load_d(struct fs_dma_ctrl *ctrl, int c)
273 sizeof ctrl->channels[c].current_d); 273 sizeof ctrl->channels[c].current_d);
274 274
275 D(dump_d(c, &ctrl->channels[c].current_d)); 275 D(dump_d(c, &ctrl->channels[c].current_d));
  276 + ctrl->channels[c].regs[RW_DATA] = addr;
276 ctrl->channels[c].regs[RW_SAVED_DATA_BUF] = 277 ctrl->channels[c].regs[RW_SAVED_DATA_BUF] =
277 (uint32_t)ctrl->channels[c].current_d.buf; 278 (uint32_t)ctrl->channels[c].current_d.buf;
278 } 279 }
@@ -561,7 +562,7 @@ dma_writel (void *opaque, target_phys_addr_t addr, uint32_t value) @@ -561,7 +562,7 @@ dma_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
561 switch (addr) 562 switch (addr)
562 { 563 {
563 case RW_DATA: 564 case RW_DATA:
564 - printf("RW_DATA=%x\n", value); 565 + ctrl->channels[c].regs[addr] = value;
565 break; 566 break;
566 567
567 case RW_CFG: 568 case RW_CFG:
@@ -658,6 +659,13 @@ void etraxfs_dmac_connect_client(void *opaque, int c, @@ -658,6 +659,13 @@ void etraxfs_dmac_connect_client(void *opaque, int c,
658 } 659 }
659 660
660 661
  662 +static void *etraxfs_dmac;
  663 +void DMA_run(void)
  664 +{
  665 + if (etraxfs_dmac)
  666 + etraxfs_dmac_run(etraxfs_dmac);
  667 +}
  668 +
661 void *etraxfs_dmac_init(CPUState *env, 669 void *etraxfs_dmac_init(CPUState *env,
662 target_phys_addr_t base, int nr_channels) 670 target_phys_addr_t base, int nr_channels)
663 { 671 {
@@ -686,6 +694,8 @@ void *etraxfs_dmac_init(CPUState *env, @@ -686,6 +694,8 @@ void *etraxfs_dmac_init(CPUState *env,
686 ctrl->channels[i].regmap); 694 ctrl->channels[i].regmap);
687 } 695 }
688 696
  697 + /* Hax, we only support one DMA controller at a time. */
  698 + etraxfs_dmac = ctrl;
689 return ctrl; 699 return ctrl;
690 err: 700 err:
691 qemu_free(ctrl->channels); 701 qemu_free(ctrl->channels);