2013-12-17 23:42:38 +04:00
|
|
|
/*
|
|
|
|
* Allwinner A10 SoC emulation
|
|
|
|
*
|
|
|
|
* Copyright (C) 2013 Li Guang
|
|
|
|
* Written by Li Guang <lig.fnst@cn.fujitsu.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the
|
|
|
|
* Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* for more details.
|
|
|
|
*/
|
|
|
|
|
2015-12-07 19:23:45 +03:00
|
|
|
#include "qemu/osdep.h"
|
2019-08-12 08:23:40 +03:00
|
|
|
#include "exec/address-spaces.h"
|
include/qemu/osdep.h: Don't include qapi/error.h
Commit 57cb38b included qapi/error.h into qemu/osdep.h to get the
Error typedef. Since then, we've moved to include qemu/osdep.h
everywhere. Its file comment explains: "To avoid getting into
possible circular include dependencies, this file should not include
any other QEMU headers, with the exceptions of config-host.h,
compiler.h, os-posix.h and os-win32.h, all of which are doing a
similar job to this file and are under similar constraints."
qapi/error.h doesn't do a similar job, and it doesn't adhere to
similar constraints: it includes qapi-types.h. That's in excess of
100KiB of crap most .c files don't actually need.
Add the typedef to qemu/typedefs.h, and include that instead of
qapi/error.h. Include qapi/error.h in .c files that need it and don't
get it now. Include qapi-types.h in qom/object.h for uint16List.
Update scripts/clean-includes accordingly. Update it further to match
reality: replace config.h by config-target.h, add sysemu/os-posix.h,
sysemu/os-win32.h. Update the list of includes in the qemu/osdep.h
comment quoted above similarly.
This reduces the number of objects depending on qapi/error.h from "all
of them" to less than a third. Unfortunately, the number depending on
qapi-types.h shrinks only a little. More work is needed for that one.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
[Fix compilation without the spice devel packages. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-03-14 11:01:28 +03:00
|
|
|
#include "qapi/error.h"
|
2019-05-23 17:35:07 +03:00
|
|
|
#include "qemu/module.h"
|
2016-01-19 23:51:44 +03:00
|
|
|
#include "cpu.h"
|
2013-12-17 23:42:38 +04:00
|
|
|
#include "hw/sysbus.h"
|
|
|
|
#include "hw/arm/allwinner-a10.h"
|
hw/arm/allwinner-a10: Add the 'A' SRAM and the SRAM controller
From the "A10 User Manual V1.20" p.29: "3.2. Memory Mapping" and:
7. System Control
7.1. Overview
A10 embeds a high-speed SRAM which has been split into five segments.
See detailed memory mapping in following table:
Area Address Size (Bytes)
A1 0x00000000-0x00003FFF 16K
A2 0x00004000-0x00007FFF 16K
A3 0x00008000-0x0000B3FF 13K
A4 0x0000B400-0x0000BFFF 3K
Since for emulation purpose we don't need the segmentations, we simply define
the 'A' area as a single 48KB SRAM.
We don't implement the following others areas:
- 'B': 'Secure RAM' (64K),
- 'C': Debug/ISP SRAM
- 'D': USB SRAM
(qemu) info mtree
address-space: memory
0000000000000000-ffffffffffffffff (prio 0, i/o): system
0000000000000000-000000000000bfff (prio 0, ram): sram A
0000000001c00000-0000000001c00fff (prio -1000, i/o): a10-sram-ctrl
0000000001c0b000-0000000001c0bfff (prio 0, i/o): aw_emac
0000000001c18000-0000000001c18fff (prio 0, i/o): ahci
0000000001c18080-0000000001c180ff (prio 0, i/o): allwinner-ahci
0000000001c20400-0000000001c207ff (prio 0, i/o): allwinner-a10-pic
0000000001c20c00-0000000001c20fff (prio 0, i/o): allwinner-A10-timer
0000000001c28000-0000000001c2801f (prio 0, i/o): serial
0000000040000000-0000000047ffffff (prio 0, ram): cubieboard.ram
Reported-by: Charlie Smurthwaite <charlie@atech.media>
Tested-by: Charlie Smurthwaite <charlie@atech.media>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 20190104142921.878-1-f4bug@amsat.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2019-01-07 18:23:47 +03:00
|
|
|
#include "hw/misc/unimp.h"
|
2019-08-12 08:23:57 +03:00
|
|
|
#include "sysemu/sysemu.h"
|
arm: allwinner: Wire up USB ports
Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
modeled as companions of the respective EHCI ports.
With this patch applied, USB controllers are discovered and instantiated
when booting the cubieboard machine with a recent Linux kernel.
ehci-platform 1c14000.usb: EHCI Host Controller
ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
ehci-platform 1c1c000.usb: EHCI Host Controller
ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
ohci-platform 1c14400.usb: Generic Platform OHCI controller
ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
ohci-platform 1c1c400.usb: Generic Platform OHCI controller
ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
usb 2-1: new high-speed USB device number 2 using ehci-platform
usb-storage 2-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 2-1:1.0
usb 3-1: new full-speed USB device number 2 using ohci-platform
input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
Message-id: 20200217204812.9857-4-linux@roeck-us.net
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-02-17 23:48:12 +03:00
|
|
|
#include "hw/boards.h"
|
|
|
|
#include "hw/usb/hcd-ohci.h"
|
2013-12-17 23:42:38 +04:00
|
|
|
|
2020-03-12 01:18:44 +03:00
|
|
|
#define AW_A10_MMC0_BASE 0x01c0f000
|
2020-01-17 17:09:30 +03:00
|
|
|
#define AW_A10_PIC_REG_BASE 0x01c20400
|
|
|
|
#define AW_A10_PIT_REG_BASE 0x01c20c00
|
|
|
|
#define AW_A10_UART0_REG_BASE 0x01c28000
|
|
|
|
#define AW_A10_EMAC_BASE 0x01c0b000
|
arm: allwinner: Wire up USB ports
Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
modeled as companions of the respective EHCI ports.
With this patch applied, USB controllers are discovered and instantiated
when booting the cubieboard machine with a recent Linux kernel.
ehci-platform 1c14000.usb: EHCI Host Controller
ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
ehci-platform 1c1c000.usb: EHCI Host Controller
ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
ohci-platform 1c14400.usb: Generic Platform OHCI controller
ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
ohci-platform 1c1c400.usb: Generic Platform OHCI controller
ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
usb 2-1: new high-speed USB device number 2 using ehci-platform
usb-storage 2-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 2-1:1.0
usb 3-1: new full-speed USB device number 2 using ohci-platform
input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
Message-id: 20200217204812.9857-4-linux@roeck-us.net
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-02-17 23:48:12 +03:00
|
|
|
#define AW_A10_EHCI_BASE 0x01c14000
|
|
|
|
#define AW_A10_OHCI_BASE 0x01c14400
|
2020-01-17 17:09:30 +03:00
|
|
|
#define AW_A10_SATA_BASE 0x01c18000
|
2020-03-12 01:18:48 +03:00
|
|
|
#define AW_A10_RTC_BASE 0x01c20d00
|
2020-01-17 17:09:30 +03:00
|
|
|
|
2013-12-17 23:42:38 +04:00
|
|
|
static void aw_a10_init(Object *obj)
|
|
|
|
{
|
|
|
|
AwA10State *s = AW_A10(obj);
|
|
|
|
|
2018-07-16 15:59:31 +03:00
|
|
|
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
|
2019-08-23 17:32:44 +03:00
|
|
|
ARM_CPU_TYPE_NAME("cortex-a8"),
|
|
|
|
&error_abort, NULL);
|
2013-12-17 23:42:38 +04:00
|
|
|
|
2018-07-16 15:59:31 +03:00
|
|
|
sysbus_init_child_obj(obj, "intc", &s->intc, sizeof(s->intc),
|
|
|
|
TYPE_AW_A10_PIC);
|
2013-12-17 23:42:38 +04:00
|
|
|
|
2018-07-16 15:59:31 +03:00
|
|
|
sysbus_init_child_obj(obj, "timer", &s->timer, sizeof(s->timer),
|
|
|
|
TYPE_AW_A10_PIT);
|
2014-01-31 02:02:07 +04:00
|
|
|
|
2018-07-16 15:59:31 +03:00
|
|
|
sysbus_init_child_obj(obj, "emac", &s->emac, sizeof(s->emac), TYPE_AW_EMAC);
|
2015-11-06 22:09:01 +03:00
|
|
|
|
2018-07-16 15:59:31 +03:00
|
|
|
sysbus_init_child_obj(obj, "sata", &s->sata, sizeof(s->sata),
|
|
|
|
TYPE_ALLWINNER_AHCI);
|
arm: allwinner: Wire up USB ports
Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
modeled as companions of the respective EHCI ports.
With this patch applied, USB controllers are discovered and instantiated
when booting the cubieboard machine with a recent Linux kernel.
ehci-platform 1c14000.usb: EHCI Host Controller
ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
ehci-platform 1c1c000.usb: EHCI Host Controller
ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
ohci-platform 1c14400.usb: Generic Platform OHCI controller
ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
ohci-platform 1c1c400.usb: Generic Platform OHCI controller
ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
usb 2-1: new high-speed USB device number 2 using ehci-platform
usb-storage 2-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 2-1:1.0
usb 3-1: new full-speed USB device number 2 using ohci-platform
input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
Message-id: 20200217204812.9857-4-linux@roeck-us.net
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-02-17 23:48:12 +03:00
|
|
|
|
|
|
|
if (machine_usb(current_machine)) {
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < AW_A10_NUM_USB; i++) {
|
|
|
|
sysbus_init_child_obj(obj, "ehci[*]", OBJECT(&s->ehci[i]),
|
|
|
|
sizeof(s->ehci[i]), TYPE_PLATFORM_EHCI);
|
|
|
|
sysbus_init_child_obj(obj, "ohci[*]", OBJECT(&s->ohci[i]),
|
|
|
|
sizeof(s->ohci[i]), TYPE_SYSBUS_OHCI);
|
|
|
|
}
|
|
|
|
}
|
2020-03-12 01:18:44 +03:00
|
|
|
|
|
|
|
sysbus_init_child_obj(obj, "mmc0", &s->mmc0, sizeof(s->mmc0),
|
|
|
|
TYPE_AW_SDHOST_SUN4I);
|
2020-03-12 01:18:48 +03:00
|
|
|
|
|
|
|
sysbus_init_child_obj(obj, "rtc", &s->rtc, sizeof(s->rtc),
|
|
|
|
TYPE_AW_RTC_SUN4I);
|
2013-12-17 23:42:38 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void aw_a10_realize(DeviceState *dev, Error **errp)
|
|
|
|
{
|
|
|
|
AwA10State *s = AW_A10(dev);
|
|
|
|
SysBusDevice *sysbusdev;
|
|
|
|
Error *err = NULL;
|
|
|
|
|
|
|
|
object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
|
|
|
|
if (err != NULL) {
|
|
|
|
error_propagate(errp, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
object_property_set_bool(OBJECT(&s->intc), true, "realized", &err);
|
|
|
|
if (err != NULL) {
|
|
|
|
error_propagate(errp, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sysbusdev = SYS_BUS_DEVICE(&s->intc);
|
|
|
|
sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE);
|
2020-01-17 17:09:30 +03:00
|
|
|
sysbus_connect_irq(sysbusdev, 0,
|
|
|
|
qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
|
|
|
|
sysbus_connect_irq(sysbusdev, 1,
|
|
|
|
qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
|
2020-01-17 17:09:30 +03:00
|
|
|
qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
|
2013-12-17 23:42:38 +04:00
|
|
|
|
|
|
|
object_property_set_bool(OBJECT(&s->timer), true, "realized", &err);
|
|
|
|
if (err != NULL) {
|
|
|
|
error_propagate(errp, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sysbusdev = SYS_BUS_DEVICE(&s->timer);
|
|
|
|
sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE);
|
2020-01-17 17:09:30 +03:00
|
|
|
sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 22));
|
|
|
|
sysbus_connect_irq(sysbusdev, 1, qdev_get_gpio_in(dev, 23));
|
|
|
|
sysbus_connect_irq(sysbusdev, 2, qdev_get_gpio_in(dev, 24));
|
|
|
|
sysbus_connect_irq(sysbusdev, 3, qdev_get_gpio_in(dev, 25));
|
|
|
|
sysbus_connect_irq(sysbusdev, 4, qdev_get_gpio_in(dev, 67));
|
|
|
|
sysbus_connect_irq(sysbusdev, 5, qdev_get_gpio_in(dev, 68));
|
2013-12-17 23:42:38 +04:00
|
|
|
|
hw/arm/allwinner-a10: Add the 'A' SRAM and the SRAM controller
From the "A10 User Manual V1.20" p.29: "3.2. Memory Mapping" and:
7. System Control
7.1. Overview
A10 embeds a high-speed SRAM which has been split into five segments.
See detailed memory mapping in following table:
Area Address Size (Bytes)
A1 0x00000000-0x00003FFF 16K
A2 0x00004000-0x00007FFF 16K
A3 0x00008000-0x0000B3FF 13K
A4 0x0000B400-0x0000BFFF 3K
Since for emulation purpose we don't need the segmentations, we simply define
the 'A' area as a single 48KB SRAM.
We don't implement the following others areas:
- 'B': 'Secure RAM' (64K),
- 'C': Debug/ISP SRAM
- 'D': USB SRAM
(qemu) info mtree
address-space: memory
0000000000000000-ffffffffffffffff (prio 0, i/o): system
0000000000000000-000000000000bfff (prio 0, ram): sram A
0000000001c00000-0000000001c00fff (prio -1000, i/o): a10-sram-ctrl
0000000001c0b000-0000000001c0bfff (prio 0, i/o): aw_emac
0000000001c18000-0000000001c18fff (prio 0, i/o): ahci
0000000001c18080-0000000001c180ff (prio 0, i/o): allwinner-ahci
0000000001c20400-0000000001c207ff (prio 0, i/o): allwinner-a10-pic
0000000001c20c00-0000000001c20fff (prio 0, i/o): allwinner-A10-timer
0000000001c28000-0000000001c2801f (prio 0, i/o): serial
0000000040000000-0000000047ffffff (prio 0, ram): cubieboard.ram
Reported-by: Charlie Smurthwaite <charlie@atech.media>
Tested-by: Charlie Smurthwaite <charlie@atech.media>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 20190104142921.878-1-f4bug@amsat.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2019-01-07 18:23:47 +03:00
|
|
|
memory_region_init_ram(&s->sram_a, OBJECT(dev), "sram A", 48 * KiB,
|
|
|
|
&error_fatal);
|
|
|
|
memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a);
|
|
|
|
create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB);
|
|
|
|
|
hw/arm/allwinner-a10: Do not use nd_table in instance_init function
The instance_init function of a device can be called at any time, even
if the device is not going to be used (i.e. not going to be realized).
So a instance_init function must not do things that could cause QEMU
to exit, like calling qemu_check_nic_model(&nd_table[0], ...) for example.
But this is what the instance_init function of the allwinner-a10 device
is currently doing - and this causes QEMU to quit unexpectedly when
you run the 'device-list-properties' QMP command for example:
$ echo "{'execute':'qmp_capabilities'}"\
"{'execute':'device-list-properties',"\
" 'arguments':{'typename':'allwinner-a10'}}" \
| arm-softmmu/qemu-system-arm -M mps2-an505,accel=qtest -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
"package": "build-all"}, "capabilities": []}}
{"return": {}}
Unsupported NIC model: lan9118
... and QEMU quits after printing the last line (which should not happen
just because of running 'device-list-properties' here).
And with the cubieboard, this even causes QEMU to abort():
$ echo "{'execute':'qmp_capabilities'}"\
"{'execute':'device-list-properties',"\
" 'arguments':{'typename':'allwinner-a10'}}" \
| arm-softmmu/qemu-system-arm -M cubieboard,accel=qtest -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
"package": "build-all"}, "capabilities": []}}
{"return": {}}
Unexpected error in error_set_from_qdev_prop_error() at hw/core/qdev-properties.c:1095:
Property 'allwinner-emac.netdev' can't take value 'hub0port0', it's in use
Aborted (core dumped)
To fix the problem we've got to move the offending code to the realize
function instead.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-id: 1522862420-7484-1-git-send-email-thuth@redhat.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2018-04-10 15:02:25 +03:00
|
|
|
/* FIXME use qdev NIC properties instead of nd_table[] */
|
|
|
|
if (nd_table[0].used) {
|
|
|
|
qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
|
|
|
|
qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
|
|
|
|
}
|
2014-01-31 02:02:07 +04:00
|
|
|
object_property_set_bool(OBJECT(&s->emac), true, "realized", &err);
|
|
|
|
if (err != NULL) {
|
|
|
|
error_propagate(errp, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sysbusdev = SYS_BUS_DEVICE(&s->emac);
|
|
|
|
sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
|
2020-01-17 17:09:30 +03:00
|
|
|
sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55));
|
2014-01-31 02:02:07 +04:00
|
|
|
|
2015-11-06 22:09:01 +03:00
|
|
|
object_property_set_bool(OBJECT(&s->sata), true, "realized", &err);
|
|
|
|
if (err) {
|
|
|
|
error_propagate(errp, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
|
2020-01-17 17:09:30 +03:00
|
|
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0, qdev_get_gpio_in(dev, 56));
|
2015-11-06 22:09:01 +03:00
|
|
|
|
2018-04-20 17:52:43 +03:00
|
|
|
/* FIXME use a qdev chardev prop instead of serial_hd() */
|
2020-01-17 17:09:30 +03:00
|
|
|
serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2,
|
|
|
|
qdev_get_gpio_in(dev, 1),
|
2018-04-20 17:52:43 +03:00
|
|
|
115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
|
arm: allwinner: Wire up USB ports
Instantiate EHCI and OHCI controllers on Allwinner A10. OHCI ports are
modeled as companions of the respective EHCI ports.
With this patch applied, USB controllers are discovered and instantiated
when booting the cubieboard machine with a recent Linux kernel.
ehci-platform 1c14000.usb: EHCI Host Controller
ehci-platform 1c14000.usb: new USB bus registered, assigned bus number 1
ehci-platform 1c14000.usb: irq 26, io mem 0x01c14000
ehci-platform 1c14000.usb: USB 2.0 started, EHCI 1.00
ehci-platform 1c1c000.usb: EHCI Host Controller
ehci-platform 1c1c000.usb: new USB bus registered, assigned bus number 2
ehci-platform 1c1c000.usb: irq 31, io mem 0x01c1c000
ehci-platform 1c1c000.usb: USB 2.0 started, EHCI 1.00
ohci-platform 1c14400.usb: Generic Platform OHCI controller
ohci-platform 1c14400.usb: new USB bus registered, assigned bus number 3
ohci-platform 1c14400.usb: irq 27, io mem 0x01c14400
ohci-platform 1c1c400.usb: Generic Platform OHCI controller
ohci-platform 1c1c400.usb: new USB bus registered, assigned bus number 4
ohci-platform 1c1c400.usb: irq 32, io mem 0x01c1c400
usb 2-1: new high-speed USB device number 2 using ehci-platform
usb-storage 2-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 2-1:1.0
usb 3-1: new full-speed USB device number 2 using ohci-platform
input: QEMU QEMU USB Mouse as /devices/platform/soc/1c14400.usb/usb3/3-1/3-1:1.0/0003:0627:0001.0001/input/input0
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
Message-id: 20200217204812.9857-4-linux@roeck-us.net
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2020-02-17 23:48:12 +03:00
|
|
|
|
|
|
|
if (machine_usb(current_machine)) {
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < AW_A10_NUM_USB; i++) {
|
|
|
|
char bus[16];
|
|
|
|
|
|
|
|
sprintf(bus, "usb-bus.%d", i);
|
|
|
|
|
|
|
|
object_property_set_bool(OBJECT(&s->ehci[i]), true,
|
|
|
|
"companion-enable", &error_fatal);
|
|
|
|
object_property_set_bool(OBJECT(&s->ehci[i]), true, "realized",
|
|
|
|
&error_fatal);
|
|
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
|
|
|
|
AW_A10_EHCI_BASE + i * 0x8000);
|
|
|
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
|
|
|
|
qdev_get_gpio_in(dev, 39 + i));
|
|
|
|
|
|
|
|
object_property_set_str(OBJECT(&s->ohci[i]), bus, "masterbus",
|
|
|
|
&error_fatal);
|
|
|
|
object_property_set_bool(OBJECT(&s->ohci[i]), true, "realized",
|
|
|
|
&error_fatal);
|
|
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci[i]), 0,
|
|
|
|
AW_A10_OHCI_BASE + i * 0x8000);
|
|
|
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->ohci[i]), 0,
|
|
|
|
qdev_get_gpio_in(dev, 64 + i));
|
|
|
|
}
|
|
|
|
}
|
2020-03-12 01:18:44 +03:00
|
|
|
|
|
|
|
/* SD/MMC */
|
|
|
|
qdev_init_nofail(DEVICE(&s->mmc0));
|
|
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, AW_A10_MMC0_BASE);
|
|
|
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0, qdev_get_gpio_in(dev, 32));
|
|
|
|
object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->mmc0),
|
|
|
|
"sd-bus", &error_abort);
|
2020-03-12 01:18:48 +03:00
|
|
|
|
|
|
|
/* RTC */
|
|
|
|
qdev_init_nofail(DEVICE(&s->rtc));
|
|
|
|
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->rtc), 0, AW_A10_RTC_BASE, 10);
|
2013-12-17 23:42:38 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void aw_a10_class_init(ObjectClass *oc, void *data)
|
|
|
|
{
|
|
|
|
DeviceClass *dc = DEVICE_CLASS(oc);
|
|
|
|
|
|
|
|
dc->realize = aw_a10_realize;
|
hw/arm/allwinner-a10: Do not use nd_table in instance_init function
The instance_init function of a device can be called at any time, even
if the device is not going to be used (i.e. not going to be realized).
So a instance_init function must not do things that could cause QEMU
to exit, like calling qemu_check_nic_model(&nd_table[0], ...) for example.
But this is what the instance_init function of the allwinner-a10 device
is currently doing - and this causes QEMU to quit unexpectedly when
you run the 'device-list-properties' QMP command for example:
$ echo "{'execute':'qmp_capabilities'}"\
"{'execute':'device-list-properties',"\
" 'arguments':{'typename':'allwinner-a10'}}" \
| arm-softmmu/qemu-system-arm -M mps2-an505,accel=qtest -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
"package": "build-all"}, "capabilities": []}}
{"return": {}}
Unsupported NIC model: lan9118
... and QEMU quits after printing the last line (which should not happen
just because of running 'device-list-properties' here).
And with the cubieboard, this even causes QEMU to abort():
$ echo "{'execute':'qmp_capabilities'}"\
"{'execute':'device-list-properties',"\
" 'arguments':{'typename':'allwinner-a10'}}" \
| arm-softmmu/qemu-system-arm -M cubieboard,accel=qtest -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
"package": "build-all"}, "capabilities": []}}
{"return": {}}
Unexpected error in error_set_from_qdev_prop_error() at hw/core/qdev-properties.c:1095:
Property 'allwinner-emac.netdev' can't take value 'hub0port0', it's in use
Aborted (core dumped)
To fix the problem we've got to move the offending code to the realize
function instead.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-id: 1522862420-7484-1-git-send-email-thuth@redhat.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2018-04-10 15:02:25 +03:00
|
|
|
/* Reason: Uses serial_hds and nd_table in realize function */
|
2017-09-07 15:54:51 +03:00
|
|
|
dc->user_creatable = false;
|
2013-12-17 23:42:38 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static const TypeInfo aw_a10_type_info = {
|
|
|
|
.name = TYPE_AW_A10,
|
|
|
|
.parent = TYPE_DEVICE,
|
|
|
|
.instance_size = sizeof(AwA10State),
|
|
|
|
.instance_init = aw_a10_init,
|
|
|
|
.class_init = aw_a10_class_init,
|
|
|
|
};
|
|
|
|
|
|
|
|
static void aw_a10_register_types(void)
|
|
|
|
{
|
|
|
|
type_register_static(&aw_a10_type_info);
|
|
|
|
}
|
|
|
|
|
|
|
|
type_init(aw_a10_register_types)
|