next-cube.c 29 KB

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