2
0

next-cube.c 27 KB

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