[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT PATCH v3 1/2] lib/ukbus: Introduce abstraction for device buses



Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>

Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:

> From: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
>
> This library creates infrastructure to support different
> devices buses within Unikraft. It provides a generic
> interface for operating registered device bus implementation.
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
> ---
>  lib/Config.uk              |   1 +
>  lib/Makefile.uk            |   1 +
>  lib/ukboot/boot.c          |  10 ++++
>  lib/ukbus/Config.uk        |   8 +++
>  lib/ukbus/Makefile.uk      |   6 ++
>  lib/ukbus/bus.c            |  88 +++++++++++++++++++++++++++++
>  lib/ukbus/export.syms      |   5 ++
>  lib/ukbus/include/uk/bus.h | 137 
> +++++++++++++++++++++++++++++++++++++++++++++
>  8 files changed, 256 insertions(+)
>  create mode 100644 lib/ukbus/Config.uk
>  create mode 100644 lib/ukbus/Makefile.uk
>  create mode 100644 lib/ukbus/bus.c
>  create mode 100644 lib/ukbus/export.syms
>  create mode 100644 lib/ukbus/include/uk/bus.h
>
> diff --git a/lib/Config.uk b/lib/Config.uk
> index 2f47fde..e438603 100644
> --- a/lib/Config.uk
> +++ b/lib/Config.uk
> @@ -36,3 +36,4 @@ source "lib/fdt/Config.uk"
>  source "lib/uklock/Config.uk"
>  source "lib/ukmpi/Config.uk"
>  source "lib/ukswrand/Config.uk"
> +source "lib/ukbus/Config.uk"
> diff --git a/lib/Makefile.uk b/lib/Makefile.uk
> index a632336..40c65d0 100644
> --- a/lib/Makefile.uk
> +++ b/lib/Makefile.uk
> @@ -18,3 +18,4 @@ $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/fdt))
>  $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/vfscore))
>  $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/uklock))
>  $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukmpi))
> +$(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukbus))
> diff --git a/lib/ukboot/boot.c b/lib/ukboot/boot.c
> index 807931e..d7214fe 100644
> --- a/lib/ukboot/boot.c
> +++ b/lib/ukboot/boot.c
> @@ -56,6 +56,9 @@
>  #include <uk/essentials.h>
>  #include <uk/print.h>
>  #include <uk/argparse.h>
> +#if CONFIG_LIBUKBUS
> +#include <uk/bus.h>
> +#endif /* CONFIG_LIBUKBUS */
>  
>  int main(int argc, char *argv[]) __weak;
>  #ifdef CONFIG_LIBLWIP
> @@ -83,6 +86,13 @@ static void main_thread_func(void *arg)
>       }
>       uk_printd(DLVL_INFO, "])\n");
>  
> +#ifdef CONFIG_LIBUKBUS
> +     uk_printd(DLVL_INFO, "Initialize bus handlers...\n");
> +     uk_bus_init_all(uk_alloc_get_default());
> +     uk_printd(DLVL_INFO, "Probe buses...\n");
> +     uk_bus_probe_all();
> +#endif /* CONFIG_LIBUKBUS */
> +
>  #ifdef CONFIG_LIBLWIP
>       /*
>        * TODO: This is an initial implementation where we call the
> diff --git a/lib/ukbus/Config.uk b/lib/ukbus/Config.uk
> new file mode 100644
> index 0000000..49f20c4
> --- /dev/null
> +++ b/lib/ukbus/Config.uk
> @@ -0,0 +1,8 @@
> +menuconfig LIBUKBUS
> +     bool "ukbus: Abstraction for device buses"
> +     default n
> +     select LIBUKDEBUG
> +     select LIBUKALLOC
> +
> +if LIBUKBUS
> +endif
> diff --git a/lib/ukbus/Makefile.uk b/lib/ukbus/Makefile.uk
> new file mode 100644
> index 0000000..b4f0d79
> --- /dev/null
> +++ b/lib/ukbus/Makefile.uk
> @@ -0,0 +1,6 @@
> +$(eval $(call addlib_s,libukbus,$(CONFIG_LIBUKBUS)))
> +
> +CINCLUDES-$(CONFIG_LIBUKBUS)         += -I$(LIBUKBUS_BASE)/include
> +CXXINCLUDES-$(CONFIG_LIBUKBUS)               += -I$(LIBUKBUS_BASE)/include
> +
> +LIBUKBUS_SRCS-$(CONFIG_LIBUKBUS) += $(LIBUKBUS_BASE)/bus.c
> diff --git a/lib/ukbus/bus.c b/lib/ukbus/bus.c
> new file mode 100644
> index 0000000..4d8f343
> --- /dev/null
> +++ b/lib/ukbus/bus.c
> @@ -0,0 +1,88 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved.
> + *
> + * 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.
> + * 3. Neither the name of the copyright holder nor the names of its
> + *    contributors may be used to endorse or promote products derived from
> + *    this software without specific prior written permission.
> + *
> + * 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 HOLDER 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.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#include <uk/bus.h>
> +#include <uk/assert.h>
> +#include <uk/print.h>
> +
> +struct uk_bus_list uk_bus_list;
> +static unsigned int bus_count;
> +
> +void _uk_bus_register(struct uk_bus *b)
> +{
> +     UK_ASSERT(b != NULL);
> +     UK_ASSERT(b->probe != NULL);
> +
> +     if (bus_count == 0)
> +             UK_TAILQ_INIT(&uk_bus_list);
> +
> +     uk_printd(DLVL_EXTRA, "Register bus handler: %p\n", b);
> +     UK_TAILQ_INSERT_TAIL(&uk_bus_list, b, next);
> +     ++bus_count;
> +}
> +
> +void _uk_bus_unregister(struct uk_bus *b)
> +{
> +     UK_ASSERT(b != NULL);
> +     UK_ASSERT(bus_count > 0);
> +
> +     uk_printd(DLVL_EXTRA, "Unregister bus handler: %p\n", b);
> +     UK_TAILQ_REMOVE(&uk_bus_list, b, next);
> +     bus_count--;
> +}
> +
> +unsigned int uk_bus_count(void)
> +{
> +     return bus_count;
> +}
> +
> +int uk_bus_init(struct uk_bus *b, struct uk_alloc *a)
> +{
> +     UK_ASSERT(b != NULL);
> +
> +     uk_printd(DLVL_EXTRA, "Initialize bus handler %p...\n", b);
> +     if (!b->init)
> +             return 0;
> +     return b->init(a);
> +}
> +
> +
> +int uk_bus_probe(struct uk_bus *b)
> +{
> +     UK_ASSERT(b != NULL);
> +     UK_ASSERT(b->probe != NULL);
> +
> +     uk_printd(DLVL_EXTRA, "Probe bus %p...\n", b);
> +     return b->probe();
> +}
> diff --git a/lib/ukbus/export.syms b/lib/ukbus/export.syms
> new file mode 100644
> index 0000000..db4476d
> --- /dev/null
> +++ b/lib/ukbus/export.syms
> @@ -0,0 +1,5 @@
> +uk_bus_count
> +uk_bus_init
> +uk_bus_probe
> +_uk_bus_register
> +_uk_bus_unregister
> diff --git a/lib/ukbus/include/uk/bus.h b/lib/ukbus/include/uk/bus.h
> new file mode 100644
> index 0000000..57668e4
> --- /dev/null
> +++ b/lib/ukbus/include/uk/bus.h
> @@ -0,0 +1,137 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved.
> + *
> + * 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.
> + * 3. Neither the name of the copyright holder nor the names of its
> + *    contributors may be used to endorse or promote products derived from
> + *    this software without specific prior written permission.
> + *
> + * 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 HOLDER 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.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#ifndef __UK_BUS__
> +#define __UK_BUS__
> +
> +#include <stddef.h>
> +#include <uk/list.h>
> +#include <uk/alloc.h>
> +#include <uk/plat/ctors.h>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +struct uk_bus;
> +UK_TAILQ_HEAD(uk_bus_list, struct uk_bus);
> +extern struct uk_bus_list uk_bus_list;
> +
> +typedef int (*uk_bus_init_func_t)(struct uk_alloc *a);
> +typedef int (*uk_bus_probe_func_t)(void);
> +
> +struct uk_bus {
> +     UK_TAILQ_ENTRY(struct uk_bus) next;
> +     uk_bus_init_func_t init; /**< Initialize bus handler (optional) */
> +     uk_bus_probe_func_t probe; /**< Probe for devices attached to the bus */
> +};
> +
> +#define UK_BUS_LIST_FOREACH(b)                       \
> +     UK_TAILQ_FOREACH(b, &uk_bus_list, next)
> +
> +#define UK_BUS_LIST_FOREACH_SAFE(b, b_next)  \
> +     UK_TAILQ_FOREACH_SAFE(b, &uk_bus_list, next, b_next)
> +
> +/* Returns the number of registered buses */
> +unsigned int uk_bus_count(void);
> +
> +/* Do not use this function directly: */
> +void _uk_bus_register(struct uk_bus *b);
> +/* Do not use this function directly: */
> +void _uk_bus_unregister(struct uk_bus *b);
> +
> +/* Initializes a bus driver */
> +int uk_bus_init(struct uk_bus *b, struct uk_alloc *a);
> +
> +/* Scan for devices on the bus */
> +int uk_bus_probe(struct uk_bus *b);
> +
> +/* Returns the number of successfully initialized device buses */
> +static inline unsigned int uk_bus_init_all(struct uk_alloc *a)
> +{
> +     struct uk_bus *b, *b_next;
> +     unsigned int ret = 0;
> +     int status = 0;
> +
> +     if (uk_bus_count() == 0)
> +             return 0;
> +
> +     UK_BUS_LIST_FOREACH_SAFE(b, b_next) {
> +             if ((status = uk_bus_init(b, a)) >= 0) {
> +                     ++ret;
> +             } else {
> +                     uk_printd(DLVL_ERR, "Failed to initialize bus driver 
> %p: %d\n",
> +                               b, status);
> +
> +                     /* Remove the failed driver from the list */
> +                     _uk_bus_unregister(b);
> +             }
> +     }
> +     return ret;
> +}
> +
> +/* Returns the number of successfully probed device buses */
> +static inline unsigned int uk_bus_probe_all(void)
> +{
> +     struct uk_bus *b;
> +     unsigned int ret = 0;
> +
> +     if (uk_bus_count() == 0)
> +             return 0;
> +
> +     UK_BUS_LIST_FOREACH(b) {
> +             if (uk_bus_probe(b) >= 0)
> +                     ++ret;
> +     }
> +     return ret;
> +}
> +
> +/* registers a bus driver to the bus system */
> +#define UK_BUS_REGISTER(b) \
> +     _UK_BUS_REGISTER(__LIBNAME__, b)
> +
> +#define _UK_BUS_REGFNNAME(x, y)      x##y
> +
> +#define _UK_BUS_REGISTER(libname, b)                         \
> +     static void __constructor_prio(102)                     \
> +     _UK_BUS_REGFNNAME(libname, _uk_bus_register)(void)      \
> +     {                                                       \
> +             _uk_bus_register((b));                          \
> +     }
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __UK_BUS__ */
> -- 
> 2.7.4
>

-- 
Yuri Volchkov
Software Specialist

NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.