[PATCH] Implement FreeBSD helper structures
Niteesh G. S.
niteesh.gs at gmail.com
Wed Jan 20 08:02:51 UTC 2021
Hello Gedare,
On Wed, Jan 20, 2021 at 4:32 AM Gedare Bloom <gedare at rtems.org> wrote:
> Does this have a ticket?
>
It doesn't have a specific ticket for itself, but the rationale behind this
patch is to support ticket
#3782 <https://devel.rtems.org/ticket/3782>.
> I may have missed some email about this idea. It looks like a partial
> compatibility for the freebsd busspace API?
>
This patch aims to reduce the number of modifications done to drivers
imported from FreeBSD. An example of
a driver imported from FreeBSD into RTEMS is the IMX iomux
driver(imx_iomux.c).
This patch implements functions and structures that are quite frequently
used but also have a simple RTEMS
implementation. The real use of this patch can be seen in the ported beagle
pinmux driver
https://github.com/gs-niteesh/rtems/commit/42590fb1c8c8e4228500f995ff6a7c0e0e607133
I have also written about the things this patch implements in my blog here.
https://gs-niteesh.github.io/week/week2/#modifications-needed-before-implementing-the-freebsd-structures
Thanks,
Niteesh.
>
> On Tue, Jan 19, 2021 at 9:20 AM G S Niteesh Babu <niteesh.gs at gmail.com>
> wrote:
>
>> The following structures and functions have been implemented to
>> make porting of driver from FreeBSD easier.
>>
>> 1) struct resource_spec
>> 2) struct device
>> 3) struct resource
>> 4) device_get_softc
>> 5) bus_alloc_resources
>> 6) bus_alloc_resource
>> 7) bus_alloc_resource_any
>> 8) bus_space_read_1
>> 9) bus_space_read_2
>> 10) bus_space_read_4
>> 11) bus_space_write_1
>> 12) bus_space_write_2
>> 13) bus_space_write_4
>> ---
>> bsps/include/rtems/freebsd-compat/bus.h | 122 +++++++++++++++++++
>> bsps/include/rtems/freebsd-compat/device.h | 46 +++++++
>> bsps/include/rtems/freebsd-compat/resource.h | 46 +++++++
>> bsps/include/rtems/freebsd-compat/rman.h | 65 ++++++++++
>> bsps/shared/rtems/freebsd-compat/bus.c | 119 ++++++++++++++++++
>> spec/build/bsps/obj.yml | 1 +
>> 6 files changed, 399 insertions(+)
>> create mode 100644 bsps/include/rtems/freebsd-compat/bus.h
>> create mode 100644 bsps/include/rtems/freebsd-compat/device.h
>> create mode 100644 bsps/include/rtems/freebsd-compat/resource.h
>> create mode 100644 bsps/include/rtems/freebsd-compat/rman.h
>> create mode 100644 bsps/shared/rtems/freebsd-compat/bus.c
>>
>> diff --git a/bsps/include/rtems/freebsd-compat/bus.h
>> b/bsps/include/rtems/freebsd-compat/bus.h
>> new file mode 100644
>> index 0000000000..4bd3ab311a
>> --- /dev/null
>> +++ b/bsps/include/rtems/freebsd-compat/bus.h
>> @@ -0,0 +1,122 @@
>> +/* SPDX-License-Identifier: BSD-2-Clause */
>> +
>> +/**
>> + * @file
>> + *
>> + * @ingroup FreeBSDCompat
>> + *
>> + * @brief
>> + */
>> +
>> +/*
>> + * Copyright (C) <2020> Niteesh Babu <niteesh.gs at gmail.com>
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + * 1. Redistributions of source code must retain the above copyright
>> + * notice, this list of conditions and the following disclaimer.
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + * notice, this list of conditions and the following disclaimer in the
>> + * documentation and/or other materials provided with the
>> distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
>> BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>> IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>> OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>> OF THE
>> + * POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +#ifndef _FREEBSD_COMPAT_BUS_H
>> +#define _FREEBSD_COMPAT_BUS_H
>> +
>> +#include <sys/types.h>
>> +#include "device.h"
>> +#include "rman.h"
>> +
>> +struct resource_spec {
>> + int type;
>> + int rid;
>> + int flags;
>> +};
>> +#define RESOURCE_SPEC_END {-1, 0, 0}
>> +
>> +/*
>> + * Write a 1, 2, 4, or 8 byte quantity to bus space
>> + * described by tag/handle/offset.
>> + */
>> +static inline void
>> +bus_space_write_1(bus_space_tag_t bst, bus_space_handle_t bsh,
>> bus_size_t ofs,
>> + uint8_t val)
>> +{
>> + uint8_t volatile *bsp = (uint8_t volatile *)(bsh + ofs);
>> + *bsp = val;
>> +}
>> +
>> +static inline void
>> +bus_space_write_2(bus_space_tag_t bst, bus_space_handle_t bsh,
>> bus_size_t ofs,
>> + uint16_t val)
>> +{
>> + uint16_t volatile *bsp = (uint16_t volatile *)(bsh + ofs);
>> + *bsp = val;
>> +}
>> +
>> +static inline void
>> +bus_space_write_4(bus_space_tag_t bst, bus_space_handle_t bsh,
>> bus_size_t ofs,
>> + uint32_t val)
>> +{
>> + uint32_t volatile *bsp = (uint32_t volatile *)(bsh + ofs);
>> + *bsp = val;
>> +}
>> +
>> +/*
>> + * Read a 1, 2, 4, or 8 byte quantity from bus space
>> + * described by tag/handle/offset.
>> + */
>> +static inline uint8_t
>> +bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
>> + bus_size_t offset)
>> +{
>> +
>> + return (*(volatile uint8_t *)(handle + offset));
>> +}
>> +
>> +static inline uint16_t
>> +bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
>> + bus_size_t offset)
>> +{
>> + return (*(volatile uint16_t *)(handle + offset));
>> +}
>> +
>> +static inline uint32_t
>> +bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
>> + bus_size_t offset)
>> +{
>> + return (*(volatile uint32_t *)(handle + offset));
>> +}
>> +
>> +bus_space_handle_t rman_get_bushandle(struct resource *);
>> +bus_space_tag_t rman_get_bustag(struct resource *);
>> +
>> +void *device_get_softc(device_t dev);
>> +
>> +int bus_alloc_resources(device_t dev, struct resource_spec *rs,
>> + struct resource **res);
>> +
>> +struct resource *bus_alloc_resource(device_t dev, int type, int *rid,
>> + rman_res_t start, rman_res_t end,
>> + rman_res_t count, u_int flags);
>> +
>> +static __inline struct resource *
>> +bus_alloc_resource_any(device_t dev, int type, int *rid, uint32_t flags)
>> +{
>> + return (bus_alloc_resource(dev, type, rid, 0, ~0, 1, flags));
>> +}
>> +
>> +#endif /* _FREEBSD_COMPAT_BUS_H_ */
>> diff --git a/bsps/include/rtems/freebsd-compat/device.h
>> b/bsps/include/rtems/freebsd-compat/device.h
>> new file mode 100644
>> index 0000000000..c646bb5986
>> --- /dev/null
>> +++ b/bsps/include/rtems/freebsd-compat/device.h
>> @@ -0,0 +1,46 @@
>> +/* SPDX-License-Identifier: BSD-2-Clause */
>> +
>> +/**
>> + * @file
>> + *
>> + * @ingroup FreeBSDCompat
>> + *
>> + * @brief
>> + */
>> +
>> +/*
>> + * Copyright (C) <2020> Niteesh Babu <niteesh.gs at gmail.com>
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + * 1. Redistributions of source code must retain the above copyright
>> + * notice, this list of conditions and the following disclaimer.
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + * notice, this list of conditions and the following disclaimer in the
>> + * documentation and/or other materials provided with the
>> distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
>> BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>> IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>> OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>> OF THE
>> + * POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +#ifndef _FREEBSD_COMPAT_DEVICE_H
>> +#define _FREEBSD_COMPAT_DEVICE_H
>> +
>> +struct device {
>> + void *softc;
>> + unsigned int node;
>> +};
>> +
>> +typedef struct device *device_t;
>> +
>> +#endif /* _FREEBSD_COMPAT_DEVICE_H */
>> diff --git a/bsps/include/rtems/freebsd-compat/resource.h
>> b/bsps/include/rtems/freebsd-compat/resource.h
>> new file mode 100644
>> index 0000000000..f84fd60e21
>> --- /dev/null
>> +++ b/bsps/include/rtems/freebsd-compat/resource.h
>> @@ -0,0 +1,46 @@
>> +/* SPDX-License-Identifier: BSD-2-Clause */
>> +
>> +/**
>> + * @file
>> + *
>> + * @ingroup LIBFREEBSD
>> + *
>> + * @brief
>> + */
>> +
>> +/*
>> + * Copyright (C) <2020> Niteesh Babu <niteesh.gs at gmail.com>
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + * 1. Redistributions of source code must retain the above copyright
>> + * notice, this list of conditions and the following disclaimer.
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + * notice, this list of conditions and the following disclaimer in the
>> + * documentation and/or other materials provided with the
>> distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
>> BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>> IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>> OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>> OF THE
>> + * POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +
>> +#ifndef _FREEBSD_COMPAT_RESOURCE_H
>> +#define _FREEBSD_COMPAT_RESOURCE_H
>> +
>> +#define SYS_RES_IRQ 1
>> +#define SYS_RES_DRQ 2
>> +#define SYS_RES_MEMORY 3
>> +#define SYS_RES_IOPORT 4
>> +#define SYS_RES_GPIO 5
>> +
>> +#endif /* _FREEBSD_COMPAT_RESOURCE_H */
>> diff --git a/bsps/include/rtems/freebsd-compat/rman.h
>> b/bsps/include/rtems/freebsd-compat/rman.h
>> new file mode 100644
>> index 0000000000..cf359789e6
>> --- /dev/null
>> +++ b/bsps/include/rtems/freebsd-compat/rman.h
>> @@ -0,0 +1,65 @@
>> +
>> +/* SPDX-License-Identifier: BSD-2-Clause */
>> +
>> +/**
>> + * @file
>> + *
>> + * @ingroup FreeBSDCompat
>> + *
>> + * @brief
>> + */
>> +
>> +/*
>> + * Copyright (C) <2020> Niteesh Babu <niteesh.gs at gmail.com>
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + * 1. Redistributions of source code must retain the above copyright
>> + * notice, this list of conditions and the following disclaimer.
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + * notice, this list of conditions and the following disclaimer in the
>> + * documentation and/or other materials provided with the
>> distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
>> BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>> IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>> OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>> OF THE
>> + * POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +#ifndef _FREEBSD_COMPAT_RMAN_H
>> +#define _FREEBSD_COMPAT_RMAN_H
>> +
>> +#include <stdint.h>
>> +
>> +typedef uint32_t bus_size_t;
>> +
>> +/*
>> + * Access methods for bus resources and address space.
>> + */
>> +typedef int bus_space_tag_t;
>> +typedef uintptr_t bus_space_handle_t;
>> +
>> +#define RF_ALLOCATED 0x0001 /* resource has been reserved */
>> +#define RF_ACTIVE 0x0002 /* resource allocation has been
>> activated */
>> +#define RF_SHAREABLE 0x0004 /* resource permits
>> contemporaneous sharing */
>> +#define RF_SPARE1 0x0008
>> +#define RF_SPARE2 0x0010
>> +#define RF_FIRSTSHARE 0x0020 /* first in sharing list */
>> +#define RF_PREFETCHABLE 0x0040 /* resource is prefetchable */
>> +#define RF_OPTIONAL 0x0080 /* for bus_alloc_resources() */
>> +#define RF_UNMAPPED 0x0100 /* don't map resource when
>> activating */
>> +
>> +struct resource {
>> + bus_space_tag_t r_bustag;
>> + bus_space_handle_t r_bushandle;/* bus_space handle */
>> +};
>> +
>> +#endif /* _FREEBSD_COMPAT_RMAN_H */
>> diff --git a/bsps/shared/rtems/freebsd-compat/bus.c
>> b/bsps/shared/rtems/freebsd-compat/bus.c
>> new file mode 100644
>> index 0000000000..7ce91b80e6
>> --- /dev/null
>> +++ b/bsps/shared/rtems/freebsd-compat/bus.c
>> @@ -0,0 +1,119 @@
>> +/* SPDX-License-Identifier: BSD-2-Clause */
>> +
>> +/**
>> + * @file
>> + *
>> + * @ingroup LIBFREEBSD
>> + *
>> + * @brief
>> + */
>> +
>> +/*
>> + * Copyright (C) <2020> Niteesh Babu <niteesh.gs at gmail.com>
>> + *
>> + * Redistribution and use in source and binary forms, with or without
>> + * modification, are permitted provided that the following conditions
>> + * are met:
>> + * 1. Redistributions of source code must retain the above copyright
>> + * notice, this list of conditions and the following disclaimer.
>> + * 2. Redistributions in binary form must reproduce the above copyright
>> + * notice, this list of conditions and the following disclaimer in the
>> + * documentation and/or other materials provided with the
>> distribution.
>> + *
>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
>> BE
>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>> IN
>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>> OTHERWISE)
>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>> OF THE
>> + * POSSIBILITY OF SUCH DAMAGE.
>> + */
>> +
>> +#include <rtems/bspIo.h>
>> +#include <libfdt.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <assert.h>
>> +#include <errno.h>
>> +#include <ofw/ofw.h>
>> +#include <rtems/freebsd-compat/bus.h>
>> +#include <rtems/freebsd-compat/resource.h>
>> +
>> +typedef unsigned int u_int;
>> +
>> +/**
>> + * @brief Return the device's softc field
>> + *
>> + * The softc is allocated and zeroed when a driver is attached, based
>> + * on the size field of the driver.
>> + */
>> +void *
>> +device_get_softc(device_t dev)
>> +{
>> +
>> + return (dev->softc);
>> +}
>> +
>> +bus_space_handle_t
>> +rman_get_bushandle(struct resource *r)
>> +{
>> +
>> + return (r->r_bushandle);
>> +}
>> +
>> +bus_space_tag_t
>> +rman_get_bustag(struct resource *r)
>> +{
>> +
>> + return (r->r_bustag);
>> +}
>> +
>> +int
>> +bus_alloc_resources(device_t dev, struct resource_spec *rs,
>> + struct resource **res)
>> +{
>> + int i;
>> +
>> + for (i = 0; rs[i].type != -1; i++) {
>> + res[i] = bus_alloc_resource_any(dev,
>> + rs[i].type, &rs[i].rid, rs[i].flags);
>> +
>> + if (res[i] == NULL) {
>> + return (-1);
>> + }
>> + }
>> + return (0);
>> +}
>> +
>> +struct resource *
>> +bus_alloc_resource(device_t dev, int type, int *rid, rman_res_t start,
>> + rman_res_t end, rman_res_t count, u_int flags)
>> +{
>> + int node;
>> + int rv;
>> + rtems_ofw_memory_area reg[*rid + 1];
>> + struct resource *res;
>> +
>> + node = dev->node;
>> +
>> + /*
>> + * We only support querying register values from FDT.
>> + */
>> + assert(type == SYS_RES_MEMORY);
>> +
>> + res = (struct resource *)malloc(sizeof(struct resource));
>> +
>> + if (res != NULL) {
>> + rv = rtems_ofw_get_reg(node, ®[0], sizeof(reg));
>> + if (rv == -1) {
>> + return NULL;
>> + }
>> + res->r_bushandle = reg[*rid].start;
>> + }
>> +
>> + return (res);
>> +}
>> diff --git a/spec/build/bsps/obj.yml b/spec/build/bsps/obj.yml
>> index 0ea07fc83d..7cf12cd27a 100644
>> --- a/spec/build/bsps/obj.yml
>> +++ b/spec/build/bsps/obj.yml
>> @@ -109,4 +109,5 @@ source:
>> - bsps/shared/start/bootcard.c
>> - bsps/shared/rtems-version.c
>> - bsps/shared/ofw/ofw.c
>> +- bsps/shared/rtems/freebsd-compat/bus.c
>> type: build
>> --
>> 2.17.1
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20210120/ac261191/attachment-0001.html>
More information about the devel
mailing list