19a4e12a6SPhilippe Mathieu-Daudé /* 29a4e12a6SPhilippe Mathieu-Daudé * USB UHCI controller emulation 39a4e12a6SPhilippe Mathieu-Daudé * 49a4e12a6SPhilippe Mathieu-Daudé * Copyright (c) 2005 Fabrice Bellard 59a4e12a6SPhilippe Mathieu-Daudé * 69a4e12a6SPhilippe Mathieu-Daudé * Copyright (c) 2008 Max Krasnyansky 79a4e12a6SPhilippe Mathieu-Daudé * Magor rewrite of the UHCI data structures parser and frame processor 89a4e12a6SPhilippe Mathieu-Daudé * Support for fully async operation and multiple outstanding transactions 99a4e12a6SPhilippe Mathieu-Daudé * 109a4e12a6SPhilippe Mathieu-Daudé * Permission is hereby granted, free of charge, to any person obtaining a copy 119a4e12a6SPhilippe Mathieu-Daudé * of this software and associated documentation files (the "Software"), to deal 129a4e12a6SPhilippe Mathieu-Daudé * in the Software without restriction, including without limitation the rights 139a4e12a6SPhilippe Mathieu-Daudé * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 149a4e12a6SPhilippe Mathieu-Daudé * copies of the Software, and to permit persons to whom the Software is 159a4e12a6SPhilippe Mathieu-Daudé * furnished to do so, subject to the following conditions: 169a4e12a6SPhilippe Mathieu-Daudé * 179a4e12a6SPhilippe Mathieu-Daudé * The above copyright notice and this permission notice shall be included in 189a4e12a6SPhilippe Mathieu-Daudé * all copies or substantial portions of the Software. 199a4e12a6SPhilippe Mathieu-Daudé * 209a4e12a6SPhilippe Mathieu-Daudé * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 219a4e12a6SPhilippe Mathieu-Daudé * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 229a4e12a6SPhilippe Mathieu-Daudé * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 239a4e12a6SPhilippe Mathieu-Daudé * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 249a4e12a6SPhilippe Mathieu-Daudé * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 259a4e12a6SPhilippe Mathieu-Daudé * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 269a4e12a6SPhilippe Mathieu-Daudé * THE SOFTWARE. 279a4e12a6SPhilippe Mathieu-Daudé */ 289a4e12a6SPhilippe Mathieu-Daudé #ifndef HW_USB_HCD_UHCI_H 299a4e12a6SPhilippe Mathieu-Daudé #define HW_USB_HCD_UHCI_H 309a4e12a6SPhilippe Mathieu-Daudé 319a4e12a6SPhilippe Mathieu-Daudé #include "exec/memory.h" 329a4e12a6SPhilippe Mathieu-Daudé #include "qemu/timer.h" 33edf5ca5dSMarkus Armbruster #include "hw/pci/pci_device.h" 349a4e12a6SPhilippe Mathieu-Daudé #include "hw/usb.h" 359a4e12a6SPhilippe Mathieu-Daudé 369a4e12a6SPhilippe Mathieu-Daudé typedef struct UHCIQueue UHCIQueue; 379a4e12a6SPhilippe Mathieu-Daudé 389a4e12a6SPhilippe Mathieu-Daudé #define NB_PORTS 2 399a4e12a6SPhilippe Mathieu-Daudé 409a4e12a6SPhilippe Mathieu-Daudé typedef struct UHCIPort { 419a4e12a6SPhilippe Mathieu-Daudé USBPort port; 429a4e12a6SPhilippe Mathieu-Daudé uint16_t ctrl; 439a4e12a6SPhilippe Mathieu-Daudé } UHCIPort; 449a4e12a6SPhilippe Mathieu-Daudé 459a4e12a6SPhilippe Mathieu-Daudé typedef struct UHCIState { 469a4e12a6SPhilippe Mathieu-Daudé PCIDevice dev; 479a4e12a6SPhilippe Mathieu-Daudé MemoryRegion io_bar; 489a4e12a6SPhilippe Mathieu-Daudé USBBus bus; /* Note unused when we're a companion controller */ 499a4e12a6SPhilippe Mathieu-Daudé uint16_t cmd; /* cmd register */ 509a4e12a6SPhilippe Mathieu-Daudé uint16_t status; 519a4e12a6SPhilippe Mathieu-Daudé uint16_t intr; /* interrupt enable register */ 529a4e12a6SPhilippe Mathieu-Daudé uint16_t frnum; /* frame number */ 539a4e12a6SPhilippe Mathieu-Daudé uint32_t fl_base_addr; /* frame list base address */ 549a4e12a6SPhilippe Mathieu-Daudé uint8_t sof_timing; 559a4e12a6SPhilippe Mathieu-Daudé uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */ 569a4e12a6SPhilippe Mathieu-Daudé int64_t expire_time; 579a4e12a6SPhilippe Mathieu-Daudé QEMUTimer *frame_timer; 589a4e12a6SPhilippe Mathieu-Daudé QEMUBH *bh; 599a4e12a6SPhilippe Mathieu-Daudé uint32_t frame_bytes; 609a4e12a6SPhilippe Mathieu-Daudé uint32_t frame_bandwidth; 619a4e12a6SPhilippe Mathieu-Daudé bool completions_only; 629a4e12a6SPhilippe Mathieu-Daudé UHCIPort ports[NB_PORTS]; 63e4f5b939SBALATON Zoltan qemu_irq irq; 649a4e12a6SPhilippe Mathieu-Daudé /* Interrupts that should be raised at the end of the current frame. */ 659a4e12a6SPhilippe Mathieu-Daudé uint32_t pending_int_mask; 669a4e12a6SPhilippe Mathieu-Daudé 679a4e12a6SPhilippe Mathieu-Daudé /* Active packets */ 689a4e12a6SPhilippe Mathieu-Daudé QTAILQ_HEAD(, UHCIQueue) queues; 699a4e12a6SPhilippe Mathieu-Daudé uint8_t num_ports_vmstate; 709a4e12a6SPhilippe Mathieu-Daudé 719a4e12a6SPhilippe Mathieu-Daudé /* Properties */ 729a4e12a6SPhilippe Mathieu-Daudé char *masterbus; 739a4e12a6SPhilippe Mathieu-Daudé uint32_t firstport; 749a4e12a6SPhilippe Mathieu-Daudé uint32_t maxframes; 759a4e12a6SPhilippe Mathieu-Daudé } UHCIState; 769a4e12a6SPhilippe Mathieu-Daudé 779a4e12a6SPhilippe Mathieu-Daudé #define TYPE_UHCI "pci-uhci-usb" 78*ef177ee1SPhilippe Mathieu-Daudé OBJECT_DECLARE_TYPE(UHCIState, UHCIPCIDeviceClass, UHCI) 799a4e12a6SPhilippe Mathieu-Daudé 809a4e12a6SPhilippe Mathieu-Daudé typedef struct UHCIInfo { 819a4e12a6SPhilippe Mathieu-Daudé const char *name; 829a4e12a6SPhilippe Mathieu-Daudé uint16_t vendor_id; 839a4e12a6SPhilippe Mathieu-Daudé uint16_t device_id; 849a4e12a6SPhilippe Mathieu-Daudé uint8_t revision; 859a4e12a6SPhilippe Mathieu-Daudé uint8_t irq_pin; 869a4e12a6SPhilippe Mathieu-Daudé void (*realize)(PCIDevice *dev, Error **errp); 879a4e12a6SPhilippe Mathieu-Daudé bool unplug; 88ece29df3SBALATON Zoltan bool notuser; /* disallow user_creatable */ 899a4e12a6SPhilippe Mathieu-Daudé } UHCIInfo; 909a4e12a6SPhilippe Mathieu-Daudé 919a4e12a6SPhilippe Mathieu-Daudé void uhci_data_class_init(ObjectClass *klass, void *data); 929a4e12a6SPhilippe Mathieu-Daudé void usb_uhci_common_realize(PCIDevice *dev, Error **errp); 939a4e12a6SPhilippe Mathieu-Daudé 94f0712099SBernhard Beschow #define TYPE_PIIX3_USB_UHCI "piix3-usb-uhci" 95f0712099SBernhard Beschow #define TYPE_PIIX4_USB_UHCI "piix4-usb-uhci" 96f0712099SBernhard Beschow #define TYPE_ICH9_USB_UHCI(fn) "ich9-usb-uhci" #fn 97f0712099SBernhard Beschow 989a4e12a6SPhilippe Mathieu-Daudé #endif 99