From nobody Fri May 3 11:28:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486382837696953.2381886548682; Mon, 6 Feb 2017 04:07:17 -0800 (PST) Received: from localhost ([::1]:46984 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cai4i-00079j-6F for importer@patchew.org; Mon, 06 Feb 2017 07:07:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50295) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cahtc-0006mI-No for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cahtZ-00043n-O3 for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37606) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cahtZ-00043B-Fh for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:45 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 97235C05678D for ; Mon, 6 Feb 2017 11:55:45 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v16BtiF8031049; Mon, 6 Feb 2017 06:55:44 -0500 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id 9C8548088D; Mon, 6 Feb 2017 12:55:42 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 6 Feb 2017 12:55:36 +0100 Message-Id: <1486382139-30630-2-git-send-email-kraxel@redhat.com> In-Reply-To: <1486382139-30630-1-git-send-email-kraxel@redhat.com> References: <1486382139-30630-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 06 Feb 2017 11:55:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/4] xhci: drop ER_FULL_HACK workaround X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The nec/renesas driver problems have finally been debugged and root caused, see commit "7da76e1 xhci: fix event queue IRQ handling". It's pretty clear now that (a) The whole "driver can't handle ring full" story is most likely wrong. (b) The ER_FULL_HACK workaround based on the false assumtion doesn't much. It avoids the driver crashing (without commit 7da76e1), but it doesn't make usb work. (c) With 7da76e1 applied it doesn't trigger any more. So, lets kill it. Or, to be exact, lets almost kill it. Some data fields are kept unused in the state struct, for live migration backward compatibility. Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-xhci.c | 117 +++++---------------------------------------------= ---- 1 file changed, 11 insertions(+), 106 deletions(-) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 54b3901..74184ac 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -49,9 +49,6 @@ =20 /* Very pessimistic, let's hope it's enough for all cases */ #define EV_QUEUE (((3 * 24) + 16) * MAXSLOTS) -/* Do not deliver ER Full events. NEC's driver does some things not bound - * to the specs when it gets them */ -#define ER_FULL_HACK =20 #define TRB_LINK_LIMIT 4 =20 @@ -431,12 +428,14 @@ typedef struct XHCIInterrupter { uint32_t erdp_low; uint32_t erdp_high; =20 - bool msix_used, er_pcs, er_full; + bool msix_used, er_pcs; =20 dma_addr_t er_start; uint32_t er_size; unsigned int er_ep_idx; =20 + /* kept for live migration compat only */ + bool er_full_unused; XHCIEvent ev_buffer[EV_QUEUE]; unsigned int ev_buffer_put; unsigned int ev_buffer_get; @@ -826,7 +825,7 @@ static void xhci_intr_raise(XHCIState *xhci, int v) =20 static inline int xhci_running(XHCIState *xhci) { - return !(xhci->usbsts & USBSTS_HCH) && !xhci->intr[0].er_full; + return !(xhci->usbsts & USBSTS_HCH); } =20 static void xhci_die(XHCIState *xhci) @@ -865,74 +864,6 @@ static void xhci_write_event(XHCIState *xhci, XHCIEven= t *event, int v) } } =20 -static void xhci_events_update(XHCIState *xhci, int v) -{ - XHCIInterrupter *intr =3D &xhci->intr[v]; - dma_addr_t erdp; - unsigned int dp_idx; - bool do_irq =3D 0; - - if (xhci->usbsts & USBSTS_HCH) { - return; - } - - erdp =3D xhci_addr64(intr->erdp_low, intr->erdp_high); - if (erdp < intr->er_start || - erdp >=3D (intr->er_start + TRB_SIZE*intr->er_size)) { - DPRINTF("xhci: ERDP out of bounds: "DMA_ADDR_FMT"\n", erdp); - DPRINTF("xhci: ER[%d] at "DMA_ADDR_FMT" len %d\n", - v, intr->er_start, intr->er_size); - xhci_die(xhci); - return; - } - dp_idx =3D (erdp - intr->er_start) / TRB_SIZE; - assert(dp_idx < intr->er_size); - - /* NEC didn't read section 4.9.4 of the spec (v1.0 p139 top Note) and = thus - * deadlocks when the ER is full. Hack it by holding off events until - * the driver decides to free at least half of the ring */ - if (intr->er_full) { - int er_free =3D dp_idx - intr->er_ep_idx; - if (er_free <=3D 0) { - er_free +=3D intr->er_size; - } - if (er_free < (intr->er_size/2)) { - DPRINTF("xhci_events_update(): event ring still " - "more than half full (hack)\n"); - return; - } - } - - while (intr->ev_buffer_put !=3D intr->ev_buffer_get) { - assert(intr->er_full); - if (((intr->er_ep_idx+1) % intr->er_size) =3D=3D dp_idx) { - DPRINTF("xhci_events_update(): event ring full again\n"); -#ifndef ER_FULL_HACK - XHCIEvent full =3D {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERR= OR}; - xhci_write_event(xhci, &full, v); -#endif - do_irq =3D 1; - break; - } - XHCIEvent *event =3D &intr->ev_buffer[intr->ev_buffer_get]; - xhci_write_event(xhci, event, v); - intr->ev_buffer_get++; - do_irq =3D 1; - if (intr->ev_buffer_get =3D=3D EV_QUEUE) { - intr->ev_buffer_get =3D 0; - } - } - - if (do_irq) { - xhci_intr_raise(xhci, v); - } - - if (intr->er_full && intr->ev_buffer_put =3D=3D intr->ev_buffer_get) { - DPRINTF("xhci_events_update(): event ring no longer full\n"); - intr->er_full =3D 0; - } -} - static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v) { XHCIInterrupter *intr; @@ -945,19 +876,6 @@ static void xhci_event(XHCIState *xhci, XHCIEvent *eve= nt, int v) } intr =3D &xhci->intr[v]; =20 - if (intr->er_full) { - DPRINTF("xhci_event(): ER full, queueing\n"); - if (((intr->ev_buffer_put+1) % EV_QUEUE) =3D=3D intr->ev_buffer_ge= t) { - DPRINTF("xhci: event queue full, dropping event!\n"); - return; - } - intr->ev_buffer[intr->ev_buffer_put++] =3D *event; - if (intr->ev_buffer_put =3D=3D EV_QUEUE) { - intr->ev_buffer_put =3D 0; - } - return; - } - erdp =3D xhci_addr64(intr->erdp_low, intr->erdp_high); if (erdp < intr->er_start || erdp >=3D (intr->er_start + TRB_SIZE*intr->er_size)) { @@ -971,21 +889,12 @@ static void xhci_event(XHCIState *xhci, XHCIEvent *ev= ent, int v) dp_idx =3D (erdp - intr->er_start) / TRB_SIZE; assert(dp_idx < intr->er_size); =20 - if ((intr->er_ep_idx+1) % intr->er_size =3D=3D dp_idx) { - DPRINTF("xhci_event(): ER full, queueing\n"); -#ifndef ER_FULL_HACK + if ((intr->er_ep_idx + 2) % intr->er_size =3D=3D dp_idx) { + DPRINTF("xhci: ER %d full, send ring full error\n", v); XHCIEvent full =3D {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERROR}; - xhci_write_event(xhci, &full); -#endif - intr->er_full =3D 1; - if (((intr->ev_buffer_put+1) % EV_QUEUE) =3D=3D intr->ev_buffer_ge= t) { - DPRINTF("xhci: event queue full, dropping event!\n"); - return; - } - intr->ev_buffer[intr->ev_buffer_put++] =3D *event; - if (intr->ev_buffer_put =3D=3D EV_QUEUE) { - intr->ev_buffer_put =3D 0; - } + xhci_write_event(xhci, &full, v); + } else if ((intr->er_ep_idx + 1) % intr->er_size =3D=3D dp_idx) { + DPRINTF("xhci: ER %d full, drop event\n", v); } else { xhci_write_event(xhci, event, v); } @@ -1124,7 +1033,6 @@ static void xhci_er_reset(XHCIState *xhci, int v) =20 intr->er_ep_idx =3D 0; intr->er_pcs =3D 1; - intr->er_full =3D 0; =20 DPRINTF("xhci: event ring[%d]:" DMA_ADDR_FMT " [%d]\n", v, intr->er_start, intr->er_size); @@ -2978,7 +2886,6 @@ static void xhci_reset(DeviceState *dev) =20 xhci->intr[i].er_ep_idx =3D 0; xhci->intr[i].er_pcs =3D 1; - xhci->intr[i].er_full =3D 0; xhci->intr[i].ev_buffer_put =3D 0; xhci->intr[i].ev_buffer_get =3D 0; } @@ -3368,7 +3275,6 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, break; case 0x1c: /* ERDP high */ intr->erdp_high =3D val; - xhci_events_update(xhci, v); break; default: trace_usb_xhci_unimplemented("oper write", reg); @@ -3866,8 +3772,7 @@ static const VMStateDescription vmstate_xhci_event = =3D { =20 static bool xhci_er_full(void *opaque, int version_id) { - struct XHCIInterrupter *intr =3D opaque; - return intr->er_full; + return false; } =20 static const VMStateDescription vmstate_xhci_intr =3D { @@ -3891,7 +3796,7 @@ static const VMStateDescription vmstate_xhci_intr =3D= { VMSTATE_UINT32(er_ep_idx, XHCIInterrupter), =20 /* event queue (used if ring is full) */ - VMSTATE_BOOL(er_full, XHCIInterrupter), + VMSTATE_BOOL(er_full_unused, XHCIInterrupter), VMSTATE_UINT32_TEST(ev_buffer_put, XHCIInterrupter, xhci_er_full), VMSTATE_UINT32_TEST(ev_buffer_get, XHCIInterrupter, xhci_er_full), VMSTATE_STRUCT_ARRAY_TEST(ev_buffer, XHCIInterrupter, EV_QUEUE, --=20 1.8.3.1 From nobody Fri May 3 11:28:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486382980616504.89186136901026; Mon, 6 Feb 2017 04:09:40 -0800 (PST) Received: from localhost ([::1]:46994 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cai71-0000XV-4J for importer@patchew.org; Mon, 06 Feb 2017 07:09:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50298) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cahtc-0006mM-OO for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cahtZ-00043t-O9 for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:49170) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cahtZ-00043G-Gv for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:45 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A25584E024 for ; Mon, 6 Feb 2017 11:55:45 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v16Bti29031051; Mon, 6 Feb 2017 06:55:44 -0500 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id B39CF808C1; Mon, 6 Feb 2017 12:55:42 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 6 Feb 2017 12:55:37 +0100 Message-Id: <1486382139-30630-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1486382139-30630-1-git-send-email-kraxel@redhat.com> References: <1486382139-30630-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 06 Feb 2017 11:55:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/4] xhci: add qemu xhci controller X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Gerd Hoffmann , "Michael S. Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Turn existing TYPE_XHCI into an abstract base class. Create two child classes, TYPE_NEC_XHCI (same name as old xhci controller) and TYPE_QEMU_XHCI (using an ID from our namespace). Signed-off-by: Gerd Hoffmann Reviewed-by: Marcel Apfelbaum --- docs/specs/pci-ids.txt | 1 + hw/usb/hcd-xhci.c | 40 ++++++++++++++++++++++++++++++++++++---- include/hw/pci/pci.h | 1 + 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/docs/specs/pci-ids.txt b/docs/specs/pci-ids.txt index 16fdb0c..95adee0 100644 --- a/docs/specs/pci-ids.txt +++ b/docs/specs/pci-ids.txt @@ -61,6 +61,7 @@ PCI devices (other than virtio): 1b36:0009 PCI Expander Bridge (-device pxb) 1b36:000a PCI-PCI bridge (multiseat) 1b36:000b PCIe Expander Bridge (-device pxb-pcie) +1b36:000d PCI xhci usb host adapter =20 All these devices are documented in docs/specs. =20 diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 74184ac..887bb39 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -487,7 +487,9 @@ struct XHCIState { XHCIRing cmd_ring; }; =20 -#define TYPE_XHCI "nec-usb-xhci" +#define TYPE_XHCI "base-xhci" +#define TYPE_NEC_XHCI "nec-usb-xhci" +#define TYPE_QEMU_XHCI "qemu-xhci" =20 #define XHCI(obj) \ OBJECT_CHECK(XHCIState, (obj), TYPE_XHCI) @@ -3868,10 +3870,7 @@ static void xhci_class_init(ObjectClass *klass, void= *data) set_bit(DEVICE_CATEGORY_USB, dc->categories); k->realize =3D usb_xhci_realize; k->exit =3D usb_xhci_exit; - k->vendor_id =3D PCI_VENDOR_ID_NEC; - k->device_id =3D PCI_DEVICE_ID_NEC_UPD720200; k->class_id =3D PCI_CLASS_SERIAL_USB; - k->revision =3D 0x03; k->is_express =3D 1; } =20 @@ -3880,11 +3879,44 @@ static const TypeInfo xhci_info =3D { .parent =3D TYPE_PCI_DEVICE, .instance_size =3D sizeof(XHCIState), .class_init =3D xhci_class_init, + .abstract =3D true, +}; + +static void nec_xhci_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + + k->vendor_id =3D PCI_VENDOR_ID_NEC; + k->device_id =3D PCI_DEVICE_ID_NEC_UPD720200; + k->revision =3D 0x03; +} + +static const TypeInfo nec_xhci_info =3D { + .name =3D TYPE_NEC_XHCI, + .parent =3D TYPE_XHCI, + .class_init =3D nec_xhci_class_init, +}; + +static void qemu_xhci_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + + k->vendor_id =3D PCI_VENDOR_ID_REDHAT; + k->device_id =3D PCI_DEVICE_ID_REDHAT_XHCI; + k->revision =3D 0x01; +} + +static const TypeInfo qemu_xhci_info =3D { + .name =3D TYPE_QEMU_XHCI, + .parent =3D TYPE_XHCI, + .class_init =3D qemu_xhci_class_init, }; =20 static void xhci_register_types(void) { type_register_static(&xhci_info); + type_register_static(&nec_xhci_info); + type_register_static(&qemu_xhci_info); } =20 type_init(xhci_register_types) diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index cbc1fdf..05ef14b 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -97,6 +97,7 @@ #define PCI_DEVICE_ID_REDHAT_BRIDGE_SEAT 0x000a #define PCI_DEVICE_ID_REDHAT_PXB_PCIE 0x000b #define PCI_DEVICE_ID_REDHAT_PCIE_RP 0x000c +#define PCI_DEVICE_ID_REDHAT_XHCI 0x000d #define PCI_DEVICE_ID_REDHAT_QXL 0x0100 =20 #define FMT_PCIBUS PRIx64 --=20 1.8.3.1 From nobody Fri May 3 11:28:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486382267656160.16096368289232; Mon, 6 Feb 2017 03:57:47 -0800 (PST) Received: from localhost ([::1]:46903 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cahvW-00080p-F5 for importer@patchew.org; Mon, 06 Feb 2017 06:57:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50297) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cahtc-0006mL-O4 for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cahtZ-00043g-NF for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:60952) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cahtZ-000438-Fi for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:45 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54E5D7E9D5 for ; Mon, 6 Feb 2017 11:55:45 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v16BtiFj022039; Mon, 6 Feb 2017 06:55:44 -0500 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id C39828092B; Mon, 6 Feb 2017 12:55:42 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 6 Feb 2017 12:55:38 +0100 Message-Id: <1486382139-30630-4-git-send-email-kraxel@redhat.com> In-Reply-To: <1486382139-30630-1-git-send-email-kraxel@redhat.com> References: <1486382139-30630-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 06 Feb 2017 11:55:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/4] xhci: fix nec vendor quirk handling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Only the TYPE_NEC_XHCI controller will have the nec vendor quirks. Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-xhci.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 887bb39..0e25943 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -485,6 +485,8 @@ struct XHCIState { XHCIInterrupter intr[MAXINTRS]; =20 XHCIRing cmd_ring; + + bool nec_quirks; }; =20 #define TYPE_XHCI "base-xhci" @@ -2737,20 +2739,26 @@ static void xhci_process_commands(XHCIState *xhci) xhci_via_challenge(xhci, trb.parameter); break; case CR_VENDOR_NEC_FIRMWARE_REVISION: - event.type =3D 48; /* NEC reply */ - event.length =3D 0x3025; + if (xhci->nec_quirks) { + event.type =3D 48; /* NEC reply */ + event.length =3D 0x3025; + } else { + event.ccode =3D CC_TRB_ERROR; + } break; case CR_VENDOR_NEC_CHALLENGE_RESPONSE: - { - uint32_t chi =3D trb.parameter >> 32; - uint32_t clo =3D trb.parameter; - uint32_t val =3D xhci_nec_challenge(chi, clo); - event.length =3D val & 0xFFFF; - event.epid =3D val >> 16; - slotid =3D val >> 24; - event.type =3D 48; /* NEC reply */ - } - break; + if (xhci->nec_quirks) { + uint32_t chi =3D trb.parameter >> 32; + uint32_t clo =3D trb.parameter; + uint32_t val =3D xhci_nec_challenge(chi, clo); + event.length =3D val & 0xFFFF; + event.epid =3D val >> 16; + slotid =3D val >> 24; + event.type =3D 48; /* NEC reply */ + } else { + event.ccode =3D CC_TRB_ERROR; + } + break; default: trace_usb_xhci_unimplemented("command", type); event.ccode =3D CC_TRB_ERROR; @@ -3252,9 +3260,12 @@ static void xhci_runtime_write(void *ptr, hwaddr reg, intr->erstsz =3D val & 0xffff; break; case 0x10: /* ERSTBA low */ - /* XXX NEC driver bug: it doesn't align this to 64 bytes - intr->erstba_low =3D val & 0xffffffc0; */ - intr->erstba_low =3D val & 0xfffffff0; + if (xhci->nec_quirks) { + /* NEC driver bug: it doesn't align this to 64 bytes */ + intr->erstba_low =3D val & 0xfffffff0; + } else { + intr->erstba_low =3D val & 0xffffffc0; + } break; case 0x14: /* ERSTBA high */ intr->erstba_high =3D val; @@ -3549,6 +3560,9 @@ static void usb_xhci_realize(struct PCIDevice *dev, E= rror **errp) dev->config[PCI_CACHE_LINE_SIZE] =3D 0x10; dev->config[0x60] =3D 0x30; /* release number */ =20 + if (strcmp(object_get_typename(OBJECT(dev)), TYPE_NEC_XHCI) =3D=3D 0) { + xhci->nec_quirks =3D true; + } if (xhci->numintrs > MAXINTRS) { xhci->numintrs =3D MAXINTRS; } --=20 1.8.3.1 From nobody Fri May 3 11:28:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486382658826425.2473006596232; Mon, 6 Feb 2017 04:04:18 -0800 (PST) Received: from localhost ([::1]:46948 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cai1p-00054z-9y for importer@patchew.org; Mon, 06 Feb 2017 07:04:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50296) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cahtc-0006mK-Nv for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cahtZ-00043c-NA for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44528) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cahtZ-000439-Gz for qemu-devel@nongnu.org; Mon, 06 Feb 2017 06:55:45 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8B1F1C04B302 for ; Mon, 6 Feb 2017 11:55:45 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v16BtiYa007502; Mon, 6 Feb 2017 06:55:44 -0500 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id D2E9C8093B; Mon, 6 Feb 2017 12:55:42 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 6 Feb 2017 12:55:39 +0100 Message-Id: <1486382139-30630-5-git-send-email-kraxel@redhat.com> In-Reply-To: <1486382139-30630-1-git-send-email-kraxel@redhat.com> References: <1486382139-30630-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 06 Feb 2017 11:55:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/4] xhci: drop via vendor command handling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Seems pretty pointless, we don't emulate an via xhci controller. Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-xhci.c | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index 0e25943..fbf8a8b 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -196,7 +196,6 @@ typedef enum TRBType { ER_DEVICE_NOTIFICATION, ER_MFINDEX_WRAP, /* vendor specific bits */ - CR_VENDOR_VIA_CHALLENGE_RESPONSE =3D 48, CR_VENDOR_NEC_FIRMWARE_REVISION =3D 49, CR_VENDOR_NEC_CHALLENGE_RESPONSE =3D 50, } TRBType; @@ -552,7 +551,6 @@ static const char *TRBType_names[] =3D { [ER_HOST_CONTROLLER] =3D "ER_HOST_CONTROLLER", [ER_DEVICE_NOTIFICATION] =3D "ER_DEVICE_NOTIFICATION", [ER_MFINDEX_WRAP] =3D "ER_MFINDEX_WRAP", - [CR_VENDOR_VIA_CHALLENGE_RESPONSE] =3D "CR_VENDOR_VIA_CHALLENGE_RESPON= SE", [CR_VENDOR_NEC_FIRMWARE_REVISION] =3D "CR_VENDOR_NEC_FIRMWARE_REVISIO= N", [CR_VENDOR_NEC_CHALLENGE_RESPONSE] =3D "CR_VENDOR_NEC_CHALLENGE_RESPON= SE", }; @@ -2614,32 +2612,6 @@ static uint32_t xhci_nec_challenge(uint32_t hi, uint= 32_t lo) return ~val; } =20 -static void xhci_via_challenge(XHCIState *xhci, uint64_t addr) -{ - PCIDevice *pci_dev =3D PCI_DEVICE(xhci); - uint32_t buf[8]; - uint32_t obuf[8]; - dma_addr_t paddr =3D xhci_mask64(addr); - - pci_dma_read(pci_dev, paddr, &buf, 32); - - memcpy(obuf, buf, sizeof(obuf)); - - if ((buf[0] & 0xff) =3D=3D 2) { - obuf[0] =3D 0x49932000 + 0x54dc200 * buf[2] + 0x7429b578 * buf[3]; - obuf[0] |=3D (buf[2] * buf[3]) & 0xff; - obuf[1] =3D 0x0132bb37 + 0xe89 * buf[2] + 0xf09 * buf[3]; - obuf[2] =3D 0x0066c2e9 + 0x2091 * buf[2] + 0x19bd * buf[3]; - obuf[3] =3D 0xd5281342 + 0x2cc9691 * buf[2] + 0x2367662 * buf[3]; - obuf[4] =3D 0x0123c75c + 0x1595 * buf[2] + 0x19ec * buf[3]; - obuf[5] =3D 0x00f695de + 0x26fd * buf[2] + 0x3e9 * buf[3]; - obuf[6] =3D obuf[2] ^ obuf[3] ^ 0x29472956; - obuf[7] =3D obuf[2] ^ obuf[3] ^ 0x65866593; - } - - pci_dma_write(pci_dev, paddr, &obuf, 32); -} - static void xhci_process_commands(XHCIState *xhci) { XHCITRB trb; @@ -2735,9 +2707,6 @@ static void xhci_process_commands(XHCIState *xhci) case CR_GET_PORT_BANDWIDTH: event.ccode =3D xhci_get_port_bandwidth(xhci, trb.parameter); break; - case CR_VENDOR_VIA_CHALLENGE_RESPONSE: - xhci_via_challenge(xhci, trb.parameter); - break; case CR_VENDOR_NEC_FIRMWARE_REVISION: if (xhci->nec_quirks) { event.type =3D 48; /* NEC reply */ --=20 1.8.3.1