qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

iotkit-sysctl.c (25540B)


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