2
0

mps2-scc.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /*
  2. * ARM MPS2 SCC emulation
  3. *
  4. * Copyright (c) 2017 Linaro Limited
  5. * Written by Peter Maydell
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 or
  9. * (at your option) any later version.
  10. */
  11. /* This is a model of the SCC (Serial Communication Controller)
  12. * found in the FPGA images of MPS2 development boards.
  13. *
  14. * Documentation of it can be found in the MPS2 TRM:
  15. * https://developer.arm.com/documentation/100112/latest/
  16. * and also in the Application Notes documenting individual FPGA images.
  17. */
  18. #include "qemu/osdep.h"
  19. #include "qemu/log.h"
  20. #include "qemu/module.h"
  21. #include "qemu/bitops.h"
  22. #include "trace.h"
  23. #include "hw/sysbus.h"
  24. #include "hw/irq.h"
  25. #include "migration/vmstate.h"
  26. #include "hw/registerfields.h"
  27. #include "hw/misc/mps2-scc.h"
  28. #include "hw/misc/led.h"
  29. #include "hw/qdev-properties.h"
  30. REG32(CFG0, 0)
  31. REG32(CFG1, 4)
  32. REG32(CFG2, 8)
  33. REG32(CFG3, 0xc)
  34. REG32(CFG4, 0x10)
  35. REG32(CFG5, 0x14)
  36. REG32(CFG6, 0x18)
  37. REG32(CFG7, 0x1c)
  38. REG32(CFGDATA_RTN, 0xa0)
  39. REG32(CFGDATA_OUT, 0xa4)
  40. REG32(CFGCTRL, 0xa8)
  41. FIELD(CFGCTRL, DEVICE, 0, 12)
  42. FIELD(CFGCTRL, RES1, 12, 8)
  43. FIELD(CFGCTRL, FUNCTION, 20, 6)
  44. FIELD(CFGCTRL, RES2, 26, 4)
  45. FIELD(CFGCTRL, WRITE, 30, 1)
  46. FIELD(CFGCTRL, START, 31, 1)
  47. REG32(CFGSTAT, 0xac)
  48. FIELD(CFGSTAT, DONE, 0, 1)
  49. FIELD(CFGSTAT, ERROR, 1, 1)
  50. REG32(DLL, 0x100)
  51. REG32(AID, 0xFF8)
  52. REG32(ID, 0xFFC)
  53. static int scc_partno(MPS2SCC *s)
  54. {
  55. /* Return the partno field of the SCC_ID (0x524, 0x511, etc) */
  56. return extract32(s->id, 4, 8);
  57. }
  58. /* Is CFG_REG2 present? */
  59. static bool have_cfg2(MPS2SCC *s)
  60. {
  61. return scc_partno(s) == 0x524 || scc_partno(s) == 0x547 ||
  62. scc_partno(s) == 0x536;
  63. }
  64. /* Is CFG_REG3 present? */
  65. static bool have_cfg3(MPS2SCC *s)
  66. {
  67. return scc_partno(s) != 0x524 && scc_partno(s) != 0x547 &&
  68. scc_partno(s) != 0x536;
  69. }
  70. /* Is CFG_REG5 present? */
  71. static bool have_cfg5(MPS2SCC *s)
  72. {
  73. return scc_partno(s) == 0x524 || scc_partno(s) == 0x547 ||
  74. scc_partno(s) == 0x536;
  75. }
  76. /* Is CFG_REG6 present? */
  77. static bool have_cfg6(MPS2SCC *s)
  78. {
  79. return scc_partno(s) == 0x524 || scc_partno(s) == 0x536;
  80. }
  81. /* Is CFG_REG7 present? */
  82. static bool have_cfg7(MPS2SCC *s)
  83. {
  84. return scc_partno(s) == 0x536;
  85. }
  86. /* Does CFG_REG0 drive the 'remap' GPIO output? */
  87. static bool cfg0_is_remap(MPS2SCC *s)
  88. {
  89. return scc_partno(s) != 0x536;
  90. }
  91. /* Is CFG_REG1 driving a set of LEDs? */
  92. static bool cfg1_is_leds(MPS2SCC *s)
  93. {
  94. return scc_partno(s) != 0x536;
  95. }
  96. /* Handle a write via the SYS_CFG channel to the specified function/device.
  97. * Return false on error (reported to guest via SYS_CFGCTRL ERROR bit).
  98. */
  99. static bool scc_cfg_write(MPS2SCC *s, unsigned function,
  100. unsigned device, uint32_t value)
  101. {
  102. trace_mps2_scc_cfg_write(function, device, value);
  103. if (function != 1 || device >= s->num_oscclk) {
  104. qemu_log_mask(LOG_GUEST_ERROR,
  105. "MPS2 SCC config write: bad function %d device %d\n",
  106. function, device);
  107. return false;
  108. }
  109. s->oscclk[device] = value;
  110. return true;
  111. }
  112. /* Handle a read via the SYS_CFG channel to the specified function/device.
  113. * Return false on error (reported to guest via SYS_CFGCTRL ERROR bit),
  114. * or set *value on success.
  115. */
  116. static bool scc_cfg_read(MPS2SCC *s, unsigned function,
  117. unsigned device, uint32_t *value)
  118. {
  119. if (function != 1 || device >= s->num_oscclk) {
  120. qemu_log_mask(LOG_GUEST_ERROR,
  121. "MPS2 SCC config read: bad function %d device %d\n",
  122. function, device);
  123. return false;
  124. }
  125. *value = s->oscclk[device];
  126. trace_mps2_scc_cfg_read(function, device, *value);
  127. return true;
  128. }
  129. static uint64_t mps2_scc_read(void *opaque, hwaddr offset, unsigned size)
  130. {
  131. MPS2SCC *s = MPS2_SCC(opaque);
  132. uint64_t r;
  133. switch (offset) {
  134. case A_CFG0:
  135. r = s->cfg0;
  136. break;
  137. case A_CFG1:
  138. r = s->cfg1;
  139. break;
  140. case A_CFG2:
  141. if (!have_cfg2(s)) {
  142. goto bad_offset;
  143. }
  144. r = s->cfg2;
  145. break;
  146. case A_CFG3:
  147. if (!have_cfg3(s)) {
  148. goto bad_offset;
  149. }
  150. /*
  151. * These are user-settable DIP switches on the board. We don't
  152. * model that, so just return zeroes.
  153. *
  154. * TODO: for AN536 this is MCC_MSB_ADDR "additional MCC addressing
  155. * bits". These change which part of the DDR4 the motherboard
  156. * configuration controller can see in its memory map (see the
  157. * appnote section 2.4). QEMU doesn't model the MCC at all, so these
  158. * bits are not interesting to us; read-as-zero is as good as anything
  159. * else.
  160. */
  161. r = 0;
  162. break;
  163. case A_CFG4:
  164. r = s->cfg4;
  165. break;
  166. case A_CFG5:
  167. if (!have_cfg5(s)) {
  168. goto bad_offset;
  169. }
  170. r = s->cfg5;
  171. break;
  172. case A_CFG6:
  173. if (!have_cfg6(s)) {
  174. goto bad_offset;
  175. }
  176. r = s->cfg6;
  177. break;
  178. case A_CFG7:
  179. if (!have_cfg7(s)) {
  180. goto bad_offset;
  181. }
  182. r = s->cfg7;
  183. break;
  184. case A_CFGDATA_RTN:
  185. r = s->cfgdata_rtn;
  186. break;
  187. case A_CFGDATA_OUT:
  188. r = s->cfgdata_out;
  189. break;
  190. case A_CFGCTRL:
  191. r = s->cfgctrl;
  192. break;
  193. case A_CFGSTAT:
  194. r = s->cfgstat;
  195. break;
  196. case A_DLL:
  197. r = s->dll;
  198. break;
  199. case A_AID:
  200. r = s->aid;
  201. break;
  202. case A_ID:
  203. r = s->id;
  204. break;
  205. default:
  206. bad_offset:
  207. qemu_log_mask(LOG_GUEST_ERROR,
  208. "MPS2 SCC read: bad offset %x\n", (int) offset);
  209. r = 0;
  210. break;
  211. }
  212. trace_mps2_scc_read(offset, r, size);
  213. return r;
  214. }
  215. static void mps2_scc_write(void *opaque, hwaddr offset, uint64_t value,
  216. unsigned size)
  217. {
  218. MPS2SCC *s = MPS2_SCC(opaque);
  219. trace_mps2_scc_write(offset, value, size);
  220. switch (offset) {
  221. case A_CFG0:
  222. /*
  223. * On some boards bit 0 controls board-specific remapping;
  224. * we always reflect bit 0 in the 'remap' GPIO output line,
  225. * and let the board wire it up or not as it chooses.
  226. * TODO on some boards bit 1 is CPU_WAIT.
  227. *
  228. * TODO: on the AN536 this register controls reset and halt
  229. * for both CPUs. For the moment we don't implement this, so the
  230. * register just reads as written.
  231. */
  232. s->cfg0 = value;
  233. if (cfg0_is_remap(s)) {
  234. qemu_set_irq(s->remap, s->cfg0 & 1);
  235. }
  236. break;
  237. case A_CFG1:
  238. s->cfg1 = value;
  239. /*
  240. * On most boards this register drives LEDs.
  241. *
  242. * TODO: for AN536 this controls whether flash and ATCM are
  243. * enabled or disabled on reset. QEMU doesn't model this, and
  244. * always wires up RAM in the ATCM area and ROM in the flash area.
  245. */
  246. if (cfg1_is_leds(s)) {
  247. for (size_t i = 0; i < ARRAY_SIZE(s->led); i++) {
  248. led_set_state(s->led[i], extract32(value, i, 1));
  249. }
  250. }
  251. break;
  252. case A_CFG2:
  253. if (!have_cfg2(s)) {
  254. goto bad_offset;
  255. }
  256. /* AN524, AN536: QSPI Select signal */
  257. s->cfg2 = value;
  258. break;
  259. case A_CFG5:
  260. if (!have_cfg5(s)) {
  261. goto bad_offset;
  262. }
  263. /* AN524, AN536: ACLK frequency in Hz */
  264. s->cfg5 = value;
  265. break;
  266. case A_CFG6:
  267. if (!have_cfg6(s)) {
  268. goto bad_offset;
  269. }
  270. /* AN524: Clock divider for BRAM */
  271. /* AN536: Core 0 vector table base address */
  272. s->cfg6 = value;
  273. break;
  274. case A_CFG7:
  275. if (!have_cfg7(s)) {
  276. goto bad_offset;
  277. }
  278. /* AN536: Core 1 vector table base address */
  279. s->cfg6 = value;
  280. break;
  281. case A_CFGDATA_OUT:
  282. s->cfgdata_out = value;
  283. break;
  284. case A_CFGCTRL:
  285. /* Writing to CFGCTRL clears SYS_CFGSTAT */
  286. s->cfgstat = 0;
  287. s->cfgctrl = value & ~(R_CFGCTRL_RES1_MASK |
  288. R_CFGCTRL_RES2_MASK |
  289. R_CFGCTRL_START_MASK);
  290. if (value & R_CFGCTRL_START_MASK) {
  291. /* Start bit set -- do a read or write (instantaneously) */
  292. int device = extract32(s->cfgctrl, R_CFGCTRL_DEVICE_SHIFT,
  293. R_CFGCTRL_DEVICE_LENGTH);
  294. int function = extract32(s->cfgctrl, R_CFGCTRL_FUNCTION_SHIFT,
  295. R_CFGCTRL_FUNCTION_LENGTH);
  296. s->cfgstat = R_CFGSTAT_DONE_MASK;
  297. if (s->cfgctrl & R_CFGCTRL_WRITE_MASK) {
  298. if (!scc_cfg_write(s, function, device, s->cfgdata_out)) {
  299. s->cfgstat |= R_CFGSTAT_ERROR_MASK;
  300. }
  301. } else {
  302. uint32_t result;
  303. if (!scc_cfg_read(s, function, device, &result)) {
  304. s->cfgstat |= R_CFGSTAT_ERROR_MASK;
  305. } else {
  306. s->cfgdata_rtn = result;
  307. }
  308. }
  309. }
  310. break;
  311. case A_DLL:
  312. /* DLL stands for Digital Locked Loop.
  313. * Bits [31:24] (DLL_LOCK_MASK) are writable, and indicate a
  314. * mask of which of the DLL_LOCKED bits [16:23] should be ORed
  315. * together to determine the ALL_UNMASKED_DLLS_LOCKED bit [0].
  316. * For QEMU, our DLLs are always locked, so we can leave bit 0
  317. * as 1 always and don't need to recalculate it.
  318. */
  319. s->dll = deposit32(s->dll, 24, 8, extract32(value, 24, 8));
  320. break;
  321. default:
  322. bad_offset:
  323. qemu_log_mask(LOG_GUEST_ERROR,
  324. "MPS2 SCC write: bad offset 0x%x\n", (int) offset);
  325. break;
  326. }
  327. }
  328. static const MemoryRegionOps mps2_scc_ops = {
  329. .read = mps2_scc_read,
  330. .write = mps2_scc_write,
  331. .endianness = DEVICE_LITTLE_ENDIAN,
  332. };
  333. static void mps2_scc_reset(DeviceState *dev)
  334. {
  335. MPS2SCC *s = MPS2_SCC(dev);
  336. int i;
  337. trace_mps2_scc_reset();
  338. s->cfg0 = s->cfg0_reset;
  339. s->cfg1 = 0;
  340. s->cfg2 = 0;
  341. s->cfg5 = 0;
  342. s->cfg6 = 0;
  343. s->cfgdata_rtn = 0;
  344. s->cfgdata_out = 0;
  345. s->cfgctrl = 0x100000;
  346. s->cfgstat = 0;
  347. s->dll = 0xffff0001;
  348. for (i = 0; i < s->num_oscclk; i++) {
  349. s->oscclk[i] = s->oscclk_reset[i];
  350. }
  351. for (i = 0; i < ARRAY_SIZE(s->led); i++) {
  352. device_cold_reset(DEVICE(s->led[i]));
  353. }
  354. }
  355. static void mps2_scc_init(Object *obj)
  356. {
  357. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  358. MPS2SCC *s = MPS2_SCC(obj);
  359. memory_region_init_io(&s->iomem, obj, &mps2_scc_ops, s, "mps2-scc", 0x1000);
  360. sysbus_init_mmio(sbd, &s->iomem);
  361. qdev_init_gpio_out_named(DEVICE(obj), &s->remap, "remap", 1);
  362. }
  363. static void mps2_scc_realize(DeviceState *dev, Error **errp)
  364. {
  365. MPS2SCC *s = MPS2_SCC(dev);
  366. for (size_t i = 0; i < ARRAY_SIZE(s->led); i++) {
  367. char *name = g_strdup_printf("SCC LED%zu", i);
  368. s->led[i] = led_create_simple(OBJECT(dev), GPIO_POLARITY_ACTIVE_HIGH,
  369. LED_COLOR_GREEN, name);
  370. g_free(name);
  371. }
  372. s->oscclk = g_new0(uint32_t, s->num_oscclk);
  373. }
  374. static void mps2_scc_finalize(Object *obj)
  375. {
  376. MPS2SCC *s = MPS2_SCC(obj);
  377. g_free(s->oscclk_reset);
  378. }
  379. static bool cfg7_needed(void *opaque)
  380. {
  381. MPS2SCC *s = opaque;
  382. return have_cfg7(s);
  383. }
  384. static const VMStateDescription vmstate_cfg7 = {
  385. .name = "mps2-scc/cfg7",
  386. .version_id = 1,
  387. .minimum_version_id = 1,
  388. .needed = cfg7_needed,
  389. .fields = (const VMStateField[]) {
  390. VMSTATE_UINT32(cfg7, MPS2SCC),
  391. VMSTATE_END_OF_LIST()
  392. }
  393. };
  394. static const VMStateDescription mps2_scc_vmstate = {
  395. .name = "mps2-scc",
  396. .version_id = 3,
  397. .minimum_version_id = 3,
  398. .fields = (const VMStateField[]) {
  399. VMSTATE_UINT32(cfg0, MPS2SCC),
  400. VMSTATE_UINT32(cfg1, MPS2SCC),
  401. VMSTATE_UINT32(cfg2, MPS2SCC),
  402. /* cfg3, cfg4 are read-only so need not be migrated */
  403. VMSTATE_UINT32(cfg5, MPS2SCC),
  404. VMSTATE_UINT32(cfg6, MPS2SCC),
  405. VMSTATE_UINT32(cfgdata_rtn, MPS2SCC),
  406. VMSTATE_UINT32(cfgdata_out, MPS2SCC),
  407. VMSTATE_UINT32(cfgctrl, MPS2SCC),
  408. VMSTATE_UINT32(cfgstat, MPS2SCC),
  409. VMSTATE_UINT32(dll, MPS2SCC),
  410. VMSTATE_VARRAY_UINT32(oscclk, MPS2SCC, num_oscclk,
  411. 0, vmstate_info_uint32, uint32_t),
  412. VMSTATE_END_OF_LIST()
  413. },
  414. .subsections = (const VMStateDescription * const []) {
  415. &vmstate_cfg7,
  416. NULL
  417. }
  418. };
  419. static const Property mps2_scc_properties[] = {
  420. /* Values for various read-only ID registers (which are specific
  421. * to the board model or FPGA image)
  422. */
  423. DEFINE_PROP_UINT32("scc-cfg4", MPS2SCC, cfg4, 0),
  424. DEFINE_PROP_UINT32("scc-aid", MPS2SCC, aid, 0),
  425. DEFINE_PROP_UINT32("scc-id", MPS2SCC, id, 0),
  426. /* Reset value for CFG0 register */
  427. DEFINE_PROP_UINT32("scc-cfg0", MPS2SCC, cfg0_reset, 0),
  428. /*
  429. * These are the initial settings for the source clocks on the board.
  430. * In hardware they can be configured via a config file read by the
  431. * motherboard configuration controller to suit the FPGA image.
  432. */
  433. DEFINE_PROP_ARRAY("oscclk", MPS2SCC, num_oscclk, oscclk_reset,
  434. qdev_prop_uint32, uint32_t),
  435. };
  436. static void mps2_scc_class_init(ObjectClass *klass, void *data)
  437. {
  438. DeviceClass *dc = DEVICE_CLASS(klass);
  439. dc->realize = mps2_scc_realize;
  440. dc->vmsd = &mps2_scc_vmstate;
  441. device_class_set_legacy_reset(dc, mps2_scc_reset);
  442. device_class_set_props(dc, mps2_scc_properties);
  443. }
  444. static const TypeInfo mps2_scc_info = {
  445. .name = TYPE_MPS2_SCC,
  446. .parent = TYPE_SYS_BUS_DEVICE,
  447. .instance_size = sizeof(MPS2SCC),
  448. .instance_init = mps2_scc_init,
  449. .instance_finalize = mps2_scc_finalize,
  450. .class_init = mps2_scc_class_init,
  451. };
  452. static void mps2_scc_register_types(void)
  453. {
  454. type_register_static(&mps2_scc_info);
  455. }
  456. type_init(mps2_scc_register_types);