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
6 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
9 * Copyright (C) 2015 Imagination Technologies
12 #include "qemu/osdep.h"
13 #include "qapi/error.h"
15 #include "hw/sysbus.h"
16 #include "sysemu/sysemu.h"
17 #include "hw/misc/mips_cmgcr.h"
19 /* Read GCR registers */
20 static uint64_t gcr_read(void *opaque, hwaddr addr, unsigned size)
22 MIPSGCRState *gcr = (MIPSGCRState *) opaque;
25 /* Global Control Block Register */
33 case GCR_L2_CONFIG_OFS:
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:
44 qemu_log_mask(LOG_UNIMP, "Read %d bytes at GCR offset 0x%" HWADDR_PRIx
51 /* Write GCR registers */
52 static void gcr_write(void *opaque, hwaddr addr, uint64_t data, unsigned size)
56 qemu_log_mask(LOG_UNIMP, "Write %d bytes at GCR offset 0x%" HWADDR_PRIx
57 " 0x%" PRIx64 "\n", size, addr, data);
62 static const MemoryRegionOps gcr_ops = {
65 .endianness = DEVICE_NATIVE_ENDIAN,
71 static void mips_gcr_init(Object *obj)
73 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
74 MIPSGCRState *s = MIPS_GCR(obj);
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);
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(),
88 static void mips_gcr_class_init(ObjectClass *klass, void *data)
90 DeviceClass *dc = DEVICE_CLASS(klass);
91 dc->props = mips_gcr_properties;
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,
102 static void mips_gcr_register_types(void)
104 type_register_static(&mips_gcr_info);
107 type_init(mips_gcr_register_types)