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...@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...@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...@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...@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...@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@rtems.org http://lists.rtems.org/mailman/listinfo/devel