All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v5 1/6] dm: SMEM (Shared memory) uclass
@ 2018-07-01 23:57 Ramon Fried
  2018-07-01 23:57 ` [U-Boot] [PATCH v5 2/6] soc: qualcomm: Add Shared Memory Manager driver Ramon Fried
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Ramon Fried @ 2018-07-01 23:57 UTC (permalink / raw)
  To: u-boot

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.fried@gmail.com>

Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

---

Changes in v5:
(As suggested by Simon Glass)
- Add more documentation to smem.h describing item/host parameters.

Changes in v4: None
Changes in v3:
(As suggested by Simon Glass)
- Fixed line wrap
- Fixed smem_get_free_space() interface to match smem_get_free_space()
- Added more documentation to ops.

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 | 45 +++++++++++++++++++
 include/dm/uclass-id.h     |  1 +
 include/smem.h             | 91 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 145 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..ce7bf40656
--- /dev/null
+++ b/drivers/smem/smem-uclass.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2018 Ramon Fried <ramon.fried@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)
+{
+	struct smem_ops *ops = smem_get_ops(dev);
+
+	if (!ops->get_free_space)
+		return -ENOSYS;
+
+	return ops->get_free_space(host);
+}
+
+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..598799d3a0
--- /dev/null
+++ b/include/smem.h
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * The shared memory system is an allocate-only heap structure that
+ * consists of one of more memory areas that can be accessed by the processors
+ * in the SoC.
+ *
+ * Allocation can be done globally for all processors or to an individual processor.
+ * This is controlled by the @host parameter.
+ *
+ * Allocation and management of heap can be implemented in various ways,
+ * The @item parameter should be used as an index/hash to the memory region.
+ *
+ * Copyright (c) 2018 Ramon Fried <ramon.fried@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 for all processors.
+	 * @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 for all processors.
+	 * @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() - Get free space in smem in bytes
+	 *
+	 * @host:   the remote processor identifying a partition, or -1
+	 *			for all processors.
+	 * @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 for all processors.
+ * @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
+ *			for all processors.
+ * @return	size in bytes, -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);
+
+#endif /* _smem_h_ */
+
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2018-07-20 12:36 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-01 23:57 [U-Boot] [PATCH v5 1/6] dm: SMEM (Shared memory) uclass Ramon Fried
2018-07-01 23:57 ` [U-Boot] [PATCH v5 2/6] soc: qualcomm: Add Shared Memory Manager driver Ramon Fried
2018-07-09  2:35   ` Simon Glass
2018-07-20 12:36   ` [U-Boot] [U-Boot, v5, " Tom Rini
2018-07-01 23:57 ` [U-Boot] [PATCH v5 3/6] dts: db410c: added smem nodes Ramon Fried
2018-07-20 12:36   ` [U-Boot] [U-Boot,v5,3/6] " Tom Rini
2018-07-01 23:57 ` [U-Boot] [PATCH v5 4/6] dts: db820c: " Ramon Fried
2018-07-20 12:36   ` [U-Boot] [U-Boot,v5,4/6] " Tom Rini
2018-07-01 23:57 ` [U-Boot] [PATCH v5 5/6] drivers: smem: sandbox Ramon Fried
2018-07-09  2:35   ` Simon Glass
2018-07-20 12:36   ` [U-Boot] [U-Boot,v5,5/6] " Tom Rini
2018-07-01 23:58 ` [U-Boot] [PATCH v5 6/6] test: smem: add basic smem test Ramon Fried
2018-07-09  2:35   ` Simon Glass
2018-07-20 12:36   ` [U-Boot] [U-Boot,v5,6/6] " Tom Rini
2018-07-20 12:36 ` [U-Boot] [U-Boot,v5,1/6] dm: SMEM (Shared memory) uclass Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.