2 * ARM IoTKit system control element
4 * Copyright (c) 2018 Linaro Limited
5 * Written by Peter Maydell
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.
13 * This is a model of the "system control element" which is part of the
14 * Arm IoTKit and documented in
15 * https://developer.arm.com/documentation/ecm0601256/latest
16 * Specifically, it implements the "system control register" blocks.
19 #include "qemu/osdep.h"
20 #include "qemu/bitops.h"
22 #include "qemu/module.h"
23 #include "sysemu/runstate.h"
25 #include "qapi/error.h"
26 #include "hw/sysbus.h"
27 #include "migration/vmstate.h"
28 #include "hw/registerfields.h"
29 #include "hw/misc/iotkit-sysctl.h"
30 #include "hw/qdev-properties.h"
31 #include "hw/arm/armsse-version.h"
32 #include "target/arm/arm-powerctl.h"
33 #include "target/arm/cpu.h"
35 REG32(SECDBGSTAT
, 0x0)
40 REG32(SYSCLK_DIV
, 0x14)
41 REG32(CLOCK_FORCE
, 0x18)
42 REG32(RESET_SYNDROME
, 0x100)
43 REG32(RESET_MASK
, 0x104)
45 FIELD(SWRESET
, SWRESETREQ
, 9, 1)
47 REG32(INITSVTOR0
, 0x110)
48 FIELD(INITSVTOR0
, LOCK
, 0, 1)
49 FIELD(INITSVTOR0
, VTOR
, 7, 25)
50 REG32(INITSVTOR1
, 0x114)
52 REG32(NMI_ENABLE
, 0x11c) /* BUSWAIT in IoTKit */
56 FIELD(PWRCTRL
, PPU_ACCESS_UNLOCK
, 0, 1)
57 FIELD(PWRCTRL
, PPU_ACCESS_FILTER
, 1, 1)
58 REG32(PDCM_PD_SYS_SENSE
, 0x200)
59 REG32(PDCM_PD_CPU0_SENSE
, 0x204)
60 REG32(PDCM_PD_SRAM0_SENSE
, 0x20c)
61 REG32(PDCM_PD_SRAM1_SENSE
, 0x210)
62 REG32(PDCM_PD_SRAM2_SENSE
, 0x214) /* PDCM_PD_VMR0_SENSE on SSE300 */
63 REG32(PDCM_PD_SRAM3_SENSE
, 0x218) /* PDCM_PD_VMR1_SENSE on SSE300 */
78 static const int sysctl_id
[] = {
79 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
80 0x54, 0xb8, 0x0b, 0x00, /* PID0..PID3 */
81 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
85 * Set the initial secure vector table offset address for the core.
86 * This will take effect when the CPU next resets.
88 static void set_init_vtor(uint64_t cpuid
, uint32_t vtor
)
90 Object
*cpuobj
= OBJECT(arm_get_cpu_by_id(cpuid
));
93 if (object_property_find(cpuobj
, "init-svtor")) {
94 object_property_set_uint(cpuobj
, "init-svtor", vtor
, &error_abort
);
99 static uint64_t iotkit_sysctl_read(void *opaque
, hwaddr offset
,
102 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(opaque
);
110 switch (s
->sse_version
) {
118 g_assert_not_reached();
122 switch (s
->sse_version
) {
130 g_assert_not_reached();
134 switch (s
->sse_version
) {
142 g_assert_not_reached();
146 switch (s
->sse_version
) {
154 g_assert_not_reached();
157 case A_RESET_SYNDROME
:
158 r
= s
->reset_syndrome
;
170 switch (s
->sse_version
) {
179 g_assert_not_reached();
183 switch (s
->sse_version
) {
189 /* In SSE300 this is reserved (for INITSVTOR2) */
192 g_assert_not_reached();
196 switch (s
->sse_version
) {
198 /* In IoTKit this is named BUSWAIT but marked reserved, R/O, zero */
205 /* In SSE300 this is reserved (for INITSVTOR3) */
208 g_assert_not_reached();
212 switch (s
->sse_version
) {
218 /* In SSE300 this offset is CPUWAIT */
222 g_assert_not_reached();
226 switch (s
->sse_version
) {
233 /* In SSE300 this offset is is NMI_ENABLE */
237 g_assert_not_reached();
241 switch (s
->sse_version
) {
249 g_assert_not_reached();
252 case A_PDCM_PD_SYS_SENSE
:
253 switch (s
->sse_version
) {
258 r
= s
->pdcm_pd_sys_sense
;
261 g_assert_not_reached();
264 case A_PDCM_PD_CPU0_SENSE
:
265 switch (s
->sse_version
) {
270 r
= s
->pdcm_pd_cpu0_sense
;
273 g_assert_not_reached();
276 case A_PDCM_PD_SRAM0_SENSE
:
277 switch (s
->sse_version
) {
281 r
= s
->pdcm_pd_sram0_sense
;
286 g_assert_not_reached();
289 case A_PDCM_PD_SRAM1_SENSE
:
290 switch (s
->sse_version
) {
294 r
= s
->pdcm_pd_sram1_sense
;
299 g_assert_not_reached();
302 case A_PDCM_PD_SRAM2_SENSE
:
303 switch (s
->sse_version
) {
307 r
= s
->pdcm_pd_sram2_sense
;
310 r
= s
->pdcm_pd_vmr0_sense
;
313 g_assert_not_reached();
316 case A_PDCM_PD_SRAM3_SENSE
:
317 switch (s
->sse_version
) {
321 r
= s
->pdcm_pd_sram3_sense
;
324 r
= s
->pdcm_pd_vmr1_sense
;
327 g_assert_not_reached();
330 case A_PID4
... A_CID3
:
331 r
= sysctl_id
[(offset
- A_PID4
) / 4];
336 qemu_log_mask(LOG_GUEST_ERROR
,
337 "IoTKit SysCtl read: read of WO offset %x\n",
343 qemu_log_mask(LOG_GUEST_ERROR
,
344 "IoTKit SysCtl read: bad offset %x\n", (int)offset
);
348 trace_iotkit_sysctl_read(offset
, r
, size
);
352 static void cpuwait_write(IoTKitSysCtl
*s
, uint32_t value
)
354 int num_cpus
= (s
->sse_version
== ARMSSE_SSE300
) ? 1 : 2;
357 for (i
= 0; i
< num_cpus
; i
++) {
358 uint32_t mask
= 1 << i
;
359 if ((s
->cpuwait
& mask
) && !(value
& mask
)) {
360 /* Powering up CPU 0 */
361 arm_set_cpu_on_and_reset(i
);
367 static void iotkit_sysctl_write(void *opaque
, hwaddr offset
,
368 uint64_t value
, unsigned size
)
370 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(opaque
);
372 trace_iotkit_sysctl_write(offset
, value
, size
);
375 * Most of the state here has to do with control of reset and
376 * similar kinds of power up -- for instance the guest can ask
377 * what the reason for the last reset was, or forbid reset for
378 * some causes (like the non-secure watchdog). Most of this is
379 * not relevant to QEMU, which doesn't really model anything other
380 * than a full power-on reset.
381 * We just model the registers as reads-as-written.
385 case A_RESET_SYNDROME
:
386 qemu_log_mask(LOG_UNIMP
,
387 "IoTKit SysCtl RESET_SYNDROME unimplemented\n");
388 s
->reset_syndrome
= value
;
391 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl RESET_MASK unimplemented\n");
392 s
->reset_mask
= value
;
396 * General retention register, which is only reset by a power-on
397 * reset. Technically this implementation is complete, since
398 * QEMU only supports power-on resets...
403 switch (s
->sse_version
) {
405 /* SSE300 has a LOCK bit which prevents further writes when set */
406 if (s
->initsvtor0
& R_INITSVTOR0_LOCK_MASK
) {
407 qemu_log_mask(LOG_GUEST_ERROR
,
408 "IoTKit INITSVTOR0 write when register locked\n");
411 s
->initsvtor0
= value
;
412 set_init_vtor(0, s
->initsvtor0
& R_INITSVTOR0_VTOR_MASK
);
416 s
->initsvtor0
= value
;
417 set_init_vtor(0, s
->initsvtor0
);
420 g_assert_not_reached();
424 switch (s
->sse_version
) {
427 cpuwait_write(s
, value
);
430 /* In SSE300 this is reserved (for INITSVTOR2) */
433 g_assert_not_reached();
437 switch (s
->sse_version
) {
440 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl WICCTRL unimplemented\n");
444 /* In SSE300 this offset is CPUWAIT */
445 cpuwait_write(s
, value
);
448 g_assert_not_reached();
453 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl SECDBGSET unimplemented\n");
454 s
->secure_debug
|= value
;
457 /* write-1-to-clear */
458 s
->secure_debug
&= ~value
;
461 /* One w/o bit to request a reset; all other bits reserved */
462 if (value
& R_SWRESET_SWRESETREQ_MASK
) {
463 qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET
);
467 switch (s
->sse_version
) {
472 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl SCSECCTRL unimplemented\n");
473 s
->scsecctrl
= value
;
476 g_assert_not_reached();
480 switch (s
->sse_version
) {
485 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl FCLK_DIV unimplemented\n");
489 g_assert_not_reached();
493 switch (s
->sse_version
) {
498 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl SYSCLK_DIV unimplemented\n");
499 s
->sysclk_div
= value
;
502 g_assert_not_reached();
506 switch (s
->sse_version
) {
511 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl CLOCK_FORCE unimplemented\n");
512 s
->clock_force
= value
;
515 g_assert_not_reached();
519 switch (s
->sse_version
) {
523 s
->initsvtor1
= value
;
524 set_init_vtor(1, s
->initsvtor1
);
529 g_assert_not_reached();
533 switch (s
->sse_version
) {
537 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl EWCTRL unimplemented\n");
541 /* In SSE300 this offset is is NMI_ENABLE */
542 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl NMI_ENABLE unimplemented\n");
543 s
->nmi_enable
= value
;
546 g_assert_not_reached();
550 switch (s
->sse_version
) {
555 if (!(s
->pwrctrl
& R_PWRCTRL_PPU_ACCESS_UNLOCK_MASK
)) {
556 qemu_log_mask(LOG_GUEST_ERROR
,
557 "IoTKit PWRCTRL write when register locked\n");
563 g_assert_not_reached();
566 case A_PDCM_PD_SYS_SENSE
:
567 switch (s
->sse_version
) {
572 qemu_log_mask(LOG_UNIMP
,
573 "IoTKit SysCtl PDCM_PD_SYS_SENSE unimplemented\n");
574 s
->pdcm_pd_sys_sense
= value
;
577 g_assert_not_reached();
580 case A_PDCM_PD_CPU0_SENSE
:
581 switch (s
->sse_version
) {
586 qemu_log_mask(LOG_UNIMP
,
587 "IoTKit SysCtl PDCM_PD_CPU0_SENSE unimplemented\n");
588 s
->pdcm_pd_cpu0_sense
= value
;
591 g_assert_not_reached();
594 case A_PDCM_PD_SRAM0_SENSE
:
595 switch (s
->sse_version
) {
599 qemu_log_mask(LOG_UNIMP
,
600 "IoTKit SysCtl PDCM_PD_SRAM0_SENSE unimplemented\n");
601 s
->pdcm_pd_sram0_sense
= value
;
606 g_assert_not_reached();
609 case A_PDCM_PD_SRAM1_SENSE
:
610 switch (s
->sse_version
) {
614 qemu_log_mask(LOG_UNIMP
,
615 "IoTKit SysCtl PDCM_PD_SRAM1_SENSE unimplemented\n");
616 s
->pdcm_pd_sram1_sense
= value
;
621 g_assert_not_reached();
624 case A_PDCM_PD_SRAM2_SENSE
:
625 switch (s
->sse_version
) {
629 qemu_log_mask(LOG_UNIMP
,
630 "IoTKit SysCtl PDCM_PD_SRAM2_SENSE unimplemented\n");
631 s
->pdcm_pd_sram2_sense
= value
;
634 qemu_log_mask(LOG_UNIMP
,
635 "IoTKit SysCtl PDCM_PD_VMR0_SENSE unimplemented\n");
636 s
->pdcm_pd_vmr0_sense
= value
;
639 g_assert_not_reached();
642 case A_PDCM_PD_SRAM3_SENSE
:
643 switch (s
->sse_version
) {
647 qemu_log_mask(LOG_UNIMP
,
648 "IoTKit SysCtl PDCM_PD_SRAM3_SENSE unimplemented\n");
649 s
->pdcm_pd_sram3_sense
= value
;
652 qemu_log_mask(LOG_UNIMP
,
653 "IoTKit SysCtl PDCM_PD_VMR1_SENSE unimplemented\n");
654 s
->pdcm_pd_vmr1_sense
= value
;
657 g_assert_not_reached();
661 /* In IoTKit this is BUSWAIT: reserved, R/O, zero */
662 switch (s
->sse_version
) {
666 qemu_log_mask(LOG_UNIMP
, "IoTKit SysCtl NMI_ENABLE unimplemented\n");
667 s
->nmi_enable
= value
;
670 /* In SSE300 this is reserved (for INITSVTOR3) */
673 g_assert_not_reached();
677 case A_PID4
... A_CID3
:
679 qemu_log_mask(LOG_GUEST_ERROR
,
680 "IoTKit SysCtl write: write of RO offset %x\n",
685 qemu_log_mask(LOG_GUEST_ERROR
,
686 "IoTKit SysCtl write: bad offset %x\n", (int)offset
);
691 static const MemoryRegionOps iotkit_sysctl_ops
= {
692 .read
= iotkit_sysctl_read
,
693 .write
= iotkit_sysctl_write
,
694 .endianness
= DEVICE_LITTLE_ENDIAN
,
695 /* byte/halfword accesses are just zero-padded on reads and writes */
696 .impl
.min_access_size
= 4,
697 .impl
.max_access_size
= 4,
698 .valid
.min_access_size
= 1,
699 .valid
.max_access_size
= 4,
702 static void iotkit_sysctl_reset(DeviceState
*dev
)
704 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(dev
);
706 trace_iotkit_sysctl_reset();
708 s
->reset_syndrome
= 1;
711 s
->initsvtor0
= s
->initsvtor0_rst
;
712 s
->initsvtor1
= s
->initsvtor1_rst
;
713 s
->cpuwait
= s
->cpuwait_rst
;
722 s
->pdcm_pd_sys_sense
= 0x7f;
723 s
->pdcm_pd_sram0_sense
= 0;
724 s
->pdcm_pd_sram1_sense
= 0;
725 s
->pdcm_pd_sram2_sense
= 0;
726 s
->pdcm_pd_sram3_sense
= 0;
727 s
->pdcm_pd_cpu0_sense
= 0;
728 s
->pdcm_pd_vmr0_sense
= 0;
729 s
->pdcm_pd_vmr1_sense
= 0;
732 static void iotkit_sysctl_init(Object
*obj
)
734 SysBusDevice
*sbd
= SYS_BUS_DEVICE(obj
);
735 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(obj
);
737 memory_region_init_io(&s
->iomem
, obj
, &iotkit_sysctl_ops
,
738 s
, "iotkit-sysctl", 0x1000);
739 sysbus_init_mmio(sbd
, &s
->iomem
);
742 static void iotkit_sysctl_realize(DeviceState
*dev
, Error
**errp
)
744 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(dev
);
746 if (!armsse_version_valid(s
->sse_version
)) {
747 error_setg(errp
, "invalid sse-version value %d", s
->sse_version
);
752 static bool sse300_needed(void *opaque
)
754 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(opaque
);
756 return s
->sse_version
== ARMSSE_SSE300
;
759 static const VMStateDescription iotkit_sysctl_sse300_vmstate
= {
760 .name
= "iotkit-sysctl/sse-300",
762 .minimum_version_id
= 1,
763 .needed
= sse300_needed
,
764 .fields
= (VMStateField
[]) {
765 VMSTATE_UINT32(pwrctrl
, IoTKitSysCtl
),
766 VMSTATE_UINT32(pdcm_pd_cpu0_sense
, IoTKitSysCtl
),
767 VMSTATE_UINT32(pdcm_pd_vmr0_sense
, IoTKitSysCtl
),
768 VMSTATE_UINT32(pdcm_pd_vmr1_sense
, IoTKitSysCtl
),
769 VMSTATE_END_OF_LIST()
773 static bool sse200_needed(void *opaque
)
775 IoTKitSysCtl
*s
= IOTKIT_SYSCTL(opaque
);
777 return s
->sse_version
!= ARMSSE_IOTKIT
;
780 static const VMStateDescription iotkit_sysctl_sse200_vmstate
= {
781 .name
= "iotkit-sysctl/sse-200",
783 .minimum_version_id
= 1,
784 .needed
= sse200_needed
,
785 .fields
= (VMStateField
[]) {
786 VMSTATE_UINT32(scsecctrl
, IoTKitSysCtl
),
787 VMSTATE_UINT32(fclk_div
, IoTKitSysCtl
),
788 VMSTATE_UINT32(sysclk_div
, IoTKitSysCtl
),
789 VMSTATE_UINT32(clock_force
, IoTKitSysCtl
),
790 VMSTATE_UINT32(initsvtor1
, IoTKitSysCtl
),
791 VMSTATE_UINT32(nmi_enable
, IoTKitSysCtl
),
792 VMSTATE_UINT32(pdcm_pd_sys_sense
, IoTKitSysCtl
),
793 VMSTATE_UINT32(pdcm_pd_sram0_sense
, IoTKitSysCtl
),
794 VMSTATE_UINT32(pdcm_pd_sram1_sense
, IoTKitSysCtl
),
795 VMSTATE_UINT32(pdcm_pd_sram2_sense
, IoTKitSysCtl
),
796 VMSTATE_UINT32(pdcm_pd_sram3_sense
, IoTKitSysCtl
),
797 VMSTATE_END_OF_LIST()
801 static const VMStateDescription iotkit_sysctl_vmstate
= {
802 .name
= "iotkit-sysctl",
804 .minimum_version_id
= 1,
805 .fields
= (VMStateField
[]) {
806 VMSTATE_UINT32(secure_debug
, IoTKitSysCtl
),
807 VMSTATE_UINT32(reset_syndrome
, IoTKitSysCtl
),
808 VMSTATE_UINT32(reset_mask
, IoTKitSysCtl
),
809 VMSTATE_UINT32(gretreg
, IoTKitSysCtl
),
810 VMSTATE_UINT32(initsvtor0
, IoTKitSysCtl
),
811 VMSTATE_UINT32(cpuwait
, IoTKitSysCtl
),
812 VMSTATE_UINT32(wicctrl
, IoTKitSysCtl
),
813 VMSTATE_END_OF_LIST()
815 .subsections
= (const VMStateDescription
*[]) {
816 &iotkit_sysctl_sse200_vmstate
,
817 &iotkit_sysctl_sse300_vmstate
,
822 static Property iotkit_sysctl_props
[] = {
823 DEFINE_PROP_UINT32("sse-version", IoTKitSysCtl
, sse_version
, 0),
824 DEFINE_PROP_UINT32("CPUWAIT_RST", IoTKitSysCtl
, cpuwait_rst
, 0),
825 DEFINE_PROP_UINT32("INITSVTOR0_RST", IoTKitSysCtl
, initsvtor0_rst
,
827 DEFINE_PROP_UINT32("INITSVTOR1_RST", IoTKitSysCtl
, initsvtor1_rst
,
829 DEFINE_PROP_END_OF_LIST()
832 static void iotkit_sysctl_class_init(ObjectClass
*klass
, void *data
)
834 DeviceClass
*dc
= DEVICE_CLASS(klass
);
836 dc
->vmsd
= &iotkit_sysctl_vmstate
;
837 dc
->reset
= iotkit_sysctl_reset
;
838 device_class_set_props(dc
, iotkit_sysctl_props
);
839 dc
->realize
= iotkit_sysctl_realize
;
842 static const TypeInfo iotkit_sysctl_info
= {
843 .name
= TYPE_IOTKIT_SYSCTL
,
844 .parent
= TYPE_SYS_BUS_DEVICE
,
845 .instance_size
= sizeof(IoTKitSysCtl
),
846 .instance_init
= iotkit_sysctl_init
,
847 .class_init
= iotkit_sysctl_class_init
,
850 static void iotkit_sysctl_register_types(void)
852 type_register_static(&iotkit_sysctl_info
);
855 type_init(iotkit_sysctl_register_types
);