]> Git Repo - qemu.git/blob - hw/misc/mips_cmgcr.c
4c93a1337c5eeac1e72659dda91b34d8737a465d
[qemu.git] / hw / misc / mips_cmgcr.c
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
7  * Authors: Sanjay Lal <[email protected]>
8  *
9  * Copyright (C) 2015 Imagination Technologies
10  */
11
12 #include "qemu/osdep.h"
13 #include "qapi/error.h"
14 #include "hw/hw.h"
15 #include "hw/sysbus.h"
16 #include "sysemu/sysemu.h"
17 #include "hw/misc/mips_cmgcr.h"
18
19 /* Read GCR registers */
20 static uint64_t gcr_read(void *opaque, hwaddr addr, unsigned size)
21 {
22     MIPSGCRState *gcr = (MIPSGCRState *) opaque;
23
24     switch (addr) {
25     /* Global Control Block Register */
26     case GCR_CONFIG_OFS:
27         /* Set PCORES to 0 */
28         return 0;
29     case GCR_BASE_OFS:
30         return gcr->gcr_base;
31     case GCR_REV_OFS:
32         return gcr->gcr_rev;
33     case GCR_L2_CONFIG_OFS:
34         /* L2 BYPASS */
35         return GCR_L2_CONFIG_BYPASS_MSK;
36         /* Core-Local and Core-Other Control Blocks */
37     case MIPS_CLCB_OFS + GCR_CL_CONFIG_OFS:
38     case MIPS_COCB_OFS + GCR_CL_CONFIG_OFS:
39         /* Set PVP to # of VPs - 1 */
40         return gcr->num_vps - 1;
41     case MIPS_CLCB_OFS + GCR_CL_OTHER_OFS:
42         return 0;
43     default:
44         qemu_log_mask(LOG_UNIMP, "Read %d bytes at GCR offset 0x%" HWADDR_PRIx
45                       "\n", size, addr);
46         return 0;
47     }
48     return 0;
49 }
50
51 /* Write GCR registers */
52 static void gcr_write(void *opaque, hwaddr addr, uint64_t data, unsigned size)
53 {
54     switch (addr) {
55     default:
56         qemu_log_mask(LOG_UNIMP, "Write %d bytes at GCR offset 0x%" HWADDR_PRIx
57                       " 0x%" PRIx64 "\n", size, addr, data);
58         break;
59     }
60 }
61
62 static const MemoryRegionOps gcr_ops = {
63     .read = gcr_read,
64     .write = gcr_write,
65     .endianness = DEVICE_NATIVE_ENDIAN,
66     .impl = {
67         .max_access_size = 8,
68     },
69 };
70
71 static void mips_gcr_init(Object *obj)
72 {
73     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
74     MIPSGCRState *s = MIPS_GCR(obj);
75
76     memory_region_init_io(&s->iomem, OBJECT(s), &gcr_ops, s,
77                           "mips-gcr", GCR_ADDRSPACE_SZ);
78     sysbus_init_mmio(sbd, &s->iomem);
79 }
80
81 static Property mips_gcr_properties[] = {
82     DEFINE_PROP_INT32("num-vp", MIPSGCRState, num_vps, 1),
83     DEFINE_PROP_INT32("gcr-rev", MIPSGCRState, gcr_rev, 0x800),
84     DEFINE_PROP_UINT64("gcr-base", MIPSGCRState, gcr_base, GCR_BASE_ADDR),
85     DEFINE_PROP_END_OF_LIST(),
86 };
87
88 static void mips_gcr_class_init(ObjectClass *klass, void *data)
89 {
90     DeviceClass *dc = DEVICE_CLASS(klass);
91     dc->props = mips_gcr_properties;
92 }
93
94 static const TypeInfo mips_gcr_info = {
95     .name          = TYPE_MIPS_GCR,
96     .parent        = TYPE_SYS_BUS_DEVICE,
97     .instance_size = sizeof(MIPSGCRState),
98     .instance_init = mips_gcr_init,
99     .class_init    = mips_gcr_class_init,
100 };
101
102 static void mips_gcr_register_types(void)
103 {
104     type_register_static(&mips_gcr_info);
105 }
106
107 type_init(mips_gcr_register_types)
This page took 0.021208 seconds and 2 git commands to generate.