[PATCH RTEMS v2 5/6] libfreebsd: Port OFW to RTEMS

Niteesh G. S. niteesh.gs at gmail.com
Sun Jun 14 16:08:06 UTC 2020


On Sun, Jun 14, 2020 at 5:48 PM Christian Mauderer <oss at c-mauderer.de>
wrote:

>
>
> On 14/06/2020 13:37, Vijay Kumar Banerjee wrote:
> > On Sat, Jun 13, 2020 at 11:44 PM Niteesh G. S. <niteesh.gs at gmail.com>
> wrote:
> >>
> >>
> >>
> >> On Sat, Jun 13, 2020 at 6:30 PM Vijay Kumar Banerjee <vijay at rtems.org>
> wrote:
> >>>
> >>> On Thu, Jun 11, 2020 at 5:53 PM G S Niteesh Babu <niteesh.gs at gmail.com>
> wrote:
> >>>>
> >>>> The following files have been ported to RTEMS
> >>>> 1) openfirm.h
> >>>> 2) openfirm.c
> >>>> 3) ofw_fdt.c
> >>>> ---
> >>>>  cpukit/libfreebsd/dev/ofw/ofw_fdt.c  | 146
> ++++++++++++++++++++++++++-
> >>>>  cpukit/libfreebsd/dev/ofw/openfirm.c |  58 ++++++++++-
> >>>>  cpukit/libfreebsd/dev/ofw/openfirm.h |  17 ++++
> >>>>  3 files changed, 219 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/cpukit/libfreebsd/dev/ofw/ofw_fdt.c
> b/cpukit/libfreebsd/dev/ofw/ofw_fdt.c
> >>>> index e4f72e8142..aba170d67a 100644
> >>>> --- a/cpukit/libfreebsd/dev/ofw/ofw_fdt.c
> >>>> +++ b/cpukit/libfreebsd/dev/ofw/ofw_fdt.c
> >>>> @@ -30,9 +30,12 @@
> >>>>   */
> >>>>
> >>>>  #include <sys/cdefs.h>
> >>>> +#ifndef __rtems__
> >>>>  __FBSDID("$FreeBSD$");
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  #include <sys/param.h>
> >>>> +#ifndef __rtems__
> >>>>  #include <sys/kernel.h>
> >>>>  #include <sys/malloc.h>
> >>>>  #include <sys/systm.h>
> >>>> @@ -45,9 +48,20 @@ __FBSDID("$FreeBSD$");
> >>>>  #include <dev/ofw/ofwvar.h>
> >>>>  #include <dev/ofw/openfirm.h>
> >>>>  #include <dev/ofw/ofw_bus_subr.h>
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  #include "ofw_if.h"
> >>>>
> >>>> +#ifdef __rtems__
> >>>> +#include <rtems.h>
> >>>> +#include <rtems/sysinit.h>
> >>>> +#include <bsp/fatal.h>
> >>>> +#include <libfdt.h>
> >>>> +#include <assert.h>
> >>>> +#include "openfirm.h"
> >>>> +#endif /* __rtems__ */
> >>>> +
> >>>> +#ifndef __rtems__
> >>>>  #ifdef DEBUG
> >>>>  #define debugf(fmt, args...) do { printf("%s(): ", __func__);  \
> >>>>      printf(fmt,##args); } while (0)
> >>>> @@ -63,6 +77,7 @@ __FBSDID("$FreeBSD$");
> >>>>  #define FDT_MARVELL
> >>>>  #endif
> >>>>  #endif
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  static int ofw_fdt_init(ofw_t, void *);
> >>>>  static phandle_t ofw_fdt_peer(ofw_t, phandle_t);
> >>>> @@ -78,6 +93,7 @@ static ssize_t ofw_fdt_canon(ofw_t, const char *,
> char *, size_t);
> >>>>  static phandle_t ofw_fdt_finddevice(ofw_t, const char *);
> >>>>  static ssize_t ofw_fdt_instance_to_path(ofw_t, ihandle_t, char *,
> size_t);
> >>>>  static ssize_t ofw_fdt_package_to_path(ofw_t, phandle_t, char *,
> size_t);
> >>>> +#ifndef __rtems__
> >>>>  static int ofw_fdt_interpret(ofw_t, const char *, int, cell_t *);
> >>>>
> >>>>  static ofw_method_t ofw_fdt_methods[] = {
> >>>> @@ -104,9 +120,11 @@ static ofw_def_t ofw_fdt = {
> >>>>         0
> >>>>  };
> >>>>  OFW_DEF(ofw_fdt);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  static void *fdtp = NULL;
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  static int
> >>>>  sysctl_handle_dtb(SYSCTL_HANDLER_ARGS)
> >>>>  {
> >>>> @@ -127,6 +145,27 @@ sysctl_register_fdt_oid(void *arg)
> >>>>             sysctl_handle_dtb, "", "Device Tree Blob");
> >>>>  }
> >>>>  SYSINIT(dtb_oid, SI_SUB_KMEM, SI_ORDER_ANY, sysctl_register_fdt_oid,
> NULL);
> >>>> +#else /* __rtems__ */
> >>>> +const void* bsp_fdt_get(void);
> >>>
> >>> Why is it declared here? The function declaration is in fdt.h which is
> >>> included in the libfdt.h
> >>
> >>
> >> We cannot include a BSP headers from cpukit.
> >>
> > The definition of the function is in bsps/shared/start so we're
> > already using code from the bsps/ here. I wonder if this raises the
> > question of whether cpukit is the right location for this driver or if
> > we should use the bsps codes in this driver as a special case?
>
> I wondered about that too. That's why Niteesh moved it in an earlier
> patch set. I think Sebastian said that it would be better in cpukit.
>
> But I'm not that happy with the current solution either. That code
> wouldn't even link without the bsp_fdt_get function. Is there an
> alternative that we could use that would link?
>

Hello Christian,


Sebastian already suggested creating an API to register a device
tree. The main goal of this was to allow unit testing. But then he
mentioned about using wrapper functions to test.
https://lists.rtems.org/pipermail/devel/2020-June/060025.html

I would like to get this patch to a state where this can be pushed
without any changes. The upcoming patches are also libfreebsd
related. If we could finalize this patch we can avoid some
repetitive discussions and will also make it easier for me to create
the next patches.

These are the following points that need to be finalized

1) Where to place the header files? Should they be placed under
cpukit/include/libfreebsd or can we add libfreebsd to the include path?
The latter one will allow us to have same header structure as FreeBSD.

