Date: Sun, 30 Jun 2013 12:46:04 GMT From: syuu@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r253730 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve: . usb Message-ID: <201306301246.r5UCk4te040257@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: syuu Date: Sun Jun 30 12:46:03 2013 New Revision: 253730 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253730 Log: initialize config space/IO space handler Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/Makefile soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/Makefile ============================================================================== --- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/Makefile Sun Jun 30 12:11:34 2013 (r253729) +++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/Makefile Sun Jun 30 12:46:03 2013 (r253730) @@ -16,7 +16,7 @@ SRCS+= vmm_instruction_emul.c .PATH: ${.CURDIR}/usb -CFLAGS+=-I${.CURDIR}/usb/include +CFLAGS+=-I${.CURDIR}/usb/include -I${.CURDIR} SRCS+= core.c hcd-uhci.c NO_MAN= Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c ============================================================================== --- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Sun Jun 30 12:11:34 2013 (r253729) +++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Sun Jun 30 12:46:03 2013 (r253730) @@ -25,10 +25,15 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "hw/usb.h" #include <sys/endian.h> #include <stdlib.h> #include <dev/pci/pcireg.h> +#include <pthread.h> +#include <pthread_np.h> +#include <string.h> + +#include "pci_emul.h" +#include "hw/usb.h" #define le32_to_cpus(x) le32toh(x) #define cpu_to_le32(x) htole32(x) @@ -36,12 +41,15 @@ #define PCI_CLASS_PROG PCIR_PROGIF #define PCI_VENDOR_ID_INTEL 0x8086 -#define PCI_DEVICE_ID_INTEL_82801I_UHCI3 0x2936 -#define PCI_DEVICE_ID_INTEL_82801I_UHCI4 0x2937 -#define PCI_DEVICE_ID_INTEL_82801I_UHCI5 0x2938 #define PCI_DEVICE_ID_INTEL_82801I_UHCI6 0x2939 -#define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 -#define PCI_DEVICE_ID_INTEL_82371AB_2 0x7112 + +/* + * Per-device softc + */ +struct pci_uhci_softc { + struct pci_devinst *sc_pi; + pthread_mutex_t sc_mtx; +}; struct PCIDevice { uint8_t *config; @@ -63,6 +71,9 @@ #define trace_usb_uhci_packet_add(token, td_addr) \ fprintf(stderr, "%s:%d trace_usb_uhci_packet_add token=%x td_addr=%x\n", \ __func__, __LINE__, token, td_addr) +#define trace_usb_uhci_packet_del(token, td_addr) \ + fprintf(stderr, "%s:%d trace_usb_uhci_packet_del token=%x td_addr=%x\n", \ + __func__, __LINE__, token, td_addr) #define trace_usb_uhci_packet_cancel(token, td_addr, done) \ fprintf(stderr, "%s:%d trace_usb_uhci_packet_cancel token=%x td_addr=%x done=%x\n", \ __func__, __LINE__, token, td_addr, done) @@ -136,6 +147,9 @@ //#define DEBUG //#define DEBUG_DUMP_DATA +#define PCI_USBREV 0x60 /* USB protocol revision */ +#define PCI_USB_REV_1_1 0x11 + #define UHCI_CMD_FGR (1 << 4) #define UHCI_CMD_EGSM (1 << 3) #define UHCI_CMD_GRESET (1 << 2) @@ -372,7 +386,7 @@ static void uhci_async_free(UHCIAsync *async) { -// trace_usb_uhci_packet_del(async->queue->token, async->td_addr); + trace_usb_uhci_packet_del(async->queue->token, async->td_addr); usb_packet_cleanup(&async->packet); if (async->buf != async->static_buf) { free(async->buf); @@ -1520,3 +1534,64 @@ } //type_init(uhci_register_types) + +static void +pci_uhci_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, + int baridx, uint64_t offset, int size, uint64_t value) +{ + struct pci_uhci_softc *sc = pi->pi_arg; + + pthread_mutex_lock(&sc->sc_mtx); + printf("%s baridx:%d offset:%lx size:%d value:%lx\n", __func__, baridx, offset, size, value); + pthread_mutex_unlock(&sc->sc_mtx); +} + + +uint64_t +pci_uhci_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, + int baridx, uint64_t offset, int size) +{ + struct pci_uhci_softc *sc = pi->pi_arg; + uint64_t value; + + pthread_mutex_lock(&sc->sc_mtx); + printf("%s baridx:%d offset:%lx size:%d\n", __func__, baridx, offset, size); + pthread_mutex_unlock(&sc->sc_mtx); + + return (value); +} + +static int +pci_uhci_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts) +{ + struct pci_uhci_softc *sc; + + sc = malloc(sizeof(struct pci_uhci_softc)); + memset(sc, 0, sizeof(struct pci_uhci_softc)); + + pi->pi_arg = sc; + sc->sc_pi = pi; + + pthread_mutex_init(&sc->sc_mtx, NULL); + + /* initialize config space */ + pci_set_cfgdata16(pi, PCIR_DEVICE, PCI_DEVICE_ID_INTEL_82801I_UHCI6); + pci_set_cfgdata16(pi, PCIR_VENDOR, PCI_VENDOR_ID_INTEL); + pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_SERIALBUS); + pci_set_cfgdata8(pi, PCI_USBREV, PCI_USB_REV_1_1); + + /* MSI support */ + pci_emul_add_msicap(pi, 1); + + pci_emul_alloc_bar(pi, 4, PCIBAR_IO, 0x20); + + return (0); +} + +struct pci_devemu pci_hcd_uhci = { + .pe_emu = "hcd-uhci", + .pe_init = pci_uhci_init, + .pe_barwrite = pci_uhci_write, + .pe_barread = pci_uhci_read +}; +PCI_EMUL_SET(pci_hcd_uhci);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306301246.r5UCk4te040257>