10bf96f94SGerd Hoffmann /* 20bf96f94SGerd Hoffmann * QEMU USB EHCI Emulation 30bf96f94SGerd Hoffmann * 40bf96f94SGerd Hoffmann * This library is free software; you can redistribute it and/or 50bf96f94SGerd Hoffmann * modify it under the terms of the GNU Lesser General Public 60bf96f94SGerd Hoffmann * License as published by the Free Software Foundation; either 775a49fc6SThomas Huth * version 2.1 of the License, or (at your option) any later version. 80bf96f94SGerd Hoffmann * 90bf96f94SGerd Hoffmann * This library is distributed in the hope that it will be useful, 100bf96f94SGerd Hoffmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 110bf96f94SGerd Hoffmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 120bf96f94SGerd Hoffmann * Lesser General Public License for more details. 130bf96f94SGerd Hoffmann * 1475a49fc6SThomas Huth * You should have received a copy of the GNU Lesser General Public License 150bf96f94SGerd Hoffmann * along with this program; if not, see <http://www.gnu.org/licenses/>. 160bf96f94SGerd Hoffmann */ 17121d0712SMarkus Armbruster 18121d0712SMarkus Armbruster #ifndef HW_USB_HCD_EHCI_H 19121d0712SMarkus Armbruster #define HW_USB_HCD_EHCI_H 200bf96f94SGerd Hoffmann 211de7afc9SPaolo Bonzini #include "qemu/timer.h" 220bf96f94SGerd Hoffmann #include "hw/usb.h" 239c17d615SPaolo Bonzini #include "sysemu/dma.h" 24edf5ca5dSMarkus Armbruster #include "hw/pci/pci_device.h" 255aa3ca9fSAndreas Färber #include "hw/sysbus.h" 260bf96f94SGerd Hoffmann 270bf96f94SGerd Hoffmann #ifndef EHCI_DEBUG 280bf96f94SGerd Hoffmann #define EHCI_DEBUG 0 290bf96f94SGerd Hoffmann #endif 300bf96f94SGerd Hoffmann 310bf96f94SGerd Hoffmann #if EHCI_DEBUG 320bf96f94SGerd Hoffmann #define DPRINTF printf 330bf96f94SGerd Hoffmann #else 340bf96f94SGerd Hoffmann #define DPRINTF(...) 350bf96f94SGerd Hoffmann #endif 360bf96f94SGerd Hoffmann 370bf96f94SGerd Hoffmann #define MMIO_SIZE 0x1000 380bf96f94SGerd Hoffmann #define CAPA_SIZE 0x10 390bf96f94SGerd Hoffmann 40*1c83f366SPhilippe Mathieu-Daudé #define EHCI_PORTS 6 /* Max. Number of downstream ports */ 410bf96f94SGerd Hoffmann 420bf96f94SGerd Hoffmann typedef struct EHCIPacket EHCIPacket; 430bf96f94SGerd Hoffmann typedef struct EHCIQueue EHCIQueue; 440bf96f94SGerd Hoffmann typedef struct EHCIState EHCIState; 450bf96f94SGerd Hoffmann 460bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.3 470bf96f94SGerd Hoffmann */ 480bf96f94SGerd Hoffmann typedef struct EHCIitd { 490bf96f94SGerd Hoffmann uint32_t next; 500bf96f94SGerd Hoffmann 510bf96f94SGerd Hoffmann uint32_t transact[8]; 520bf96f94SGerd Hoffmann #define ITD_XACT_ACTIVE (1 << 31) 530bf96f94SGerd Hoffmann #define ITD_XACT_DBERROR (1 << 30) 540bf96f94SGerd Hoffmann #define ITD_XACT_BABBLE (1 << 29) 550bf96f94SGerd Hoffmann #define ITD_XACT_XACTERR (1 << 28) 560bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_MASK 0x0fff0000 570bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_SH 16 580bf96f94SGerd Hoffmann #define ITD_XACT_IOC (1 << 15) 590bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_MASK 0x00007000 600bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_SH 12 610bf96f94SGerd Hoffmann #define ITD_XACT_OFFSET_MASK 0x00000fff 620bf96f94SGerd Hoffmann 630bf96f94SGerd Hoffmann uint32_t bufptr[7]; 640bf96f94SGerd Hoffmann #define ITD_BUFPTR_MASK 0xfffff000 650bf96f94SGerd Hoffmann #define ITD_BUFPTR_SH 12 660bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_MASK 0x00000f00 670bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_SH 8 680bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_MASK 0x0000007f 690bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_SH 0 700bf96f94SGerd Hoffmann #define ITD_BUFPTR_DIRECTION (1 << 11) 710bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_MASK 0x000007ff 720bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_SH 0 730bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_MASK 0x00000003 740bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_SH 0 750bf96f94SGerd Hoffmann } EHCIitd; 760bf96f94SGerd Hoffmann 770bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.4 780bf96f94SGerd Hoffmann */ 790bf96f94SGerd Hoffmann typedef struct EHCIsitd { 800bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 810bf96f94SGerd Hoffmann uint32_t epchar; 820bf96f94SGerd Hoffmann #define SITD_EPCHAR_IO (1 << 31) 830bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_MASK 0x7f000000 840bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_SH 24 850bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADD_MASK 0x007f0000 860bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADDR_SH 16 870bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_MASK 0x00000f00 880bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_SH 8 890bf96f94SGerd Hoffmann #define SITD_EPCHAR_DEVADDR_MASK 0x0000007f 900bf96f94SGerd Hoffmann 910bf96f94SGerd Hoffmann uint32_t uframe; 920bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_MASK 0x0000ff00 930bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_SH 8 940bf96f94SGerd Hoffmann #define SITD_UFRAME_SMASK_MASK 0x000000ff 950bf96f94SGerd Hoffmann 960bf96f94SGerd Hoffmann uint32_t results; 970bf96f94SGerd Hoffmann #define SITD_RESULTS_IOC (1 << 31) 980bf96f94SGerd Hoffmann #define SITD_RESULTS_PGSEL (1 << 30) 990bf96f94SGerd Hoffmann #define SITD_RESULTS_TBYTES_MASK 0x03ff0000 1000bf96f94SGerd Hoffmann #define SITD_RESULTS_TYBYTES_SH 16 1010bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_MASK 0x0000ff00 1020bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_SH 8 1030bf96f94SGerd Hoffmann #define SITD_RESULTS_ACTIVE (1 << 7) 1040bf96f94SGerd Hoffmann #define SITD_RESULTS_ERR (1 << 6) 1050bf96f94SGerd Hoffmann #define SITD_RESULTS_DBERR (1 << 5) 1060bf96f94SGerd Hoffmann #define SITD_RESULTS_BABBLE (1 << 4) 1070bf96f94SGerd Hoffmann #define SITD_RESULTS_XACTERR (1 << 3) 1080bf96f94SGerd Hoffmann #define SITD_RESULTS_MISSEDUF (1 << 2) 1090bf96f94SGerd Hoffmann #define SITD_RESULTS_SPLITXSTATE (1 << 1) 1100bf96f94SGerd Hoffmann 1110bf96f94SGerd Hoffmann uint32_t bufptr[2]; 1120bf96f94SGerd Hoffmann #define SITD_BUFPTR_MASK 0xfffff000 1130bf96f94SGerd Hoffmann #define SITD_BUFPTR_CURROFF_MASK 0x00000fff 1140bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_MASK 0x00000018 1150bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_SH 3 1160bf96f94SGerd Hoffmann #define SITD_BUFPTR_TCNT_MASK 0x00000007 1170bf96f94SGerd Hoffmann 1180bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 1190bf96f94SGerd Hoffmann } EHCIsitd; 1200bf96f94SGerd Hoffmann 1210bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.5 1220bf96f94SGerd Hoffmann */ 1230bf96f94SGerd Hoffmann typedef struct EHCIqtd { 1240bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1250bf96f94SGerd Hoffmann uint32_t altnext; /* Standard next link pointer */ 1260bf96f94SGerd Hoffmann uint32_t token; 1270bf96f94SGerd Hoffmann #define QTD_TOKEN_DTOGGLE (1 << 31) 1280bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_MASK 0x7fff0000 1290bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_SH 16 1300bf96f94SGerd Hoffmann #define QTD_TOKEN_IOC (1 << 15) 1310bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_MASK 0x00007000 1320bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_SH 12 1330bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_MASK 0x00000c00 1340bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_SH 10 1350bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_MASK 0x00000300 1360bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_SH 8 1370bf96f94SGerd Hoffmann #define QTD_TOKEN_ACTIVE (1 << 7) 1380bf96f94SGerd Hoffmann #define QTD_TOKEN_HALT (1 << 6) 1390bf96f94SGerd Hoffmann #define QTD_TOKEN_DBERR (1 << 5) 1400bf96f94SGerd Hoffmann #define QTD_TOKEN_BABBLE (1 << 4) 1410bf96f94SGerd Hoffmann #define QTD_TOKEN_XACTERR (1 << 3) 1420bf96f94SGerd Hoffmann #define QTD_TOKEN_MISSEDUF (1 << 2) 1430bf96f94SGerd Hoffmann #define QTD_TOKEN_SPLITXSTATE (1 << 1) 1440bf96f94SGerd Hoffmann #define QTD_TOKEN_PING (1 << 0) 1450bf96f94SGerd Hoffmann 1460bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 1470bf96f94SGerd Hoffmann #define QTD_BUFPTR_MASK 0xfffff000 1480bf96f94SGerd Hoffmann #define QTD_BUFPTR_SH 12 1490bf96f94SGerd Hoffmann } EHCIqtd; 1500bf96f94SGerd Hoffmann 1510bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.6 1520bf96f94SGerd Hoffmann */ 1530bf96f94SGerd Hoffmann typedef struct EHCIqh { 1540bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1550bf96f94SGerd Hoffmann 1560bf96f94SGerd Hoffmann /* endpoint characteristics */ 1570bf96f94SGerd Hoffmann uint32_t epchar; 1580bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_MASK 0xf0000000 1590bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_SH 28 1600bf96f94SGerd Hoffmann #define QH_EPCHAR_C (1 << 27) 1610bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_MASK 0x07FF0000 1620bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_SH 16 1630bf96f94SGerd Hoffmann #define QH_EPCHAR_H (1 << 15) 1640bf96f94SGerd Hoffmann #define QH_EPCHAR_DTC (1 << 14) 1650bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_MASK 0x00003000 1660bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_SH 12 1670bf96f94SGerd Hoffmann #define EHCI_QH_EPS_FULL 0 1680bf96f94SGerd Hoffmann #define EHCI_QH_EPS_LOW 1 1690bf96f94SGerd Hoffmann #define EHCI_QH_EPS_HIGH 2 1700bf96f94SGerd Hoffmann #define EHCI_QH_EPS_RESERVED 3 1710bf96f94SGerd Hoffmann 1720bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_MASK 0x00000f00 1730bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_SH 8 1740bf96f94SGerd Hoffmann #define QH_EPCHAR_I (1 << 7) 1750bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_MASK 0x0000007f 1760bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_SH 0 1770bf96f94SGerd Hoffmann 1780bf96f94SGerd Hoffmann /* endpoint capabilities */ 1790bf96f94SGerd Hoffmann uint32_t epcap; 1800bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_MASK 0xc0000000 1810bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_SH 30 1820bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_MASK 0x3f800000 1830bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_SH 23 1840bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_MASK 0x007f0000 1850bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_SH 16 1860bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_MASK 0x0000ff00 1870bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_SH 8 1880bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_MASK 0x000000ff 1890bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_SH 0 1900bf96f94SGerd Hoffmann 1910bf96f94SGerd Hoffmann uint32_t current_qtd; /* Standard next link pointer */ 1920bf96f94SGerd Hoffmann uint32_t next_qtd; /* Standard next link pointer */ 1930bf96f94SGerd Hoffmann uint32_t altnext_qtd; 1940bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_MASK 0x0000001e 1950bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_SH 1 1960bf96f94SGerd Hoffmann 1970bf96f94SGerd Hoffmann uint32_t token; /* Same as QTD token */ 1980bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 1990bf96f94SGerd Hoffmann #define BUFPTR_CPROGMASK_MASK 0x000000ff 2000bf96f94SGerd Hoffmann #define BUFPTR_FRAMETAG_MASK 0x0000001f 2010bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_MASK 0x00000fe0 2020bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_SH 5 2030bf96f94SGerd Hoffmann } EHCIqh; 2040bf96f94SGerd Hoffmann 2050bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.7 2060bf96f94SGerd Hoffmann */ 2070bf96f94SGerd Hoffmann typedef struct EHCIfstn { 2080bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 2090bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 2100bf96f94SGerd Hoffmann } EHCIfstn; 2110bf96f94SGerd Hoffmann 2120bf96f94SGerd Hoffmann enum async_state { 2130bf96f94SGerd Hoffmann EHCI_ASYNC_NONE = 0, 2140bf96f94SGerd Hoffmann EHCI_ASYNC_INITIALIZED, 2150bf96f94SGerd Hoffmann EHCI_ASYNC_INFLIGHT, 2160bf96f94SGerd Hoffmann EHCI_ASYNC_FINISHED, 2170bf96f94SGerd Hoffmann }; 2180bf96f94SGerd Hoffmann 2190bf96f94SGerd Hoffmann struct EHCIPacket { 2200bf96f94SGerd Hoffmann EHCIQueue *queue; 2210bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIPacket) next; 2220bf96f94SGerd Hoffmann 2230bf96f94SGerd Hoffmann EHCIqtd qtd; /* copy of current QTD (being worked on) */ 2240bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 2250bf96f94SGerd Hoffmann 2260bf96f94SGerd Hoffmann USBPacket packet; 2270bf96f94SGerd Hoffmann QEMUSGList sgl; 2280bf96f94SGerd Hoffmann int pid; 2290bf96f94SGerd Hoffmann enum async_state async; 2300bf96f94SGerd Hoffmann }; 2310bf96f94SGerd Hoffmann 2320bf96f94SGerd Hoffmann struct EHCIQueue { 2330bf96f94SGerd Hoffmann EHCIState *ehci; 2340bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIQueue) next; 2350bf96f94SGerd Hoffmann uint32_t seen; 2360bf96f94SGerd Hoffmann uint64_t ts; 2370bf96f94SGerd Hoffmann int async; 2380bf96f94SGerd Hoffmann int transact_ctr; 2390bf96f94SGerd Hoffmann 2400bf96f94SGerd Hoffmann /* cached data from guest - needs to be flushed 2410bf96f94SGerd Hoffmann * when guest removes an entry (doorbell, handshake sequence) 2420bf96f94SGerd Hoffmann */ 2430bf96f94SGerd Hoffmann EHCIqh qh; /* copy of current QH (being worked on) */ 2440bf96f94SGerd Hoffmann uint32_t qhaddr; /* address QH read from */ 2450bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 246bbbc39ccSHans de Goede int last_pid; /* pid of last packet executed */ 2470bf96f94SGerd Hoffmann USBDevice *dev; 248eae3eb3eSPaolo Bonzini QTAILQ_HEAD(, EHCIPacket) packets; 2490bf96f94SGerd Hoffmann }; 2500bf96f94SGerd Hoffmann 2510bf96f94SGerd Hoffmann typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead; 2520bf96f94SGerd Hoffmann 2530bf96f94SGerd Hoffmann struct EHCIState { 2540bf96f94SGerd Hoffmann USBBus bus; 255adbecc89SGerd Hoffmann DeviceState *device; 2560bf96f94SGerd Hoffmann qemu_irq irq; 2570bf96f94SGerd Hoffmann MemoryRegion mem; 258df32fd1cSPaolo Bonzini AddressSpace *as; 2590bf96f94SGerd Hoffmann MemoryRegion mem_caps; 2600bf96f94SGerd Hoffmann MemoryRegion mem_opreg; 2610bf96f94SGerd Hoffmann MemoryRegion mem_ports; 2620bf96f94SGerd Hoffmann int companion_count; 263ec56214fSGerd Hoffmann bool companion_enable; 2640bf96f94SGerd Hoffmann uint16_t capsbase; 2650bf96f94SGerd Hoffmann uint16_t opregbase; 266cc8d6a84SKuo-Jung Su uint16_t portscbase; 267cc8d6a84SKuo-Jung Su uint16_t portnr; 2680bf96f94SGerd Hoffmann 2690bf96f94SGerd Hoffmann /* properties */ 2700bf96f94SGerd Hoffmann uint32_t maxframes; 2710bf96f94SGerd Hoffmann 2720bf96f94SGerd Hoffmann /* 2730bf96f94SGerd Hoffmann * EHCI spec version 1.0 Section 2.3 2740bf96f94SGerd Hoffmann * Host Controller Operational Registers 2750bf96f94SGerd Hoffmann */ 2760bf96f94SGerd Hoffmann uint8_t caps[CAPA_SIZE]; 2770bf96f94SGerd Hoffmann union { 278cc8d6a84SKuo-Jung Su uint32_t opreg[0x44/sizeof(uint32_t)]; 2790bf96f94SGerd Hoffmann struct { 2800bf96f94SGerd Hoffmann uint32_t usbcmd; 2810bf96f94SGerd Hoffmann uint32_t usbsts; 2820bf96f94SGerd Hoffmann uint32_t usbintr; 2830bf96f94SGerd Hoffmann uint32_t frindex; 2840bf96f94SGerd Hoffmann uint32_t ctrldssegment; 2850bf96f94SGerd Hoffmann uint32_t periodiclistbase; 2860bf96f94SGerd Hoffmann uint32_t asynclistaddr; 2870bf96f94SGerd Hoffmann uint32_t notused[9]; 2880bf96f94SGerd Hoffmann uint32_t configflag; 2890bf96f94SGerd Hoffmann }; 2900bf96f94SGerd Hoffmann }; 291*1c83f366SPhilippe Mathieu-Daudé uint32_t portsc[EHCI_PORTS]; 2920bf96f94SGerd Hoffmann 2930bf96f94SGerd Hoffmann /* 2940bf96f94SGerd Hoffmann * Internal states, shadow registers, etc 2950bf96f94SGerd Hoffmann */ 2960bf96f94SGerd Hoffmann QEMUTimer *frame_timer; 2970bf96f94SGerd Hoffmann QEMUBH *async_bh; 298ad3c5412SGerd Hoffmann bool working; 2990bf96f94SGerd Hoffmann uint32_t astate; /* Current state in asynchronous schedule */ 3000bf96f94SGerd Hoffmann uint32_t pstate; /* Current state in periodic schedule */ 301*1c83f366SPhilippe Mathieu-Daudé USBPort ports[EHCI_PORTS]; 302*1c83f366SPhilippe Mathieu-Daudé USBPort *companion_ports[EHCI_PORTS]; 3030bf96f94SGerd Hoffmann uint32_t usbsts_pending; 3040bf96f94SGerd Hoffmann uint32_t usbsts_frindex; 3050bf96f94SGerd Hoffmann EHCIQueueHead aqueues; 3060bf96f94SGerd Hoffmann EHCIQueueHead pqueues; 3070bf96f94SGerd Hoffmann 3080bf96f94SGerd Hoffmann /* which address to look at next */ 3090bf96f94SGerd Hoffmann uint32_t a_fetch_addr; 3100bf96f94SGerd Hoffmann uint32_t p_fetch_addr; 3110bf96f94SGerd Hoffmann 3120bf96f94SGerd Hoffmann USBPacket ipacket; 3130bf96f94SGerd Hoffmann QEMUSGList isgl; 3140bf96f94SGerd Hoffmann 3150bf96f94SGerd Hoffmann uint64_t last_run_ns; 3160bf96f94SGerd Hoffmann uint32_t async_stepdown; 31780826240SHans de Goede uint32_t periodic_sched_active; 3180bf96f94SGerd Hoffmann bool int_req_by_async; 31905a36991SGonglei VMChangeStateEntry *vmstate; 3200bf96f94SGerd Hoffmann }; 3210bf96f94SGerd Hoffmann 3220bf96f94SGerd Hoffmann extern const VMStateDescription vmstate_ehci; 3230bf96f94SGerd Hoffmann 324d4614cc3SAndreas Färber void usb_ehci_init(EHCIState *s, DeviceState *dev); 325d710e1e7SLi Qiang void usb_ehci_finalize(EHCIState *s); 32608f4c90bSAndreas Färber void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp); 327b69c3c21SMarkus Armbruster void usb_ehci_unrealize(EHCIState *s, DeviceState *dev); 3284e289b1bSGonglei void ehci_reset(void *opaque); 329cb9c377fSPaolo Bonzini 3305aa3ca9fSAndreas Färber #define TYPE_PCI_EHCI "pci-ehci-usb" 3318063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(EHCIPCIState, PCI_EHCI) 3325aa3ca9fSAndreas Färber 333db1015e9SEduardo Habkost struct EHCIPCIState { 3345aa3ca9fSAndreas Färber /*< private >*/ 3355aa3ca9fSAndreas Färber PCIDevice pcidev; 3365aa3ca9fSAndreas Färber /*< public >*/ 3375aa3ca9fSAndreas Färber 3385aa3ca9fSAndreas Färber EHCIState ehci; 339db1015e9SEduardo Habkost }; 3405aa3ca9fSAndreas Färber 3415aa3ca9fSAndreas Färber 3425aa3ca9fSAndreas Färber #define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb" 343114529f7SHongbo Zhang #define TYPE_PLATFORM_EHCI "platform-ehci-usb" 344aee7499aSAndreas Färber #define TYPE_EXYNOS4210_EHCI "exynos4210-ehci-usb" 3452e4dfe80SNiek Linnenbank #define TYPE_AW_H3_EHCI "aw-h3-ehci-usb" 346e23e7b12SHavard Skinnemoen #define TYPE_NPCM7XX_EHCI "npcm7xx-ehci-usb" 34720c57043SAndreas Färber #define TYPE_TEGRA2_EHCI "tegra2-ehci-usb" 3489ffe4ce5SBALATON Zoltan #define TYPE_PPC4xx_EHCI "ppc4xx-ehci-usb" 3494e3d8b4bSKuo-Jung Su #define TYPE_FUSBH200_EHCI "fusbh200-ehci-usb" 350aee7499aSAndreas Färber 351a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(EHCISysBusState, SysBusEHCIClass, SYS_BUS_EHCI) 3525aa3ca9fSAndreas Färber 353db1015e9SEduardo Habkost struct EHCISysBusState { 3545aa3ca9fSAndreas Färber /*< private >*/ 3555aa3ca9fSAndreas Färber SysBusDevice parent_obj; 3565aa3ca9fSAndreas Färber /*< public >*/ 3575aa3ca9fSAndreas Färber 3585aa3ca9fSAndreas Färber EHCIState ehci; 359db1015e9SEduardo Habkost }; 3605aa3ca9fSAndreas Färber 361db1015e9SEduardo Habkost struct SysBusEHCIClass { 3624a434367SAndreas Färber /*< private >*/ 3634a434367SAndreas Färber SysBusDeviceClass parent_class; 3644a434367SAndreas Färber /*< public >*/ 3654a434367SAndreas Färber 3664a434367SAndreas Färber uint16_t capsbase; 3674a434367SAndreas Färber uint16_t opregbase; 368cc8d6a84SKuo-Jung Su uint16_t portscbase; 369cc8d6a84SKuo-Jung Su uint16_t portnr; 370db1015e9SEduardo Habkost }; 3714a434367SAndreas Färber 3728063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(FUSBH200EHCIState, FUSBH200_EHCI) 3734e3d8b4bSKuo-Jung Su 374db1015e9SEduardo Habkost struct FUSBH200EHCIState { 3754e3d8b4bSKuo-Jung Su /*< private >*/ 3764e3d8b4bSKuo-Jung Su EHCISysBusState parent_obj; 3774e3d8b4bSKuo-Jung Su /*< public >*/ 3784e3d8b4bSKuo-Jung Su 3794e3d8b4bSKuo-Jung Su MemoryRegion mem_vendor; 380db1015e9SEduardo Habkost }; 3814e3d8b4bSKuo-Jung Su 382cb9c377fSPaolo Bonzini #endif 383