qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] arm: allwinner: Wire up USB ports
@ 2020-02-15  0:12 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
                   ` (3 more replies)
  0 siblings, 4 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

Instantiate EHCI and OHCI controllers on Allwinner A10.

The first patch in the series moves the declaration of EHCISysBusState
from hcd-ohci.c to hcd-ohci.h. This lets us add the structure to
AwA10State. Similar, TYPE_SYSBUS_OHCI is moved to be able to use it
outside its driver.

The second patch introduces the ehci-sysbus property "companion-enable".
This lets us use object_property_set_bool() to enable companion mode.

The third patch instantiates EHCI and OHCI ports for Allwinner-A10
and marks the OHCI ports as companions of the respective EHCI ports.

Tested by attaching various high speed and full speed devices, and by
booting from USB drive.

v2: Add summary
    Rewrite to instantiate OHCI in companion mode; add patch 2/3
    Merge EHCI and OHCI instantiation into a single patch

----------------------------------------------------------------
Guenter Roeck (3):
      hw: usb: hcd-ohci: Move OHCISysBusState and TYPE_SYSBUS_OHCI to include file
      hcd-ehci: Introduce "companion-enable" sysbus property
      arm: allwinner: Wire up USB ports

 hw/arm/allwinner-a10.c         | 43 ++++++++++++++++++++++++++++++++++++++++++
 hw/usb/hcd-ehci-sysbus.c       |  2 ++
 hw/usb/hcd-ohci.c              | 15 ---------------
 hw/usb/hcd-ohci.h              | 16 ++++++++++++++++
 include/hw/arm/allwinner-a10.h |  6 ++++++
 5 files changed, 67 insertions(+), 15 deletions(-)


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [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

* Re: [PATCH v2 0/3] arm: allwinner: Wire up USB ports
  2020-02-15  0:12 [PATCH v2 0/3] arm: allwinner: Wire up USB ports Guenter Roeck
                   ` (2 preceding siblings ...)
  2020-02-15  0:12 ` [PATCH v2 3/3] arm: allwinner: Wire up USB ports Guenter Roeck
@ 2020-02-17  8:21 ` Gerd Hoffmann
  3 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2020-02-17  8:21 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Beniamino Galvani, Peter Maydell, qemu-arm, qemu-devel

On Fri, Feb 14, 2020 at 04:12:45PM -0800, Guenter Roeck wrote:
> Instantiate EHCI and OHCI controllers on Allwinner A10.
> 
> The first patch in the series moves the declaration of EHCISysBusState
> from hcd-ohci.c to hcd-ohci.h. This lets us add the structure to
> AwA10State. Similar, TYPE_SYSBUS_OHCI is moved to be able to use it
> outside its driver.
> 
> The second patch introduces the ehci-sysbus property "companion-enable".
> This lets us use object_property_set_bool() to enable companion mode.
> 
> The third patch instantiates EHCI and OHCI ports for Allwinner-A10
> and marks the OHCI ports as companions of the respective EHCI ports.
> 
> Tested by attaching various high speed and full speed devices, and by
> booting from USB drive.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>

(assuming this is will be merged via arm queue)

cheers,
  Gerd



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 3/3] arm: allwinner: Wire up USB ports
  2020-02-15  0:12 ` [PATCH v2 3/3] arm: allwinner: Wire up USB ports Guenter Roeck
@ 2020-02-17 10:13   ` Peter Maydell
  2020-02-17 18:05     ` Guenter Roeck
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Maydell @ 2020-02-17 10:13 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Beniamino Galvani, qemu-arm, Gerd Hoffmann, QEMU Developers

On Sat, 15 Feb 2020 at 00:12, Guenter Roeck <linux@roeck-us.net> wrote:
>
> 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

Hi; I tried to apply this patchset, but it doesn't apply to master.
In particular, master doesn't have a #define for AW_A10_CCM_REG_BASE.

Is this patchset supposed to be based on some other patchset
you've already sent that's got lost in my mailbox?

thanks
-- PMM


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 3/3] arm: allwinner: Wire up USB ports
  2020-02-17 10:13   ` Peter Maydell
@ 2020-02-17 18:05     ` Guenter Roeck
  0 siblings, 0 replies; 7+ messages in thread
From: Guenter Roeck @ 2020-02-17 18:05 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Beniamino Galvani, qemu-arm, Gerd Hoffmann, QEMU Developers

On 2/17/20 2:13 AM, Peter Maydell wrote:
> On Sat, 15 Feb 2020 at 00:12, Guenter Roeck <linux@roeck-us.net> wrote:
>>
[ ... ]

> Hi; I tried to apply this patchset, but it doesn't apply to master.
> In particular, master doesn't have a #define for AW_A10_CCM_REG_BASE.
>  > Is this patchset supposed to be based on some other patchset
> you've already sent that's got lost in my mailbox?
> 

It is not supposed to be based on anything, but in practice it is because
I also carry a patch adding basic CCM support (which I completely forgot
and which I didn't send upstream because it is hackish).

Sorry for that. I'll rebase to master and resend.

Guenter


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-02-17 18:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH v2 3/3] arm: allwinner: Wire up USB ports Guenter Roeck
2020-02-17 10:13   ` Peter Maydell
2020-02-17 18:05     ` Guenter Roeck
2020-02-17  8:21 ` [PATCH v2 0/3] " Gerd Hoffmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).