> On 22 Jun 2018, at 04:11, Ramon Fried <ramon.fr...@gmail.com> wrote:
> 
> This is a uclass for Shared memory manager drivers.
> 
> A Shared Memory Manager driver implements an interface for allocating
> and accessing items in the memory area shared among all of the
> processors.
> 
> Signed-off-by: Ramon Fried <ramon.fr...@gmail.com>

Reviewed-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com>

See below for a requested correction.

> 
> ---
> 
> Changes in v2:
> (As suggested by Simon Glass)
> - Introduced a new dm class (CLASS_SMEM) instead of CLASS_SOC.
> - Added sandbox driver
> - Added testing for DM class.
> 
> drivers/Makefile           |  1 +
> drivers/smem/Kconfig       |  2 +
> drivers/smem/Makefile      |  5 +++
> drivers/smem/smem-uclass.c | 53 ++++++++++++++++++++++++
> include/dm/uclass-id.h     |  1 +
> include/smem.h             | 84 ++++++++++++++++++++++++++++++++++++++
> 6 files changed, 146 insertions(+)
> create mode 100644 drivers/smem/Kconfig
> create mode 100644 drivers/smem/Makefile
> create mode 100644 drivers/smem/smem-uclass.c
> create mode 100644 include/smem.h
> 
> diff --git a/drivers/Makefile b/drivers/Makefile
> index a213ea9671..ba4a561358 100644
> --- a/drivers/Makefile
> +++ b/drivers/Makefile
> @@ -98,6 +98,7 @@ obj-y += pwm/
> obj-y += reset/
> obj-y += input/
> # SOC specific infrastructure drivers.
> +obj-y += smem/
> obj-y += soc/
> obj-$(CONFIG_REMOTEPROC) += remoteproc/
> obj-y += thermal/
> diff --git a/drivers/smem/Kconfig b/drivers/smem/Kconfig
> new file mode 100644
> index 0000000000..64337a8b8e
> --- /dev/null
> +++ b/drivers/smem/Kconfig
> @@ -0,0 +1,2 @@
> +menuconfig SMEM
> +     bool  "SMEM (Shared Memory mamanger) support"
> diff --git a/drivers/smem/Makefile b/drivers/smem/Makefile
> new file mode 100644
> index 0000000000..ca55c4512d
> --- /dev/null
> +++ b/drivers/smem/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Makefile for the U-Boot SMEM interface drivers
> +
> +obj-$(CONFIG_SMEM) += smem-uclass.o
> diff --git a/drivers/smem/smem-uclass.c b/drivers/smem/smem-uclass.c
> new file mode 100644
> index 0000000000..07ed1a92d8
> --- /dev/null
> +++ b/drivers/smem/smem-uclass.c
> @@ -0,0 +1,53 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2018 Ramon Fried <ramon.fr...@gmail.com>
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <smem.h>
> +
> +int smem_alloc(struct udevice *dev, unsigned int host,
> +             unsigned int item, size_t size)
> +{
> +     struct smem_ops *ops = smem_get_ops(dev);
> +
> +     if (!ops->alloc)
> +             return -ENOSYS;
> +
> +     return ops->alloc(host, item, size);
> +}
> +
> +void *smem_get(struct udevice *dev, unsigned int host,
> +             unsigned int item, size_t *size)
> +{
> +     struct smem_ops *ops = smem_get_ops(dev);
> +
> +     if (!ops->get)
> +             return NULL;
> +
> +     return ops->get(host, item, size);
> +}
> +
> +int smem_get_free_space(struct udevice *dev, unsigned int host, size_t *free)
> +{
> +     struct smem_ops *ops = smem_get_ops(dev);
> +
> +     int ret;
> +
> +     if (!ops->get_free_space)
> +             return -ENOSYS;
> +
> +     ret = ops->get_free_space(host);
> +     if (ret > 0)
> +             *free = ret;
> +     else
> +             return ret;
> +
> +     return 0;
> +}
> +
> +UCLASS_DRIVER(smem) = {
> +     .id     = UCLASS_SMEM,
> +     .name       = "smem",
> +};
> diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
> index d7f9df3583..a39643ec5e 100644
> --- a/include/dm/uclass-id.h
> +++ b/include/dm/uclass-id.h
> @@ -74,6 +74,7 @@ enum uclass_id {
>       UCLASS_RTC,             /* Real time clock device */
>       UCLASS_SCSI,            /* SCSI device */
>       UCLASS_SERIAL,          /* Serial UART */
> +     UCLASS_SMEM,            /* Shared memory interface */
>       UCLASS_SPI,             /* SPI bus */
>       UCLASS_SPMI,            /* System Power Management Interface bus */
>       UCLASS_SPI_FLASH,       /* SPI flash */
> diff --git a/include/smem.h b/include/smem.h
> new file mode 100644
> index 0000000000..201960232c
> --- /dev/null
> +++ b/include/smem.h
> @@ -0,0 +1,84 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * header file for smem driver.
> + *
> + * Copyright (c) 2018 Ramon Fried <ramon.fr...@gmail.com>
> + */
> +
> +#ifndef _smemh_
> +#define _smemh_
> +
> +/* struct smem_ops: Operations for the SMEM uclass */
> +struct smem_ops {
> +     /**
> +      * alloc() - allocate space for a smem item
> +      *
> +      * @host:       remote processor id, or -1
> +      * @item:       smem item handle
> +      * @size:       number of bytes to be allocated
> +      * @return 0 if OK, -ve on error
> +      */
> +     int (*alloc)(unsigned int host,
> +             unsigned int item, size_t size);
> +
> +     /**
> +      * get() - Resolve ptr of size of a smem item
> +      *
> +      * @host:       the remote processor, of -1
> +      * @item:       smem item handle
> +      * @size:       pointer to be filled out with the size of the item
> +      * @return      pointer on success, NULL on error
> +      */
> +     void *(*get)(unsigned int host,
> +             unsigned int item, size_t *size);
> +
> +     /**
> +      * get_free_space() - Set the PWM invert

The “Set the PWM invert” part seems like a mistake here...

> +      *
> +      * @host:   the remote processor identifying a partition, or -1
> +      * @return      free space, -ve on error
> +      */
> +     int (*get_free_space)(unsigned int host);
> +};
> +
> +#define smem_get_ops(dev)    ((struct smem_ops *)(dev)->driver->ops)
> +
> +/**
> + * smem_alloc() - allocate space for a smem item
> + * @host:    remote processor id, or -1
> + * @item:    smem item handle
> + * @size:    number of bytes to be allocated
> + * @return 0 if OK, -ve on error
> + *
> + * Allocate space for a given smem item of size @size, given that the item is
> + * not yet allocated.
> + */
> +int smem_alloc(struct udevice *dev, unsigned int host,
> +             unsigned int item, size_t size);
> +
> +/**
> + * smem_get() - resolve ptr of size of a smem item
> + * @host:    the remote processor, or -1
> + * @item:    smem item handle
> + * @size:    pointer to be filled out with size of the item
> + * @return   pointer on success, NULL on error
> + *
> + * Looks up smem item and returns pointer to it. Size of smem
> + * item is returned in @size.
> + */
> +void *smem_get(struct udevice *dev, unsigned int host,
> +             unsigned int item, size_t *size);
> +
> +/**
> + * smem_get_free_space() - retrieve amount of free space in a partition
> + * @host:    the remote processor identifying a partition, or -1
> + * @free_space:      pointer to be filled out with free space
> + * @return   0 if OK, -ve on error
> + *
> + * To be used by smem clients as a quick way to determine if any new
> + * allocations has been made.
> + */
> +int smem_get_free_space(struct udevice *dev, unsigned int host, size_t 
> *free_space);
> +
> +#endif /* _smem_h_ */
> +
> --
> 2.17.1
> 

Attachment: signature.asc
Description: Message signed with OpenPGP

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to