static uint64_t iotkit_sysctl_read()

in hw/misc/iotkit-sysctl.c [106:367]


static uint64_t iotkit_sysctl_read(void *opaque, hwaddr offset,
                                    unsigned size)
{
    IoTKitSysCtl *s = IOTKIT_SYSCTL(opaque);
    uint64_t r;

    switch (offset) {
    case A_SECDBGSTAT:
        r = s->secure_debug;
        break;
    case A_SCSECCTRL:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = s->scsecctrl;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_FCLK_DIV:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = s->fclk_div;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_SYSCLK_DIV:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = s->sysclk_div;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_CLOCK_FORCE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = s->clock_force;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_RESET_SYNDROME:
        r = s->reset_syndrome;
        break;
    case A_RESET_MASK:
        r = s->reset_mask;
        break;
    case A_GRETREG:
        r = s->gretreg;
        break;
    case A_INITSVTOR0:
        r = s->initsvtor0;
        break;
    case A_INITSVTOR1:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->initsvtor1;
            break;
        case ARMSSE_SSE300:
            goto bad_offset;
        default:
            g_assert_not_reached();
        }
        break;
    case A_CPUWAIT:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
        case ARMSSE_SSE200:
            r = s->cpuwait;
            break;
        case ARMSSE_SSE300:
            /* In SSE300 this is reserved (for INITSVTOR2) */
            goto bad_offset;
        default:
            g_assert_not_reached();
        }
        break;
    case A_NMI_ENABLE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            /* In IoTKit this is named BUSWAIT but marked reserved, R/O, zero */
            r = 0;
            break;
        case ARMSSE_SSE200:
            r = s->nmi_enable;
            break;
        case ARMSSE_SSE300:
            /* In SSE300 this is reserved (for INITSVTOR3) */
            goto bad_offset;
        default:
            g_assert_not_reached();
        }
        break;
    case A_WICCTRL:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
        case ARMSSE_SSE200:
            r = s->wicctrl;
            break;
        case ARMSSE_SSE300:
            /* In SSE300 this offset is CPUWAIT */
            r = s->cpuwait;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_EWCTRL:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->ewctrl;
            break;
        case ARMSSE_SSE300:
            /* In SSE300 this offset is is NMI_ENABLE */
            r = s->nmi_enable;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PWRCTRL:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
        case ARMSSE_SSE200:
            goto bad_offset;
        case ARMSSE_SSE300:
            r = s->pwrctrl;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_SYS_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = s->pdcm_pd_sys_sense;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_CPU0_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
        case ARMSSE_SSE200:
            goto bad_offset;
        case ARMSSE_SSE300:
            r = s->pdcm_pd_cpu0_sense;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_SRAM0_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->pdcm_pd_sram0_sense;
            break;
        case ARMSSE_SSE300:
            goto bad_offset;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_SRAM1_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->pdcm_pd_sram1_sense;
            break;
        case ARMSSE_SSE300:
            goto bad_offset;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_SRAM2_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->pdcm_pd_sram2_sense;
            break;
        case ARMSSE_SSE300:
            r = s->pdcm_pd_vmr0_sense;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PDCM_PD_SRAM3_SENSE:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            goto bad_offset;
        case ARMSSE_SSE200:
            r = s->pdcm_pd_sram3_sense;
            break;
        case ARMSSE_SSE300:
            r = s->pdcm_pd_vmr1_sense;
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_PID4 ... A_CID3:
        switch (s->sse_version) {
        case ARMSSE_IOTKIT:
            r = iotkit_sysctl_id[(offset - A_PID4) / 4];
            break;
        case ARMSSE_SSE200:
        case ARMSSE_SSE300:
            r = sse200_sysctl_id[(offset - A_PID4) / 4];
            break;
        default:
            g_assert_not_reached();
        }
        break;
    case A_SECDBGSET:
    case A_SECDBGCLR:
    case A_SWRESET:
        qemu_log_mask(LOG_GUEST_ERROR,
                      "IoTKit SysCtl read: read of WO offset %x\n",
                      (int)offset);
        r = 0;
        break;
    default:
    bad_offset:
        qemu_log_mask(LOG_GUEST_ERROR,
                      "IoTKit SysCtl read: bad offset %x\n", (int)offset);
        r = 0;
        break;
    }
    trace_iotkit_sysctl_read(offset, r, size);
    return r;
}