2 * NeXT Cube System Driver
4 * Copyright (c) 2011 Bryce Lanham
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.
12 #include "qemu/osdep.h"
13 #include "exec/hwaddr.h"
14 #include "sysemu/sysemu.h"
15 #include "sysemu/qtest.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"
32 /* #define DEBUG_NEXT */
34 #define DPRINTF(fmt, ...) \
35 do { printf("NeXT: " fmt , ## __VA_ARGS__); } while (0)
37 #define DPRINTF(fmt, ...) do { } while (0)
40 #define TYPE_NEXT_MACHINE MACHINE_TYPE_NAME("next-cube")
41 OBJECT_DECLARE_SIMPLE_TYPE(NeXTState
, NEXT_MACHINE
)
43 #define ENTRY 0x0100001e
44 #define RAM_SIZE 0x4000000
45 #define ROM_FILE "Rev_2.5_v66.bin"
47 typedef struct next_dma
{
60 uint32_t next_initbuf
;
64 typedef struct NextRtc
{
79 #define TYPE_NEXT_PC "next-pc"
80 OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC
, NEXT_PC
)
82 /* NeXT Peripheral Controller */
84 SysBusDevice parent_obj
;
104 /* Thanks to NeXT forums for this */
106 static const uint8_t rtc_ram3[32] = {
107 0x94, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x7B, 0x00,
109 0x00, 0x00, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x13
113 static const uint8_t rtc_ram2
[32] = {
114 0x94, 0x0f, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x4b, 0x00,
116 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e,
120 #define SCR2_RTCLK 0x2
121 #define SCR2_RTDATA 0x4
122 #define SCR2_TOBCD(x) (((x / 10) << 4) + (x % 10))
124 static void nextscr2_write(NeXTPC
*s
, uint32_t val
, int size
)
128 static uint8_t old_scr2
;
130 NextRtc
*rtc
= &s
->rtc
;
133 scr2_2
= (val
>> 8) & 0xFF;
142 DPRINTF("LED flashing, possible fault!\n");
148 /* DPRINTF("RTC %x phase %i\n", scr2_2, phase); */
152 /* If we are in going down clock... do something */
153 if (((old_scr2
& SCR2_RTCLK
) != (scr2_2
& SCR2_RTCLK
)) &&
154 ((scr2_2
& SCR2_RTCLK
) == 0)) {
156 rtc
->command
= (rtc
->command
<< 1) |
157 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
159 if (phase
>= 8 && phase
< 16) {
160 rtc
->value
= (rtc
->value
<< 1) |
161 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
163 /* if we read RAM register, output RT_DATA bit */
164 if (rtc
->command
<= 0x1F) {
165 scr2_2
= scr2_2
& (~SCR2_RTDATA
);
166 if (rtc
->ram
[rtc
->command
] & (0x80 >> (phase
- 8))) {
167 scr2_2
|= SCR2_RTDATA
;
170 rtc
->retval
= (rtc
->retval
<< 1) |
171 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
173 /* read the status 0x30 */
174 if (rtc
->command
== 0x30) {
175 scr2_2
= scr2_2
& (~SCR2_RTDATA
);
176 /* for now status = 0x98 (new rtc + FTU) */
177 if (rtc
->status
& (0x80 >> (phase
- 8))) {
178 scr2_2
|= SCR2_RTDATA
;
181 rtc
->retval
= (rtc
->retval
<< 1) |
182 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
184 /* read the status 0x31 */
185 if (rtc
->command
== 0x31) {
186 scr2_2
= scr2_2
& (~SCR2_RTDATA
);
187 if (rtc
->control
& (0x80 >> (phase
- 8))) {
188 scr2_2
|= SCR2_RTDATA
;
190 rtc
->retval
= (rtc
->retval
<< 1) |
191 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
194 if ((rtc
->command
>= 0x20) && (rtc
->command
<= 0x2F)) {
195 scr2_2
= scr2_2
& (~SCR2_RTDATA
);
197 time_t time_h
= time(NULL
);
198 struct tm
*info
= localtime(&time_h
);
201 switch (rtc
->command
) {
203 ret
= SCR2_TOBCD(info
->tm_sec
);
206 ret
= SCR2_TOBCD(info
->tm_min
);
209 ret
= SCR2_TOBCD(info
->tm_hour
);
212 ret
= SCR2_TOBCD(info
->tm_mday
);
215 ret
= SCR2_TOBCD((info
->tm_mon
+ 1));
218 ret
= SCR2_TOBCD((info
->tm_year
- 100));
223 if (ret
& (0x80 >> (phase
- 8))) {
224 scr2_2
|= SCR2_RTDATA
;
226 rtc
->retval
= (rtc
->retval
<< 1) |
227 ((scr2_2
& SCR2_RTDATA
) ? 1 : 0);
234 if (rtc
->command
>= 0x80 && rtc
->command
<= 0x9F) {
235 rtc
->ram
[rtc
->command
- 0x80] = rtc
->value
;
237 /* write to x30 register */
238 if (rtc
->command
== 0xB1) {
240 if (rtc
->value
& 0x04) {
241 rtc
->status
= rtc
->status
& (~0x18);
242 s
->int_status
= s
->int_status
& (~0x04);
248 /* else end or abort */
253 s
->scr2
= val
& 0xFFFF00FF;
254 s
->scr2
|= scr2_2
<< 8;
258 static uint64_t next_mmio_read(void *opaque
, hwaddr addr
, unsigned size
)
260 NeXTPC
*s
= NEXT_PC(opaque
);
265 /* DPRINTF("Read INT status: %x\n", s->int_status); */
270 DPRINTF("MMIO Read INT mask: %x\n", s
->int_mask
);
274 case 0xc000 ... 0xc003:
275 val
= extract32(s
->scr1
, (4 - (addr
- 0xc000) - size
) << 3,
279 case 0xd000 ... 0xd003:
280 val
= extract32(s
->scr2
, (4 - (addr
- 0xd000) - size
) << 3,
290 DPRINTF("MMIO Read @ 0x%"HWADDR_PRIx
" size %d\n", addr
, size
);
297 static void next_mmio_write(void *opaque
, hwaddr addr
, uint64_t val
,
300 NeXTPC
*s
= NEXT_PC(opaque
);
304 DPRINTF("INT Status old: %x new: %x\n", s
->int_status
,
310 DPRINTF("INT Mask old: %x new: %x\n", s
->int_mask
, (unsigned int)val
);
314 case 0xc000 ... 0xc003:
315 DPRINTF("SCR1 Write: %x\n", (unsigned int)val
);
316 s
->scr1
= deposit32(s
->scr1
, (4 - (addr
- 0xc000) - size
) << 3,
320 case 0xd000 ... 0xd003:
321 nextscr2_write(s
, val
, size
);
325 DPRINTF("MMIO Write @ 0x%"HWADDR_PRIx
" with 0x%x size %u\n", addr
,
326 (unsigned int)val
, size
);
330 static const MemoryRegionOps next_mmio_ops
= {
331 .read
= next_mmio_read
,
332 .write
= next_mmio_write
,
333 .valid
.min_access_size
= 1,
334 .valid
.max_access_size
= 4,
335 .endianness
= DEVICE_BIG_ENDIAN
,
338 #define SCSICSR_ENABLE 0x01
339 #define SCSICSR_RESET 0x02 /* reset scsi dma */
340 #define SCSICSR_FIFOFL 0x04
341 #define SCSICSR_DMADIR 0x08 /* if set, scsi to mem */
342 #define SCSICSR_CPUDMA 0x10 /* if set, dma enabled */
343 #define SCSICSR_INTMASK 0x20 /* if set, interrupt enabled */
345 static uint64_t next_scr_readfn(void *opaque
, hwaddr addr
, unsigned size
)
347 NeXTPC
*s
= NEXT_PC(opaque
);
352 DPRINTF("FD read @ %x\n", (unsigned int)addr
);
353 val
= 0x40 | 0x04 | 0x2 | 0x1;
357 DPRINTF("SCSI 4020 STATUS READ %X\n", s
->scsi_csr_1
);
362 DPRINTF("SCSI 4021 STATUS READ %X\n", s
->scsi_csr_2
);
367 * These 4 registers are the hardware timer, not sure which register
368 * is the latch instead of data, but no problems so far.
370 * Hack: We need to have the LSB change consistently to make it work
372 case 0x1a000 ... 0x1a003:
373 val
= extract32(clock(), (4 - (addr
- 0x1a000) - size
) << 3,
377 /* For now return dummy byte to allow the Ethernet test to timeout */
383 DPRINTF("BMAP Read @ 0x%x size %u\n", (unsigned int)addr
, size
);
391 static void next_scr_writefn(void *opaque
, hwaddr addr
, uint64_t val
,
394 NeXTPC
*s
= NEXT_PC(opaque
);
398 DPRINTF("FDCSR Write: %x\n", value
);
400 /* qemu_irq_raise(s->fd_irq[0]); */
404 case 0x14020: /* SCSI Control Register */
405 if (val
& SCSICSR_FIFOFL
) {
406 DPRINTF("SCSICSR FIFO Flush\n");
407 /* will have to add another irq to the esp if this is needed */
408 /* esp_puflush_fifo(esp_g); */
411 if (val
& SCSICSR_ENABLE
) {
412 DPRINTF("SCSICSR Enable\n");
414 * qemu_irq_raise(s->scsi_dma);
415 * s->scsi_csr_1 = 0xc0;
416 * s->scsi_csr_1 |= 0x1;
417 * qemu_irq_pulse(s->scsi_dma);
422 * s->scsi_csr_1 &= ~SCSICSR_ENABLE;
425 if (val
& SCSICSR_RESET
) {
426 DPRINTF("SCSICSR Reset\n");
427 /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
428 qemu_irq_raise(s
->scsi_reset
);
429 s
->scsi_csr_1
&= ~(SCSICSR_INTMASK
| 0x80 | 0x1);
430 qemu_irq_lower(s
->scsi_reset
);
432 if (val
& SCSICSR_DMADIR
) {
433 DPRINTF("SCSICSR DMAdir\n");
435 if (val
& SCSICSR_CPUDMA
) {
436 DPRINTF("SCSICSR CPUDMA\n");
437 /* qemu_irq_raise(s->scsi_dma); */
438 s
->int_status
|= 0x4000000;
440 /* fprintf(stderr,"SCSICSR CPUDMA disabled\n"); */
441 s
->int_status
&= ~(0x4000000);
442 /* qemu_irq_lower(s->scsi_dma); */
444 if (val
& SCSICSR_INTMASK
) {
445 DPRINTF("SCSICSR INTMASK\n");
447 * int_mask &= ~0x1000;
448 * s->scsi_csr_1 |= val;
449 * s->scsi_csr_1 &= ~SCSICSR_INTMASK;
450 * if (s->scsi_queued) {
451 * s->scsi_queued = 0;
452 * next_irq(s, NEXT_SCSI_I, level);
456 /* int_mask |= 0x1000; */
459 /* int_mask |= 0x1000; */
460 /* s->scsi_csr_1 |= 0x80; */
462 DPRINTF("SCSICSR Write: %x\n", val
);
463 /* s->scsi_csr_1 = val; */
466 /* Hardware timer latch - not implemented yet */
469 DPRINTF("BMAP Write @ 0x%x with 0x%x size %u\n", (unsigned int)addr
,
474 static const MemoryRegionOps next_scr_ops
= {
475 .read
= next_scr_readfn
,
476 .write
= next_scr_writefn
,
477 .valid
.min_access_size
= 1,
478 .valid
.max_access_size
= 4,
479 .endianness
= DEVICE_BIG_ENDIAN
,
482 #define NEXTDMA_SCSI(x) (0x10 + x)
483 #define NEXTDMA_FD(x) (0x10 + x)
484 #define NEXTDMA_ENTX(x) (0x110 + x)
485 #define NEXTDMA_ENRX(x) (0x150 + x)
486 #define NEXTDMA_CSR 0x0
487 #define NEXTDMA_NEXT 0x4000
488 #define NEXTDMA_LIMIT 0x4004
489 #define NEXTDMA_START 0x4008
490 #define NEXTDMA_STOP 0x400c
491 #define NEXTDMA_NEXT_INIT 0x4200
492 #define NEXTDMA_SIZE 0x4204
494 static void dma_writel(void *opaque
, hwaddr addr
, uint64_t value
,
497 NeXTState
*next_state
= NEXT_MACHINE(opaque
);
500 case NEXTDMA_ENRX(NEXTDMA_CSR
):
501 if (value
& DMA_DEV2M
) {
502 next_state
->dma
[NEXTDMA_ENRX
].csr
|= DMA_DEV2M
;
505 if (value
& DMA_SETENABLE
) {
506 /* DPRINTF("SCSI DMA ENABLE\n"); */
507 next_state
->dma
[NEXTDMA_ENRX
].csr
|= DMA_ENABLE
;
509 if (value
& DMA_SETSUPDATE
) {
510 next_state
->dma
[NEXTDMA_ENRX
].csr
|= DMA_SUPDATE
;
512 if (value
& DMA_CLRCOMPLETE
) {
513 next_state
->dma
[NEXTDMA_ENRX
].csr
&= ~DMA_COMPLETE
;
516 if (value
& DMA_RESET
) {
517 next_state
->dma
[NEXTDMA_ENRX
].csr
&= ~(DMA_COMPLETE
| DMA_SUPDATE
|
518 DMA_ENABLE
| DMA_DEV2M
);
520 /* DPRINTF("RXCSR \tWrite: %x\n",value); */
522 case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT
):
523 next_state
->dma
[NEXTDMA_ENRX
].next_initbuf
= value
;
525 case NEXTDMA_ENRX(NEXTDMA_NEXT
):
526 next_state
->dma
[NEXTDMA_ENRX
].next
= value
;
528 case NEXTDMA_ENRX(NEXTDMA_LIMIT
):
529 next_state
->dma
[NEXTDMA_ENRX
].limit
= value
;
531 case NEXTDMA_SCSI(NEXTDMA_CSR
):
532 if (value
& DMA_DEV2M
) {
533 next_state
->dma
[NEXTDMA_SCSI
].csr
|= DMA_DEV2M
;
535 if (value
& DMA_SETENABLE
) {
536 /* DPRINTF("SCSI DMA ENABLE\n"); */
537 next_state
->dma
[NEXTDMA_SCSI
].csr
|= DMA_ENABLE
;
539 if (value
& DMA_SETSUPDATE
) {
540 next_state
->dma
[NEXTDMA_SCSI
].csr
|= DMA_SUPDATE
;
542 if (value
& DMA_CLRCOMPLETE
) {
543 next_state
->dma
[NEXTDMA_SCSI
].csr
&= ~DMA_COMPLETE
;
546 if (value
& DMA_RESET
) {
547 next_state
->dma
[NEXTDMA_SCSI
].csr
&= ~(DMA_COMPLETE
| DMA_SUPDATE
|
548 DMA_ENABLE
| DMA_DEV2M
);
549 /* DPRINTF("SCSI DMA RESET\n"); */
551 /* DPRINTF("RXCSR \tWrite: %x\n",value); */
554 case NEXTDMA_SCSI(NEXTDMA_NEXT
):
555 next_state
->dma
[NEXTDMA_SCSI
].next
= value
;
558 case NEXTDMA_SCSI(NEXTDMA_LIMIT
):
559 next_state
->dma
[NEXTDMA_SCSI
].limit
= value
;
562 case NEXTDMA_SCSI(NEXTDMA_START
):
563 next_state
->dma
[NEXTDMA_SCSI
].start
= value
;
566 case NEXTDMA_SCSI(NEXTDMA_STOP
):
567 next_state
->dma
[NEXTDMA_SCSI
].stop
= value
;
570 case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT
):
571 next_state
->dma
[NEXTDMA_SCSI
].next_initbuf
= value
;
575 DPRINTF("DMA write @ %x w/ %x\n", (unsigned)addr
, (unsigned)value
);
579 static uint64_t dma_readl(void *opaque
, hwaddr addr
, unsigned int size
)
581 NeXTState
*next_state
= NEXT_MACHINE(opaque
);
584 case NEXTDMA_SCSI(NEXTDMA_CSR
):
585 DPRINTF("SCSI DMA CSR READ\n");
586 return next_state
->dma
[NEXTDMA_SCSI
].csr
;
587 case NEXTDMA_ENRX(NEXTDMA_CSR
):
588 return next_state
->dma
[NEXTDMA_ENRX
].csr
;
589 case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT
):
590 return next_state
->dma
[NEXTDMA_ENRX
].next_initbuf
;
591 case NEXTDMA_ENRX(NEXTDMA_NEXT
):
592 return next_state
->dma
[NEXTDMA_ENRX
].next
;
593 case NEXTDMA_ENRX(NEXTDMA_LIMIT
):
594 return next_state
->dma
[NEXTDMA_ENRX
].limit
;
596 case NEXTDMA_SCSI(NEXTDMA_NEXT
):
597 return next_state
->dma
[NEXTDMA_SCSI
].next
;
598 case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT
):
599 return next_state
->dma
[NEXTDMA_SCSI
].next_initbuf
;
600 case NEXTDMA_SCSI(NEXTDMA_LIMIT
):
601 return next_state
->dma
[NEXTDMA_SCSI
].limit
;
602 case NEXTDMA_SCSI(NEXTDMA_START
):
603 return next_state
->dma
[NEXTDMA_SCSI
].start
;
604 case NEXTDMA_SCSI(NEXTDMA_STOP
):
605 return next_state
->dma
[NEXTDMA_SCSI
].stop
;
608 DPRINTF("DMA read @ %x\n", (unsigned int)addr
);
613 * once the csr's are done, subtract 0x3FEC from the addr, and that will
614 * normalize the upper registers
618 static const MemoryRegionOps dma_ops
= {
621 .impl
.min_access_size
= 4,
622 .valid
.min_access_size
= 4,
623 .valid
.max_access_size
= 4,
624 .endianness
= DEVICE_NATIVE_ENDIAN
,
627 static void next_irq(void *opaque
, int number
, int level
)
629 NeXTPC
*s
= NEXT_PC(opaque
);
630 M68kCPU
*cpu
= s
->cpu
;
633 /* first switch sets interrupt status */
634 /* DPRINTF("IRQ %i\n",number); */
636 /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
659 /* level 5 - scc (serial) */
664 /* level 6 - audio etherrx/tx dma */
665 case NEXT_ENTX_DMA_I
:
668 case NEXT_ENRX_DMA_I
:
671 case NEXT_SCSI_DMA_I
:
683 * this HAS to be wrong, the interrupt handlers in mach and together
684 * int_status and int_mask and return if there is a hit
686 if (s
->int_mask
& (1 << shift
)) {
687 DPRINTF("%x interrupt masked @ %x\n", 1 << shift
, cpu
->env
.pc
);
691 /* second switch triggers the correct interrupt */
693 s
->int_status
|= 1 << shift
;
696 /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
704 m68k_set_irq_level(cpu
, 3, 27);
707 /* level 5 - scc (serial) */
709 m68k_set_irq_level(cpu
, 5, 29);
712 /* level 6 - audio etherrx/tx dma */
713 case NEXT_ENTX_DMA_I
:
714 case NEXT_ENRX_DMA_I
:
715 case NEXT_SCSI_DMA_I
:
718 m68k_set_irq_level(cpu
, 6, 30);
722 s
->int_status
&= ~(1 << shift
);
723 cpu_reset_interrupt(CPU(cpu
), CPU_INTERRUPT_HARD
);
727 static void nextdma_write(void *opaque
, uint8_t *buf
, int size
, int type
)
732 NeXTState
*next_state
= NEXT_MACHINE(qdev_get_machine());
734 if (type
== NEXTDMA_ENRX
|| type
== NEXTDMA_ENTX
) {
737 /* Most DMA is supposedly 16 byte aligned */
738 if ((size
% align
) != 0) {
739 size
-= size
% align
;
744 * prom sets the dma start using initbuf while the bootloader uses next
745 * so we check to see if initbuf is 0
747 if (next_state
->dma
[type
].next_initbuf
== 0) {
748 base_addr
= next_state
->dma
[type
].next
;
750 base_addr
= next_state
->dma
[type
].next_initbuf
;
753 cpu_physical_memory_write(base_addr
, buf
, size
);
755 next_state
->dma
[type
].next_initbuf
= 0;
757 /* saved limit is checked to calculate packet size by both, rom and netbsd */
758 next_state
->dma
[type
].saved_limit
= (next_state
->dma
[type
].next
+ size
);
759 next_state
->dma
[type
].saved_next
= (next_state
->dma
[type
].next
);
762 * 32 bytes under savedbase seems to be some kind of register
763 * of which the purpose is unknown as of yet
765 /* stl_phys(s->rx_dma.base-32,0xFFFFFFFF); */
767 if (!(next_state
->dma
[type
].csr
& DMA_SUPDATE
)) {
768 next_state
->dma
[type
].next
= next_state
->dma
[type
].start
;
769 next_state
->dma
[type
].limit
= next_state
->dma
[type
].stop
;
772 /* Set dma registers and raise an irq */
773 next_state
->dma
[type
].csr
|= DMA_COMPLETE
; /* DON'T CHANGE THIS! */
777 irq
= NEXT_SCSI_DMA_I
;
781 next_irq(opaque
, irq
, 1);
782 next_irq(opaque
, irq
, 0);
785 static void nextscsi_read(void *opaque
, uint8_t *buf
, int len
)
787 DPRINTF("SCSI READ: %x\n", len
);
791 static void nextscsi_write(void *opaque
, uint8_t *buf
, int size
)
793 DPRINTF("SCSI WRITE: %i\n", size
);
794 nextdma_write(opaque
, buf
, size
, NEXTDMA_SCSI
);
797 static void next_scsi_init(DeviceState
*pcdev
, M68kCPU
*cpu
)
799 struct NeXTPC
*next_pc
= NEXT_PC(pcdev
);
801 SysBusDevice
*sysbusdev
;
802 SysBusESPState
*sysbus_esp
;
805 dev
= qdev_new(TYPE_SYSBUS_ESP
);
806 sysbus_esp
= SYSBUS_ESP(dev
);
807 esp
= &sysbus_esp
->esp
;
808 esp
->dma_memory_read
= nextscsi_read
;
809 esp
->dma_memory_write
= nextscsi_write
;
810 esp
->dma_opaque
= pcdev
;
811 sysbus_esp
->it_shift
= 0;
812 esp
->dma_enabled
= 1;
813 sysbusdev
= SYS_BUS_DEVICE(dev
);
814 sysbus_realize_and_unref(sysbusdev
, &error_fatal
);
815 sysbus_connect_irq(sysbusdev
, 0, qdev_get_gpio_in(pcdev
, NEXT_SCSI_I
));
816 sysbus_mmio_map(sysbusdev
, 0, 0x2114000);
818 next_pc
->scsi_reset
= qdev_get_gpio_in(dev
, 0);
819 next_pc
->scsi_dma
= qdev_get_gpio_in(dev
, 1);
821 scsi_bus_legacy_handle_cmdline(&esp
->bus
);
824 static void next_escc_init(DeviceState
*pcdev
)
829 dev
= qdev_new(TYPE_ESCC
);
830 qdev_prop_set_uint32(dev
, "disabled", 0);
831 qdev_prop_set_uint32(dev
, "frequency", 9600 * 384);
832 qdev_prop_set_uint32(dev
, "it_shift", 0);
833 qdev_prop_set_bit(dev
, "bit_swap", true);
834 qdev_prop_set_chr(dev
, "chrB", serial_hd(1));
835 qdev_prop_set_chr(dev
, "chrA", serial_hd(0));
836 qdev_prop_set_uint32(dev
, "chnBtype", escc_serial
);
837 qdev_prop_set_uint32(dev
, "chnAtype", escc_serial
);
839 s
= SYS_BUS_DEVICE(dev
);
840 sysbus_realize_and_unref(s
, &error_fatal
);
841 sysbus_connect_irq(s
, 0, qdev_get_gpio_in(pcdev
, NEXT_SCC_I
));
842 sysbus_connect_irq(s
, 1, qdev_get_gpio_in(pcdev
, NEXT_SCC_DMA_I
));
843 sysbus_mmio_map(s
, 0, 0x2118000);
846 static void next_pc_reset(DeviceState
*dev
)
848 NeXTPC
*s
= NEXT_PC(dev
);
850 /* Set internal registers to initial values */
851 /* 0x0000XX00 << vital bits */
852 s
->scr1
= 0x00011102;
853 s
->scr2
= 0x00ff0c80;
855 s
->rtc
.status
= 0x90;
857 /* Load RTC RAM - TODO: provide possibility to load contents from file */
858 memcpy(s
->rtc
.ram
, rtc_ram2
, 32);
861 static void next_pc_realize(DeviceState
*dev
, Error
**errp
)
863 NeXTPC
*s
= NEXT_PC(dev
);
864 SysBusDevice
*sbd
= SYS_BUS_DEVICE(dev
);
866 qdev_init_gpio_in(dev
, next_irq
, NEXT_NUM_IRQS
);
868 memory_region_init_io(&s
->mmiomem
, OBJECT(s
), &next_mmio_ops
, s
,
869 "next.mmio", 0xd0000);
870 memory_region_init_io(&s
->scrmem
, OBJECT(s
), &next_scr_ops
, s
,
871 "next.scr", 0x20000);
872 sysbus_init_mmio(sbd
, &s
->mmiomem
);
873 sysbus_init_mmio(sbd
, &s
->scrmem
);
877 * If the m68k CPU implemented its inbound irq lines as GPIO lines
878 * rather than via the m68k_set_irq_level() function we would not need
879 * this cpu link property and could instead provide outbound IRQ lines
880 * that the board could wire up to the CPU.
882 static Property next_pc_properties
[] = {
883 DEFINE_PROP_LINK("cpu", NeXTPC
, cpu
, TYPE_M68K_CPU
, M68kCPU
*),
884 DEFINE_PROP_END_OF_LIST(),
887 static const VMStateDescription next_rtc_vmstate
= {
890 .minimum_version_id
= 1,
891 .fields
= (VMStateField
[]) {
892 VMSTATE_UINT8_ARRAY(ram
, NextRtc
, 32),
893 VMSTATE_UINT8(command
, NextRtc
),
894 VMSTATE_UINT8(value
, NextRtc
),
895 VMSTATE_UINT8(status
, NextRtc
),
896 VMSTATE_UINT8(control
, NextRtc
),
897 VMSTATE_UINT8(retval
, NextRtc
),
898 VMSTATE_END_OF_LIST()
902 static const VMStateDescription next_pc_vmstate
= {
905 .minimum_version_id
= 1,
906 .fields
= (VMStateField
[]) {
907 VMSTATE_UINT32(scr1
, NeXTPC
),
908 VMSTATE_UINT32(scr2
, NeXTPC
),
909 VMSTATE_UINT32(int_mask
, NeXTPC
),
910 VMSTATE_UINT32(int_status
, NeXTPC
),
911 VMSTATE_UINT8(scsi_csr_1
, NeXTPC
),
912 VMSTATE_UINT8(scsi_csr_2
, NeXTPC
),
913 VMSTATE_STRUCT(rtc
, NeXTPC
, 0, next_rtc_vmstate
, NextRtc
),
914 VMSTATE_END_OF_LIST()
918 static void next_pc_class_init(ObjectClass
*klass
, void *data
)
920 DeviceClass
*dc
= DEVICE_CLASS(klass
);
922 dc
->desc
= "NeXT Peripheral Controller";
923 dc
->realize
= next_pc_realize
;
924 dc
->reset
= next_pc_reset
;
925 device_class_set_props(dc
, next_pc_properties
);
926 dc
->vmsd
= &next_pc_vmstate
;
929 static const TypeInfo next_pc_info
= {
930 .name
= TYPE_NEXT_PC
,
931 .parent
= TYPE_SYS_BUS_DEVICE
,
932 .instance_size
= sizeof(NeXTPC
),
933 .class_init
= next_pc_class_init
,
936 static void next_cube_init(MachineState
*machine
)
940 MemoryRegion
*rom
= g_new(MemoryRegion
, 1);
941 MemoryRegion
*rom2
= g_new(MemoryRegion
, 1);
942 MemoryRegion
*dmamem
= g_new(MemoryRegion
, 1);
943 MemoryRegion
*bmapm1
= g_new(MemoryRegion
, 1);
944 MemoryRegion
*bmapm2
= g_new(MemoryRegion
, 1);
945 MemoryRegion
*sysmem
= get_system_memory();
946 const char *bios_name
= machine
->firmware
?: ROM_FILE
;
949 /* Initialize the cpu core */
950 cpu
= M68K_CPU(cpu_create(machine
->cpu_type
));
952 error_report("Unable to find m68k CPU definition");
957 /* Initialize CPU registers. */
961 /* Peripheral Controller */
962 pcdev
= qdev_new(TYPE_NEXT_PC
);
963 object_property_set_link(OBJECT(pcdev
), "cpu", OBJECT(cpu
), &error_abort
);
964 sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev
), &error_fatal
);
966 /* 64MB RAM starting at 0x04000000 */
967 memory_region_add_subregion(sysmem
, 0x04000000, machine
->ram
);
970 sysbus_create_simple(TYPE_NEXTFB
, 0x0B000000, NULL
);
973 sysbus_mmio_map(SYS_BUS_DEVICE(pcdev
), 0, 0x02000000);
975 /* BMAP IO - acts as a catch-all for now */
976 sysbus_mmio_map(SYS_BUS_DEVICE(pcdev
), 1, 0x02100000);
979 memory_region_init_ram_flags_nomigrate(bmapm1
, NULL
, "next.bmapmem", 64,
980 RAM_SHARED
, &error_fatal
);
981 memory_region_add_subregion(sysmem
, 0x020c0000, bmapm1
);
982 /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
983 memory_region_init_alias(bmapm2
, NULL
, "next.bmapmem2", bmapm1
, 0x0, 64);
984 memory_region_add_subregion(sysmem
, 0x820c0000, bmapm2
);
987 sysbus_create_simple(TYPE_NEXTKBD
, 0x0200e000, NULL
);
990 memory_region_init_rom(rom
, NULL
, "next.rom", 0x20000, &error_fatal
);
991 memory_region_add_subregion(sysmem
, 0x01000000, rom
);
992 memory_region_init_alias(rom2
, NULL
, "next.rom2", rom
, 0x0, 0x20000);
993 memory_region_add_subregion(sysmem
, 0x0, rom2
);
994 if (load_image_targphys(bios_name
, 0x01000000, 0x20000) < 8) {
995 if (!qtest_enabled()) {
996 error_report("Failed to load firmware '%s'.", bios_name
);
1000 /* Initial PC is always at offset 4 in firmware binaries */
1001 ptr
= rom_ptr(0x01000004, 4);
1002 g_assert(ptr
!= NULL
);
1003 env
->pc
= ldl_p(ptr
);
1004 if (env
->pc
>= 0x01020000) {
1005 error_report("'%s' does not seem to be a valid firmware image.",
1012 next_escc_init(pcdev
);
1017 next_scsi_init(pcdev
, cpu
);
1020 memory_region_init_io(dmamem
, NULL
, &dma_ops
, machine
, "next.dma", 0x5000);
1021 memory_region_add_subregion(sysmem
, 0x02000000, dmamem
);
1024 static void next_machine_class_init(ObjectClass
*oc
, void *data
)
1026 MachineClass
*mc
= MACHINE_CLASS(oc
);
1028 mc
->desc
= "NeXT Cube";
1029 mc
->init
= next_cube_init
;
1030 mc
->block_default_type
= IF_SCSI
;
1031 mc
->default_ram_size
= RAM_SIZE
;
1032 mc
->default_ram_id
= "next.ram";
1033 mc
->default_cpu_type
= M68K_CPU_TYPE_NAME("m68040");
1036 static const TypeInfo next_typeinfo
= {
1037 .name
= TYPE_NEXT_MACHINE
,
1038 .parent
= TYPE_MACHINE
,
1039 .class_init
= next_machine_class_init
,
1040 .instance_size
= sizeof(NeXTState
),
1043 static void next_register_type(void)
1045 type_register_static(&next_typeinfo
);
1046 type_register_static(&next_pc_info
);
1049 type_init(next_register_type
)