2) How to handle BSP dependencies?

Thanks,
Niteesh.

> >>>
> >>>> +static void
> >>>> +ofw_init(void)
> >>>> +{
> >>>> +       int rv;
> >>>> +       const void *fdt;
> >>>> +
> >>>> +       fdt = bsp_fdt_get();
> >>>> +       rv = ofw_fdt_init(NULL, fdt);
> >>>> +
> >>>> +       /* Fatal if invalid FDT is provided */
> >>>> +       if (rv != 0)
> >>>> +               bsp_fatal(LIBFREEBSD_FATAL_INVALID_FDT);
> >>>> +}
> >>>> +RTEMS_SYSINIT_ITEM(
> >>>> +       ofw_init,
> >>>> +       RTEMS_SYSINIT_BSP_START,
> >>>> +       RTEMS_SYSINIT_ORDER_FIRST
> >>>> +);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  static int
> >>>>  ofw_fdt_init(ofw_t ofw, void *data)
> >>>> @@ -297,7 +336,11 @@ ofw_fdt_getprop(ofw_t ofw, phandle_t package,
> const char *propname, void *buf,
> >>>>         if (prop == NULL)
> >>>>                 return (-1);
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         bcopy(prop, buf, min(len, buflen));
> >>>> +#else /* __rtems__ */
> >>>> +       memcpy(buf, prop, MIN(len, buflen));
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (len);
> >>>>  }
> >>>> @@ -407,6 +450,7 @@ ofw_fdt_package_to_path(ofw_t ofw, phandle_t
> package, char *buf, size_t len)
> >>>>         return (-1);
> >>>>  }
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  #if defined(FDT_MARVELL)
> >>>>  static int
> >>>>  ofw_fdt_fixup(ofw_t ofw)
> >>>> @@ -476,4 +520,104 @@ ofw_fdt_interpret(ofw_t ofw, const char *cmd,
> int nret, cell_t *retvals)
> >>>>  #else
> >>>>         return (0);
> >>>>  #endif
> >>>> -}
> >>>> \ No newline at end of file
> >>>> +}
> >>>> +#endif /* __rtems__ */
> >>>> +
> >>>> +#ifdef __rtems__
> >>>> +int
> >>>> +OFW_INIT(ofw_t ofw_obj, void *cookie)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_init(ofw_obj, cookie));
> >>>> +}
> >>>> +
> >>>> +phandle_t
> >>>> +OFW_PEER(ofw_t ofw_obj, phandle_t node)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_peer(ofw_obj, node));
> >>>> +}
> >>>> +
> >>>> +phandle_t
> >>>> +OFW_CHILD(ofw_t ofw_obj, phandle_t node)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_child(ofw_obj, node));
> >>>> +}
> >>>> +
> >>>> +phandle_t
> >>>> +OFW_PARENT(ofw_t ofw_obj, phandle_t node)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_parent(ofw_obj, node));
> >>>> +}
> >>>> +
> >>>> +phandle_t
> >>>> +OFW_INSTANCE_TO_PACKAGE(ofw_t ofw_obj, ihandle_t instance)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_instance_to_package(ofw_obj, instance));
> >>>> +}
> >>>> +
> >>>> +ssize_t
> >>>> +OFW_GETPROPLEN(ofw_t ofw_obj, phandle_t package, const char
> *propname)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_getproplen(ofw_obj, package, propname));
> >>>> +}
> >>>> +
> >>>> +ssize_t
> >>>> +OFW_GETPROP(ofw_t ofw_obj, phandle_t package, const char *propname,
> >>>> +    void *buf, size_t buflen
> >>>> +)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_getprop(ofw_obj, package, propname, buf,
> buflen));
> >>>> +}
> >>>> +
> >>>> +int
> >>>> +OFW_NEXTPROP(ofw_t ofw_obj, phandle_t package, const char *prev,
> char *buf,
> >>>> +    size_t size)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_nextprop(ofw_obj, package, prev, buf, size));
> >>>> +}
> >>>> +
> >>>> +int
> >>>> +OFW_SETPROP(ofw_t ofw_obj, phandle_t package, const char *propname,
> >>>> +    const void *buf, size_t len)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_setprop(ofw_obj, package, propname, buf,
> len));
> >>>> +}
> >>>> +
> >>>> +ssize_t
> >>>> +OFW_CANON(ofw_t ofw_obj, const char *device, char *buf, size_t len)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_canon(ofw_obj, device, buf, len));
> >>>> +}
> >>>> +
> >>>> +phandle_t
> >>>> +OFW_FINDDEVICE(ofw_t ofw_obj, const char *device)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_finddevice(ofw_obj, device));
> >>>> +}
> >>>> +
> >>>> +ssize_t
> >>>> +OFW_INSTANCE_TO_PATH(ofw_t ofw_obj, ihandle_t instance, char *buf,
> >>>> +    size_t len)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_instance_to_path(ofw_obj, instance, buf,
> len));
> >>>> +}
> >>>> +
> >>>> +ssize_t
> >>>> +OFW_PACKAGE_TO_PATH(ofw_t ofw_obj, phandle_t package, char *buf,
> >>>> +    size_t len)
> >>>> +{
> >>>> +
> >>>> +       return (ofw_fdt_package_to_path(ofw_obj, package, buf, len));
> >>>> +}
> >>>> +#endif /* __rtems__ */
> >>>> \ No newline at end of file
> >>>> diff --git a/cpukit/libfreebsd/dev/ofw/openfirm.c
> b/cpukit/libfreebsd/dev/ofw/openfirm.c
> >>>> index 50ebf2cf16..e7a67cfd34 100644
> >>>> --- a/cpukit/libfreebsd/dev/ofw/openfirm.c
> >>>> +++ b/cpukit/libfreebsd/dev/ofw/openfirm.c
> >>>> @@ -58,26 +58,37 @@
> >>>>   */
> >>>>
> >>>>  #include <sys/cdefs.h>
> >>>> +#ifndef __rtems__
> >>>>  __FBSDID("$FreeBSD$");
> >>>>
> >>>>  #include "opt_platform.h"
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  #include <sys/param.h>
> >>>> +#ifndef __rtems__
> >>>>  #include <sys/kernel.h>
> >>>>  #include <sys/lock.h>
> >>>>  #include <sys/malloc.h>
> >>>>  #include <sys/mutex.h>
> >>>>  #include <sys/queue.h>
> >>>>  #include <sys/systm.h>
> >>>> +#endif /* __rtems__ */
> >>>>  #include <sys/endian.h>
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  #include <machine/stdarg.h>
> >>>>
> >>>>  #include <dev/ofw/ofwvar.h>
> >>>>  #include <dev/ofw/openfirm.h>
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  #include "ofw_if.h"
> >>>> +#ifdef __rtems__
> >>>> +#include "openfirm.h"
> >>>> +#include "../../rtems-freebsd-helper.h"
> >>>
> >>> Can we add the file rtems-freebsd-helper.h in somewhere like
> >>> libfreebsd/include and install this header file? This will avoid
> >>> future confusions with the number of dots required and we can have
> >>> something like <libfreebsd/rtems-freebsd-helper.h>
> >>
> >>
> >> We still haven't decided where to place the FreeBSD header files.
> >> Once we decide upon this I'll move it and change all references.
> >> Since we have also planned to move all FreeBSD sources under
> >> libfreebsd/freebsd this patch is not valid anymore.
> >> But the code will remain the same so we can use this to discuss
> >> changes but it is not valid for pushing.
> >>
> > Ok. Thanks for the note. libfreebsd/freebsd sounds like an approach
> > similar to libbsd so it should be OK.
> > We can write a post to the devel regarding the plan so that we can get
> > ideas from the devel as well. This will make it easier to merge it
> > later as the plan will be understood by everyone beforehand.
> >
> >
> > Best regards,
> > Vijay
> >>
> >>>
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  static void OF_putchar(int c, void *arg);
> >>>>
> >>>>  MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware properties");
> >>>> @@ -85,7 +96,9 @@ MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware
> properties");
> >>>>  static ihandle_t stdout;
> >>>>
> >>>>  static ofw_def_t       *ofw_def_impl = NULL;
> >>>> +#endif /* __rtems__ */
> >>>>  static ofw_t           ofw_obj;
> >>>> +#ifndef __rtems__
> >>>>  static struct ofw_kobj ofw_kernel_obj;
> >>>>  static struct kobj_ops ofw_kernel_kops;
> >>>>
> >>>> @@ -224,14 +237,18 @@ OF_install(char *name, int prio)
> >>>>
> >>>>         return (FALSE);
> >>>>  }
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  /* Initializer */
> >>>>  int
> >>>>  OF_init(void *cookie)
> >>>>  {
> >>>> +#ifndef __rtems__
> >>>>         phandle_t chosen;
> >>>> +#endif /* __rtems__ */
> >>>>         int rv;
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>>
> >>>> @@ -242,17 +259,21 @@ OF_init(void *cookie)
> >>>>          */
> >>>>         kobj_class_compile_static(ofw_def_impl, &ofw_kernel_kops);
> >>>>         kobj_init_static((kobj_t)ofw_obj, ofw_def_impl);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         rv = OFW_INIT(ofw_obj, cookie);
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if ((chosen = OF_finddevice("/chosen")) != -1)
> >>>>                 if (OF_getencprop(chosen, "stdout", &stdout,
> >>>>                     sizeof(stdout)) == -1)
> >>>>                         stdout = -1;
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (rv);
> >>>>  }
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  static void
> >>>>  OF_putchar(int c, void *arg __unused)
> >>>>  {
> >>>> @@ -314,6 +335,7 @@ OF_interpret(const char *cmd, int nreturns, ...)
> >>>>
> >>>>         return (status);
> >>>>  }
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  /*
> >>>>   * Device tree functions
> >>>> @@ -324,8 +346,10 @@ phandle_t
> >>>>  OF_peer(phandle_t node)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (0);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_PEER(ofw_obj, node));
> >>>>  }
> >>>> @@ -335,8 +359,10 @@ phandle_t
> >>>>  OF_child(phandle_t node)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (0);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_CHILD(ofw_obj, node));
> >>>>  }
> >>>> @@ -346,8 +372,10 @@ phandle_t
> >>>>  OF_parent(phandle_t node)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (0);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_PARENT(ofw_obj, node));
> >>>>  }
> >>>> @@ -357,8 +385,10 @@ phandle_t
> >>>>  OF_instance_to_package(ihandle_t instance)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_INSTANCE_TO_PACKAGE(ofw_obj, instance));
> >>>>  }
> >>>> @@ -368,8 +398,10 @@ ssize_t
> >>>>  OF_getproplen(phandle_t package, const char *propname)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_GETPROPLEN(ofw_obj, package, propname));
> >>>>  }
> >>>> @@ -387,8 +419,10 @@ ssize_t
> >>>>  OF_getprop(phandle_t package, const char *propname, void *buf,
> size_t buflen)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_GETPROP(ofw_obj, package, propname, buf, buflen));
> >>>>  }
> >>>> @@ -532,8 +566,10 @@ int
> >>>>  OF_nextprop(phandle_t package, const char *previous, char *buf,
> size_t size)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_NEXTPROP(ofw_obj, package, previous, buf, size));
> >>>>  }
> >>>> @@ -543,8 +579,10 @@ int
> >>>>  OF_setprop(phandle_t package, const char *propname, const void *buf,
> size_t len)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_SETPROP(ofw_obj, package, propname, buf,len));
> >>>>  }
> >>>> @@ -554,8 +592,10 @@ ssize_t
> >>>>  OF_canon(const char *device, char *buf, size_t len)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_CANON(ofw_obj, device, buf, len));
> >>>>  }
> >>>> @@ -565,8 +605,10 @@ phandle_t
> >>>>  OF_finddevice(const char *device)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_FINDDEVICE(ofw_obj, device));
> >>>>  }
> >>>> @@ -576,8 +618,10 @@ ssize_t
> >>>>  OF_instance_to_path(ihandle_t instance, char *buf, size_t len)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_INSTANCE_TO_PATH(ofw_obj, instance, buf, len));
> >>>>  }
> >>>> @@ -587,8 +631,10 @@ ssize_t
> >>>>  OF_package_to_path(phandle_t package, char *buf, size_t len)
> >>>>  {
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (ofw_def_impl == NULL)
> >>>>                 return (-1);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         return (OFW_PACKAGE_TO_PATH(ofw_obj, package, buf, len));
> >>>>  }
> >>>> @@ -626,14 +672,18 @@ OF_child_xref_phandle(phandle_t parent,
> phandle_t xref)
> >>>>  phandle_t
> >>>>  OF_node_from_xref(phandle_t xref)
> >>>>  {
> >>>> +#ifndef __rtems__
> >>>>         struct xrefinfo *xi;
> >>>> +#endif /* __rtems__ */
> >>>>         phandle_t node;
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (xref_init_done) {
> >>>>                 if ((xi = xrefinfo_find(xref, FIND_BY_XREF)) == NULL)
> >>>>                         return (xref);
> >>>>                 return (xi->node);
> >>>>         }
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         if ((node = OF_child_xref_phandle(OF_peer(0), xref)) == -1)
> >>>>                 return (xref);
> >>>> @@ -643,14 +693,18 @@ OF_node_from_xref(phandle_t xref)
> >>>>  phandle_t
> >>>>  OF_xref_from_node(phandle_t node)
> >>>>  {
> >>>> +#ifndef __rtems__
> >>>>         struct xrefinfo *xi;
> >>>> +#endif /* __rtems__ */
> >>>>         phandle_t xref;
> >>>>
> >>>> +#ifndef __rtems__
> >>>>         if (xref_init_done) {
> >>>>                 if ((xi = xrefinfo_find(node, FIND_BY_NODE)) == NULL)
> >>>>                         return (node);
> >>>>                 return (xi->xref);
> >>>>         }
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>         if (OF_getencprop(node, "phandle", &xref, sizeof(xref)) == -1
> &&
> >>>>             OF_getencprop(node, "ibm,phandle", &xref, sizeof(xref))
> == -1 &&
> >>>> @@ -659,6 +713,7 @@ OF_xref_from_node(phandle_t node)
> >>>>         return (xref);
> >>>>  }
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  device_t
> >>>>  OF_device_from_xref(phandle_t xref)
> >>>>  {
> >>>> @@ -845,4 +900,5 @@ OF_exit()
> >>>>
> >>>>         for (;;)                        /* just in case */
> >>>>                 ;
> >>>> -}
> >>>> \ No newline at end of file
> >>>> +}
> >>>> +#endif /* __rtems__ */
> >>>> \ No newline at end of file
> >>>> diff --git a/cpukit/libfreebsd/dev/ofw/openfirm.h
> b/cpukit/libfreebsd/dev/ofw/openfirm.h
> >>>> index 74a7075367..b4f6bf292a 100644
> >>>> --- a/cpukit/libfreebsd/dev/ofw/openfirm.h
> >>>> +++ b/cpukit/libfreebsd/dev/ofw/openfirm.h
> >>>> @@ -63,7 +63,12 @@
> >>>>  #define _DEV_OPENFIRM_H_
> >>>>
> >>>>  #include <sys/types.h>
> >>>> +#ifndef __rtems__
> >>>>  #include <machine/_bus.h>
> >>>> +#else /* __rtems__ */
> >>>> +#include <rtems.h>
> >>>> +#include "../../rtems-freebsd-helper.h"
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  /*
> >>>>   * Prototypes for Open Firmware Interface Routines
> >>>> @@ -73,7 +78,12 @@ typedef uint32_t     ihandle_t;
> >>>>  typedef uint32_t       phandle_t;
> >>>>  typedef uint32_t       pcell_t;
> >>>>
> >>>> +#ifdef __rtems__
> >>>> +typedef uint32_t       cell_t;
> >>>> +#endif /* __rtems__ */
> >>>> +
> >>>>  #ifdef _KERNEL
> >>>> +#ifndef __rtems__
> >>>>  #include <sys/malloc.h>
> >>>>
> >>>>  #include <machine/ofw_machdep.h>
> >>>> @@ -86,8 +96,10 @@ MALLOC_DECLARE(M_OFWPROP);
> >>>>   */
> >>>>
> >>>>  boolean_t      OF_install(char *name, int prio);
> >>>> +#endif /* __rtems__*/
> >>>>  int            OF_init(void *cookie);
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  /*
> >>>>   * Known Open Firmware interface names
> >>>>   */
> >>>> @@ -100,6 +112,7 @@ int         OF_init(void *cookie);
> >>>>  /* Generic functions */
> >>>>  int            OF_test(const char *name);
> >>>>  void           OF_printf(const char *fmt, ...);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  /* Device tree functions */
> >>>>  phandle_t      OF_peer(phandle_t node);
> >>>> @@ -141,6 +154,7 @@ ssize_t             OF_package_to_path(phandle_t
> node, char *buf, size_t len);
> >>>>  phandle_t      OF_node_from_xref(phandle_t xref);
> >>>>  phandle_t      OF_xref_from_node(phandle_t node);
> >>>>
> >>>> +#ifndef __rtems__
> >>>>  /*
> >>>>   * When properties contain references to other nodes using xref
> handles it is
> >>>>   * often necessary to use interfaces provided by the driver for the
> referenced
> >>>> @@ -158,9 +172,11 @@ void               OF_close(ihandle_t instance);
> >>>>  ssize_t                OF_read(ihandle_t instance, void *buf, size_t
> len);
> >>>>  ssize_t                OF_write(ihandle_t instance, const void *buf,
> size_t len);
> >>>>  int            OF_seek(ihandle_t instance, uint64_t where);
> >>>> +#endif /* __rtems__ */
> >>>>
> >>>>  phandle_t      OF_instance_to_package(ihandle_t instance);
> >>>>  ssize_t                OF_instance_to_path(ihandle_t instance, char
> *buf, size_t len);
> >>>> +#ifndef __rtems__
> >>>>  int            OF_call_method(const char *method, ihandle_t instance,
> >>>>                     int nargs, int nreturns, ...);
> >>>>
> >>>> @@ -183,5 +199,6 @@ int         OF_interpret(const char *cmd, int
> nreturns, ...);
> >>>>  int            OF_decode_addr(phandle_t dev, int regno,
> bus_space_tag_t *ptag,
> >>>>                     bus_space_handle_t *phandle, bus_size_t *sz);
> >>>>
> >>>> +#endif /* __rtems__ */
> >>>>  #endif /* _KERNEL */
> >>>>  #endif /* _DEV_OPENFIRM_H_ */
> >>>> \ No newline at end of file
> >>>> --
> >>>> 2.17.1
> >>>>
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200614/3790a233/attachment-0001.html>


More information about the devel mailing list