From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
To: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
Cc: "Francisco Eduardo Iglesias" <figlesia@xilinx.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Vikram Garhwal" <fnuv@xilinx.com>,
"Markus Armbruster" <armbru@redhat.com>,
qemu-devel@nongnu.org, "Edgar Iglesias" <edgari@xilinx.com>,
"Alistair Francis" <alistair.francis@wdc.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"'Marc-André Lureau'" <marcandre.lureau@redhat.com>,
"Ying Fang" <fangying1@huawei.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Paul Zimmerman" <pauldzim@gmail.com>,
"'Philippe Mathieu-Daudé'" <philmd@redhat.com>
Subject: Re: [PATCH v5 7/7] Versal: Connect DWC3 controller with virt-versal
Date: Fri, 11 Sep 2020 10:03:18 +0200 [thread overview]
Message-ID: <20200911080318.GQ14249@toto> (raw)
In-Reply-To: <1599719469-24062-8-git-send-email-sai.pavan.boddu@xilinx.com>
On Thu, Sep 10, 2020 at 12:01:09PM +0530, Sai Pavan Boddu wrote:
> From: Vikram Garhwal <fnu.vikram@xilinx.com>
>
> Connect dwc3 controller and usb2-reg module to virt-versal.
> Configure it as dual port host controller.
>
> Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
> Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
> ---
> hw/arm/xlnx-versal-virt.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
> hw/arm/xlnx-versal.c | 38 ++++++++++++++++++++++++++++
> include/hw/arm/xlnx-versal.h | 14 +++++++++++
> 3 files changed, 111 insertions(+)
>
> diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
> index 4b3152e..398693d 100644
> --- a/hw/arm/xlnx-versal-virt.c
> +++ b/hw/arm/xlnx-versal-virt.c
> @@ -39,6 +39,8 @@ typedef struct VersalVirt {
> uint32_t ethernet_phy[2];
> uint32_t clk_125Mhz;
> uint32_t clk_25Mhz;
> + uint32_t usb;
> + uint32_t dwc;
> } phandle;
> struct arm_boot_info binfo;
>
> @@ -66,6 +68,8 @@ static void fdt_create(VersalVirt *s)
> s->phandle.clk_25Mhz = qemu_fdt_alloc_phandle(s->fdt);
> s->phandle.clk_125Mhz = qemu_fdt_alloc_phandle(s->fdt);
>
> + s->phandle.usb = qemu_fdt_alloc_phandle(s->fdt);
> + s->phandle.dwc = qemu_fdt_alloc_phandle(s->fdt);
> /* Create /chosen node for load_dtb. */
> qemu_fdt_add_subnode(s->fdt, "/chosen");
>
> @@ -148,6 +152,60 @@ static void fdt_add_timer_nodes(VersalVirt *s)
> compat, sizeof(compat));
> }
>
> +static void fdt_add_usb_xhci_nodes(VersalVirt *s)
> +{
> + const char clocknames[] = "bus_clk\0ref_clk";
> + char *usb2name = g_strdup_printf("/usb@ff9d0000");
This string should be generated using the MM_USB2_REGS macro.
> + const char dwcCompat[] = "xlnx,versal-dwc3";
You can use compat[] as we do in other places here.
> + qemu_fdt_add_subnode(s->fdt, usb2name);
> + qemu_fdt_setprop(s->fdt, usb2name, "compatible",
> + dwcCompat, sizeof(dwcCompat));
> + qemu_fdt_setprop_sized_cells(s->fdt, usb2name, "reg",
> + 2, MM_USB2_REGS, 2, 0x100);
0x100 as size looks small, you've added a macro for it, why not use it?
> + qemu_fdt_setprop(s->fdt, usb2name, "clock-names",
> + clocknames, sizeof(clocknames));
> + qemu_fdt_setprop_cells(s->fdt, usb2name, "clocks",
> + s->phandle.clk_25Mhz, s->phandle.clk_125Mhz);
> + qemu_fdt_setprop(s->fdt, usb2name, "ranges", NULL, 0);
> + qemu_fdt_setprop_cell(s->fdt, usb2name, "#address-cells", 2);
> + qemu_fdt_setprop_cell(s->fdt, usb2name, "#size-cells", 2);
> + qemu_fdt_setprop_cell(s->fdt, usb2name, "phandle", s->phandle.usb);
> + g_free(usb2name);
> +
> + {
> + uint64_t addr = MM_USB_XHCI_0;
> + unsigned int irq = VERSAL_USB0_IRQ_0;
You're only using irq once? why not just use VERSAL_USB0_IRQ_0 directly?
> + const char compat[] = "snps,dwc3";
> + const char intName[] = "dwc_usb3";
I'd prefer interrupt_names[] or irq_names[].
> + uint32_t frameLen = 0x20;
Can't you just directly use 0x20 when setting the prop?
> +
> + char *name = g_strdup_printf("/usb@ff9d0000/dwc3@%" PRIx64, addr);
We shouldn't hard-code ff9d0000 here.
It also looks weird/wrong to have dwc3 as a subnode of usb like that.
> + qemu_fdt_add_subnode(s->fdt, name);
> + qemu_fdt_setprop(s->fdt, name, "compatible",
> + compat, sizeof(compat));
> + qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
> + 2, addr, 2, MM_USB_XHCI_SIZE_0);
> + qemu_fdt_setprop(s->fdt, name, "interrupt-names",
> + intName, sizeof(intName));
> + qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
> + GIC_FDT_IRQ_TYPE_SPI, irq,
> + GIC_FDT_IRQ_FLAGS_LEVEL_HI);
> + qemu_fdt_setprop_cell(s->fdt, name,
> + "snps,quirk-frame-length-adjustment",
> + frameLen);
> + qemu_fdt_setprop_cells(s->fdt, name, "#stream-id-cells", 1);
> + qemu_fdt_setprop_string(s->fdt, name, "dr_mode", "host");
> + qemu_fdt_setprop_string(s->fdt, name, "phy-names", "usb3-phy");
> + qemu_fdt_setprop(s->fdt, name, "snps,dis_u2_susphy_quirk", NULL, 0);
> + qemu_fdt_setprop(s->fdt, name, "snps,dis_u3_susphy_quirk", NULL, 0);
> + qemu_fdt_setprop(s->fdt, name, "snps,refclk_fladj", NULL, 0);
> + qemu_fdt_setprop(s->fdt, name, "snps,mask_phy_reset", NULL, 0);
> + qemu_fdt_setprop(s->fdt, name, "snps,usb3_lpm_capable", NULL, 0);
> + qemu_fdt_setprop_cell(s->fdt, name, "phandle", s->phandle.dwc);
> + qemu_fdt_setprop_string(s->fdt, name, "maximum-speed", "high-speed");
> + g_free(name);
> + }
> +}
> static void fdt_add_uart_nodes(VersalVirt *s)
> {
> uint64_t addrs[] = { MM_UART1, MM_UART0 };
> @@ -515,6 +573,7 @@ static void versal_virt_init(MachineState *machine)
> fdt_add_gic_nodes(s);
> fdt_add_timer_nodes(s);
> fdt_add_zdma_nodes(s);
> + fdt_add_usb_xhci_nodes(s);
> fdt_add_sd_nodes(s);
> fdt_add_rtc_node(s);
> fdt_add_cpu_nodes(s, psci_conduit);
> diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
> index e3aa4bd..9b241de 100644
> --- a/hw/arm/xlnx-versal.c
> +++ b/hw/arm/xlnx-versal.c
> @@ -145,6 +145,43 @@ static void versal_create_uarts(Versal *s, qemu_irq *pic)
> }
> }
>
> +static void versal_create_usbs(Versal *s, qemu_irq *pic)
> +{
> + char *name = g_strdup_printf("dwc3-0");
There's no need to allocate and format a constant string...
> + DeviceState *dev, *xhci_dev;
> + MemoryRegion *mr;
> +
> + object_initialize_child(OBJECT(s), name, &s->fpd.iou.dwc3,
> + TYPE_USB_DWC3);
> + dev = DEVICE(&s->fpd.iou.dwc3);
> + xhci_dev = DEVICE(&s->fpd.iou.dwc3.sysbus_xhci);
> +
> + object_property_set_link(OBJECT(xhci_dev), "dma", OBJECT(&s->mr_ps),
> + &error_abort);
> + qdev_prop_set_uint32(xhci_dev, "intrs", 1);
> + qdev_prop_set_uint32(xhci_dev, "slots", 2);
> +
> + sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
> +
> + mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
> + memory_region_add_subregion(&s->mr_ps, MM_USB_XHCI_0 + 0xC100 , mr);
> + mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(xhci_dev), 0);
> + memory_region_add_subregion(&s->mr_ps, MM_USB_XHCI_0, mr);
> +
> + sysbus_connect_irq(SYS_BUS_DEVICE(xhci_dev), 0, pic[VERSAL_USB0_IRQ_0]);
> + g_free(name);
> +
> + name = g_strdup_printf("usb2reg-0");
This one too.
> + object_initialize_child(OBJECT(s), name, &s->fpd.iou.Usb2Regs,
> + "xlnx.usb2_regs");
> + dev = DEVICE(&s->fpd.iou.Usb2Regs);
> + sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
> +
> + mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
> + memory_region_add_subregion(&s->mr_ps, MM_USB2_REGS, mr);
> + g_free(name);
> +}
> +
> static void versal_create_gems(Versal *s, qemu_irq *pic)
> {
> int i;
> @@ -332,6 +369,7 @@ static void versal_realize(DeviceState *dev, Error **errp)
> versal_create_apu_cpus(s);
> versal_create_apu_gic(s, pic);
> versal_create_uarts(s, pic);
> + versal_create_usbs(s, pic);
> versal_create_gems(s, pic);
> versal_create_admas(s, pic);
> versal_create_sds(s, pic);
> diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
> index 9c9f47b..e19cfd5 100644
> --- a/include/hw/arm/xlnx-versal.h
> +++ b/include/hw/arm/xlnx-versal.h
> @@ -20,6 +20,8 @@
> #include "hw/dma/xlnx-zdma.h"
> #include "hw/net/cadence_gem.h"
> #include "hw/rtc/xlnx-zynqmp-rtc.h"
> +#include "hw/usb/hcd-dwc3.h"
> +#include "hw/misc/xlnx-versal-usb2-regs.h"
>
> #define TYPE_XLNX_VERSAL "xlnx-versal"
> #define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
> @@ -42,6 +44,11 @@ typedef struct Versal {
> ARMCPU cpu[XLNX_VERSAL_NR_ACPUS];
> GICv3State gic;
> } apu;
> +
> + struct {
> + USBDWC3 dwc3;
> + XlnxUsb2Regs Usb2Regs;
> + } iou;
> } fpd;
>
> MemoryRegion mr_ps;
> @@ -87,6 +94,7 @@ typedef struct Versal {
>
> #define VERSAL_UART0_IRQ_0 18
> #define VERSAL_UART1_IRQ_0 19
> +#define VERSAL_USB0_IRQ_0 22
> #define VERSAL_GEM0_IRQ_0 56
> #define VERSAL_GEM0_WAKE_IRQ_0 57
> #define VERSAL_GEM1_IRQ_0 58
> @@ -124,6 +132,12 @@ typedef struct Versal {
> #define MM_OCM 0xfffc0000U
> #define MM_OCM_SIZE 0x40000
>
> +#define MM_USB2_REGS 0xFF9D0000
> +#define MM_USB2_SIZE 0x10000
> +
> +#define MM_USB_XHCI_0 0xFE200000
> +#define MM_USB_XHCI_SIZE_0 0x10000
> +
> #define MM_TOP_DDR 0x0
> #define MM_TOP_DDR_SIZE 0x80000000U
> #define MM_TOP_DDR_2 0x800000000ULL
> --
> 2.7.4
>
next prev parent reply other threads:[~2020-09-11 8:04 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-10 6:31 [PATCH v5 0/7] Make hcd-xhci independent of pci hooks Sai Pavan Boddu
2020-09-10 6:31 ` [PATCH v5 1/7] usb/hcd-xhci: Make dma read/writes hooks pci free Sai Pavan Boddu
2020-09-11 7:38 ` Edgar E. Iglesias
2020-09-10 6:31 ` [PATCH v5 2/7] usb/hcd-xhci: Move qemu-xhci device to hcd-xhci-pci.c Sai Pavan Boddu
2020-09-10 6:31 ` [PATCH v5 3/7] usb/hcd-xhci: Split pci wrapper for xhci base model Sai Pavan Boddu
2020-09-10 6:31 ` [PATCH v5 4/7] usb: hcd-xhci-sysbus: Attach xhci to sysbus device Sai Pavan Boddu
2020-09-10 6:31 ` [PATCH v5 5/7] misc: Add versal-usb2-regs module Sai Pavan Boddu
2020-09-11 8:08 ` Edgar E. Iglesias
2020-09-10 6:31 ` [PATCH v5 6/7] usb: Add DWC3 model Sai Pavan Boddu
2020-09-10 6:31 ` [PATCH v5 7/7] Versal: Connect DWC3 controller with virt-versal Sai Pavan Boddu
2020-09-11 8:03 ` Edgar E. Iglesias [this message]
2020-09-11 14:18 ` Sai Pavan Boddu
2020-09-15 13:14 ` [PATCH v5 0/7] Make hcd-xhci independent of pci hooks Gerd Hoffmann
2020-09-16 11:38 ` Sai Pavan Boddu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200911080318.GQ14249@toto \
--to=edgar.iglesias@xilinx.com \
--cc=alistair.francis@wdc.com \
--cc=armbru@redhat.com \
--cc=edgari@xilinx.com \
--cc=ehabkost@redhat.com \
--cc=fangying1@huawei.com \
--cc=figlesia@xilinx.com \
--cc=fnuv@xilinx.com \
--cc=kraxel@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pauldzim@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sai.pavan.boddu@xilinx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.