iotkit-sysctl.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. /*
  2. * ARM IoTKit system control element
  3. *
  4. * Copyright (c) 2018 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. /*
  12. * This is a model of the "system control element" which is part of the
  13. * Arm IoTKit and documented in
  14. * https://developer.arm.com/documentation/ecm0601256/latest
  15. * Specifically, it implements the "system control register" blocks.
  16. */
  17. #include "qemu/osdep.h"
  18. #include "qemu/bitops.h"
  19. #include "qemu/log.h"
  20. #include "qemu/module.h"
  21. #include "sysemu/runstate.h"
  22. #include "trace.h"
  23. #include "qapi/error.h"
  24. #include "hw/sysbus.h"
  25. #include "migration/vmstate.h"
  26. #include "hw/registerfields.h"
  27. #include "hw/misc/iotkit-sysctl.h"
  28. #include "hw/qdev-properties.h"
  29. #include "hw/arm/armsse-version.h"
  30. #include "target/arm/arm-powerctl.h"
  31. #include "target/arm/cpu.h"
  32. REG32(SECDBGSTAT, 0x0)
  33. REG32(SECDBGSET, 0x4)
  34. REG32(SECDBGCLR, 0x8)
  35. REG32(SCSECCTRL, 0xc)
  36. REG32(FCLK_DIV, 0x10)
  37. REG32(SYSCLK_DIV, 0x14)
  38. REG32(CLOCK_FORCE, 0x18)
  39. REG32(RESET_SYNDROME, 0x100)
  40. REG32(RESET_MASK, 0x104)
  41. REG32(SWRESET, 0x108)
  42. FIELD(SWRESET, SWRESETREQ, 9, 1)
  43. REG32(GRETREG, 0x10c)
  44. REG32(INITSVTOR0, 0x110)
  45. FIELD(INITSVTOR0, LOCK, 0, 1)
  46. FIELD(INITSVTOR0, VTOR, 7, 25)
  47. REG32(INITSVTOR1, 0x114)
  48. REG32(CPUWAIT, 0x118)
  49. REG32(NMI_ENABLE, 0x11c) /* BUSWAIT in IoTKit */
  50. REG32(WICCTRL, 0x120)
  51. REG32(EWCTRL, 0x124)
  52. REG32(PWRCTRL, 0x1fc)
  53. FIELD(PWRCTRL, PPU_ACCESS_UNLOCK, 0, 1)
  54. FIELD(PWRCTRL, PPU_ACCESS_FILTER, 1, 1)
  55. REG32(PDCM_PD_SYS_SENSE, 0x200)
  56. REG32(PDCM_PD_CPU0_SENSE, 0x204)
  57. REG32(PDCM_PD_SRAM0_SENSE, 0x20c)
  58. REG32(PDCM_PD_SRAM1_SENSE, 0x210)
  59. REG32(PDCM_PD_SRAM2_SENSE, 0x214) /* PDCM_PD_VMR0_SENSE on SSE300 */
  60. REG32(PDCM_PD_SRAM3_SENSE, 0x218) /* PDCM_PD_VMR1_SENSE on SSE300 */
  61. REG32(PID4, 0xfd0)
  62. REG32(PID5, 0xfd4)
  63. REG32(PID6, 0xfd8)
  64. REG32(PID7, 0xfdc)
  65. REG32(PID0, 0xfe0)
  66. REG32(PID1, 0xfe4)
  67. REG32(PID2, 0xfe8)
  68. REG32(PID3, 0xfec)
  69. REG32(CID0, 0xff0)
  70. REG32(CID1, 0xff4)
  71. REG32(CID2, 0xff8)
  72. REG32(CID3, 0xffc)
  73. /* PID/CID values */
  74. static const int iotkit_sysctl_id[] = {
  75. 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
  76. 0x54, 0xb8, 0x0b, 0x00, /* PID0..PID3 */
  77. 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
  78. };
  79. /* Also used by the SSE300 */
  80. static const int sse200_sysctl_id[] = {
  81. 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
  82. 0x54, 0xb8, 0x1b, 0x00, /* PID0..PID3 */
  83. 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
  84. };
  85. /*
  86. * Set the initial secure vector table offset address for the core.
  87. * This will take effect when the CPU next resets.
  88. */
  89. static void set_init_vtor(uint64_t cpuid, uint32_t vtor)
  90. {
  91. Object *cpuobj = OBJECT(arm_get_cpu_by_id(cpuid));
  92. if (cpuobj) {
  93. if (object_property_find(cpuobj, "init-svtor")) {
  94. object_property_set_uint(cpuobj, "init-svtor", vtor, &error_abort);
  95. }
  96. }
  97. }
  98. static uint64_t iotkit_sysctl_read(void *opaque, hwaddr offset,
  99. unsigned size)
  100. {
  101. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  102. uint64_t r;
  103. switch (offset) {
  104. case A_SECDBGSTAT:
  105. r = s->secure_debug;
  106. break;
  107. case A_SCSECCTRL:
  108. switch (s->sse_version) {
  109. case ARMSSE_IOTKIT:
  110. goto bad_offset;
  111. case ARMSSE_SSE200:
  112. case ARMSSE_SSE300:
  113. r = s->scsecctrl;
  114. break;
  115. default:
  116. g_assert_not_reached();
  117. }
  118. break;
  119. case A_FCLK_DIV:
  120. switch (s->sse_version) {
  121. case ARMSSE_IOTKIT:
  122. goto bad_offset;
  123. case ARMSSE_SSE200:
  124. case ARMSSE_SSE300:
  125. r = s->fclk_div;
  126. break;
  127. default:
  128. g_assert_not_reached();
  129. }
  130. break;
  131. case A_SYSCLK_DIV:
  132. switch (s->sse_version) {
  133. case ARMSSE_IOTKIT:
  134. goto bad_offset;
  135. case ARMSSE_SSE200:
  136. case ARMSSE_SSE300:
  137. r = s->sysclk_div;
  138. break;
  139. default:
  140. g_assert_not_reached();
  141. }
  142. break;
  143. case A_CLOCK_FORCE:
  144. switch (s->sse_version) {
  145. case ARMSSE_IOTKIT:
  146. goto bad_offset;
  147. case ARMSSE_SSE200:
  148. case ARMSSE_SSE300:
  149. r = s->clock_force;
  150. break;
  151. default:
  152. g_assert_not_reached();
  153. }
  154. break;
  155. case A_RESET_SYNDROME:
  156. r = s->reset_syndrome;
  157. break;
  158. case A_RESET_MASK:
  159. r = s->reset_mask;
  160. break;
  161. case A_GRETREG:
  162. r = s->gretreg;
  163. break;
  164. case A_INITSVTOR0:
  165. r = s->initsvtor0;
  166. break;
  167. case A_INITSVTOR1:
  168. switch (s->sse_version) {
  169. case ARMSSE_IOTKIT:
  170. goto bad_offset;
  171. case ARMSSE_SSE200:
  172. r = s->initsvtor1;
  173. break;
  174. case ARMSSE_SSE300:
  175. goto bad_offset;
  176. default:
  177. g_assert_not_reached();
  178. }
  179. break;
  180. case A_CPUWAIT:
  181. switch (s->sse_version) {
  182. case ARMSSE_IOTKIT:
  183. case ARMSSE_SSE200:
  184. r = s->cpuwait;
  185. break;
  186. case ARMSSE_SSE300:
  187. /* In SSE300 this is reserved (for INITSVTOR2) */
  188. goto bad_offset;
  189. default:
  190. g_assert_not_reached();
  191. }
  192. break;
  193. case A_NMI_ENABLE:
  194. switch (s->sse_version) {
  195. case ARMSSE_IOTKIT:
  196. /* In IoTKit this is named BUSWAIT but marked reserved, R/O, zero */
  197. r = 0;
  198. break;
  199. case ARMSSE_SSE200:
  200. r = s->nmi_enable;
  201. break;
  202. case ARMSSE_SSE300:
  203. /* In SSE300 this is reserved (for INITSVTOR3) */
  204. goto bad_offset;
  205. default:
  206. g_assert_not_reached();
  207. }
  208. break;
  209. case A_WICCTRL:
  210. switch (s->sse_version) {
  211. case ARMSSE_IOTKIT:
  212. case ARMSSE_SSE200:
  213. r = s->wicctrl;
  214. break;
  215. case ARMSSE_SSE300:
  216. /* In SSE300 this offset is CPUWAIT */
  217. r = s->cpuwait;
  218. break;
  219. default:
  220. g_assert_not_reached();
  221. }
  222. break;
  223. case A_EWCTRL:
  224. switch (s->sse_version) {
  225. case ARMSSE_IOTKIT:
  226. goto bad_offset;
  227. case ARMSSE_SSE200:
  228. r = s->ewctrl;
  229. break;
  230. case ARMSSE_SSE300:
  231. /* In SSE300 this offset is is NMI_ENABLE */
  232. r = s->nmi_enable;
  233. break;
  234. default:
  235. g_assert_not_reached();
  236. }
  237. break;
  238. case A_PWRCTRL:
  239. switch (s->sse_version) {
  240. case ARMSSE_IOTKIT:
  241. case ARMSSE_SSE200:
  242. goto bad_offset;
  243. case ARMSSE_SSE300:
  244. r = s->pwrctrl;
  245. break;
  246. default:
  247. g_assert_not_reached();
  248. }
  249. break;
  250. case A_PDCM_PD_SYS_SENSE:
  251. switch (s->sse_version) {
  252. case ARMSSE_IOTKIT:
  253. goto bad_offset;
  254. case ARMSSE_SSE200:
  255. case ARMSSE_SSE300:
  256. r = s->pdcm_pd_sys_sense;
  257. break;
  258. default:
  259. g_assert_not_reached();
  260. }
  261. break;
  262. case A_PDCM_PD_CPU0_SENSE:
  263. switch (s->sse_version) {
  264. case ARMSSE_IOTKIT:
  265. case ARMSSE_SSE200:
  266. goto bad_offset;
  267. case ARMSSE_SSE300:
  268. r = s->pdcm_pd_cpu0_sense;
  269. break;
  270. default:
  271. g_assert_not_reached();
  272. }
  273. break;
  274. case A_PDCM_PD_SRAM0_SENSE:
  275. switch (s->sse_version) {
  276. case ARMSSE_IOTKIT:
  277. goto bad_offset;
  278. case ARMSSE_SSE200:
  279. r = s->pdcm_pd_sram0_sense;
  280. break;
  281. case ARMSSE_SSE300:
  282. goto bad_offset;
  283. default:
  284. g_assert_not_reached();
  285. }
  286. break;
  287. case A_PDCM_PD_SRAM1_SENSE:
  288. switch (s->sse_version) {
  289. case ARMSSE_IOTKIT:
  290. goto bad_offset;
  291. case ARMSSE_SSE200:
  292. r = s->pdcm_pd_sram1_sense;
  293. break;
  294. case ARMSSE_SSE300:
  295. goto bad_offset;
  296. default:
  297. g_assert_not_reached();
  298. }
  299. break;
  300. case A_PDCM_PD_SRAM2_SENSE:
  301. switch (s->sse_version) {
  302. case ARMSSE_IOTKIT:
  303. goto bad_offset;
  304. case ARMSSE_SSE200:
  305. r = s->pdcm_pd_sram2_sense;
  306. break;
  307. case ARMSSE_SSE300:
  308. r = s->pdcm_pd_vmr0_sense;
  309. break;
  310. default:
  311. g_assert_not_reached();
  312. }
  313. break;
  314. case A_PDCM_PD_SRAM3_SENSE:
  315. switch (s->sse_version) {
  316. case ARMSSE_IOTKIT:
  317. goto bad_offset;
  318. case ARMSSE_SSE200:
  319. r = s->pdcm_pd_sram3_sense;
  320. break;
  321. case ARMSSE_SSE300:
  322. r = s->pdcm_pd_vmr1_sense;
  323. break;
  324. default:
  325. g_assert_not_reached();
  326. }
  327. break;
  328. case A_PID4 ... A_CID3:
  329. switch (s->sse_version) {
  330. case ARMSSE_IOTKIT:
  331. r = iotkit_sysctl_id[(offset - A_PID4) / 4];
  332. break;
  333. case ARMSSE_SSE200:
  334. case ARMSSE_SSE300:
  335. r = sse200_sysctl_id[(offset - A_PID4) / 4];
  336. break;
  337. default:
  338. g_assert_not_reached();
  339. }
  340. break;
  341. case A_SECDBGSET:
  342. case A_SECDBGCLR:
  343. case A_SWRESET:
  344. qemu_log_mask(LOG_GUEST_ERROR,
  345. "IoTKit SysCtl read: read of WO offset %x\n",
  346. (int)offset);
  347. r = 0;
  348. break;
  349. default:
  350. bad_offset:
  351. qemu_log_mask(LOG_GUEST_ERROR,
  352. "IoTKit SysCtl read: bad offset %x\n", (int)offset);
  353. r = 0;
  354. break;
  355. }
  356. trace_iotkit_sysctl_read(offset, r, size);
  357. return r;
  358. }
  359. static void cpuwait_write(IoTKitSysCtl *s, uint32_t value)
  360. {
  361. int num_cpus = (s->sse_version == ARMSSE_SSE300) ? 1 : 2;
  362. int i;
  363. for (i = 0; i < num_cpus; i++) {
  364. uint32_t mask = 1 << i;
  365. if ((s->cpuwait & mask) && !(value & mask)) {
  366. /* Powering up CPU 0 */
  367. arm_set_cpu_on_and_reset(i);
  368. }
  369. }
  370. s->cpuwait = value;
  371. }
  372. static void iotkit_sysctl_write(void *opaque, hwaddr offset,
  373. uint64_t value, unsigned size)
  374. {
  375. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  376. trace_iotkit_sysctl_write(offset, value, size);
  377. /*
  378. * Most of the state here has to do with control of reset and
  379. * similar kinds of power up -- for instance the guest can ask
  380. * what the reason for the last reset was, or forbid reset for
  381. * some causes (like the non-secure watchdog). Most of this is
  382. * not relevant to QEMU, which doesn't really model anything other
  383. * than a full power-on reset.
  384. * We just model the registers as reads-as-written.
  385. */
  386. switch (offset) {
  387. case A_RESET_SYNDROME:
  388. qemu_log_mask(LOG_UNIMP,
  389. "IoTKit SysCtl RESET_SYNDROME unimplemented\n");
  390. s->reset_syndrome = value;
  391. break;
  392. case A_RESET_MASK:
  393. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl RESET_MASK unimplemented\n");
  394. s->reset_mask = value;
  395. break;
  396. case A_GRETREG:
  397. /*
  398. * General retention register, which is only reset by a power-on
  399. * reset. Technically this implementation is complete, since
  400. * QEMU only supports power-on resets...
  401. */
  402. s->gretreg = value;
  403. break;
  404. case A_INITSVTOR0:
  405. switch (s->sse_version) {
  406. case ARMSSE_SSE300:
  407. /* SSE300 has a LOCK bit which prevents further writes when set */
  408. if (s->initsvtor0 & R_INITSVTOR0_LOCK_MASK) {
  409. qemu_log_mask(LOG_GUEST_ERROR,
  410. "IoTKit INITSVTOR0 write when register locked\n");
  411. break;
  412. }
  413. s->initsvtor0 = value;
  414. set_init_vtor(0, s->initsvtor0 & R_INITSVTOR0_VTOR_MASK);
  415. break;
  416. case ARMSSE_IOTKIT:
  417. case ARMSSE_SSE200:
  418. s->initsvtor0 = value;
  419. set_init_vtor(0, s->initsvtor0);
  420. break;
  421. default:
  422. g_assert_not_reached();
  423. }
  424. break;
  425. case A_CPUWAIT:
  426. switch (s->sse_version) {
  427. case ARMSSE_IOTKIT:
  428. case ARMSSE_SSE200:
  429. cpuwait_write(s, value);
  430. break;
  431. case ARMSSE_SSE300:
  432. /* In SSE300 this is reserved (for INITSVTOR2) */
  433. goto bad_offset;
  434. default:
  435. g_assert_not_reached();
  436. }
  437. break;
  438. case A_WICCTRL:
  439. switch (s->sse_version) {
  440. case ARMSSE_IOTKIT:
  441. case ARMSSE_SSE200:
  442. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl WICCTRL unimplemented\n");
  443. s->wicctrl = value;
  444. break;
  445. case ARMSSE_SSE300:
  446. /* In SSE300 this offset is CPUWAIT */
  447. cpuwait_write(s, value);
  448. break;
  449. default:
  450. g_assert_not_reached();
  451. }
  452. break;
  453. case A_SECDBGSET:
  454. /* write-1-to-set */
  455. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SECDBGSET unimplemented\n");
  456. s->secure_debug |= value;
  457. break;
  458. case A_SECDBGCLR:
  459. /* write-1-to-clear */
  460. s->secure_debug &= ~value;
  461. break;
  462. case A_SWRESET:
  463. /* One w/o bit to request a reset; all other bits reserved */
  464. if (value & R_SWRESET_SWRESETREQ_MASK) {
  465. qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
  466. }
  467. break;
  468. case A_SCSECCTRL:
  469. switch (s->sse_version) {
  470. case ARMSSE_IOTKIT:
  471. goto bad_offset;
  472. case ARMSSE_SSE200:
  473. case ARMSSE_SSE300:
  474. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SCSECCTRL unimplemented\n");
  475. s->scsecctrl = value;
  476. break;
  477. default:
  478. g_assert_not_reached();
  479. }
  480. break;
  481. case A_FCLK_DIV:
  482. switch (s->sse_version) {
  483. case ARMSSE_IOTKIT:
  484. goto bad_offset;
  485. case ARMSSE_SSE200:
  486. case ARMSSE_SSE300:
  487. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl FCLK_DIV unimplemented\n");
  488. s->fclk_div = value;
  489. break;
  490. default:
  491. g_assert_not_reached();
  492. }
  493. break;
  494. case A_SYSCLK_DIV:
  495. switch (s->sse_version) {
  496. case ARMSSE_IOTKIT:
  497. goto bad_offset;
  498. case ARMSSE_SSE200:
  499. case ARMSSE_SSE300:
  500. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SYSCLK_DIV unimplemented\n");
  501. s->sysclk_div = value;
  502. break;
  503. default:
  504. g_assert_not_reached();
  505. }
  506. break;
  507. case A_CLOCK_FORCE:
  508. switch (s->sse_version) {
  509. case ARMSSE_IOTKIT:
  510. goto bad_offset;
  511. case ARMSSE_SSE200:
  512. case ARMSSE_SSE300:
  513. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl CLOCK_FORCE unimplemented\n");
  514. s->clock_force = value;
  515. break;
  516. default:
  517. g_assert_not_reached();
  518. }
  519. break;
  520. case A_INITSVTOR1:
  521. switch (s->sse_version) {
  522. case ARMSSE_IOTKIT:
  523. goto bad_offset;
  524. case ARMSSE_SSE200:
  525. s->initsvtor1 = value;
  526. set_init_vtor(1, s->initsvtor1);
  527. break;
  528. case ARMSSE_SSE300:
  529. goto bad_offset;
  530. default:
  531. g_assert_not_reached();
  532. }
  533. break;
  534. case A_EWCTRL:
  535. switch (s->sse_version) {
  536. case ARMSSE_IOTKIT:
  537. goto bad_offset;
  538. case ARMSSE_SSE200:
  539. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl EWCTRL unimplemented\n");
  540. s->ewctrl = value;
  541. break;
  542. case ARMSSE_SSE300:
  543. /* In SSE300 this offset is is NMI_ENABLE */
  544. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl NMI_ENABLE unimplemented\n");
  545. s->nmi_enable = value;
  546. break;
  547. default:
  548. g_assert_not_reached();
  549. }
  550. break;
  551. case A_PWRCTRL:
  552. switch (s->sse_version) {
  553. case ARMSSE_IOTKIT:
  554. case ARMSSE_SSE200:
  555. goto bad_offset;
  556. case ARMSSE_SSE300:
  557. if (!(s->pwrctrl & R_PWRCTRL_PPU_ACCESS_UNLOCK_MASK)) {
  558. qemu_log_mask(LOG_GUEST_ERROR,
  559. "IoTKit PWRCTRL write when register locked\n");
  560. break;
  561. }
  562. s->pwrctrl = value;
  563. break;
  564. default:
  565. g_assert_not_reached();
  566. }
  567. break;
  568. case A_PDCM_PD_SYS_SENSE:
  569. switch (s->sse_version) {
  570. case ARMSSE_IOTKIT:
  571. goto bad_offset;
  572. case ARMSSE_SSE200:
  573. case ARMSSE_SSE300:
  574. qemu_log_mask(LOG_UNIMP,
  575. "IoTKit SysCtl PDCM_PD_SYS_SENSE unimplemented\n");
  576. s->pdcm_pd_sys_sense = value;
  577. break;
  578. default:
  579. g_assert_not_reached();
  580. }
  581. break;
  582. case A_PDCM_PD_CPU0_SENSE:
  583. switch (s->sse_version) {
  584. case ARMSSE_IOTKIT:
  585. case ARMSSE_SSE200:
  586. goto bad_offset;
  587. case ARMSSE_SSE300:
  588. qemu_log_mask(LOG_UNIMP,
  589. "IoTKit SysCtl PDCM_PD_CPU0_SENSE unimplemented\n");
  590. s->pdcm_pd_cpu0_sense = value;
  591. break;
  592. default:
  593. g_assert_not_reached();
  594. }
  595. break;
  596. case A_PDCM_PD_SRAM0_SENSE:
  597. switch (s->sse_version) {
  598. case ARMSSE_IOTKIT:
  599. goto bad_offset;
  600. case ARMSSE_SSE200:
  601. qemu_log_mask(LOG_UNIMP,
  602. "IoTKit SysCtl PDCM_PD_SRAM0_SENSE unimplemented\n");
  603. s->pdcm_pd_sram0_sense = value;
  604. break;
  605. case ARMSSE_SSE300:
  606. goto bad_offset;
  607. default:
  608. g_assert_not_reached();
  609. }
  610. break;
  611. case A_PDCM_PD_SRAM1_SENSE:
  612. switch (s->sse_version) {
  613. case ARMSSE_IOTKIT:
  614. goto bad_offset;
  615. case ARMSSE_SSE200:
  616. qemu_log_mask(LOG_UNIMP,
  617. "IoTKit SysCtl PDCM_PD_SRAM1_SENSE unimplemented\n");
  618. s->pdcm_pd_sram1_sense = value;
  619. break;
  620. case ARMSSE_SSE300:
  621. goto bad_offset;
  622. default:
  623. g_assert_not_reached();
  624. }
  625. break;
  626. case A_PDCM_PD_SRAM2_SENSE:
  627. switch (s->sse_version) {
  628. case ARMSSE_IOTKIT:
  629. goto bad_offset;
  630. case ARMSSE_SSE200:
  631. qemu_log_mask(LOG_UNIMP,
  632. "IoTKit SysCtl PDCM_PD_SRAM2_SENSE unimplemented\n");
  633. s->pdcm_pd_sram2_sense = value;
  634. break;
  635. case ARMSSE_SSE300:
  636. qemu_log_mask(LOG_UNIMP,
  637. "IoTKit SysCtl PDCM_PD_VMR0_SENSE unimplemented\n");
  638. s->pdcm_pd_vmr0_sense = value;
  639. break;
  640. default:
  641. g_assert_not_reached();
  642. }
  643. break;
  644. case A_PDCM_PD_SRAM3_SENSE:
  645. switch (s->sse_version) {
  646. case ARMSSE_IOTKIT:
  647. goto bad_offset;
  648. case ARMSSE_SSE200:
  649. qemu_log_mask(LOG_UNIMP,
  650. "IoTKit SysCtl PDCM_PD_SRAM3_SENSE unimplemented\n");
  651. s->pdcm_pd_sram3_sense = value;
  652. break;
  653. case ARMSSE_SSE300:
  654. qemu_log_mask(LOG_UNIMP,
  655. "IoTKit SysCtl PDCM_PD_VMR1_SENSE unimplemented\n");
  656. s->pdcm_pd_vmr1_sense = value;
  657. break;
  658. default:
  659. g_assert_not_reached();
  660. }
  661. break;
  662. case A_NMI_ENABLE:
  663. /* In IoTKit this is BUSWAIT: reserved, R/O, zero */
  664. switch (s->sse_version) {
  665. case ARMSSE_IOTKIT:
  666. goto ro_offset;
  667. case ARMSSE_SSE200:
  668. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl NMI_ENABLE unimplemented\n");
  669. s->nmi_enable = value;
  670. break;
  671. case ARMSSE_SSE300:
  672. /* In SSE300 this is reserved (for INITSVTOR3) */
  673. goto bad_offset;
  674. default:
  675. g_assert_not_reached();
  676. }
  677. break;
  678. case A_SECDBGSTAT:
  679. case A_PID4 ... A_CID3:
  680. ro_offset:
  681. qemu_log_mask(LOG_GUEST_ERROR,
  682. "IoTKit SysCtl write: write of RO offset %x\n",
  683. (int)offset);
  684. break;
  685. default:
  686. bad_offset:
  687. qemu_log_mask(LOG_GUEST_ERROR,
  688. "IoTKit SysCtl write: bad offset %x\n", (int)offset);
  689. break;
  690. }
  691. }
  692. static const MemoryRegionOps iotkit_sysctl_ops = {
  693. .read = iotkit_sysctl_read,
  694. .write = iotkit_sysctl_write,
  695. .endianness = DEVICE_LITTLE_ENDIAN,
  696. /* byte/halfword accesses are just zero-padded on reads and writes */
  697. .impl.min_access_size = 4,
  698. .impl.max_access_size = 4,
  699. .valid.min_access_size = 1,
  700. .valid.max_access_size = 4,
  701. };
  702. static void iotkit_sysctl_reset(DeviceState *dev)
  703. {
  704. IoTKitSysCtl *s = IOTKIT_SYSCTL(dev);
  705. trace_iotkit_sysctl_reset();
  706. s->secure_debug = 0;
  707. s->reset_syndrome = 1;
  708. s->reset_mask = 0;
  709. s->gretreg = 0;
  710. s->initsvtor0 = s->initsvtor0_rst;
  711. s->initsvtor1 = s->initsvtor1_rst;
  712. s->cpuwait = s->cpuwait_rst;
  713. s->wicctrl = 0;
  714. s->scsecctrl = 0;
  715. s->fclk_div = 0;
  716. s->sysclk_div = 0;
  717. s->clock_force = 0;
  718. s->nmi_enable = 0;
  719. s->ewctrl = 0;
  720. s->pwrctrl = 0x3;
  721. s->pdcm_pd_sys_sense = 0x7f;
  722. s->pdcm_pd_sram0_sense = 0;
  723. s->pdcm_pd_sram1_sense = 0;
  724. s->pdcm_pd_sram2_sense = 0;
  725. s->pdcm_pd_sram3_sense = 0;
  726. s->pdcm_pd_cpu0_sense = 0;
  727. s->pdcm_pd_vmr0_sense = 0;
  728. s->pdcm_pd_vmr1_sense = 0;
  729. }
  730. static void iotkit_sysctl_init(Object *obj)
  731. {
  732. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  733. IoTKitSysCtl *s = IOTKIT_SYSCTL(obj);
  734. memory_region_init_io(&s->iomem, obj, &iotkit_sysctl_ops,
  735. s, "iotkit-sysctl", 0x1000);
  736. sysbus_init_mmio(sbd, &s->iomem);
  737. }
  738. static void iotkit_sysctl_realize(DeviceState *dev, Error **errp)
  739. {
  740. IoTKitSysCtl *s = IOTKIT_SYSCTL(dev);
  741. if (!armsse_version_valid(s->sse_version)) {
  742. error_setg(errp, "invalid sse-version value %d", s->sse_version);
  743. return;
  744. }
  745. }
  746. static bool sse300_needed(void *opaque)
  747. {
  748. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  749. return s->sse_version == ARMSSE_SSE300;
  750. }
  751. static const VMStateDescription iotkit_sysctl_sse300_vmstate = {
  752. .name = "iotkit-sysctl/sse-300",
  753. .version_id = 1,
  754. .minimum_version_id = 1,
  755. .needed = sse300_needed,
  756. .fields = (VMStateField[]) {
  757. VMSTATE_UINT32(pwrctrl, IoTKitSysCtl),
  758. VMSTATE_UINT32(pdcm_pd_cpu0_sense, IoTKitSysCtl),
  759. VMSTATE_UINT32(pdcm_pd_vmr0_sense, IoTKitSysCtl),
  760. VMSTATE_UINT32(pdcm_pd_vmr1_sense, IoTKitSysCtl),
  761. VMSTATE_END_OF_LIST()
  762. }
  763. };
  764. static bool sse200_needed(void *opaque)
  765. {
  766. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  767. return s->sse_version != ARMSSE_IOTKIT;
  768. }
  769. static const VMStateDescription iotkit_sysctl_sse200_vmstate = {
  770. .name = "iotkit-sysctl/sse-200",
  771. .version_id = 1,
  772. .minimum_version_id = 1,
  773. .needed = sse200_needed,
  774. .fields = (VMStateField[]) {
  775. VMSTATE_UINT32(scsecctrl, IoTKitSysCtl),
  776. VMSTATE_UINT32(fclk_div, IoTKitSysCtl),
  777. VMSTATE_UINT32(sysclk_div, IoTKitSysCtl),
  778. VMSTATE_UINT32(clock_force, IoTKitSysCtl),
  779. VMSTATE_UINT32(initsvtor1, IoTKitSysCtl),
  780. VMSTATE_UINT32(nmi_enable, IoTKitSysCtl),
  781. VMSTATE_UINT32(pdcm_pd_sys_sense, IoTKitSysCtl),
  782. VMSTATE_UINT32(pdcm_pd_sram0_sense, IoTKitSysCtl),
  783. VMSTATE_UINT32(pdcm_pd_sram1_sense, IoTKitSysCtl),
  784. VMSTATE_UINT32(pdcm_pd_sram2_sense, IoTKitSysCtl),
  785. VMSTATE_UINT32(pdcm_pd_sram3_sense, IoTKitSysCtl),
  786. VMSTATE_END_OF_LIST()
  787. }
  788. };
  789. static const VMStateDescription iotkit_sysctl_vmstate = {
  790. .name = "iotkit-sysctl",
  791. .version_id = 1,
  792. .minimum_version_id = 1,
  793. .fields = (VMStateField[]) {
  794. VMSTATE_UINT32(secure_debug, IoTKitSysCtl),
  795. VMSTATE_UINT32(reset_syndrome, IoTKitSysCtl),
  796. VMSTATE_UINT32(reset_mask, IoTKitSysCtl),
  797. VMSTATE_UINT32(gretreg, IoTKitSysCtl),
  798. VMSTATE_UINT32(initsvtor0, IoTKitSysCtl),
  799. VMSTATE_UINT32(cpuwait, IoTKitSysCtl),
  800. VMSTATE_UINT32(wicctrl, IoTKitSysCtl),
  801. VMSTATE_END_OF_LIST()
  802. },
  803. .subsections = (const VMStateDescription*[]) {
  804. &iotkit_sysctl_sse200_vmstate,
  805. &iotkit_sysctl_sse300_vmstate,
  806. NULL
  807. }
  808. };
  809. static Property iotkit_sysctl_props[] = {
  810. DEFINE_PROP_UINT32("sse-version", IoTKitSysCtl, sse_version, 0),
  811. DEFINE_PROP_UINT32("CPUWAIT_RST", IoTKitSysCtl, cpuwait_rst, 0),
  812. DEFINE_PROP_UINT32("INITSVTOR0_RST", IoTKitSysCtl, initsvtor0_rst,
  813. 0x10000000),
  814. DEFINE_PROP_UINT32("INITSVTOR1_RST", IoTKitSysCtl, initsvtor1_rst,
  815. 0x10000000),
  816. DEFINE_PROP_END_OF_LIST()
  817. };
  818. static void iotkit_sysctl_class_init(ObjectClass *klass, void *data)
  819. {
  820. DeviceClass *dc = DEVICE_CLASS(klass);
  821. dc->vmsd = &iotkit_sysctl_vmstate;
  822. dc->reset = iotkit_sysctl_reset;
  823. device_class_set_props(dc, iotkit_sysctl_props);
  824. dc->realize = iotkit_sysctl_realize;
  825. }
  826. static const TypeInfo iotkit_sysctl_info = {
  827. .name = TYPE_IOTKIT_SYSCTL,
  828. .parent = TYPE_SYS_BUS_DEVICE,
  829. .instance_size = sizeof(IoTKitSysCtl),
  830. .instance_init = iotkit_sysctl_init,
  831. .class_init = iotkit_sysctl_class_init,
  832. };
  833. static void iotkit_sysctl_register_types(void)
  834. {
  835. type_register_static(&iotkit_sysctl_info);
  836. }
  837. type_init(iotkit_sysctl_register_types);