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 "qemu/osdep.h"
26#include "qemu/units.h"
27#include "qemu/bitops.h"
28#include "qemu/datadir.h"
29#include "qemu/guest-random.h"
30#include "hw/clock.h"
31#include "hw/southbridge/piix.h"
32#include "hw/isa/superio.h"
33#include "hw/char/serial.h"
34#include "net/net.h"
35#include "hw/boards.h"
36#include "hw/i2c/smbus_eeprom.h"
37#include "hw/block/flash.h"
38#include "hw/mips/mips.h"
39#include "hw/mips/bootloader.h"
40#include "hw/mips/cpudevs.h"
41#include "hw/pci/pci.h"
42#include "hw/pci/pci_bus.h"
43#include "qemu/log.h"
44#include "hw/mips/bios.h"
45#include "hw/ide/pci.h"
46#include "hw/irq.h"
47#include "hw/loader.h"
48#include "elf.h"
49#include "qom/object.h"
50#include "hw/sysbus.h"
51#include "qemu/host-utils.h"
52#include "sysemu/qtest.h"
53#include "sysemu/reset.h"
54#include "sysemu/runstate.h"
55#include "qapi/error.h"
56#include "qemu/error-report.h"
57#include "sysemu/kvm.h"
58#include "semihosting/semihost.h"
59#include "hw/mips/cps.h"
60#include "hw/qdev-clock.h"
61#include "target/mips/internal.h"
62#include "trace.h"
63
64#define ENVP_PADDR 0x2000
65#define ENVP_VADDR cpu_mips_phys_to_kseg0(NULL, ENVP_PADDR)
66#define ENVP_NB_ENTRIES 16
67#define ENVP_ENTRY_SIZE 256
68
69
70#define FLASH_ADDRESS 0x1e000000ULL
71#define FPGA_ADDRESS 0x1f000000ULL
72#define RESET_ADDRESS 0x1fc00000ULL
73
74#define FLASH_SIZE 0x400000
75
76#define PIIX4_PCI_DEVFN PCI_DEVFN(10, 0)
77
78typedef struct {
79 MemoryRegion iomem;
80 MemoryRegion iomem_lo;
81 MemoryRegion iomem_hi;
82 uint32_t leds;
83 uint32_t brk;
84 uint32_t gpout;
85 uint32_t i2cin;
86 uint32_t i2coe;
87 uint32_t i2cout;
88 uint32_t i2csel;
89 CharBackend display;
90 char display_text[9];
91 SerialMM *uart;
92 bool display_inited;
93} MaltaFPGAState;
94
95#define TYPE_MIPS_MALTA "mips-malta"
96OBJECT_DECLARE_SIMPLE_TYPE(MaltaState, MIPS_MALTA)
97
98struct MaltaState {
99 SysBusDevice parent_obj;
100
101 Clock *cpuclk;
102 MIPSCPSState cps;
103};
104
105static struct _loaderparams {
106 int ram_size, ram_low_size;
107 const char *kernel_filename;
108 const char *kernel_cmdline;
109 const char *initrd_filename;
110} loaderparams;
111
112
113static void malta_fpga_update_display_leds(MaltaFPGAState *s)
114{
115 char leds_text[9];
116 int i;
117
118 for (i = 7 ; i >= 0 ; i--) {
119 if (s->leds & (1 << i)) {
120 leds_text[i] = '#';
121 } else {
122 leds_text[i] = ' ';
123 }
124 }
125 leds_text[8] = '\0';
126
127 trace_malta_fpga_leds(leds_text);
128 qemu_chr_fe_printf(&s->display, "\e[H\n\n|\e[32m%-8.8s\e[00m|\r\n",
129 leds_text);
130}
131
132static void malta_fpga_update_display_ascii(MaltaFPGAState *s)
133{
134 trace_malta_fpga_display(s->display_text);
135 qemu_chr_fe_printf(&s->display, "\n\n\n\n|\e[31m%-8.8s\e[00m|",
136 s->display_text);
137}
138
139
140
141
142
143
144
145
146
147
148
149#if defined(DEBUG)
150# define logout(fmt, ...) \
151 fprintf(stderr, "MALTA\t%-24s" fmt, __func__, ## __VA_ARGS__)
152#else
153# define logout(fmt, ...) ((void)0)
154#endif
155
156struct _eeprom24c0x_t {
157 uint8_t tick;
158 uint8_t address;
159 uint8_t command;
160 uint8_t ack;
161 uint8_t scl;
162 uint8_t sda;
163 uint8_t data;
164
165 uint8_t contents[256];
166};
167
168typedef struct _eeprom24c0x_t eeprom24c0x_t;
169
170static eeprom24c0x_t spd_eeprom = {
171 .contents = {
172
173 0x80, 0x08, 0xFF, 0x0D, 0x0A, 0xFF, 0x40, 0x00,
174
175 0x01, 0x75, 0x54, 0x00, 0x82, 0x08, 0x00, 0x01,
176
177 0x8F, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00,
178
179 0x00, 0x00, 0x00, 0x14, 0x0F, 0x14, 0x2D, 0xFF,
180
181 0x15, 0x08, 0x15, 0x08, 0x00, 0x00, 0x00, 0x00,
182
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186
187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xD0,
188
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xF4,
204 },
205};
206
207static void generate_eeprom_spd(uint8_t *eeprom, ram_addr_t ram_size)
208{
209 enum { SDR = 0x4, DDR2 = 0x8 } type;
210 uint8_t *spd = spd_eeprom.contents;
211 uint8_t nbanks = 0;
212 uint16_t density = 0;
213 int i;
214
215
216 ram_size /= MiB;
217
218 while ((ram_size >= 4) && (nbanks <= 2)) {
219 int sz_log2 = MIN(31 - clz32(ram_size), 14);
220 nbanks++;
221 density |= 1 << (sz_log2 - 2);
222 ram_size -= 1 << sz_log2;
223 }
224
225
226 if ((nbanks == 1) && (density > 1)) {
227 nbanks++;
228 density >>= 1;
229 }
230
231 if (density & 0xff00) {
232 density = (density & 0xe0) | ((density >> 8) & 0x1f);
233 type = DDR2;
234 } else if (!(density & 0x1f)) {
235 type = DDR2;
236 } else {
237 type = SDR;
238 }
239
240 if (ram_size) {
241 warn_report("SPD cannot represent final " RAM_ADDR_FMT "MB"
242 " of SDRAM", ram_size);
243 }
244
245
246 spd[2] = type;
247 spd[5] = nbanks;
248 spd[31] = density;
249
250
251 spd[63] = 0;
252 for (i = 0; i < 63; i++) {
253 spd[63] += spd[i];
254 }
255
256
257 memcpy(eeprom, spd, sizeof(spd_eeprom.contents));
258}
259
260static void generate_eeprom_serial(uint8_t *eeprom)
261{
262 int i, pos = 0;
263 uint8_t mac[6] = { 0x00 };
264 uint8_t sn[5] = { 0x01, 0x23, 0x45, 0x67, 0x89 };
265
266
267 eeprom[pos++] = 0x01;
268
269
270 eeprom[pos++] = 0x02;
271
272
273 eeprom[pos++] = 0x01;
274 eeprom[pos++] = 0x06;
275 memcpy(&eeprom[pos], mac, sizeof(mac));
276 pos += sizeof(mac);
277
278
279 eeprom[pos++] = 0x02;
280 eeprom[pos++] = 0x05;
281 memcpy(&eeprom[pos], sn, sizeof(sn));
282 pos += sizeof(sn);
283
284
285 eeprom[pos] = 0;
286 for (i = 0; i < pos; i++) {
287 eeprom[pos] += eeprom[i];
288 }
289}
290
291static uint8_t eeprom24c0x_read(eeprom24c0x_t *eeprom)
292{
293 logout("%u: scl = %u, sda = %u, data = 0x%02x\n",
294 eeprom->tick, eeprom->scl, eeprom->sda, eeprom->data);
295 return eeprom->sda;
296}
297
298static void eeprom24c0x_write(eeprom24c0x_t *eeprom, int scl, int sda)
299{
300 if (eeprom->scl && scl && (eeprom->sda != sda)) {
301 logout("%u: scl = %u->%u, sda = %u->%u i2c %s\n",
302 eeprom->tick, eeprom->scl, scl, eeprom->sda, sda,
303 sda ? "stop" : "start");
304 if (!sda) {
305 eeprom->tick = 1;
306 eeprom->command = 0;
307 }
308 } else if (eeprom->tick == 0 && !eeprom->ack) {
309
310 logout("%u: scl = %u->%u, sda = %u->%u wait for i2c start\n",
311 eeprom->tick, eeprom->scl, scl, eeprom->sda, sda);
312 } else if (!eeprom->scl && scl) {
313 logout("%u: scl = %u->%u, sda = %u->%u trigger bit\n",
314 eeprom->tick, eeprom->scl, scl, eeprom->sda, sda);
315 if (eeprom->ack) {
316 logout("\ti2c ack bit = 0\n");
317 sda = 0;
318 eeprom->ack = 0;
319 } else if (eeprom->sda == sda) {
320 uint8_t bit = (sda != 0);
321 logout("\ti2c bit = %d\n", bit);
322 if (eeprom->tick < 9) {
323 eeprom->command <<= 1;
324 eeprom->command += bit;
325 eeprom->tick++;
326 if (eeprom->tick == 9) {
327 logout("\tcommand 0x%04x, %s\n", eeprom->command,
328 bit ? "read" : "write");
329 eeprom->ack = 1;
330 }
331 } else if (eeprom->tick < 17) {
332 if (eeprom->command & 1) {
333 sda = ((eeprom->data & 0x80) != 0);
334 }
335 eeprom->address <<= 1;
336 eeprom->address += bit;
337 eeprom->tick++;
338 eeprom->data <<= 1;
339 if (eeprom->tick == 17) {
340 eeprom->data = eeprom->contents[eeprom->address];
341 logout("\taddress 0x%04x, data 0x%02x\n",
342 eeprom->address, eeprom->data);
343 eeprom->ack = 1;
344 eeprom->tick = 0;
345 }
346 } else if (eeprom->tick >= 17) {
347 sda = 0;
348 }
349 } else {
350 logout("\tsda changed with raising scl\n");
351 }
352 } else {
353 logout("%u: scl = %u->%u, sda = %u->%u\n", eeprom->tick, eeprom->scl,
354 scl, eeprom->sda, sda);
355 }
356 eeprom->scl = scl;
357 eeprom->sda = sda;
358}
359
360static uint64_t malta_fpga_read(void *opaque, hwaddr addr,
361 unsigned size)
362{
363 MaltaFPGAState *s = opaque;
364 uint32_t val = 0;
365 uint32_t saddr;
366
367 saddr = (addr & 0xfffff);
368
369 switch (saddr) {
370
371
372 case 0x00200:
373 val = 0x00000000;
374 break;
375
376
377 case 0x00208:
378#if TARGET_BIG_ENDIAN
379 val = 0x00000012;
380#else
381 val = 0x00000010;
382#endif
383 break;
384
385
386 case 0x00210:
387 val = 0x00;
388 break;
389
390
391 case 0x00408:
392 val = s->leds;
393 break;
394
395
396 case 0x00508:
397 val = s->brk;
398 break;
399
400
401
402
403 case 0x00a00:
404 val = s->gpout;
405 break;
406
407
408
409
410 case 0x00a08:
411
412 if (s->i2csel) {
413 val = s->i2cout;
414 } else {
415 val = 0x00;
416 }
417 break;
418
419
420 case 0x00b00:
421 val = ((s->i2cin & ~1) | eeprom24c0x_read(&spd_eeprom));
422 break;
423
424
425 case 0x00b08:
426 val = s->i2coe;
427 break;
428
429
430 case 0x00b10:
431 val = s->i2cout;
432 break;
433
434
435 case 0x00b18:
436 val = s->i2csel;
437 break;
438
439 default:
440 qemu_log_mask(LOG_GUEST_ERROR,
441 "malta_fpga_read: Bad register addr 0x%"HWADDR_PRIX"\n",
442 addr);
443 break;
444 }
445 return val;
446}
447
448static void malta_fpga_write(void *opaque, hwaddr addr,
449 uint64_t val, unsigned size)
450{
451 MaltaFPGAState *s = opaque;
452 uint32_t saddr;
453
454 saddr = (addr & 0xfffff);
455
456 switch (saddr) {
457
458
459 case 0x00200:
460 break;
461
462
463 case 0x00210:
464 break;
465
466
467 case 0x00408:
468 s->leds = val & 0xff;
469 malta_fpga_update_display_leds(s);
470 break;
471
472
473 case 0x00410:
474 snprintf(s->display_text, 9, "%08X", (uint32_t)val);
475 malta_fpga_update_display_ascii(s);
476 break;
477
478
479 case 0x00418:
480 case 0x00420:
481 case 0x00428:
482 case 0x00430:
483 case 0x00438:
484 case 0x00440:
485 case 0x00448:
486 case 0x00450:
487 s->display_text[(saddr - 0x00418) >> 3] = (char) val;
488 malta_fpga_update_display_ascii(s);
489 break;
490
491
492 case 0x00500:
493 if (val == 0x42) {
494 qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
495 }
496 break;
497
498
499 case 0x00508:
500 s->brk = val & 0xff;
501 break;
502
503
504
505
506 case 0x00a00:
507 s->gpout = val & 0xff;
508 break;
509
510
511 case 0x00b08:
512 s->i2coe = val & 0x03;
513 break;
514
515
516 case 0x00b10:
517 eeprom24c0x_write(&spd_eeprom, val & 0x02, val & 0x01);
518 s->i2cout = val;
519 break;
520
521
522 case 0x00b18:
523 s->i2csel = val & 0x01;
524 break;
525
526 default:
527 qemu_log_mask(LOG_GUEST_ERROR,
528 "malta_fpga_write: Bad register addr 0x%"HWADDR_PRIX"\n",
529 addr);
530 break;
531 }
532}
533
534static const MemoryRegionOps malta_fpga_ops = {
535 .read = malta_fpga_read,
536 .write = malta_fpga_write,
537 .endianness = DEVICE_NATIVE_ENDIAN,
538};
539
540static void malta_fpga_reset(void *opaque)
541{
542 MaltaFPGAState *s = opaque;
543
544 s->leds = 0x00;
545 s->brk = 0x0a;
546 s->gpout = 0x00;
547 s->i2cin = 0x3;
548 s->i2coe = 0x0;
549 s->i2cout = 0x3;
550 s->i2csel = 0x1;
551
552 s->display_text[8] = '\0';
553 snprintf(s->display_text, 9, " ");
554}
555
556static void malta_fgpa_display_event(void *opaque, QEMUChrEvent event)
557{
558 MaltaFPGAState *s = opaque;
559
560 if (event == CHR_EVENT_OPENED && !s->display_inited) {
561 qemu_chr_fe_printf(&s->display, "\e[HMalta LEDBAR\r\n");
562 qemu_chr_fe_printf(&s->display, "+--------+\r\n");
563 qemu_chr_fe_printf(&s->display, "+ +\r\n");
564 qemu_chr_fe_printf(&s->display, "+--------+\r\n");
565 qemu_chr_fe_printf(&s->display, "\n");
566 qemu_chr_fe_printf(&s->display, "Malta ASCII\r\n");
567 qemu_chr_fe_printf(&s->display, "+--------+\r\n");
568 qemu_chr_fe_printf(&s->display, "+ +\r\n");
569 qemu_chr_fe_printf(&s->display, "+--------+\r\n");
570 s->display_inited = true;
571 }
572}
573
574static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
575 hwaddr base, qemu_irq uart_irq, Chardev *uart_chr)
576{
577 MaltaFPGAState *s;
578 Chardev *chr;
579
580 s = g_new0(MaltaFPGAState, 1);
581
582 memory_region_init_io(&s->iomem, NULL, &malta_fpga_ops, s,
583 "malta-fpga", 0x100000);
584 memory_region_init_alias(&s->iomem_lo, NULL, "malta-fpga",
585 &s->iomem, 0, 0x900);
586 memory_region_init_alias(&s->iomem_hi, NULL, "malta-fpga",
587 &s->iomem, 0xa00, 0x100000 - 0xa00);
588
589 memory_region_add_subregion(address_space, base, &s->iomem_lo);
590 memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi);
591
592 chr = qemu_chr_new("fpga", "vc:320x200", NULL);
593 qemu_chr_fe_init(&s->display, chr, NULL);
594 qemu_chr_fe_set_handlers(&s->display, NULL, NULL,
595 malta_fgpa_display_event, NULL, s, NULL, true);
596
597 s->uart = serial_mm_init(address_space, base + 0x900, 3, uart_irq,
598 230400, uart_chr, DEVICE_NATIVE_ENDIAN);
599
600 malta_fpga_reset(s);
601 qemu_register_reset(malta_fpga_reset, s);
602
603 return s;
604}
605
606
607static void network_init(PCIBus *pci_bus)
608{
609 int i;
610
611 for (i = 0; i < nb_nics; i++) {
612 NICInfo *nd = &nd_table[i];
613 const char *default_devaddr = NULL;
614
615 if (i == 0 && (!nd->model || strcmp(nd->model, "pcnet") == 0))
616
617 default_devaddr = "0b";
618
619 pci_nic_init_nofail(nd, pci_bus, "pcnet", default_devaddr);
620 }
621}
622
623static void bl_setup_gt64120_jump_kernel(void **p, uint64_t run_addr,
624 uint64_t kernel_entry)
625{
626 static const char pci_pins_cfg[PCI_NUM_PINS] = {
627 10, 10, 11, 11
628 };
629
630
631#if TARGET_BIG_ENDIAN
632#define cpu_to_gt32(x) (x)
633#else
634#define cpu_to_gt32(x) bswap32(x)
635#endif
636
637
638
639
640 bl_gen_write_u32(p,
641 cpu_mips_phys_to_kseg1(NULL, 0x14000000 + 0x68),
642 cpu_to_gt32(0x1be00000 << 3));
643
644
645 bl_gen_write_u32(p,
646 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x48),
647 cpu_to_gt32(0x18000000 << 3));
648 bl_gen_write_u32(p,
649 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x50),
650 cpu_to_gt32(0x08000000 << 3));
651
652
653 bl_gen_write_u32(p,
654 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x58),
655 cpu_to_gt32(0x10000000 << 3));
656 bl_gen_write_u32(p,
657 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x60),
658 cpu_to_gt32(0x07e00000 << 3));
659 bl_gen_write_u32(p,
660 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x80),
661 cpu_to_gt32(0x18200000 << 3));
662 bl_gen_write_u32(p,
663 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0x88),
664 cpu_to_gt32(0x0bc00000 << 3));
665
666#undef cpu_to_gt32
667
668
669
670
671
672
673 bl_gen_write_u32(p,
674 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0xcf8),
675 tswap32((1 << 31)
676 | PCI_BUILD_BDF(0, PIIX4_PCI_DEVFN) << 8
677 | PIIX_PIRQCA));
678 bl_gen_write_u32(p,
679 cpu_mips_phys_to_kseg1(NULL, 0x1be00000 + 0xcfc),
680 tswap32(ldl_be_p(pci_pins_cfg)));
681
682 bl_gen_jump_kernel(p,
683 true, ENVP_VADDR - 64,
684
685
686
687
688 !semihosting_get_argc(), 2,
689 true, ENVP_VADDR,
690 true, ENVP_VADDR + 8,
691 true, loaderparams.ram_low_size,
692 kernel_entry);
693}
694
695static void write_bootloader_nanomips(uint8_t *base, uint64_t run_addr,
696 uint64_t kernel_entry)
697{
698 uint16_t *p;
699
700
701 p = (uint16_t *)base;
702
703 stw_p(p++, 0x2800); stw_p(p++, 0x001c);
704
705 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
706
707 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
708
709 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
710
711 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
712
713 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
714
715 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
716
717 stw_p(p++, 0x8000); stw_p(p++, 0xc000);
718
719
720
721
722 bl_setup_gt64120_jump_kernel((void **)&p, run_addr, kernel_entry);
723}
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747static void write_bootloader(uint8_t *base, uint64_t run_addr,
748 uint64_t kernel_entry)
749{
750 uint32_t *p;
751 void *v;
752
753
754 p = (uint32_t *)base;
755
756 stl_p(p++, 0x08000000 |
757 ((run_addr + 0x580) & 0x0fffffff) >> 2);
758 stl_p(p++, 0x00000000);
759
760
761 stl_p(base + 0x500, run_addr + 0x0580);
762 stl_p(base + 0x504, run_addr + 0x083c);
763 stl_p(base + 0x520, run_addr + 0x0580);
764 stl_p(base + 0x52c, run_addr + 0x0800);
765 stl_p(base + 0x534, run_addr + 0x0808);
766 stl_p(base + 0x538, run_addr + 0x0800);
767 stl_p(base + 0x53c, run_addr + 0x0800);
768 stl_p(base + 0x540, run_addr + 0x0800);
769 stl_p(base + 0x544, run_addr + 0x0800);
770 stl_p(base + 0x548, run_addr + 0x0800);
771 stl_p(base + 0x54c, run_addr + 0x0800);
772 stl_p(base + 0x550, run_addr + 0x0800);
773 stl_p(base + 0x554, run_addr + 0x0800);
774
775
776
777 p = (uint32_t *) (base + 0x580);
778
779
780
781
782
783
784
785
786
787
788 v = p;
789 bl_setup_gt64120_jump_kernel(&v, run_addr, kernel_entry);
790 p = v;
791
792
793 p = (uint32_t *) (base + 0x800);
794 stl_p(p++, 0x03e00009);
795 stl_p(p++, 0x24020000);
796
797 stl_p(p++, 0x03e06821);
798 stl_p(p++, 0x00805821);
799 stl_p(p++, 0x00a05021);
800 stl_p(p++, 0x91440000);
801 stl_p(p++, 0x254a0001);
802 stl_p(p++, 0x10800005);
803 stl_p(p++, 0x00000000);
804 stl_p(p++, 0x0ff0021c);
805 stl_p(p++, 0x00000000);
806 stl_p(p++, 0x1000fff9);
807 stl_p(p++, 0x00000000);
808 stl_p(p++, 0x01a00009);
809 stl_p(p++, 0x01602021);
810
811 stl_p(p++, 0x03e06821);
812 stl_p(p++, 0x00805821);
813 stl_p(p++, 0x00a05021);
814 stl_p(p++, 0x00c06021);
815 stl_p(p++, 0x91440000);
816 stl_p(p++, 0x0ff0021c);
817 stl_p(p++, 0x00000000);
818 stl_p(p++, 0x254a0001);
819 stl_p(p++, 0x258cffff);
820 stl_p(p++, 0x1580fffa);
821 stl_p(p++, 0x00000000);
822 stl_p(p++, 0x01a00009);
823 stl_p(p++, 0x01602021);
824
825 stl_p(p++, 0x3c08b800);
826 stl_p(p++, 0x350803f8);
827 stl_p(p++, 0x91090005);
828 stl_p(p++, 0x00000000);
829 stl_p(p++, 0x31290040);
830 stl_p(p++, 0x1120fffc);
831 stl_p(p++, 0x00000000);
832 stl_p(p++, 0x03e00009);
833 stl_p(p++, 0xa1040000);
834}
835
836static void G_GNUC_PRINTF(3, 4) prom_set(uint32_t *prom_buf, int index,
837 const char *string, ...)
838{
839 va_list ap;
840 uint32_t table_addr;
841
842 if (index >= ENVP_NB_ENTRIES) {
843 return;
844 }
845
846 if (string == NULL) {
847 prom_buf[index] = 0;
848 return;
849 }
850
851 table_addr = sizeof(uint32_t) * ENVP_NB_ENTRIES + index * ENVP_ENTRY_SIZE;
852 prom_buf[index] = tswap32(ENVP_VADDR + table_addr);
853
854 va_start(ap, string);
855 vsnprintf((char *)prom_buf + table_addr, ENVP_ENTRY_SIZE, string, ap);
856 va_end(ap);
857}
858
859static void reinitialize_rng_seed(void *opaque)
860{
861 char *rng_seed_hex = opaque;
862 uint8_t rng_seed[32];
863
864 qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
865 for (size_t i = 0; i < sizeof(rng_seed); ++i) {
866 sprintf(rng_seed_hex + i * 2, "%02x", rng_seed[i]);
867 }
868}
869
870
871static uint64_t load_kernel(void)
872{
873 uint64_t kernel_entry, kernel_high, initrd_size;
874 long kernel_size;
875 ram_addr_t initrd_offset;
876 int big_endian;
877 uint32_t *prom_buf;
878 long prom_size;
879 int prom_index = 0;
880 uint8_t rng_seed[32];
881 char rng_seed_hex[sizeof(rng_seed) * 2 + 1];
882 size_t rng_seed_prom_offset;
883
884#if TARGET_BIG_ENDIAN
885 big_endian = 1;
886#else
887 big_endian = 0;
888#endif
889
890 kernel_size = load_elf(loaderparams.kernel_filename, NULL,
891 cpu_mips_kseg0_to_phys, NULL,
892 &kernel_entry, NULL,
893 &kernel_high, NULL, big_endian, EM_MIPS,
894 1, 0);
895 if (kernel_size < 0) {
896 error_report("could not load kernel '%s': %s",
897 loaderparams.kernel_filename,
898 load_elf_strerror(kernel_size));
899 exit(1);
900 }
901
902
903 if (kernel_entry <= USEG_LIMIT) {
904 error_report("Trap-and-Emul kernels (Linux CONFIG_KVM_GUEST)"
905 " are not supported");
906 exit(1);
907 }
908
909
910 initrd_size = 0;
911 initrd_offset = 0;
912 if (loaderparams.initrd_filename) {
913 initrd_size = get_image_size(loaderparams.initrd_filename);
914 if (initrd_size > 0) {
915
916
917
918
919
920 initrd_offset = ROUND_UP(loaderparams.ram_low_size
921 - (initrd_size + 128 * KiB),
922 INITRD_PAGE_SIZE);
923 if (kernel_high >= initrd_offset) {
924 error_report("memory too small for initial ram disk '%s'",
925 loaderparams.initrd_filename);
926 exit(1);
927 }
928 initrd_size = load_image_targphys(loaderparams.initrd_filename,
929 initrd_offset,
930 loaderparams.ram_size - initrd_offset);
931 }
932 if (initrd_size == (target_ulong) -1) {
933 error_report("could not load initial ram disk '%s'",
934 loaderparams.initrd_filename);
935 exit(1);
936 }
937 }
938
939
940 prom_size = ENVP_NB_ENTRIES * (sizeof(int32_t) + ENVP_ENTRY_SIZE);
941 prom_buf = g_malloc(prom_size);
942
943 prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_filename);
944 if (initrd_size > 0) {
945 prom_set(prom_buf, prom_index++,
946 "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
947 cpu_mips_phys_to_kseg0(NULL, initrd_offset),
948 initrd_size, loaderparams.kernel_cmdline);
949 } else {
950 prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_cmdline);
951 }
952
953 prom_set(prom_buf, prom_index++, "memsize");
954 prom_set(prom_buf, prom_index++, "%u", loaderparams.ram_low_size);
955
956 prom_set(prom_buf, prom_index++, "ememsize");
957 prom_set(prom_buf, prom_index++, "%u", loaderparams.ram_size);
958
959 prom_set(prom_buf, prom_index++, "modetty0");
960 prom_set(prom_buf, prom_index++, "38400n8r");
961
962 qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
963 for (size_t i = 0; i < sizeof(rng_seed); ++i) {
964 sprintf(rng_seed_hex + i * 2, "%02x", rng_seed[i]);
965 }
966 prom_set(prom_buf, prom_index++, "rngseed");
967 rng_seed_prom_offset = prom_index * ENVP_ENTRY_SIZE +
968 sizeof(uint32_t) * ENVP_NB_ENTRIES;
969 prom_set(prom_buf, prom_index++, "%s", rng_seed_hex);
970
971 prom_set(prom_buf, prom_index++, NULL);
972
973 rom_add_blob_fixed("prom", prom_buf, prom_size, ENVP_PADDR);
974 qemu_register_reset_nosnapshotload(reinitialize_rng_seed,
975 rom_ptr(ENVP_PADDR, prom_size) + rng_seed_prom_offset);
976
977 g_free(prom_buf);
978 return kernel_entry;
979}
980
981static void malta_mips_config(MIPSCPU *cpu)
982{
983 MachineState *ms = MACHINE(qdev_get_machine());
984 unsigned int smp_cpus = ms->smp.cpus;
985 CPUMIPSState *env = &cpu->env;
986 CPUState *cs = CPU(cpu);
987
988 if (ase_mt_available(env)) {
989 env->mvp->CP0_MVPConf0 = deposit32(env->mvp->CP0_MVPConf0,
990 CP0MVPC0_PTC, 8,
991 smp_cpus * cs->nr_threads - 1);
992 env->mvp->CP0_MVPConf0 = deposit32(env->mvp->CP0_MVPConf0,
993 CP0MVPC0_PVPE, 4, smp_cpus - 1);
994 }
995}
996
997static int malta_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
998{
999 int slot;
1000
1001 slot = PCI_SLOT(pci_dev->devfn);
1002
1003 switch (slot) {
1004
1005 case 10:
1006 return 3;
1007
1008 case 11:
1009 return 1;
1010
1011 case 12:
1012 return 2;
1013
1014 case 18 ... 21:
1015 return ((slot - 18) + irq_num) & 0x03;
1016
1017 default:
1018 return irq_num;
1019 }
1020}
1021
1022static void main_cpu_reset(void *opaque)
1023{
1024 MIPSCPU *cpu = opaque;
1025 CPUMIPSState *env = &cpu->env;
1026
1027 cpu_reset(CPU(cpu));
1028
1029
1030
1031
1032
1033
1034 if (loaderparams.kernel_filename) {
1035 env->CP0_Status &= ~(1 << CP0St_ERL);
1036 }
1037
1038 malta_mips_config(cpu);
1039}
1040
1041static void create_cpu_without_cps(MachineState *ms, MaltaState *s,
1042 qemu_irq *cbus_irq, qemu_irq *i8259_irq)
1043{
1044 CPUMIPSState *env;
1045 MIPSCPU *cpu;
1046 int i;
1047
1048 for (i = 0; i < ms->smp.cpus; i++) {
1049 cpu = mips_cpu_create_with_clock(ms->cpu_type, s->cpuclk);
1050
1051
1052 cpu_mips_irq_init_cpu(cpu);
1053 cpu_mips_clock_init(cpu);
1054 qemu_register_reset(main_cpu_reset, cpu);
1055 }
1056
1057 cpu = MIPS_CPU(first_cpu);
1058 env = &cpu->env;
1059 *i8259_irq = env->irq[2];
1060 *cbus_irq = env->irq[4];
1061}
1062
1063static void create_cps(MachineState *ms, MaltaState *s,
1064 qemu_irq *cbus_irq, qemu_irq *i8259_irq)
1065{
1066 object_initialize_child(OBJECT(s), "cps", &s->cps, TYPE_MIPS_CPS);
1067 object_property_set_str(OBJECT(&s->cps), "cpu-type", ms->cpu_type,
1068 &error_fatal);
1069 object_property_set_uint(OBJECT(&s->cps), "num-vp", ms->smp.cpus,
1070 &error_fatal);
1071 qdev_connect_clock_in(DEVICE(&s->cps), "clk-in", s->cpuclk);
1072 sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
1073
1074 sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->cps), 0, 0, 1);
1075
1076 *i8259_irq = get_cps_irq(&s->cps, 3);
1077 *cbus_irq = NULL;
1078}
1079
1080static void mips_create_cpu(MachineState *ms, MaltaState *s,
1081 qemu_irq *cbus_irq, qemu_irq *i8259_irq)
1082{
1083 if ((ms->smp.cpus > 1) && cpu_type_supports_cps_smp(ms->cpu_type)) {
1084 create_cps(ms, s, cbus_irq, i8259_irq);
1085 } else {
1086 create_cpu_without_cps(ms, s, cbus_irq, i8259_irq);
1087 }
1088}
1089
1090static
1091void mips_malta_init(MachineState *machine)
1092{
1093 ram_addr_t ram_size = machine->ram_size;
1094 ram_addr_t ram_low_size;
1095 const char *kernel_filename = machine->kernel_filename;
1096 const char *kernel_cmdline = machine->kernel_cmdline;
1097 const char *initrd_filename = machine->initrd_filename;
1098 char *filename;
1099 PFlashCFI01 *fl;
1100 MemoryRegion *system_memory = get_system_memory();
1101 MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
1102 MemoryRegion *ram_low_postio;
1103 MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
1104 const size_t smbus_eeprom_size = 8 * 256;
1105 uint8_t *smbus_eeprom_buf = g_malloc0(smbus_eeprom_size);
1106 uint64_t kernel_entry, bootloader_run_addr;
1107 PCIBus *pci_bus;
1108 ISABus *isa_bus;
1109 qemu_irq cbus_irq, i8259_irq;
1110 I2CBus *smbus;
1111 DriveInfo *dinfo;
1112 int fl_idx = 0;
1113 int be;
1114 MaltaState *s;
1115 PCIDevice *piix4;
1116 DeviceState *dev;
1117
1118 s = MIPS_MALTA(qdev_new(TYPE_MIPS_MALTA));
1119 sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
1120
1121
1122 mips_create_cpu(machine, s, &cbus_irq, &i8259_irq);
1123
1124
1125 if (ram_size > 2 * GiB) {
1126 error_report("Too much memory for this machine: %" PRId64 "MB,"
1127 " maximum 2048MB", ram_size / MiB);
1128 exit(1);
1129 }
1130
1131
1132 memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
1133
1134
1135 memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
1136 machine->ram, 0, MIN(ram_size, 256 * MiB));
1137 memory_region_add_subregion(system_memory, 0, ram_low_preio);
1138
1139
1140 if (ram_size > 512 * MiB) {
1141 ram_low_postio = g_new(MemoryRegion, 1);
1142 memory_region_init_alias(ram_low_postio, NULL,
1143 "mips_malta_low_postio.ram",
1144 machine->ram, 512 * MiB,
1145 ram_size - 512 * MiB);
1146 memory_region_add_subregion(system_memory, 512 * MiB,
1147 ram_low_postio);
1148 }
1149
1150#if TARGET_BIG_ENDIAN
1151 be = 1;
1152#else
1153 be = 0;
1154#endif
1155
1156
1157
1158
1159 malta_fpga_init(system_memory, FPGA_ADDRESS, cbus_irq, serial_hd(2));
1160
1161
1162 dinfo = drive_get(IF_PFLASH, 0, fl_idx);
1163 fl = pflash_cfi01_register(FLASH_ADDRESS, "mips_malta.bios",
1164 FLASH_SIZE,
1165 dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
1166 65536,
1167 4, 0x0000, 0x0000, 0x0000, 0x0000, be);
1168 bios = pflash_cfi01_get_memory(fl);
1169 fl_idx++;
1170 if (kernel_filename) {
1171 ram_low_size = MIN(ram_size, 256 * MiB);
1172 bootloader_run_addr = cpu_mips_phys_to_kseg0(NULL, RESET_ADDRESS);
1173
1174
1175 loaderparams.ram_size = ram_size;
1176 loaderparams.ram_low_size = ram_low_size;
1177 loaderparams.kernel_filename = kernel_filename;
1178 loaderparams.kernel_cmdline = kernel_cmdline;
1179 loaderparams.initrd_filename = initrd_filename;
1180 kernel_entry = load_kernel();
1181
1182 if (!cpu_type_supports_isa(machine->cpu_type, ISA_NANOMIPS32)) {
1183 write_bootloader(memory_region_get_ram_ptr(bios),
1184 bootloader_run_addr, kernel_entry);
1185 } else {
1186 write_bootloader_nanomips(memory_region_get_ram_ptr(bios),
1187 bootloader_run_addr, kernel_entry);
1188 }
1189 } else {
1190 target_long bios_size = FLASH_SIZE;
1191
1192 if (!dinfo) {
1193
1194 filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
1195 machine->firmware ?: BIOS_FILENAME);
1196 if (filename) {
1197 bios_size = load_image_targphys(filename, FLASH_ADDRESS,
1198 BIOS_SIZE);
1199 g_free(filename);
1200 } else {
1201 bios_size = -1;
1202 }
1203 if ((bios_size < 0 || bios_size > BIOS_SIZE) &&
1204 machine->firmware && !qtest_enabled()) {
1205 error_report("Could not load MIPS bios '%s'", machine->firmware);
1206 exit(1);
1207 }
1208 }
1209
1210
1211
1212
1213#if !TARGET_BIG_ENDIAN
1214 {
1215 uint32_t *end, *addr;
1216 const size_t swapsize = MIN(bios_size, 0x3e0000);
1217 addr = rom_ptr(FLASH_ADDRESS, swapsize);
1218 if (!addr) {
1219 addr = memory_region_get_ram_ptr(bios);
1220 }
1221 end = (void *)addr + swapsize;
1222 while (addr < end) {
1223 bswap32s(addr);
1224 addr++;
1225 }
1226 }
1227#endif
1228 }
1229
1230
1231
1232
1233
1234
1235
1236 memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE,
1237 &error_fatal);
1238 if (!rom_copy(memory_region_get_ram_ptr(bios_copy),
1239 FLASH_ADDRESS, BIOS_SIZE)) {
1240 memcpy(memory_region_get_ram_ptr(bios_copy),
1241 memory_region_get_ram_ptr(bios), BIOS_SIZE);
1242 }
1243 memory_region_set_readonly(bios_copy, true);
1244 memory_region_add_subregion(system_memory, RESET_ADDRESS, bios_copy);
1245
1246
1247 stl_p(memory_region_get_ram_ptr(bios_copy) + 0x10, 0x00000420);
1248
1249
1250 dev = qdev_new("gt64120");
1251 qdev_prop_set_bit(dev, "cpu-little-endian", !be);
1252 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1253 pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
1254 pci_bus_map_irqs(pci_bus, malta_pci_slot_get_pirq);
1255
1256
1257 piix4 = pci_create_simple_multifunction(pci_bus, PIIX4_PCI_DEVFN, true,
1258 TYPE_PIIX4_PCI_DEVICE);
1259 isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix4), "isa.0"));
1260
1261 dev = DEVICE(object_resolve_path_component(OBJECT(piix4), "ide"));
1262 pci_ide_create_devs(PCI_DEVICE(dev));
1263
1264
1265 qdev_connect_gpio_out_named(DEVICE(piix4), "intr", 0, i8259_irq);
1266
1267
1268 dev = DEVICE(object_resolve_path_component(OBJECT(piix4), "pm"));
1269 smbus = I2C_BUS(qdev_get_child_bus(dev, "i2c"));
1270 generate_eeprom_spd(&smbus_eeprom_buf[0 * 256], ram_size);
1271 generate_eeprom_serial(&smbus_eeprom_buf[6 * 256]);
1272 smbus_eeprom_init(smbus, 8, smbus_eeprom_buf, smbus_eeprom_size);
1273 g_free(smbus_eeprom_buf);
1274
1275
1276 isa_create_simple(isa_bus, TYPE_FDC37M81X_SUPERIO);
1277
1278
1279 network_init(pci_bus);
1280
1281
1282 pci_vga_init(pci_bus);
1283}
1284
1285static void mips_malta_instance_init(Object *obj)
1286{
1287 MaltaState *s = MIPS_MALTA(obj);
1288
1289 s->cpuclk = qdev_init_clock_out(DEVICE(obj), "cpu-refclk");
1290 clock_set_hz(s->cpuclk, 320000000);
1291}
1292
1293static const TypeInfo mips_malta_device = {
1294 .name = TYPE_MIPS_MALTA,
1295 .parent = TYPE_SYS_BUS_DEVICE,
1296 .instance_size = sizeof(MaltaState),
1297 .instance_init = mips_malta_instance_init,
1298};
1299
1300GlobalProperty malta_compat[] = {
1301 { "PIIX4_PM", "memory-hotplug-support", "off" },
1302 { "PIIX4_PM", "acpi-pci-hotplug-with-bridge-support", "off" },
1303 { "PIIX4_PM", "acpi-root-pci-hotplug", "off" },
1304 { "PIIX4_PM", "x-not-migrate-acpi-index", "true" },
1305};
1306const size_t malta_compat_len = G_N_ELEMENTS(malta_compat);
1307
1308static void mips_malta_machine_init(MachineClass *mc)
1309{
1310 mc->desc = "MIPS Malta Core LV";
1311 mc->init = mips_malta_init;
1312 mc->block_default_type = IF_IDE;
1313 mc->max_cpus = 16;
1314 mc->is_default = true;
1315#ifdef TARGET_MIPS64
1316 mc->default_cpu_type = MIPS_CPU_TYPE_NAME("20Kc");
1317#else
1318 mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
1319#endif
1320 mc->default_ram_id = "mips_malta.ram";
1321 compat_props_add(mc->compat_props, malta_compat, malta_compat_len);
1322}
1323
1324DEFINE_MACHINE("malta", mips_malta_machine_init)
1325
1326static void mips_malta_register_types(void)
1327{
1328 type_register_static(&mips_malta_device);
1329}
1330
1331type_init(mips_malta_register_types)
1332