Message ID | 1603369056-4168-2-git-send-email-sai.pavan.boddu@xilinx.com |
---|---|
State | Superseded |
Headers | show |
Series | Add Versal usb model | expand |
On Thu, 22 Oct 2020 at 13:11, Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> wrote: > > This module emulates control registers of versal usb2 controller, this is added > just to make guest happy. In general this module would control the phy-reset > signal from usb controller, data coherency of the transactions, signals > the host system errors received from controller. > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com> > --- > hw/misc/meson.build | 1 + > hw/misc/xlnx-versal-usb2-ctrl-regs.c | 229 +++++++++++++++++++++++++++ > include/hw/misc/xlnx-versal-usb2-ctrl-regs.h | 45 ++++++ This seems a bit odd. If it's a USB device (or part of a USB device) then it should be under hw/usb, shouldn't it? > +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) > +{ > + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque); > + /* > + * TODO: This should also clear USBSTS.HSE field in USB XHCI register. > + * May be combine both the modules. > + */ What does the hardware for this look like? You've modelled it as two completely separate devices (this one and the TYPE_USB_DWC3) but would it be closer to the hardware structure to have a top-level device which has-a DWC3 ? thanks -- PMM
Hi Peter, > -----Original Message----- > From: Peter Maydell <peter.maydell@linaro.org> > Sent: Monday, October 26, 2020 9:33 PM > To: Sai Pavan Boddu <saipava@xilinx.com> > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers <qemu- > devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; Eduardo > Habkost <ehabkost@redhat.com>; Ying Fang <fangying1@huawei.com>; > Philippe Mathieu-Daudé <philmd@redhat.com>; Vikram Garhwal > <fnuv@xilinx.com>; Paul Zimmerman <pauldzim@gmail.com>; Sai Pavan Boddu > <saipava@xilinx.com> > Subject: Re: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > On Thu, 22 Oct 2020 at 13:11, Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > wrote: > > > > This module emulates control registers of versal usb2 controller, this > > is added just to make guest happy. In general this module would > > control the phy-reset signal from usb controller, data coherency of > > the transactions, signals the host system errors received from controller. > > > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > > Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com> > > --- > > hw/misc/meson.build | 1 + > > hw/misc/xlnx-versal-usb2-ctrl-regs.c | 229 > +++++++++++++++++++++++++++ > > include/hw/misc/xlnx-versal-usb2-ctrl-regs.h | 45 ++++++ > > This seems a bit odd. If it's a USB device (or part of a USB > device) then it should be under hw/usb, shouldn't it? [Sai Pavan Boddu] This is a top level wrapper over hcd-dwc3 device, which is specific to versal soc. It's mostly dummy which controls the phy-reset and does frame length adjustments. It was added just to make guest happy, that is the reason it has been added to misc devices. > > > +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) { > > + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque); > > + /* > > + * TODO: This should also clear USBSTS.HSE field in USB XHCI register. > > + * May be combine both the modules. > > + */ > > What does the hardware for this look like? You've modelled it as two > completely separate devices (this one and the > TYPE_USB_DWC3) but would it be closer to the hardware structure to have a > top-level device which has-a DWC3 ? [Sai Pavan Boddu] Yes, we can look at it such way. But as its specific to versal SOC, we have crafted it out and stitched them in SOC file. Regards, Sai Pavan > > thanks > -- PMM
Hi Peter, > -----Original Message----- > From: Sai Pavan Boddu > Sent: Monday, October 26, 2020 10:59 PM > To: Peter Maydell <peter.maydell@linaro.org> > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers <qemu- > devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; Eduardo > Habkost <ehabkost@redhat.com>; Ying Fang <fangying1@huawei.com>; > Philippe Mathieu-Daudé <philmd@redhat.com>; Vikram Garhwal > <fnuv@xilinx.com>; Paul Zimmerman <pauldzim@gmail.com> > Subject: RE: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > Hi Peter, > > > -----Original Message----- > > From: Peter Maydell <peter.maydell@linaro.org> > > Sent: Monday, October 26, 2020 9:33 PM > > To: Sai Pavan Boddu <saipava@xilinx.com> > > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers > > <qemu- devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; > > Eduardo Habkost <ehabkost@redhat.com>; Ying Fang > > <fangying1@huawei.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; > > Vikram Garhwal <fnuv@xilinx.com>; Paul Zimmerman > <pauldzim@gmail.com>; > > Sai Pavan Boddu <saipava@xilinx.com> > > Subject: Re: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > > > On Thu, 22 Oct 2020 at 13:11, Sai Pavan Boddu > > <sai.pavan.boddu@xilinx.com> > > wrote: > > > > > > This module emulates control registers of versal usb2 controller, > > > this is added just to make guest happy. In general this module would > > > control the phy-reset signal from usb controller, data coherency of > > > the transactions, signals the host system errors received from controller. > > > > > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > > > Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com> > > > --- > > > hw/misc/meson.build | 1 + > > > hw/misc/xlnx-versal-usb2-ctrl-regs.c | 229 > > +++++++++++++++++++++++++++ > > > include/hw/misc/xlnx-versal-usb2-ctrl-regs.h | 45 ++++++ > > > > This seems a bit odd. If it's a USB device (or part of a USB > > device) then it should be under hw/usb, shouldn't it? > [Sai Pavan Boddu] This is a top level wrapper over hcd-dwc3 device, which is > specific to versal soc. It's mostly dummy which controls the phy-reset and does > frame length adjustments. It was added just to make guest happy, that is the > reason it has been added to misc devices. > > > > > +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) { > > > + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg- > >opaque); > > > + /* > > > + * TODO: This should also clear USBSTS.HSE field in USB XHCI register. > > > + * May be combine both the modules. > > > + */ > > > > What does the hardware for this look like? You've modelled it as two > > completely separate devices (this one and the > > TYPE_USB_DWC3) but would it be closer to the hardware structure to > > have a top-level device which has-a DWC3 ? > [Sai Pavan Boddu] Yes, we can look at it such way. But as its specific to versal > SOC, we have crafted it out and stitched them in SOC file. > > Regards, > Sai Pavan [Sai Pavan Boddu] I would be sending V13 without doing any changes with this patch and addressing other comments, Please review over V13. Thanks, Sai Pavan > > > > thanks > > -- PMM
On Wed, 28 Oct 2020 at 12:58, Sai Pavan Boddu <saipava@xilinx.com> wrote: > > Hi Peter, > > > -----Original Message----- > > From: Sai Pavan Boddu > > Sent: Monday, October 26, 2020 10:59 PM > > To: Peter Maydell <peter.maydell@linaro.org> > > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers <qemu- > > devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; Eduardo > > Habkost <ehabkost@redhat.com>; Ying Fang <fangying1@huawei.com>; > > Philippe Mathieu-Daudé <philmd@redhat.com>; Vikram Garhwal > > <fnuv@xilinx.com>; Paul Zimmerman <pauldzim@gmail.com> > > Subject: RE: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > > > Hi Peter, > > > > > -----Original Message----- > > > From: Peter Maydell <peter.maydell@linaro.org> > > > Sent: Monday, October 26, 2020 9:33 PM > > > To: Sai Pavan Boddu <saipava@xilinx.com> > > > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > > > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > > > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > > > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers > > > <qemu- devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; > > > Eduardo Habkost <ehabkost@redhat.com>; Ying Fang > > > <fangying1@huawei.com>; Philippe Mathieu-Daudé <philmd@redhat.com>; > > > Vikram Garhwal <fnuv@xilinx.com>; Paul Zimmerman > > <pauldzim@gmail.com>; > > > Sai Pavan Boddu <saipava@xilinx.com> > > > Subject: Re: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > > > > > On Thu, 22 Oct 2020 at 13:11, Sai Pavan Boddu > > > <sai.pavan.boddu@xilinx.com> > > > wrote: > > > > > > > > This module emulates control registers of versal usb2 controller, > > > > this is added just to make guest happy. In general this module would > > > > control the phy-reset signal from usb controller, data coherency of > > > > the transactions, signals the host system errors received from controller. > > > > > > > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > > > > Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com> > > > > --- > > > > hw/misc/meson.build | 1 + > > > > hw/misc/xlnx-versal-usb2-ctrl-regs.c | 229 > > > +++++++++++++++++++++++++++ > > > > include/hw/misc/xlnx-versal-usb2-ctrl-regs.h | 45 ++++++ > > > > > > This seems a bit odd. If it's a USB device (or part of a USB > > > device) then it should be under hw/usb, shouldn't it? > > [Sai Pavan Boddu] This is a top level wrapper over hcd-dwc3 device, which is > > specific to versal soc. It's mostly dummy which controls the phy-reset and does > > frame length adjustments. It was added just to make guest happy, that is the > > reason it has been added to misc devices. > > > > > > > +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) { > > > > + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg- > > >opaque); > > > > + /* > > > > + * TODO: This should also clear USBSTS.HSE field in USB XHCI register. > > > > + * May be combine both the modules. > > > > + */ > > > > > > What does the hardware for this look like? You've modelled it as two > > > completely separate devices (this one and the > > > TYPE_USB_DWC3) but would it be closer to the hardware structure to > > > have a top-level device which has-a DWC3 ? > > [Sai Pavan Boddu] Yes, we can look at it such way. But as its specific to versal > > SOC, we have crafted it out and stitched them in SOC file. > > > > Regards, > > Sai Pavan > [Sai Pavan Boddu] I would be sending V13 without doing any changes with this patch and addressing other comments, Please review over V13. You have my review comments above. I think the way you've structured this isn't really the best way to do it. thanks -- PMM
Hi Peter, > -----Original Message----- > From: Peter Maydell <peter.maydell@linaro.org> > Sent: Wednesday, October 28, 2020 6:44 PM > To: Sai Pavan Boddu <saipava@xilinx.com> > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias <edgari@xilinx.com>; > Francisco Eduardo Iglesias <figlesia@xilinx.com>; QEMU Developers <qemu- > devel@nongnu.org>; Alistair Francis <alistair.francis@wdc.com>; Eduardo > Habkost <ehabkost@redhat.com>; Ying Fang <fangying1@huawei.com>; > Philippe Mathieu-Daudé <philmd@redhat.com>; Vikram Garhwal > <fnuv@xilinx.com>; Paul Zimmerman <pauldzim@gmail.com> > Subject: Re: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > On Wed, 28 Oct 2020 at 12:58, Sai Pavan Boddu <saipava@xilinx.com> wrote: > > > > Hi Peter, > > > > > -----Original Message----- > > > From: Sai Pavan Boddu > > > Sent: Monday, October 26, 2020 10:59 PM > > > To: Peter Maydell <peter.maydell@linaro.org> > > > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > > > <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; > > > Gerd Hoffmann <kraxel@redhat.com>; Edgar Iglesias > > > <edgari@xilinx.com>; Francisco Eduardo Iglesias > > > <figlesia@xilinx.com>; QEMU Developers <qemu- devel@nongnu.org>; > > > Alistair Francis <alistair.francis@wdc.com>; Eduardo Habkost > > > <ehabkost@redhat.com>; Ying Fang <fangying1@huawei.com>; Philippe > > > Mathieu-Daudé <philmd@redhat.com>; Vikram Garhwal > <fnuv@xilinx.com>; > > > Paul Zimmerman <pauldzim@gmail.com> > > > Subject: RE: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs module > > > > > > Hi Peter, > > > > > > > -----Original Message----- > > > > From: Peter Maydell <peter.maydell@linaro.org> > > > > Sent: Monday, October 26, 2020 9:33 PM > > > > To: Sai Pavan Boddu <saipava@xilinx.com> > > > > Cc: Markus Armbruster <armbru@redhat.com>; Marc-André Lureau > > > > <marcandre.lureau@redhat.com>; Paolo Bonzini > > > > <pbonzini@redhat.com>; Gerd Hoffmann <kraxel@redhat.com>; Edgar > > > > Iglesias <edgari@xilinx.com>; Francisco Eduardo Iglesias > > > > <figlesia@xilinx.com>; QEMU Developers > > > > <qemu- devel@nongnu.org>; Alistair Francis > > > > <alistair.francis@wdc.com>; Eduardo Habkost <ehabkost@redhat.com>; > > > > Ying Fang <fangying1@huawei.com>; Philippe Mathieu-Daudé > > > > <philmd@redhat.com>; Vikram Garhwal <fnuv@xilinx.com>; Paul > > > > Zimmerman > > > <pauldzim@gmail.com>; > > > > Sai Pavan Boddu <saipava@xilinx.com> > > > > Subject: Re: [PATCH v12 1/3] misc: Add versal-usb2-ctrl-regs > > > > module > > > > > > > > On Thu, 22 Oct 2020 at 13:11, Sai Pavan Boddu > > > > <sai.pavan.boddu@xilinx.com> > > > > wrote: > > > > > > > > > > This module emulates control registers of versal usb2 > > > > > controller, this is added just to make guest happy. In general > > > > > this module would control the phy-reset signal from usb > > > > > controller, data coherency of the transactions, signals the host system > errors received from controller. > > > > > > > > > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > > > > > Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com> > > > > > --- > > > > > hw/misc/meson.build | 1 + > > > > > hw/misc/xlnx-versal-usb2-ctrl-regs.c | 229 > > > > +++++++++++++++++++++++++++ > > > > > include/hw/misc/xlnx-versal-usb2-ctrl-regs.h | 45 ++++++ > > > > > > > > This seems a bit odd. If it's a USB device (or part of a USB > > > > device) then it should be under hw/usb, shouldn't it? > > > [Sai Pavan Boddu] This is a top level wrapper over hcd-dwc3 device, > > > which is specific to versal soc. It's mostly dummy which controls > > > the phy-reset and does frame length adjustments. It was added just > > > to make guest happy, that is the reason it has been added to misc devices. > > > > > > > > > +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) { > > > > > + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg- > > > >opaque); > > > > > + /* > > > > > + * TODO: This should also clear USBSTS.HSE field in USB XHCI > register. > > > > > + * May be combine both the modules. > > > > > + */ > > > > > > > > What does the hardware for this look like? You've modelled it as > > > > two completely separate devices (this one and the > > > > TYPE_USB_DWC3) but would it be closer to the hardware structure to > > > > have a top-level device which has-a DWC3 ? > > > [Sai Pavan Boddu] Yes, we can look at it such way. But as its > > > specific to versal SOC, we have crafted it out and stitched them in SOC file. > > > > > > Regards, > > > Sai Pavan > > [Sai Pavan Boddu] I would be sending V13 without doing any changes with > this patch and addressing other comments, Please review over V13. > > You have my review comments above. I think the way you've structured this > isn't really the best way to do it. [Sai Pavan Boddu] Ok, I would move this into USB folder as its related. But this device is not like a top level module of DWC3 model, is used for handling phy-reset signal & power management of usb port. It's not a good idea to embedded this device into DWC3 module. Anyway, I would attempt to create a subsystem by making dwc3 and usb2-ctrl-regs child of one device. Regards, Sai Pavan > > thanks > -- PMM
diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 793d45b..b336dd1 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -109,3 +109,4 @@ specific_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('mips_cmgcr.c', 'mips_cp specific_ss.add(when: 'CONFIG_MIPS_ITU', if_true: files('mips_itu.c')) specific_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c')) +specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-usb2-ctrl-regs.c')) diff --git a/hw/misc/xlnx-versal-usb2-ctrl-regs.c b/hw/misc/xlnx-versal-usb2-ctrl-regs.c new file mode 100644 index 0000000..0d09dd2 --- /dev/null +++ b/hw/misc/xlnx-versal-usb2-ctrl-regs.c @@ -0,0 +1,229 @@ +/* + * QEMU model of the VersalUsb2CtrlRegs Register control/Status block for + * USB2.0 controller + * + * This module should control phy_reset, permanent device plugs, frame length + * time adjust & setting of coherency paths. None of which are emulated in + * present model. + * + * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal <fnu.vikram@xilinx.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/irq.h" +#include "hw/register.h" +#include "qemu/bitops.h" +#include "qemu/log.h" +#include "qom/object.h" +#include "migration/vmstate.h" +#include "hw/misc/xlnx-versal-usb2-ctrl-regs.h" + +#ifndef XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG +#define XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG 0 +#endif + +REG32(BUS_FILTER, 0x30) + FIELD(BUS_FILTER, BYPASS, 0, 4) +REG32(PORT, 0x34) + FIELD(PORT, HOST_SMI_BAR_WR, 4, 1) + FIELD(PORT, HOST_SMI_PCI_CMD_REG_WR, 3, 1) + FIELD(PORT, HOST_MSI_ENABLE, 2, 1) + FIELD(PORT, PWR_CTRL_PRSNT, 1, 1) + FIELD(PORT, HUB_PERM_ATTACH, 0, 1) +REG32(JITTER_ADJUST, 0x38) + FIELD(JITTER_ADJUST, FLADJ, 0, 6) +REG32(BIGENDIAN, 0x40) + FIELD(BIGENDIAN, ENDIAN_GS, 0, 1) +REG32(COHERENCY, 0x44) + FIELD(COHERENCY, USB_COHERENCY, 0, 1) +REG32(XHC_BME, 0x48) + FIELD(XHC_BME, XHC_BME, 0, 1) +REG32(REG_CTRL, 0x60) + FIELD(REG_CTRL, SLVERR_ENABLE, 0, 1) +REG32(IR_STATUS, 0x64) + FIELD(IR_STATUS, HOST_SYS_ERR, 1, 1) + FIELD(IR_STATUS, ADDR_DEC_ERR, 0, 1) +REG32(IR_MASK, 0x68) + FIELD(IR_MASK, HOST_SYS_ERR, 1, 1) + FIELD(IR_MASK, ADDR_DEC_ERR, 0, 1) +REG32(IR_ENABLE, 0x6c) + FIELD(IR_ENABLE, HOST_SYS_ERR, 1, 1) + FIELD(IR_ENABLE, ADDR_DEC_ERR, 0, 1) +REG32(IR_DISABLE, 0x70) + FIELD(IR_DISABLE, HOST_SYS_ERR, 1, 1) + FIELD(IR_DISABLE, ADDR_DEC_ERR, 0, 1) +REG32(USB3, 0x78) + +static void ir_update_irq(VersalUsb2CtrlRegs *s) +{ + bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK]; + qemu_set_irq(s->irq_ir, pending); +} + +static void ir_status_postw(RegisterInfo *reg, uint64_t val64) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque); + /* + * TODO: This should also clear USBSTS.HSE field in USB XHCI register. + * May be combine both the modules. + */ + ir_update_irq(s); +} + +static uint64_t ir_enable_prew(RegisterInfo *reg, uint64_t val64) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque); + uint32_t val = val64; + + s->regs[R_IR_MASK] &= ~val; + ir_update_irq(s); + return 0; +} + +static uint64_t ir_disable_prew(RegisterInfo *reg, uint64_t val64) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque); + uint32_t val = val64; + + s->regs[R_IR_MASK] |= val; + ir_update_irq(s); + return 0; +} + +static const RegisterAccessInfo usb2_ctrl_regs_regs_info[] = { + { .name = "BUS_FILTER", .addr = A_BUS_FILTER, + .rsvd = 0xfffffff0, + },{ .name = "PORT", .addr = A_PORT, + .rsvd = 0xffffffe0, + },{ .name = "JITTER_ADJUST", .addr = A_JITTER_ADJUST, + .reset = 0x20, + .rsvd = 0xffffffc0, + },{ .name = "BIGENDIAN", .addr = A_BIGENDIAN, + .rsvd = 0xfffffffe, + },{ .name = "COHERENCY", .addr = A_COHERENCY, + .rsvd = 0xfffffffe, + },{ .name = "XHC_BME", .addr = A_XHC_BME, + .reset = 0x1, + .rsvd = 0xfffffffe, + },{ .name = "REG_CTRL", .addr = A_REG_CTRL, + .rsvd = 0xfffffffe, + },{ .name = "IR_STATUS", .addr = A_IR_STATUS, + .rsvd = 0xfffffffc, + .w1c = 0x3, + .post_write = ir_status_postw, + },{ .name = "IR_MASK", .addr = A_IR_MASK, + .reset = 0x3, + .rsvd = 0xfffffffc, + .ro = 0x3, + },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE, + .rsvd = 0xfffffffc, + .pre_write = ir_enable_prew, + },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE, + .rsvd = 0xfffffffc, + .pre_write = ir_disable_prew, + },{ .name = "USB3", .addr = A_USB3, + } +}; + +static void usb2_ctrl_regs_reset_init(Object *obj, ResetType type) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj); + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) { + register_reset(&s->regs_info[i]); + } +} + +static void usb2_ctrl_regs_reset_hold(Object *obj) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj); + + ir_update_irq(s); +} + +static const MemoryRegionOps usb2_ctrl_regs_ops = { + .read = register_read_memory, + .write = register_write_memory, + .endianness = DEVICE_LITTLE_ENDIAN, + .valid = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static void usb2_ctrl_regs_init(Object *obj) +{ + VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj); + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); + RegisterInfoArray *reg_array; + + memory_region_init(&s->iomem, obj, TYPE_XILINX_VERSAL_USB2_CTRL_REGS, + USB2_REGS_R_MAX * 4); + reg_array = + register_init_block32(DEVICE(obj), usb2_ctrl_regs_regs_info, + ARRAY_SIZE(usb2_ctrl_regs_regs_info), + s->regs_info, s->regs, + &usb2_ctrl_regs_ops, + XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG, + USB2_REGS_R_MAX * 4); + memory_region_add_subregion(&s->iomem, + 0x0, + ®_array->mem); + sysbus_init_mmio(sbd, &s->iomem); + sysbus_init_irq(sbd, &s->irq_ir); +} + +static const VMStateDescription vmstate_usb2_ctrl_regs = { + .name = TYPE_XILINX_VERSAL_USB2_CTRL_REGS, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, VersalUsb2CtrlRegs, USB2_REGS_R_MAX), + VMSTATE_END_OF_LIST(), + } +}; + +static void usb2_ctrl_regs_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + ResettableClass *rc = RESETTABLE_CLASS(klass); + + rc->phases.enter = usb2_ctrl_regs_reset_init; + rc->phases.hold = usb2_ctrl_regs_reset_hold; + dc->vmsd = &vmstate_usb2_ctrl_regs; +} + +static const TypeInfo usb2_ctrl_regs_info = { + .name = TYPE_XILINX_VERSAL_USB2_CTRL_REGS, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(VersalUsb2CtrlRegs), + .class_init = usb2_ctrl_regs_class_init, + .instance_init = usb2_ctrl_regs_init, +}; + +static void usb2_ctrl_regs_register_types(void) +{ + type_register_static(&usb2_ctrl_regs_info); +} + +type_init(usb2_ctrl_regs_register_types) diff --git a/include/hw/misc/xlnx-versal-usb2-ctrl-regs.h b/include/hw/misc/xlnx-versal-usb2-ctrl-regs.h new file mode 100644 index 0000000..975a717 --- /dev/null +++ b/include/hw/misc/xlnx-versal-usb2-ctrl-regs.h @@ -0,0 +1,45 @@ +/* + * QEMU model of the VersalUsb2CtrlRegs Register control/Status block for + * USB2.0 controller + * + * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal <fnu.vikram@xilinx.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef _XLNX_USB2_REGS_H_ +#define _XLNX_USB2_REGS_H_ + +#define TYPE_XILINX_VERSAL_USB2_CTRL_REGS "xlnx.versal-usb2-ctrl-regs" + +#define XILINX_VERSAL_USB2_CTRL_REGS(obj) \ + OBJECT_CHECK(VersalUsb2CtrlRegs, (obj), TYPE_XILINX_VERSAL_USB2_CTRL_REGS) + +#define USB2_REGS_R_MAX ((0x78 / 4) + 1) + +typedef struct VersalUsb2CtrlRegs { + SysBusDevice parent_obj; + MemoryRegion iomem; + qemu_irq irq_ir; + + uint32_t regs[USB2_REGS_R_MAX]; + RegisterInfo regs_info[USB2_REGS_R_MAX]; +} VersalUsb2CtrlRegs; + +#endif