linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers
@ 2016-08-27 13:43 Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 1/6] firmware: Amlogic: Add secure monitor driver Carlo Caione
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

I decided to respin again the secure monitor driver this time with the NVMEM
driver in the same patchset to have a clear view on how a generic driver can
use the monitor.

The latest patchset for the secure monitor with the Changelog is here [1].

[1] http://www.spinics.net/lists/arm-kernel/msg510441.html

Changelog:
v3:
  - Add missing ACKs
  - s/0x1000/SZ_4K/
v2:
  - nvmem driver not using regmap anymore
  - headers list cleanup
  - disable sm driver for !4K kernels
  - removed meson_sm_get_fw()
  - better debug printing
  - general cleanup  

Carlo Caione (6):
  firmware: Amlogic: Add secure monitor driver
  documentation: Add secure monitor bindings documentation
  ARM64: dts: amlogic: gxbb: Enable secure monitor
  nvmem: amlogic: Add Amlogic Meson EFUSE driver
  documentation: Add nvmem bindings documentation
  ARM64: dts: amlogic: gxbb: Enable NVMEM

 .../bindings/firmware/meson/meson_sm.txt           |  15 ++
 .../devicetree/bindings/nvmem/amlogic-efuse.txt    |  39 ++++
 arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi        |  24 ++
 drivers/firmware/Kconfig                           |   1 +
 drivers/firmware/Makefile                          |   1 +
 drivers/firmware/meson/Kconfig                     |   9 +
 drivers/firmware/meson/Makefile                    |   1 +
 drivers/firmware/meson/meson_sm.c                  | 248 +++++++++++++++++++++
 drivers/nvmem/Kconfig                              |  10 +
 drivers/nvmem/Makefile                             |   2 +
 drivers/nvmem/meson-efuse.c                        |  93 ++++++++
 include/linux/firmware/meson/meson_sm.h            |  31 +++
 12 files changed, 474 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt
 create mode 100644 Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt
 create mode 100644 drivers/firmware/meson/Kconfig
 create mode 100644 drivers/firmware/meson/Makefile
 create mode 100644 drivers/firmware/meson/meson_sm.c
 create mode 100644 drivers/nvmem/meson-efuse.c
 create mode 100644 include/linux/firmware/meson/meson_sm.h

-- 
2.7.4

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

* [PATCH v3 1/6] firmware: Amlogic: Add secure monitor driver
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 2/6] documentation: Add secure monitor bindings documentation Carlo Caione
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

Introduce a driver to provide calls into secure monitor mode.

In the Amlogic SoCs these calls are used for multiple reasons: access to
NVMEM, set USB boot, enable JTAG, etc...

Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 drivers/firmware/Kconfig                |   1 +
 drivers/firmware/Makefile               |   1 +
 drivers/firmware/meson/Kconfig          |   9 ++
 drivers/firmware/meson/Makefile         |   1 +
 drivers/firmware/meson/meson_sm.c       | 247 ++++++++++++++++++++++++++++++++
 include/linux/firmware/meson/meson_sm.h |  31 ++++
 6 files changed, 290 insertions(+)
 create mode 100644 drivers/firmware/meson/Kconfig
 create mode 100644 drivers/firmware/meson/Makefile
 create mode 100644 drivers/firmware/meson/meson_sm.c
 create mode 100644 include/linux/firmware/meson/meson_sm.h

diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index 0e22f24..bca172d 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -209,5 +209,6 @@ config HAVE_ARM_SMCCC
 source "drivers/firmware/broadcom/Kconfig"
 source "drivers/firmware/google/Kconfig"
 source "drivers/firmware/efi/Kconfig"
+source "drivers/firmware/meson/Kconfig"
 
 endmenu
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile
index 44a59dc..898ac41 100644
--- a/drivers/firmware/Makefile
+++ b/drivers/firmware/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_QCOM_SCM_32)	+= qcom_scm-32.o
 CFLAGS_qcom_scm-32.o :=$(call as-instr,.arch armv7-a\n.arch_extension sec,-DREQUIRES_SEC=1) -march=armv7-a
 
 obj-y				+= broadcom/
+obj-y				+= meson/
 obj-$(CONFIG_GOOGLE_FIRMWARE)	+= google/
 obj-$(CONFIG_EFI)		+= efi/
 obj-$(CONFIG_UEFI_CPER)		+= efi/
diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig
new file mode 100644
index 0000000..170d7e8
--- /dev/null
+++ b/drivers/firmware/meson/Kconfig
@@ -0,0 +1,9 @@
+#
+# Amlogic Secure Monitor driver
+#
+config MESON_SM
+	bool
+	default ARCH_MESON
+	depends on ARM64_4K_PAGES
+	help
+	  Say y here to enable the Amlogic secure monitor driver
diff --git a/drivers/firmware/meson/Makefile b/drivers/firmware/meson/Makefile
new file mode 100644
index 0000000..9ab3884
--- /dev/null
+++ b/drivers/firmware/meson/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_MESON_SM) +=	meson_sm.o
diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
new file mode 100644
index 0000000..bba594e
--- /dev/null
+++ b/drivers/firmware/meson/meson_sm.c
@@ -0,0 +1,247 @@
+/*
+ * Amlogic Secure Monitor driver
+ *
+ * Copyright (C) 2016 Endless Mobile, Inc.
+ * Author: Carlo Caione <carlo@endlessm.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define pr_fmt(fmt) "meson-sm: " fmt
+
+#include <linux/arm-smccc.h>
+#include <linux/bug.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/printk.h>
+#include <linux/types.h>
+
+#include <linux/firmware/meson/meson_sm.h>
+
+struct meson_sm_cmd {
+	unsigned int index;
+	u32 smc_id;
+};
+#define CMD(d, s) { .index = (d), .smc_id = (s), }
+
+struct meson_sm_chip {
+	unsigned int shmem_size;
+	u32 cmd_shmem_in_base;
+	u32 cmd_shmem_out_base;
+	struct meson_sm_cmd cmd[];
+};
+
+struct meson_sm_chip gxbb_chip = {
+	.shmem_size		= 0x1000,
+	.cmd_shmem_in_base	= 0x82000020,
+	.cmd_shmem_out_base	= 0x82000021,
+	.cmd = {
+		CMD(SM_EFUSE_READ,	0x82000030),
+		CMD(SM_EFUSE_WRITE,	0x82000031),
+		CMD(SM_EFUSE_USER_MAX,	0x82000033),
+		{ /* sentinel */ },
+	},
+};
+
+struct meson_sm_firmware {
+	const struct meson_sm_chip *chip;
+	void __iomem *sm_shmem_in_base;
+	void __iomem *sm_shmem_out_base;
+};
+
+static struct meson_sm_firmware fw;
+
+static u32 meson_sm_get_cmd(const struct meson_sm_chip *chip,
+			    unsigned int cmd_index)
+{
+	const struct meson_sm_cmd *cmd = chip->cmd;
+
+	while (cmd->smc_id && cmd->index != cmd_index)
+		cmd++;
+
+	return cmd->smc_id;
+}
+
+static u32 __meson_sm_call(u32 cmd, u32 arg0, u32 arg1, u32 arg2,
+			   u32 arg3, u32 arg4)
+{
+	struct arm_smccc_res res;
+
+	arm_smccc_smc(cmd, arg0, arg1, arg2, arg3, arg4, 0, 0, &res);
+	return res.a0;
+}
+
+static void __iomem *meson_sm_map_shmem(u32 cmd_shmem, unsigned int size)
+{
+	u32 sm_phy_base;
+
+	sm_phy_base = __meson_sm_call(cmd_shmem, 0, 0, 0, 0, 0);
+	if (!sm_phy_base)
+		return 0;
+
+	return ioremap_cache(sm_phy_base, size);
+}
+
+/**
+ * meson_sm_call - generic SMC32 call to the secure-monitor
+ *
+ * @cmd_index:	Index of the SMC32 function ID
+ * @ret:	Returned value
+ * @arg0:	SMC32 Argument 0
+ * @arg1:	SMC32 Argument 1
+ * @arg2:	SMC32 Argument 2
+ * @arg3:	SMC32 Argument 3
+ * @arg4:	SMC32 Argument 4
+ *
+ * Return:	0 on success, a negative value on error
+ */
+int meson_sm_call(unsigned int cmd_index, u32 *ret, u32 arg0,
+		  u32 arg1, u32 arg2, u32 arg3, u32 arg4)
+{
+	u32 cmd, lret;
+
+	if (!fw.chip)
+		return -ENOENT;
+
+	cmd = meson_sm_get_cmd(fw.chip, cmd_index);
+	if (!cmd)
+		return -EINVAL;
+
+	lret = __meson_sm_call(cmd, arg0, arg1, arg2, arg3, arg4);
+
+	if (ret)
+		*ret = lret;
+
+	return 0;
+}
+EXPORT_SYMBOL(meson_sm_call);
+
+/**
+ * meson_sm_call_read - retrieve data from secure-monitor
+ *
+ * @buffer:	Buffer to store the retrieved data
+ * @cmd_index:	Index of the SMC32 function ID
+ * @arg0:	SMC32 Argument 0
+ * @arg1:	SMC32 Argument 1
+ * @arg2:	SMC32 Argument 2
+ * @arg3:	SMC32 Argument 3
+ * @arg4:	SMC32 Argument 4
+ *
+ * Return:	size of read data on success, a negative value on error
+ */
+int meson_sm_call_read(void *buffer, unsigned int cmd_index, u32 arg0,
+		       u32 arg1, u32 arg2, u32 arg3, u32 arg4)
+{
+	u32 size;
+
+	if (!fw.chip)
+		return -ENOENT;
+
+	if (!fw.chip->cmd_shmem_out_base)
+		return -EINVAL;
+
+	if (meson_sm_call(cmd_index, &size, arg0, arg1, arg2, arg3, arg4) < 0)
+		return -EINVAL;
+
+	if (!size || size > fw.chip->shmem_size)
+		return -EINVAL;
+
+	if (buffer)
+		memcpy(buffer, fw.sm_shmem_out_base, size);
+
+	return size;
+}
+EXPORT_SYMBOL(meson_sm_call_read);
+
+/**
+ * meson_sm_call_write - send data to secure-monitor
+ *
+ * @buffer:	Buffer containing data to send
+ * @size:	Size of the data to send
+ * @cmd_index:	Index of the SMC32 function ID
+ * @arg0:	SMC32 Argument 0
+ * @arg1:	SMC32 Argument 1
+ * @arg2:	SMC32 Argument 2
+ * @arg3:	SMC32 Argument 3
+ * @arg4:	SMC32 Argument 4
+ *
+ * Return:	size of sent data on success, a negative value on error
+ */
+int meson_sm_call_write(void *buffer, unsigned int size, unsigned int cmd_index,
+			u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4)
+{
+	u32 written;
+
+	if (!fw.chip)
+		return -ENOENT;
+
+	if (size > fw.chip->shmem_size)
+		return -EINVAL;
+
+	if (!fw.chip->cmd_shmem_in_base)
+		return -EINVAL;
+
+	memcpy(fw.sm_shmem_in_base, buffer, size);
+
+	if (meson_sm_call(cmd_index, &written, arg0, arg1, arg2, arg3, arg4) < 0)
+		return -EINVAL;
+
+	if (!written)
+		return -EINVAL;
+
+	return written;
+}
+EXPORT_SYMBOL(meson_sm_call_write);
+
+static const struct of_device_id meson_sm_ids[] = {
+	{ .compatible = "amlogic,meson-gxbb-sm", .data = &gxbb_chip },
+	{ /* sentinel */ },
+};
+
+int __init meson_sm_init(void)
+{
+	const struct meson_sm_chip *chip;
+	const struct of_device_id *matched_np;
+	struct device_node *np;
+
+	np = of_find_matching_node_and_match(NULL, meson_sm_ids, &matched_np);
+	if (!np)
+		return -ENODEV;
+
+	chip = matched_np->data;
+	if (!chip) {
+		pr_err("unable to setup secure-monitor data\n");
+		goto out;
+	}
+
+	if (chip->cmd_shmem_in_base) {
+		fw.sm_shmem_in_base = meson_sm_map_shmem(chip->cmd_shmem_in_base,
+							 chip->shmem_size);
+		if (WARN_ON(!fw.sm_shmem_in_base))
+			goto out;
+	}
+
+	if (chip->cmd_shmem_out_base) {
+		fw.sm_shmem_out_base = meson_sm_map_shmem(chip->cmd_shmem_out_base,
+							  chip->shmem_size);
+		if (WARN_ON(!fw.sm_shmem_out_base))
+			goto out_in_base;
+	}
+
+	fw.chip = chip;
+	pr_info("secure-monitor enabled\n");
+
+	return 0;
+
+out_in_base:
+	iounmap(fw.sm_shmem_in_base);
+out:
+	return -EINVAL;
+}
+device_initcall(meson_sm_init);
diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h
new file mode 100644
index 0000000..8e953c6
--- /dev/null
+++ b/include/linux/firmware/meson/meson_sm.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 Endless Mobile, Inc.
+ * Author: Carlo Caione <carlo@endlessm.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _MESON_SM_FW_H_
+#define _MESON_SM_FW_H_
+
+enum {
+	SM_EFUSE_READ,
+	SM_EFUSE_WRITE,
+	SM_EFUSE_USER_MAX,
+};
+
+struct meson_sm_firmware;
+
+int meson_sm_call(unsigned int cmd_index, u32 *ret, u32 arg0, u32 arg1,
+		  u32 arg2, u32 arg3, u32 arg4);
+int meson_sm_call_write(void *buffer, unsigned int b_size, unsigned int cmd_index,
+			u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4);
+int meson_sm_call_read(void *buffer, unsigned int cmd_index, u32 arg0, u32 arg1,
+		       u32 arg2, u32 arg3, u32 arg4);
+
+#endif /* _MESON_SM_FW_H_ */
-- 
2.7.4

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

* [PATCH v3 2/6] documentation: Add secure monitor bindings documentation
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 1/6] firmware: Amlogic: Add secure monitor driver Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 3/6] ARM64: dts: amlogic: gxbb: Enable secure monitor Carlo Caione
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

Add the binding documentation for the Amlogic secure monitor driver.

Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 .../devicetree/bindings/firmware/meson/meson_sm.txt       | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt

diff --git a/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt b/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt
new file mode 100644
index 0000000..c248cd4
--- /dev/null
+++ b/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt
@@ -0,0 +1,15 @@
+* Amlogic Secure Monitor
+
+In the Amlogic SoCs the Secure Monitor code is used to provide access to the
+NVMEM, enable JTAG, set USB boot, etc...
+
+Required properties for the secure monitor node:
+- compatible: Should be "amlogic,meson-gxbb-sm"
+
+Example:
+
+	firmware {
+		sm: secure-monitor {
+			compatible = "amlogic,meson-gxbb-sm";
+		};
+	};
-- 
2.7.4

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

* [PATCH v3 3/6] ARM64: dts: amlogic: gxbb: Enable secure monitor
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 1/6] firmware: Amlogic: Add secure monitor driver Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 2/6] documentation: Add secure monitor bindings documentation Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 4/6] nvmem: amlogic: Add Amlogic Meson EFUSE driver Carlo Caione
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

Add the secure monitor node in the Amlogic Meson GXBB DTSI file to
enable it.

Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
index e502c24..ca428e8 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
@@ -99,6 +99,12 @@
 		method = "smc";
 	};
 
+	firmware {
+		sm: secure-monitor {
+			compatible = "amlogic,meson-gxbb-sm";
+		};
+	};
+
 	timer {
 		compatible = "arm,armv8-timer";
 		interrupts = <GIC_PPI 13
-- 
2.7.4

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

* [PATCH v3 4/6] nvmem: amlogic: Add Amlogic Meson EFUSE driver
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
                   ` (2 preceding siblings ...)
  2016-08-27 13:43 ` [PATCH v3 3/6] ARM64: dts: amlogic: gxbb: Enable secure monitor Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 5/6] documentation: Add nvmem bindings documentation Carlo Caione
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

Add Amlogic EFUSE driver to access hardware data like ethernet address,
serial number or IDs.

Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 drivers/nvmem/Kconfig       | 10 +++++
 drivers/nvmem/Makefile      |  2 +
 drivers/nvmem/meson-efuse.c | 93 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+)
 create mode 100644 drivers/nvmem/meson-efuse.c

diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig
index f550c45..ba140ea 100644
--- a/drivers/nvmem/Kconfig
+++ b/drivers/nvmem/Kconfig
@@ -101,4 +101,14 @@ config NVMEM_VF610_OCOTP
 	  This driver can also be build as a module. If so, the module will
 	  be called nvmem-vf610-ocotp.
 
+config MESON_EFUSE
+	tristate "Amlogic eFuse Support"
+	depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
+	help
+	  This is a driver to retrieve specific values from the eFuse found on
+	  the Amlogic Meson SoCs.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called nvmem_meson_efuse.
+
 endif
diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile
index 45ab1ae..8f942a0 100644
--- a/drivers/nvmem/Makefile
+++ b/drivers/nvmem/Makefile
@@ -22,3 +22,5 @@ obj-$(CONFIG_NVMEM_SUNXI_SID)	+= nvmem_sunxi_sid.o
 nvmem_sunxi_sid-y		:= sunxi_sid.o
 obj-$(CONFIG_NVMEM_VF610_OCOTP)	+= nvmem-vf610-ocotp.o
 nvmem-vf610-ocotp-y		:= vf610-ocotp.o
+obj-$(CONFIG_MESON_EFUSE)	+= nvmem_meson_efuse.o
+nvmem_meson_efuse-y		:= meson-efuse.o
diff --git a/drivers/nvmem/meson-efuse.c b/drivers/nvmem/meson-efuse.c
new file mode 100644
index 0000000..f207c3b
--- /dev/null
+++ b/drivers/nvmem/meson-efuse.c
@@ -0,0 +1,93 @@
+/*
+ * Amlogic eFuse Driver
+ *
+ * Copyright (c) 2016 Endless Computers, Inc.
+ * Author: Carlo Caione <carlo@endlessm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/module.h>
+#include <linux/nvmem-provider.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include <linux/firmware/meson/meson_sm.h>
+
+static int meson_efuse_read(void *context, unsigned int offset,
+			    void *val, size_t bytes)
+{
+	u8 *buf = val;
+	int ret;
+
+	ret = meson_sm_call_read(buf, SM_EFUSE_READ, offset,
+				 bytes, 0, 0, 0);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static struct nvmem_config econfig = {
+	.name = "meson-efuse",
+	.owner = THIS_MODULE,
+	.stride = 1,
+	.word_size = 1,
+	.read_only = true,
+};
+
+static const struct of_device_id meson_efuse_match[] = {
+	{ .compatible = "amlogic,meson-gxbb-efuse", },
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, meson_efuse_match);
+
+static int meson_efuse_probe(struct platform_device *pdev)
+{
+	struct nvmem_device *nvmem;
+	unsigned int size;
+
+	if (meson_sm_call(SM_EFUSE_USER_MAX, &size, 0, 0, 0, 0, 0) < 0)
+		return -EINVAL;
+
+	econfig.dev = &pdev->dev;
+	econfig.reg_read = meson_efuse_read;
+	econfig.size = size;
+
+	nvmem = nvmem_register(&econfig);
+	if (IS_ERR(nvmem))
+		return PTR_ERR(nvmem);
+
+	platform_set_drvdata(pdev, nvmem);
+
+	return 0;
+}
+
+static int meson_efuse_remove(struct platform_device *pdev)
+{
+	struct nvmem_device *nvmem = platform_get_drvdata(pdev);
+
+	return nvmem_unregister(nvmem);
+}
+
+static struct platform_driver meson_efuse_driver = {
+	.probe = meson_efuse_probe,
+	.remove = meson_efuse_remove,
+	.driver = {
+		.name = "meson-efuse",
+		.of_match_table = meson_efuse_match,
+	},
+};
+
+module_platform_driver(meson_efuse_driver);
+
+MODULE_AUTHOR("Carlo Caione <carlo@endlessm.com>");
+MODULE_DESCRIPTION("Amlogic Meson NVMEM driver");
+MODULE_LICENSE("GPL v2");
-- 
2.7.4

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

* [PATCH v3 5/6] documentation: Add nvmem bindings documentation
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
                   ` (3 preceding siblings ...)
  2016-08-27 13:43 ` [PATCH v3 4/6] nvmem: amlogic: Add Amlogic Meson EFUSE driver Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-08-27 13:43 ` [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM Carlo Caione
  2016-08-27 13:47 ` [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
  6 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

This patch add the bindings document of Amlogic eFuse driver.

Acked-by: Rob Herring <robh@kernel.org>
Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 .../devicetree/bindings/nvmem/amlogic-efuse.txt    | 39 ++++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt

diff --git a/Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt b/Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt
new file mode 100644
index 0000000..fafd85b
--- /dev/null
+++ b/Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt
@@ -0,0 +1,39 @@
+= Amlogic eFuse device tree bindings =
+
+Required properties:
+- compatible: should be "amlogic,meson-gxbb-efuse"
+
+= Data cells =
+Are child nodes of eFuse, bindings of which as described in
+bindings/nvmem/nvmem.txt
+
+Example:
+
+	efuse: efuse {
+		compatible = "amlogic,meson-gxbb-efuse";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		sn: sn at 14 {
+			reg = <0x14 0x10>;
+		};
+
+		eth_mac: eth_mac at 34 {
+			reg = <0x34 0x10>;
+		};
+
+		bid: bid at 46 {
+			reg = <0x46 0x30>;
+		};
+	};
+
+= Data consumers =
+Are device nodes which consume nvmem data cells.
+
+For example:
+
+	eth_mac {
+		...
+		nvmem-cells = <&eth_mac>;
+		nvmem-cell-names = "eth_mac";
+	};
-- 
2.7.4

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

* [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
                   ` (4 preceding siblings ...)
  2016-08-27 13:43 ` [PATCH v3 5/6] documentation: Add nvmem bindings documentation Carlo Caione
@ 2016-08-27 13:43 ` Carlo Caione
  2016-09-01 21:26   ` Kevin Hilman
  2016-08-27 13:47 ` [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
  6 siblings, 1 reply; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:43 UTC (permalink / raw)
  To: linux-arm-kernel

From: Carlo Caione <carlo@endlessm.com>

Add the NVMEM device node in the DTSI.

Signed-off-by: Carlo Caione <carlo@endlessm.com>
---
 arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 18 ++++++++++++++++++
 drivers/firmware/meson/meson_sm.c           |  3 ++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
index ca428e8..aea8fd6 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
@@ -105,6 +105,24 @@
 		};
 	};
 
+	efuse: efuse {
+		compatible = "amlogic,meson-gxbb-efuse";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		sn: sn at 14 {
+			reg = <0x14 0x10>;
+		};
+
+		eth_mac: eth_mac at 34 {
+			reg = <0x34 0x10>;
+		};
+
+		bid: bid at 46 {
+			reg = <0x46 0x30>;
+		};
+	};
+
 	timer {
 		compatible = "arm,armv8-timer";
 		interrupts = <GIC_PPI 13
diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
index bba594e..b0d2549 100644
--- a/drivers/firmware/meson/meson_sm.c
+++ b/drivers/firmware/meson/meson_sm.c
@@ -21,6 +21,7 @@
 #include <linux/of_device.h>
 #include <linux/printk.h>
 #include <linux/types.h>
+#include <linux/sizes.h>
 
 #include <linux/firmware/meson/meson_sm.h>
 
@@ -38,7 +39,7 @@ struct meson_sm_chip {
 };
 
 struct meson_sm_chip gxbb_chip = {
-	.shmem_size		= 0x1000,
+	.shmem_size		= SZ_4K,
 	.cmd_shmem_in_base	= 0x82000020,
 	.cmd_shmem_out_base	= 0x82000021,
 	.cmd = {
-- 
2.7.4

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

* [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers
  2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
                   ` (5 preceding siblings ...)
  2016-08-27 13:43 ` [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM Carlo Caione
@ 2016-08-27 13:47 ` Carlo Caione
  2016-09-01 21:27   ` Kevin Hilman
  6 siblings, 1 reply; 11+ messages in thread
From: Carlo Caione @ 2016-08-27 13:47 UTC (permalink / raw)
  To: linux-arm-kernel

On 27/08/16 15:43, Carlo Caione wrote:
> From: Carlo Caione <carlo@endlessm.com>
> 
> I decided to respin again the secure monitor driver this time with the NVMEM
> driver in the same patchset to have a clear view on how a generic driver can
> use the monitor.

Kevin,
finally I found the time to respin this patchset for the last time.
Since we have now all the ACKs we need, could you please take all the 6
patches in your tree?

Thanks,

-- 
Carlo Caione

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

* [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM
  2016-08-27 13:43 ` [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM Carlo Caione
@ 2016-09-01 21:26   ` Kevin Hilman
  2016-09-01 21:28     ` Carlo Caione
  0 siblings, 1 reply; 11+ messages in thread
From: Kevin Hilman @ 2016-09-01 21:26 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Carlo,

Carlo Caione <carlo@caione.org> writes:

> From: Carlo Caione <carlo@endlessm.com>
>
> Add the NVMEM device node in the DTSI.
>
> Signed-off-by: Carlo Caione <carlo@endlessm.com>
> ---
>  arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 18 ++++++++++++++++++
>  drivers/firmware/meson/meson_sm.c           |  3 ++-
>  2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
> index ca428e8..aea8fd6 100644
> --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
> +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
> @@ -105,6 +105,24 @@
>  		};
>  	};
>  
> +	efuse: efuse {
> +		compatible = "amlogic,meson-gxbb-efuse";
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +
> +		sn: sn at 14 {
> +			reg = <0x14 0x10>;
> +		};
> +
> +		eth_mac: eth_mac at 34 {
> +			reg = <0x34 0x10>;
> +		};
> +
> +		bid: bid at 46 {
> +			reg = <0x46 0x30>;
> +		};
> +	};
> +
>  	timer {
>  		compatible = "arm,armv8-timer";
>  		interrupts = <GIC_PPI 13
> diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
> index bba594e..b0d2549 100644
> --- a/drivers/firmware/meson/meson_sm.c
> +++ b/drivers/firmware/meson/meson_sm.c
> @@ -21,6 +21,7 @@
>  #include <linux/of_device.h>
>  #include <linux/printk.h>
>  #include <linux/types.h>
> +#include <linux/sizes.h>
>  
>  #include <linux/firmware/meson/meson_sm.h>
>  
> @@ -38,7 +39,7 @@ struct meson_sm_chip {
>  };
>  
>  struct meson_sm_chip gxbb_chip = {
> -	.shmem_size		= 0x1000,
> +	.shmem_size		= SZ_4K,
>  	.cmd_shmem_in_base	= 0x82000020,
>  	.cmd_shmem_out_base	= 0x82000021,
>  	.cmd = {

This change doesn't reallly belong in this patch, and driver changes in
DT patches makes it hard to keep the DT changes separate from driver
changes, which is how we like to manage things in arm-soc.

I've dropped it from this patch, and folded it into PATCH 1/6.

Thanks,

Kevin

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

* [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers
  2016-08-27 13:47 ` [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
@ 2016-09-01 21:27   ` Kevin Hilman
  0 siblings, 0 replies; 11+ messages in thread
From: Kevin Hilman @ 2016-09-01 21:27 UTC (permalink / raw)
  To: linux-arm-kernel

Carlo Caione <carlo@caione.org> writes:

> On 27/08/16 15:43, Carlo Caione wrote:
>> From: Carlo Caione <carlo@endlessm.com>
>> 
>> I decided to respin again the secure monitor driver this time with the NVMEM
>> driver in the same patchset to have a clear view on how a generic driver can
>> use the monitor.
>
> Kevin,
> finally I found the time to respin this patchset for the last time.
> Since we have now all the ACKs we need, could you please take all the 6
> patches in your tree?

Patches 1, 4 applied to drivers branch.  The rest applied to dt64
branch.

Thanks,

Kevin

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

* [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM
  2016-09-01 21:26   ` Kevin Hilman
@ 2016-09-01 21:28     ` Carlo Caione
  0 siblings, 0 replies; 11+ messages in thread
From: Carlo Caione @ 2016-09-01 21:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Sep 1, 2016 at 11:26 PM, Kevin Hilman <khilman@baylibre.com> wrote:
> Hi Carlo,
>
> Carlo Caione <carlo@caione.org> writes:
>
>> From: Carlo Caione <carlo@endlessm.com>
>>
>> Add the NVMEM device node in the DTSI.
>>
>> Signed-off-by: Carlo Caione <carlo@endlessm.com>
>> ---
>>  arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 18 ++++++++++++++++++
>>  drivers/firmware/meson/meson_sm.c           |  3 ++-
>>  2 files changed, 20 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
>> index ca428e8..aea8fd6 100644
>> --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
>> +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
>> @@ -105,6 +105,24 @@
>>               };
>>       };
>>
>> +     efuse: efuse {
>> +             compatible = "amlogic,meson-gxbb-efuse";
>> +             #address-cells = <1>;
>> +             #size-cells = <1>;
>> +
>> +             sn: sn at 14 {
>> +                     reg = <0x14 0x10>;
>> +             };
>> +
>> +             eth_mac: eth_mac at 34 {
>> +                     reg = <0x34 0x10>;
>> +             };
>> +
>> +             bid: bid at 46 {
>> +                     reg = <0x46 0x30>;
>> +             };
>> +     };
>> +
>>       timer {
>>               compatible = "arm,armv8-timer";
>>               interrupts = <GIC_PPI 13
>> diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c
>> index bba594e..b0d2549 100644
>> --- a/drivers/firmware/meson/meson_sm.c
>> +++ b/drivers/firmware/meson/meson_sm.c
>> @@ -21,6 +21,7 @@
>>  #include <linux/of_device.h>
>>  #include <linux/printk.h>
>>  #include <linux/types.h>
>> +#include <linux/sizes.h>
>>
>>  #include <linux/firmware/meson/meson_sm.h>
>>
>> @@ -38,7 +39,7 @@ struct meson_sm_chip {
>>  };
>>
>>  struct meson_sm_chip gxbb_chip = {
>> -     .shmem_size             = 0x1000,
>> +     .shmem_size             = SZ_4K,
>>       .cmd_shmem_in_base      = 0x82000020,
>>       .cmd_shmem_out_base     = 0x82000021,
>>       .cmd = {
>
> This change doesn't reallly belong in this patch, and driver changes in
> DT patches makes it hard to keep the DT changes separate from driver
> changes, which is how we like to manage things in arm-soc.

Damn. Sorry, probably amended the wrong patch when trying to address
mark's comments.

> I've dropped it from this patch, and folded it into PATCH 1/6.

Where it belongs.

Thank you,

-- 
Carlo Caione  |  +39.340.80.30.096  |  Endless

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

end of thread, other threads:[~2016-09-01 21:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-27 13:43 [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
2016-08-27 13:43 ` [PATCH v3 1/6] firmware: Amlogic: Add secure monitor driver Carlo Caione
2016-08-27 13:43 ` [PATCH v3 2/6] documentation: Add secure monitor bindings documentation Carlo Caione
2016-08-27 13:43 ` [PATCH v3 3/6] ARM64: dts: amlogic: gxbb: Enable secure monitor Carlo Caione
2016-08-27 13:43 ` [PATCH v3 4/6] nvmem: amlogic: Add Amlogic Meson EFUSE driver Carlo Caione
2016-08-27 13:43 ` [PATCH v3 5/6] documentation: Add nvmem bindings documentation Carlo Caione
2016-08-27 13:43 ` [PATCH v3 6/6] ARM64: dts: amlogic: gxbb: Enable NVMEM Carlo Caione
2016-09-01 21:26   ` Kevin Hilman
2016-09-01 21:28     ` Carlo Caione
2016-08-27 13:47 ` [PATCH v3 0/6] Add Amlogic secure monitor and NVMEM drivers Carlo Caione
2016-09-01 21:27   ` Kevin Hilman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).