Re: [Qemu-devel] [PATCH v2 02/20] arm: add Faraday FUSBH200 EHCI controller

2013-01-27 Thread Kuo-Jung Su
Thanks, I'm working on it, and the new patch is susposed to be sent out
later.


2013/1/28 Andreas Färber 

> Am 25.01.2013 10:02, schrieb Gerd Hoffmann:
> >>> +static const MemoryRegionOps ehci_mmio_faraday_ops = {
> >>> +.read = ehci_faraday_read,
> >>> +.write = ehci_faraday_write,
> >>> +.valid.min_access_size = 4,
> >>> +.valid.max_access_size = 4,
> >>> +.endianness = DEVICE_LITTLE_ENDIAN,
> >>> +};
> >
> > This should go to hcd-ehci-sysbus.c
> >
> >>> +memory_region_init_io(&s->mem_faraday, &ehci_mmio_faraday_ops, s,
> >>> +  "faraday", 0x4c);
> >>
> >> I don't think this is good design... Can't you do the Faraday part from
> >> your own instance_init / initfn / realizefn function?
> >
> > Yes, please.  Just add your own usb_ehci_sysbus_${board}_initfn, call
> > usb_ehci_sysbus_initfn for the common stuff, then add your
> > hardware-specific memory region.
>
> I submitted a patch to facilitate this a little for you:
> http://patchwork.ozlabs.org/patch/215919/
>
> Andreas
>
> --
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
>



-- 
Best wishes,
Kuo-Jung Su


Re: [Qemu-devel] [PATCH v2 02/20] arm: add Faraday FUSBH200 EHCI controller

2013-01-27 Thread Andreas Färber
Am 25.01.2013 10:02, schrieb Gerd Hoffmann:
>>> +static const MemoryRegionOps ehci_mmio_faraday_ops = {
>>> +.read = ehci_faraday_read,
>>> +.write = ehci_faraday_write,
>>> +.valid.min_access_size = 4,
>>> +.valid.max_access_size = 4,
>>> +.endianness = DEVICE_LITTLE_ENDIAN,
>>> +};
> 
> This should go to hcd-ehci-sysbus.c
> 
>>> +memory_region_init_io(&s->mem_faraday, &ehci_mmio_faraday_ops, s,
>>> +  "faraday", 0x4c);
>>
>> I don't think this is good design... Can't you do the Faraday part from
>> your own instance_init / initfn / realizefn function?
> 
> Yes, please.  Just add your own usb_ehci_sysbus_${board}_initfn, call
> usb_ehci_sysbus_initfn for the common stuff, then add your
> hardware-specific memory region.

I submitted a patch to facilitate this a little for you:
http://patchwork.ozlabs.org/patch/215919/

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg



[Qemu-devel] [PATCH v2 02/20] arm: add Faraday FUSBH200 EHCI controller

2013-01-25 Thread Kuo-Jung Su
From: Kuo-Jung Su 

Faraday FUSBH200 is a one-port host controller for USB 2.0,
which is fully compliant with the USB 2.0 specification and
the Enhanced Host Controller Interface (EHCI) specification.
This host controller supports the HS/FS/LS transactions,
Isochronous/Interrupt/Control/Bulk transfers, and split/preamble
transaction for the hub. Without intervening by the software,
this host controller can deal with the transaction-based data
structure to offload the CPU and automatically transmit and receive
the data on the USB bus.

The native system bus of FUSBH200 is a PVCI 32-bit bus interface.
However, by using the wrappers, FUSBH200 can also support the AMBA
AHB 32-bit bus or RISC 8051 bus. The transceiver interface is UTMI+
level 3, which supports the HS/FS/LS device and HS/FS hub.

Signed-off-by: Kuo-Jung Su 
---
 .gitignore   |1 +
 hw/usb/hcd-ehci-sysbus.c |   23 +
 hw/usb/hcd-ehci.c|   51 ++
 hw/usb/hcd-ehci.h|   14 +++--
 4 files changed, 75 insertions(+), 14 deletions(-)

diff --git a/.gitignore b/.gitignore
index 53fe9c3..0fd6a51 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,7 @@ fsdev/virtfs-proxy-helper.pod
 .gdbinit
 *.a
 *.aux
