Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/rump/dev/lib/libpci Add a rump kernel component for the ...



details:   https://anonhg.NetBSD.org/src/rev/54af1645feb9
branches:  trunk
changeset: 795224:54af1645feb9
user:      pooka <pooka%NetBSD.org@localhost>
date:      Fri Apr 04 12:53:59 2014 +0000

description:
Add a rump kernel component for the PCI bus.  It works both in Xen DomU
(via Xen's PCI passthrough) and Linux userspace (via uio_pci_generic).

diffstat:

 sys/rump/dev/lib/libpci/Makefile            |   29 +
 sys/rump/dev/lib/libpci/PCI.ioconf          |   12 +
 sys/rump/dev/lib/libpci/opt/opt_pci.h       |    1 +
 sys/rump/dev/lib/libpci/pci_at_mainbus.c    |   75 +++
 sys/rump/dev/lib/libpci/pci_user.h          |   11 +
 sys/rump/dev/lib/libpci/rumpdev_bus_dma.c   |  548 ++++++++++++++++++++++++++++
 sys/rump/dev/lib/libpci/rumpdev_bus_space.c |  177 +++++++++
 sys/rump/dev/lib/libpci/rumpdev_pci.c       |  139 +++++++
 sys/rump/dev/lib/libpci/shlib_version       |    2 +
 9 files changed, 994 insertions(+), 0 deletions(-)

diffs (truncated from 1030 to 300 lines):

diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/Makefile  Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,29 @@
+#      $NetBSD: Makefile,v 1.1 2014/04/04 12:53:59 pooka Exp $
+#
+
+RUMPTOP= ${TOPRUMP}
+
+.PATH: ${RUMPTOP}/../dev/pci
+
+LIB=   rumpdev_pci
+IOCONF=        PCI.ioconf
+
+SRCS+= pci.c pci_map.c pci_quirks.c pci_subr.c pci_stub.c pci_usrreq.c
+SRCS+= pcibusprint.c
+
+SRCS+= rumpdev_pci.c
+
+# ok, these don't _really_ belong here, but it's the only
+# place they're currently useful, so let it slide
+SRCS+= rumpdev_bus_space.c
+SRCS+= rumpdev_bus_dma.c
+
+SRCS+= pci_at_mainbus.c
+
+CPPFLAGS+= -I${.CURDIR}/opt -I${RUMPTOP}/librump/rumpkern
+
+#RUMPCOMP_USER_SRCS=   pci_user.c
+
+.include "${RUMPTOP}/Makefile.rump"
+.include <bsd.lib.mk>
+.include <bsd.klinks.mk>
diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/PCI.ioconf
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/PCI.ioconf        Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,12 @@
+#      $NetBSD: PCI.ioconf,v 1.1 2014/04/04 12:53:59 pooka Exp $
+#
+
+ioconf pci
+
+include "conf/files"
+include "dev/pci/files.pci"
+include "rump/dev/files.rump"
+
+pseudo-root mainbus*
+
+pci*    at mainbus? bus ?
diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/opt/opt_pci.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/opt/opt_pci.h     Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,1 @@
+/*     $NetBSD: opt_pci.h,v 1.1 2014/04/04 12:53:59 pooka Exp $        */
diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/pci_at_mainbus.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/pci_at_mainbus.c  Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,75 @@
+/*     $NetBSD: pci_at_mainbus.c,v 1.1 2014/04/04 12:53:59 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: pci_at_mainbus.c,v 1.1 2014/04/04 12:53:59 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/mbuf.h>
+#include <sys/stat.h>
+#include <sys/bus.h>
+
+#include <dev/pci/pcivar.h>
+#include <machine/bus_private.h>
+
+#include "ioconf.c"
+
+#include "rump_private.h"
+
+RUMP_COMPONENT(RUMP_COMPONENT_DEV)
+{
+
+       config_init_component(cfdriver_ioconf_pci,
+           cfattach_ioconf_pci, cfdata_ioconf_pci);
+}
+
+RUMP_COMPONENT(RUMP_COMPONENT_DEV_AFTERMAINBUS)
+{
+       struct pcibus_attach_args pba;
+       device_t mainbus;
+
+       /* XXX: attach args should come from elsewhere */
+       memset(&pba, 0, sizeof(pba));
+       pba.pba_iot = (bus_space_tag_t)0;
+       pba.pba_memt = (bus_space_tag_t)1;
+       pba.pba_dmat = (void *)0x20;
+#ifdef _LP64
+       pba.pba_dmat64 = (void *)0x40;
+#endif
+       pba.pba_flags = PCI_FLAGS_MEM_OKAY |
+           PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY | PCI_FLAGS_MWI_OKAY;;
+#if 0
+       pba.pba_flags |= PCI_FLAGS_IO_OKAY;
+#endif
+
+       mainbus = device_find_by_driver_unit("mainbus", 0);
+       if (!mainbus)
+               panic("no mainbus.  use maintaxi instead?");
+       config_found_ia(mainbus, "pcibus", &pba, pcibusprint);
+}
diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/pci_user.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/pci_user.h        Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,11 @@
+void *rumpcomp_pci_map(unsigned long, unsigned long);
+int rumpcomp_pci_confread(unsigned, unsigned, unsigned, int, unsigned int *);
+int rumpcomp_pci_confwrite(unsigned, unsigned, unsigned, int, unsigned int); 
+
+void *rumpcomp_pci_irq_establish(int, int (*)(void *), void *);
+
+/* XXX: needs work: support boundary-restricted allocations */
+int rumpcomp_pci_dmalloc(size_t, size_t, unsigned long *);
+
+void *rumpcomp_pci_mach_to_virt(unsigned long);
+unsigned long rumpcomp_pci_virt_to_mach(void *);
diff -r 99adf63c20e9 -r 54af1645feb9 sys/rump/dev/lib/libpci/rumpdev_bus_dma.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c Fri Apr 04 12:53:59 2014 +0000
@@ -0,0 +1,548 @@
+/*     $NetBSD: rumpdev_bus_dma.c,v 1.1 2014/04/04 12:53:59 pooka Exp $        */
+
+/*-
+ * Copyright (c) 2013 Antti Kantee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*-
+ * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * bus_dma(9) implementation which runs on top of rump kernel hypercalls.
+ * It's essentially the same as the PowerPC implementation its based on,
+ * except with some indirection and PowerPC MD features removed.
+ * This should/could be expected to run on x86, other archs may need
+ * some cache flushing hooks.
+ *
+ * From sys/arch/powerpc/powerpc/bus_dma.c:
+ *     NetBSD: bus_dma.c,v 1.46 2012/02/01 09:54:03 matt Exp
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/kmem.h>
+#include <sys/proc.h>
+#include <sys/mbuf.h>
+#include <sys/bus.h>
+#include <sys/intr.h>
+
+#include <uvm/uvm.h>
+
+#include "pci_user.h"
+
+#define        EIEIO   membar_sync()
+
+int    _bus_dmamap_load_buffer (bus_dma_tag_t, bus_dmamap_t, void *,
+           bus_size_t, struct vmspace *, int, paddr_t *, int *, int);
+
+#undef PHYS_TO_BUS_MEM
+#define PHYS_TO_BUS_MEM(_t_, _a_) rumpcomp_pci_virt_to_mach((void *)_a_)
+#undef BUS_MEM_TO_PHYS
+#define BUS_MEM_TO_PHYS(_t_, _a_) rumpcomp_pci_mach_to_virt(_a_)
+
+/*
+ * Common function for DMA map creation.  May be called by bus-specific
+ * DMA map creation functions.
+ */
+int
+bus_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments,
+       bus_size_t maxsegsz, bus_size_t boundary, int flags,
+       bus_dmamap_t *dmamp)
+{
+       bus_dmamap_t map;
+       void *mapstore;
+       size_t mapsize;
+
+       /*
+        * Allocate and initialize the DMA map.  The end of the map
+        * is a variable-sized array of segments, so we allocate enough
+        * room for them in one shot.
+        *
+        * Note we don't preserve the WAITOK or NOWAIT flags.  Preservation
+        * of ALLOCNOW notifies others that we've reserved these resources,
+        * and they are not to be freed.
+        *
+        * The bus_dmamap_t includes one bus_dma_segment_t, hence
+        * the (nsegments - 1).
+        */
+       mapsize = sizeof(*map) + sizeof(bus_dma_segment_t [nsegments - 1]);
+       if ((mapstore = kmem_intr_alloc(mapsize,
+           (flags & BUS_DMA_NOWAIT) ? KM_NOSLEEP : KM_SLEEP)) == NULL)
+               return (ENOMEM);
+
+       memset(mapstore, 0, mapsize);
+       map = (void *)mapstore;
+       map->_dm_size = size;
+       map->_dm_segcnt = nsegments;
+       map->_dm_maxmaxsegsz = maxsegsz;
+       map->_dm_boundary = boundary;
+       map->_dm_bounce_thresh = 0;
+       map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT);
+       map->dm_maxsegsz = maxsegsz;
+       map->dm_mapsize = 0;            /* no valid mappings */
+       map->dm_nsegs = 0;
+
+       *dmamp = map;
+       return (0);
+}
+
+/*
+ * Common function for DMA map destruction.  May be called by bus-specific
+ * DMA map destruction functions.
+ */
+void
+bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
+{
+
+       size_t mapsize = sizeof(*map)



Home | Main Index | Thread Index | Old Index