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/powerpc/powermac/uninorth.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 /*-
    2  * Copyright (C) 2002 Benno Rice.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
   15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   17  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   18  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   21  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   22  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   24  *
   25  * $FreeBSD$
   26  */
   27 
   28 #include <sys/param.h>
   29 #include <sys/systm.h>
   30 #include <sys/module.h>
   31 #include <sys/bus.h>
   32 #include <sys/conf.h>
   33 #include <sys/kernel.h>
   34 
   35 #include <dev/ofw/openfirm.h>
   36 #include <dev/ofw/ofw_pci.h>
   37 #include <dev/ofw/ofw_bus.h>
   38 #include <dev/ofw/ofw_bus_subr.h>
   39 
   40 #include <dev/pci/pcivar.h>
   41 #include <dev/pci/pcireg.h>
   42 
   43 #include <machine/bus.h>
   44 #include <machine/intr_machdep.h>
   45 #include <machine/md_var.h>
   46 #include <machine/pio.h>
   47 #include <machine/resource.h>
   48 
   49 #include <sys/rman.h>
   50 
   51 #include <powerpc/powermac/uninorthvar.h>
   52 
   53 #include <vm/vm.h>
   54 #include <vm/pmap.h>
   55 
   56 /*
   57  * Driver for the Uninorth chip itself.
   58  */
   59 
   60 static MALLOC_DEFINE(M_UNIN, "unin", "unin device information");
   61 
   62 /*
   63  * Device interface.
   64  */
   65 
   66 static int  unin_chip_probe(device_t);
   67 static int  unin_chip_attach(device_t);
   68 
   69 /*
   70  * Bus interface.
   71  */
   72 static int  unin_chip_print_child(device_t dev, device_t child);
   73 static void unin_chip_probe_nomatch(device_t, device_t);
   74 static struct resource *unin_chip_alloc_resource(device_t, device_t, int, int *,
   75                                                  u_long, u_long, u_long, u_int);
   76 static int  unin_chip_activate_resource(device_t, device_t, int, int,
   77                                         struct resource *);
   78 static int  unin_chip_deactivate_resource(device_t, device_t, int, int,
   79                                           struct resource *);
   80 static int  unin_chip_release_resource(device_t, device_t, int, int,
   81                                        struct resource *);
   82 static struct resource_list *unin_chip_get_resource_list (device_t, device_t);
   83 
   84 /*
   85  * OFW Bus interface
   86  */
   87 
   88 static ofw_bus_get_devinfo_t unin_chip_get_devinfo;
   89 
   90 /*
   91  * Local routines
   92  */
   93 
   94 static void             unin_enable_gmac(device_t dev);
   95 static void             unin_enable_mpic(device_t dev);
   96 
   97 /*
   98  * Driver methods.
   99  */
  100 static device_method_t unin_chip_methods[] = {
  101 
  102         /* Device interface */
  103         DEVMETHOD(device_probe,         unin_chip_probe),
  104         DEVMETHOD(device_attach,        unin_chip_attach),
  105 
  106         /* Bus interface */
  107         DEVMETHOD(bus_print_child,      unin_chip_print_child),
  108         DEVMETHOD(bus_probe_nomatch,    unin_chip_probe_nomatch),
  109         DEVMETHOD(bus_setup_intr,       bus_generic_setup_intr),
  110         DEVMETHOD(bus_teardown_intr,    bus_generic_teardown_intr),
  111 
  112         DEVMETHOD(bus_alloc_resource,   unin_chip_alloc_resource),
  113         DEVMETHOD(bus_release_resource, unin_chip_release_resource),
  114         DEVMETHOD(bus_activate_resource, unin_chip_activate_resource),
  115         DEVMETHOD(bus_deactivate_resource, unin_chip_deactivate_resource),
  116         DEVMETHOD(bus_get_resource_list, unin_chip_get_resource_list),
  117 
  118         DEVMETHOD(bus_child_pnpinfo_str, ofw_bus_gen_child_pnpinfo_str),
  119 
  120         /* ofw_bus interface */
  121         DEVMETHOD(ofw_bus_get_devinfo,  unin_chip_get_devinfo),
  122         DEVMETHOD(ofw_bus_get_compat,   ofw_bus_gen_get_compat),
  123         DEVMETHOD(ofw_bus_get_model,    ofw_bus_gen_get_model),
  124         DEVMETHOD(ofw_bus_get_name,     ofw_bus_gen_get_name),
  125         DEVMETHOD(ofw_bus_get_node,     ofw_bus_gen_get_node),
  126         DEVMETHOD(ofw_bus_get_type,     ofw_bus_gen_get_type),
  127 
  128         { 0, 0 }
  129 };
  130 
  131 static driver_t unin_chip_driver = {
  132         "unin",
  133         unin_chip_methods,
  134         sizeof(struct unin_chip_softc)
  135 };
  136 
  137 static devclass_t       unin_chip_devclass;
  138 
  139 DRIVER_MODULE(unin, nexus, unin_chip_driver, unin_chip_devclass, 0, 0);
  140 
  141 /*
  142  * Add an interrupt to the dev's resource list if present
  143  */
  144 static void
  145 unin_chip_add_intr(phandle_t devnode, struct unin_chip_devinfo *dinfo)
  146 {
  147         phandle_t iparent;
  148         int     *intr;
  149         int     i, nintr;
  150         int     icells;
  151 
  152         if (dinfo->udi_ninterrupts >= 6) {
  153                 printf("unin: device has more than 6 interrupts\n");
  154                 return;
  155         }
  156 
  157         nintr = OF_getprop_alloc(devnode, "interrupts", sizeof(*intr), 
  158                 (void **)&intr);
  159         if (nintr == -1) {
  160                 nintr = OF_getprop_alloc(devnode, "AAPL,interrupts", 
  161                         sizeof(*intr), (void **)&intr);
  162                 if (nintr == -1)
  163                         return;
  164         }
  165 
  166         if (intr[0] == -1)
  167                 return;
  168 
  169         if (OF_getprop(devnode, "interrupt-parent", &iparent, sizeof(iparent))
  170             <= 0)
  171                 panic("Interrupt but no interrupt parent!\n");
  172 
  173         if (OF_searchprop(iparent, "#interrupt-cells", &icells, sizeof(icells))
  174             <= 0)
  175                 icells = 1;
  176 
  177         for (i = 0; i < nintr; i+=icells) {
  178                 u_int irq = MAP_IRQ(iparent, intr[i]);
  179 
  180                 resource_list_add(&dinfo->udi_resources, SYS_RES_IRQ,
  181                     dinfo->udi_ninterrupts, irq, irq, 1);
  182 
  183                 if (icells > 1) {
  184                         powerpc_config_intr(irq,
  185                             (intr[i+1] & 1) ? INTR_TRIGGER_LEVEL :
  186                             INTR_TRIGGER_EDGE, INTR_POLARITY_LOW);
  187                 }
  188 
  189                 dinfo->udi_interrupts[dinfo->udi_ninterrupts] = irq;
  190                 dinfo->udi_ninterrupts++;
  191         }
  192 }
  193 
  194 static void
  195 unin_chip_add_reg(phandle_t devnode, struct unin_chip_devinfo *dinfo)
  196 {
  197         struct  unin_chip_reg *reg;
  198         int     i, nreg;
  199 
  200         nreg = OF_getprop_alloc(devnode, "reg", sizeof(*reg), (void **)&reg);
  201         if (nreg == -1)
  202                 return;
  203 
  204         for (i = 0; i < nreg; i++) {
  205                 resource_list_add(&dinfo->udi_resources, SYS_RES_MEMORY, i,
  206                                   reg[i].mr_base,
  207                                   reg[i].mr_base + reg[i].mr_size,
  208                                   reg[i].mr_size);
  209         }
  210 }
  211 
  212 static void
  213 unin_enable_gmac(device_t dev)
  214 {
  215         volatile u_int *clkreg;
  216         struct unin_chip_softc *sc;
  217         u_int32_t tmpl;
  218 
  219         sc = device_get_softc(dev);
  220         clkreg = (void *)(sc->sc_addr + UNIN_CLOCKCNTL);
  221         tmpl = inl(clkreg);
  222         tmpl |= UNIN_CLOCKCNTL_GMAC;
  223         outl(clkreg, tmpl);
  224 }
  225 
  226 static void
  227 unin_enable_mpic(device_t dev)
  228 {
  229         volatile u_int *toggle;
  230         struct unin_chip_softc *sc;
  231         u_int32_t tmpl;
  232 
  233         sc = device_get_softc(dev);
  234         toggle = (void *)(sc->sc_addr + UNIN_TOGGLE_REG);
  235         tmpl = inl(toggle);
  236         tmpl |= UNIN_MPIC_RESET | UNIN_MPIC_OUTPUT_ENABLE;
  237         outl(toggle, tmpl);
  238 }
  239 
  240 static int
  241 unin_chip_probe(device_t dev)
  242 {
  243         const char      *name;
  244 
  245         name = ofw_bus_get_name(dev);
  246 
  247         if (name == NULL)
  248                 return (ENXIO);
  249 
  250         if (strcmp(name, "uni-n") != 0 && strcmp(name, "u3") != 0
  251             && strcmp(name, "u4") != 0)
  252                 return (ENXIO);
  253 
  254         device_set_desc(dev, "Apple UniNorth System Controller");
  255         return (0);
  256 }
  257 
  258 static int
  259 unin_chip_attach(device_t dev)
  260 {
  261         struct unin_chip_softc *sc;
  262         struct unin_chip_devinfo *dinfo;
  263         phandle_t  root;
  264         phandle_t  child;
  265         phandle_t  iparent;
  266         device_t   cdev;
  267         char compat[32];
  268         char name[32];
  269         u_int irq, reg[3];
  270         int error, i = 0;
  271 
  272         sc = device_get_softc(dev);
  273         root = ofw_bus_get_node(dev);
  274 
  275         if (OF_getprop(root, "reg", reg, sizeof(reg)) < 8)
  276                 return (ENXIO);
  277 
  278         if (strcmp(ofw_bus_get_name(dev), "u3") == 0
  279             || strcmp(ofw_bus_get_name(dev), "u4") == 0)
  280                 i = 1; /* #address-cells lies */
  281 
  282         sc->sc_physaddr = reg[i];
  283         sc->sc_size = reg[i+1];
  284 
  285         sc->sc_mem_rman.rm_type = RMAN_ARRAY;
  286         sc->sc_mem_rman.rm_descr = "UniNorth Device Memory";
  287 
  288         error = rman_init(&sc->sc_mem_rman);
  289 
  290         if (error) {
  291                 device_printf(dev, "rman_init() failed. error = %d\n", error);
  292                 return (error);
  293         }
  294 
  295         error = rman_manage_region(&sc->sc_mem_rman, sc->sc_physaddr,
  296                                    sc->sc_physaddr + sc->sc_size - 1);  
  297         if (error) {
  298                 device_printf(dev,
  299                               "rman_manage_region() failed. error = %d\n",
  300                               error);
  301                 return (error);
  302         }
  303 
  304         /*
  305          * Iterate through the sub-devices
  306          */
  307         for (child = OF_child(root); child != 0; child = OF_peer(child)) {
  308                 dinfo = malloc(sizeof(*dinfo), M_UNIN, M_WAITOK | M_ZERO);
  309                 if (ofw_bus_gen_setup_devinfo(&dinfo->udi_obdinfo, child)
  310                     != 0)
  311                 {
  312                         free(dinfo, M_UNIN);
  313                         continue;
  314                 }
  315 
  316                 resource_list_init(&dinfo->udi_resources);
  317                 dinfo->udi_ninterrupts = 0;
  318                 unin_chip_add_intr(child, dinfo);
  319 
  320                 /*
  321                  * Some Apple machines do have a bug in OF, they miss
  322                  * the interrupt entries on the U3 I2C node. That means they
  323                  * do not have an entry with number of interrupts nor the
  324                  * entry of the interrupt parent handle.
  325                  * We define an interrupt and hardwire it to the /u3/mpic
  326                  * handle.
  327                  */
  328 
  329                 if (OF_getprop(child, "name", name, sizeof(name)) <= 0)
  330                         device_printf(dev, "device has no name!\n");
  331                 if (dinfo->udi_ninterrupts == 0 &&
  332                     (strcmp(name, "i2c-bus") == 0 ||
  333                      strcmp(name, "i2c")  == 0)) {
  334                         if (OF_getprop(child, "interrupt-parent", &iparent,
  335                                        sizeof(iparent)) <= 0) {
  336                                 iparent = OF_finddevice("/u3/mpic");
  337                                 device_printf(dev, "Set /u3/mpic as iparent!\n");
  338                         }
  339                         /* Add an interrupt number 0 to the parent. */
  340                         irq = MAP_IRQ(iparent, 0);
  341                         resource_list_add(&dinfo->udi_resources, SYS_RES_IRQ,
  342                                           dinfo->udi_ninterrupts, irq, irq, 1);
  343                         dinfo->udi_interrupts[dinfo->udi_ninterrupts] = irq;
  344                         dinfo->udi_ninterrupts++;
  345                 }
  346 
  347                 unin_chip_add_reg(child, dinfo);
  348 
  349                 cdev = device_add_child(dev, NULL, -1);
  350                 if (cdev == NULL) {
  351                         device_printf(dev, "<%s>: device_add_child failed\n",
  352                                       dinfo->udi_obdinfo.obd_name);
  353                         resource_list_free(&dinfo->udi_resources);
  354                         ofw_bus_gen_destroy_devinfo(&dinfo->udi_obdinfo);
  355                         free(dinfo, M_UNIN);
  356                         continue;
  357                 }
  358 
  359                 device_set_ivars(cdev, dinfo);
  360         }
  361 
  362         /*
  363          * Only map the first page, since that is where the registers
  364          * of interest lie.
  365          */
  366         sc->sc_addr = (vm_offset_t)pmap_mapdev(sc->sc_physaddr, PAGE_SIZE);
  367 
  368         sc->sc_version = *(u_int *)sc->sc_addr;
  369         device_printf(dev, "Version %d\n", sc->sc_version);
  370 
  371         /*
  372          * Enable the GMAC Ethernet cell and the integrated OpenPIC
  373          * if Open Firmware says they are used.
  374          */
  375         for (child = OF_child(root); child; child = OF_peer(child)) {
  376                 memset(compat, 0, sizeof(compat));
  377                 OF_getprop(child, "compatible", compat, sizeof(compat));
  378                 if (strcmp(compat, "gmac") == 0)
  379                         unin_enable_gmac(dev);
  380                 if (strcmp(compat, "chrp,open-pic") == 0)
  381                         unin_enable_mpic(dev);
  382         }
  383         
  384         /*
  385          * GMAC lives under the PCI bus, so just check if enet is gmac.
  386          */
  387         child = OF_finddevice("enet");
  388         memset(compat, 0, sizeof(compat));
  389         OF_getprop(child, "compatible", compat, sizeof(compat));
  390         if (strcmp(compat, "gmac") == 0)
  391                 unin_enable_gmac(dev);
  392 
  393         return (bus_generic_attach(dev));
  394 }
  395 
  396 static int
  397 unin_chip_print_child(device_t dev, device_t child)
  398 {
  399         struct unin_chip_devinfo *dinfo;
  400         struct resource_list *rl;
  401         int retval = 0;
  402 
  403         dinfo = device_get_ivars(child);
  404         rl = &dinfo->udi_resources;
  405 
  406         retval += bus_print_child_header(dev, child);
  407 
  408         retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx");
  409         retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld");
  410 
  411         retval += bus_print_child_footer(dev, child);
  412 
  413         return (retval);
  414 }
  415 
  416 static void
  417 unin_chip_probe_nomatch(device_t dev, device_t child)
  418 {
  419         struct unin_chip_devinfo *dinfo;
  420         struct resource_list *rl;
  421         const char *type;
  422 
  423         if (bootverbose) {
  424                 dinfo = device_get_ivars(child);
  425                 rl = &dinfo->udi_resources;
  426 
  427                 if ((type = ofw_bus_get_type(child)) == NULL)
  428                         type = "(unknown)";
  429                 device_printf(dev, "<%s, %s>", type, ofw_bus_get_name(child));
  430                 resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx");
  431                 resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld");
  432                 printf(" (no driver attached)\n");
  433         }
  434 }
  435 
  436 
  437 static struct resource *
  438 unin_chip_alloc_resource(device_t bus, device_t child, int type, int *rid,
  439                          u_long start, u_long end, u_long count, u_int flags)
  440 {
  441         struct          unin_chip_softc *sc;
  442         int             needactivate;
  443         struct          resource *rv;
  444         struct          rman *rm;
  445         u_long          adjstart, adjend, adjcount;
  446         struct          unin_chip_devinfo *dinfo;
  447         struct          resource_list_entry *rle;
  448 
  449         sc = device_get_softc(bus);
  450         dinfo = device_get_ivars(child);
  451 
  452         needactivate = flags & RF_ACTIVE;
  453         flags &= ~RF_ACTIVE;
  454 
  455         switch (type) {
  456         case SYS_RES_MEMORY:
  457         case SYS_RES_IOPORT:
  458                 rle = resource_list_find(&dinfo->udi_resources, SYS_RES_MEMORY,
  459                                          *rid);
  460                 if (rle == NULL) {
  461                         device_printf(bus, "no rle for %s memory %d\n",
  462                                       device_get_nameunit(child), *rid);
  463                         return (NULL);
  464                 }
  465 
  466                 rle->end = rle->end - 1; /* Hack? */
  467 
  468                 if (start < rle->start)
  469                         adjstart = rle->start;
  470                 else if (start > rle->end)
  471                         adjstart = rle->end;
  472                 else
  473                         adjstart = start;
  474 
  475                 if (end < rle->start)
  476                         adjend = rle->start;
  477                 else if (end > rle->end)
  478                         adjend = rle->end;
  479                 else
  480                         adjend = end;
  481 
  482                 adjcount = adjend - adjstart;
  483 
  484                 rm = &sc->sc_mem_rman;
  485                 break;
  486 
  487         case SYS_RES_IRQ:
  488                 /* Check for passthrough from subattachments. */
  489                 if (device_get_parent(child) != bus)
  490                         return BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
  491                                                   type, rid, start, end, count,
  492                                                   flags);
  493 
  494                 rle = resource_list_find(&dinfo->udi_resources, SYS_RES_IRQ,
  495                     *rid);
  496                 if (rle == NULL) {
  497                         if (dinfo->udi_ninterrupts >= 6) {
  498                                 device_printf(bus,
  499                                               "%s has more than 6 interrupts\n",
  500                                               device_get_nameunit(child));
  501                                 return (NULL);
  502                         }
  503                         resource_list_add(&dinfo->udi_resources, SYS_RES_IRQ,
  504                                           dinfo->udi_ninterrupts, start, start,
  505                                           1);
  506 
  507                         dinfo->udi_interrupts[dinfo->udi_ninterrupts] = start;
  508                         dinfo->udi_ninterrupts++;
  509                 }
  510 
  511                 return (resource_list_alloc(&dinfo->udi_resources, bus, child,
  512                                             type, rid, start, end, count,
  513                                             flags));
  514         default:
  515                 device_printf(bus, "unknown resource request from %s\n",
  516                               device_get_nameunit(child));
  517                 return (NULL);
  518         }
  519 
  520         rv = rman_reserve_resource(rm, adjstart, adjend, adjcount, flags,
  521                                    child);
  522         if (rv == NULL) {
  523                 device_printf(bus,
  524                               "failed to reserve resource %#lx - %#lx (%#lx)"
  525                               " for %s\n", adjstart, adjend, adjcount,
  526                               device_get_nameunit(child));
  527                 return (NULL);
  528         }
  529 
  530         rman_set_rid(rv, *rid);
  531 
  532         if (needactivate) {
  533                 if (bus_activate_resource(child, type, *rid, rv) != 0) {
  534                         device_printf(bus,
  535                                       "failed to activate resource for %s\n",
  536                                       device_get_nameunit(child));
  537                         rman_release_resource(rv);
  538                         return (NULL);
  539                 }
  540         }
  541 
  542         return (rv);
  543 }
  544 
  545 static int
  546 unin_chip_release_resource(device_t bus, device_t child, int type, int rid,
  547                            struct resource *res)
  548 {
  549         if (rman_get_flags(res) & RF_ACTIVE) {
  550                 int error = bus_deactivate_resource(child, type, rid, res);
  551                 if (error)
  552                         return error;
  553         }
  554 
  555         return (rman_release_resource(res));
  556 }
  557 
  558 static int
  559 unin_chip_activate_resource(device_t bus, device_t child, int type, int rid,
  560                             struct resource *res)
  561 {
  562         void    *p;
  563 
  564         if (type == SYS_RES_IRQ)
  565                 return (bus_activate_resource(bus, type, rid, res));
  566 
  567         if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) {
  568                 vm_offset_t start;
  569 
  570                 start = (vm_offset_t) rman_get_start(res);
  571 
  572                 if (bootverbose)
  573                         printf("unin mapdev: start %zx, len %ld\n", start,
  574                                rman_get_size(res));
  575 
  576                 p = pmap_mapdev(start, (vm_size_t) rman_get_size(res));
  577                 if (p == NULL)
  578                         return (ENOMEM);
  579                 rman_set_virtual(res, p);
  580                 rman_set_bustag(res, &bs_be_tag);
  581                 rman_set_bushandle(res, (u_long)p);
  582         }
  583 
  584         return (rman_activate_resource(res));
  585 }
  586 
  587 
  588 static int
  589 unin_chip_deactivate_resource(device_t bus, device_t child, int type, int rid,
  590                               struct resource *res)
  591 {
  592         /*
  593          * If this is a memory resource, unmap it.
  594          */
  595         if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) {
  596                 u_int32_t psize;
  597                 
  598                 psize = rman_get_size(res);
  599                 pmap_unmapdev((vm_offset_t)rman_get_virtual(res), psize);
  600         }
  601 
  602         return (rman_deactivate_resource(res));
  603 }
  604 
  605 
  606 static struct resource_list *
  607 unin_chip_get_resource_list (device_t dev, device_t child)
  608 {
  609         struct unin_chip_devinfo *dinfo;
  610 
  611         dinfo = device_get_ivars(child);
  612         return (&dinfo->udi_resources);
  613 }
  614 
  615 static const struct ofw_bus_devinfo *
  616 unin_chip_get_devinfo(device_t dev, device_t child)
  617 {
  618         struct unin_chip_devinfo *dinfo;
  619 
  620         dinfo = device_get_ivars(child);
  621         return (&dinfo->udi_obdinfo);
  622 }
  623 

Cache object: cbf29cb5efae5ae57ba18589b306f2d8


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