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