10bbb2f3dSGerd Hoffmann /* 20bbb2f3dSGerd Hoffmann * USB xHCI controller emulation 30bbb2f3dSGerd Hoffmann * 40bbb2f3dSGerd Hoffmann * Copyright (c) 2011 Securiforest 50bbb2f3dSGerd Hoffmann * Date: 2011-05-11 ; Author: Hector Martin <hector@marcansoft.com> 60bbb2f3dSGerd Hoffmann * Based on usb-ohci.c, emulates Renesas NEC USB 3.0 70bbb2f3dSGerd Hoffmann * 80bbb2f3dSGerd Hoffmann * This library is free software; you can redistribute it and/or 90bbb2f3dSGerd Hoffmann * modify it under the terms of the GNU Lesser General Public 100bbb2f3dSGerd Hoffmann * License as published by the Free Software Foundation; either 110bbb2f3dSGerd Hoffmann * version 2 of the License, or (at your option) any later version. 120bbb2f3dSGerd Hoffmann * 130bbb2f3dSGerd Hoffmann * This library is distributed in the hope that it will be useful, 140bbb2f3dSGerd Hoffmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 150bbb2f3dSGerd Hoffmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 160bbb2f3dSGerd Hoffmann * Lesser General Public License for more details. 170bbb2f3dSGerd Hoffmann * 180bbb2f3dSGerd Hoffmann * You should have received a copy of the GNU Lesser General Public 190bbb2f3dSGerd Hoffmann * License along with this library; if not, see <http://www.gnu.org/licenses/>. 200bbb2f3dSGerd Hoffmann */ 210bbb2f3dSGerd Hoffmann 220bbb2f3dSGerd Hoffmann #define TYPE_XHCI "base-xhci" 230bbb2f3dSGerd Hoffmann #define TYPE_NEC_XHCI "nec-usb-xhci" 240bbb2f3dSGerd Hoffmann #define TYPE_QEMU_XHCI "qemu-xhci" 250bbb2f3dSGerd Hoffmann 260bbb2f3dSGerd Hoffmann #define XHCI(obj) \ 270bbb2f3dSGerd Hoffmann OBJECT_CHECK(XHCIState, (obj), TYPE_XHCI) 280bbb2f3dSGerd Hoffmann 290bbb2f3dSGerd Hoffmann #define MAXPORTS_2 15 300bbb2f3dSGerd Hoffmann #define MAXPORTS_3 15 310bbb2f3dSGerd Hoffmann 320bbb2f3dSGerd Hoffmann #define MAXPORTS (MAXPORTS_2 + MAXPORTS_3) 330bbb2f3dSGerd Hoffmann #define MAXSLOTS 64 340bbb2f3dSGerd Hoffmann #define MAXINTRS 16 350bbb2f3dSGerd Hoffmann 360bbb2f3dSGerd Hoffmann /* Very pessimistic, let's hope it's enough for all cases */ 370bbb2f3dSGerd Hoffmann #define EV_QUEUE (((3 * 24) + 16) * MAXSLOTS) 380bbb2f3dSGerd Hoffmann 390bbb2f3dSGerd Hoffmann typedef struct XHCIState XHCIState; 400bbb2f3dSGerd Hoffmann typedef struct XHCIStreamContext XHCIStreamContext; 410bbb2f3dSGerd Hoffmann typedef struct XHCIEPContext XHCIEPContext; 420bbb2f3dSGerd Hoffmann 430bbb2f3dSGerd Hoffmann enum xhci_flags { 440bbb2f3dSGerd Hoffmann XHCI_FLAG_SS_FIRST = 1, 450bbb2f3dSGerd Hoffmann XHCI_FLAG_FORCE_PCIE_ENDCAP, 460bbb2f3dSGerd Hoffmann XHCI_FLAG_ENABLE_STREAMS, 470bbb2f3dSGerd Hoffmann }; 480bbb2f3dSGerd Hoffmann 490bbb2f3dSGerd Hoffmann typedef enum TRBType { 500bbb2f3dSGerd Hoffmann TRB_RESERVED = 0, 510bbb2f3dSGerd Hoffmann TR_NORMAL, 520bbb2f3dSGerd Hoffmann TR_SETUP, 530bbb2f3dSGerd Hoffmann TR_DATA, 540bbb2f3dSGerd Hoffmann TR_STATUS, 550bbb2f3dSGerd Hoffmann TR_ISOCH, 560bbb2f3dSGerd Hoffmann TR_LINK, 570bbb2f3dSGerd Hoffmann TR_EVDATA, 580bbb2f3dSGerd Hoffmann TR_NOOP, 590bbb2f3dSGerd Hoffmann CR_ENABLE_SLOT, 600bbb2f3dSGerd Hoffmann CR_DISABLE_SLOT, 610bbb2f3dSGerd Hoffmann CR_ADDRESS_DEVICE, 620bbb2f3dSGerd Hoffmann CR_CONFIGURE_ENDPOINT, 630bbb2f3dSGerd Hoffmann CR_EVALUATE_CONTEXT, 640bbb2f3dSGerd Hoffmann CR_RESET_ENDPOINT, 650bbb2f3dSGerd Hoffmann CR_STOP_ENDPOINT, 660bbb2f3dSGerd Hoffmann CR_SET_TR_DEQUEUE, 670bbb2f3dSGerd Hoffmann CR_RESET_DEVICE, 680bbb2f3dSGerd Hoffmann CR_FORCE_EVENT, 690bbb2f3dSGerd Hoffmann CR_NEGOTIATE_BW, 700bbb2f3dSGerd Hoffmann CR_SET_LATENCY_TOLERANCE, 710bbb2f3dSGerd Hoffmann CR_GET_PORT_BANDWIDTH, 720bbb2f3dSGerd Hoffmann CR_FORCE_HEADER, 730bbb2f3dSGerd Hoffmann CR_NOOP, 740bbb2f3dSGerd Hoffmann ER_TRANSFER = 32, 750bbb2f3dSGerd Hoffmann ER_COMMAND_COMPLETE, 760bbb2f3dSGerd Hoffmann ER_PORT_STATUS_CHANGE, 770bbb2f3dSGerd Hoffmann ER_BANDWIDTH_REQUEST, 780bbb2f3dSGerd Hoffmann ER_DOORBELL, 790bbb2f3dSGerd Hoffmann ER_HOST_CONTROLLER, 800bbb2f3dSGerd Hoffmann ER_DEVICE_NOTIFICATION, 810bbb2f3dSGerd Hoffmann ER_MFINDEX_WRAP, 820bbb2f3dSGerd Hoffmann /* vendor specific bits */ 830bbb2f3dSGerd Hoffmann CR_VENDOR_NEC_FIRMWARE_REVISION = 49, 840bbb2f3dSGerd Hoffmann CR_VENDOR_NEC_CHALLENGE_RESPONSE = 50, 850bbb2f3dSGerd Hoffmann } TRBType; 860bbb2f3dSGerd Hoffmann 870bbb2f3dSGerd Hoffmann typedef enum TRBCCode { 880bbb2f3dSGerd Hoffmann CC_INVALID = 0, 890bbb2f3dSGerd Hoffmann CC_SUCCESS, 900bbb2f3dSGerd Hoffmann CC_DATA_BUFFER_ERROR, 910bbb2f3dSGerd Hoffmann CC_BABBLE_DETECTED, 920bbb2f3dSGerd Hoffmann CC_USB_TRANSACTION_ERROR, 930bbb2f3dSGerd Hoffmann CC_TRB_ERROR, 940bbb2f3dSGerd Hoffmann CC_STALL_ERROR, 950bbb2f3dSGerd Hoffmann CC_RESOURCE_ERROR, 960bbb2f3dSGerd Hoffmann CC_BANDWIDTH_ERROR, 970bbb2f3dSGerd Hoffmann CC_NO_SLOTS_ERROR, 980bbb2f3dSGerd Hoffmann CC_INVALID_STREAM_TYPE_ERROR, 990bbb2f3dSGerd Hoffmann CC_SLOT_NOT_ENABLED_ERROR, 1000bbb2f3dSGerd Hoffmann CC_EP_NOT_ENABLED_ERROR, 1010bbb2f3dSGerd Hoffmann CC_SHORT_PACKET, 1020bbb2f3dSGerd Hoffmann CC_RING_UNDERRUN, 1030bbb2f3dSGerd Hoffmann CC_RING_OVERRUN, 1040bbb2f3dSGerd Hoffmann CC_VF_ER_FULL, 1050bbb2f3dSGerd Hoffmann CC_PARAMETER_ERROR, 1060bbb2f3dSGerd Hoffmann CC_BANDWIDTH_OVERRUN, 1070bbb2f3dSGerd Hoffmann CC_CONTEXT_STATE_ERROR, 1080bbb2f3dSGerd Hoffmann CC_NO_PING_RESPONSE_ERROR, 1090bbb2f3dSGerd Hoffmann CC_EVENT_RING_FULL_ERROR, 1100bbb2f3dSGerd Hoffmann CC_INCOMPATIBLE_DEVICE_ERROR, 1110bbb2f3dSGerd Hoffmann CC_MISSED_SERVICE_ERROR, 1120bbb2f3dSGerd Hoffmann CC_COMMAND_RING_STOPPED, 1130bbb2f3dSGerd Hoffmann CC_COMMAND_ABORTED, 1140bbb2f3dSGerd Hoffmann CC_STOPPED, 1150bbb2f3dSGerd Hoffmann CC_STOPPED_LENGTH_INVALID, 1160bbb2f3dSGerd Hoffmann CC_MAX_EXIT_LATENCY_TOO_LARGE_ERROR = 29, 1170bbb2f3dSGerd Hoffmann CC_ISOCH_BUFFER_OVERRUN = 31, 1180bbb2f3dSGerd Hoffmann CC_EVENT_LOST_ERROR, 1190bbb2f3dSGerd Hoffmann CC_UNDEFINED_ERROR, 1200bbb2f3dSGerd Hoffmann CC_INVALID_STREAM_ID_ERROR, 1210bbb2f3dSGerd Hoffmann CC_SECONDARY_BANDWIDTH_ERROR, 1220bbb2f3dSGerd Hoffmann CC_SPLIT_TRANSACTION_ERROR 1230bbb2f3dSGerd Hoffmann } TRBCCode; 1240bbb2f3dSGerd Hoffmann 1250bbb2f3dSGerd Hoffmann typedef struct XHCIRing { 1260bbb2f3dSGerd Hoffmann dma_addr_t dequeue; 1270bbb2f3dSGerd Hoffmann bool ccs; 1280bbb2f3dSGerd Hoffmann } XHCIRing; 1290bbb2f3dSGerd Hoffmann 1300bbb2f3dSGerd Hoffmann typedef struct XHCIPort { 1310bbb2f3dSGerd Hoffmann XHCIState *xhci; 1320bbb2f3dSGerd Hoffmann uint32_t portsc; 1330bbb2f3dSGerd Hoffmann uint32_t portnr; 1340bbb2f3dSGerd Hoffmann USBPort *uport; 1350bbb2f3dSGerd Hoffmann uint32_t speedmask; 1360bbb2f3dSGerd Hoffmann char name[16]; 1370bbb2f3dSGerd Hoffmann MemoryRegion mem; 1380bbb2f3dSGerd Hoffmann } XHCIPort; 1390bbb2f3dSGerd Hoffmann 1400bbb2f3dSGerd Hoffmann typedef struct XHCISlot { 1410bbb2f3dSGerd Hoffmann bool enabled; 1420bbb2f3dSGerd Hoffmann bool addressed; 143*b4329d1aSYuri Benditovich uint16_t intr; 1440bbb2f3dSGerd Hoffmann dma_addr_t ctx; 1450bbb2f3dSGerd Hoffmann USBPort *uport; 1460bbb2f3dSGerd Hoffmann XHCIEPContext *eps[31]; 1470bbb2f3dSGerd Hoffmann } XHCISlot; 1480bbb2f3dSGerd Hoffmann 1490bbb2f3dSGerd Hoffmann typedef struct XHCIEvent { 1500bbb2f3dSGerd Hoffmann TRBType type; 1510bbb2f3dSGerd Hoffmann TRBCCode ccode; 1520bbb2f3dSGerd Hoffmann uint64_t ptr; 1530bbb2f3dSGerd Hoffmann uint32_t length; 1540bbb2f3dSGerd Hoffmann uint32_t flags; 1550bbb2f3dSGerd Hoffmann uint8_t slotid; 1560bbb2f3dSGerd Hoffmann uint8_t epid; 1570bbb2f3dSGerd Hoffmann } XHCIEvent; 1580bbb2f3dSGerd Hoffmann 1590bbb2f3dSGerd Hoffmann typedef struct XHCIInterrupter { 1600bbb2f3dSGerd Hoffmann uint32_t iman; 1610bbb2f3dSGerd Hoffmann uint32_t imod; 1620bbb2f3dSGerd Hoffmann uint32_t erstsz; 1630bbb2f3dSGerd Hoffmann uint32_t erstba_low; 1640bbb2f3dSGerd Hoffmann uint32_t erstba_high; 1650bbb2f3dSGerd Hoffmann uint32_t erdp_low; 1660bbb2f3dSGerd Hoffmann uint32_t erdp_high; 1670bbb2f3dSGerd Hoffmann 1680bbb2f3dSGerd Hoffmann bool msix_used, er_pcs; 1690bbb2f3dSGerd Hoffmann 1700bbb2f3dSGerd Hoffmann dma_addr_t er_start; 1710bbb2f3dSGerd Hoffmann uint32_t er_size; 1720bbb2f3dSGerd Hoffmann unsigned int er_ep_idx; 1730bbb2f3dSGerd Hoffmann 1740bbb2f3dSGerd Hoffmann /* kept for live migration compat only */ 1750bbb2f3dSGerd Hoffmann bool er_full_unused; 1760bbb2f3dSGerd Hoffmann XHCIEvent ev_buffer[EV_QUEUE]; 1770bbb2f3dSGerd Hoffmann unsigned int ev_buffer_put; 1780bbb2f3dSGerd Hoffmann unsigned int ev_buffer_get; 1790bbb2f3dSGerd Hoffmann 1800bbb2f3dSGerd Hoffmann } XHCIInterrupter; 1810bbb2f3dSGerd Hoffmann 1820bbb2f3dSGerd Hoffmann struct XHCIState { 1830bbb2f3dSGerd Hoffmann /*< private >*/ 1840bbb2f3dSGerd Hoffmann PCIDevice parent_obj; 1850bbb2f3dSGerd Hoffmann /*< public >*/ 1860bbb2f3dSGerd Hoffmann 1870bbb2f3dSGerd Hoffmann USBBus bus; 1880bbb2f3dSGerd Hoffmann MemoryRegion mem; 1890bbb2f3dSGerd Hoffmann MemoryRegion mem_cap; 1900bbb2f3dSGerd Hoffmann MemoryRegion mem_oper; 1910bbb2f3dSGerd Hoffmann MemoryRegion mem_runtime; 1920bbb2f3dSGerd Hoffmann MemoryRegion mem_doorbell; 1930bbb2f3dSGerd Hoffmann 1940bbb2f3dSGerd Hoffmann /* properties */ 1950bbb2f3dSGerd Hoffmann uint32_t numports_2; 1960bbb2f3dSGerd Hoffmann uint32_t numports_3; 1970bbb2f3dSGerd Hoffmann uint32_t numintrs; 1980bbb2f3dSGerd Hoffmann uint32_t numslots; 1990bbb2f3dSGerd Hoffmann uint32_t flags; 2000bbb2f3dSGerd Hoffmann uint32_t max_pstreams_mask; 2010bbb2f3dSGerd Hoffmann OnOffAuto msi; 2020bbb2f3dSGerd Hoffmann OnOffAuto msix; 2030bbb2f3dSGerd Hoffmann 2040bbb2f3dSGerd Hoffmann /* Operational Registers */ 2050bbb2f3dSGerd Hoffmann uint32_t usbcmd; 2060bbb2f3dSGerd Hoffmann uint32_t usbsts; 2070bbb2f3dSGerd Hoffmann uint32_t dnctrl; 2080bbb2f3dSGerd Hoffmann uint32_t crcr_low; 2090bbb2f3dSGerd Hoffmann uint32_t crcr_high; 2100bbb2f3dSGerd Hoffmann uint32_t dcbaap_low; 2110bbb2f3dSGerd Hoffmann uint32_t dcbaap_high; 2120bbb2f3dSGerd Hoffmann uint32_t config; 2130bbb2f3dSGerd Hoffmann 2140bbb2f3dSGerd Hoffmann USBPort uports[MAX(MAXPORTS_2, MAXPORTS_3)]; 2150bbb2f3dSGerd Hoffmann XHCIPort ports[MAXPORTS]; 2160bbb2f3dSGerd Hoffmann XHCISlot slots[MAXSLOTS]; 2170bbb2f3dSGerd Hoffmann uint32_t numports; 2180bbb2f3dSGerd Hoffmann 2190bbb2f3dSGerd Hoffmann /* Runtime Registers */ 2200bbb2f3dSGerd Hoffmann int64_t mfindex_start; 2210bbb2f3dSGerd Hoffmann QEMUTimer *mfwrap_timer; 2220bbb2f3dSGerd Hoffmann XHCIInterrupter intr[MAXINTRS]; 2230bbb2f3dSGerd Hoffmann 2240bbb2f3dSGerd Hoffmann XHCIRing cmd_ring; 2250bbb2f3dSGerd Hoffmann 2260bbb2f3dSGerd Hoffmann bool nec_quirks; 2270bbb2f3dSGerd Hoffmann }; 228