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" 275aa3ca9fSAndreas Färber #include "hw/pci/pci.h" 285aa3ca9fSAndreas 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 43cc8d6a84SKuo-Jung Su #define NB_PORTS 6 /* Max. Number of downstream ports */ 440bf96f94SGerd Hoffmann 450bf96f94SGerd Hoffmann typedef struct EHCIPacket EHCIPacket; 460bf96f94SGerd Hoffmann typedef struct EHCIQueue EHCIQueue; 470bf96f94SGerd Hoffmann typedef struct EHCIState EHCIState; 480bf96f94SGerd Hoffmann 490bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.3 500bf96f94SGerd Hoffmann */ 510bf96f94SGerd Hoffmann typedef struct EHCIitd { 520bf96f94SGerd Hoffmann uint32_t next; 530bf96f94SGerd Hoffmann 540bf96f94SGerd Hoffmann uint32_t transact[8]; 550bf96f94SGerd Hoffmann #define ITD_XACT_ACTIVE (1 << 31) 560bf96f94SGerd Hoffmann #define ITD_XACT_DBERROR (1 << 30) 570bf96f94SGerd Hoffmann #define ITD_XACT_BABBLE (1 << 29) 580bf96f94SGerd Hoffmann #define ITD_XACT_XACTERR (1 << 28) 590bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_MASK 0x0fff0000 600bf96f94SGerd Hoffmann #define ITD_XACT_LENGTH_SH 16 610bf96f94SGerd Hoffmann #define ITD_XACT_IOC (1 << 15) 620bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_MASK 0x00007000 630bf96f94SGerd Hoffmann #define ITD_XACT_PGSEL_SH 12 640bf96f94SGerd Hoffmann #define ITD_XACT_OFFSET_MASK 0x00000fff 650bf96f94SGerd Hoffmann 660bf96f94SGerd Hoffmann uint32_t bufptr[7]; 670bf96f94SGerd Hoffmann #define ITD_BUFPTR_MASK 0xfffff000 680bf96f94SGerd Hoffmann #define ITD_BUFPTR_SH 12 690bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_MASK 0x00000f00 700bf96f94SGerd Hoffmann #define ITD_BUFPTR_EP_SH 8 710bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_MASK 0x0000007f 720bf96f94SGerd Hoffmann #define ITD_BUFPTR_DEVADDR_SH 0 730bf96f94SGerd Hoffmann #define ITD_BUFPTR_DIRECTION (1 << 11) 740bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_MASK 0x000007ff 750bf96f94SGerd Hoffmann #define ITD_BUFPTR_MAXPKT_SH 0 760bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_MASK 0x00000003 770bf96f94SGerd Hoffmann #define ITD_BUFPTR_MULT_SH 0 780bf96f94SGerd Hoffmann } EHCIitd; 790bf96f94SGerd Hoffmann 800bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.4 810bf96f94SGerd Hoffmann */ 820bf96f94SGerd Hoffmann typedef struct EHCIsitd { 830bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 840bf96f94SGerd Hoffmann uint32_t epchar; 850bf96f94SGerd Hoffmann #define SITD_EPCHAR_IO (1 << 31) 860bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_MASK 0x7f000000 870bf96f94SGerd Hoffmann #define SITD_EPCHAR_PORTNUM_SH 24 880bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADD_MASK 0x007f0000 890bf96f94SGerd Hoffmann #define SITD_EPCHAR_HUBADDR_SH 16 900bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_MASK 0x00000f00 910bf96f94SGerd Hoffmann #define SITD_EPCHAR_EPNUM_SH 8 920bf96f94SGerd Hoffmann #define SITD_EPCHAR_DEVADDR_MASK 0x0000007f 930bf96f94SGerd Hoffmann 940bf96f94SGerd Hoffmann uint32_t uframe; 950bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_MASK 0x0000ff00 960bf96f94SGerd Hoffmann #define SITD_UFRAME_CMASK_SH 8 970bf96f94SGerd Hoffmann #define SITD_UFRAME_SMASK_MASK 0x000000ff 980bf96f94SGerd Hoffmann 990bf96f94SGerd Hoffmann uint32_t results; 1000bf96f94SGerd Hoffmann #define SITD_RESULTS_IOC (1 << 31) 1010bf96f94SGerd Hoffmann #define SITD_RESULTS_PGSEL (1 << 30) 1020bf96f94SGerd Hoffmann #define SITD_RESULTS_TBYTES_MASK 0x03ff0000 1030bf96f94SGerd Hoffmann #define SITD_RESULTS_TYBYTES_SH 16 1040bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_MASK 0x0000ff00 1050bf96f94SGerd Hoffmann #define SITD_RESULTS_CPROGMASK_SH 8 1060bf96f94SGerd Hoffmann #define SITD_RESULTS_ACTIVE (1 << 7) 1070bf96f94SGerd Hoffmann #define SITD_RESULTS_ERR (1 << 6) 1080bf96f94SGerd Hoffmann #define SITD_RESULTS_DBERR (1 << 5) 1090bf96f94SGerd Hoffmann #define SITD_RESULTS_BABBLE (1 << 4) 1100bf96f94SGerd Hoffmann #define SITD_RESULTS_XACTERR (1 << 3) 1110bf96f94SGerd Hoffmann #define SITD_RESULTS_MISSEDUF (1 << 2) 1120bf96f94SGerd Hoffmann #define SITD_RESULTS_SPLITXSTATE (1 << 1) 1130bf96f94SGerd Hoffmann 1140bf96f94SGerd Hoffmann uint32_t bufptr[2]; 1150bf96f94SGerd Hoffmann #define SITD_BUFPTR_MASK 0xfffff000 1160bf96f94SGerd Hoffmann #define SITD_BUFPTR_CURROFF_MASK 0x00000fff 1170bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_MASK 0x00000018 1180bf96f94SGerd Hoffmann #define SITD_BUFPTR_TPOS_SH 3 1190bf96f94SGerd Hoffmann #define SITD_BUFPTR_TCNT_MASK 0x00000007 1200bf96f94SGerd Hoffmann 1210bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 1220bf96f94SGerd Hoffmann } EHCIsitd; 1230bf96f94SGerd Hoffmann 1240bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.5 1250bf96f94SGerd Hoffmann */ 1260bf96f94SGerd Hoffmann typedef struct EHCIqtd { 1270bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1280bf96f94SGerd Hoffmann uint32_t altnext; /* Standard next link pointer */ 1290bf96f94SGerd Hoffmann uint32_t token; 1300bf96f94SGerd Hoffmann #define QTD_TOKEN_DTOGGLE (1 << 31) 1310bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_MASK 0x7fff0000 1320bf96f94SGerd Hoffmann #define QTD_TOKEN_TBYTES_SH 16 1330bf96f94SGerd Hoffmann #define QTD_TOKEN_IOC (1 << 15) 1340bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_MASK 0x00007000 1350bf96f94SGerd Hoffmann #define QTD_TOKEN_CPAGE_SH 12 1360bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_MASK 0x00000c00 1370bf96f94SGerd Hoffmann #define QTD_TOKEN_CERR_SH 10 1380bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_MASK 0x00000300 1390bf96f94SGerd Hoffmann #define QTD_TOKEN_PID_SH 8 1400bf96f94SGerd Hoffmann #define QTD_TOKEN_ACTIVE (1 << 7) 1410bf96f94SGerd Hoffmann #define QTD_TOKEN_HALT (1 << 6) 1420bf96f94SGerd Hoffmann #define QTD_TOKEN_DBERR (1 << 5) 1430bf96f94SGerd Hoffmann #define QTD_TOKEN_BABBLE (1 << 4) 1440bf96f94SGerd Hoffmann #define QTD_TOKEN_XACTERR (1 << 3) 1450bf96f94SGerd Hoffmann #define QTD_TOKEN_MISSEDUF (1 << 2) 1460bf96f94SGerd Hoffmann #define QTD_TOKEN_SPLITXSTATE (1 << 1) 1470bf96f94SGerd Hoffmann #define QTD_TOKEN_PING (1 << 0) 1480bf96f94SGerd Hoffmann 1490bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 1500bf96f94SGerd Hoffmann #define QTD_BUFPTR_MASK 0xfffff000 1510bf96f94SGerd Hoffmann #define QTD_BUFPTR_SH 12 1520bf96f94SGerd Hoffmann } EHCIqtd; 1530bf96f94SGerd Hoffmann 1540bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.6 1550bf96f94SGerd Hoffmann */ 1560bf96f94SGerd Hoffmann typedef struct EHCIqh { 1570bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 1580bf96f94SGerd Hoffmann 1590bf96f94SGerd Hoffmann /* endpoint characteristics */ 1600bf96f94SGerd Hoffmann uint32_t epchar; 1610bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_MASK 0xf0000000 1620bf96f94SGerd Hoffmann #define QH_EPCHAR_RL_SH 28 1630bf96f94SGerd Hoffmann #define QH_EPCHAR_C (1 << 27) 1640bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_MASK 0x07FF0000 1650bf96f94SGerd Hoffmann #define QH_EPCHAR_MPLEN_SH 16 1660bf96f94SGerd Hoffmann #define QH_EPCHAR_H (1 << 15) 1670bf96f94SGerd Hoffmann #define QH_EPCHAR_DTC (1 << 14) 1680bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_MASK 0x00003000 1690bf96f94SGerd Hoffmann #define QH_EPCHAR_EPS_SH 12 1700bf96f94SGerd Hoffmann #define EHCI_QH_EPS_FULL 0 1710bf96f94SGerd Hoffmann #define EHCI_QH_EPS_LOW 1 1720bf96f94SGerd Hoffmann #define EHCI_QH_EPS_HIGH 2 1730bf96f94SGerd Hoffmann #define EHCI_QH_EPS_RESERVED 3 1740bf96f94SGerd Hoffmann 1750bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_MASK 0x00000f00 1760bf96f94SGerd Hoffmann #define QH_EPCHAR_EP_SH 8 1770bf96f94SGerd Hoffmann #define QH_EPCHAR_I (1 << 7) 1780bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_MASK 0x0000007f 1790bf96f94SGerd Hoffmann #define QH_EPCHAR_DEVADDR_SH 0 1800bf96f94SGerd Hoffmann 1810bf96f94SGerd Hoffmann /* endpoint capabilities */ 1820bf96f94SGerd Hoffmann uint32_t epcap; 1830bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_MASK 0xc0000000 1840bf96f94SGerd Hoffmann #define QH_EPCAP_MULT_SH 30 1850bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_MASK 0x3f800000 1860bf96f94SGerd Hoffmann #define QH_EPCAP_PORTNUM_SH 23 1870bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_MASK 0x007f0000 1880bf96f94SGerd Hoffmann #define QH_EPCAP_HUBADDR_SH 16 1890bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_MASK 0x0000ff00 1900bf96f94SGerd Hoffmann #define QH_EPCAP_CMASK_SH 8 1910bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_MASK 0x000000ff 1920bf96f94SGerd Hoffmann #define QH_EPCAP_SMASK_SH 0 1930bf96f94SGerd Hoffmann 1940bf96f94SGerd Hoffmann uint32_t current_qtd; /* Standard next link pointer */ 1950bf96f94SGerd Hoffmann uint32_t next_qtd; /* Standard next link pointer */ 1960bf96f94SGerd Hoffmann uint32_t altnext_qtd; 1970bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_MASK 0x0000001e 1980bf96f94SGerd Hoffmann #define QH_ALTNEXT_NAKCNT_SH 1 1990bf96f94SGerd Hoffmann 2000bf96f94SGerd Hoffmann uint32_t token; /* Same as QTD token */ 2010bf96f94SGerd Hoffmann uint32_t bufptr[5]; /* Standard buffer pointer */ 2020bf96f94SGerd Hoffmann #define BUFPTR_CPROGMASK_MASK 0x000000ff 2030bf96f94SGerd Hoffmann #define BUFPTR_FRAMETAG_MASK 0x0000001f 2040bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_MASK 0x00000fe0 2050bf96f94SGerd Hoffmann #define BUFPTR_SBYTES_SH 5 2060bf96f94SGerd Hoffmann } EHCIqh; 2070bf96f94SGerd Hoffmann 2080bf96f94SGerd Hoffmann /* EHCI spec version 1.0 Section 3.7 2090bf96f94SGerd Hoffmann */ 2100bf96f94SGerd Hoffmann typedef struct EHCIfstn { 2110bf96f94SGerd Hoffmann uint32_t next; /* Standard next link pointer */ 2120bf96f94SGerd Hoffmann uint32_t backptr; /* Standard next link pointer */ 2130bf96f94SGerd Hoffmann } EHCIfstn; 2140bf96f94SGerd Hoffmann 2150bf96f94SGerd Hoffmann enum async_state { 2160bf96f94SGerd Hoffmann EHCI_ASYNC_NONE = 0, 2170bf96f94SGerd Hoffmann EHCI_ASYNC_INITIALIZED, 2180bf96f94SGerd Hoffmann EHCI_ASYNC_INFLIGHT, 2190bf96f94SGerd Hoffmann EHCI_ASYNC_FINISHED, 2200bf96f94SGerd Hoffmann }; 2210bf96f94SGerd Hoffmann 2220bf96f94SGerd Hoffmann struct EHCIPacket { 2230bf96f94SGerd Hoffmann EHCIQueue *queue; 2240bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIPacket) next; 2250bf96f94SGerd Hoffmann 2260bf96f94SGerd Hoffmann EHCIqtd qtd; /* copy of current QTD (being worked on) */ 2270bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 2280bf96f94SGerd Hoffmann 2290bf96f94SGerd Hoffmann USBPacket packet; 2300bf96f94SGerd Hoffmann QEMUSGList sgl; 2310bf96f94SGerd Hoffmann int pid; 2320bf96f94SGerd Hoffmann enum async_state async; 2330bf96f94SGerd Hoffmann }; 2340bf96f94SGerd Hoffmann 2350bf96f94SGerd Hoffmann struct EHCIQueue { 2360bf96f94SGerd Hoffmann EHCIState *ehci; 2370bf96f94SGerd Hoffmann QTAILQ_ENTRY(EHCIQueue) next; 2380bf96f94SGerd Hoffmann uint32_t seen; 2390bf96f94SGerd Hoffmann uint64_t ts; 2400bf96f94SGerd Hoffmann int async; 2410bf96f94SGerd Hoffmann int transact_ctr; 2420bf96f94SGerd Hoffmann 2430bf96f94SGerd Hoffmann /* cached data from guest - needs to be flushed 2440bf96f94SGerd Hoffmann * when guest removes an entry (doorbell, handshake sequence) 2450bf96f94SGerd Hoffmann */ 2460bf96f94SGerd Hoffmann EHCIqh qh; /* copy of current QH (being worked on) */ 2470bf96f94SGerd Hoffmann uint32_t qhaddr; /* address QH read from */ 2480bf96f94SGerd Hoffmann uint32_t qtdaddr; /* address QTD read from */ 249bbbc39ccSHans de Goede int last_pid; /* pid of last packet executed */ 2500bf96f94SGerd Hoffmann USBDevice *dev; 2510bf96f94SGerd Hoffmann QTAILQ_HEAD(pkts_head, EHCIPacket) packets; 2520bf96f94SGerd Hoffmann }; 2530bf96f94SGerd Hoffmann 2540bf96f94SGerd Hoffmann typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead; 2550bf96f94SGerd Hoffmann 2560bf96f94SGerd Hoffmann struct EHCIState { 2570bf96f94SGerd Hoffmann USBBus bus; 2580bf96f94SGerd Hoffmann qemu_irq irq; 2590bf96f94SGerd Hoffmann MemoryRegion mem; 260df32fd1cSPaolo Bonzini AddressSpace *as; 2610bf96f94SGerd Hoffmann MemoryRegion mem_caps; 2620bf96f94SGerd Hoffmann MemoryRegion mem_opreg; 2630bf96f94SGerd Hoffmann MemoryRegion mem_ports; 2640bf96f94SGerd Hoffmann int companion_count; 2650bf96f94SGerd Hoffmann uint16_t capsbase; 2660bf96f94SGerd Hoffmann uint16_t opregbase; 267cc8d6a84SKuo-Jung Su uint16_t portscbase; 268cc8d6a84SKuo-Jung Su uint16_t portnr; 2690bf96f94SGerd Hoffmann 2700bf96f94SGerd Hoffmann /* properties */ 2710bf96f94SGerd Hoffmann uint32_t maxframes; 2720bf96f94SGerd Hoffmann 2730bf96f94SGerd Hoffmann /* 2740bf96f94SGerd Hoffmann * EHCI spec version 1.0 Section 2.3 2750bf96f94SGerd Hoffmann * Host Controller Operational Registers 2760bf96f94SGerd Hoffmann */ 2770bf96f94SGerd Hoffmann uint8_t caps[CAPA_SIZE]; 2780bf96f94SGerd Hoffmann union { 279cc8d6a84SKuo-Jung Su uint32_t opreg[0x44/sizeof(uint32_t)]; 2800bf96f94SGerd Hoffmann struct { 2810bf96f94SGerd Hoffmann uint32_t usbcmd; 2820bf96f94SGerd Hoffmann uint32_t usbsts; 2830bf96f94SGerd Hoffmann uint32_t usbintr; 2840bf96f94SGerd Hoffmann uint32_t frindex; 2850bf96f94SGerd Hoffmann uint32_t ctrldssegment; 2860bf96f94SGerd Hoffmann uint32_t periodiclistbase; 2870bf96f94SGerd Hoffmann uint32_t asynclistaddr; 2880bf96f94SGerd Hoffmann uint32_t notused[9]; 2890bf96f94SGerd Hoffmann uint32_t configflag; 2900bf96f94SGerd Hoffmann }; 2910bf96f94SGerd Hoffmann }; 2920bf96f94SGerd Hoffmann uint32_t portsc[NB_PORTS]; 2930bf96f94SGerd Hoffmann 2940bf96f94SGerd Hoffmann /* 2950bf96f94SGerd Hoffmann * Internal states, shadow registers, etc 2960bf96f94SGerd Hoffmann */ 2970bf96f94SGerd Hoffmann QEMUTimer *frame_timer; 2980bf96f94SGerd Hoffmann QEMUBH *async_bh; 2990bf96f94SGerd Hoffmann uint32_t astate; /* Current state in asynchronous schedule */ 3000bf96f94SGerd Hoffmann uint32_t pstate; /* Current state in periodic schedule */ 3010bf96f94SGerd Hoffmann USBPort ports[NB_PORTS]; 3020bf96f94SGerd Hoffmann USBPort *companion_ports[NB_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; 3190bf96f94SGerd Hoffmann }; 3200bf96f94SGerd Hoffmann 3210bf96f94SGerd Hoffmann extern const VMStateDescription vmstate_ehci; 3220bf96f94SGerd Hoffmann 323d4614cc3SAndreas Färber void usb_ehci_init(EHCIState *s, DeviceState *dev); 32408f4c90bSAndreas Färber void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp); 325cb9c377fSPaolo Bonzini 3265aa3ca9fSAndreas Färber #define TYPE_PCI_EHCI "pci-ehci-usb" 3275aa3ca9fSAndreas Färber #define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI) 3285aa3ca9fSAndreas Färber 3295aa3ca9fSAndreas Färber typedef struct EHCIPCIState { 3305aa3ca9fSAndreas Färber /*< private >*/ 3315aa3ca9fSAndreas Färber PCIDevice pcidev; 3325aa3ca9fSAndreas Färber /*< public >*/ 3335aa3ca9fSAndreas Färber 3345aa3ca9fSAndreas Färber EHCIState ehci; 3355aa3ca9fSAndreas Färber } EHCIPCIState; 3365aa3ca9fSAndreas Färber 3375aa3ca9fSAndreas Färber 3385aa3ca9fSAndreas Färber #define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb" 339aee7499aSAndreas Färber #define TYPE_EXYNOS4210_EHCI "exynos4210-ehci-usb" 34020c57043SAndreas Färber #define TYPE_TEGRA2_EHCI "tegra2-ehci-usb" 341*4e3d8b4bSKuo-Jung Su #define TYPE_FUSBH200_EHCI "fusbh200-ehci-usb" 342aee7499aSAndreas Färber 3435aa3ca9fSAndreas Färber #define SYS_BUS_EHCI(obj) \ 3445aa3ca9fSAndreas Färber OBJECT_CHECK(EHCISysBusState, (obj), TYPE_SYS_BUS_EHCI) 3454a434367SAndreas Färber #define SYS_BUS_EHCI_CLASS(class) \ 3464a434367SAndreas Färber OBJECT_CLASS_CHECK(SysBusEHCIClass, (class), TYPE_SYS_BUS_EHCI) 3474a434367SAndreas Färber #define SYS_BUS_EHCI_GET_CLASS(obj) \ 3484a434367SAndreas Färber OBJECT_GET_CLASS(SysBusEHCIClass, (obj), TYPE_SYS_BUS_EHCI) 3495aa3ca9fSAndreas Färber 3505aa3ca9fSAndreas Färber typedef struct EHCISysBusState { 3515aa3ca9fSAndreas Färber /*< private >*/ 3525aa3ca9fSAndreas Färber SysBusDevice parent_obj; 3535aa3ca9fSAndreas Färber /*< public >*/ 3545aa3ca9fSAndreas Färber 3555aa3ca9fSAndreas Färber EHCIState ehci; 3565aa3ca9fSAndreas Färber } EHCISysBusState; 3575aa3ca9fSAndreas Färber 3584a434367SAndreas Färber typedef struct SysBusEHCIClass { 3594a434367SAndreas Färber /*< private >*/ 3604a434367SAndreas Färber SysBusDeviceClass parent_class; 3614a434367SAndreas Färber /*< public >*/ 3624a434367SAndreas Färber 3634a434367SAndreas Färber uint16_t capsbase; 3644a434367SAndreas Färber uint16_t opregbase; 365cc8d6a84SKuo-Jung Su uint16_t portscbase; 366cc8d6a84SKuo-Jung Su uint16_t portnr; 3674a434367SAndreas Färber } SysBusEHCIClass; 3684a434367SAndreas Färber 369*4e3d8b4bSKuo-Jung Su #define FUSBH200_EHCI(obj) \ 370*4e3d8b4bSKuo-Jung Su OBJECT_CHECK(FUSBH200EHCIState, (obj), TYPE_FUSBH200_EHCI) 371*4e3d8b4bSKuo-Jung Su 372*4e3d8b4bSKuo-Jung Su typedef struct FUSBH200EHCIState { 373*4e3d8b4bSKuo-Jung Su /*< private >*/ 374*4e3d8b4bSKuo-Jung Su EHCISysBusState parent_obj; 375*4e3d8b4bSKuo-Jung Su /*< public >*/ 376*4e3d8b4bSKuo-Jung Su 377*4e3d8b4bSKuo-Jung Su MemoryRegion mem_vendor; 378*4e3d8b4bSKuo-Jung Su } FUSBH200EHCIState; 379*4e3d8b4bSKuo-Jung Su 380cb9c377fSPaolo Bonzini #endif 381