allwinner-h3.c (9fc7fc4d3909817555ce0af6bcb69dff1606140d) allwinner-h3.c (db873cc5d1a4aaa67eea87768d504b2f89d88738)
1/*
2 * Allwinner H3 System on Chip emulation
3 *
4 * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 2 of the License, or

--- 184 unchanged lines hidden (view full) ---

193
194 s->memmap = allwinner_h3_memmap;
195
196 for (int i = 0; i < AW_H3_NUM_CPUS; i++) {
197 object_initialize_child(obj, "cpu[*]", &s->cpus[i],
198 ARM_CPU_TYPE_NAME("cortex-a7"));
199 }
200
1/*
2 * Allwinner H3 System on Chip emulation
3 *
4 * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 2 of the License, or

--- 184 unchanged lines hidden (view full) ---

193
194 s->memmap = allwinner_h3_memmap;
195
196 for (int i = 0; i < AW_H3_NUM_CPUS; i++) {
197 object_initialize_child(obj, "cpu[*]", &s->cpus[i],
198 ARM_CPU_TYPE_NAME("cortex-a7"));
199 }
200
201 sysbus_init_child_obj(obj, "gic", &s->gic, sizeof(s->gic),
202 TYPE_ARM_GIC);
201 object_initialize_child(obj, "gic", &s->gic, TYPE_ARM_GIC);
203
202
204 sysbus_init_child_obj(obj, "timer", &s->timer, sizeof(s->timer),
205 TYPE_AW_A10_PIT);
203 object_initialize_child(obj, "timer", &s->timer, TYPE_AW_A10_PIT);
206 object_property_add_alias(obj, "clk0-freq", OBJECT(&s->timer),
207 "clk0-freq");
208 object_property_add_alias(obj, "clk1-freq", OBJECT(&s->timer),
209 "clk1-freq");
210
204 object_property_add_alias(obj, "clk0-freq", OBJECT(&s->timer),
205 "clk0-freq");
206 object_property_add_alias(obj, "clk1-freq", OBJECT(&s->timer),
207 "clk1-freq");
208
211 sysbus_init_child_obj(obj, "ccu", &s->ccu, sizeof(s->ccu),
212 TYPE_AW_H3_CCU);
209 object_initialize_child(obj, "ccu", &s->ccu, TYPE_AW_H3_CCU);
213
210
214 sysbus_init_child_obj(obj, "sysctrl", &s->sysctrl, sizeof(s->sysctrl),
215 TYPE_AW_H3_SYSCTRL);
211 object_initialize_child(obj, "sysctrl", &s->sysctrl, TYPE_AW_H3_SYSCTRL);
216
212
217 sysbus_init_child_obj(obj, "cpucfg", &s->cpucfg, sizeof(s->cpucfg),
218 TYPE_AW_CPUCFG);
213 object_initialize_child(obj, "cpucfg", &s->cpucfg, TYPE_AW_CPUCFG);
219
214
220 sysbus_init_child_obj(obj, "sid", &s->sid, sizeof(s->sid),
221 TYPE_AW_SID);
215 object_initialize_child(obj, "sid", &s->sid, TYPE_AW_SID);
222 object_property_add_alias(obj, "identifier", OBJECT(&s->sid),
223 "identifier");
224
216 object_property_add_alias(obj, "identifier", OBJECT(&s->sid),
217 "identifier");
218
225 sysbus_init_child_obj(obj, "mmc0", &s->mmc0, sizeof(s->mmc0),
226 TYPE_AW_SDHOST_SUN5I);
219 object_initialize_child(obj, "mmc0", &s->mmc0, TYPE_AW_SDHOST_SUN5I);
227
220
228 sysbus_init_child_obj(obj, "emac", &s->emac, sizeof(s->emac),
229 TYPE_AW_SUN8I_EMAC);
221 object_initialize_child(obj, "emac", &s->emac, TYPE_AW_SUN8I_EMAC);
230
222
231 sysbus_init_child_obj(obj, "dramc", &s->dramc, sizeof(s->dramc),
232 TYPE_AW_H3_DRAMC);
223 object_initialize_child(obj, "dramc", &s->dramc, TYPE_AW_H3_DRAMC);
233 object_property_add_alias(obj, "ram-addr", OBJECT(&s->dramc),
234 "ram-addr");
235 object_property_add_alias(obj, "ram-size", OBJECT(&s->dramc),
236 "ram-size");
237
224 object_property_add_alias(obj, "ram-addr", OBJECT(&s->dramc),
225 "ram-addr");
226 object_property_add_alias(obj, "ram-size", OBJECT(&s->dramc),
227 "ram-size");
228
238 sysbus_init_child_obj(obj, "rtc", &s->rtc, sizeof(s->rtc),
239 TYPE_AW_RTC_SUN6I);
229 object_initialize_child(obj, "rtc", &s->rtc, TYPE_AW_RTC_SUN6I);
240}
241
242static void allwinner_h3_realize(DeviceState *dev, Error **errp)
243{
244 AwH3State *s = AW_H3(dev);
245 unsigned i;
246
247 /* CPUs */

