The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sbus/dma_sbus.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: dma_sbus.c,v 1.21 2004/03/17 17:04:58 pk Exp $ */
    2 
    3 /*-
    4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Paul Kranenburg.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. All advertising materials mentioning features or use of this software
   19  *    must display the following acknowledgement:
   20  *        This product includes software developed by the NetBSD
   21  *        Foundation, Inc. and its contributors.
   22  * 4. Neither the name of The NetBSD Foundation nor the names of its
   23  *    contributors may be used to endorse or promote products derived
   24  *    from this software without specific prior written permission.
   25  *
   26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   36  * POSSIBILITY OF SUCH DAMAGE.
   37  */
   38 
   39 /*
   40  * Copyright (c) 1994 Peter Galbavy.  All rights reserved.
   41  *
   42  * Redistribution and use in source and binary forms, with or without
   43  * modification, are permitted provided that the following conditions
   44  * are met:
   45  * 1. Redistributions of source code must retain the above copyright
   46  *    notice, this list of conditions and the following disclaimer.
   47  * 2. Redistributions in binary form must reproduce the above copyright
   48  *    notice, this list of conditions and the following disclaimer in the
   49  *    documentation and/or other materials provided with the distribution.
   50  * 3. All advertising materials mentioning features or use of this software
   51  *    must display the following acknowledgement:
   52  *      This product includes software developed by Peter Galbavy.
   53  * 4. The name of the author may not be used to endorse or promote products
   54  *    derived from this software without specific prior written permission.
   55  *
   56  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   57  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   58  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   59  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   60  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   61  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   62  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   63  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   64  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   65  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   66  */
   67 
   68 #include <sys/cdefs.h>
   69 __KERNEL_RCSID(0, "$NetBSD: dma_sbus.c,v 1.21 2004/03/17 17:04:58 pk Exp $");
   70 
   71 #include <sys/param.h>
   72 #include <sys/systm.h>
   73 #include <sys/kernel.h>
   74 #include <sys/errno.h>
   75 #include <sys/device.h>
   76 #include <sys/malloc.h>
   77 
   78 #include <machine/bus.h>
   79 #include <machine/intr.h>
   80 #include <machine/autoconf.h>
   81 
   82 #include <dev/sbus/sbusvar.h>
   83 
   84 #include <dev/ic/lsi64854reg.h>
   85 #include <dev/ic/lsi64854var.h>
   86 
   87 struct dma_softc {
   88         struct lsi64854_softc   sc_lsi64854;    /* base device */
   89         struct sbusdev  sc_sd;                  /* sbus device */
   90 };
   91 
   92 int     dmamatch_sbus   __P((struct device *, struct cfdata *, void *));
   93 void    dmaattach_sbus  __P((struct device *, struct device *, void *));
   94 
   95 int     dmaprint_sbus   __P((void *, const char *));
   96 
   97 void    *dmabus_intr_establish __P((
   98                 bus_space_tag_t,
   99                 int,                    /*bus interrupt priority*/
  100                 int,                    /*`device class' level*/
  101                 int (*) __P((void *)),  /*handler*/
  102                 void *,                 /*handler arg*/
  103                 void (*) __P((void)))); /*optional fast trap handler*/
  104 
  105 static  bus_space_tag_t dma_alloc_bustag __P((struct dma_softc *sc));
  106 
  107 CFATTACH_DECL(dma_sbus, sizeof(struct dma_softc),
  108     dmamatch_sbus, dmaattach_sbus, NULL, NULL);
  109 
  110 CFATTACH_DECL(ledma, sizeof(struct dma_softc),
  111     dmamatch_sbus, dmaattach_sbus, NULL, NULL);
  112 
  113 int
  114 dmaprint_sbus(aux, busname)
  115         void *aux;
  116         const char *busname;
  117 {
  118         struct sbus_attach_args *sa = aux;
  119         bus_space_tag_t t = sa->sa_bustag;
  120         struct dma_softc *sc = t->cookie;
  121 
  122         sa->sa_bustag = sc->sc_lsi64854.sc_bustag;      /* XXX */
  123         sbus_print(aux, busname);       /* XXX */
  124         sa->sa_bustag = t;              /* XXX */
  125         return (UNCONF);
  126 }
  127 
  128 int
  129 dmamatch_sbus(parent, cf, aux)
  130         struct device *parent;
  131         struct cfdata *cf;
  132         void *aux;
  133 {
  134         struct sbus_attach_args *sa = aux;
  135 
  136         return (strcmp(cf->cf_name, sa->sa_name) == 0 ||
  137                 strcmp("espdma", sa->sa_name) == 0);
  138 }
  139 
  140 void
  141 dmaattach_sbus(parent, self, aux)
  142         struct device *parent, *self;
  143         void *aux;
  144 {
  145         struct sbus_attach_args *sa = aux;
  146         struct dma_softc *dsc = (void *)self;
  147         struct lsi64854_softc *sc = &dsc->sc_lsi64854;
  148         bus_space_tag_t sbt;
  149         int sbusburst, burst;
  150         int node;
  151 
  152         node = sa->sa_node;
  153 
  154         sc->sc_bustag = sa->sa_bustag;
  155         sc->sc_dmatag = sa->sa_dmatag;
  156 
  157         /* Map registers */
  158         if (sa->sa_npromvaddrs) {
  159                 sbus_promaddr_to_handle(sa->sa_bustag,
  160                         sa->sa_promvaddrs[0], &sc->sc_regs);
  161         } else {
  162                 if (sbus_bus_map(sa->sa_bustag,
  163                         sa->sa_slot, sa->sa_offset, sa->sa_size,
  164                         0, &sc->sc_regs) != 0) {
  165                         printf("%s: cannot map registers\n", self->dv_xname);
  166                         return;
  167                 }
  168         }
  169 
  170         /*
  171          * Get transfer burst size from PROM and plug it into the
  172          * controller registers. This is needed on the Sun4m; do
  173          * others need it too?
  174          */
  175         sbusburst = ((struct sbus_softc *)parent)->sc_burst;
  176         if (sbusburst == 0)
  177                 sbusburst = SBUS_BURST_32 - 1; /* 1->16 */
  178 
  179         burst = prom_getpropint(node,"burst-sizes", -1);
  180         if (burst == -1)
  181                 /* take SBus burst sizes */
  182                 burst = sbusburst;
  183 
  184         /* Clamp at parent's burst sizes */
  185         burst &= sbusburst;
  186         sc->sc_burst = (burst & SBUS_BURST_32) ? 32 :
  187                        (burst & SBUS_BURST_16) ? 16 : 0;
  188 
  189         if (strcmp(sc->sc_dev.dv_cfdata->cf_name, "ledma") == 0) {
  190                 char *cabletype;
  191                 u_int32_t csr;
  192                 /*
  193                  * Check to see which cable type is currently active and
  194                  * set the appropriate bit in the ledma csr so that it
  195                  * gets used. If we didn't netboot, the PROM won't have
  196                  * the "cable-selection" property; default to TP and then
  197                  * the user can change it via a "media" option to ifconfig.
  198                  */
  199                 cabletype = prom_getpropstring(node, "cable-selection");
  200                 csr = L64854_GCSR(sc);
  201                 if (strcmp(cabletype, "tpe") == 0) {
  202                         csr |= E_TP_AUI;
  203                 } else if (strcmp(cabletype, "aui") == 0) {
  204                         csr &= ~E_TP_AUI;
  205                 } else {
  206                         /* assume TP if nothing there */
  207                         csr |= E_TP_AUI;
  208                 }
  209                 L64854_SCSR(sc, csr);
  210                 delay(20000);   /* manual says we need a 20ms delay */
  211                 sc->sc_channel = L64854_CHANNEL_ENET;
  212         } else {
  213                 sc->sc_channel = L64854_CHANNEL_SCSI;
  214         }
  215 
  216         sbus_establish(&dsc->sc_sd, &sc->sc_dev);
  217         sbt = dma_alloc_bustag(dsc);
  218         lsi64854_attach(sc);
  219 
  220         /* Attach children */
  221         for (node = firstchild(sa->sa_node); node; node = nextsibling(node)) {
  222                 struct sbus_attach_args sa;
  223                 sbus_setup_attach_args((struct sbus_softc *)parent,
  224                                        sbt, sc->sc_dmatag, node, &sa);
  225                 (void) config_found(&sc->sc_dev, (void *)&sa, dmaprint_sbus);
  226                 sbus_destroy_attach_args(&sa);
  227         }
  228 }
  229 
  230 void *
  231 dmabus_intr_establish(t, pri, level, handler, arg, fastvec)
  232         bus_space_tag_t t;
  233         int pri;
  234         int level;
  235         int (*handler) __P((void *));
  236         void *arg;
  237         void (*fastvec) __P((void));    /* ignored */
  238 {
  239         struct lsi64854_softc *sc = t->cookie;
  240 
  241         /* XXX - for now only le; do esp later */
  242         if (sc->sc_channel == L64854_CHANNEL_ENET) {
  243                 sc->sc_intrchain = handler;
  244                 sc->sc_intrchainarg = arg;
  245                 handler = lsi64854_enet_intr;
  246                 arg = sc;
  247         }
  248         return (bus_intr_establish(sc->sc_bustag, pri, level,
  249                                    handler, arg));
  250 }
  251 
  252 bus_space_tag_t
  253 dma_alloc_bustag(sc)
  254         struct dma_softc *sc;
  255 {
  256         bus_space_tag_t sbt;
  257 
  258         sbt = (bus_space_tag_t) malloc(sizeof(struct sparc_bus_space_tag),
  259             M_DEVBUF, M_NOWAIT|M_ZERO);
  260         if (sbt == NULL)
  261                 return (NULL);
  262 
  263         sbt->cookie = sc;
  264         sbt->parent = sc->sc_lsi64854.sc_bustag;
  265         sbt->sparc_intr_establish = dmabus_intr_establish;
  266         return (sbt);
  267 }

Cache object: d88fe9f9a85e96b4f58ee67272dd3004


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.