2
0

next-cube.c 38 KB

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