2
0

iotkit-sysctl.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  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. * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
  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 "target/arm/arm-powerctl.h"
  30. #include "target/arm/cpu.h"
  31. REG32(SECDBGSTAT, 0x0)
  32. REG32(SECDBGSET, 0x4)
  33. REG32(SECDBGCLR, 0x8)
  34. REG32(SCSECCTRL, 0xc)
  35. REG32(FCLK_DIV, 0x10)
  36. REG32(SYSCLK_DIV, 0x14)
  37. REG32(CLOCK_FORCE, 0x18)
  38. REG32(RESET_SYNDROME, 0x100)
  39. REG32(RESET_MASK, 0x104)
  40. REG32(SWRESET, 0x108)
  41. FIELD(SWRESET, SWRESETREQ, 9, 1)
  42. REG32(GRETREG, 0x10c)
  43. REG32(INITSVTOR0, 0x110)
  44. REG32(INITSVTOR1, 0x114)
  45. REG32(CPUWAIT, 0x118)
  46. REG32(NMI_ENABLE, 0x11c) /* BUSWAIT in IoTKit */
  47. REG32(WICCTRL, 0x120)
  48. REG32(EWCTRL, 0x124)
  49. REG32(PDCM_PD_SYS_SENSE, 0x200)
  50. REG32(PDCM_PD_SRAM0_SENSE, 0x20c)
  51. REG32(PDCM_PD_SRAM1_SENSE, 0x210)
  52. REG32(PDCM_PD_SRAM2_SENSE, 0x214)
  53. REG32(PDCM_PD_SRAM3_SENSE, 0x218)
  54. REG32(PID4, 0xfd0)
  55. REG32(PID5, 0xfd4)
  56. REG32(PID6, 0xfd8)
  57. REG32(PID7, 0xfdc)
  58. REG32(PID0, 0xfe0)
  59. REG32(PID1, 0xfe4)
  60. REG32(PID2, 0xfe8)
  61. REG32(PID3, 0xfec)
  62. REG32(CID0, 0xff0)
  63. REG32(CID1, 0xff4)
  64. REG32(CID2, 0xff8)
  65. REG32(CID3, 0xffc)
  66. /* PID/CID values */
  67. static const int sysctl_id[] = {
  68. 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
  69. 0x54, 0xb8, 0x0b, 0x00, /* PID0..PID3 */
  70. 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
  71. };
  72. /*
  73. * Set the initial secure vector table offset address for the core.
  74. * This will take effect when the CPU next resets.
  75. */
  76. static void set_init_vtor(uint64_t cpuid, uint32_t vtor)
  77. {
  78. Object *cpuobj = OBJECT(arm_get_cpu_by_id(cpuid));
  79. if (cpuobj) {
  80. if (object_property_find(cpuobj, "init-svtor", NULL)) {
  81. object_property_set_uint(cpuobj, vtor, "init-svtor", &error_abort);
  82. }
  83. }
  84. }
  85. static uint64_t iotkit_sysctl_read(void *opaque, hwaddr offset,
  86. unsigned size)
  87. {
  88. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  89. uint64_t r;
  90. switch (offset) {
  91. case A_SECDBGSTAT:
  92. r = s->secure_debug;
  93. break;
  94. case A_SCSECCTRL:
  95. if (!s->is_sse200) {
  96. goto bad_offset;
  97. }
  98. r = s->scsecctrl;
  99. break;
  100. case A_FCLK_DIV:
  101. if (!s->is_sse200) {
  102. goto bad_offset;
  103. }
  104. r = s->fclk_div;
  105. break;
  106. case A_SYSCLK_DIV:
  107. if (!s->is_sse200) {
  108. goto bad_offset;
  109. }
  110. r = s->sysclk_div;
  111. break;
  112. case A_CLOCK_FORCE:
  113. if (!s->is_sse200) {
  114. goto bad_offset;
  115. }
  116. r = s->clock_force;
  117. break;
  118. case A_RESET_SYNDROME:
  119. r = s->reset_syndrome;
  120. break;
  121. case A_RESET_MASK:
  122. r = s->reset_mask;
  123. break;
  124. case A_GRETREG:
  125. r = s->gretreg;
  126. break;
  127. case A_INITSVTOR0:
  128. r = s->initsvtor0;
  129. break;
  130. case A_INITSVTOR1:
  131. if (!s->is_sse200) {
  132. goto bad_offset;
  133. }
  134. r = s->initsvtor1;
  135. break;
  136. case A_CPUWAIT:
  137. r = s->cpuwait;
  138. break;
  139. case A_NMI_ENABLE:
  140. /* In IoTKit this is named BUSWAIT but is marked reserved, R/O, zero */
  141. if (!s->is_sse200) {
  142. r = 0;
  143. break;
  144. }
  145. r = s->nmi_enable;
  146. break;
  147. case A_WICCTRL:
  148. r = s->wicctrl;
  149. break;
  150. case A_EWCTRL:
  151. if (!s->is_sse200) {
  152. goto bad_offset;
  153. }
  154. r = s->ewctrl;
  155. break;
  156. case A_PDCM_PD_SYS_SENSE:
  157. if (!s->is_sse200) {
  158. goto bad_offset;
  159. }
  160. r = s->pdcm_pd_sys_sense;
  161. break;
  162. case A_PDCM_PD_SRAM0_SENSE:
  163. if (!s->is_sse200) {
  164. goto bad_offset;
  165. }
  166. r = s->pdcm_pd_sram0_sense;
  167. break;
  168. case A_PDCM_PD_SRAM1_SENSE:
  169. if (!s->is_sse200) {
  170. goto bad_offset;
  171. }
  172. r = s->pdcm_pd_sram1_sense;
  173. break;
  174. case A_PDCM_PD_SRAM2_SENSE:
  175. if (!s->is_sse200) {
  176. goto bad_offset;
  177. }
  178. r = s->pdcm_pd_sram2_sense;
  179. break;
  180. case A_PDCM_PD_SRAM3_SENSE:
  181. if (!s->is_sse200) {
  182. goto bad_offset;
  183. }
  184. r = s->pdcm_pd_sram3_sense;
  185. break;
  186. case A_PID4 ... A_CID3:
  187. r = sysctl_id[(offset - A_PID4) / 4];
  188. break;
  189. case A_SECDBGSET:
  190. case A_SECDBGCLR:
  191. case A_SWRESET:
  192. qemu_log_mask(LOG_GUEST_ERROR,
  193. "IoTKit SysCtl read: read of WO offset %x\n",
  194. (int)offset);
  195. r = 0;
  196. break;
  197. default:
  198. bad_offset:
  199. qemu_log_mask(LOG_GUEST_ERROR,
  200. "IoTKit SysCtl read: bad offset %x\n", (int)offset);
  201. r = 0;
  202. break;
  203. }
  204. trace_iotkit_sysctl_read(offset, r, size);
  205. return r;
  206. }
  207. static void iotkit_sysctl_write(void *opaque, hwaddr offset,
  208. uint64_t value, unsigned size)
  209. {
  210. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  211. trace_iotkit_sysctl_write(offset, value, size);
  212. /*
  213. * Most of the state here has to do with control of reset and
  214. * similar kinds of power up -- for instance the guest can ask
  215. * what the reason for the last reset was, or forbid reset for
  216. * some causes (like the non-secure watchdog). Most of this is
  217. * not relevant to QEMU, which doesn't really model anything other
  218. * than a full power-on reset.
  219. * We just model the registers as reads-as-written.
  220. */
  221. switch (offset) {
  222. case A_RESET_SYNDROME:
  223. qemu_log_mask(LOG_UNIMP,
  224. "IoTKit SysCtl RESET_SYNDROME unimplemented\n");
  225. s->reset_syndrome = value;
  226. break;
  227. case A_RESET_MASK:
  228. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl RESET_MASK unimplemented\n");
  229. s->reset_mask = value;
  230. break;
  231. case A_GRETREG:
  232. /*
  233. * General retention register, which is only reset by a power-on
  234. * reset. Technically this implementation is complete, since
  235. * QEMU only supports power-on resets...
  236. */
  237. s->gretreg = value;
  238. break;
  239. case A_INITSVTOR0:
  240. s->initsvtor0 = value;
  241. set_init_vtor(0, s->initsvtor0);
  242. break;
  243. case A_CPUWAIT:
  244. if ((s->cpuwait & 1) && !(value & 1)) {
  245. /* Powering up CPU 0 */
  246. arm_set_cpu_on_and_reset(0);
  247. }
  248. if ((s->cpuwait & 2) && !(value & 2)) {
  249. /* Powering up CPU 1 */
  250. arm_set_cpu_on_and_reset(1);
  251. }
  252. s->cpuwait = value;
  253. break;
  254. case A_WICCTRL:
  255. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl WICCTRL unimplemented\n");
  256. s->wicctrl = value;
  257. break;
  258. case A_SECDBGSET:
  259. /* write-1-to-set */
  260. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SECDBGSET unimplemented\n");
  261. s->secure_debug |= value;
  262. break;
  263. case A_SECDBGCLR:
  264. /* write-1-to-clear */
  265. s->secure_debug &= ~value;
  266. break;
  267. case A_SWRESET:
  268. /* One w/o bit to request a reset; all other bits reserved */
  269. if (value & R_SWRESET_SWRESETREQ_MASK) {
  270. qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
  271. }
  272. break;
  273. case A_SCSECCTRL:
  274. if (!s->is_sse200) {
  275. goto bad_offset;
  276. }
  277. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SCSECCTRL unimplemented\n");
  278. s->scsecctrl = value;
  279. break;
  280. case A_FCLK_DIV:
  281. if (!s->is_sse200) {
  282. goto bad_offset;
  283. }
  284. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl FCLK_DIV unimplemented\n");
  285. s->fclk_div = value;
  286. break;
  287. case A_SYSCLK_DIV:
  288. if (!s->is_sse200) {
  289. goto bad_offset;
  290. }
  291. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl SYSCLK_DIV unimplemented\n");
  292. s->sysclk_div = value;
  293. break;
  294. case A_CLOCK_FORCE:
  295. if (!s->is_sse200) {
  296. goto bad_offset;
  297. }
  298. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl CLOCK_FORCE unimplemented\n");
  299. s->clock_force = value;
  300. break;
  301. case A_INITSVTOR1:
  302. if (!s->is_sse200) {
  303. goto bad_offset;
  304. }
  305. s->initsvtor1 = value;
  306. set_init_vtor(1, s->initsvtor1);
  307. break;
  308. case A_EWCTRL:
  309. if (!s->is_sse200) {
  310. goto bad_offset;
  311. }
  312. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl EWCTRL unimplemented\n");
  313. s->ewctrl = value;
  314. break;
  315. case A_PDCM_PD_SYS_SENSE:
  316. if (!s->is_sse200) {
  317. goto bad_offset;
  318. }
  319. qemu_log_mask(LOG_UNIMP,
  320. "IoTKit SysCtl PDCM_PD_SYS_SENSE unimplemented\n");
  321. s->pdcm_pd_sys_sense = value;
  322. break;
  323. case A_PDCM_PD_SRAM0_SENSE:
  324. if (!s->is_sse200) {
  325. goto bad_offset;
  326. }
  327. qemu_log_mask(LOG_UNIMP,
  328. "IoTKit SysCtl PDCM_PD_SRAM0_SENSE unimplemented\n");
  329. s->pdcm_pd_sram0_sense = value;
  330. break;
  331. case A_PDCM_PD_SRAM1_SENSE:
  332. if (!s->is_sse200) {
  333. goto bad_offset;
  334. }
  335. qemu_log_mask(LOG_UNIMP,
  336. "IoTKit SysCtl PDCM_PD_SRAM1_SENSE unimplemented\n");
  337. s->pdcm_pd_sram1_sense = value;
  338. break;
  339. case A_PDCM_PD_SRAM2_SENSE:
  340. if (!s->is_sse200) {
  341. goto bad_offset;
  342. }
  343. qemu_log_mask(LOG_UNIMP,
  344. "IoTKit SysCtl PDCM_PD_SRAM2_SENSE unimplemented\n");
  345. s->pdcm_pd_sram2_sense = value;
  346. break;
  347. case A_PDCM_PD_SRAM3_SENSE:
  348. if (!s->is_sse200) {
  349. goto bad_offset;
  350. }
  351. qemu_log_mask(LOG_UNIMP,
  352. "IoTKit SysCtl PDCM_PD_SRAM3_SENSE unimplemented\n");
  353. s->pdcm_pd_sram3_sense = value;
  354. break;
  355. case A_NMI_ENABLE:
  356. /* In IoTKit this is BUSWAIT: reserved, R/O, zero */
  357. if (!s->is_sse200) {
  358. goto ro_offset;
  359. }
  360. qemu_log_mask(LOG_UNIMP, "IoTKit SysCtl NMI_ENABLE unimplemented\n");
  361. s->nmi_enable = value;
  362. break;
  363. case A_SECDBGSTAT:
  364. case A_PID4 ... A_CID3:
  365. ro_offset:
  366. qemu_log_mask(LOG_GUEST_ERROR,
  367. "IoTKit SysCtl write: write of RO offset %x\n",
  368. (int)offset);
  369. break;
  370. default:
  371. bad_offset:
  372. qemu_log_mask(LOG_GUEST_ERROR,
  373. "IoTKit SysCtl write: bad offset %x\n", (int)offset);
  374. break;
  375. }
  376. }
  377. static const MemoryRegionOps iotkit_sysctl_ops = {
  378. .read = iotkit_sysctl_read,
  379. .write = iotkit_sysctl_write,
  380. .endianness = DEVICE_LITTLE_ENDIAN,
  381. /* byte/halfword accesses are just zero-padded on reads and writes */
  382. .impl.min_access_size = 4,
  383. .impl.max_access_size = 4,
  384. .valid.min_access_size = 1,
  385. .valid.max_access_size = 4,
  386. };
  387. static void iotkit_sysctl_reset(DeviceState *dev)
  388. {
  389. IoTKitSysCtl *s = IOTKIT_SYSCTL(dev);
  390. trace_iotkit_sysctl_reset();
  391. s->secure_debug = 0;
  392. s->reset_syndrome = 1;
  393. s->reset_mask = 0;
  394. s->gretreg = 0;
  395. s->initsvtor0 = s->initsvtor0_rst;
  396. s->initsvtor1 = s->initsvtor1_rst;
  397. s->cpuwait = s->cpuwait_rst;
  398. s->wicctrl = 0;
  399. s->scsecctrl = 0;
  400. s->fclk_div = 0;
  401. s->sysclk_div = 0;
  402. s->clock_force = 0;
  403. s->nmi_enable = 0;
  404. s->ewctrl = 0;
  405. s->pdcm_pd_sys_sense = 0x7f;
  406. s->pdcm_pd_sram0_sense = 0;
  407. s->pdcm_pd_sram1_sense = 0;
  408. s->pdcm_pd_sram2_sense = 0;
  409. s->pdcm_pd_sram3_sense = 0;
  410. }
  411. static void iotkit_sysctl_init(Object *obj)
  412. {
  413. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  414. IoTKitSysCtl *s = IOTKIT_SYSCTL(obj);
  415. memory_region_init_io(&s->iomem, obj, &iotkit_sysctl_ops,
  416. s, "iotkit-sysctl", 0x1000);
  417. sysbus_init_mmio(sbd, &s->iomem);
  418. }
  419. static void iotkit_sysctl_realize(DeviceState *dev, Error **errp)
  420. {
  421. IoTKitSysCtl *s = IOTKIT_SYSCTL(dev);
  422. /* The top 4 bits of the SYS_VERSION register tell us if we're an SSE-200 */
  423. if (extract32(s->sys_version, 28, 4) == 2) {
  424. s->is_sse200 = true;
  425. }
  426. }
  427. static bool sse200_needed(void *opaque)
  428. {
  429. IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
  430. return s->is_sse200;
  431. }
  432. static const VMStateDescription iotkit_sysctl_sse200_vmstate = {
  433. .name = "iotkit-sysctl/sse-200",
  434. .version_id = 1,
  435. .minimum_version_id = 1,
  436. .needed = sse200_needed,
  437. .fields = (VMStateField[]) {
  438. VMSTATE_UINT32(scsecctrl, IoTKitSysCtl),
  439. VMSTATE_UINT32(fclk_div, IoTKitSysCtl),
  440. VMSTATE_UINT32(sysclk_div, IoTKitSysCtl),
  441. VMSTATE_UINT32(clock_force, IoTKitSysCtl),
  442. VMSTATE_UINT32(initsvtor1, IoTKitSysCtl),
  443. VMSTATE_UINT32(nmi_enable, IoTKitSysCtl),
  444. VMSTATE_UINT32(pdcm_pd_sys_sense, IoTKitSysCtl),
  445. VMSTATE_UINT32(pdcm_pd_sram0_sense, IoTKitSysCtl),
  446. VMSTATE_UINT32(pdcm_pd_sram1_sense, IoTKitSysCtl),
  447. VMSTATE_UINT32(pdcm_pd_sram2_sense, IoTKitSysCtl),
  448. VMSTATE_UINT32(pdcm_pd_sram3_sense, IoTKitSysCtl),
  449. VMSTATE_END_OF_LIST()
  450. }
  451. };
  452. static const VMStateDescription iotkit_sysctl_vmstate = {
  453. .name = "iotkit-sysctl",
  454. .version_id = 1,
  455. .minimum_version_id = 1,
  456. .fields = (VMStateField[]) {
  457. VMSTATE_UINT32(secure_debug, IoTKitSysCtl),
  458. VMSTATE_UINT32(reset_syndrome, IoTKitSysCtl),
  459. VMSTATE_UINT32(reset_mask, IoTKitSysCtl),
  460. VMSTATE_UINT32(gretreg, IoTKitSysCtl),
  461. VMSTATE_UINT32(initsvtor0, IoTKitSysCtl),
  462. VMSTATE_UINT32(cpuwait, IoTKitSysCtl),
  463. VMSTATE_UINT32(wicctrl, IoTKitSysCtl),
  464. VMSTATE_END_OF_LIST()
  465. },
  466. .subsections = (const VMStateDescription*[]) {
  467. &iotkit_sysctl_sse200_vmstate,
  468. NULL
  469. }
  470. };
  471. static Property iotkit_sysctl_props[] = {
  472. DEFINE_PROP_UINT32("SYS_VERSION", IoTKitSysCtl, sys_version, 0),
  473. DEFINE_PROP_UINT32("CPUWAIT_RST", IoTKitSysCtl, cpuwait_rst, 0),
  474. DEFINE_PROP_UINT32("INITSVTOR0_RST", IoTKitSysCtl, initsvtor0_rst,
  475. 0x10000000),
  476. DEFINE_PROP_UINT32("INITSVTOR1_RST", IoTKitSysCtl, initsvtor1_rst,
  477. 0x10000000),
  478. DEFINE_PROP_END_OF_LIST()
  479. };
  480. static void iotkit_sysctl_class_init(ObjectClass *klass, void *data)
  481. {
  482. DeviceClass *dc = DEVICE_CLASS(klass);
  483. dc->vmsd = &iotkit_sysctl_vmstate;
  484. dc->reset = iotkit_sysctl_reset;
  485. dc->props = iotkit_sysctl_props;
  486. dc->realize = iotkit_sysctl_realize;
  487. }
  488. static const TypeInfo iotkit_sysctl_info = {
  489. .name = TYPE_IOTKIT_SYSCTL,
  490. .parent = TYPE_SYS_BUS_DEVICE,
  491. .instance_size = sizeof(IoTKitSysCtl),
  492. .instance_init = iotkit_sysctl_init,
  493. .class_init = iotkit_sysctl_class_init,
  494. };
  495. static void iotkit_sysctl_register_types(void)
  496. {
  497. type_register_static(&iotkit_sysctl_info);
  498. }
  499. type_init(iotkit_sysctl_register_types);