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 70bf96f94SGerd Hoffmann * version 2 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 * 140bf96f94SGerd Hoffmann * You should have received a copy of the GNU General Public License 150bf96f94SGerd Hoffmann * along with this program; if not, see <http://www.gnu.org/licenses/>. 160bf96f94SGerd Hoffmann */ 17cb9c377fSPaolo Bonzini #ifndef HW_USB_EHCI_H 18cb9c377fSPaolo Bonzini #define HW_USB_EHCI_H 1 190bf96f94SGerd Hoffmann 200bf96f94SGerd Hoffmann #include "hw/hw.h" 211de7afc9SPaolo Bonzini #include "qemu/timer.h" 220bf96f94SGerd Hoffmann #include "hw/usb.h" 2383c9089eSPaolo Bonzini #include "monitor/monitor.h" 240bf96f94SGerd Hoffmann #include "trace.h" 259c17d615SPaolo Bonzini #include "sysemu/dma.h" 269c17d615SPaolo Bonzini #include "sysemu/sysemu.h" 27*5aa3ca9fSAndreas Färber #include "hw/pci/pci.h" 28*5aa3ca9fSAndreas Färber #include "hw/sysbus.h" 290bf96f94SGerd Hoffmann 300bf96f94SGerd Hoffmann #ifndef EHCI_DEBUG 310bf96f94SGerd Hoffmann #define EHCI_DEBUG 0 320bf96f94SGerd Hoffmann #endif 330bf96f94SGerd Hoffmann 340bf96f94SGerd Hoffmann #if EHCI_DEBUG 350bf96f94SGerd Hoffmann #define DPRINTF printf 360bf96f94SGerd Hoffmann #else 370bf96f94SGerd Hoffmann #define DPRINTF(...) 380bf96f94SGerd Hoffmann #endif 390bf96f94SGerd Hoffmann 400bf96f94SGerd Hoffmann #define MMIO_SIZE 0x1000 410bf96f94SGerd Hoffmann #define CAPA_SIZE 0x10 420bf96f94SGerd Hoffmann 430bf96f94SGerd Hoffmann #define PORTSC 0x0044 440bf96f94SGerd Hoffmann #define PORTSC_BEGIN PORTSC 450bf96f94SGerd Hoffmann #define PORTSC_END (PORTSC + 4 * NB_PORTS) 460bf96f94SGerd Hoffmann 470bf96f94SGerd Hoffmann #define NB_PORTS 6 /* Number of downstream ports */ 480bf96f94SGerd Hoffmann 490bf96f94SGerd Hoffmann typedef struct EHCIPacket EHCIPacket; 500bf96f94SGerd Hoffmann typedef struct EHCIQueue EHCIQueue; 510bf96f94SGerd Hoffmann typedef struct EHCIState EHCIState; 520bf96f94SGerd Hoffmann 530bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.3 540bf96f94SGerd Hoffmann */ 550bf96f94SGerd Hoffmann typedef struct EHCIitd { 560bf96f94SGerd Hoffmann uint32_t next; 570bf96f94SGerd Hoffmann 580bf96f94SGerd Hoffmann uint32_t transact[8]; 590bf96f94SGerd Hoffmann #define ITD_XACT_ACTIVE (1 << 31) 600bf96f94SGerd Hoffmann #define ITD_XACT_DBERROR (1 << 30) 610bf96f94SGerd Hoffmann #define ITD_XACT_BABBLE (1 << 29) 620bf96f94SGerd Hoffmann #define ITD_XACT_XACTERR (1 << 28) 630bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_MASK 0x0fff0000 640bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_SH 16 650bf96f94SGerd Hoffmann #define ITD_XACT_IOC (1 << 15) 660bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_MASK 0x00007000 670bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_SH 12 680bf96f94SGerd Hoffmann #define ITD_XACT_OFFSET_MASK 0x00000fff 690bf96f94SGerd Hoffmann 700bf96f94SGerd Hoffmann uint32_t bufptr[7]; 710bf96f94SGerd Hoffmann #define ITD_BUFPTR_MASK 0xfffff000 720bf96f94SGerd Hoffmann #define ITD_BUFPTR_SH 12 730bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_MASK 0x00000f00 740bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_SH 8 750bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_MASK 0x0000007f 760bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_SH 0 770bf96f94SGerd Hoffmann #define ITD_BUFPTR_DIRECTION (1 << 11) 780bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_MASK 0x000007ff 790bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_SH 0 800bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_MASK 0x00000003 810bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_SH 0 820bf96f94SGerd Hoffmann } EHCIitd; 830bf96f94SGerd Hoffmann 840bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.4 850bf96f94SGerd Hoffmann */ 860bf96f94SGerd Hoffmann typedef struct EHCIsitd { 870bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 880bf96f94SGerd Hoffmann uint32_t epchar; 890bf96f94SGerd Hoffmann #define SITD_EPCHAR_IO (1 << 31) 900bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_MASK 0x7f000000 910bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_SH 24 920bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADD_MASK 0x007f0000 930bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADDR_SH 16 940bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_MASK 0x00000f00 950bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_SH 8 960bf96f94SGerd Hoffmann #define SITD_EPCHAR_DEVADDR_MASK 0x0000007f 970bf96f94SGerd Hoffmann 980bf96f94SGerd Hoffmann uint32_t uframe; 990bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_MASK 0x0000ff00 1000bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_SH 8 1010bf96f94SGerd Hoffmann #define SITD_UFRAME_SMASK_MASK 0x000000ff 1020bf96f94SGerd Hoffmann 1030bf96f94SGerd Hoffmann uint32_t results; 1040bf96f94SGerd Hoffmann #define SITD_RESULTS_IOC (1 << 31) 1050bf96f94SGerd Hoffmann #define SITD_RESULTS_PGSEL (1 << 30) 1060bf96f94SGerd Hoffmann #define SITD_RESULTS_TBYTES_MASK 0x03ff0000 1070bf96f94SGerd Hoffmann #define SITD_RESULTS_TYBYTES_SH 16 1080bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_MASK 0x0000ff00 1090bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_SH 8 1100bf96f94SGerd Hoffmann #define SITD_RESULTS_ACTIVE (1 << 7) 1110bf96f94SGerd Hoffmann #define SITD_RESULTS_ERR (1 << 6) 1120bf96f94SGerd Hoffmann #define SITD_RESULTS_DBERR (1 << 5) 1130bf96f94SGerd Hoffmann #define SITD_RESULTS_BABBLE (1 << 4) 1140bf96f94SGerd Hoffmann #define SITD_RESULTS_XACTERR (1 << 3) 1150bf96f94SGerd Hoffmann #define SITD_RESULTS_MISSEDUF (1 << 2) 1160bf96f94SGerd Hoffmann #define SITD_RESULTS_SPLITXSTATE (1 << 1) 1170bf96f94SGerd Hoffmann 1180bf96f94SGerd Hoffmann uint32_t bufptr[2]; 1190bf96f94SGerd Hoffmann #define SITD_BUFPTR_MASK 0xfffff000 1200bf96f94SGerd Hoffmann #define SITD_BUFPTR_CURROFF_MASK 0x00000fff 1210bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_MASK 0x00000018 1220bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_SH 3 1230bf96f94SGerd Hoffmann #define SITD_BUFPTR_TCNT_MASK 0x00000007 1240bf96f94SGerd Hoffmann 1250bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 1260bf96f94SGerd Hoffmann } EHCIsitd; 1270bf96f94SGerd Hoffmann 1280bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.5 1290bf96f94SGerd Hoffmann */ 1300bf96f94SGerd Hoffmann typedef struct EHCIqtd { 1310bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1320bf96f94SGerd Hoffmann uint32_t altnext; /* Standard next link pointer */ 1330bf96f94SGerd Hoffmann uint32_t token; 1340bf96f94SGerd Hoffmann #define QTD_TOKEN_DTOGGLE (1 << 31) 1350bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_MASK 0x7fff0000 1360bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_SH 16 1370bf96f94SGerd Hoffmann #define QTD_TOKEN_IOC (1 << 15) 1380bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_MASK 0x00007000 1390bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_SH 12 1400bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_MASK 0x00000c00 1410bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_SH 10 1420bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_MASK 0x00000300 1430bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_SH 8 1440bf96f94SGerd Hoffmann #define QTD_TOKEN_ACTIVE (1 << 7) 1450bf96f94SGerd Hoffmann #define QTD_TOKEN_HALT (1 << 6) 1460bf96f94SGerd Hoffmann #define QTD_TOKEN_DBERR (1 << 5) 1470bf96f94SGerd Hoffmann #define QTD_TOKEN_BABBLE (1 << 4) 1480bf96f94SGerd Hoffmann #define QTD_TOKEN_XACTERR (1 << 3) 1490bf96f94SGerd Hoffmann #define QTD_TOKEN_MISSEDUF (1 << 2) 1500bf96f94SGerd Hoffmann #define QTD_TOKEN_SPLITXSTATE (1 << 1) 1510bf96f94SGerd Hoffmann #define QTD_TOKEN_PING (1 << 0) 1520bf96f94SGerd Hoffmann 1530bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 1540bf96f94SGerd Hoffmann #define QTD_BUFPTR_MASK 0xfffff000 1550bf96f94SGerd Hoffmann #define QTD_BUFPTR_SH 12 1560bf96f94SGerd Hoffmann } EHCIqtd; 1570bf96f94SGerd Hoffmann 1580bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.6 1590bf96f94SGerd Hoffmann */ 1600bf96f94SGerd Hoffmann typedef struct EHCIqh { 1610bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1620bf96f94SGerd Hoffmann 1630bf96f94SGerd Hoffmann /* endpoint characteristics */ 1640bf96f94SGerd Hoffmann uint32_t epchar; 1650bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_MASK 0xf0000000 1660bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_SH 28 1670bf96f94SGerd Hoffmann #define QH_EPCHAR_C (1 << 27) 1680bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_MASK 0x07FF0000 1690bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_SH 16 1700bf96f94SGerd Hoffmann #define QH_EPCHAR_H (1 << 15) 1710bf96f94SGerd Hoffmann #define QH_EPCHAR_DTC (1 << 14) 1720bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_MASK 0x00003000 1730bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_SH 12 1740bf96f94SGerd Hoffmann #define EHCI_QH_EPS_FULL 0 1750bf96f94SGerd Hoffmann #define EHCI_QH_EPS_LOW 1 1760bf96f94SGerd Hoffmann #define EHCI_QH_EPS_HIGH 2 1770bf96f94SGerd Hoffmann #define EHCI_QH_EPS_RESERVED 3 1780bf96f94SGerd Hoffmann 1790bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_MASK 0x00000f00 1800bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_SH 8 1810bf96f94SGerd Hoffmann #define QH_EPCHAR_I (1 << 7) 1820bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_MASK 0x0000007f 1830bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_SH 0 1840bf96f94SGerd Hoffmann 1850bf96f94SGerd Hoffmann /* endpoint capabilities */ 1860bf96f94SGerd Hoffmann uint32_t epcap; 1870bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_MASK 0xc0000000 1880bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_SH 30 1890bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_MASK 0x3f800000 1900bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_SH 23 1910bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_MASK 0x007f0000 1920bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_SH 16 1930bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_MASK 0x0000ff00 1940bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_SH 8 1950bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_MASK 0x000000ff 1960bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_SH 0 1970bf96f94SGerd Hoffmann 1980bf96f94SGerd Hoffmann uint32_t current_qtd; /* Standard next link pointer */ 1990bf96f94SGerd Hoffmann uint32_t next_qtd; /* Standard next link pointer */ 2000bf96f94SGerd Hoffmann uint32_t altnext_qtd; 2010bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_MASK 0x0000001e 2020bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_SH 1 2030bf96f94SGerd Hoffmann 2040bf96f94SGerd Hoffmann uint32_t token; /* Same as QTD token */ 2050bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 2060bf96f94SGerd Hoffmann #define BUFPTR_CPROGMASK_MASK 0x000000ff 2070bf96f94SGerd Hoffmann #define BUFPTR_FRAMETAG_MASK 0x0000001f 2080bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_MASK 0x00000fe0 2090bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_SH 5 2100bf96f94SGerd Hoffmann } EHCIqh; 2110bf96f94SGerd Hoffmann 2120bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.7 2130bf96f94SGerd Hoffmann */ 2140bf96f94SGerd Hoffmann typedef struct EHCIfstn { 2150bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 2160bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 2170bf96f94SGerd Hoffmann } EHCIfstn; 2180bf96f94SGerd Hoffmann 2190bf96f94SGerd Hoffmann enum async_state { 2200bf96f94SGerd Hoffmann EHCI_ASYNC_NONE = 0, 2210bf96f94SGerd Hoffmann EHCI_ASYNC_INITIALIZED, 2220bf96f94SGerd Hoffmann EHCI_ASYNC_INFLIGHT, 2230bf96f94SGerd Hoffmann EHCI_ASYNC_FINISHED, 2240bf96f94SGerd Hoffmann }; 2250bf96f94SGerd Hoffmann 2260bf96f94SGerd Hoffmann struct EHCIPacket { 2270bf96f94SGerd Hoffmann EHCIQueue *queue; 2280bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIPacket) next; 2290bf96f94SGerd Hoffmann 2300bf96f94SGerd Hoffmann EHCIqtd qtd; /* copy of current QTD (being worked on) */ 2310bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 2320bf96f94SGerd Hoffmann 2330bf96f94SGerd Hoffmann USBPacket packet; 2340bf96f94SGerd Hoffmann QEMUSGList sgl; 2350bf96f94SGerd Hoffmann int pid; 2360bf96f94SGerd Hoffmann enum async_state async; 2370bf96f94SGerd Hoffmann }; 2380bf96f94SGerd Hoffmann 2390bf96f94SGerd Hoffmann struct EHCIQueue { 2400bf96f94SGerd Hoffmann EHCIState *ehci; 2410bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIQueue) next; 2420bf96f94SGerd Hoffmann uint32_t seen; 2430bf96f94SGerd Hoffmann uint64_t ts; 2440bf96f94SGerd Hoffmann int async; 2450bf96f94SGerd Hoffmann int transact_ctr; 2460bf96f94SGerd Hoffmann 2470bf96f94SGerd Hoffmann /* cached data from guest - needs to be flushed 2480bf96f94SGerd Hoffmann * when guest removes an entry (doorbell, handshake sequence) 2490bf96f94SGerd Hoffmann */ 2500bf96f94SGerd Hoffmann EHCIqh qh; /* copy of current QH (being worked on) */ 2510bf96f94SGerd Hoffmann uint32_t qhaddr; /* address QH read from */ 2520bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 253bbbc39ccSHans de Goede int last_pid; /* pid of last packet executed */ 2540bf96f94SGerd Hoffmann USBDevice *dev; 2550bf96f94SGerd Hoffmann QTAILQ_HEAD(pkts_head, EHCIPacket) packets; 2560bf96f94SGerd Hoffmann }; 2570bf96f94SGerd Hoffmann 2580bf96f94SGerd Hoffmann typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead; 2590bf96f94SGerd Hoffmann 2600bf96f94SGerd Hoffmann struct EHCIState { 2610bf96f94SGerd Hoffmann USBBus bus; 2620bf96f94SGerd Hoffmann qemu_irq irq; 2630bf96f94SGerd Hoffmann MemoryRegion mem; 2640bf96f94SGerd Hoffmann DMAContext *dma; 2650bf96f94SGerd Hoffmann MemoryRegion mem_caps; 2660bf96f94SGerd Hoffmann MemoryRegion mem_opreg; 2670bf96f94SGerd Hoffmann MemoryRegion mem_ports; 2680bf96f94SGerd Hoffmann int companion_count; 2690bf96f94SGerd Hoffmann uint16_t capsbase; 2700bf96f94SGerd Hoffmann uint16_t opregbase; 2710bf96f94SGerd Hoffmann 2720bf96f94SGerd Hoffmann /* properties */ 2730bf96f94SGerd Hoffmann uint32_t maxframes; 2740bf96f94SGerd Hoffmann 2750bf96f94SGerd Hoffmann /* 2760bf96f94SGerd Hoffmann * EHCI spec version 1.0 Section 2.3 2770bf96f94SGerd Hoffmann * Host Controller Operational Registers 2780bf96f94SGerd Hoffmann */ 2790bf96f94SGerd Hoffmann uint8_t caps[CAPA_SIZE]; 2800bf96f94SGerd Hoffmann union { 2810bf96f94SGerd Hoffmann uint32_t opreg[PORTSC_BEGIN/sizeof(uint32_t)]; 2820bf96f94SGerd Hoffmann struct { 2830bf96f94SGerd Hoffmann uint32_t usbcmd; 2840bf96f94SGerd Hoffmann uint32_t usbsts; 2850bf96f94SGerd Hoffmann uint32_t usbintr; 2860bf96f94SGerd Hoffmann uint32_t frindex; 2870bf96f94SGerd Hoffmann uint32_t ctrldssegment; 2880bf96f94SGerd Hoffmann uint32_t periodiclistbase; 2890bf96f94SGerd Hoffmann uint32_t asynclistaddr; 2900bf96f94SGerd Hoffmann uint32_t notused[9]; 2910bf96f94SGerd Hoffmann uint32_t configflag; 2920bf96f94SGerd Hoffmann }; 2930bf96f94SGerd Hoffmann }; 2940bf96f94SGerd Hoffmann uint32_t portsc[NB_PORTS]; 2950bf96f94SGerd Hoffmann 2960bf96f94SGerd Hoffmann /* 2970bf96f94SGerd Hoffmann * Internal states, shadow registers, etc 2980bf96f94SGerd Hoffmann */ 2990bf96f94SGerd Hoffmann QEMUTimer *frame_timer; 3000bf96f94SGerd Hoffmann QEMUBH *async_bh; 3010bf96f94SGerd Hoffmann uint32_t astate; /* Current state in asynchronous schedule */ 3020bf96f94SGerd Hoffmann uint32_t pstate; /* Current state in periodic schedule */ 3030bf96f94SGerd Hoffmann USBPort ports[NB_PORTS]; 3040bf96f94SGerd Hoffmann USBPort *companion_ports[NB_PORTS]; 3050bf96f94SGerd Hoffmann uint32_t usbsts_pending; 3060bf96f94SGerd Hoffmann uint32_t usbsts_frindex; 3070bf96f94SGerd Hoffmann EHCIQueueHead aqueues; 3080bf96f94SGerd Hoffmann EHCIQueueHead pqueues; 3090bf96f94SGerd Hoffmann 3100bf96f94SGerd Hoffmann /* which address to look at next */ 3110bf96f94SGerd Hoffmann uint32_t a_fetch_addr; 3120bf96f94SGerd Hoffmann uint32_t p_fetch_addr; 3130bf96f94SGerd Hoffmann 3140bf96f94SGerd Hoffmann USBPacket ipacket; 3150bf96f94SGerd Hoffmann QEMUSGList isgl; 3160bf96f94SGerd Hoffmann 3170bf96f94SGerd Hoffmann uint64_t last_run_ns; 3180bf96f94SGerd Hoffmann uint32_t async_stepdown; 31980826240SHans de Goede uint32_t periodic_sched_active; 3200bf96f94SGerd Hoffmann bool int_req_by_async; 3210bf96f94SGerd Hoffmann }; 3220bf96f94SGerd Hoffmann 3230bf96f94SGerd Hoffmann extern const VMStateDescription vmstate_ehci; 3240bf96f94SGerd Hoffmann 3250bf96f94SGerd Hoffmann void usb_ehci_initfn(EHCIState *s, DeviceState *dev); 326cb9c377fSPaolo Bonzini 327*5aa3ca9fSAndreas Färber #define TYPE_PCI_EHCI "pci-ehci-usb" 328*5aa3ca9fSAndreas Färber #define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI) 329*5aa3ca9fSAndreas Färber 330*5aa3ca9fSAndreas Färber typedef struct EHCIPCIState { 331*5aa3ca9fSAndreas Färber /*< private >*/ 332*5aa3ca9fSAndreas Färber PCIDevice pcidev; 333*5aa3ca9fSAndreas Färber /*< public >*/ 334*5aa3ca9fSAndreas Färber 335*5aa3ca9fSAndreas Färber EHCIState ehci; 336*5aa3ca9fSAndreas Färber } EHCIPCIState; 337*5aa3ca9fSAndreas Färber 338*5aa3ca9fSAndreas Färber 339*5aa3ca9fSAndreas Färber #define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb" 340*5aa3ca9fSAndreas Färber #define SYS_BUS_EHCI(obj) \ 341*5aa3ca9fSAndreas Färber OBJECT_CHECK(EHCISysBusState, (obj), TYPE_SYS_BUS_EHCI) 342*5aa3ca9fSAndreas Färber 343*5aa3ca9fSAndreas Färber typedef struct EHCISysBusState { 344*5aa3ca9fSAndreas Färber /*< private >*/ 345*5aa3ca9fSAndreas Färber SysBusDevice parent_obj; 346*5aa3ca9fSAndreas Färber /*< public >*/ 347*5aa3ca9fSAndreas Färber 348*5aa3ca9fSAndreas Färber EHCIState ehci; 349*5aa3ca9fSAndreas Färber } EHCISysBusState; 350*5aa3ca9fSAndreas Färber 351cb9c377fSPaolo Bonzini #endif 352