69
69
MACIOIDEState ide[2];
70
70
} NewWorldMacIOState;
73
* The mac-io has two interfaces to the ESCC. One is called "escc-legacy",
74
* while the other one is the normal, current ESCC interface.
76
* The magic below creates memory aliases to spawn the escc-legacy device
77
* purely by rerouting the respective registers to our escc region. This
78
* works because the only difference between the two memory regions is the
79
* register layout, not their semantics.
81
* Reference: ftp://ftp.software.ibm.com/rs6000/technology/spec/chrp/inwork/CHRP_IORef_1.0.pdf
83
static void macio_escc_legacy_setup(MacIOState *macio_state)
85
MemoryRegion *escc_legacy = g_new(MemoryRegion, 1);
86
MemoryRegion *bar = &macio_state->bar;
88
static const int maps[] = {
107
memory_region_init(escc_legacy, NULL, "escc-legacy", 256);
108
for (i = 0; i < ARRAY_SIZE(maps); i += 2) {
109
MemoryRegion *port = g_new(MemoryRegion, 1);
110
memory_region_init_alias(port, NULL, "escc-legacy-port",
111
macio_state->escc_mem, maps[i+1], 0x2);
112
memory_region_add_subregion(escc_legacy, maps[i], port);
115
memory_region_add_subregion(bar, 0x12000, escc_legacy);
72
118
static void macio_bar_setup(MacIOState *macio_state)
74
120
MemoryRegion *bar = &macio_state->bar;
76
122
if (macio_state->escc_mem) {
77
123
memory_region_add_subregion(bar, 0x13000, macio_state->escc_mem);
124
macio_escc_legacy_setup(macio_state);
150
static int macio_initfn_ide(MacIOState *s, MACIOIDEState *ide, qemu_irq irq0,
151
qemu_irq irq1, int dmaid)
153
SysBusDevice *sysbus_dev;
155
sysbus_dev = SYS_BUS_DEVICE(ide);
156
sysbus_connect_irq(sysbus_dev, 0, irq0);
157
sysbus_connect_irq(sysbus_dev, 1, irq1);
158
macio_ide_register_dma(ide, s->dbdma, dmaid);
159
return qdev_init(DEVICE(ide));
103
162
static int macio_oldworld_initfn(PCIDevice *d)
105
164
MacIOState *s = MACIO(d);
106
165
OldWorldMacIOState *os = OLDWORLD_MACIO(d);
107
166
SysBusDevice *sysbus_dev;
108
169
int ret = macio_common_initfn(d);
113
174
sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
114
sysbus_connect_irq(sysbus_dev, 0, os->irqs[0]);
175
sysbus_connect_irq(sysbus_dev, 0, os->irqs[cur_irq++]);
116
177
ret = qdev_init(DEVICE(&os->nvram));
127
188
memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem);
130
sysbus_dev = SYS_BUS_DEVICE(&os->ide);
131
sysbus_connect_irq(sysbus_dev, 0, os->irqs[1]);
132
sysbus_connect_irq(sysbus_dev, 1, os->irqs[2]);
133
macio_ide_register_dma(&os->ide, s->dbdma, 0x16);
134
ret = qdev_init(DEVICE(&os->ide));
192
for (i = 0; i < ARRAY_SIZE(os->ide); i++) {
193
qemu_irq irq0 = os->irqs[cur_irq++];
194
qemu_irq irq1 = os->irqs[cur_irq++];
196
ret = macio_initfn_ide(s, &os->ide[i], irq0, irq1, 0x16 + (i * 4));
205
static void macio_init_ide(MacIOState *s, MACIOIDEState *ide, int index)
209
object_initialize(ide, TYPE_MACIO_IDE);
210
qdev_set_parent_bus(DEVICE(ide), sysbus_get_default());
211
memory_region_add_subregion(&s->bar, 0x1f000 + ((index + 1) * 0x1000),
213
name = g_strdup_printf("ide[%i]", index);
214
object_property_add_child(OBJECT(s), name, OBJECT(ide), NULL);
142
218
static void macio_oldworld_init(Object *obj)
144
220
MacIOState *s = MACIO(obj);
145
221
OldWorldMacIOState *os = OLDWORLD_MACIO(obj);
146
222
DeviceState *dev;
148
225
qdev_init_gpio_out(DEVICE(obj), os->irqs, ARRAY_SIZE(os->irqs));
152
229
qdev_prop_set_uint32(dev, "size", 0x2000);
153
230
qdev_prop_set_uint32(dev, "it_shift", 4);
155
object_initialize(&os->ide, TYPE_MACIO_IDE);
156
qdev_set_parent_bus(DEVICE(&os->ide), sysbus_get_default());
157
memory_region_add_subregion(&s->bar, 0x1f000 + (1 * 0x1000), &os->ide.mem);
158
object_property_add_child(obj, "ide", OBJECT(&os->ide), NULL);
232
for (i = 0; i < 2; i++) {
233
macio_init_ide(s, &os->ide[i], i);
237
static void timer_write(void *opaque, hwaddr addr, uint64_t value,
242
static uint64_t timer_read(void *opaque, hwaddr addr, unsigned size)
248
value = qemu_get_clock_ns(vm_clock);
251
value = qemu_get_clock_ns(vm_clock) >> 32;
258
static const MemoryRegionOps timer_ops = {
260
.write = timer_write,
261
.endianness = DEVICE_NATIVE_ENDIAN,
161
264
static int macio_newworld_initfn(PCIDevice *d)
163
266
MacIOState *s = MACIO(d);
164
267
NewWorldMacIOState *ns = NEWWORLD_MACIO(d);
165
268
SysBusDevice *sysbus_dev;
269
MemoryRegion *timer_memory = g_new(MemoryRegion, 1);
166
272
int ret = macio_common_initfn(d);
171
277
sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
172
sysbus_connect_irq(sysbus_dev, 0, ns->irqs[0]);
278
sysbus_connect_irq(sysbus_dev, 0, ns->irqs[cur_irq++]);
174
280
if (s->pic_mem) {
176
282
memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem);
179
sysbus_dev = SYS_BUS_DEVICE(&ns->ide[0]);
180
sysbus_connect_irq(sysbus_dev, 0, ns->irqs[1]);
181
sysbus_connect_irq(sysbus_dev, 1, ns->irqs[2]);
182
macio_ide_register_dma(&ns->ide[0], s->dbdma, 0x16);
183
ret = qdev_init(DEVICE(&ns->ide[0]));
188
sysbus_dev = SYS_BUS_DEVICE(&ns->ide[1]);
189
sysbus_connect_irq(sysbus_dev, 0, ns->irqs[3]);
190
sysbus_connect_irq(sysbus_dev, 1, ns->irqs[4]);
191
macio_ide_register_dma(&ns->ide[1], s->dbdma, 0x1a);
192
ret = qdev_init(DEVICE(&ns->ide[1]));
286
for (i = 0; i < ARRAY_SIZE(ns->ide); i++) {
287
qemu_irq irq0 = ns->irqs[cur_irq++];
288
qemu_irq irq1 = ns->irqs[cur_irq++];
290
ret = macio_initfn_ide(s, &ns->ide[i], irq0, irq1, 0x16 + (i * 4));
297
memory_region_init_io(timer_memory, OBJECT(s), &timer_ops, NULL, "timer",
299
memory_region_add_subregion(&s->bar, 0x15000, timer_memory);
202
306
MacIOState *s = MACIO(obj);
203
307
NewWorldMacIOState *ns = NEWWORLD_MACIO(obj);
207
310
qdev_init_gpio_out(DEVICE(obj), ns->irqs, ARRAY_SIZE(ns->irqs));
209
312
for (i = 0; i < 2; i++) {
210
object_initialize(&ns->ide[i], TYPE_MACIO_IDE);
211
qdev_set_parent_bus(DEVICE(&ns->ide[i]), sysbus_get_default());
212
memory_region_add_subregion(&s->bar, 0x1f000 + ((i + 1) * 0x1000),
214
name = g_strdup_printf("ide[%i]", i);
215
object_property_add_child(obj, name, OBJECT(&ns->ide[i]), NULL);
313
macio_init_ide(s, &ns->ide[i], i);