On June 26, 2018 9:39:55 AM GMT+03:00, "Dr. Philipp Tomsich" <[email protected]> wrote: > >> On 22 Jun 2018, at 04:11, Ramon Fried <[email protected]> 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 <[email protected]> > >Reviewed-by: Philipp Tomsich <[email protected]> > >See below for a requested correction. > >> Thanks. Nice catch... >> --- >> >> 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 <[email protected]> >> + */ >> + >> +#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 <[email protected]> >> + */ >> + >> +#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 >>
-- Sent from my Android device with K-9 Mail. Please excuse my brevity. _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

