1dcdf98a9SBALATON Zoltan /*
2dcdf98a9SBALATON Zoltan * Marvell Discovery II MV64361 System Controller for
3dcdf98a9SBALATON Zoltan * QEMU PowerPC CHRP (Genesi/bPlan Pegasos II) hardware System Emulator
4dcdf98a9SBALATON Zoltan *
5dcdf98a9SBALATON Zoltan * Copyright (c) 2018-2020 BALATON Zoltan
6dcdf98a9SBALATON Zoltan *
7dcdf98a9SBALATON Zoltan * This work is licensed under the GNU GPL license version 2 or later.
8dcdf98a9SBALATON Zoltan *
9dcdf98a9SBALATON Zoltan */
10dcdf98a9SBALATON Zoltan
11dcdf98a9SBALATON Zoltan #include "qemu/osdep.h"
12dcdf98a9SBALATON Zoltan #include "qemu/units.h"
13dcdf98a9SBALATON Zoltan #include "qapi/error.h"
14dcdf98a9SBALATON Zoltan #include "hw/sysbus.h"
15edf5ca5dSMarkus Armbruster #include "hw/pci/pci_device.h"
16dcdf98a9SBALATON Zoltan #include "hw/pci/pci_host.h"
17dcdf98a9SBALATON Zoltan #include "hw/irq.h"
18dcdf98a9SBALATON Zoltan #include "hw/intc/i8259.h"
19dcdf98a9SBALATON Zoltan #include "hw/qdev-properties.h"
20dcdf98a9SBALATON Zoltan #include "exec/address-spaces.h"
21dcdf98a9SBALATON Zoltan #include "qemu/log.h"
22dcdf98a9SBALATON Zoltan #include "qemu/error-report.h"
23dcdf98a9SBALATON Zoltan #include "trace.h"
24dcdf98a9SBALATON Zoltan #include "hw/pci-host/mv64361.h"
25dcdf98a9SBALATON Zoltan #include "mv643xx.h"
26dcdf98a9SBALATON Zoltan
27dcdf98a9SBALATON Zoltan #define TYPE_MV64361_PCI_BRIDGE "mv64361-pcibridge"
28dcdf98a9SBALATON Zoltan
mv64361_pcibridge_class_init(ObjectClass * klass,void * data)29dcdf98a9SBALATON Zoltan static void mv64361_pcibridge_class_init(ObjectClass *klass, void *data)
30dcdf98a9SBALATON Zoltan {
31dcdf98a9SBALATON Zoltan DeviceClass *dc = DEVICE_CLASS(klass);
32dcdf98a9SBALATON Zoltan PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
33dcdf98a9SBALATON Zoltan
34dcdf98a9SBALATON Zoltan k->vendor_id = PCI_VENDOR_ID_MARVELL;
35dcdf98a9SBALATON Zoltan k->device_id = PCI_DEVICE_ID_MARVELL_MV6436X;
36dcdf98a9SBALATON Zoltan k->class_id = PCI_CLASS_BRIDGE_HOST;
37dcdf98a9SBALATON Zoltan /*
38dcdf98a9SBALATON Zoltan * PCI-facing part of the host bridge,
39dcdf98a9SBALATON Zoltan * not usable without the host-facing part
40dcdf98a9SBALATON Zoltan */
41dcdf98a9SBALATON Zoltan dc->user_creatable = false;
42dcdf98a9SBALATON Zoltan }
43dcdf98a9SBALATON Zoltan
44dcdf98a9SBALATON Zoltan static const TypeInfo mv64361_pcibridge_info = {
45dcdf98a9SBALATON Zoltan .name = TYPE_MV64361_PCI_BRIDGE,
46dcdf98a9SBALATON Zoltan .parent = TYPE_PCI_DEVICE,
47dcdf98a9SBALATON Zoltan .instance_size = sizeof(PCIDevice),
48dcdf98a9SBALATON Zoltan .class_init = mv64361_pcibridge_class_init,
49dcdf98a9SBALATON Zoltan .interfaces = (InterfaceInfo[]) {
50dcdf98a9SBALATON Zoltan { INTERFACE_CONVENTIONAL_PCI_DEVICE },
51dcdf98a9SBALATON Zoltan { },
52dcdf98a9SBALATON Zoltan },
53dcdf98a9SBALATON Zoltan };
54dcdf98a9SBALATON Zoltan
55dcdf98a9SBALATON Zoltan
56dcdf98a9SBALATON Zoltan #define TYPE_MV64361_PCI "mv64361-pcihost"
57dcdf98a9SBALATON Zoltan OBJECT_DECLARE_SIMPLE_TYPE(MV64361PCIState, MV64361_PCI)
58dcdf98a9SBALATON Zoltan
59dcdf98a9SBALATON Zoltan struct MV64361PCIState {
60dcdf98a9SBALATON Zoltan PCIHostState parent_obj;
61dcdf98a9SBALATON Zoltan
62dcdf98a9SBALATON Zoltan uint8_t index;
63dcdf98a9SBALATON Zoltan MemoryRegion io;
64dcdf98a9SBALATON Zoltan MemoryRegion mem;
65dcdf98a9SBALATON Zoltan qemu_irq irq[PCI_NUM_PINS];
66dcdf98a9SBALATON Zoltan
67dcdf98a9SBALATON Zoltan uint32_t io_base;
68dcdf98a9SBALATON Zoltan uint32_t io_size;
69dcdf98a9SBALATON Zoltan uint32_t mem_base[4];
70dcdf98a9SBALATON Zoltan uint32_t mem_size[4];
71dcdf98a9SBALATON Zoltan uint64_t remap[5];
72dcdf98a9SBALATON Zoltan };
73dcdf98a9SBALATON Zoltan
mv64361_pcihost_set_irq(void * opaque,int n,int level)74dcdf98a9SBALATON Zoltan static void mv64361_pcihost_set_irq(void *opaque, int n, int level)
75dcdf98a9SBALATON Zoltan {
76dcdf98a9SBALATON Zoltan MV64361PCIState *s = opaque;
77dcdf98a9SBALATON Zoltan qemu_set_irq(s->irq[n], level);
78dcdf98a9SBALATON Zoltan }
79dcdf98a9SBALATON Zoltan
mv64361_pcihost_realize(DeviceState * dev,Error ** errp)80dcdf98a9SBALATON Zoltan static void mv64361_pcihost_realize(DeviceState *dev, Error **errp)
81dcdf98a9SBALATON Zoltan {
82dcdf98a9SBALATON Zoltan MV64361PCIState *s = MV64361_PCI(dev);
83dcdf98a9SBALATON Zoltan PCIHostState *h = PCI_HOST_BRIDGE(dev);
84dcdf98a9SBALATON Zoltan char *name;
85dcdf98a9SBALATON Zoltan
86dcdf98a9SBALATON Zoltan name = g_strdup_printf("pci%d-io", s->index);
87dcdf98a9SBALATON Zoltan memory_region_init(&s->io, OBJECT(dev), name, 0x10000);
88dcdf98a9SBALATON Zoltan g_free(name);
89dcdf98a9SBALATON Zoltan name = g_strdup_printf("pci%d-mem", s->index);
90dcdf98a9SBALATON Zoltan memory_region_init(&s->mem, OBJECT(dev), name, 1ULL << 32);
91dcdf98a9SBALATON Zoltan g_free(name);
92dcdf98a9SBALATON Zoltan name = g_strdup_printf("pci.%d", s->index);
93dcdf98a9SBALATON Zoltan h->bus = pci_register_root_bus(dev, name, mv64361_pcihost_set_irq,
943f736ca9SBernhard Beschow pci_swizzle_map_irq_fn, dev,
95dcdf98a9SBALATON Zoltan &s->mem, &s->io, 0, 4, TYPE_PCI_BUS);
96dcdf98a9SBALATON Zoltan g_free(name);
97dcdf98a9SBALATON Zoltan pci_create_simple(h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
98*0805136aSBALATON Zoltan qdev_init_gpio_out(dev, s->irq, ARRAY_SIZE(s->irq));
99dcdf98a9SBALATON Zoltan }
100dcdf98a9SBALATON Zoltan
101dcdf98a9SBALATON Zoltan static Property mv64361_pcihost_props[] = {
102dcdf98a9SBALATON Zoltan DEFINE_PROP_UINT8("index", MV64361PCIState, index, 0),
103dcdf98a9SBALATON Zoltan DEFINE_PROP_END_OF_LIST()
104dcdf98a9SBALATON Zoltan };
105dcdf98a9SBALATON Zoltan
mv64361_pcihost_class_init(ObjectClass * klass,void * data)106dcdf98a9SBALATON Zoltan static void mv64361_pcihost_class_init(ObjectClass *klass, void *data)
107dcdf98a9SBALATON Zoltan {
108dcdf98a9SBALATON Zoltan DeviceClass *dc = DEVICE_CLASS(klass);
109dcdf98a9SBALATON Zoltan
110dcdf98a9SBALATON Zoltan dc->realize = mv64361_pcihost_realize;
111dcdf98a9SBALATON Zoltan device_class_set_props(dc, mv64361_pcihost_props);
112dcdf98a9SBALATON Zoltan set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
113dcdf98a9SBALATON Zoltan }
114dcdf98a9SBALATON Zoltan
115dcdf98a9SBALATON Zoltan static const TypeInfo mv64361_pcihost_info = {
116dcdf98a9SBALATON Zoltan .name = TYPE_MV64361_PCI,
117dcdf98a9SBALATON Zoltan .parent = TYPE_PCI_HOST_BRIDGE,
118dcdf98a9SBALATON Zoltan .instance_size = sizeof(MV64361PCIState),
119dcdf98a9SBALATON Zoltan .class_init = mv64361_pcihost_class_init,
120dcdf98a9SBALATON Zoltan };
121dcdf98a9SBALATON Zoltan
mv64361_pci_register_types(void)122dcdf98a9SBALATON Zoltan static void mv64361_pci_register_types(void)
123dcdf98a9SBALATON Zoltan {
124dcdf98a9SBALATON Zoltan type_register_static(&mv64361_pcihost_info);
125dcdf98a9SBALATON Zoltan type_register_static(&mv64361_pcibridge_info);
126dcdf98a9SBALATON Zoltan }
127dcdf98a9SBALATON Zoltan
128dcdf98a9SBALATON Zoltan type_init(mv64361_pci_register_types)
129dcdf98a9SBALATON Zoltan
130dcdf98a9SBALATON Zoltan
131dcdf98a9SBALATON Zoltan OBJECT_DECLARE_SIMPLE_TYPE(MV64361State, MV64361)
132dcdf98a9SBALATON Zoltan
133dcdf98a9SBALATON Zoltan struct MV64361State {
134dcdf98a9SBALATON Zoltan SysBusDevice parent_obj;
135dcdf98a9SBALATON Zoltan
136dcdf98a9SBALATON Zoltan MemoryRegion regs;
137dcdf98a9SBALATON Zoltan MV64361PCIState pci[2];
138dcdf98a9SBALATON Zoltan MemoryRegion cpu_win[19];
139dcdf98a9SBALATON Zoltan qemu_irq cpu_irq;
140dcdf98a9SBALATON Zoltan
141dcdf98a9SBALATON Zoltan /* registers state */
142dcdf98a9SBALATON Zoltan uint32_t cpu_conf;
143dcdf98a9SBALATON Zoltan uint32_t regs_base;
144dcdf98a9SBALATON Zoltan uint32_t base_addr_enable;
145dcdf98a9SBALATON Zoltan uint64_t main_int_cr;
146dcdf98a9SBALATON Zoltan uint64_t cpu0_int_mask;
147dcdf98a9SBALATON Zoltan uint32_t gpp_io;
148dcdf98a9SBALATON Zoltan uint32_t gpp_level;
149dcdf98a9SBALATON Zoltan uint32_t gpp_value;
150dcdf98a9SBALATON Zoltan uint32_t gpp_int_cr;
151dcdf98a9SBALATON Zoltan uint32_t gpp_int_mask;
152dcdf98a9SBALATON Zoltan bool gpp_int_level;
153dcdf98a9SBALATON Zoltan };
154dcdf98a9SBALATON Zoltan
155dcdf98a9SBALATON Zoltan enum mv64361_irq_cause {
156dcdf98a9SBALATON Zoltan MV64361_IRQ_DEVERR = 1,
157dcdf98a9SBALATON Zoltan MV64361_IRQ_DMAERR = 2,
158dcdf98a9SBALATON Zoltan MV64361_IRQ_CPUERR = 3,
159dcdf98a9SBALATON Zoltan MV64361_IRQ_IDMA0 = 4,
160dcdf98a9SBALATON Zoltan MV64361_IRQ_IDMA1 = 5,
161dcdf98a9SBALATON Zoltan MV64361_IRQ_IDMA2 = 6,
162dcdf98a9SBALATON Zoltan MV64361_IRQ_IDMA3 = 7,
163dcdf98a9SBALATON Zoltan MV64361_IRQ_TIMER0 = 8,
164dcdf98a9SBALATON Zoltan MV64361_IRQ_TIMER1 = 9,
165dcdf98a9SBALATON Zoltan MV64361_IRQ_TIMER2 = 10,
166dcdf98a9SBALATON Zoltan MV64361_IRQ_TIMER3 = 11,
167dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI0 = 12,
168dcdf98a9SBALATON Zoltan MV64361_IRQ_SRAMERR = 13,
169dcdf98a9SBALATON Zoltan MV64361_IRQ_GBEERR = 14,
170dcdf98a9SBALATON Zoltan MV64361_IRQ_CERR = 15,
171dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI1 = 16,
172dcdf98a9SBALATON Zoltan MV64361_IRQ_DRAMERR = 17,
173dcdf98a9SBALATON Zoltan MV64361_IRQ_WDNMI = 18,
174dcdf98a9SBALATON Zoltan MV64361_IRQ_WDE = 19,
175dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI0IN = 20,
176dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI0OUT = 21,
177dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI1IN = 22,
178dcdf98a9SBALATON Zoltan MV64361_IRQ_PCI1OUT = 23,
179dcdf98a9SBALATON Zoltan MV64361_IRQ_P1_GPP0_7 = 24,
180dcdf98a9SBALATON Zoltan MV64361_IRQ_P1_GPP8_15 = 25,
181dcdf98a9SBALATON Zoltan MV64361_IRQ_P1_GPP16_23 = 26,
182dcdf98a9SBALATON Zoltan MV64361_IRQ_P1_GPP24_31 = 27,
183dcdf98a9SBALATON Zoltan MV64361_IRQ_P1_CPU_DB = 28,
184dcdf98a9SBALATON Zoltan /* 29-31: reserved */
185dcdf98a9SBALATON Zoltan MV64361_IRQ_GBE0 = 32,
186dcdf98a9SBALATON Zoltan MV64361_IRQ_GBE1 = 33,
187dcdf98a9SBALATON Zoltan MV64361_IRQ_GBE2 = 34,
188dcdf98a9SBALATON Zoltan /* 35: reserved */
189dcdf98a9SBALATON Zoltan MV64361_IRQ_SDMA0 = 36,
190dcdf98a9SBALATON Zoltan MV64361_IRQ_TWSI = 37,
191dcdf98a9SBALATON Zoltan MV64361_IRQ_SDMA1 = 38,
192dcdf98a9SBALATON Zoltan MV64361_IRQ_BRG = 39,
193dcdf98a9SBALATON Zoltan MV64361_IRQ_MPSC0 = 40,
194dcdf98a9SBALATON Zoltan MV64361_IRQ_MPSC1 = 41,
195dcdf98a9SBALATON Zoltan MV64361_IRQ_G0RX = 42,
196dcdf98a9SBALATON Zoltan MV64361_IRQ_G0TX = 43,
197dcdf98a9SBALATON Zoltan MV64361_IRQ_G0MISC = 44,
198dcdf98a9SBALATON Zoltan MV64361_IRQ_G1RX = 45,
199dcdf98a9SBALATON Zoltan MV64361_IRQ_G1TX = 46,
200dcdf98a9SBALATON Zoltan MV64361_IRQ_G1MISC = 47,
201dcdf98a9SBALATON Zoltan MV64361_IRQ_G2RX = 48,
202dcdf98a9SBALATON Zoltan MV64361_IRQ_G2TX = 49,
203dcdf98a9SBALATON Zoltan MV64361_IRQ_G2MISC = 50,
204dcdf98a9SBALATON Zoltan /* 51-55: reserved */
205dcdf98a9SBALATON Zoltan MV64361_IRQ_P0_GPP0_7 = 56,
206dcdf98a9SBALATON Zoltan MV64361_IRQ_P0_GPP8_15 = 57,
207dcdf98a9SBALATON Zoltan MV64361_IRQ_P0_GPP16_23 = 58,
208dcdf98a9SBALATON Zoltan MV64361_IRQ_P0_GPP24_31 = 59,
209dcdf98a9SBALATON Zoltan MV64361_IRQ_P0_CPU_DB = 60,
210dcdf98a9SBALATON Zoltan /* 61-63: reserved */
211dcdf98a9SBALATON Zoltan };
212dcdf98a9SBALATON Zoltan
mv64361_get_pci_bus(DeviceState * dev,int n)213dcdf98a9SBALATON Zoltan PCIBus *mv64361_get_pci_bus(DeviceState *dev, int n)
214dcdf98a9SBALATON Zoltan {
215dcdf98a9SBALATON Zoltan MV64361State *mv = MV64361(dev);
216dcdf98a9SBALATON Zoltan return PCI_HOST_BRIDGE(&mv->pci[n])->bus;
217dcdf98a9SBALATON Zoltan }
218dcdf98a9SBALATON Zoltan
unmap_region(MemoryRegion * mr)219dcdf98a9SBALATON Zoltan static void unmap_region(MemoryRegion *mr)
220dcdf98a9SBALATON Zoltan {
221dcdf98a9SBALATON Zoltan if (memory_region_is_mapped(mr)) {
222dcdf98a9SBALATON Zoltan memory_region_del_subregion(get_system_memory(), mr);
223dcdf98a9SBALATON Zoltan object_unparent(OBJECT(mr));
224dcdf98a9SBALATON Zoltan }
225dcdf98a9SBALATON Zoltan }
226dcdf98a9SBALATON Zoltan
map_pci_region(MemoryRegion * mr,MemoryRegion * parent,struct Object * owner,const char * name,hwaddr poffs,uint64_t size,hwaddr moffs)227dcdf98a9SBALATON Zoltan static void map_pci_region(MemoryRegion *mr, MemoryRegion *parent,
228dcdf98a9SBALATON Zoltan struct Object *owner, const char *name,
229dcdf98a9SBALATON Zoltan hwaddr poffs, uint64_t size, hwaddr moffs)
230dcdf98a9SBALATON Zoltan {
231dcdf98a9SBALATON Zoltan memory_region_init_alias(mr, owner, name, parent, poffs, size);
232dcdf98a9SBALATON Zoltan memory_region_add_subregion(get_system_memory(), moffs, mr);
233dcdf98a9SBALATON Zoltan trace_mv64361_region_map(name, poffs, size, moffs);
234dcdf98a9SBALATON Zoltan }
235dcdf98a9SBALATON Zoltan
set_mem_windows(MV64361State * s,uint32_t val)236dcdf98a9SBALATON Zoltan static void set_mem_windows(MV64361State *s, uint32_t val)
237dcdf98a9SBALATON Zoltan {
238dcdf98a9SBALATON Zoltan MV64361PCIState *p;
239dcdf98a9SBALATON Zoltan MemoryRegion *mr;
240dcdf98a9SBALATON Zoltan uint32_t mask;
241dcdf98a9SBALATON Zoltan int i;
242dcdf98a9SBALATON Zoltan
243dcdf98a9SBALATON Zoltan val &= 0x1fffff;
244dcdf98a9SBALATON Zoltan for (mask = 1, i = 0; i < 21; i++, mask <<= 1) {
245dcdf98a9SBALATON Zoltan if ((val & mask) != (s->base_addr_enable & mask)) {
246dcdf98a9SBALATON Zoltan trace_mv64361_region_enable(!(val & mask) ? "enable" : "disable", i);
247dcdf98a9SBALATON Zoltan /*
248dcdf98a9SBALATON Zoltan * 0-3 are SDRAM chip selects but we map all RAM directly
249dcdf98a9SBALATON Zoltan * 4-7 are device chip selects (not sure what those are)
250dcdf98a9SBALATON Zoltan * 8 is Boot device (ROM) chip select but we map that directly too
251dcdf98a9SBALATON Zoltan */
252dcdf98a9SBALATON Zoltan if (i == 9) {
253dcdf98a9SBALATON Zoltan p = &s->pci[0];
254dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
255dcdf98a9SBALATON Zoltan unmap_region(mr);
256dcdf98a9SBALATON Zoltan if (!(val & mask)) {
257dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->io, OBJECT(s), "pci0-io-win",
258dcdf98a9SBALATON Zoltan p->remap[4], (p->io_size + 1) << 16,
259dcdf98a9SBALATON Zoltan (p->io_base & 0xfffff) << 16);
260dcdf98a9SBALATON Zoltan }
261dcdf98a9SBALATON Zoltan } else if (i == 10) {
262dcdf98a9SBALATON Zoltan p = &s->pci[0];
263dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
264dcdf98a9SBALATON Zoltan unmap_region(mr);
265dcdf98a9SBALATON Zoltan if (!(val & mask)) {
266dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci0-mem0-win",
267dcdf98a9SBALATON Zoltan p->remap[0], (p->mem_size[0] + 1) << 16,
268dcdf98a9SBALATON Zoltan (p->mem_base[0] & 0xfffff) << 16);
269dcdf98a9SBALATON Zoltan }
270dcdf98a9SBALATON Zoltan } else if (i == 11) {
271dcdf98a9SBALATON Zoltan p = &s->pci[0];
272dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
273dcdf98a9SBALATON Zoltan unmap_region(mr);
274dcdf98a9SBALATON Zoltan if (!(val & mask)) {
275dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci0-mem1-win",
276dcdf98a9SBALATON Zoltan p->remap[1], (p->mem_size[1] + 1) << 16,
277dcdf98a9SBALATON Zoltan (p->mem_base[1] & 0xfffff) << 16);
278dcdf98a9SBALATON Zoltan }
279dcdf98a9SBALATON Zoltan } else if (i == 12) {
280dcdf98a9SBALATON Zoltan p = &s->pci[0];
281dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
282dcdf98a9SBALATON Zoltan unmap_region(mr);
283dcdf98a9SBALATON Zoltan if (!(val & mask)) {
284dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci0-mem2-win",
285dcdf98a9SBALATON Zoltan p->remap[2], (p->mem_size[2] + 1) << 16,
286dcdf98a9SBALATON Zoltan (p->mem_base[2] & 0xfffff) << 16);
287dcdf98a9SBALATON Zoltan }
288dcdf98a9SBALATON Zoltan } else if (i == 13) {
289dcdf98a9SBALATON Zoltan p = &s->pci[0];
290dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
291dcdf98a9SBALATON Zoltan unmap_region(mr);
292dcdf98a9SBALATON Zoltan if (!(val & mask)) {
293dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci0-mem3-win",
294dcdf98a9SBALATON Zoltan p->remap[3], (p->mem_size[3] + 1) << 16,
295dcdf98a9SBALATON Zoltan (p->mem_base[3] & 0xfffff) << 16);
296dcdf98a9SBALATON Zoltan }
297dcdf98a9SBALATON Zoltan } else if (i == 14) {
298dcdf98a9SBALATON Zoltan p = &s->pci[1];
299dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
300dcdf98a9SBALATON Zoltan unmap_region(mr);
301dcdf98a9SBALATON Zoltan if (!(val & mask)) {
302dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->io, OBJECT(s), "pci1-io-win",
303dcdf98a9SBALATON Zoltan p->remap[4], (p->io_size + 1) << 16,
304dcdf98a9SBALATON Zoltan (p->io_base & 0xfffff) << 16);
305dcdf98a9SBALATON Zoltan }
306dcdf98a9SBALATON Zoltan } else if (i == 15) {
307dcdf98a9SBALATON Zoltan p = &s->pci[1];
308dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
309dcdf98a9SBALATON Zoltan unmap_region(mr);
310dcdf98a9SBALATON Zoltan if (!(val & mask)) {
311dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci1-mem0-win",
312dcdf98a9SBALATON Zoltan p->remap[0], (p->mem_size[0] + 1) << 16,
313dcdf98a9SBALATON Zoltan (p->mem_base[0] & 0xfffff) << 16);
314dcdf98a9SBALATON Zoltan }
315dcdf98a9SBALATON Zoltan } else if (i == 16) {
316dcdf98a9SBALATON Zoltan p = &s->pci[1];
317dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
318dcdf98a9SBALATON Zoltan unmap_region(mr);
319dcdf98a9SBALATON Zoltan if (!(val & mask)) {
320dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci1-mem1-win",
321dcdf98a9SBALATON Zoltan p->remap[1], (p->mem_size[1] + 1) << 16,
322dcdf98a9SBALATON Zoltan (p->mem_base[1] & 0xfffff) << 16);
323dcdf98a9SBALATON Zoltan }
324dcdf98a9SBALATON Zoltan } else if (i == 17) {
325dcdf98a9SBALATON Zoltan p = &s->pci[1];
326dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
327dcdf98a9SBALATON Zoltan unmap_region(mr);
328dcdf98a9SBALATON Zoltan if (!(val & mask)) {
329dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci1-mem2-win",
330dcdf98a9SBALATON Zoltan p->remap[2], (p->mem_size[2] + 1) << 16,
331dcdf98a9SBALATON Zoltan (p->mem_base[2] & 0xfffff) << 16);
332dcdf98a9SBALATON Zoltan }
333dcdf98a9SBALATON Zoltan } else if (i == 18) {
334dcdf98a9SBALATON Zoltan p = &s->pci[1];
335dcdf98a9SBALATON Zoltan mr = &s->cpu_win[i];
336dcdf98a9SBALATON Zoltan unmap_region(mr);
337dcdf98a9SBALATON Zoltan if (!(val & mask)) {
338dcdf98a9SBALATON Zoltan map_pci_region(mr, &p->mem, OBJECT(s), "pci1-mem3-win",
339dcdf98a9SBALATON Zoltan p->remap[3], (p->mem_size[3] + 1) << 16,
340dcdf98a9SBALATON Zoltan (p->mem_base[3] & 0xfffff) << 16);
341dcdf98a9SBALATON Zoltan }
342dcdf98a9SBALATON Zoltan /* 19 is integrated SRAM */
343dcdf98a9SBALATON Zoltan } else if (i == 20) {
344dcdf98a9SBALATON Zoltan mr = &s->regs;
345dcdf98a9SBALATON Zoltan unmap_region(mr);
346dcdf98a9SBALATON Zoltan if (!(val & mask)) {
347dcdf98a9SBALATON Zoltan memory_region_add_subregion(get_system_memory(),
348dcdf98a9SBALATON Zoltan (s->regs_base & 0xfffff) << 16, mr);
349dcdf98a9SBALATON Zoltan }
350dcdf98a9SBALATON Zoltan }
351dcdf98a9SBALATON Zoltan }
352dcdf98a9SBALATON Zoltan }
353dcdf98a9SBALATON Zoltan s->base_addr_enable = val;
354dcdf98a9SBALATON Zoltan }
355dcdf98a9SBALATON Zoltan
mv64361_update_irq(void * opaque,int n,int level)356dcdf98a9SBALATON Zoltan static void mv64361_update_irq(void *opaque, int n, int level)
357dcdf98a9SBALATON Zoltan {
358dcdf98a9SBALATON Zoltan MV64361State *s = opaque;
359dcdf98a9SBALATON Zoltan uint64_t val = s->main_int_cr;
360dcdf98a9SBALATON Zoltan
361dcdf98a9SBALATON Zoltan if (level) {
362dcdf98a9SBALATON Zoltan val |= BIT_ULL(n);
363dcdf98a9SBALATON Zoltan } else {
364dcdf98a9SBALATON Zoltan val &= ~BIT_ULL(n);
365dcdf98a9SBALATON Zoltan }
366dcdf98a9SBALATON Zoltan if ((s->main_int_cr & s->cpu0_int_mask) != (val & s->cpu0_int_mask)) {
367dcdf98a9SBALATON Zoltan qemu_set_irq(s->cpu_irq, level);
368dcdf98a9SBALATON Zoltan }
369dcdf98a9SBALATON Zoltan s->main_int_cr = val;
370dcdf98a9SBALATON Zoltan }
371dcdf98a9SBALATON Zoltan
mv64361_read(void * opaque,hwaddr addr,unsigned int size)372dcdf98a9SBALATON Zoltan static uint64_t mv64361_read(void *opaque, hwaddr addr, unsigned int size)
373dcdf98a9SBALATON Zoltan {
374dcdf98a9SBALATON Zoltan MV64361State *s = MV64361(opaque);
375dcdf98a9SBALATON Zoltan uint32_t ret = 0;
376dcdf98a9SBALATON Zoltan
377dcdf98a9SBALATON Zoltan switch (addr) {
378dcdf98a9SBALATON Zoltan case MV64340_CPU_CONFIG:
379dcdf98a9SBALATON Zoltan ret = s->cpu_conf;
380dcdf98a9SBALATON Zoltan break;
381dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_BASE_ADDR:
382dcdf98a9SBALATON Zoltan ret = s->pci[0].io_base;
383dcdf98a9SBALATON Zoltan break;
384dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_SIZE:
385dcdf98a9SBALATON Zoltan ret = s->pci[0].io_size;
386dcdf98a9SBALATON Zoltan break;
387dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_ADDR_REMAP:
388dcdf98a9SBALATON Zoltan ret = s->pci[0].remap[4] >> 16;
389dcdf98a9SBALATON Zoltan break;
390dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_BASE_ADDR:
391dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_base[0];
392dcdf98a9SBALATON Zoltan break;
393dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_SIZE:
394dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_size[0];
395dcdf98a9SBALATON Zoltan break;
396dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_LOW_ADDR_REMAP:
397dcdf98a9SBALATON Zoltan ret = (s->pci[0].remap[0] & 0xffff0000) >> 16;
398dcdf98a9SBALATON Zoltan break;
399dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_HIGH_ADDR_REMAP:
400dcdf98a9SBALATON Zoltan ret = s->pci[0].remap[0] >> 32;
401dcdf98a9SBALATON Zoltan break;
402dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_BASE_ADDR:
403dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_base[1];
404dcdf98a9SBALATON Zoltan break;
405dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_SIZE:
406dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_size[1];
407dcdf98a9SBALATON Zoltan break;
408dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_LOW_ADDR_REMAP:
409dcdf98a9SBALATON Zoltan ret = (s->pci[0].remap[1] & 0xffff0000) >> 16;
410dcdf98a9SBALATON Zoltan break;
411dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_HIGH_ADDR_REMAP:
412dcdf98a9SBALATON Zoltan ret = s->pci[0].remap[1] >> 32;
413dcdf98a9SBALATON Zoltan break;
414dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_BASE_ADDR:
415dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_base[2];
416dcdf98a9SBALATON Zoltan break;
417dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_SIZE:
418dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_size[2];
419dcdf98a9SBALATON Zoltan break;
420dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_LOW_ADDR_REMAP:
421dcdf98a9SBALATON Zoltan ret = (s->pci[0].remap[2] & 0xffff0000) >> 16;
422dcdf98a9SBALATON Zoltan break;
423dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_HIGH_ADDR_REMAP:
424dcdf98a9SBALATON Zoltan ret = s->pci[0].remap[2] >> 32;
425dcdf98a9SBALATON Zoltan break;
426dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_BASE_ADDR:
427dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_base[3];
428dcdf98a9SBALATON Zoltan break;
429dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_SIZE:
430dcdf98a9SBALATON Zoltan ret = s->pci[0].mem_size[3];
431dcdf98a9SBALATON Zoltan break;
432dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_LOW_ADDR_REMAP:
433dcdf98a9SBALATON Zoltan ret = (s->pci[0].remap[3] & 0xffff0000) >> 16;
434dcdf98a9SBALATON Zoltan break;
435dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_HIGH_ADDR_REMAP:
436dcdf98a9SBALATON Zoltan ret = s->pci[0].remap[3] >> 32;
437dcdf98a9SBALATON Zoltan break;
438dcdf98a9SBALATON Zoltan case MV64340_PCI_1_IO_BASE_ADDR:
439dcdf98a9SBALATON Zoltan ret = s->pci[1].io_base;
440dcdf98a9SBALATON Zoltan break;
441dcdf98a9SBALATON Zoltan case MV64340_PCI_1_IO_SIZE:
442dcdf98a9SBALATON Zoltan ret = s->pci[1].io_size;
443dcdf98a9SBALATON Zoltan break;
444dcdf98a9SBALATON Zoltan case MV64340_PCI_1_IO_ADDR_REMAP:
445dcdf98a9SBALATON Zoltan ret = s->pci[1].remap[4] >> 16;
446dcdf98a9SBALATON Zoltan break;
447dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_BASE_ADDR:
448dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_base[0];
449dcdf98a9SBALATON Zoltan break;
450dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_SIZE:
451dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_size[0];
452dcdf98a9SBALATON Zoltan break;
453dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_LOW_ADDR_REMAP:
454dcdf98a9SBALATON Zoltan ret = (s->pci[1].remap[0] & 0xffff0000) >> 16;
455dcdf98a9SBALATON Zoltan break;
456dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_HIGH_ADDR_REMAP:
457dcdf98a9SBALATON Zoltan ret = s->pci[1].remap[0] >> 32;
458dcdf98a9SBALATON Zoltan break;
459dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_BASE_ADDR:
460dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_base[1];
461dcdf98a9SBALATON Zoltan break;
462dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_SIZE:
463dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_size[1];
464dcdf98a9SBALATON Zoltan break;
465dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_LOW_ADDR_REMAP:
466dcdf98a9SBALATON Zoltan ret = (s->pci[1].remap[1] & 0xffff0000) >> 16;
467dcdf98a9SBALATON Zoltan break;
468dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_HIGH_ADDR_REMAP:
469dcdf98a9SBALATON Zoltan ret = s->pci[1].remap[1] >> 32;
470dcdf98a9SBALATON Zoltan break;
471dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_BASE_ADDR:
472dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_base[2];
473dcdf98a9SBALATON Zoltan break;
474dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_SIZE:
475dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_size[2];
476dcdf98a9SBALATON Zoltan break;
477dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_LOW_ADDR_REMAP:
478dcdf98a9SBALATON Zoltan ret = (s->pci[1].remap[2] & 0xffff0000) >> 16;
479dcdf98a9SBALATON Zoltan break;
480dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_HIGH_ADDR_REMAP:
481dcdf98a9SBALATON Zoltan ret = s->pci[1].remap[2] >> 32;
482dcdf98a9SBALATON Zoltan break;
483dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_BASE_ADDR:
484dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_base[3];
485dcdf98a9SBALATON Zoltan break;
486dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_SIZE:
487dcdf98a9SBALATON Zoltan ret = s->pci[1].mem_size[3];
488dcdf98a9SBALATON Zoltan break;
489dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_LOW_ADDR_REMAP:
490dcdf98a9SBALATON Zoltan ret = (s->pci[1].remap[3] & 0xffff0000) >> 16;
491dcdf98a9SBALATON Zoltan break;
492dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_HIGH_ADDR_REMAP:
493dcdf98a9SBALATON Zoltan ret = s->pci[1].remap[3] >> 32;
494dcdf98a9SBALATON Zoltan break;
495dcdf98a9SBALATON Zoltan case MV64340_INTERNAL_SPACE_BASE_ADDR:
496dcdf98a9SBALATON Zoltan ret = s->regs_base;
497dcdf98a9SBALATON Zoltan break;
498dcdf98a9SBALATON Zoltan case MV64340_BASE_ADDR_ENABLE:
499dcdf98a9SBALATON Zoltan ret = s->base_addr_enable;
500dcdf98a9SBALATON Zoltan break;
501dcdf98a9SBALATON Zoltan case MV64340_PCI_0_CONFIG_ADDR:
502dcdf98a9SBALATON Zoltan ret = pci_host_conf_le_ops.read(PCI_HOST_BRIDGE(&s->pci[0]), 0, size);
503dcdf98a9SBALATON Zoltan break;
504dcdf98a9SBALATON Zoltan case MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG ...
505dcdf98a9SBALATON Zoltan MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG + 3:
506dcdf98a9SBALATON Zoltan ret = pci_host_data_le_ops.read(PCI_HOST_BRIDGE(&s->pci[0]),
507dcdf98a9SBALATON Zoltan addr - MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG, size);
508dcdf98a9SBALATON Zoltan break;
509dcdf98a9SBALATON Zoltan case MV64340_PCI_1_CONFIG_ADDR:
510dcdf98a9SBALATON Zoltan ret = pci_host_conf_le_ops.read(PCI_HOST_BRIDGE(&s->pci[1]), 0, size);
511dcdf98a9SBALATON Zoltan break;
512dcdf98a9SBALATON Zoltan case MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG ...
513dcdf98a9SBALATON Zoltan MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG + 3:
514dcdf98a9SBALATON Zoltan ret = pci_host_data_le_ops.read(PCI_HOST_BRIDGE(&s->pci[1]),
515dcdf98a9SBALATON Zoltan addr - MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG, size);
516dcdf98a9SBALATON Zoltan break;
517dcdf98a9SBALATON Zoltan case MV64340_PCI_1_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG:
518dcdf98a9SBALATON Zoltan /* FIXME: Should this be sent via the PCI bus somehow? */
519dcdf98a9SBALATON Zoltan if (s->gpp_int_level && (s->gpp_value & BIT(31))) {
520dcdf98a9SBALATON Zoltan ret = pic_read_irq(isa_pic);
521dcdf98a9SBALATON Zoltan }
522dcdf98a9SBALATON Zoltan break;
523dcdf98a9SBALATON Zoltan case MV64340_MAIN_INTERRUPT_CAUSE_LOW:
524dcdf98a9SBALATON Zoltan ret = s->main_int_cr;
525dcdf98a9SBALATON Zoltan break;
526dcdf98a9SBALATON Zoltan case MV64340_MAIN_INTERRUPT_CAUSE_HIGH:
527dcdf98a9SBALATON Zoltan ret = s->main_int_cr >> 32;
528dcdf98a9SBALATON Zoltan break;
529dcdf98a9SBALATON Zoltan case MV64340_CPU_INTERRUPT0_MASK_LOW:
530dcdf98a9SBALATON Zoltan ret = s->cpu0_int_mask;
531dcdf98a9SBALATON Zoltan break;
532dcdf98a9SBALATON Zoltan case MV64340_CPU_INTERRUPT0_MASK_HIGH:
533dcdf98a9SBALATON Zoltan ret = s->cpu0_int_mask >> 32;
534dcdf98a9SBALATON Zoltan break;
535dcdf98a9SBALATON Zoltan case MV64340_CPU_INTERRUPT0_SELECT_CAUSE:
536dcdf98a9SBALATON Zoltan ret = s->main_int_cr;
537dcdf98a9SBALATON Zoltan if (s->main_int_cr & s->cpu0_int_mask) {
538dcdf98a9SBALATON Zoltan if (!(s->main_int_cr & s->cpu0_int_mask & 0xffffffff)) {
539dcdf98a9SBALATON Zoltan ret = s->main_int_cr >> 32 | BIT(30);
540dcdf98a9SBALATON Zoltan } else if ((s->main_int_cr & s->cpu0_int_mask) >> 32) {
541dcdf98a9SBALATON Zoltan ret |= BIT(31);
542dcdf98a9SBALATON Zoltan }
543dcdf98a9SBALATON Zoltan }
544dcdf98a9SBALATON Zoltan break;
54532be62a3SBALATON Zoltan case MV64340_ETH_PHY_ADDR:
54632be62a3SBALATON Zoltan ret = 0x98;
54732be62a3SBALATON Zoltan break;
54832be62a3SBALATON Zoltan case MV64340_ETH_SMI:
54932be62a3SBALATON Zoltan ret = BIT(27);
55032be62a3SBALATON Zoltan break;
551dcdf98a9SBALATON Zoltan case MV64340_CUNIT_ARBITER_CONTROL_REG:
552dcdf98a9SBALATON Zoltan ret = 0x11ff0000 | (s->gpp_int_level << 10);
553dcdf98a9SBALATON Zoltan break;
554dcdf98a9SBALATON Zoltan case MV64340_GPP_IO_CONTROL:
555dcdf98a9SBALATON Zoltan ret = s->gpp_io;
556dcdf98a9SBALATON Zoltan break;
557dcdf98a9SBALATON Zoltan case MV64340_GPP_LEVEL_CONTROL:
558dcdf98a9SBALATON Zoltan ret = s->gpp_level;
559dcdf98a9SBALATON Zoltan break;
560dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE:
561dcdf98a9SBALATON Zoltan ret = s->gpp_value;
562dcdf98a9SBALATON Zoltan break;
563dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE_SET:
564dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE_CLEAR:
565dcdf98a9SBALATON Zoltan ret = 0;
566dcdf98a9SBALATON Zoltan break;
567dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_CAUSE:
568dcdf98a9SBALATON Zoltan ret = s->gpp_int_cr;
569dcdf98a9SBALATON Zoltan break;
570dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_MASK0:
571dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_MASK1:
572dcdf98a9SBALATON Zoltan ret = s->gpp_int_mask;
573dcdf98a9SBALATON Zoltan break;
574dcdf98a9SBALATON Zoltan default:
575dcdf98a9SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register read 0x%"
576dcdf98a9SBALATON Zoltan HWADDR_PRIx "\n", __func__, addr);
577dcdf98a9SBALATON Zoltan break;
578dcdf98a9SBALATON Zoltan }
579dcdf98a9SBALATON Zoltan if (addr != MV64340_PCI_1_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG) {
580dcdf98a9SBALATON Zoltan trace_mv64361_reg_read(addr, ret);
581dcdf98a9SBALATON Zoltan }
582dcdf98a9SBALATON Zoltan return ret;
583dcdf98a9SBALATON Zoltan }
584dcdf98a9SBALATON Zoltan
warn_swap_bit(uint64_t val)585dcdf98a9SBALATON Zoltan static void warn_swap_bit(uint64_t val)
586dcdf98a9SBALATON Zoltan {
587dcdf98a9SBALATON Zoltan if ((val & 0x3000000ULL) >> 24 != 1) {
588dcdf98a9SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: Data swap not implemented", __func__);
589dcdf98a9SBALATON Zoltan }
590dcdf98a9SBALATON Zoltan }
591dcdf98a9SBALATON Zoltan
mv64361_set_pci_mem_remap(MV64361State * s,int bus,int idx,uint64_t val,bool high)592dcdf98a9SBALATON Zoltan static void mv64361_set_pci_mem_remap(MV64361State *s, int bus, int idx,
593dcdf98a9SBALATON Zoltan uint64_t val, bool high)
594dcdf98a9SBALATON Zoltan {
595dcdf98a9SBALATON Zoltan if (high) {
596dcdf98a9SBALATON Zoltan s->pci[bus].remap[idx] = val;
597dcdf98a9SBALATON Zoltan } else {
598dcdf98a9SBALATON Zoltan s->pci[bus].remap[idx] &= 0xffffffff00000000ULL;
599dcdf98a9SBALATON Zoltan s->pci[bus].remap[idx] |= (val & 0xffffULL) << 16;
600dcdf98a9SBALATON Zoltan }
601dcdf98a9SBALATON Zoltan }
602dcdf98a9SBALATON Zoltan
mv64361_write(void * opaque,hwaddr addr,uint64_t val,unsigned int size)603dcdf98a9SBALATON Zoltan static void mv64361_write(void *opaque, hwaddr addr, uint64_t val,
604dcdf98a9SBALATON Zoltan unsigned int size)
605dcdf98a9SBALATON Zoltan {
606dcdf98a9SBALATON Zoltan MV64361State *s = MV64361(opaque);
607dcdf98a9SBALATON Zoltan
608dcdf98a9SBALATON Zoltan trace_mv64361_reg_write(addr, val);
609dcdf98a9SBALATON Zoltan switch (addr) {
610dcdf98a9SBALATON Zoltan case MV64340_CPU_CONFIG:
611dcdf98a9SBALATON Zoltan s->cpu_conf = val & 0xe4e3bffULL;
612dcdf98a9SBALATON Zoltan s->cpu_conf |= BIT(23);
613dcdf98a9SBALATON Zoltan break;
614dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_BASE_ADDR:
615dcdf98a9SBALATON Zoltan s->pci[0].io_base = val & 0x30fffffULL;
616dcdf98a9SBALATON Zoltan warn_swap_bit(val);
617dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
618dcdf98a9SBALATON Zoltan s->pci[0].remap[4] = (val & 0xffffULL) << 16;
619dcdf98a9SBALATON Zoltan }
620dcdf98a9SBALATON Zoltan break;
621dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_SIZE:
622dcdf98a9SBALATON Zoltan s->pci[0].io_size = val & 0xffffULL;
623dcdf98a9SBALATON Zoltan break;
624dcdf98a9SBALATON Zoltan case MV64340_PCI_0_IO_ADDR_REMAP:
625dcdf98a9SBALATON Zoltan s->pci[0].remap[4] = (val & 0xffffULL) << 16;
626dcdf98a9SBALATON Zoltan break;
627dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_BASE_ADDR:
628dcdf98a9SBALATON Zoltan s->pci[0].mem_base[0] = val & 0x70fffffULL;
629dcdf98a9SBALATON Zoltan warn_swap_bit(val);
630dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
631dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 0, val, false);
632dcdf98a9SBALATON Zoltan }
633dcdf98a9SBALATON Zoltan break;
634dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_SIZE:
635dcdf98a9SBALATON Zoltan s->pci[0].mem_size[0] = val & 0xffffULL;
636dcdf98a9SBALATON Zoltan break;
637dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_LOW_ADDR_REMAP:
638dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY0_HIGH_ADDR_REMAP:
639dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 0, val,
640dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_0_MEMORY0_HIGH_ADDR_REMAP));
641dcdf98a9SBALATON Zoltan break;
642dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_BASE_ADDR:
643dcdf98a9SBALATON Zoltan s->pci[0].mem_base[1] = val & 0x70fffffULL;
644dcdf98a9SBALATON Zoltan warn_swap_bit(val);
645dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
646dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 1, val, false);
647dcdf98a9SBALATON Zoltan }
648dcdf98a9SBALATON Zoltan break;
649dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_SIZE:
650dcdf98a9SBALATON Zoltan s->pci[0].mem_size[1] = val & 0xffffULL;
651dcdf98a9SBALATON Zoltan break;
652dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_LOW_ADDR_REMAP:
653dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY1_HIGH_ADDR_REMAP:
654dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 1, val,
655dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_0_MEMORY1_HIGH_ADDR_REMAP));
656dcdf98a9SBALATON Zoltan break;
657dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_BASE_ADDR:
658dcdf98a9SBALATON Zoltan s->pci[0].mem_base[2] = val & 0x70fffffULL;
659dcdf98a9SBALATON Zoltan warn_swap_bit(val);
660dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
661dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 2, val, false);
662dcdf98a9SBALATON Zoltan }
663dcdf98a9SBALATON Zoltan break;
664dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_SIZE:
665dcdf98a9SBALATON Zoltan s->pci[0].mem_size[2] = val & 0xffffULL;
666dcdf98a9SBALATON Zoltan break;
667dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_LOW_ADDR_REMAP:
668dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY2_HIGH_ADDR_REMAP:
669dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 2, val,
670dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_0_MEMORY2_HIGH_ADDR_REMAP));
671dcdf98a9SBALATON Zoltan break;
672dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_BASE_ADDR:
673dcdf98a9SBALATON Zoltan s->pci[0].mem_base[3] = val & 0x70fffffULL;
674dcdf98a9SBALATON Zoltan warn_swap_bit(val);
675dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
676dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 3, val, false);
677dcdf98a9SBALATON Zoltan }
678dcdf98a9SBALATON Zoltan break;
679dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_SIZE:
680dcdf98a9SBALATON Zoltan s->pci[0].mem_size[3] = val & 0xffffULL;
681dcdf98a9SBALATON Zoltan break;
682dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_LOW_ADDR_REMAP:
683dcdf98a9SBALATON Zoltan case MV64340_PCI_0_MEMORY3_HIGH_ADDR_REMAP:
684dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 0, 3, val,
685dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_0_MEMORY3_HIGH_ADDR_REMAP));
686dcdf98a9SBALATON Zoltan break;
687dcdf98a9SBALATON Zoltan case MV64340_PCI_1_IO_BASE_ADDR:
688dcdf98a9SBALATON Zoltan s->pci[1].io_base = val & 0x30fffffULL;
689dcdf98a9SBALATON Zoltan warn_swap_bit(val);
690dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
691dcdf98a9SBALATON Zoltan s->pci[1].remap[4] = (val & 0xffffULL) << 16;
692dcdf98a9SBALATON Zoltan }
693dcdf98a9SBALATON Zoltan break;
694dcdf98a9SBALATON Zoltan case MV64340_PCI_1_IO_SIZE:
695dcdf98a9SBALATON Zoltan s->pci[1].io_size = val & 0xffffULL;
696dcdf98a9SBALATON Zoltan break;
697dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_BASE_ADDR:
698dcdf98a9SBALATON Zoltan s->pci[1].mem_base[0] = val & 0x70fffffULL;
699dcdf98a9SBALATON Zoltan warn_swap_bit(val);
700dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
701dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 0, val, false);
702dcdf98a9SBALATON Zoltan }
703dcdf98a9SBALATON Zoltan break;
704dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_SIZE:
705dcdf98a9SBALATON Zoltan s->pci[1].mem_size[0] = val & 0xffffULL;
706dcdf98a9SBALATON Zoltan break;
707dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_LOW_ADDR_REMAP:
708dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY0_HIGH_ADDR_REMAP:
709dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 0, val,
710dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_1_MEMORY0_HIGH_ADDR_REMAP));
711dcdf98a9SBALATON Zoltan break;
712dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_BASE_ADDR:
713dcdf98a9SBALATON Zoltan s->pci[1].mem_base[1] = val & 0x70fffffULL;
714dcdf98a9SBALATON Zoltan warn_swap_bit(val);
715dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
716dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 1, val, false);
717dcdf98a9SBALATON Zoltan }
718dcdf98a9SBALATON Zoltan break;
719dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_SIZE:
720dcdf98a9SBALATON Zoltan s->pci[1].mem_size[1] = val & 0xffffULL;
721dcdf98a9SBALATON Zoltan break;
722dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_LOW_ADDR_REMAP:
723dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY1_HIGH_ADDR_REMAP:
724dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 1, val,
725dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_1_MEMORY1_HIGH_ADDR_REMAP));
726dcdf98a9SBALATON Zoltan break;
727dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_BASE_ADDR:
728dcdf98a9SBALATON Zoltan s->pci[1].mem_base[2] = val & 0x70fffffULL;
729dcdf98a9SBALATON Zoltan warn_swap_bit(val);
730dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
731dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 2, val, false);
732dcdf98a9SBALATON Zoltan }
733dcdf98a9SBALATON Zoltan break;
734dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_SIZE:
735dcdf98a9SBALATON Zoltan s->pci[1].mem_size[2] = val & 0xffffULL;
736dcdf98a9SBALATON Zoltan break;
737dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_LOW_ADDR_REMAP:
738dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY2_HIGH_ADDR_REMAP:
739dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 2, val,
740dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_1_MEMORY2_HIGH_ADDR_REMAP));
741dcdf98a9SBALATON Zoltan break;
742dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_BASE_ADDR:
743dcdf98a9SBALATON Zoltan s->pci[1].mem_base[3] = val & 0x70fffffULL;
744dcdf98a9SBALATON Zoltan warn_swap_bit(val);
745dcdf98a9SBALATON Zoltan if (!(s->cpu_conf & BIT(27))) {
746dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 3, val, false);
747dcdf98a9SBALATON Zoltan }
748dcdf98a9SBALATON Zoltan break;
749dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_SIZE:
750dcdf98a9SBALATON Zoltan s->pci[1].mem_size[3] = val & 0xffffULL;
751dcdf98a9SBALATON Zoltan break;
752dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_LOW_ADDR_REMAP:
753dcdf98a9SBALATON Zoltan case MV64340_PCI_1_MEMORY3_HIGH_ADDR_REMAP:
754dcdf98a9SBALATON Zoltan mv64361_set_pci_mem_remap(s, 1, 3, val,
755dcdf98a9SBALATON Zoltan (addr == MV64340_PCI_1_MEMORY3_HIGH_ADDR_REMAP));
756dcdf98a9SBALATON Zoltan break;
757dcdf98a9SBALATON Zoltan case MV64340_INTERNAL_SPACE_BASE_ADDR:
758dcdf98a9SBALATON Zoltan s->regs_base = val & 0xfffffULL;
759dcdf98a9SBALATON Zoltan break;
760dcdf98a9SBALATON Zoltan case MV64340_BASE_ADDR_ENABLE:
761dcdf98a9SBALATON Zoltan set_mem_windows(s, val);
762dcdf98a9SBALATON Zoltan break;
763dcdf98a9SBALATON Zoltan case MV64340_PCI_0_CONFIG_ADDR:
764dcdf98a9SBALATON Zoltan pci_host_conf_le_ops.write(PCI_HOST_BRIDGE(&s->pci[0]), 0, val, size);
765dcdf98a9SBALATON Zoltan break;
766dcdf98a9SBALATON Zoltan case MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG ...
767dcdf98a9SBALATON Zoltan MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG + 3:
768dcdf98a9SBALATON Zoltan pci_host_data_le_ops.write(PCI_HOST_BRIDGE(&s->pci[0]),
769dcdf98a9SBALATON Zoltan addr - MV64340_PCI_0_CONFIG_DATA_VIRTUAL_REG, val, size);
770dcdf98a9SBALATON Zoltan break;
771dcdf98a9SBALATON Zoltan case MV64340_PCI_1_CONFIG_ADDR:
772dcdf98a9SBALATON Zoltan pci_host_conf_le_ops.write(PCI_HOST_BRIDGE(&s->pci[1]), 0, val, size);
773dcdf98a9SBALATON Zoltan break;
774dcdf98a9SBALATON Zoltan case MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG ...
775dcdf98a9SBALATON Zoltan MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG + 3:
776dcdf98a9SBALATON Zoltan pci_host_data_le_ops.write(PCI_HOST_BRIDGE(&s->pci[1]),
777dcdf98a9SBALATON Zoltan addr - MV64340_PCI_1_CONFIG_DATA_VIRTUAL_REG, val, size);
778dcdf98a9SBALATON Zoltan break;
779dcdf98a9SBALATON Zoltan case MV64340_CPU_INTERRUPT0_MASK_LOW:
780dcdf98a9SBALATON Zoltan s->cpu0_int_mask &= 0xffffffff00000000ULL;
781dcdf98a9SBALATON Zoltan s->cpu0_int_mask |= val & 0xffffffffULL;
782dcdf98a9SBALATON Zoltan break;
783dcdf98a9SBALATON Zoltan case MV64340_CPU_INTERRUPT0_MASK_HIGH:
784dcdf98a9SBALATON Zoltan s->cpu0_int_mask &= 0xffffffffULL;
785dcdf98a9SBALATON Zoltan s->cpu0_int_mask |= val << 32;
786dcdf98a9SBALATON Zoltan break;
787dcdf98a9SBALATON Zoltan case MV64340_CUNIT_ARBITER_CONTROL_REG:
788dcdf98a9SBALATON Zoltan s->gpp_int_level = !!(val & BIT(10));
789dcdf98a9SBALATON Zoltan break;
790dcdf98a9SBALATON Zoltan case MV64340_GPP_IO_CONTROL:
791dcdf98a9SBALATON Zoltan s->gpp_io = val;
792dcdf98a9SBALATON Zoltan break;
793dcdf98a9SBALATON Zoltan case MV64340_GPP_LEVEL_CONTROL:
794dcdf98a9SBALATON Zoltan s->gpp_level = val;
795dcdf98a9SBALATON Zoltan break;
796dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE:
797dcdf98a9SBALATON Zoltan s->gpp_value &= ~s->gpp_io;
798dcdf98a9SBALATON Zoltan s->gpp_value |= val & s->gpp_io;
799dcdf98a9SBALATON Zoltan break;
800dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE_SET:
801dcdf98a9SBALATON Zoltan s->gpp_value |= val & s->gpp_io;
802dcdf98a9SBALATON Zoltan break;
803dcdf98a9SBALATON Zoltan case MV64340_GPP_VALUE_CLEAR:
804dcdf98a9SBALATON Zoltan s->gpp_value &= ~(val & s->gpp_io);
805dcdf98a9SBALATON Zoltan break;
806dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_CAUSE:
807dcdf98a9SBALATON Zoltan if (!s->gpp_int_level && val != s->gpp_int_cr) {
808dcdf98a9SBALATON Zoltan int i;
809dcdf98a9SBALATON Zoltan uint32_t ch = s->gpp_int_cr ^ val;
810dcdf98a9SBALATON Zoltan s->gpp_int_cr = val;
811dcdf98a9SBALATON Zoltan for (i = 0; i < 4; i++) {
812dcdf98a9SBALATON Zoltan if ((ch & 0xff << i) && !(val & 0xff << i)) {
813dcdf98a9SBALATON Zoltan mv64361_update_irq(opaque, MV64361_IRQ_P0_GPP0_7 + i, 0);
814dcdf98a9SBALATON Zoltan }
815dcdf98a9SBALATON Zoltan }
816dcdf98a9SBALATON Zoltan } else {
817dcdf98a9SBALATON Zoltan s->gpp_int_cr = val;
818dcdf98a9SBALATON Zoltan }
819dcdf98a9SBALATON Zoltan break;
820dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_MASK0:
821dcdf98a9SBALATON Zoltan case MV64340_GPP_INTERRUPT_MASK1:
822dcdf98a9SBALATON Zoltan s->gpp_int_mask = val;
823dcdf98a9SBALATON Zoltan break;
824dcdf98a9SBALATON Zoltan default:
825dcdf98a9SBALATON Zoltan qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register write 0x%"
826dcdf98a9SBALATON Zoltan HWADDR_PRIx " = %"PRIx64"\n", __func__, addr, val);
827dcdf98a9SBALATON Zoltan break;
828dcdf98a9SBALATON Zoltan }
829dcdf98a9SBALATON Zoltan }
830dcdf98a9SBALATON Zoltan
831dcdf98a9SBALATON Zoltan static const MemoryRegionOps mv64361_ops = {
832dcdf98a9SBALATON Zoltan .read = mv64361_read,
833dcdf98a9SBALATON Zoltan .write = mv64361_write,
834dcdf98a9SBALATON Zoltan .valid.min_access_size = 1,
835dcdf98a9SBALATON Zoltan .valid.max_access_size = 4,
836dcdf98a9SBALATON Zoltan .endianness = DEVICE_LITTLE_ENDIAN,
837dcdf98a9SBALATON Zoltan };
838dcdf98a9SBALATON Zoltan
mv64361_gpp_irq(void * opaque,int n,int level)839dcdf98a9SBALATON Zoltan static void mv64361_gpp_irq(void *opaque, int n, int level)
840dcdf98a9SBALATON Zoltan {
841dcdf98a9SBALATON Zoltan MV64361State *s = opaque;
842dcdf98a9SBALATON Zoltan uint32_t mask = BIT(n);
843dcdf98a9SBALATON Zoltan uint32_t val = s->gpp_value & ~mask;
844dcdf98a9SBALATON Zoltan
845dcdf98a9SBALATON Zoltan if (s->gpp_level & mask) {
846dcdf98a9SBALATON Zoltan level = !level;
847dcdf98a9SBALATON Zoltan }
848dcdf98a9SBALATON Zoltan val |= level << n;
849dcdf98a9SBALATON Zoltan if (val > s->gpp_value) {
850dcdf98a9SBALATON Zoltan s->gpp_value = val;
851dcdf98a9SBALATON Zoltan s->gpp_int_cr |= mask;
852dcdf98a9SBALATON Zoltan if (s->gpp_int_mask & mask) {
853dcdf98a9SBALATON Zoltan mv64361_update_irq(opaque, MV64361_IRQ_P0_GPP0_7 + n / 8, 1);
854dcdf98a9SBALATON Zoltan }
855dcdf98a9SBALATON Zoltan } else if (val < s->gpp_value) {
856dcdf98a9SBALATON Zoltan int b = n / 8;
857dcdf98a9SBALATON Zoltan s->gpp_value = val;
858dcdf98a9SBALATON Zoltan if (s->gpp_int_level && !(val & 0xff << b)) {
859dcdf98a9SBALATON Zoltan mv64361_update_irq(opaque, MV64361_IRQ_P0_GPP0_7 + b, 0);
860dcdf98a9SBALATON Zoltan }
861dcdf98a9SBALATON Zoltan }
862dcdf98a9SBALATON Zoltan }
863dcdf98a9SBALATON Zoltan
mv64361_realize(DeviceState * dev,Error ** errp)864dcdf98a9SBALATON Zoltan static void mv64361_realize(DeviceState *dev, Error **errp)
865dcdf98a9SBALATON Zoltan {
866dcdf98a9SBALATON Zoltan MV64361State *s = MV64361(dev);
867dcdf98a9SBALATON Zoltan int i;
868dcdf98a9SBALATON Zoltan
869dcdf98a9SBALATON Zoltan s->base_addr_enable = 0x1fffff;
870dcdf98a9SBALATON Zoltan memory_region_init_io(&s->regs, OBJECT(s), &mv64361_ops, s,
871dcdf98a9SBALATON Zoltan TYPE_MV64361, 0x10000);
872bd20cde5SBALATON Zoltan sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->regs);
873dcdf98a9SBALATON Zoltan for (i = 0; i < 2; i++) {
874dcdf98a9SBALATON Zoltan g_autofree char *name = g_strdup_printf("pcihost%d", i);
875dcdf98a9SBALATON Zoltan object_initialize_child(OBJECT(dev), name, &s->pci[i],
876dcdf98a9SBALATON Zoltan TYPE_MV64361_PCI);
877dcdf98a9SBALATON Zoltan DeviceState *pci = DEVICE(&s->pci[i]);
878dcdf98a9SBALATON Zoltan qdev_prop_set_uint8(pci, "index", i);
879dcdf98a9SBALATON Zoltan sysbus_realize_and_unref(SYS_BUS_DEVICE(pci), &error_fatal);
880dcdf98a9SBALATON Zoltan }
881dcdf98a9SBALATON Zoltan sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cpu_irq);
882dcdf98a9SBALATON Zoltan qdev_init_gpio_in_named(dev, mv64361_gpp_irq, "gpp", 32);
883dcdf98a9SBALATON Zoltan }
884dcdf98a9SBALATON Zoltan
mv64361_reset(DeviceState * dev)885dcdf98a9SBALATON Zoltan static void mv64361_reset(DeviceState *dev)
886dcdf98a9SBALATON Zoltan {
887dcdf98a9SBALATON Zoltan MV64361State *s = MV64361(dev);
888dcdf98a9SBALATON Zoltan int i, j;
889dcdf98a9SBALATON Zoltan
890dcdf98a9SBALATON Zoltan /*
891dcdf98a9SBALATON Zoltan * These values may be board specific
892dcdf98a9SBALATON Zoltan * Real chip supports init from an eprom but that's not modelled
893dcdf98a9SBALATON Zoltan */
894dcdf98a9SBALATON Zoltan set_mem_windows(s, 0x1fffff);
895dcdf98a9SBALATON Zoltan s->cpu_conf = 0x28000ff;
896dcdf98a9SBALATON Zoltan s->regs_base = 0x100f100;
897dcdf98a9SBALATON Zoltan s->pci[0].io_base = 0x100f800;
898dcdf98a9SBALATON Zoltan s->pci[0].io_size = 0xff;
899dcdf98a9SBALATON Zoltan s->pci[0].mem_base[0] = 0x100c000;
900dcdf98a9SBALATON Zoltan s->pci[0].mem_size[0] = 0x1fff;
901dcdf98a9SBALATON Zoltan s->pci[0].mem_base[1] = 0x100f900;
902dcdf98a9SBALATON Zoltan s->pci[0].mem_size[1] = 0xff;
903dcdf98a9SBALATON Zoltan s->pci[0].mem_base[2] = 0x100f400;
904dcdf98a9SBALATON Zoltan s->pci[0].mem_size[2] = 0x1ff;
905dcdf98a9SBALATON Zoltan s->pci[0].mem_base[3] = 0x100f600;
906dcdf98a9SBALATON Zoltan s->pci[0].mem_size[3] = 0x1ff;
907dcdf98a9SBALATON Zoltan s->pci[1].io_base = 0x100fe00;
908dcdf98a9SBALATON Zoltan s->pci[1].io_size = 0xff;
909dcdf98a9SBALATON Zoltan s->pci[1].mem_base[0] = 0x1008000;
910dcdf98a9SBALATON Zoltan s->pci[1].mem_size[0] = 0x3fff;
911dcdf98a9SBALATON Zoltan s->pci[1].mem_base[1] = 0x100fd00;
912dcdf98a9SBALATON Zoltan s->pci[1].mem_size[1] = 0xff;
913dcdf98a9SBALATON Zoltan s->pci[1].mem_base[2] = 0x1002600;
914dcdf98a9SBALATON Zoltan s->pci[1].mem_size[2] = 0x1ff;
915dcdf98a9SBALATON Zoltan s->pci[1].mem_base[3] = 0x100ff80;
916dcdf98a9SBALATON Zoltan s->pci[1].mem_size[3] = 0x7f;
917dcdf98a9SBALATON Zoltan for (i = 0; i < 2; i++) {
918dcdf98a9SBALATON Zoltan for (j = 0; j < 4; j++) {
919dcdf98a9SBALATON Zoltan s->pci[i].remap[j] = s->pci[i].mem_base[j] << 16;
920dcdf98a9SBALATON Zoltan }
921dcdf98a9SBALATON Zoltan }
922dcdf98a9SBALATON Zoltan s->pci[0].remap[1] = 0;
923dcdf98a9SBALATON Zoltan s->pci[1].remap[1] = 0;
924dcdf98a9SBALATON Zoltan set_mem_windows(s, 0xfbfff);
925dcdf98a9SBALATON Zoltan }
926dcdf98a9SBALATON Zoltan
mv64361_class_init(ObjectClass * klass,void * data)927dcdf98a9SBALATON Zoltan static void mv64361_class_init(ObjectClass *klass, void *data)
928dcdf98a9SBALATON Zoltan {
929dcdf98a9SBALATON Zoltan DeviceClass *dc = DEVICE_CLASS(klass);
930dcdf98a9SBALATON Zoltan
931dcdf98a9SBALATON Zoltan dc->realize = mv64361_realize;
932e3d08143SPeter Maydell device_class_set_legacy_reset(dc, mv64361_reset);
933dcdf98a9SBALATON Zoltan }
934dcdf98a9SBALATON Zoltan
935dcdf98a9SBALATON Zoltan static const TypeInfo mv64361_type_info = {
936dcdf98a9SBALATON Zoltan .name = TYPE_MV64361,
937dcdf98a9SBALATON Zoltan .parent = TYPE_SYS_BUS_DEVICE,
938dcdf98a9SBALATON Zoltan .instance_size = sizeof(MV64361State),
939dcdf98a9SBALATON Zoltan .class_init = mv64361_class_init,
940dcdf98a9SBALATON Zoltan };
941dcdf98a9SBALATON Zoltan
mv64361_register_types(void)942dcdf98a9SBALATON Zoltan static void mv64361_register_types(void)
943dcdf98a9SBALATON Zoltan {
944dcdf98a9SBALATON Zoltan type_register_static(&mv64361_type_info);
945dcdf98a9SBALATON Zoltan }
946dcdf98a9SBALATON Zoltan
947dcdf98a9SBALATON Zoltan type_init(mv64361_register_types)
948