* [PATCH v2 1/3] hw: usb: hcd-ohci: Move OHCISysBusState and TYPE_SYSBUS_OHCI to include file
2020-02-15 0:12 [PATCH v2 0/3] arm: allwinner: Wire up USB ports Guenter Roeck
@ 2020-02-15 0:12 ` Guenter Roeck
2020-02-15 0:12 ` [PATCH v2 2/3] hcd-ehci: Introduce "companion-enable" sysbus property Guenter Roeck
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Guenter Roeck @ 2020-02-15 0:12 UTC (permalink / raw)
To: Peter Maydell, Gerd Hoffmann
Cc: Beniamino Galvani, qemu-arm, qemu-devel, Guenter Roeck
We need to be able to use OHCISysBusState outside hcd-ohci.c, so move it
to its include file.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2: no changes
hw/usb/hcd-ohci.c | 15 ---------------
hw/usb/hcd-ohci.h | 16 ++++++++++++++++
2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 8a94bd004a..1e6e85e86a 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1870,21 +1870,6 @@ void ohci_sysbus_die(struct OHCIState *ohci)
ohci_bus_stop(ohci);
}
-#define TYPE_SYSBUS_OHCI "sysbus-ohci"
-#define SYSBUS_OHCI(obj) OBJECT_CHECK(OHCISysBusState, (obj), TYPE_SYSBUS_OHCI)
-
-typedef struct {
- /*< private >*/
- SysBusDevice parent_obj;
- /*< public >*/
-
- OHCIState ohci;
- char *masterbus;
- uint32_t num_ports;
- uint32_t firstport;
- dma_addr_t dma_offset;
-} OHCISysBusState;
-
static void ohci_realize_pxa(DeviceState *dev, Error **errp)
{
OHCISysBusState *s = SYSBUS_OHCI(dev);
diff --git a/hw/usb/hcd-ohci.h b/hw/usb/hcd-ohci.h
index 16e3f1e13a..5c8819aedf 100644
--- a/hw/usb/hcd-ohci.h
+++ b/hw/usb/hcd-ohci.h
@@ -22,6 +22,7 @@
#define HCD_OHCI_H
#include "sysemu/dma.h"
+#include "hw/usb.h"
/* Number of Downstream Ports on the root hub: */
#define OHCI_MAX_PORTS 15
@@ -90,6 +91,21 @@ typedef struct OHCIState {
void (*ohci_die)(struct OHCIState *ohci);
} OHCIState;
+#define TYPE_SYSBUS_OHCI "sysbus-ohci"
+#define SYSBUS_OHCI(obj) OBJECT_CHECK(OHCISysBusState, (obj), TYPE_SYSBUS_OHCI)
+
+typedef struct {
+ /*< private >*/
+ SysBusDevice parent_obj;
+ /*< public >*/
+
+ OHCIState ohci;
+ char *masterbus;
+ uint32_t num_ports;
+ uint32_t firstport;
+ dma_addr_t dma_offset;
+} OHCISysBusState;
+
extern const VMStateDescription vmstate_ohci_state;
void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports,
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/3] hcd-ehci: Introduce "companion-enable" sysbus property
2020-02-15 0:12 [PATCH v2 0/3] arm: allwinner: Wire up USB ports Guenter Roeck
2020-02-15 0:12 ` [PATCH v2 1/3] hw: usb: hcd-ohci: Move OHCISysBusState and TYPE_SYSBUS_OHCI to include file Guenter Roeck
@ 2020-02-15 0:12 ` Guenter Roeck
2020-02-15 0:12 ` [PATCH v2 3/3] arm: allwinner: Wire up USB ports Guenter Roeck
2020-02-17 8:21 ` [PATCH v2 0/3] " Gerd Hoffmann
3 siblings, 0 replies; 7+ messages in thread
From: Guenter Roeck @ 2020-02-15 0:12 UTC (permalink / raw)
To: Peter Maydell, Gerd Hoffmann
Cc: Beniamino Galvani, qemu-arm, qemu-devel, Guenter Roeck
We'll use this property in a follow-up patch to insantiate an EHCI
bus with companion support.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2: Added patch
hw/usb/hcd-ehci-sysbus.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index b5a014f968..014ad3d552 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -33,6 +33,8 @@ static const VMStateDescription vmstate_ehci_sysbus = {
static Property ehci_sysbus_properties[] = {
DEFINE_PROP_UINT32("maxframes", EHCISysBusState, ehci.maxframes, 128),
+ DEFINE_PROP_BOOL("companion-enable", EHCISysBusState, ehci.companion_enable,
+ false),
DEFINE_PROP_END_OF_LIST(),
};
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/3] arm: allwinner: Wire up USB ports
2020-02-15 0:12 [PATCH v2 0/3] arm: allwinner: Wire up USB ports Guenter Roeck
2020-02-15 0:12 ` [PATCH v2 1/3] hw: usb: hcd-ohci: Move OHCISysBusState and TYPE_SYSBUS_OHCI to include file Guenter Roeck
2020-02-15 0:12 ` [PATCH v2 2/3] hcd-ehci: Introduce "companion-enable" sysbus property Guenter Roeck
@ 2020-02-15 0:12 ` Guenter Roeck
2020-02-17 10:13 ` Peter Maydell
2020-02-17 8:21 ` [PATCH v2 0/3] " Gerd Hoffmann
3 siblings, 1 reply; 7+ messages in thread
From: Guenter Roeck @ 2020-02-15 0:12 UTC (permalink / raw)
To: Peter Maydell, Gerd Hoffmann
Cc: Beniamino Galvani, qemu-arm, qemu-devel, Guenter Roeck
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
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2: Instantiate EHCI and OHCI in a single patch
Use define instead of ARRAY_SIZE to get the number of USB ports
Instantiate OHCI in companion mode
Use &error_fatal to handle error conditions
hw/arm/allwinner-a10.c | 43 ++++++++++++++++++++++++++++++++++
include/hw/arm/allwinner-a10.h | 6 +++++
2 files changed, 49 insertions(+)
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 45cd8d2db5..57275c92f5 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -24,12 +24,16 @@
#include "hw/arm/allwinner-a10.h"
#include "hw/misc/unimp.h"
#include "sysemu/sysemu.h"
+#include "hw/boards.h"
+#include "hw/usb/hcd-ohci.h"
#define AW_A10_CCM_REG_BASE 0x01c20000
#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
+#define AW_A10_EHCI_BASE 0x01c14000
+#define AW_A10_OHCI_BASE 0x01c14400
#define AW_A10_SATA_BASE 0x01c18000
static void aw_a10_init(Object *obj)
@@ -53,6 +57,17 @@ static void aw_a10_init(Object *obj)
sysbus_init_child_obj(obj, "sata", &s->sata, sizeof(s->sata),
TYPE_ALLWINNER_AHCI);
+
+ 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);
+ }
+ }
}
static void aw_a10_realize(DeviceState *dev, Error **errp)
@@ -133,6 +148,34 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2,
qdev_get_gpio_in(dev, 1),
115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
+
+ 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));
+ }
+ }
}
static void aw_a10_class_init(ObjectClass *oc, void *data)
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
index 0007a927bb..12ca731cb2 100644
--- a/include/hw/arm/allwinner-a10.h
+++ b/include/hw/arm/allwinner-a10.h
@@ -9,11 +9,15 @@
#include "hw/intc/allwinner-a10-pic.h"
#include "hw/net/allwinner_emac.h"
#include "hw/ide/ahci.h"
+#include "hw/usb/hcd-ohci.h"
+#include "hw/usb/hcd-ehci.h"
#include "target/arm/cpu.h"
#define AW_A10_SDRAM_BASE 0x40000000
+#define AW_A10_NUM_USB 2
+
#define TYPE_AW_A10 "allwinner-a10"
#define AW_A10(obj) OBJECT_CHECK(AwA10State, (obj), TYPE_AW_A10)
@@ -29,6 +33,8 @@ typedef struct AwA10State {
AwEmacState emac;
AllwinnerAHCIState sata;
MemoryRegion sram_a;
+ EHCISysBusState ehci[AW_A10_NUM_USB];
+ OHCISysBusState ohci[AW_A10_NUM_USB];
} AwA10State;
#endif
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread