Skip to contentSkip to conversation

dm: SMEM (Shared memory) uclass

PATCH Superseded Ramon Fried 1 participant 6 messages Jun 26, 2018 Arm (32-bit)

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH v4 1/6 dm: SMEM (Shared memory) uclass

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.

---

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             | 83 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 137 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
drivers/Makefile +1 -0
index a213ea9671..ba4a561358 100644
@@ -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/
drivers/smem/Kconfig new file +2 -0
new file mode 100644
index 0000000000..64337a8b8e
@@ -0,0 +1,2 @@
+menuconfig SMEM
+	bool  "SMEM (Shared Memory mamanger) support"
drivers/smem/Makefile new file +5 -0
new file mode 100644
index 0000000000..ca55c4512d
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Makefile for the U-Boot SMEM interface drivers
+
+obj-$(CONFIG_SMEM) += smem-uclass.o
drivers/smem/smem-uclass.c new file +45 -0

45 lines not on this page · raw message

include/dm/uclass-id.h +1 -0
index d7f9df3583..a39643ec5e 100644
@@ -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 */
include/smem.h new file +83 -0

83 lines not on this page · raw message

Signature · 1 line
2.17.1
#1 lore raw

PATCH v4 2/6 soc: qualcomm: Add Shared Memory Manager driver

The Shared Memory Manager driver implements an interface for allocating and accessing items in the memory area shared among all of the processors in a Qualcomm platform.

Adapted from the Linux driver (4.17)

Changes from the original Linux driver:
* Removed HW spinlock mechanism, which is irrelevant
in U-boot particualar use case, which is just reading from the smem.
* Adapted from Linux driver model to U-Boot's.

Cc Bjorn Andersson <[email protected]>

---

Changes in v4: None
Changes in v3:
- Removed license, SPDX is enough.
- Text and grammar fixes.

Changes in v2:
- Applied checkpatch fixes (also sent these to Linux upstream)
- Changed UCLASS_SOC to UCLASS_SMEM
- Removed function exports and registered functionality through .ops

 MAINTAINERS             |   1 +
 arch/arm/Kconfig        |   2 +
 drivers/Kconfig         |   2 +
 drivers/smem/Kconfig    |  13 +
 drivers/smem/Makefile   |   1 +
 drivers/smem/msm_smem.c | 932 ++++++++++++++++++++++++++++++++++++++++
 6 files changed, 951 insertions(+)
 create mode 100644 drivers/smem/msm_smem.c
MAINTAINERS +1 -0
index b2c9717cb7..b691bae13c 100644
@@ -187,6 +187,7 @@ ARM SNAPDRAGON
 M:	Ramon Fried <[email protected]>
 S:	Maintained
 F:	arch/arm/mach-snapdragon/
+F:	drivers/smem/msm_smem.c
 
 ARM STI
 M:	Patrice Chotard <[email protected]>
arch/arm/Kconfig +2 -0
index 22234cde2a..badf4cacb8 100644
@@ -728,6 +728,8 @@ config ARCH_SNAPDRAGON
 	select SPMI
 	select OF_CONTROL
 	select OF_SEPARATE
+	select SMEM
+	select MSM_SMEM
 
 config ARCH_SOCFPGA
 	bool "Altera SOCFPGA family"
drivers/Kconfig +2 -0
index 9e21b28750..c72abf8932 100644
@@ -84,6 +84,8 @@ source "drivers/scsi/Kconfig"
 
 source "drivers/serial/Kconfig"
 
+source "drivers/smem/Kconfig"
+
 source "drivers/sound/Kconfig"
 
 source "drivers/spi/Kconfig"
drivers/smem/Kconfig +13 -0
index 64337a8b8e..6cf5a4e61e 100644
@@ -1,2 +1,15 @@
 menuconfig SMEM
 	bool  "SMEM (Shared Memory mamanger) support"
+
+if SMEM
+
+config MSM_SMEM
+    bool "Qualcomm Shared Memory Manager (SMEM)"
+    depends on DM
+    depends on ARCH_SNAPDRAGON
+    help
+      Enable support for the Qualcomm Shared Memory Manager.
+      The driver provides an interface to items in a heap shared among all
+      processors in a Qualcomm platform.
+
+endif # menu "SMEM Support"
drivers/smem/Makefile +1 -0
index ca55c4512d..605b8fc290 100644
@@ -3,3 +3,4 @@
 # Makefile for the U-Boot SMEM interface drivers
 
 obj-$(CONFIG_SMEM) += smem-uclass.o
+obj-$(CONFIG_MSM_SMEM) += msm_smem.o
drivers/smem/msm_smem.c new file +932 -0

932 lines not on this page · raw message

Signature · 1 line
2.17.1
#2 lore raw

PATCH v4 3/6 dts: db410c: added smem nodes

In reply to Ramon Fried

Added necessary nodes for Qualcomm smem driver.

---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/arm/dts/dragonboard410c-uboot.dtsi |  5 +++++
 arch/arm/dts/dragonboard410c.dts        | 16 ++++++++++++++++
 2 files changed, 21 insertions(+)
arch/arm/dts/dragonboard410c-uboot.dtsi +5 -0
index 50ac2e6584..773439ab93 100644
@@ -6,6 +6,11 @@
  */
 
 / {
+
+	smem {
+		u-boot,dm-pre-reloc;
+	};
+
 	soc {
 		u-boot,dm-pre-reloc;
 
arch/arm/dts/dragonboard410c.dts +16 -0
index 182a865b0a..f4f7c350ec 100644
@@ -27,18 +27,34 @@
 		#address-cells = <2>;
 		#size-cells = <2>;
 		ranges;
+
+		smem_mem: smem_region at 86300000 {
+			reg = <0x0 0x86300000 0x0 0x100000>;
+			no-map;
+		};
 	};
 
 	chosen {
 		stdout-path = "/soc/serial at 78b0000";
 	};
 
+	smem {
+		compatible = "qcom,smem";
+		memory-region = <&smem_mem>;
+		qcom,rpm-msg-ram = <&rpm_msg_ram>;
+	};
+
 	soc {
 		#address-cells = <0x1>;
 		#size-cells = <0x1>;
 		ranges = <0x0 0x0 0x0 0xffffffff>;
 		compatible = "simple-bus";
 
+		rpm_msg_ram: memory at 60000 {
+			compatible = "qcom,rpm-msg-ram";
+			reg = <0x60000 0x8000>;
+		};
+
 		pinctrl: qcom,tlmm at 1000000 {
 			compatible = "qcom,tlmm-apq8016";
 			reg = <0x1000000 0x400000>;
Signature · 1 line
2.17.1
#3 lore raw

PATCH v4 4/6 dts: db820c: added smem nodes

In reply to Ramon Fried

Added necessary nodes for Qualcomm smem driver.

---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/arm/dts/dragonboard820c-uboot.dtsi |  4 ++++
 arch/arm/dts/dragonboard820c.dts        | 16 ++++++++++++++++
 2 files changed, 20 insertions(+)
arch/arm/dts/dragonboard820c-uboot.dtsi +4 -0
index 97394cc5b0..d60aa04494 100644
@@ -6,6 +6,10 @@
  */
 
 / {
+	smem {
+		u-boot,dm-pre-reloc;
+	};
+
 	soc {
 		u-boot,dm-pre-reloc;
 
arch/arm/dts/dragonboard820c.dts +16 -0
index 7457d7b7e3..ffad8e0e0a 100644
@@ -28,11 +28,27 @@
 		reg = <0 0x80000000 0 0xc0000000>;
 	};
 
+	reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		smem_mem: smem_region at 86300000 {
+			reg = <0x0 0x86300000 0x0 0x200000>;
+			no-map;
+		};
+	};
+
 	psci {
 		compatible = "arm,psci-1.0";
 		method = "smc";
 	};
 
+	smem {
+		compatible = "qcom,smem";
+		memory-region = <&smem_mem>;
+	};
+
 	soc: soc {
 		#address-cells = <1>;
 		#size-cells = <1>;
Signature · 1 line
2.17.1
#4 lore raw

PATCH v4 5/6 drivers: smem: sandbox

In reply to Ramon Fried

Add Sandbox driver for SMEM. mostly stub operations.

---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/sandbox/dts/test.dts   |  4 ++++
 configs/sandbox64_defconfig |  2 ++
 configs/sandbox_defconfig   |  2 ++
 drivers/smem/Kconfig        |  9 ++++++++
 drivers/smem/Makefile       |  1 +
 drivers/smem/sandbox_smem.c | 45 +++++++++++++++++++++++++++++++++++++
 6 files changed, 63 insertions(+)
 create mode 100644 drivers/smem/sandbox_smem.c
arch/sandbox/dts/test.dts +4 -0
index 5752bf547e..01e6bc0367 100644
@@ -382,6 +382,10 @@
 		remoteproc-name = "remoteproc-test-dev2";
 	};
 
+	smem at 0 {
+		compatible = "sandbox,smem";
+	};
+
 	spi at 0 {
 		#address-cells = <1>;
 		#size-cells = <0>;
configs/sandbox64_defconfig +2 -0
index 20a2ab3ffb..1fa85a819c 100644
@@ -199,3 +199,5 @@ CONFIG_UT_TIME=y
 CONFIG_UT_DM=y
 CONFIG_UT_ENV=y
 CONFIG_UT_OVERLAY=y
+CONFIG_SMEM=y
+CONFIG_SANDBOX_SMEM=y
configs/sandbox_defconfig +2 -0
index 2fc84a16c9..47f6bfd87f 100644
@@ -200,3 +200,5 @@ CONFIG_UT_TIME=y
 CONFIG_UT_DM=y
 CONFIG_UT_ENV=y
 CONFIG_UT_OVERLAY=y
+CONFIG_SMEM=y
+CONFIG_SANDBOX_SMEM=y
drivers/smem/Kconfig +9 -0
index 6cf5a4e61e..7169d0f205 100644
@@ -3,6 +3,15 @@ menuconfig SMEM
 
 if SMEM
 
+config SANDBOX_SMEM
+    bool "Sandbox Shared Memory Manager (SMEM)"
+    depends on SANDBOX && DM
+    help
+      enable SMEM support for sandbox. This is an emulation of a real SMEM
+      manager.
+      The sandbox driver allocates a shared memory from the heap and
+      initialzies it on start.
+
 config MSM_SMEM
     bool "Qualcomm Shared Memory Manager (SMEM)"
     depends on DM
drivers/smem/Makefile +1 -0
index 605b8fc290..af3e9b5088 100644
@@ -2,5 +2,6 @@
 #
 # Makefile for the U-Boot SMEM interface drivers
 
+obj-$(CONFIG_SANDBOX_SMEM) += sandbox_smem.o
 obj-$(CONFIG_SMEM) += smem-uclass.o
 obj-$(CONFIG_MSM_SMEM) += msm_smem.o
drivers/smem/sandbox_smem.c new file +45 -0

45 lines not on this page · raw message

Signature · 1 line
2.17.1
#5 lore raw

PATCH v4 6/6 test: smem: add basic smem test

In reply to Ramon Fried

Add basic smem sandbox testing.

---
Tom, this patch depends on https://patchwork.ozlabs.org/patch/932965/

Changes in v4:
- Fixed typo in function name.

Changes in v3:
- Adapt to smem_get_free_space() new interface in series 3.

Changes in v2: None

 test/dm/Makefile |  1 +
 test/dm/smem.c   | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 test/dm/smem.c
test/dm/Makefile +1 -0
index 5511a85700..d2ed96c615 100644
@@ -33,6 +33,7 @@ obj-$(CONFIG_DM_RESET) += reset.o
 obj-$(CONFIG_SYSRESET) += sysreset.o
 obj-$(CONFIG_DM_RTC) += rtc.o
 obj-$(CONFIG_DM_SPI_FLASH) += sf.o
+obj-$(CONFIG_SMEM) += smem.o
 obj-$(CONFIG_DM_SPI) += spi.o
 obj-y += syscon.o
 obj-$(CONFIG_DM_USB) += usb.o
test/dm/smem.c new file +28 -0
new file mode 100644
index 0000000000..27a4f18839
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Ramon Fried <[email protected]>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <smem.h>
+#include <dm/test.h>
+#include <test/ut.h>
+
+/* Basic test of the smem uclass */
+static int dm_test_smem_base(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+	size_t size;
+	int space;
+
+	ut_assertok(uclass_get_device(UCLASS_SMEM, 0, &dev));
+	ut_assertnonnull(dev);
+	ut_assertok(smem_alloc(dev, -1, 0, 16));
+	ut_asserteq(0, smem_get_free_space(dev, -1));
+	ut_assertnull(smem_get(dev, -1, 0, &size));
+
+	return 0;
+}
+DM_TEST(dm_test_smem_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
Signature · 1 line
2.17.1