next-cube.c 31 KB

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