Annotation of qemu/hw/mpc8544_guts.c, revision 1.1.1.2

1.1       root        1: /*
                      2:  * QEMU PowerPC MPC8544 global util pseudo-device
                      3:  *
                      4:  * Copyright (C) 2011 Freescale Semiconductor, Inc. All rights reserved.
                      5:  *
                      6:  * Author: Alexander Graf, <[email protected]>
                      7:  *
                      8:  * This is free software; you can redistribute it and/or modify
                      9:  * it under the terms of  the GNU General  Public License as published by
                     10:  * the Free Software Foundation;  either version 2 of the  License, or
                     11:  * (at your option) any later version.
                     12:  *
                     13:  * *****************************************************************
                     14:  *
                     15:  * The documentation for this device is noted in the MPC8544 documentation,
                     16:  * file name "MPC8544ERM.pdf". You can easily find it on the web.
                     17:  *
                     18:  */
                     19: 
                     20: #include "hw.h"
                     21: #include "sysemu.h"
                     22: #include "sysbus.h"
                     23: 
                     24: #define MPC8544_GUTS_MMIO_SIZE        0x1000
                     25: #define MPC8544_GUTS_RSTCR_RESET      0x02
                     26: 
                     27: #define MPC8544_GUTS_ADDR_PORPLLSR    0x00
                     28: #define MPC8544_GUTS_ADDR_PORBMSR     0x04
                     29: #define MPC8544_GUTS_ADDR_PORIMPSCR   0x08
                     30: #define MPC8544_GUTS_ADDR_PORDEVSR    0x0C
                     31: #define MPC8544_GUTS_ADDR_PORDBGMSR   0x10
                     32: #define MPC8544_GUTS_ADDR_PORDEVSR2   0x14
                     33: #define MPC8544_GUTS_ADDR_GPPORCR     0x20
                     34: #define MPC8544_GUTS_ADDR_GPIOCR      0x30
                     35: #define MPC8544_GUTS_ADDR_GPOUTDR     0x40
                     36: #define MPC8544_GUTS_ADDR_GPINDR      0x50
                     37: #define MPC8544_GUTS_ADDR_PMUXCR      0x60
                     38: #define MPC8544_GUTS_ADDR_DEVDISR     0x70
                     39: #define MPC8544_GUTS_ADDR_POWMGTCSR   0x80
                     40: #define MPC8544_GUTS_ADDR_MCPSUMR     0x90
                     41: #define MPC8544_GUTS_ADDR_RSTRSCR     0x94
                     42: #define MPC8544_GUTS_ADDR_PVR         0xA0
                     43: #define MPC8544_GUTS_ADDR_SVR         0xA4
                     44: #define MPC8544_GUTS_ADDR_RSTCR       0xB0
                     45: #define MPC8544_GUTS_ADDR_IOVSELSR    0xC0
                     46: #define MPC8544_GUTS_ADDR_DDRCSR      0xB20
                     47: #define MPC8544_GUTS_ADDR_DDRCDR      0xB24
                     48: #define MPC8544_GUTS_ADDR_DDRCLKDR    0xB28
                     49: #define MPC8544_GUTS_ADDR_CLKOCR      0xE00
                     50: #define MPC8544_GUTS_ADDR_SRDS1CR1    0xF04
                     51: #define MPC8544_GUTS_ADDR_SRDS2CR1    0xF10
                     52: #define MPC8544_GUTS_ADDR_SRDS2CR3    0xF18
                     53: 
                     54: struct GutsState {
                     55:     SysBusDevice busdev;
1.1.1.2 ! root       56:     MemoryRegion iomem;
1.1       root       57: };
                     58: 
                     59: typedef struct GutsState GutsState;
                     60: 
1.1.1.2 ! root       61: static uint64_t mpc8544_guts_read(void *opaque, target_phys_addr_t addr,
        !            62:                                   unsigned size)
1.1       root       63: {
                     64:     uint32_t value = 0;
1.1.1.2 ! root       65:     CPUPPCState *env = cpu_single_env;
1.1       root       66: 
                     67:     addr &= MPC8544_GUTS_MMIO_SIZE - 1;
                     68:     switch (addr) {
                     69:     case MPC8544_GUTS_ADDR_PVR:
                     70:         value = env->spr[SPR_PVR];
                     71:         break;
                     72:     case MPC8544_GUTS_ADDR_SVR:
                     73:         value = env->spr[SPR_E500_SVR];
                     74:         break;
                     75:     default:
                     76:         fprintf(stderr, "guts: Unknown register read: %x\n", (int)addr);
                     77:         break;
                     78:     }
                     79: 
                     80:     return value;
                     81: }
                     82: 
1.1.1.2 ! root       83: static void mpc8544_guts_write(void *opaque, target_phys_addr_t addr,
        !            84:                                uint64_t value, unsigned size)
1.1       root       85: {
                     86:     addr &= MPC8544_GUTS_MMIO_SIZE - 1;
                     87: 
                     88:     switch (addr) {
                     89:     case MPC8544_GUTS_ADDR_RSTCR:
                     90:         if (value & MPC8544_GUTS_RSTCR_RESET) {
                     91:             qemu_system_reset_request();
                     92:         }
                     93:         break;
                     94:     default:
                     95:         fprintf(stderr, "guts: Unknown register write: %x = %x\n",
1.1.1.2 ! root       96:                 (int)addr, (unsigned)value);
1.1       root       97:         break;
                     98:     }
                     99: }
                    100: 
1.1.1.2 ! root      101: static const MemoryRegionOps mpc8544_guts_ops = {
        !           102:     .read = mpc8544_guts_read,
        !           103:     .write = mpc8544_guts_write,
        !           104:     .endianness = DEVICE_BIG_ENDIAN,
        !           105:     .valid = {
        !           106:         .min_access_size = 4,
        !           107:         .max_access_size = 4,
        !           108:     },
1.1       root      109: };
                    110: 
                    111: static int mpc8544_guts_initfn(SysBusDevice *dev)
                    112: {
                    113:     GutsState *s;
                    114: 
                    115:     s = FROM_SYSBUS(GutsState, sysbus_from_qdev(dev));
                    116: 
1.1.1.2 ! root      117:     memory_region_init_io(&s->iomem, &mpc8544_guts_ops, s,
        !           118:                           "mpc6544.guts", MPC8544_GUTS_MMIO_SIZE);
        !           119:     sysbus_init_mmio(dev, &s->iomem);
1.1       root      120: 
                    121:     return 0;
                    122: }
                    123: 
1.1.1.2 ! root      124: static void mpc8544_guts_class_init(ObjectClass *klass, void *data)
        !           125: {
        !           126:     SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
        !           127: 
        !           128:     k->init = mpc8544_guts_initfn;
        !           129: }
        !           130: 
        !           131: static TypeInfo mpc8544_guts_info = {
        !           132:     .name          = "mpc8544-guts",
        !           133:     .parent        = TYPE_SYS_BUS_DEVICE,
        !           134:     .instance_size = sizeof(GutsState),
        !           135:     .class_init    = mpc8544_guts_class_init,
1.1       root      136: };
                    137: 
1.1.1.2 ! root      138: static void mpc8544_guts_register_types(void)
1.1       root      139: {
1.1.1.2 ! root      140:     type_register_static(&mpc8544_guts_info);
1.1       root      141: }
1.1.1.2 ! root      142: 
        !           143: type_init(mpc8544_guts_register_types)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.