1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "hw.h"
26#include "pc.h"
27#include "fdc.h"
28#include "net.h"
29#include "boards.h"
30#include "smbus.h"
31#include "block.h"
32#include "flash.h"
33#include "mips.h"
34#include "mips_cpudevs.h"
35#include "pci.h"
36#include "vmware_vga.h"
37#include "qemu-char.h"
38#include "sysemu.h"
39#include "arch_init.h"
40#include "boards.h"
41#include "qemu-log.h"
42#include "mips-bios.h"
43#include "ide.h"
44#include "loader.h"
45#include "elf.h"
46#include "mc146818rtc.h"
47#include "i8254.h"
48#include "blockdev.h"
49#include "exec-memory.h"
50#include "sysbus.h"
51#include "vga-pci.h"
52
53
54
55#define ENVP_ADDR 0x80002000l
56#define ENVP_NB_ENTRIES 16
57#define ENVP_ENTRY_SIZE 256
58
59
60#define FLASH_ADDRESS 0x1e000000ULL
61#define FPGA_ADDRESS 0x1f000000ULL
62#define RESET_ADDRESS 0x1fc00000ULL
63
64#define FLASH_SIZE 0x400000
65
66#define MAX_IDE_BUS 2
67
68typedef struct {
69 MemoryRegion iomem;
70 MemoryRegion iomem_lo;
71 MemoryRegion iomem_hi;
72 uint32_t leds;
73 uint32_t brk;
74 uint32_t gpout;
75 uint32_t i2cin;
76 uint32_t i2coe;
77 uint32_t i2cout;
78 uint32_t i2csel;
79 CharDriverState *display;
80 char display_text[9];
81 SerialState *uart;
82} MaltaFPGAState;
83
84typedef struct {
85 SysBusDevice busdev;
86 qemu_irq *i8259;
87} MaltaState;
88
89static ISADevice *pit;
90
91static struct _loaderparams {
92 int ram_size;
93 const char *kernel_filename;
94 const char *kernel_cmdline;
95 const char *initrd_filename;
96} loaderparams;
97
98
99static void malta_fpga_update_display(void *opaque)
100{
101 char leds_text[9];
102 int i;
103 MaltaFPGAState *s = opaque;
104
105 for (i = 7 ; i >= 0 ; i--) {
106 if (s->leds & (1 << i))
107 leds_text[i] = '#';
108 else
109 leds_text[i] = ' ';
110 }
111 leds_text[8] = '\0';
112
113 qemu_chr_fe_printf(s->display, "\e[H\n\n|\e[32m%-8.8s\e[00m|\r\n", leds_text);
114 qemu_chr_fe_printf(s->display, "\n\n\n\n|\e[31m%-8.8s\e[00m|", s->display_text);
115}
116
117
118
119
120
121
122
123
124
125
126
127
128
129#if defined(DEBUG)
130# define logout(fmt, ...) fprintf(stderr, "MALTA\t%-24s" fmt, __func__, ## __VA_ARGS__)
131#else
132# define logout(fmt, ...) ((void)0)
133#endif
134
135struct _eeprom24c0x_t {
136 uint8_t tick;
137 uint8_t address;
138 uint8_t command;
139 uint8_t ack;
140 uint8_t scl;
141 uint8_t sda;
142 uint8_t data;
143
144 uint8_t contents[256];
145};
146
147typedef struct _eeprom24c0x_t eeprom24c0x_t;
148
149static eeprom24c0x_t eeprom = {
150 .contents = {
151 0x80,0x08,0x04,0x0D,0x0A,0x01,0x40,0x00,
152 0x01,0x75,0x54,0x00,0x82,0x08,0x00,0x01,
153 0x8F,0x04,0x02,0x01,0x01,0x00,0x0E,0x00,
154 0x00,0x00,0x00,0x14,0x0F,0x14,0x2D,0x40,
155 0x15,0x08,0x15,0x08,0x00,0x00,0x00,0x00,
156 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
157 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
158 0x00,0x00,0x00,0x00,0x00,0x00,0x12,0xD0,
159 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
160 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
161 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
162 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
163 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
164 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
165 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
166 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xF4,
167 },
168};
169
170static uint8_t eeprom24c0x_read(void)
171{
172 logout("%u: scl = %u, sda = %u, data = 0x%02x\n",
173 eeprom.tick, eeprom.scl, eeprom.sda, eeprom.data);
174 return eeprom.sda;
175}
176
177static void eeprom24c0x_write(int scl, int sda)
178{
179 if (eeprom.scl && scl && (eeprom.sda != sda)) {
180 logout("%u: scl = %u->%u, sda = %u->%u i2c %s\n",
181 eeprom.tick, eeprom.scl, scl, eeprom.sda, sda, sda ? "stop" : "start");
182 if (!sda) {
183 eeprom.tick = 1;
184 eeprom.command = 0;
185 }
186 } else if (eeprom.tick == 0 && !eeprom.ack) {
187
188 logout("%u: scl = %u->%u, sda = %u->%u wait for i2c start\n",
189 eeprom.tick, eeprom.scl, scl, eeprom.sda, sda);
190 } else if (!eeprom.scl && scl) {
191 logout("%u: scl = %u->%u, sda = %u->%u trigger bit\n",
192 eeprom.tick, eeprom.scl, scl, eeprom.sda, sda);
193 if (eeprom.ack) {
194 logout("\ti2c ack bit = 0\n");
195 sda = 0;
196 eeprom.ack = 0;
197 } else if (eeprom.sda == sda) {
198 uint8_t bit = (sda != 0);
199 logout("\ti2c bit = %d\n", bit);
200 if (eeprom.tick < 9) {
201 eeprom.command <<= 1;
202 eeprom.command += bit;
203 eeprom.tick++;
204 if (eeprom.tick == 9) {
205 logout("\tcommand 0x%04x, %s\n", eeprom.command, bit ? "read" : "write");
206 eeprom.ack = 1;
207 }
208 } else if (eeprom.tick < 17) {
209 if (eeprom.command & 1) {
210 sda = ((eeprom.data & 0x80) != 0);
211 }
212 eeprom.address <<= 1;
213 eeprom.address += bit;
214 eeprom.tick++;
215 eeprom.data <<= 1;
216 if (eeprom.tick == 17) {
217 eeprom.data = eeprom.contents[eeprom.address];
218 logout("\taddress 0x%04x, data 0x%02x\n", eeprom.address, eeprom.data);
219 eeprom.ack = 1;
220 eeprom.tick = 0;
221 }
222 } else if (eeprom.tick >= 17) {
223 sda = 0;
224 }
225 } else {
226 logout("\tsda changed with raising scl\n");
227 }
228 } else {
229 logout("%u: scl = %u->%u, sda = %u->%u\n", eeprom.tick, eeprom.scl, scl, eeprom.sda, sda);
230 }
231 eeprom.scl = scl;
232 eeprom.sda = sda;
233}
234
235static uint64_t malta_fpga_read(void *opaque, target_phys_addr_t addr,
236 unsigned size)
237{
238 MaltaFPGAState *s = opaque;
239 uint32_t val = 0;
240 uint32_t saddr;
241
242 saddr = (addr & 0xfffff);
243
244 switch (saddr) {
245
246
247 case 0x00200:
248 val = 0x00000000;
249 break;
250
251
252 case 0x00208:
253#ifdef TARGET_WORDS_BIGENDIAN
254 val = 0x00000012;
255#else
256 val = 0x00000010;
257#endif
258 break;
259
260
261 case 0x00210:
262 val = 0x00;
263 break;
264
265
266 case 0x00408:
267 val = s->leds;
268 break;
269
270
271 case 0x00508:
272 val = s->brk;
273 break;
274
275
276
277
278 case 0x00a00:
279 val = s->gpout;
280 break;
281
282
283
284
285 case 0x00a08:
286
287 if (s->i2csel)
288 val = s->i2cout;
289 else
290 val = 0x00;
291 break;
292
293
294 case 0x00b00:
295 val = ((s->i2cin & ~1) | eeprom24c0x_read());
296 break;
297
298
299 case 0x00b08:
300 val = s->i2coe;
301 break;
302
303
304 case 0x00b10:
305 val = s->i2cout;
306 break;
307
308
309 case 0x00b18:
310 val = s->i2csel;
311 break;
312
313 default:
314#if 0
315 printf ("malta_fpga_read: Bad register offset 0x" TARGET_FMT_lx "\n",
316 addr);
317#endif
318 break;
319 }
320 return val;
321}
322
323static void malta_fpga_write(void *opaque, target_phys_addr_t addr,
324 uint64_t val, unsigned size)
325{
326 MaltaFPGAState *s = opaque;
327 uint32_t saddr;
328
329 saddr = (addr & 0xfffff);
330
331 switch (saddr) {
332
333
334 case 0x00200:
335 break;
336
337
338 case 0x00210:
339 break;
340
341
342 case 0x00408:
343 s->leds = val & 0xff;
344 malta_fpga_update_display(s);
345 break;
346
347
348 case 0x00410:
349 snprintf(s->display_text, 9, "%08X", (uint32_t)val);
350 malta_fpga_update_display(s);
351 break;
352
353
354 case 0x00418:
355 case 0x00420:
356 case 0x00428:
357 case 0x00430:
358 case 0x00438:
359 case 0x00440:
360 case 0x00448:
361 case 0x00450:
362 s->display_text[(saddr - 0x00418) >> 3] = (char) val;
363 malta_fpga_update_display(s);
364 break;
365
366
367 case 0x00500:
368 if (val == 0x42)
369 qemu_system_reset_request ();
370 break;
371
372
373 case 0x00508:
374 s->brk = val & 0xff;
375 break;
376
377
378
379
380 case 0x00a00:
381 s->gpout = val & 0xff;
382 break;
383
384
385 case 0x00b08:
386 s->i2coe = val & 0x03;
387 break;
388
389
390 case 0x00b10:
391 eeprom24c0x_write(val & 0x02, val & 0x01);
392 s->i2cout = val;
393 break;
394
395
396 case 0x00b18:
397 s->i2csel = val & 0x01;
398 break;
399
400 default:
401#if 0
402 printf ("malta_fpga_write: Bad register offset 0x" TARGET_FMT_lx "\n",
403 addr);
404#endif
405 break;
406 }
407}
408
409static const MemoryRegionOps malta_fpga_ops = {
410 .read = malta_fpga_read,
411 .write = malta_fpga_write,
412 .endianness = DEVICE_NATIVE_ENDIAN,
413};
414
415static void malta_fpga_reset(void *opaque)
416{
417 MaltaFPGAState *s = opaque;
418
419 s->leds = 0x00;
420 s->brk = 0x0a;
421 s->gpout = 0x00;
422 s->i2cin = 0x3;
423 s->i2coe = 0x0;
424 s->i2cout = 0x3;
425 s->i2csel = 0x1;
426
427 s->display_text[8] = '\0';
428 snprintf(s->display_text, 9, " ");
429}
430
431static void malta_fpga_led_init(CharDriverState *chr)
432{
433 qemu_chr_fe_printf(chr, "\e[HMalta LEDBAR\r\n");
434 qemu_chr_fe_printf(chr, "+--------+\r\n");
435 qemu_chr_fe_printf(chr, "+ +\r\n");
436 qemu_chr_fe_printf(chr, "+--------+\r\n");
437 qemu_chr_fe_printf(chr, "\n");
438 qemu_chr_fe_printf(chr, "Malta ASCII\r\n");
439 qemu_chr_fe_printf(chr, "+--------+\r\n");
440 qemu_chr_fe_printf(chr, "+ +\r\n");
441 qemu_chr_fe_printf(chr, "+--------+\r\n");
442}
443
444static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
445 target_phys_addr_t base, qemu_irq uart_irq, CharDriverState *uart_chr)
446{
447 MaltaFPGAState *s;
448
449 s = (MaltaFPGAState *)g_malloc0(sizeof(MaltaFPGAState));
450
451 memory_region_init_io(&s->iomem, &malta_fpga_ops, s,
452 "malta-fpga", 0x100000);
453 memory_region_init_alias(&s->iomem_lo, "malta-fpga",
454 &s->iomem, 0, 0x900);
455 memory_region_init_alias(&s->iomem_hi, "malta-fpga",
456 &s->iomem, 0xa00, 0x10000-0xa00);
457
458 memory_region_add_subregion(address_space, base, &s->iomem_lo);
459 memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi);
460
461 s->display = qemu_chr_new("fpga", "vc:320x200", malta_fpga_led_init);
462
463 s->uart = serial_mm_init(address_space, base + 0x900, 3, uart_irq,
464 230400, uart_chr, DEVICE_NATIVE_ENDIAN);
465
466 malta_fpga_reset(s);
467 qemu_register_reset(malta_fpga_reset, s);
468
469 return s;
470}
471
472
473static void network_init(void)
474{
475 int i;
476
477 for(i = 0; i < nb_nics; i++) {
478 NICInfo *nd = &nd_table[i];
479 const char *default_devaddr = NULL;
480
481 if (i == 0 && (!nd->model || strcmp(nd->model, "pcnet") == 0))
482
483 default_devaddr = "0b";
484
485 pci_nic_init_nofail(nd, "pcnet", default_devaddr);
486 }
487}
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511static void write_bootloader (CPUMIPSState *env, uint8_t *base,
512 int64_t kernel_entry)
513{
514 uint32_t *p;
515
516
517 p = (uint32_t *)base;
518 stl_raw(p++, 0x0bf00160);
519 stl_raw(p++, 0x00000000);
520
521
522 stl_raw(base + 0x500, 0xbfc00580);
523 stl_raw(base + 0x504, 0xbfc0083c);
524 stl_raw(base + 0x520, 0xbfc00580);
525 stl_raw(base + 0x52c, 0xbfc00800);
526 stl_raw(base + 0x534, 0xbfc00808);
527 stl_raw(base + 0x538, 0xbfc00800);
528 stl_raw(base + 0x53c, 0xbfc00800);
529 stl_raw(base + 0x540, 0xbfc00800);
530 stl_raw(base + 0x544, 0xbfc00800);
531 stl_raw(base + 0x548, 0xbfc00800);
532 stl_raw(base + 0x54c, 0xbfc00800);
533 stl_raw(base + 0x550, 0xbfc00800);
534 stl_raw(base + 0x554, 0xbfc00800);
535
536
537
538 p = (uint32_t *) (base + 0x580);
539 stl_raw(p++, 0x24040002);
540 stl_raw(p++, 0x3c1d0000 | (((ENVP_ADDR - 64) >> 16) & 0xffff));
541 stl_raw(p++, 0x37bd0000 | ((ENVP_ADDR - 64) & 0xffff));
542 stl_raw(p++, 0x3c050000 | ((ENVP_ADDR >> 16) & 0xffff));
543 stl_raw(p++, 0x34a50000 | (ENVP_ADDR & 0xffff));
544 stl_raw(p++, 0x3c060000 | (((ENVP_ADDR + 8) >> 16) & 0xffff));
545 stl_raw(p++, 0x34c60000 | ((ENVP_ADDR + 8) & 0xffff));
546 stl_raw(p++, 0x3c070000 | (loaderparams.ram_size >> 16));
547 stl_raw(p++, 0x34e70000 | (loaderparams.ram_size & 0xffff));
548
549
550 stl_raw(p++, 0x3c09b400);
551
552#ifdef TARGET_WORDS_BIGENDIAN
553 stl_raw(p++, 0x3c08df00);
554#else
555 stl_raw(p++, 0x340800df);
556#endif
557 stl_raw(p++, 0xad280068);
558
559 stl_raw(p++, 0x3c09bbe0);
560
561#ifdef TARGET_WORDS_BIGENDIAN
562 stl_raw(p++, 0x3c08c000);
563#else
564 stl_raw(p++, 0x340800c0);
565#endif
566 stl_raw(p++, 0xad280048);
567#ifdef TARGET_WORDS_BIGENDIAN
568 stl_raw(p++, 0x3c084000);
569#else
570 stl_raw(p++, 0x34080040);
571#endif
572 stl_raw(p++, 0xad280050);
573
574#ifdef TARGET_WORDS_BIGENDIAN
575 stl_raw(p++, 0x3c088000);
576#else
577 stl_raw(p++, 0x34080080);
578#endif
579 stl_raw(p++, 0xad280058);
580#ifdef TARGET_WORDS_BIGENDIAN
581 stl_raw(p++, 0x3c083f00);
582#else
583 stl_raw(p++, 0x3408003f);
584#endif
585 stl_raw(p++, 0xad280060);
586
587#ifdef TARGET_WORDS_BIGENDIAN
588 stl_raw(p++, 0x3c08c100);
589#else
590 stl_raw(p++, 0x340800c1);
591#endif
592 stl_raw(p++, 0xad280080);
593#ifdef TARGET_WORDS_BIGENDIAN
594 stl_raw(p++, 0x3c085e00);
595#else
596 stl_raw(p++, 0x3408005e);
597#endif
598 stl_raw(p++, 0xad280088);
599
600
601 stl_raw(p++, 0x3c1f0000 | ((kernel_entry >> 16) & 0xffff));
602 stl_raw(p++, 0x37ff0000 | (kernel_entry & 0xffff));
603 stl_raw(p++, 0x03e00008);
604 stl_raw(p++, 0x00000000);
605
606
607 p = (uint32_t *) (base + 0x800);
608 stl_raw(p++, 0x03e00008);
609 stl_raw(p++, 0x24020000);
610
611 stl_raw(p++, 0x03e06821);
612 stl_raw(p++, 0x00805821);
613 stl_raw(p++, 0x00a05021);
614 stl_raw(p++, 0x91440000);
615 stl_raw(p++, 0x254a0001);
616 stl_raw(p++, 0x10800005);
617 stl_raw(p++, 0x00000000);
618 stl_raw(p++, 0x0ff0021c);
619 stl_raw(p++, 0x00000000);
620 stl_raw(p++, 0x08000205);
621 stl_raw(p++, 0x00000000);
622 stl_raw(p++, 0x01a00008);
623 stl_raw(p++, 0x01602021);
624
625 stl_raw(p++, 0x03e06821);
626 stl_raw(p++, 0x00805821);
627 stl_raw(p++, 0x00a05021);
628 stl_raw(p++, 0x00c06021);
629 stl_raw(p++, 0x91440000);
630 stl_raw(p++, 0x0ff0021c);
631 stl_raw(p++, 0x00000000);
632 stl_raw(p++, 0x254a0001);
633 stl_raw(p++, 0x258cffff);
634 stl_raw(p++, 0x1580fffa);
635 stl_raw(p++, 0x00000000);
636 stl_raw(p++, 0x01a00008);
637 stl_raw(p++, 0x01602021);
638
639 stl_raw(p++, 0x3c08b800);
640 stl_raw(p++, 0x350803f8);
641 stl_raw(p++, 0x91090005);
642 stl_raw(p++, 0x00000000);
643 stl_raw(p++, 0x31290040);
644 stl_raw(p++, 0x1120fffc);
645 stl_raw(p++, 0x00000000);
646 stl_raw(p++, 0x03e00008);
647 stl_raw(p++, 0xa1040000);
648
649}
650
651static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
652 const char *string, ...)
653{
654 va_list ap;
655 int32_t table_addr;
656
657 if (index >= ENVP_NB_ENTRIES)
658 return;
659
660 if (string == NULL) {
661 prom_buf[index] = 0;
662 return;
663 }
664
665 table_addr = sizeof(int32_t) * ENVP_NB_ENTRIES + index * ENVP_ENTRY_SIZE;
666 prom_buf[index] = tswap32(ENVP_ADDR + table_addr);
667
668 va_start(ap, string);
669 vsnprintf((char *)prom_buf + table_addr, ENVP_ENTRY_SIZE, string, ap);
670 va_end(ap);
671}
672
673
674static int64_t load_kernel (void)
675{
676 int64_t kernel_entry, kernel_high;
677 long initrd_size;
678 ram_addr_t initrd_offset;
679 int big_endian;
680 uint32_t *prom_buf;
681 long prom_size;
682 int prom_index = 0;
683
684#ifdef TARGET_WORDS_BIGENDIAN
685 big_endian = 1;
686#else
687 big_endian = 0;
688#endif
689
690 if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
691 (uint64_t *)&kernel_entry, NULL, (uint64_t *)&kernel_high,
692 big_endian, ELF_MACHINE, 1) < 0) {
693 fprintf(stderr, "qemu: could not load kernel '%s'\n",
694 loaderparams.kernel_filename);
695 exit(1);
696 }
697
698
699 initrd_size = 0;
700 initrd_offset = 0;
701 if (loaderparams.initrd_filename) {
702 initrd_size = get_image_size (loaderparams.initrd_filename);
703 if (initrd_size > 0) {
704 initrd_offset = (kernel_high + ~TARGET_PAGE_MASK) & TARGET_PAGE_MASK;
705 if (initrd_offset + initrd_size > ram_size) {
706 fprintf(stderr,
707 "qemu: memory too small for initial ram disk '%s'\n",
708 loaderparams.initrd_filename);
709 exit(1);
710 }
711 initrd_size = load_image_targphys(loaderparams.initrd_filename,
712 initrd_offset,
713 ram_size - initrd_offset);
714 }
715 if (initrd_size == (target_ulong) -1) {
716 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
717 loaderparams.initrd_filename);
718 exit(1);
719 }
720 }
721
722
723 prom_size = ENVP_NB_ENTRIES * (sizeof(int32_t) + ENVP_ENTRY_SIZE);
724 prom_buf = g_malloc(prom_size);
725
726 prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_filename);
727 if (initrd_size > 0) {
728 prom_set(prom_buf, prom_index++, "rd_start=0x%" PRIx64 " rd_size=%li %s",
729 cpu_mips_phys_to_kseg0(NULL, initrd_offset), initrd_size,
730 loaderparams.kernel_cmdline);
731 } else {
732 prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_cmdline);
733 }
734
735 prom_set(prom_buf, prom_index++, "memsize");
736 prom_set(prom_buf, prom_index++, "%i", loaderparams.ram_size);
737 prom_set(prom_buf, prom_index++, "modetty0");
738 prom_set(prom_buf, prom_index++, "38400n8r");
739 prom_set(prom_buf, prom_index++, NULL);
740
741 rom_add_blob_fixed("prom", prom_buf, prom_size,
742 cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR));
743
744 return kernel_entry;
745}
746
747static void malta_mips_config(CPUMIPSState *env)
748{
749 env->mvp->CP0_MVPConf0 |= ((smp_cpus - 1) << CP0MVPC0_PVPE) |
750 ((smp_cpus * env->nr_threads - 1) << CP0MVPC0_PTC);
751}
752
753static void main_cpu_reset(void *opaque)
754{
755 MIPSCPU *cpu = opaque;
756 CPUMIPSState *env = &cpu->env;
757
758 cpu_reset(CPU(cpu));
759
760
761
762
763 if (loaderparams.kernel_filename) {
764 env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
765 }
766
767 malta_mips_config(env);
768}
769
770static void cpu_request_exit(void *opaque, int irq, int level)
771{
772 CPUMIPSState *env = cpu_single_env;
773
774 if (env && level) {
775 cpu_exit(env);
776 }
777}
778
779static
780void mips_malta_init (ram_addr_t ram_size,
781 const char *boot_device,
782 const char *kernel_filename, const char *kernel_cmdline,
783 const char *initrd_filename, const char *cpu_model)
784{
785 char *filename;
786 pflash_t *fl;
787 MemoryRegion *system_memory = get_system_memory();
788 MemoryRegion *ram = g_new(MemoryRegion, 1);
789 MemoryRegion *bios, *bios_alias = g_new(MemoryRegion, 1);
790 target_long bios_size = FLASH_SIZE;
791 int64_t kernel_entry;
792 PCIBus *pci_bus;
793 ISABus *isa_bus;
794 MIPSCPU *cpu;
795 CPUMIPSState *env;
796 qemu_irq *isa_irq;
797 qemu_irq *cpu_exit_irq;
798 int piix4_devfn;
799 i2c_bus *smbus;
800 int i;
801 DriveInfo *dinfo;
802 DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
803 DriveInfo *fd[MAX_FD];
804 int fl_idx = 0;
805 int fl_sectors = bios_size >> 16;
806 int be;
807
808 DeviceState *dev = qdev_create(NULL, "mips-malta");
809 MaltaState *s = DO_UPCAST(MaltaState, busdev.qdev, dev);
810
811 qdev_init_nofail(dev);
812
813
814 for(i = 0; i < 3; i++) {
815 if (!serial_hds[i]) {
816 char label[32];
817 snprintf(label, sizeof(label), "serial%d", i);
818 serial_hds[i] = qemu_chr_new(label, "null", NULL);
819 }
820 }
821
822
823 if (cpu_model == NULL) {
824#ifdef TARGET_MIPS64
825 cpu_model = "20Kc";
826#else
827 cpu_model = "24Kf";
828#endif
829 }
830
831 for (i = 0; i < smp_cpus; i++) {
832 cpu = cpu_mips_init(cpu_model);
833 if (cpu == NULL) {
834 fprintf(stderr, "Unable to find CPU definition\n");
835 exit(1);
836 }
837 env = &cpu->env;
838
839
840 cpu_mips_irq_init_cpu(env);
841 cpu_mips_clock_init(env);
842 qemu_register_reset(main_cpu_reset, cpu);
843 }
844 env = first_cpu;
845
846
847 if (ram_size > (256 << 20)) {
848 fprintf(stderr,
849 "qemu: Too much memory for this machine: %d MB, maximum 256 MB\n",
850 ((unsigned int)ram_size / (1 << 20)));
851 exit(1);
852 }
853 memory_region_init_ram(ram, "mips_malta.ram", ram_size);
854 vmstate_register_ram_global(ram);
855 memory_region_add_subregion(system_memory, 0, ram);
856
857#ifdef TARGET_WORDS_BIGENDIAN
858 be = 1;
859#else
860 be = 0;
861#endif
862
863 malta_fpga_init(system_memory, FPGA_ADDRESS, env->irq[2], serial_hds[2]);
864
865
866 dinfo = drive_get(IF_PFLASH, 0, fl_idx);
867#ifdef DEBUG_BOARD_INIT
868 if (dinfo) {
869 printf("Register parallel flash %d size " TARGET_FMT_lx " at "
870 "addr %08llx '%s' %x\n",
871 fl_idx, bios_size, FLASH_ADDRESS,
872 bdrv_get_device_name(dinfo->bdrv), fl_sectors);
873 }
874#endif
875 fl = pflash_cfi01_register(FLASH_ADDRESS, NULL, "mips_malta.bios",
876 BIOS_SIZE, dinfo ? dinfo->bdrv : NULL,
877 65536, fl_sectors,
878 4, 0x0000, 0x0000, 0x0000, 0x0000, be);
879 bios = pflash_cfi01_get_memory(fl);
880 fl_idx++;
881 if (kernel_filename) {
882
883 loaderparams.ram_size = ram_size;
884 loaderparams.kernel_filename = kernel_filename;
885 loaderparams.kernel_cmdline = kernel_cmdline;
886 loaderparams.initrd_filename = initrd_filename;
887 kernel_entry = load_kernel();
888 write_bootloader(env, memory_region_get_ram_ptr(bios), kernel_entry);
889 } else {
890
891 if (!dinfo) {
892
893 if (bios_name == NULL) {
894 bios_name = BIOS_FILENAME;
895 }
896 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
897 if (filename) {
898 bios_size = load_image_targphys(filename, FLASH_ADDRESS,
899 BIOS_SIZE);
900 g_free(filename);
901 } else {
902 bios_size = -1;
903 }
904 if ((bios_size < 0 || bios_size > BIOS_SIZE) && !kernel_filename) {
905 fprintf(stderr,
906 "qemu: Could not load MIPS bios '%s', and no -kernel argument was specified\n",
907 bios_name);
908 exit(1);
909 }
910 }
911
912
913#ifndef TARGET_WORDS_BIGENDIAN
914 {
915 uint32_t *addr = memory_region_get_ram_ptr(bios);
916 uint32_t *end = addr + bios_size;
917 while (addr < end) {
918 bswap32s(addr);
919 addr++;
920 }
921 }
922#endif
923 }
924
925
926 memory_region_init_alias(bios_alias, "bios.1fc", bios, 0, BIOS_SIZE);
927 memory_region_add_subregion(system_memory, RESET_ADDRESS, bios_alias);
928
929
930
931
932 stl_p(memory_region_get_ram_ptr(bios) + 0x10, 0x00000420);
933
934
935 cpu_mips_irq_init_cpu(env);
936 cpu_mips_clock_init(env);
937
938
939
940
941
942
943
944
945 isa_irq = qemu_irq_proxy(&s->i8259, 16);
946
947
948 pci_bus = gt64120_register(isa_irq);
949
950
951 ide_drive_get(hd, MAX_IDE_BUS);
952
953 piix4_devfn = piix4_init(pci_bus, &isa_bus, 80);
954
955
956
957 s->i8259 = i8259_init(isa_bus, env->irq[2]);
958
959 isa_bus_irqs(isa_bus, s->i8259);
960 pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
961 pci_create_simple(pci_bus, piix4_devfn + 2, "piix4-usb-uhci");
962 smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100,
963 isa_get_irq(NULL, 9), NULL, 0, NULL);
964
965 smbus_eeprom_init(smbus, 8, NULL, 0);
966 pit = pit_init(isa_bus, 0x40, 0, NULL);
967 cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
968 DMA_init(0, cpu_exit_irq);
969
970
971 isa_create_simple(isa_bus, "i8042");
972
973 rtc_init(isa_bus, 2000, NULL);
974 serial_isa_init(isa_bus, 0, serial_hds[0]);
975 serial_isa_init(isa_bus, 1, serial_hds[1]);
976 if (parallel_hds[0])
977 parallel_init(isa_bus, 0, parallel_hds[0]);
978 for(i = 0; i < MAX_FD; i++) {
979 fd[i] = drive_get(IF_FLOPPY, 0, i);
980 }
981 fdctrl_init_isa(isa_bus, fd);
982
983
984 audio_init(isa_bus, pci_bus);
985
986
987 network_init();
988
989
990 if (cirrus_vga_enabled) {
991 pci_cirrus_vga_init(pci_bus);
992 } else if (vmsvga_enabled) {
993 pci_vmsvga_init(pci_bus);
994 } else if (std_vga_enabled) {
995 pci_vga_init(pci_bus);
996 }
997}
998
999static int mips_malta_sysbus_device_init(SysBusDevice *sysbusdev)
1000{
1001 return 0;
1002}
1003
1004static void mips_malta_class_init(ObjectClass *klass, void *data)
1005{
1006 SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
1007
1008 k->init = mips_malta_sysbus_device_init;
1009}
1010
1011static TypeInfo mips_malta_device = {
1012 .name = "mips-malta",
1013 .parent = TYPE_SYS_BUS_DEVICE,
1014 .instance_size = sizeof(MaltaState),
1015 .class_init = mips_malta_class_init,
1016};
1017
1018static QEMUMachine mips_malta_machine = {
1019 .name = "malta",
1020 .desc = "MIPS Malta Core LV",
1021 .init = mips_malta_init,
1022 .max_cpus = 16,
1023 .is_default = 1,
1024};
1025
1026static void mips_malta_register_types(void)
1027{
1028 type_register_static(&mips_malta_device);
1029}
1030
1031static void mips_malta_machine_init(void)
1032{
1033 qemu_register_machine(&mips_malta_machine);
1034}
1035
1036type_init(mips_malta_register_types)
1037machine_init(mips_malta_machine_init);
1038