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/cardbus/cardbus_map.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 /*      $OpenBSD: cardbus_map.c,v 1.15 2015/03/14 03:38:47 jsg Exp $    */
    2 /*      $NetBSD: cardbus_map.c,v 1.10 2000/03/07 00:31:46 mycroft Exp $ */
    3 
    4 /*
    5  * Copyright (c) 1999 and 2000
    6  *      HAYAKAWA Koichi.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   21  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   22  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   28  * POSSIBILITY OF SUCH DAMAGE.
   29  */
   30 
   31 
   32 #include <sys/param.h>
   33 #include <sys/systm.h>
   34 
   35 #include <machine/bus.h>
   36 
   37 #include <dev/cardbus/cardbusvar.h>
   38 
   39 #include <dev/pci/pcireg.h>     /* XXX */
   40 
   41 #if defined DEBUG && !defined CARDBUS_MAP_DEBUG
   42 #define CARDBUS_MAP_DEBUG
   43 #endif
   44 
   45 #if defined CARDBUS_MAP_DEBUG
   46 #define STATIC
   47 #define DPRINTF(a) printf a
   48 #else
   49 #ifdef DDB
   50 #define STATIC
   51 #else
   52 #define STATIC static
   53 #endif
   54 #define DPRINTF(a)
   55 #endif
   56 
   57 /*
   58  * int cardbus_mapreg_map(struct cardbus_softc *, int, int, pcireg_t,
   59  *                        int bus_space_tag_t *, bus_space_handle_t *,
   60  *                        bus_addr_t *, bus_size_t *)
   61  *    This function maps bus-space on the value of Base Address
   62  *   Register (BAR) indexed by the argument `reg' (the second argument).
   63  *   When the value of the BAR is not valid, such as 0x00000000, a new
   64  *   address should be allocated for the BAR and new address values is
   65  *   written on the BAR.
   66  */
   67 int
   68 cardbus_mapreg_map(struct cardbus_softc *sc, int func, int reg,
   69     pcireg_t type, int busflags, bus_space_tag_t *tagp,
   70     bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep)
   71 {
   72         cardbus_chipset_tag_t cc = sc->sc_cc;
   73         pci_chipset_tag_t pc = sc->sc_pc;
   74         cardbus_function_tag_t cf = sc->sc_cf;
   75         bus_space_tag_t bustag;
   76         rbus_tag_t rbustag;
   77         bus_space_handle_t handle;
   78         bus_addr_t base;
   79         bus_size_t size;
   80         int flags;
   81         int status = 0;
   82 
   83         pcitag_t tag = pci_make_tag(pc, sc->sc_bus,
   84             sc->sc_device, func);
   85 
   86         DPRINTF(("cardbus_mapreg_map called: %s %x\n", sc->sc_dev.dv_xname,
   87            type));
   88 
   89         if (pci_mapreg_info(pc, tag, reg, type, &base, &size, &flags))
   90                 status = 1;
   91 
   92         if (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) {
   93                 bustag = sc->sc_iot;
   94                 rbustag = sc->sc_rbus_iot;
   95         } else {
   96                 bustag = sc->sc_memt;
   97                 rbustag = sc->sc_rbus_memt;
   98         }
   99         if (status == 0) {
  100                 bus_addr_t mask = size - 1;
  101                 if (base != 0)
  102                         mask = 0xffffffff;
  103                 if ((*cf->cardbus_space_alloc)(cc, rbustag, base, size, mask,
  104                     size, busflags | flags, &base, &handle)) {
  105                         panic("io alloc");
  106                 }
  107         }
  108         pci_conf_write(pc, tag, reg, base);
  109 
  110         DPRINTF(("cardbus_mapreg_map: physaddr %lx\n", (unsigned long)base));
  111 
  112         if (tagp != 0)
  113                 *tagp = bustag;
  114         if (handlep != 0)
  115                 *handlep = handle;
  116         if (basep != 0)
  117                 *basep = base;
  118         if (sizep != 0)
  119                 *sizep = size;
  120 
  121         return (0);
  122 }
  123 
  124 /*
  125  * int cardbus_mapreg_unmap(struct cardbus_softc *sc, int func, int reg,
  126  *                          bus_space_tag_t tag, bus_space_handle_t handle,
  127  *                          bus_size_t size)
  128  *
  129  *   This function releases bus-space region and close memory or io
  130  *   window on the bridge.
  131  *
  132  *  Arguments:
  133  *   struct cardbus_softc *sc; the pointer to the device structure of cardbus.
  134  *   int func; the number of function on the device.
  135  *   int reg; the offset of BAR register.
  136  */
  137 int
  138 cardbus_mapreg_unmap(struct cardbus_softc *sc, int func, int reg,
  139     bus_space_tag_t tag, bus_space_handle_t handle, bus_size_t size)
  140 {
  141         cardbus_chipset_tag_t cc = sc->sc_cc;
  142         pci_chipset_tag_t pc = sc->sc_pc;
  143         cardbus_function_tag_t cf = sc->sc_cf;
  144         int st = 1;
  145         pcitag_t cardbustag;
  146         rbus_tag_t rbustag;
  147 
  148         if (sc->sc_iot == tag) {
  149                 /* bus space is io space */
  150                 DPRINTF(("%s: unmap i/o space\n", sc->sc_dev.dv_xname));
  151                 rbustag = sc->sc_rbus_iot;
  152         } else if (sc->sc_memt == tag) {
  153                 /* bus space is memory space */
  154                 DPRINTF(("%s: unmap mem space\n", sc->sc_dev.dv_xname));
  155                 rbustag = sc->sc_rbus_memt;
  156         } else
  157                 return (1);
  158 
  159         cardbustag = pci_make_tag(pc, sc->sc_bus, sc->sc_device, func);
  160 
  161         pci_conf_write(pc, cardbustag, reg, 0);
  162 
  163         (*cf->cardbus_space_free)(cc, rbustag, handle, size);
  164 
  165         return (st);
  166 }

Cache object: faa7145c1724204e67df5a5527b51f41


[ 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.