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/ofw/openfirm.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: Locore.c,v 1.7 2000/08/20 07:04:59 tsubai Exp $        */
    2 
    3 /*-
    4  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
    5  * Copyright (C) 1995, 1996 TooLs GmbH.
    6  * 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  * 3. All advertising materials mentioning features or use of this software
   17  *    must display the following acknowledgement:
   18  *      This product includes software developed by TooLs GmbH.
   19  * 4. The name of TooLs GmbH may not be used to endorse or promote products
   20  *    derived from this software without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
   23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   25  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   28  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   29  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   30  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   31  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 /*-
   34  * Copyright (C) 2000 Benno Rice.
   35  * All rights reserved.
   36  *
   37  * Redistribution and use in source and binary forms, with or without
   38  * modification, are permitted provided that the following conditions
   39  * are met:
   40  * 1. Redistributions of source code must retain the above copyright
   41  *    notice, this list of conditions and the following disclaimer.
   42  * 2. Redistributions in binary form must reproduce the above copyright
   43  *    notice, this list of conditions and the following disclaimer in the
   44  *    documentation and/or other materials provided with the distribution.
   45  *
   46  * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
   47  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   48  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   49  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   50  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   51  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   52  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   53  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   54  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   55  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   56  */
   57 
   58 #include <sys/cdefs.h>
   59 __FBSDID("$FreeBSD: releng/8.1/sys/dev/ofw/openfirm.c 194138 2009-06-14 00:05:38Z marius $");
   60 
   61 #include <sys/param.h>
   62 #include <sys/kernel.h>
   63 #include <sys/malloc.h>
   64 #include <sys/systm.h>
   65 
   66 #include <machine/stdarg.h>
   67 
   68 #include <dev/ofw/ofwvar.h>
   69 #include <dev/ofw/openfirm.h>
   70 
   71 #include "ofw_if.h"
   72 
   73 MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware properties");
   74 
   75 static ihandle_t stdout;
   76 
   77 static ofw_def_t        *ofw_def_impl;
   78 static ofw_t            ofw_obj;
   79 static struct ofw_kobj  ofw_kernel_obj;
   80 static struct kobj_ops  ofw_kernel_kops;
   81 
   82 /*
   83  * OFW install routines. Highest priority wins, equal priority also
   84  * overrides allowing last-set to win.
   85  */
   86 SET_DECLARE(ofw_set, ofw_def_t);
   87 
   88 boolean_t
   89 OF_install(char *name, int prio)
   90 {
   91         ofw_def_t *ofwp, **ofwpp;
   92         static int curr_prio = 0;
   93 
   94         /*
   95          * Try and locate the OFW kobj corresponding to the name.
   96          */
   97         SET_FOREACH(ofwpp, ofw_set) {
   98                 ofwp = *ofwpp;
   99 
  100                 if (ofwp->name &&
  101                     !strcmp(ofwp->name, name) &&
  102                     prio >= curr_prio) {
  103                         curr_prio = prio;
  104                         ofw_def_impl = ofwp;
  105                         return (TRUE);
  106                 }
  107         }
  108 
  109         return (FALSE);
  110 }
  111 
  112 /* Initializer */
  113 void
  114 OF_init(void *cookie)
  115 {
  116         phandle_t chosen;
  117 
  118         ofw_obj = &ofw_kernel_obj;
  119         /*
  120          * Take care of compiling the selected class, and
  121          * then statically initialize the OFW object.
  122          */
  123         kobj_class_compile_static(ofw_def_impl, &ofw_kernel_kops);
  124         kobj_init((kobj_t)ofw_obj, ofw_def_impl);
  125 
  126         OFW_INIT(ofw_obj, cookie);
  127 
  128         if ((chosen = OF_finddevice("/chosen")) == -1)
  129                 OF_exit();
  130         if (OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1)
  131                 stdout = -1;
  132 }
  133 
  134 void
  135 OF_printf(const char *fmt, ...)
  136 {
  137         va_list va;
  138         char buf[1024];
  139 
  140         va_start(va, fmt);
  141         vsprintf(buf, fmt, va);
  142         OF_write(stdout, buf, strlen(buf));
  143         va_end(va);
  144 }
  145 
  146 /*
  147  * Generic functions
  148  */
  149 
  150 /* Test to see if a service exists. */
  151 int
  152 OF_test(const char *name)
  153 {
  154 
  155         return (OFW_TEST(ofw_obj, name));
  156 }
  157 
  158 int
  159 OF_interpret(const char *cmd, int nreturns, ...)
  160 {
  161         va_list ap;
  162         unsigned long slots[16];
  163         int i = 0;
  164         int status;
  165 
  166         status = OFW_INTERPRET(ofw_obj, cmd, nreturns, slots);
  167         if (status == -1)
  168                 return (status);
  169 
  170         va_start(ap, nreturns);
  171         while (i < nreturns)
  172                 *va_arg(ap, cell_t *) = slots[i++];
  173         va_end(ap);
  174 
  175         return (status);
  176 }
  177 
  178 /*
  179  * Device tree functions
  180  */
  181 
  182 /* Return the next sibling of this node or 0. */
  183 phandle_t
  184 OF_peer(phandle_t node)
  185 {
  186 
  187         return (OFW_PEER(ofw_obj, node));
  188 }
  189 
  190 /* Return the first child of this node or 0. */
  191 phandle_t
  192 OF_child(phandle_t node)
  193 {
  194 
  195         return (OFW_CHILD(ofw_obj, node));
  196 }
  197 
  198 /* Return the parent of this node or 0. */
  199 phandle_t
  200 OF_parent(phandle_t node)
  201 {
  202 
  203         return (OFW_PARENT(ofw_obj, node));
  204 }
  205 
  206 /* Return the package handle that corresponds to an instance handle. */
  207 phandle_t
  208 OF_instance_to_package(ihandle_t instance)
  209 {
  210 
  211         return (OFW_INSTANCE_TO_PACKAGE(ofw_obj, instance));
  212 }
  213 
  214 /* Get the length of a property of a package. */
  215 ssize_t
  216 OF_getproplen(phandle_t package, const char *propname)
  217 {
  218 
  219         return (OFW_GETPROPLEN(ofw_obj, package, propname));
  220 }
  221 
  222 /* Get the value of a property of a package. */
  223 ssize_t
  224 OF_getprop(phandle_t package, const char *propname, void *buf, size_t buflen)
  225 {
  226 
  227         return (OFW_GETPROP(ofw_obj, package, propname, buf, buflen));
  228 }
  229 
  230 /*
  231  * Resursively search the node and its parent for the given property, working
  232  * downward from the node to the device tree root.  Returns the value of the
  233  * first match.
  234  */
  235 ssize_t
  236 OF_searchprop(phandle_t node, const char *propname, void *buf, size_t len)
  237 {
  238         ssize_t rv;
  239 
  240         for (; node != 0; node = OF_parent(node))
  241                 if ((rv = OF_getprop(node, propname, buf, len)) != -1)
  242                         return (rv);
  243         return (-1);
  244 }
  245 
  246 /*
  247  * Store the value of a property of a package into newly allocated memory
  248  * (using the M_OFWPROP malloc pool and M_WAITOK).  elsz is the size of a
  249  * single element, the number of elements is return in number.
  250  */
  251 ssize_t
  252 OF_getprop_alloc(phandle_t package, const char *propname, int elsz, void **buf)
  253 {
  254         int len;
  255 
  256         *buf = NULL;
  257         if ((len = OF_getproplen(package, propname)) == -1 ||
  258             len % elsz != 0)
  259                 return (-1);
  260 
  261         *buf = malloc(len, M_OFWPROP, M_WAITOK);
  262         if (OF_getprop(package, propname, *buf, len) == -1) {
  263                 free(*buf, M_OFWPROP);
  264                 *buf = NULL;
  265                 return (-1);
  266         }
  267         return (len / elsz);
  268 }
  269 
  270 /* Get the next property of a package. */
  271 int
  272 OF_nextprop(phandle_t package, const char *previous, char *buf, size_t size)
  273 {
  274 
  275         return (OFW_NEXTPROP(ofw_obj, package, previous, buf, size));
  276 }
  277 
  278 /* Set the value of a property of a package. */
  279 int
  280 OF_setprop(phandle_t package, const char *propname, const void *buf, size_t len)
  281 {
  282 
  283         return (OFW_SETPROP(ofw_obj, package, propname, buf,len));
  284 }
  285 
  286 /* Convert a device specifier to a fully qualified pathname. */
  287 ssize_t
  288 OF_canon(const char *device, char *buf, size_t len)
  289 {
  290 
  291         return (OFW_CANON(ofw_obj, device, buf, len));
  292 }
  293 
  294 /* Return a package handle for the specified device. */
  295 phandle_t
  296 OF_finddevice(const char *device)
  297 {
  298 
  299         return (OFW_FINDDEVICE(ofw_obj, device));
  300 }
  301 
  302 /* Return the fully qualified pathname corresponding to an instance. */
  303 ssize_t
  304 OF_instance_to_path(ihandle_t instance, char *buf, size_t len)
  305 {
  306 
  307         return (OFW_INSTANCE_TO_PATH(ofw_obj, instance, buf, len));
  308 }
  309 
  310 /* Return the fully qualified pathname corresponding to a package. */
  311 ssize_t
  312 OF_package_to_path(phandle_t package, char *buf, size_t len)
  313 {
  314 
  315         return (OFW_PACKAGE_TO_PATH(ofw_obj, package, buf, len));
  316 }
  317 
  318 /*  Call the method in the scope of a given instance. */
  319 int
  320 OF_call_method(const char *method, ihandle_t instance, int nargs, int nreturns,
  321     ...)
  322 {
  323         va_list ap;
  324         unsigned long args_n_results[12];
  325         int n, status;
  326 
  327         if (nargs > 6)
  328                 return (-1);
  329         va_start(ap, nreturns);
  330         for (n = 0; n < nargs; n++)
  331                 args_n_results[n] = va_arg(ap, unsigned long);
  332 
  333         status = OFW_CALL_METHOD(ofw_obj, instance, method, nargs, nreturns,
  334             args_n_results);
  335         if (status != 0)
  336                 return (status);
  337 
  338         for (; n < nargs + nreturns; n++)
  339                 *va_arg(ap, unsigned long *) = args_n_results[n];
  340         va_end(ap);
  341         return (0);
  342 }
  343 
  344 /*
  345  * Device I/O functions
  346  */
  347 
  348 /* Open an instance for a device. */
  349 ihandle_t
  350 OF_open(const char *device)
  351 {
  352 
  353         return (OFW_OPEN(ofw_obj, device));
  354 }
  355 
  356 /* Close an instance. */
  357 void
  358 OF_close(ihandle_t instance)
  359 {
  360 
  361         OFW_CLOSE(ofw_obj, instance);
  362 }
  363 
  364 /* Read from an instance. */
  365 ssize_t
  366 OF_read(ihandle_t instance, void *addr, size_t len)
  367 {
  368 
  369         return (OFW_READ(ofw_obj, instance, addr, len));
  370 }
  371 
  372 /* Write to an instance. */
  373 ssize_t
  374 OF_write(ihandle_t instance, const void *addr, size_t len)
  375 {
  376 
  377         return (OFW_WRITE(ofw_obj, instance, addr, len));
  378 }
  379 
  380 /* Seek to a position. */
  381 int
  382 OF_seek(ihandle_t instance, uint64_t pos)
  383 {
  384 
  385         return (OFW_SEEK(ofw_obj, instance, pos));
  386 }
  387 
  388 /*
  389  * Memory functions
  390  */
  391 
  392 /* Claim an area of memory. */
  393 void *
  394 OF_claim(void *virt, size_t size, u_int align)
  395 {
  396 
  397         return (OFW_CLAIM(ofw_obj, virt, size, align));
  398 }
  399 
  400 /* Release an area of memory. */
  401 void
  402 OF_release(void *virt, size_t size)
  403 {
  404 
  405         OFW_RELEASE(ofw_obj, virt, size);
  406 }
  407 
  408 /*
  409  * Control transfer functions
  410  */
  411 
  412 /* Suspend and drop back to the Open Firmware interface. */
  413 void
  414 OF_enter()
  415 {
  416 
  417         OFW_ENTER(ofw_obj);
  418 }
  419 
  420 /* Shut down and drop back to the Open Firmware interface. */
  421 void
  422 OF_exit()
  423 {
  424 
  425         /* Should not return */
  426         OFW_EXIT(ofw_obj);
  427 
  428         for (;;)                        /* just in case */
  429                 ;
  430 }

Cache object: 0f0fdbb6e9555719f37439e46a19ac3f


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