--- 17 unchanged lines hidden (view full) ---

265
266 /* Generic Interrupt Controller */
267 qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", AW_H3_GIC_NUM_SPI +
268 GIC_INTERNAL);
269 qdev_prop_set_uint32(DEVICE(&s->gic), "revision", 2);
270 qdev_prop_set_uint32(DEVICE(&s->gic), "num-cpu", AW_H3_NUM_CPUS);
271 qdev_prop_set_bit(DEVICE(&s->gic), "has-security-extensions", false);
272 qdev_prop_set_bit(DEVICE(&s->gic), "has-virtualization-extensions", true);
230}
231
232static void allwinner_h3_realize(DeviceState *dev, Error **errp)
233{
234 AwH3State *s = AW_H3(dev);
235 unsigned i;
236
237 /* CPUs */

--- 17 unchanged lines hidden (view full) ---

255
256 /* Generic Interrupt Controller */
257 qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", AW_H3_GIC_NUM_SPI +
258 GIC_INTERNAL);
259 qdev_prop_set_uint32(DEVICE(&s->gic), "revision", 2);
260 qdev_prop_set_uint32(DEVICE(&s->gic), "num-cpu", AW_H3_NUM_CPUS);
261 qdev_prop_set_bit(DEVICE(&s->gic), "has-security-extensions", false);
262 qdev_prop_set_bit(DEVICE(&s->gic), "has-virtualization-extensions", true);
273 qdev_init_nofail(DEVICE(&s->gic));
263 sysbus_realize(SYS_BUS_DEVICE(&s->gic), &error_fatal);
274
275 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 0, s->memmap[AW_H3_GIC_DIST]);
276 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 1, s->memmap[AW_H3_GIC_CPU]);
277 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 2, s->memmap[AW_H3_GIC_HYP]);
278 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 3, s->memmap[AW_H3_GIC_VCPU]);
279
280 /*
281 * Wire the outputs from each CPU's generic timer and the GICv3

--- 34 unchanged lines hidden (view full) ---

316
317 /* GIC maintenance signal */
318 sysbus_connect_irq(SYS_BUS_DEVICE(&s->gic), i + (4 * AW_H3_NUM_CPUS),
319 qdev_get_gpio_in(DEVICE(&s->gic),
320 ppibase + AW_H3_GIC_PPI_MAINT));
321 }
322
323 /* Timer */
264
265 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 0, s->memmap[AW_H3_GIC_DIST]);
266 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 1, s->memmap[AW_H3_GIC_CPU]);
267 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 2, s->memmap[AW_H3_GIC_HYP]);
268 sysbus_mmio_map(SYS_BUS_DEVICE(&s->gic), 3, s->memmap[AW_H3_GIC_VCPU]);
269
270 /*
271 * Wire the outputs from each CPU's generic timer and the GICv3

--- 34 unchanged lines hidden (view full) ---

306
307 /* GIC maintenance signal */
308 sysbus_connect_irq(SYS_BUS_DEVICE(&s->gic), i + (4 * AW_H3_NUM_CPUS),
309 qdev_get_gpio_in(DEVICE(&s->gic),
310 ppibase + AW_H3_GIC_PPI_MAINT));
311 }
312
313 /* Timer */
324 qdev_init_nofail(DEVICE(&s->timer));
314 sysbus_realize(SYS_BUS_DEVICE(&s->timer), &error_fatal);
325 sysbus_mmio_map(SYS_BUS_DEVICE(&s->timer), 0, s->memmap[AW_H3_PIT]);
326 sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer), 0,
327 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_TIMER0));
328 sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer), 1,
329 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_TIMER1));
330
331 /* SRAM */
332 memory_region_init_ram(&s->sram_a1, OBJECT(dev), "sram A1",

--- 5 unchanged lines hidden (view full) ---

338 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_A1],
339 &s->sram_a1);
340 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_A2],
341 &s->sram_a2);
342 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_C],
343 &s->sram_c);
344
345 /* Clock Control Unit */
315 sysbus_mmio_map(SYS_BUS_DEVICE(&s->timer), 0, s->memmap[AW_H3_PIT]);
316 sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer), 0,
317 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_TIMER0));
318 sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer), 1,
319 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_TIMER1));
320
321 /* SRAM */
322 memory_region_init_ram(&s->sram_a1, OBJECT(dev), "sram A1",

--- 5 unchanged lines hidden (view full) ---

328 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_A1],
329 &s->sram_a1);
330 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_A2],
331 &s->sram_a2);
332 memory_region_add_subregion(get_system_memory(), s->memmap[AW_H3_SRAM_C],
333 &s->sram_c);
334
335 /* Clock Control Unit */
346 qdev_init_nofail(DEVICE(&s->ccu));
336 sysbus_realize(SYS_BUS_DEVICE(&s->ccu), &error_fatal);
347 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccu), 0, s->memmap[AW_H3_CCU]);
348
349 /* System Control */
337 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccu), 0, s->memmap[AW_H3_CCU]);
338
339 /* System Control */
350 qdev_init_nofail(DEVICE(&s->sysctrl));
340 sysbus_realize(SYS_BUS_DEVICE(&s->sysctrl), &error_fatal);
351 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctrl), 0, s->memmap[AW_H3_SYSCTRL]);
352
353 /* CPU Configuration */
341 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctrl), 0, s->memmap[AW_H3_SYSCTRL]);
342
343 /* CPU Configuration */
354 qdev_init_nofail(DEVICE(&s->cpucfg));
344 sysbus_realize(SYS_BUS_DEVICE(&s->cpucfg), &error_fatal);
355 sysbus_mmio_map(SYS_BUS_DEVICE(&s->cpucfg), 0, s->memmap[AW_H3_CPUCFG]);
356
357 /* Security Identifier */
345 sysbus_mmio_map(SYS_BUS_DEVICE(&s->cpucfg), 0, s->memmap[AW_H3_CPUCFG]);
346
347 /* Security Identifier */
358 qdev_init_nofail(DEVICE(&s->sid));
348 sysbus_realize(SYS_BUS_DEVICE(&s->sid), &error_fatal);
359 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sid), 0, s->memmap[AW_H3_SID]);
360
361 /* SD/MMC */
349 sysbus_mmio_map(SYS_BUS_DEVICE(&s->sid), 0, s->memmap[AW_H3_SID]);
350
351 /* SD/MMC */
362 qdev_init_nofail(DEVICE(&s->mmc0));
352 sysbus_realize(SYS_BUS_DEVICE(&s->mmc0), &error_fatal);
363 sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, s->memmap[AW_H3_MMC0]);
364 sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0,
365 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_MMC0));
366
367 object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->mmc0),
368 "sd-bus");
369
370 /* EMAC */
371 if (nd_table[0].used) {
372 qemu_check_nic_model(&nd_table[0], TYPE_AW_SUN8I_EMAC);
373 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
374 }
353 sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, s->memmap[AW_H3_MMC0]);
354 sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0,
355 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_MMC0));
356
357 object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->mmc0),
358 "sd-bus");
359
360 /* EMAC */
361 if (nd_table[0].used) {
362 qemu_check_nic_model(&nd_table[0], TYPE_AW_SUN8I_EMAC);
363 qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
364 }
375 qdev_init_nofail(DEVICE(&s->emac));
365 sysbus_realize(SYS_BUS_DEVICE(&s->emac), &error_fatal);
376 sysbus_mmio_map(SYS_BUS_DEVICE(&s->emac), 0, s->memmap[AW_H3_EMAC]);
377 sysbus_connect_irq(SYS_BUS_DEVICE(&s->emac), 0,
378 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_EMAC));
379
380 /* Universal Serial Bus */
381 sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_EHCI0],
382 qdev_get_gpio_in(DEVICE(&s->gic),
383 AW_H3_GIC_SPI_EHCI0));