+*.bak
 *.cp
 *.dvi
 *.exe
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index b68a66a..b1147f3 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -40,6 +40,8 @@ static int usb_ehci_sysbus_initfn(SysBusDevice *dev)
 
 s->capsbase = sec->capsbase;
 s->opregbase = sec->opregbase;
+s->portscbase = sec->portscbase;
+s->portnr = sec->portnr;
 s->dma = &dma_context_memory;
 
 usb_ehci_initfn(s, DEVICE(dev));
@@ -73,6 +75,8 @@ static void ehci_xlnx_class_init(ObjectClass *oc, void *data)
 
 sec->capsbase = 0x100;
 sec->opregbase = 0x140;
+sec->portscbase = 0x44;
+sec->portnr = NB_PORTS;
 }
 
 static const TypeInfo ehci_xlnx_type_info = {
@@ -87,6 +91,8 @@ static void ehci_exynos4210_class_init(ObjectClass *oc, void 
*data)
 
 sec->capsbase = 0x0;
 sec->opregbase = 0x10;
+sec->portscbase = 0x44;
+sec->portnr = NB_PORTS;
 }
 
 static const TypeInfo ehci_exynos4210_type_info = {
@@ -95,11 +101,28 @@ static const TypeInfo ehci_exynos4210_type_info = {
 .class_init= ehci_exynos4210_class_init,
 };
 
+static void ehci_faraday_class_init(ObjectClass *oc, void *data)
+{
+SysBusEHCIClass *sec = SYS_BUS_EHCI_CLASS(oc);
+
+sec->capsbase   = 0x00;
+sec->opregbase  = 0x10;
+sec->portscbase = 0x20;
+sec->portnr = 1;
+}
+
+static const TypeInfo ehci_faraday_type_info = {
+.name  = TYPE_FARADAY_EHCI,
+.parent= TYPE_SYS_BUS_EHCI,
+.class_init= ehci_faraday_class_init,
+};
+
 static void ehci_sysbus_register_types(void)
 {
 type_register_static(&ehci_type_info);
 type_register_static(&ehci_xlnx_type_info);
 type_register_static(&ehci_exynos4210_type_info);
+type_register_static(&ehci_faraday_type_info);
 }
 
 type_init(ehci_sysbus_register_types)
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
index 7040659..6e42086 100644
--- a/hw/usb/hcd-ehci.c
+++ b/hw/usb/hcd-ehci.c
@@ -10,7 +10,8 @@
  *
  * EHCI project was started by Mark Burkley, with contributions by
  * Niels de Vos.  David S. Ahern continued working on it.  Kevin Wolf,
- * Jan Kiszka and Vincent Palatin contributed bugfixes.
+ * Jan Kiszka and Vincent Palatin contributed bugfixes. Kuo-Jung Su
+ * contributed Faraday extension.
  *
  *
  * This library is free software; you can redistribute it and/or
@@ -988,7 +989,7 @@ static uint64_t ehci_port_read(void *ptr, hwaddr addr,
 uint32_t val;
 
 val = s->portsc[addr >> 2];
-trace_usb_ehci_portsc_read(addr + PORTSC_BEGIN, addr >> 2, val);
+trace_usb_ehci_portsc_read(addr + s->portscbase, addr >> 2, val);
 return val;
 }
 
@@ -1029,7 +1030,7 @@ static void ehci_port_write(void *ptr, hwaddr addr,
 uint32_t old = *portsc;
 USBDevice *dev = s->ports[port].dev;
 
-trace_usb_ehci_portsc_write(addr + PORTSC_BEGIN, addr >> 2, val);
+trace_usb_ehci_portsc_write(addr + s->portscbase, addr >> 2, val);
 
 /* Clear rwc bits */
 *portsc &= ~(val & PORTSC_RWC_MASK);
@@ -1062,7 +1063,7 @@ static void ehci_port_write(void *ptr, hwaddr addr,
 
 *portsc &= ~PORTSC_RO_MASK;
 *portsc |= val;
-trace_usb_ehci_portsc_change(addr + PORTSC_BEGIN, addr >> 2, *portsc, old);
+trace_usb_ehci_portsc_change(addr + s->portscbase, addr >> 2, *portsc, 
old);
 }
 
 static void ehci_opreg_write(void *ptr, hwaddr addr,
@@ -2501,6 +2502,35 @@ const VMStateDescription vmstate_ehci = {
 }
 };
 
+static uint64_t
+ehci_faraday_read(void *ptr, hwaddr addr, unsigned size)
+{
+hwaddr off = 0x34 + addr;
+
+switch (off) {
+case 0x34:  /* fusbh200: EOF/Async. Sleep Timer Register */
+return 0x0041;
+case 0x40:  /* fusbh200: Bus Monitor Control/Status Register

Re: [Qemu-devel] [PATCH v2 02/20] arm: add Faraday FUSBH200 EHCI controller

2013-01-25 Thread Gerd Hoffmann
  Hi,

>> +static uint64_t
>> +ehci_faraday_read(void *ptr, hwaddr addr, unsigned size)
>> +{
>> +hwaddr off = 0x34 + addr;
>> +
>> +switch (off) {
>> +case 0x34:  /* fusbh200: EOF/Async. Sleep Timer Register */
>> +return 0x0041;
>> +case 0x40:  /* fusbh200: Bus Monitor Control/Status Register */
>> +/* High-Speed, VBUS valid, interrupt level-high active */
>> +return (2 << 9) | (1 << 8) | (1 << 3);
>> +}
>> +
>> +return 0;
>> +}
>> +
>> +static void
>> +ehci_faraday_write(void *ptr, hwaddr addr, uint64_t val, unsigned size)
>> +{
>> +}
>> +
>> +static const MemoryRegionOps ehci_mmio_faraday_ops = {
>> +.read = ehci_faraday_read,
>> +.write = ehci_faraday_write,
>> +.valid.min_access_size = 4,
>> +.valid.max_access_size = 4,
>> +.endianness = DEVICE_LITTLE_ENDIAN,
>> +};

This should go to hcd-ehci-sysbus.c

>> +memory_region_init_io(&s->mem_faraday, &ehci_mmio_faraday_ops, s,
>> +  "faraday", 0x4c);
> 
> I don't think this is good design... Can't you do the Faraday part from
> your own instance_init / initfn / realizefn function?

Yes, please.  Just add your own usb_ehci_sysbus_${board}_initfn, call
usb_ehci_sysbus_initfn for the common stuff, then add your
hardware-specific memory region.

> The define -> class/state movements look fine to me as continuation of
> our previous effort. Optionally this patch could be split into two -
> preparing the fields and updating all define users, and then introduce
> your new model.

Agree, splitting would be nice: one patch making portbase + nports
runtime configurable, one patch adding the new ehci controller.

cheers,
  Gerd




Re: [Qemu-devel] [PATCH v2 02/20] arm: add Faraday FUSBH200 EHCI controller

2013-01-25 Thread Andreas Färber
Am 25.01.2013 09:19, schrieb Kuo-Jung Su:
> From: Kuo-Jung Su 
> 
> Faraday FUSBH200 is a one-port host controller for USB 2.0,
> which is fully compliant with the USB 2.0 specification and
> the Enhanced Host Controller Interface (EHCI) specification.
> This host controller supports the HS/FS/LS transactions,
> Isochronous/Interrupt/Control/Bulk transfers, and split/preamble
> transaction for the hub. Without intervening by the software,
> this host controller can deal with the transaction-based data
> structure to offload the CPU and automatically transmit and receive
> the data on the USB bus.
> 
> The native system bus of FUSBH200 is a PVCI 32-bit bus interface.
> However, by using the wrappers, FUSBH200 can also support the AMBA
> AHB 32-bit bus or RISC 8051 bus. The transceiver interface is UTMI+
> level 3, which supports the HS/FS/LS device and HS/FS hub.
> 
> Signed-off-by: Kuo-Jung Su 

Please CC all relevant maintainers, in this case Gerd Hoffmann for USB.
To automate this, you can use git-send-email's
--cccmd="scripts/get_maintainer.pl --nogit-fallback" argument (or config
option).

> ---
>  .gitignore   |1 +
>  hw/usb/hcd-ehci-sysbus.c |   23 +
>  hw/usb/hcd-ehci.c|   51 
> ++
>  hw/usb/hcd-ehci.h|   14 +++--
>  4 files changed, 75 insertions(+), 14 deletions(-)
> 
> diff --git a/.gitignore b/.gitignore
> index 53fe9c3..0fd6a51 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -55,6 +55,7 @@ fsdev/virtfs-proxy-helper.pod
>  .gdbinit
>  *.a
>  *.aux
> +*.bak
>  *.cp
>  *.dvi
>  *.exe

This hunk seems unrelated, please drop it from this series.

> diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
> index b68a66a..b1147f3 100644
> --- a/hw/usb/hcd-ehci-sysbus.c
> +++ b/hw/usb/hcd-ehci-sysbus.c
> @@ -40,6 +40,8 @@ static int usb_ehci_sysbus_initfn(SysBusDevice *dev)
>  
>  s->capsbase = sec->capsbase;
>  s->opregbase = sec->opregbase;
> +s->portscbase = sec->portscbase;
> +s->portnr = sec->portnr;

Since NB_PORTS in the max. number of ports, maybe you should assert that
here?

>  s->dma = &dma_context_memory;
>  
>  usb_ehci_initfn(s, DEVICE(dev));
> @@ -73,6 +75,8 @@ static void ehci_xlnx_class_init(ObjectClass *oc, void 
> *data)
>  
>  sec->capsbase = 0x100;
>  sec->opregbase = 0x140;
> +sec->portscbase = 0x44;
> +sec->portnr = NB_PORTS;
>  }
>  
>  static const TypeInfo ehci_xlnx_type_info = {
> @@ -87,6 +91,8 @@ static void ehci_exynos4210_class_init(ObjectClass *oc, 
> void *data)
>  
>  sec->capsbase = 0x0;
>  sec->opregbase = 0x10;
> +sec->portscbase = 0x44;
> +sec->portnr = NB_PORTS;
>  }
>  
>  static const TypeInfo ehci_exynos4210_type_info = {
> @@ -95,11 +101,28 @@ static const TypeInfo ehci_exynos4210_type_info = {
>  .class_init= ehci_exynos4210_class_init,
>  };
>  
> +static void ehci_faraday_class_init(ObjectClass *oc, void *data)
> +{
> +SysBusEHCIClass *sec = SYS_BUS_EHCI_CLASS(oc);
> +
> +sec->capsbase   = 0x00;
> +sec->opregbase  = 0x10;
> +sec->portscbase = 0x20;
> +sec->portnr = 1;
> +}
> +
> +static const TypeInfo ehci_faraday_type_info = {
> +.name  = TYPE_FARADAY_EHCI,
> +.parent= TYPE_SYS_BUS_EHCI,
> +.class_init= ehci_faraday_class_init,
> +};
> +
>  static void ehci_sysbus_register_types(void)
>  {
>  type_register_static(&ehci_type_info);
>  type_register_static(&ehci_xlnx_type_info);
>  type_register_static(&ehci_exynos4210_type_info);
> +type_register_static(&ehci_faraday_type_info);
>  }
>  
>  type_init(ehci_sysbus_register_types)
> diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
> index 7040659..6e42086 100644
> --- a/hw/usb/hcd-ehci.c
> +++ b/hw/usb/hcd-ehci.c
> @@ -10,7 +10,8 @@
>   *
>   * EHCI project was started by Mark Burkley, with contributions by
>   * Niels de Vos.  David S. Ahern continued working on it.  Kevin Wolf,
> - * Jan Kiszka and Vincent Palatin contributed bugfixes.
> + * Jan Kiszka and Vincent Palatin contributed bugfixes. Kuo-Jung Su
> + * contributed Faraday extension.
>   *
>   *
>   * This library is free software; you can redistribute it and/or
> @@ -988,7 +989,7 @@ static uint64_t ehci_port_read(void *ptr, hwaddr addr,
>  uint32_t val;
>  
>  val = s->portsc[addr >> 2];
> -trace_usb_ehci_portsc_read(addr + PORTSC_BEGIN, addr >> 2, val);
> +trace_usb_ehci_portsc_read(addr + s->portscbase, addr >> 2, val);
>  return val;
>  }
>  
> @@ -1029,7 +1030,7 @@ static void ehci_port_write(void *ptr, hwaddr addr,
>  uint32_t old = *portsc;
>  USBDevice *dev = s->ports[port].dev;
>  
> -trace_usb_ehci_portsc_write(addr + PORTSC_BEGIN, addr >> 2, val);
> +trace_usb_ehci_portsc_write(addr + s->portscbase, addr >> 2, val);
>  
>  /* Clear rwc bits */
>  *portsc &= ~(val & PORTSC_RWC_MASK);
> @@ -1062,7 +1063,7 @@ static void ehci_port_write(void *ptr, hwa