xref: /openbmc/qemu/hw/m68k/next-cube.c (revision 6eedbb5b)
1 /*
2  * NeXT Cube System Driver
3  *
4  * Copyright (c) 2011 Bryce Lanham
5  *
6  * This code is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published
8  * by the Free Software Foundation; either version 2 of the License,
9  * or (at your option) any later version.
10  */
11 
12 #include "qemu/osdep.h"
13 #include "exec/hwaddr.h"
14 #include "sysemu/sysemu.h"
15 #include "sysemu/qtest.h"
16 #include "hw/irq.h"
17 #include "hw/m68k/next-cube.h"
18 #include "hw/boards.h"
19 #include "hw/loader.h"
20 #include "hw/scsi/esp.h"
21 #include "hw/sysbus.h"
22 #include "qom/object.h"
23 #include "hw/char/escc.h" /* ZILOG 8530 Serial Emulation */
24 #include "hw/block/fdc.h"
25 #include "hw/qdev-properties.h"
26 #include "qapi/error.h"
27 #include "qemu/error-report.h"
28 #include "ui/console.h"
29 #include "target/m68k/cpu.h"
30 #include "migration/vmstate.h"
31 
32 /* #define DEBUG_NEXT */
33 #ifdef DEBUG_NEXT
34 #define DPRINTF(fmt, ...) \
35     do { printf("NeXT: " fmt , ## __VA_ARGS__); } while (0)
36 #else
37 #define DPRINTF(fmt, ...) do { } while (0)
38 #endif
39 
40 #define TYPE_NEXT_MACHINE MACHINE_TYPE_NAME("next-cube")
41 OBJECT_DECLARE_SIMPLE_TYPE(NeXTState, NEXT_MACHINE)
42 
43 #define ENTRY       0x0100001e
44 #define RAM_SIZE    0x4000000
45 #define ROM_FILE    "Rev_2.5_v66.bin"
46 
47 typedef struct next_dma {
48     uint32_t csr;
49 
50     uint32_t saved_next;
51     uint32_t saved_limit;
52     uint32_t saved_start;
53     uint32_t saved_stop;
54 
55     uint32_t next;
56     uint32_t limit;
57     uint32_t start;
58     uint32_t stop;
59 
60     uint32_t next_initbuf;
61     uint32_t size;
62 } next_dma;
63 
64 typedef struct NextRtc {
65     uint8_t ram[32];
66     uint8_t command;
67     uint8_t value;
68     uint8_t status;
69     uint8_t control;
70     uint8_t retval;
71 } NextRtc;
72 
73 struct NeXTState {
74     MachineState parent;
75 
76     next_dma dma[10];
77 };
78 
79 #define TYPE_NEXT_PC "next-pc"
80 OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC, NEXT_PC)
81 
82 /* NeXT Peripheral Controller */
83 struct NeXTPC {
84     SysBusDevice parent_obj;
85 
86     M68kCPU *cpu;
87 
88     MemoryRegion mmiomem;
89     MemoryRegion scrmem;
90 
91     uint32_t scr1;
92     uint32_t scr2;
93     uint8_t scsi_csr_1;
94     uint8_t scsi_csr_2;
95     uint32_t int_mask;
96     uint32_t int_status;
97 
98     NextRtc rtc;
99 };
100 
101 /* Thanks to NeXT forums for this */
102 /*
103 static const uint8_t rtc_ram3[32] = {
104     0x94, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
105     0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x7B, 0x00,
106     0x00, 0x00, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00,
107     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x13
108 };
109 */
110 static const uint8_t rtc_ram2[32] = {
111     0x94, 0x0f, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
112     0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x4b, 0x00,
113     0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
114     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e,
115 };
116 
117 #define SCR2_RTCLK 0x2
118 #define SCR2_RTDATA 0x4
119 #define SCR2_TOBCD(x) (((x / 10) << 4) + (x % 10))
120 
121 static void nextscr2_write(NeXTPC *s, uint32_t val, int size)
122 {
123     static int led;
124     static int phase;
125     static uint8_t old_scr2;
126     uint8_t scr2_2;
127     NextRtc *rtc = &s->rtc;
128 
129     if (size == 4) {
130         scr2_2 = (val >> 8) & 0xFF;
131     } else {
132         scr2_2 = val & 0xFF;
133     }
134 
135     if (val & 0x1) {
136         DPRINTF("fault!\n");
137         led++;
138         if (led == 10) {
139             DPRINTF("LED flashing, possible fault!\n");
140             led = 0;
141         }
142     }
143 
144     if (scr2_2 & 0x1) {
145         /* DPRINTF("RTC %x phase %i\n", scr2_2, phase); */
146         if (phase == -1) {
147             phase = 0;
148         }
149         /* If we are in going down clock... do something */
150         if (((old_scr2 & SCR2_RTCLK) != (scr2_2 & SCR2_RTCLK)) &&
151                 ((scr2_2 & SCR2_RTCLK) == 0)) {
152             if (phase < 8) {
153                 rtc->command = (rtc->command << 1) |
154                                ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
155             }
156             if (phase >= 8 && phase < 16) {
157                 rtc->value = (rtc->value << 1) |
158                              ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
159 
160                 /* if we read RAM register, output RT_DATA bit */
161                 if (rtc->command <= 0x1F) {
162                     scr2_2 = scr2_2 & (~SCR2_RTDATA);
163                     if (rtc->ram[rtc->command] & (0x80 >> (phase - 8))) {
164                         scr2_2 |= SCR2_RTDATA;
165                     }
166 
167                     rtc->retval = (rtc->retval << 1) |
168                                   ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
169                 }
170                 /* read the status 0x30 */
171                 if (rtc->command == 0x30) {
172                     scr2_2 = scr2_2 & (~SCR2_RTDATA);
173                     /* for now status = 0x98 (new rtc + FTU) */
174                     if (rtc->status & (0x80 >> (phase - 8))) {
175                         scr2_2 |= SCR2_RTDATA;
176                     }
177 
178                     rtc->retval = (rtc->retval << 1) |
179                                   ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
180                 }
181                 /* read the status 0x31 */
182                 if (rtc->command == 0x31) {
183                     scr2_2 = scr2_2 & (~SCR2_RTDATA);
184                     if (rtc->control & (0x80 >> (phase - 8))) {
185                         scr2_2 |= SCR2_RTDATA;
186                     }
187                     rtc->retval = (rtc->retval << 1) |
188                                   ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
189                 }
190 
191                 if ((rtc->command >= 0x20) && (rtc->command <= 0x2F)) {
192                     scr2_2 = scr2_2 & (~SCR2_RTDATA);
193                     /* for now 0x00 */
194                     time_t time_h = time(NULL);
195                     struct tm *info = localtime(&time_h);
196                     int ret = 0;
197 
198                     switch (rtc->command) {
199                     case 0x20:
200                         ret = SCR2_TOBCD(info->tm_sec);
201                         break;
202                     case 0x21:
203                         ret = SCR2_TOBCD(info->tm_min);
204                         break;
205                     case 0x22:
206                         ret = SCR2_TOBCD(info->tm_hour);
207                         break;
208                     case 0x24:
209                         ret = SCR2_TOBCD(info->tm_mday);
210                         break;
211                     case 0x25:
212                         ret = SCR2_TOBCD((info->tm_mon + 1));
213                         break;
214                     case 0x26:
215                         ret = SCR2_TOBCD((info->tm_year - 100));
216                         break;
217 
218                     }
219 
220                     if (ret & (0x80 >> (phase - 8))) {
221                         scr2_2 |= SCR2_RTDATA;
222                     }
223                     rtc->retval = (rtc->retval << 1) |
224                                   ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
225                 }
226 
227             }
228 
229             phase++;
230             if (phase == 16) {
231                 if (rtc->command >= 0x80 && rtc->command <= 0x9F) {
232                     rtc->ram[rtc->command - 0x80] = rtc->value;
233                 }
234                 /* write to x30 register */
235                 if (rtc->command == 0xB1) {
236                     /* clear FTU */
237                     if (rtc->value & 0x04) {
238                         rtc->status = rtc->status & (~0x18);
239                         s->int_status = s->int_status & (~0x04);
240                     }
241                 }
242             }
243         }
244     } else {
245         /* else end or abort */
246         phase = -1;
247         rtc->command = 0;
248         rtc->value = 0;
249     }
250     s->scr2 = val & 0xFFFF00FF;
251     s->scr2 |= scr2_2 << 8;
252     old_scr2 = scr2_2;
253 }
254 
255 static uint32_t mmio_readb(NeXTPC *s, hwaddr addr)
256 {
257     switch (addr) {
258     case 0xc000:
259         return (s->scr1 >> 24) & 0xFF;
260     case 0xc001:
261         return (s->scr1 >> 16) & 0xFF;
262     case 0xc002:
263         return (s->scr1 >> 8)  & 0xFF;
264     case 0xc003:
265         return (s->scr1 >> 0)  & 0xFF;
266 
267     case 0xd000:
268         return (s->scr2 >> 24) & 0xFF;
269     case 0xd001:
270         return (s->scr2 >> 16) & 0xFF;
271     case 0xd002:
272         return (s->scr2 >> 8)  & 0xFF;
273     case 0xd003:
274         return (s->scr2 >> 0)  & 0xFF;
275     case 0x14020:
276         DPRINTF("MMIO Read 0x4020\n");
277         return 0x7f;
278 
279     default:
280         DPRINTF("MMIO Read B @ %"HWADDR_PRIx"\n", addr);
281         return 0x0;
282     }
283 }
284 
285 static uint32_t mmio_readw(NeXTPC *s, hwaddr addr)
286 {
287     switch (addr) {
288     default:
289         DPRINTF("MMIO Read W @ %"HWADDR_PRIx"\n", addr);
290         return 0x0;
291     }
292 }
293 
294 static uint32_t mmio_readl(NeXTPC *s, hwaddr addr)
295 {
296     switch (addr) {
297     case 0x7000:
298         /* DPRINTF("Read INT status: %x\n", s->int_status); */
299         return s->int_status;
300 
301     case 0x7800:
302         DPRINTF("MMIO Read INT mask: %x\n", s->int_mask);
303         return s->int_mask;
304 
305     case 0xc000:
306         return s->scr1;
307 
308     case 0xd000:
309         return s->scr2;
310 
311     default:
312         DPRINTF("MMIO Read L @ %"HWADDR_PRIx"\n", addr);
313         return 0x0;
314     }
315 }
316 
317 static void mmio_writeb(NeXTPC *s, hwaddr addr, uint32_t val)
318 {
319     switch (addr) {
320     case 0xd003:
321         nextscr2_write(s, val, 1);
322         break;
323     default:
324         DPRINTF("MMIO Write B @ %x with %x\n", (unsigned int)addr, val);
325     }
326 
327 }
328 
329 static void mmio_writew(NeXTPC *s, hwaddr addr, uint32_t val)
330 {
331     DPRINTF("MMIO Write W\n");
332 }
333 
334 static void mmio_writel(NeXTPC *s, hwaddr addr, uint32_t val)
335 {
336     switch (addr) {
337     case 0x7000:
338         DPRINTF("INT Status old: %x new: %x\n", s->int_status, val);
339         s->int_status = val;
340         break;
341     case 0x7800:
342         DPRINTF("INT Mask old: %x new: %x\n", s->int_mask, val);
343         s->int_mask  = val;
344         break;
345     case 0xc000:
346         DPRINTF("SCR1 Write: %x\n", val);
347         break;
348     case 0xd000:
349         nextscr2_write(s, val, 4);
350         break;
351 
352     default:
353         DPRINTF("MMIO Write l @ %x with %x\n", (unsigned int)addr, val);
354     }
355 }
356 
357 static uint64_t mmio_readfn(void *opaque, hwaddr addr, unsigned size)
358 {
359     NeXTPC *s = NEXT_PC(opaque);
360 
361     switch (size) {
362     case 1:
363         return mmio_readb(s, addr);
364     case 2:
365         return mmio_readw(s, addr);
366     case 4:
367         return mmio_readl(s, addr);
368     default:
369         g_assert_not_reached();
370     }
371 }
372 
373 static void mmio_writefn(void *opaque, hwaddr addr, uint64_t value,
374                          unsigned size)
375 {
376     NeXTPC *s = NEXT_PC(opaque);
377 
378     switch (size) {
379     case 1:
380         mmio_writeb(s, addr, value);
381         break;
382     case 2:
383         mmio_writew(s, addr, value);
384         break;
385     case 4:
386         mmio_writel(s, addr, value);
387         break;
388     default:
389         g_assert_not_reached();
390     }
391 }
392 
393 static const MemoryRegionOps mmio_ops = {
394     .read = mmio_readfn,
395     .write = mmio_writefn,
396     .valid.min_access_size = 1,
397     .valid.max_access_size = 4,
398     .endianness = DEVICE_NATIVE_ENDIAN,
399 };
400 
401 static uint32_t scr_readb(NeXTPC *s, hwaddr addr)
402 {
403     switch (addr) {
404     case 0x14108:
405         DPRINTF("FD read @ %x\n", (unsigned int)addr);
406         return 0x40 | 0x04 | 0x2 | 0x1;
407     case 0x14020:
408         DPRINTF("SCSI 4020  STATUS READ %X\n", s->scsi_csr_1);
409         return s->scsi_csr_1;
410 
411     case 0x14021:
412         DPRINTF("SCSI 4021 STATUS READ %X\n", s->scsi_csr_2);
413         return 0x40;
414 
415     /*
416      * These 4 registers are the hardware timer, not sure which register
417      * is the latch instead of data, but no problems so far
418      */
419     case 0x1a000:
420         return 0xff & (clock() >> 24);
421     case 0x1a001:
422         return 0xff & (clock() >> 16);
423     case 0x1a002:
424         return 0xff & (clock() >> 8);
425     case 0x1a003:
426         /* Hack: We need to have this change consistently to make it work */
427         return 0xFF & clock();
428 
429     default:
430         DPRINTF("BMAP Read B @ %x\n", (unsigned int)addr);
431         return 0;
432     }
433 }
434 
435 static uint32_t scr_readw(NeXTPC *s, hwaddr addr)
436 {
437     DPRINTF("BMAP Read W @ %x\n", (unsigned int)addr);
438     return 0;
439 }
440 
441 static uint32_t scr_readl(NeXTPC *s, hwaddr addr)
442 {
443     DPRINTF("BMAP Read L @ %x\n", (unsigned int)addr);
444     return 0;
445 }
446 
447 #define SCSICSR_ENABLE  0x01
448 #define SCSICSR_RESET   0x02  /* reset scsi dma */
449 #define SCSICSR_FIFOFL  0x04
450 #define SCSICSR_DMADIR  0x08  /* if set, scsi to mem */
451 #define SCSICSR_CPUDMA  0x10  /* if set, dma enabled */
452 #define SCSICSR_INTMASK 0x20  /* if set, interrupt enabled */
453 
454 static void scr_writeb(NeXTPC *s, hwaddr addr, uint32_t value)
455 {
456     switch (addr) {
457     case 0x14108:
458         DPRINTF("FDCSR Write: %x\n", value);
459 
460         if (value == 0x0) {
461             /* qemu_irq_raise(s->fd_irq[0]); */
462         }
463         break;
464     case 0x14020: /* SCSI Control Register */
465         if (value & SCSICSR_FIFOFL) {
466             DPRINTF("SCSICSR FIFO Flush\n");
467             /* will have to add another irq to the esp if this is needed */
468             /* esp_puflush_fifo(esp_g); */
469             /* qemu_irq_pulse(s->scsi_dma); */
470         }
471 
472         if (value & SCSICSR_ENABLE) {
473             DPRINTF("SCSICSR Enable\n");
474             /*
475              * qemu_irq_raise(s->scsi_dma);
476              * s->scsi_csr_1 = 0xc0;
477              * s->scsi_csr_1 |= 0x1;
478              * qemu_irq_pulse(s->scsi_dma);
479              */
480         }
481         /*
482          * else
483          *     s->scsi_csr_1 &= ~SCSICSR_ENABLE;
484          */
485 
486         if (value & SCSICSR_RESET) {
487             DPRINTF("SCSICSR Reset\n");
488             /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
489             /* qemu_irq_raise(s->scsi_reset); */
490             /* s->scsi_csr_1 &= ~(SCSICSR_INTMASK |0x80|0x1); */
491 
492         }
493         if (value & SCSICSR_DMADIR) {
494             DPRINTF("SCSICSR DMAdir\n");
495         }
496         if (value & SCSICSR_CPUDMA) {
497             DPRINTF("SCSICSR CPUDMA\n");
498             /* qemu_irq_raise(s->scsi_dma); */
499 
500             s->int_status |= 0x4000000;
501         } else {
502             s->int_status &= ~(0x4000000);
503         }
504         if (value & SCSICSR_INTMASK) {
505             DPRINTF("SCSICSR INTMASK\n");
506             /*
507              * int_mask &= ~0x1000;
508              * s->scsi_csr_1 |= value;
509              * s->scsi_csr_1 &= ~SCSICSR_INTMASK;
510              * if (s->scsi_queued) {
511              *     s->scsi_queued = 0;
512              *     next_irq(s, NEXT_SCSI_I, level);
513              * }
514              */
515         } else {
516             /* int_mask |= 0x1000; */
517         }
518         if (value & 0x80) {
519             /* int_mask |= 0x1000; */
520             /* s->scsi_csr_1 |= 0x80; */
521         }
522         DPRINTF("SCSICSR Write: %x\n", value);
523         /* s->scsi_csr_1 = value; */
524         return;
525     /* Hardware timer latch - not implemented yet */
526     case 0x1a000:
527     default:
528         DPRINTF("BMAP Write B @ %x with %x\n", (unsigned int)addr, value);
529     }
530 }
531 
532 static void scr_writew(NeXTPC *s, hwaddr addr, uint32_t value)
533 {
534     DPRINTF("BMAP Write W @ %x with %x\n", (unsigned int)addr, value);
535 }
536 
537 static void scr_writel(NeXTPC *s, hwaddr addr, uint32_t value)
538 {
539     DPRINTF("BMAP Write L @ %x with %x\n", (unsigned int)addr, value);
540 }
541 
542 static uint64_t scr_readfn(void *opaque, hwaddr addr, unsigned size)
543 {
544     NeXTPC *s = NEXT_PC(opaque);
545 
546     switch (size) {
547     case 1:
548         return scr_readb(s, addr);
549     case 2:
550         return scr_readw(s, addr);
551     case 4:
552         return scr_readl(s, addr);
553     default:
554         g_assert_not_reached();
555     }
556 }
557 
558 static void scr_writefn(void *opaque, hwaddr addr, uint64_t value,
559                         unsigned size)
560 {
561     NeXTPC *s = NEXT_PC(opaque);
562 
563     switch (size) {
564     case 1:
565         scr_writeb(s, addr, value);
566         break;
567     case 2:
568         scr_writew(s, addr, value);
569         break;
570     case 4:
571         scr_writel(s, addr, value);
572         break;
573     default:
574         g_assert_not_reached();
575     }
576 }
577 
578 static const MemoryRegionOps scr_ops = {
579     .read = scr_readfn,
580     .write = scr_writefn,
581     .valid.min_access_size = 1,
582     .valid.max_access_size = 4,
583     .endianness = DEVICE_NATIVE_ENDIAN,
584 };
585 
586 #define NEXTDMA_SCSI(x)      (0x10 + x)
587 #define NEXTDMA_FD(x)        (0x10 + x)
588 #define NEXTDMA_ENTX(x)      (0x110 + x)
589 #define NEXTDMA_ENRX(x)      (0x150 + x)
590 #define NEXTDMA_CSR          0x0
591 #define NEXTDMA_NEXT         0x4000
592 #define NEXTDMA_LIMIT        0x4004
593 #define NEXTDMA_START        0x4008
594 #define NEXTDMA_STOP         0x400c
595 #define NEXTDMA_NEXT_INIT    0x4200
596 #define NEXTDMA_SIZE         0x4204
597 
598 static void dma_writel(void *opaque, hwaddr addr, uint64_t value,
599                        unsigned int size)
600 {
601     NeXTState *next_state = NEXT_MACHINE(opaque);
602 
603     switch (addr) {
604     case NEXTDMA_ENRX(NEXTDMA_CSR):
605         if (value & DMA_DEV2M) {
606             next_state->dma[NEXTDMA_ENRX].csr |= DMA_DEV2M;
607         }
608 
609         if (value & DMA_SETENABLE) {
610             /* DPRINTF("SCSI DMA ENABLE\n"); */
611             next_state->dma[NEXTDMA_ENRX].csr |= DMA_ENABLE;
612         }
613         if (value & DMA_SETSUPDATE) {
614             next_state->dma[NEXTDMA_ENRX].csr |= DMA_SUPDATE;
615         }
616         if (value & DMA_CLRCOMPLETE) {
617             next_state->dma[NEXTDMA_ENRX].csr &= ~DMA_COMPLETE;
618         }
619 
620         if (value & DMA_RESET) {
621             next_state->dma[NEXTDMA_ENRX].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
622                                                   DMA_ENABLE | DMA_DEV2M);
623         }
624         /* DPRINTF("RXCSR \tWrite: %x\n",value); */
625         break;
626     case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
627         next_state->dma[NEXTDMA_ENRX].next_initbuf = value;
628         break;
629     case NEXTDMA_ENRX(NEXTDMA_NEXT):
630         next_state->dma[NEXTDMA_ENRX].next = value;
631         break;
632     case NEXTDMA_ENRX(NEXTDMA_LIMIT):
633         next_state->dma[NEXTDMA_ENRX].limit = value;
634         break;
635     case NEXTDMA_SCSI(NEXTDMA_CSR):
636         if (value & DMA_DEV2M) {
637             next_state->dma[NEXTDMA_SCSI].csr |= DMA_DEV2M;
638         }
639         if (value & DMA_SETENABLE) {
640             /* DPRINTF("SCSI DMA ENABLE\n"); */
641             next_state->dma[NEXTDMA_SCSI].csr |= DMA_ENABLE;
642         }
643         if (value & DMA_SETSUPDATE) {
644             next_state->dma[NEXTDMA_SCSI].csr |= DMA_SUPDATE;
645         }
646         if (value & DMA_CLRCOMPLETE) {
647             next_state->dma[NEXTDMA_SCSI].csr &= ~DMA_COMPLETE;
648         }
649 
650         if (value & DMA_RESET) {
651             next_state->dma[NEXTDMA_SCSI].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
652                                                   DMA_ENABLE | DMA_DEV2M);
653             /* DPRINTF("SCSI DMA RESET\n"); */
654         }
655         /* DPRINTF("RXCSR \tWrite: %x\n",value); */
656         break;
657 
658     case NEXTDMA_SCSI(NEXTDMA_NEXT):
659         next_state->dma[NEXTDMA_SCSI].next = value;
660         break;
661 
662     case NEXTDMA_SCSI(NEXTDMA_LIMIT):
663         next_state->dma[NEXTDMA_SCSI].limit = value;
664         break;
665 
666     case NEXTDMA_SCSI(NEXTDMA_START):
667         next_state->dma[NEXTDMA_SCSI].start = value;
668         break;
669 
670     case NEXTDMA_SCSI(NEXTDMA_STOP):
671         next_state->dma[NEXTDMA_SCSI].stop = value;
672         break;
673 
674     case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
675         next_state->dma[NEXTDMA_SCSI].next_initbuf = value;
676         break;
677 
678     default:
679         DPRINTF("DMA write @ %x w/ %x\n", (unsigned)addr, (unsigned)value);
680     }
681 }
682 
683 static uint64_t dma_readl(void *opaque, hwaddr addr, unsigned int size)
684 {
685     NeXTState *next_state = NEXT_MACHINE(opaque);
686 
687     switch (addr) {
688     case NEXTDMA_SCSI(NEXTDMA_CSR):
689         DPRINTF("SCSI DMA CSR READ\n");
690         return next_state->dma[NEXTDMA_SCSI].csr;
691     case NEXTDMA_ENRX(NEXTDMA_CSR):
692         return next_state->dma[NEXTDMA_ENRX].csr;
693     case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
694         return next_state->dma[NEXTDMA_ENRX].next_initbuf;
695     case NEXTDMA_ENRX(NEXTDMA_NEXT):
696         return next_state->dma[NEXTDMA_ENRX].next;
697     case NEXTDMA_ENRX(NEXTDMA_LIMIT):
698         return next_state->dma[NEXTDMA_ENRX].limit;
699 
700     case NEXTDMA_SCSI(NEXTDMA_NEXT):
701         return next_state->dma[NEXTDMA_SCSI].next;
702     case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
703         return next_state->dma[NEXTDMA_SCSI].next_initbuf;
704     case NEXTDMA_SCSI(NEXTDMA_LIMIT):
705         return next_state->dma[NEXTDMA_SCSI].limit;
706     case NEXTDMA_SCSI(NEXTDMA_START):
707         return next_state->dma[NEXTDMA_SCSI].start;
708     case NEXTDMA_SCSI(NEXTDMA_STOP):
709         return next_state->dma[NEXTDMA_SCSI].stop;
710 
711     default:
712         DPRINTF("DMA read @ %x\n", (unsigned int)addr);
713         return 0;
714     }
715 
716     /*
717      * once the csr's are done, subtract 0x3FEC from the addr, and that will
718      * normalize the upper registers
719      */
720 }
721 
722 static const MemoryRegionOps dma_ops = {
723     .read = dma_readl,
724     .write = dma_writel,
725     .impl.min_access_size = 4,
726     .valid.min_access_size = 4,
727     .valid.max_access_size = 4,
728     .endianness = DEVICE_NATIVE_ENDIAN,
729 };
730 
731 static void next_irq(void *opaque, int number, int level)
732 {
733     NeXTPC *s = NEXT_PC(opaque);
734     M68kCPU *cpu = s->cpu;
735     int shift = 0;
736 
737     /* first switch sets interrupt status */
738     /* DPRINTF("IRQ %i\n",number); */
739     switch (number) {
740     /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
741     case NEXT_FD_I:
742         shift = 7;
743         break;
744     case NEXT_KBD_I:
745         shift = 3;
746         break;
747     case NEXT_PWR_I:
748         shift = 2;
749         break;
750     case NEXT_ENRX_I:
751         shift = 9;
752         break;
753     case NEXT_ENTX_I:
754         shift = 10;
755         break;
756     case NEXT_SCSI_I:
757         shift = 12;
758         break;
759     case NEXT_CLK_I:
760         shift = 5;
761         break;
762 
763     /* level 5 - scc (serial) */
764     case NEXT_SCC_I:
765         shift = 17;
766         break;
767 
768     /* level 6 - audio etherrx/tx dma */
769     case NEXT_ENTX_DMA_I:
770         shift = 28;
771         break;
772     case NEXT_ENRX_DMA_I:
773         shift = 27;
774         break;
775     case NEXT_SCSI_DMA_I:
776         shift = 26;
777         break;
778     case NEXT_SND_I:
779         shift = 23;
780         break;
781     case NEXT_SCC_DMA_I:
782         shift = 21;
783         break;
784 
785     }
786     /*
787      * this HAS to be wrong, the interrupt handlers in mach and together
788      * int_status and int_mask and return if there is a hit
789      */
790     if (s->int_mask & (1 << shift)) {
791         DPRINTF("%x interrupt masked @ %x\n", 1 << shift, cpu->env.pc);
792         /* return; */
793     }
794 
795     /* second switch triggers the correct interrupt */
796     if (level) {
797         s->int_status |= 1 << shift;
798 
799         switch (number) {
800         /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
801         case NEXT_FD_I:
802         case NEXT_KBD_I:
803         case NEXT_PWR_I:
804         case NEXT_ENRX_I:
805         case NEXT_ENTX_I:
806         case NEXT_SCSI_I:
807         case NEXT_CLK_I:
808             m68k_set_irq_level(cpu, 3, 27);
809             break;
810 
811         /* level 5 - scc (serial) */
812         case NEXT_SCC_I:
813             m68k_set_irq_level(cpu, 5, 29);
814             break;
815 
816         /* level 6 - audio etherrx/tx dma */
817         case NEXT_ENTX_DMA_I:
818         case NEXT_ENRX_DMA_I:
819         case NEXT_SCSI_DMA_I:
820         case NEXT_SND_I:
821         case NEXT_SCC_DMA_I:
822             m68k_set_irq_level(cpu, 6, 30);
823             break;
824         }
825     } else {
826         s->int_status &= ~(1 << shift);
827         cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
828     }
829 }
830 
831 static void next_escc_init(DeviceState *pcdev)
832 {
833     DeviceState *dev;
834     SysBusDevice *s;
835 
836     dev = qdev_new(TYPE_ESCC);
837     qdev_prop_set_uint32(dev, "disabled", 0);
838     qdev_prop_set_uint32(dev, "frequency", 9600 * 384);
839     qdev_prop_set_uint32(dev, "it_shift", 0);
840     qdev_prop_set_bit(dev, "bit_swap", true);
841     qdev_prop_set_chr(dev, "chrB", serial_hd(1));
842     qdev_prop_set_chr(dev, "chrA", serial_hd(0));
843     qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
844     qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
845 
846     s = SYS_BUS_DEVICE(dev);
847     sysbus_realize_and_unref(s, &error_fatal);
848     sysbus_connect_irq(s, 0, qdev_get_gpio_in(pcdev, NEXT_SCC_I));
849     sysbus_connect_irq(s, 1, qdev_get_gpio_in(pcdev, NEXT_SCC_DMA_I));
850     sysbus_mmio_map(s, 0, 0x2118000);
851 }
852 
853 static void next_pc_reset(DeviceState *dev)
854 {
855     NeXTPC *s = NEXT_PC(dev);
856 
857     /* Set internal registers to initial values */
858     /*     0x0000XX00 << vital bits */
859     s->scr1 = 0x00011102;
860     s->scr2 = 0x00ff0c80;
861 
862     s->rtc.status = 0x90;
863 
864     /* Load RTC RAM - TODO: provide possibility to load contents from file */
865     memcpy(s->rtc.ram, rtc_ram2, 32);
866 }
867 
868 static void next_pc_realize(DeviceState *dev, Error **errp)
869 {
870     NeXTPC *s = NEXT_PC(dev);
871     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
872 
873     qdev_init_gpio_in(dev, next_irq, NEXT_NUM_IRQS);
874 
875     memory_region_init_io(&s->mmiomem, OBJECT(s), &mmio_ops, s,
876                           "next.mmio", 0xD0000);
877     memory_region_init_io(&s->scrmem, OBJECT(s), &scr_ops, s,
878                           "next.scr", 0x20000);
879     sysbus_init_mmio(sbd, &s->mmiomem);
880     sysbus_init_mmio(sbd, &s->scrmem);
881 }
882 
883 /*
884  * If the m68k CPU implemented its inbound irq lines as GPIO lines
885  * rather than via the m68k_set_irq_level() function we would not need
886  * this cpu link property and could instead provide outbound IRQ lines
887  * that the board could wire up to the CPU.
888  */
889 static Property next_pc_properties[] = {
890     DEFINE_PROP_LINK("cpu", NeXTPC, cpu, TYPE_M68K_CPU, M68kCPU *),
891     DEFINE_PROP_END_OF_LIST(),
892 };
893 
894 static const VMStateDescription next_rtc_vmstate = {
895     .name = "next-rtc",
896     .version_id = 1,
897     .minimum_version_id = 1,
898     .fields = (VMStateField[]) {
899         VMSTATE_UINT8_ARRAY(ram, NextRtc, 32),
900         VMSTATE_UINT8(command, NextRtc),
901         VMSTATE_UINT8(value, NextRtc),
902         VMSTATE_UINT8(status, NextRtc),
903         VMSTATE_UINT8(control, NextRtc),
904         VMSTATE_UINT8(retval, NextRtc),
905         VMSTATE_END_OF_LIST()
906     },
907 };
908 
909 static const VMStateDescription next_pc_vmstate = {
910     .name = "next-pc",
911     .version_id = 1,
912     .minimum_version_id = 1,
913     .fields = (VMStateField[]) {
914         VMSTATE_UINT32(scr1, NeXTPC),
915         VMSTATE_UINT32(scr2, NeXTPC),
916         VMSTATE_UINT32(int_mask, NeXTPC),
917         VMSTATE_UINT32(int_status, NeXTPC),
918         VMSTATE_UINT8(scsi_csr_1, NeXTPC),
919         VMSTATE_UINT8(scsi_csr_2, NeXTPC),
920         VMSTATE_STRUCT(rtc, NeXTPC, 0, next_rtc_vmstate, NextRtc),
921         VMSTATE_END_OF_LIST()
922     },
923 };
924 
925 static void next_pc_class_init(ObjectClass *klass, void *data)
926 {
927     DeviceClass *dc = DEVICE_CLASS(klass);
928 
929     dc->desc = "NeXT Peripheral Controller";
930     dc->realize = next_pc_realize;
931     dc->reset = next_pc_reset;
932     device_class_set_props(dc, next_pc_properties);
933     dc->vmsd = &next_pc_vmstate;
934 }
935 
936 static const TypeInfo next_pc_info = {
937     .name = TYPE_NEXT_PC,
938     .parent = TYPE_SYS_BUS_DEVICE,
939     .instance_size = sizeof(NeXTPC),
940     .class_init = next_pc_class_init,
941 };
942 
943 static void next_cube_init(MachineState *machine)
944 {
945     M68kCPU *cpu;
946     CPUM68KState *env;
947     MemoryRegion *rom = g_new(MemoryRegion, 1);
948     MemoryRegion *dmamem = g_new(MemoryRegion, 1);
949     MemoryRegion *bmapm1 = g_new(MemoryRegion, 1);
950     MemoryRegion *bmapm2 = g_new(MemoryRegion, 1);
951     MemoryRegion *sysmem = get_system_memory();
952     const char *bios_name = machine->firmware ?: ROM_FILE;
953     DeviceState *dev;
954     DeviceState *pcdev;
955 
956     /* Initialize the cpu core */
957     cpu = M68K_CPU(cpu_create(machine->cpu_type));
958     if (!cpu) {
959         error_report("Unable to find m68k CPU definition");
960         exit(1);
961     }
962     env = &cpu->env;
963 
964     /* Initialize CPU registers.  */
965     env->vbr = 0;
966     env->sr  = 0x2700;
967 
968     /* Peripheral Controller */
969     pcdev = qdev_new(TYPE_NEXT_PC);
970     object_property_set_link(OBJECT(pcdev), "cpu", OBJECT(cpu), &error_abort);
971     sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
972 
973     /* 64MB RAM starting at 0x04000000  */
974     memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
975 
976     /* Framebuffer */
977     dev = qdev_new(TYPE_NEXTFB);
978     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
979     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0B000000);
980 
981     /* MMIO */
982     sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02000000);
983 
984     /* BMAP IO - acts as a catch-all for now */
985     sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02100000);
986 
987     /* BMAP memory */
988     memory_region_init_ram_flags_nomigrate(bmapm1, NULL, "next.bmapmem", 64,
989                                            RAM_SHARED, &error_fatal);
990     memory_region_add_subregion(sysmem, 0x020c0000, bmapm1);
991     /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
992     memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 64);
993     memory_region_add_subregion(sysmem, 0x820c0000, bmapm2);
994 
995     /* KBD */
996     dev = qdev_new(TYPE_NEXTKBD);
997     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
998     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0200e000);
999 
1000     /* Load ROM here */
1001     /* still not sure if the rom should also be mapped at 0x0*/
1002     memory_region_init_rom(rom, NULL, "next.rom", 0x20000, &error_fatal);
1003     memory_region_add_subregion(sysmem, 0x01000000, rom);
1004     if (load_image_targphys(bios_name, 0x01000000, 0x20000) < 8) {
1005         if (!qtest_enabled()) {
1006             error_report("Failed to load firmware '%s'.", bios_name);
1007         }
1008     } else {
1009         uint8_t *ptr;
1010         /* Initial PC is always at offset 4 in firmware binaries */
1011         ptr = rom_ptr(0x01000004, 4);
1012         g_assert(ptr != NULL);
1013         env->pc = ldl_p(ptr);
1014         if (env->pc >= 0x01020000) {
1015             error_report("'%s' does not seem to be a valid firmware image.",
1016                          bios_name);
1017             exit(1);
1018         }
1019     }
1020 
1021     /* Serial */
1022     next_escc_init(pcdev);
1023 
1024     /* TODO: */
1025     /* Network */
1026     /* SCSI */
1027 
1028     /* DMA */
1029     memory_region_init_io(dmamem, NULL, &dma_ops, machine, "next.dma", 0x5000);
1030     memory_region_add_subregion(sysmem, 0x02000000, dmamem);
1031 }
1032 
1033 static void next_machine_class_init(ObjectClass *oc, void *data)
1034 {
1035     MachineClass *mc = MACHINE_CLASS(oc);
1036 
1037     mc->desc = "NeXT Cube";
1038     mc->init = next_cube_init;
1039     mc->default_ram_size = RAM_SIZE;
1040     mc->default_ram_id = "next.ram";
1041     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
1042 }
1043 
1044 static const TypeInfo next_typeinfo = {
1045     .name = TYPE_NEXT_MACHINE,
1046     .parent = TYPE_MACHINE,
1047     .class_init = next_machine_class_init,
1048     .instance_size = sizeof(NeXTState),
1049 };
1050 
1051 static void next_register_type(void)
1052 {
1053     type_register_static(&next_typeinfo);
1054     type_register_static(&next_pc_info);
1055 }
1056 
1057 type_init(next_register_type)
1058