--- 33 unchanged lines hidden (view full) ---

417 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART2),
418 115200, serial_hd(2), DEVICE_NATIVE_ENDIAN);
419 /* UART3 */
420 serial_mm_init(get_system_memory(), s->memmap[AW_H3_UART3], 2,
421 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART3),
422 115200, serial_hd(3), DEVICE_NATIVE_ENDIAN);
423
424 /* DRAMC */
366 sysbus_mmio_map(SYS_BUS_DEVICE(&s->emac), 0, s->memmap[AW_H3_EMAC]);
367 sysbus_connect_irq(SYS_BUS_DEVICE(&s->emac), 0,
368 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_EMAC));
369
370 /* Universal Serial Bus */
371 sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_EHCI0],
372 qdev_get_gpio_in(DEVICE(&s->gic),
373 AW_H3_GIC_SPI_EHCI0));

--- 33 unchanged lines hidden (view full) ---

407 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART2),
408 115200, serial_hd(2), DEVICE_NATIVE_ENDIAN);
409 /* UART3 */
410 serial_mm_init(get_system_memory(), s->memmap[AW_H3_UART3], 2,
411 qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART3),
412 115200, serial_hd(3), DEVICE_NATIVE_ENDIAN);
413
414 /* DRAMC */
425 qdev_init_nofail(DEVICE(&s->dramc));
415 sysbus_realize(SYS_BUS_DEVICE(&s->dramc), &error_fatal);
426 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 0, s->memmap[AW_H3_DRAMCOM]);
427 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 1, s->memmap[AW_H3_DRAMCTL]);
428 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 2, s->memmap[AW_H3_DRAMPHY]);
429
430 /* RTC */
416 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 0, s->memmap[AW_H3_DRAMCOM]);
417 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 1, s->memmap[AW_H3_DRAMCTL]);
418 sysbus_mmio_map(SYS_BUS_DEVICE(&s->dramc), 2, s->memmap[AW_H3_DRAMPHY]);
419
420 /* RTC */
431 qdev_init_nofail(DEVICE(&s->rtc));
421 sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &error_fatal);
432 sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, s->memmap[AW_H3_RTC]);
433
434 /* Unimplemented devices */
435 for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
436 create_unimplemented_device(unimplemented[i].device_name,
437 unimplemented[i].base,
438 unimplemented[i].size);
439 }

--- 25 unchanged lines hidden ---
422 sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, s->memmap[AW_H3_RTC]);
423
424 /* Unimplemented devices */
425 for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
426 create_unimplemented_device(unimplemented[i].device_name,
427 unimplemented[i].base,
428 unimplemented[i].size);
429 }

--- 25 unchanged lines hidden ---