From: Thomas Huth <thuth@redhat.com> To: yang.zhong@intel.com, Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org, pbonzini@redhat.com Cc: Beniamino Galvani <b.galvani@gmail.com>, Rob Herring <robh@kernel.org>, Aurelien Jarno <aurelien@aurel32.net>, Cedric Le Goater <clg@kaod.org>, Jan Kiszka <jan.kiszka@web.de>, qemu-arm@nongnu.org, Andrzej Zaborowski <balrogg@gmail.com>, John Snow <jsnow@redhat.com>, Igor Mitsyanko <i.mitsyanko@gmail.com>, Joel Stanley <joel@jms.id.au>, Peter Chubb <peter.chubb@nicta.com.au>, "Edgar E . Iglesias" <edgar.iglesias@gmail.com>, Antony Pavlov <antonynpavlov@gmail.com>, qemu-block@nongnu.org, Jean-Christophe Dubois <jcd@tribudubois.net>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Philippe Mathieu-Daude <f4bug@amsat.org>, Alistair Francis <alistair@alistair23.me>, "Michael S. Tsirkin" <mst@redhat.com>, Subbaraya Sundeep <sundeep.lkml@gmail.com>, Andrew Jeffery <andrew@aj.id.au>, Andrey Smirnov <andrew.smirnov@gmail.com>, Gerd Hoffmann <kraxel@redhat.com> Subject: [Qemu-devel] [PATCH v6 03/30] hw/usb/hcd-ohci: Do not use PCI functions with sysbus devices in ohci_die() Date: Tue, 30 Apr 2019 09:13:38 +0200 [thread overview] Message-ID: <20190430071405.16714-4-thuth@redhat.com> (raw) In-Reply-To: <20190430071405.16714-1-thuth@redhat.com> The ohci_die() function always assumes to be running with a PCI OHCI controller and calls the PCI-specific functions pci_set_word(). However, this function might also get called for the sysbus OHCI devices, so it likely fails in that case. To fix this issue, change the code now, so that there are two implementations now, one for sysbus and one for PCI, and use the right function via a function pointer in the OHCIState structure. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com> --- hw/usb/hcd-ohci.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 81cf5ab7a5..6d3f556989 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -52,7 +52,7 @@ typedef struct OHCIPort { uint32_t ctrl; } OHCIPort; -typedef struct { +typedef struct OHCIState { USBBus bus; qemu_irq irq; MemoryRegion mem; @@ -108,6 +108,7 @@ typedef struct { uint32_t async_td; bool async_complete; + void (*ohci_die)(struct OHCIState *ohci); } OHCIState; /* Host Controller Communications Area */ @@ -302,7 +303,10 @@ struct ohci_iso_td { #define OHCI_HRESET_FSBIR (1 << 0) -static void ohci_die(OHCIState *ohci); +static void ohci_die(OHCIState *ohci) +{ + ohci->ohci_die(ohci); +} /* Update IRQ levels */ static inline void ohci_intr_update(OHCIState *ohci) @@ -1854,13 +1858,14 @@ static USBBusOps ohci_bus_ops = { static void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports, dma_addr_t localmem_base, - char *masterbus, uint32_t firstport, - AddressSpace *as, Error **errp) + char *masterbus, uint32_t firstport, AddressSpace *as, + void (*ohci_die_fn)(struct OHCIState *), Error **errp) { Error *err = NULL; int i; ohci->as = as; + ohci->ohci_die = ohci_die_fn; if (num_ports > OHCI_MAX_PORTS) { error_setg(errp, "OHCI num-ports=%u is too big (limit is %u ports)", @@ -1933,18 +1938,28 @@ typedef struct { uint32_t firstport; } OHCIPCIState; -/** A typical O/EHCI will stop operating, set itself into error state - * (which can be queried by MMIO) and will set PERR in its config - * space to signal that it got an error +/** + * A typical OHCI will stop operating and set itself into error state + * (which can be queried by MMIO) to signal that it got an error. */ -static void ohci_die(OHCIState *ohci) +static void ohci_sysbus_die(struct OHCIState *ohci) { - OHCIPCIState *dev = container_of(ohci, OHCIPCIState, state); - trace_usb_ohci_die(); ohci_set_interrupt(ohci, OHCI_INTR_UE); ohci_bus_stop(ohci); +} + +/** + * A typical PCI OHCI will additionally set PERR in its configspace to + * signal that it got an error. + */ +static void ohci_pci_die(struct OHCIState *ohci) +{ + OHCIPCIState *dev = container_of(ohci, OHCIPCIState, state); + + ohci_sysbus_die(ohci); + pci_set_word(dev->parent_obj.config + PCI_STATUS, PCI_STATUS_DETECTED_PARITY); } @@ -1959,7 +1974,7 @@ static void usb_ohci_realize_pci(PCIDevice *dev, Error **errp) usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0, ohci->masterbus, ohci->firstport, - pci_get_address_space(dev), &err); + pci_get_address_space(dev), ohci_pci_die, &err); if (err) { error_propagate(errp, err); return; @@ -2023,7 +2038,7 @@ static void ohci_realize_pxa(DeviceState *dev, Error **errp) usb_ohci_init(&s->ohci, dev, s->num_ports, s->dma_offset, s->masterbus, s->firstport, - &address_space_memory, &err); + &address_space_memory, ohci_sysbus_die, &err); if (err) { error_propagate(errp, err); return; -- 2.21.0
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Huth <thuth@redhat.com> To: yang.zhong@intel.com, Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org, pbonzini@redhat.com Cc: "Michael S. Tsirkin" <mst@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>, "Edgar E . Iglesias" <edgar.iglesias@gmail.com>, Subbaraya Sundeep <sundeep.lkml@gmail.com>, Rob Herring <robh@kernel.org>, qemu-block@nongnu.org, Andrey Smirnov <andrew.smirnov@gmail.com>, Antony Pavlov <antonynpavlov@gmail.com>, Joel Stanley <joel@jms.id.au>, Alistair Francis <alistair@alistair23.me>, Beniamino Galvani <b.galvani@gmail.com>, qemu-arm@nongnu.org, Jan Kiszka <jan.kiszka@web.de>, Cedric Le Goater <clg@kaod.org>, John Snow <jsnow@redhat.com>, Igor Mitsyanko <i.mitsyanko@gmail.com>, Philippe Mathieu-Daude <f4bug@amsat.org>, Jean-Christophe Dubois <jcd@tribudubois.net>, Andrew Jeffery <andrew@aj.id.au>, Peter Chubb <peter.chubb@nicta.com.au>, Aurelien Jarno <aurelien@aurel32.net> Subject: [Qemu-devel] [PATCH v6 03/30] hw/usb/hcd-ohci: Do not use PCI functions with sysbus devices in ohci_die() Date: Tue, 30 Apr 2019 09:13:38 +0200 [thread overview] Message-ID: <20190430071405.16714-4-thuth@redhat.com> (raw) Message-ID: <20190430071338.kUyVF7-dmr9fePen-VQqL7D_N0vfe27tNN4ArWKVhjs@z> (raw) In-Reply-To: <20190430071405.16714-1-thuth@redhat.com> The ohci_die() function always assumes to be running with a PCI OHCI controller and calls the PCI-specific functions pci_set_word(). However, this function might also get called for the sysbus OHCI devices, so it likely fails in that case. To fix this issue, change the code now, so that there are two implementations now, one for sysbus and one for PCI, and use the right function via a function pointer in the OHCIState structure. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com> --- hw/usb/hcd-ohci.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 81cf5ab7a5..6d3f556989 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -52,7 +52,7 @@ typedef struct OHCIPort { uint32_t ctrl; } OHCIPort; -typedef struct { +typedef struct OHCIState { USBBus bus; qemu_irq irq; MemoryRegion mem; @@ -108,6 +108,7 @@ typedef struct { uint32_t async_td; bool async_complete; + void (*ohci_die)(struct OHCIState *ohci); } OHCIState; /* Host Controller Communications Area */ @@ -302,7 +303,10 @@ struct ohci_iso_td { #define OHCI_HRESET_FSBIR (1 << 0) -static void ohci_die(OHCIState *ohci); +static void ohci_die(OHCIState *ohci) +{ + ohci->ohci_die(ohci); +} /* Update IRQ levels */ static inline void ohci_intr_update(OHCIState *ohci) @@ -1854,13 +1858,14 @@ static USBBusOps ohci_bus_ops = { static void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports, dma_addr_t localmem_base, - char *masterbus, uint32_t firstport, - AddressSpace *as, Error **errp) + char *masterbus, uint32_t firstport, AddressSpace *as, + void (*ohci_die_fn)(struct OHCIState *), Error **errp) { Error *err = NULL; int i; ohci->as = as; + ohci->ohci_die = ohci_die_fn; if (num_ports > OHCI_MAX_PORTS) { error_setg(errp, "OHCI num-ports=%u is too big (limit is %u ports)", @@ -1933,18 +1938,28 @@ typedef struct { uint32_t firstport; } OHCIPCIState; -/** A typical O/EHCI will stop operating, set itself into error state - * (which can be queried by MMIO) and will set PERR in its config - * space to signal that it got an error +/** + * A typical OHCI will stop operating and set itself into error state + * (which can be queried by MMIO) to signal that it got an error. */ -static void ohci_die(OHCIState *ohci) +static void ohci_sysbus_die(struct OHCIState *ohci) { - OHCIPCIState *dev = container_of(ohci, OHCIPCIState, state); - trace_usb_ohci_die(); ohci_set_interrupt(ohci, OHCI_INTR_UE); ohci_bus_stop(ohci); +} + +/** + * A typical PCI OHCI will additionally set PERR in its configspace to + * signal that it got an error. + */ +static void ohci_pci_die(struct OHCIState *ohci) +{ + OHCIPCIState *dev = container_of(ohci, OHCIPCIState, state); + + ohci_sysbus_die(ohci); + pci_set_word(dev->parent_obj.config + PCI_STATUS, PCI_STATUS_DETECTED_PARITY); } @@ -1959,7 +1974,7 @@ static void usb_ohci_realize_pci(PCIDevice *dev, Error **errp) usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0, ohci->masterbus, ohci->firstport, - pci_get_address_space(dev), &err); + pci_get_address_space(dev), ohci_pci_die, &err); if (err) { error_propagate(errp, err); return; @@ -2023,7 +2038,7 @@ static void ohci_realize_pxa(DeviceState *dev, Error **errp) usb_ohci_init(&s->ohci, dev, s->num_ports, s->dma_offset, s->masterbus, s->firstport, - &address_space_memory, &err); + &address_space_memory, ohci_sysbus_die, &err); if (err) { error_propagate(errp, err); return; -- 2.21.0
next prev parent reply other threads:[~2019-04-30 7:15 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-30 7:13 [Qemu-devel] [PATCH v6 00/30] Kconfig dependencies for ARM machines Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 01/30] hw/pci/pci-stub: Add msi_enabled() and msi_notify() to the pci stubs Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 02/30] hw/ide/ahci: Add a Kconfig switch for the AHCI-ICH9 device Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-05-01 18:39 ` John Snow 2019-05-01 18:39 ` John Snow 2019-04-30 7:13 ` Thomas Huth [this message] 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 03/30] hw/usb/hcd-ohci: Do not use PCI functions with sysbus devices in ohci_die() Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 04/30] hw/usb/hcd-ohci: Move PCI-related code into a separate file Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 05/30] hw/arm: Express dependencies of the exynos machines with Kconfig Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 06/30] hw/arm: Express dependencies of the highbank " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 07/30] hw/arm: Express dependencies of integratorcp " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 08/30] hw/arm: Express dependencies of the fsl-imx31 machine " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 09/30] hw/arm: Express dependencies of musicpal " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 10/30] hw/arm: Express dependencies of the OMAP machines " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 11/30] hw/arm: Express dependencies of stellaris " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 8:03 ` Philippe Mathieu-Daudé 2019-04-30 8:03 ` Philippe Mathieu-Daudé 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 12/30] hw/arm: Express dependencies of realview, versatile and vexpress " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 13/30] hw/arm: Express dependencies of the PXA2xx machines " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 14/30] hw/arm: Express dependencies of xilinx-zynq " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 15/30] hw/arm: Express dependencies of collie " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 16/30] hw/arm: Express dependencies of the aspeed boards " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 17/30] hw/arm: Express dependencies of the virt machine " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 18/30] hw/arm: Express dependencies of netduino / stm32f2xx " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 19/30] hw/arm: Express dependencies of allwinner / cubieboard " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 20/30] hw/arm: Express dependencies of the MPS2 boards " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 21/30] hw/arm: Express dependencies of the raspi machines " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 22/30] hw/arm: Express dependencies of canon-a1100 " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 23/30] hw/arm: Express dependencies of sabrelite " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:13 ` [Qemu-devel] [PATCH v6 24/30] hw/arm: Express dependencies of the MSF2 / EMCRAFT_SF2 machine " Thomas Huth 2019-04-30 7:13 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 25/30] hw/arm: Express dependencies of the remaining IMX boards " Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 26/30] hw/arm: Express dependencies of the microbit / nrf51 machine " Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 27/30] hw/arm: Express dependencies of the ZynqMP zcu102 " Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 28/30] hw/arm: Express dependencies of the xlnx-versal-virt " Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 29/30] hw/arm: Express dependencies of the musca machines " Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 7:14 ` [Qemu-devel] [PATCH v6 30/30] hw/arm: Remove hard-enablement of the remaining PCI devices Thomas Huth 2019-04-30 7:14 ` Thomas Huth 2019-04-30 8:34 ` Philippe Mathieu-Daudé 2019-04-30 8:34 ` Philippe Mathieu-Daudé 2019-05-03 15:14 ` [Qemu-devel] [PATCH v6 00/30] Kconfig dependencies for ARM machines Thomas Huth 2019-05-03 15:14 ` Thomas Huth 2019-05-03 15:24 ` [Qemu-devel] [Qemu-arm] " Peter Maydell 2019-05-03 15:24 ` Peter Maydell
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=20190430071405.16714-4-thuth@redhat.com \ --to=thuth@redhat.com \ --cc=alistair@alistair23.me \ --cc=andrew.smirnov@gmail.com \ --cc=andrew@aj.id.au \ --cc=antonynpavlov@gmail.com \ --cc=aurelien@aurel32.net \ --cc=b.galvani@gmail.com \ --cc=balrogg@gmail.com \ --cc=clg@kaod.org \ --cc=edgar.iglesias@gmail.com \ --cc=f4bug@amsat.org \ --cc=i.mitsyanko@gmail.com \ --cc=jan.kiszka@web.de \ --cc=jcd@tribudubois.net \ --cc=joel@jms.id.au \ --cc=jsnow@redhat.com \ --cc=kraxel@redhat.com \ --cc=marcel.apfelbaum@gmail.com \ --cc=mst@redhat.com \ --cc=pbonzini@redhat.com \ --cc=peter.chubb@nicta.com.au \ --cc=peter.maydell@linaro.org \ --cc=qemu-arm@nongnu.org \ --cc=qemu-block@nongnu.org \ --cc=qemu-devel@nongnu.org \ --cc=robh@kernel.org \ --cc=sundeep.lkml@gmail.com \ --cc=yang.zhong@intel.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).