Add Amlogic secure monitor and NVMEM drivers
Subsystems (3)
v2 cover Add Amlogic secure monitor and NVMEM drivers
From: Carlo Caione <[email protected]>
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:
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 | 247 +++++++++++++++++++++ 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, 473 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
Signature · 1 line
2.7.4
PATCH v2 1/6 firmware: Amlogic: Add secure monitor driver
From: Carlo Caione <[email protected]>
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...
--- 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
drivers/firmware/Kconfig +1 -0
@@ -199,5 +199,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
drivers/firmware/Makefile +1 -0
@@ -21,6 +21,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/
drivers/firmware/meson/Kconfig new file +9 -0
@@ -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
drivers/firmware/meson/Makefile new file +1 -0
@@ -0,0 +1 @@ +obj-$(CONFIG_MESON_SM) += meson_sm.o
drivers/firmware/meson/meson_sm.c new file +247 -0
247 lines not on this page · raw message
include/linux/firmware/meson/meson_sm.h new file +31 -0
@@ -0,0 +1,31 @@ +/* +* Copyright (C) 2016 Endless Mobile, Inc. +* Author: Carlo Caione <[email protected]> +* +* 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_ */
Signature · 1 line
2.7.4
PATCH v2 1/6 firmware: Amlogic: Add secure monitor driver
Quoted 8 lines · Carlo Caione
From: Carlo Caione <[email protected]>
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...
Signed-off-by Carlo Caione <[email protected]>
(gentle ping)
Mark,
any comment on this?
thanks,
Signature · 1 line
Carlo Caione
PATCH v2 1/6 firmware: Amlogic: Add secure monitor driver
In reply to Carlo CaioneHi,
Sorry for the delay.
I don't have any major comments, there are jsut a couple of minor details.
drivers/firmware/meson/Kconfig line 7
Quoted 4 lines
drivers/firmware/meson/Kconfig new file +4
-0+config MESON_SM + bool + default ARCH_MESON + depends on ARM64_4K_PAGES
It would be good to have a commentin the code as to why we depend on ARM64_4K_PAGES.
That way it's possible for others to figure out without having to go digging through mail archives and/or git logs.
[...]
drivers/firmware/meson/meson_sm.c line 41
Quoted 2 lines
drivers/firmware/meson/meson_sm.c new file +2
-0+struct meson_sm_chip gxbb_chip = { + .shmem_size =0x1000 ,
If you include <linux/sizes.h>, you can use SZ_4K here.
Immediately above this is probably the best place for the comment regarding the 4K page restriction imposed by the FW interface.
Other than that this looks fine, so FWIW:
Thanks,
Mark.
PATCH v2 2/6 documentation: Add secure monitor bindings documentation
In reply to Carlo CaioneFrom: Carlo Caione <[email protected]>
Add the binding documentation for the Amlogic secure monitor driver.
--- .../devicetree/bindings/firmware/meson/meson_sm.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt
Documentation/devicetree/bindings/firmware/meson/meson_sm.txt new file +15 -0
@@ -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"; + }; + };
Signature · 1 line
2.7.4
PATCH v2 3/6 ARM64: dts: amlogic: gxbb: Enable secure monitor
In reply to Carlo CaioneFrom: Carlo Caione <[email protected]>
Add the secure monitor node in the Amlogic Meson GXBB DTSI file to enable it.
--- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +6 -0
@@ -97,6 +97,12 @@ method = "smc"; }; + firmware { + sm: secure-monitor { + compatible = "amlogic,meson-gxbb-sm"; + }; + }; + timer { compatible = "arm,armv8-timer"; interrupts = <GIC_PPI 13
Signature · 1 line
2.7.4
PATCH v2 4/6 nvmem: amlogic: Add Amlogic Meson EFUSE driver
In reply to Carlo CaioneFrom: Carlo Caione <[email protected]>
Add Amlogic EFUSE driver to access hardware data like ethernet address, serial number or IDs.
--- 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
drivers/nvmem/Kconfig +10 -0
@@ -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
drivers/nvmem/Makefile +2 -0
@@ -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
drivers/nvmem/meson-efuse.c new file +93 -0
93 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 4/6 nvmem: amlogic: Add Amlogic Meson EFUSE driver
Quoted 6 lines · Carlo Caione
From: Carlo Caione <[email protected]>
Add Amlogic EFUSE driver to access hardware data like ethernet address, serial number or IDs.
Signed-off-by Carlo Caione <[email protected]>
Patch looks good to me,
Looks like there are some dependencies to this patch w.r.t sm_calls, it would be easy to take this series from single tree.
Just incase you want to take this patch via some other tree, here is Ack.
Quoted 136 lines
--- 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.cdrivers/nvmem/Kconfig +10
-0@@ -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. + endifdrivers/nvmem/Makefile +2
-0@@ -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.odrivers/nvmem/meson-efuse.c new file +93
-0@@ -0,0 +1,93 @@ +/* +* Amlogic eFuse Driver +* +* Copyright (c) 2016 Endless Computers, Inc. +* Author: Carlo Caione <[email protected]> +* +* 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 <[email protected]>" ); +MODULE_DESCRIPTION ("Amlogic Meson NVMEM driver" ); +MODULE_LICENSE ("GPL v2" );
PATCH v2 4/6 nvmem: amlogic: Add Amlogic Meson EFUSE driver
Quoted 10 lines · Srinivas Kandagatla
Quoted 6 lines · Carlo Caione
From: Carlo Caione <[email protected]>
Add Amlogic EFUSE driver to access hardware data like ethernet address, serial number or IDs.
Signed-off-by Carlo Caione <[email protected]>
Quoted 8 lines
Patch looks good to me,
Looks like there are some dependencies to this patch w.r.t
sm_calls, it would be easy to take this series from single tree.Just incase you want to take this patch via some other tree, here is Ack.
Thanks, probably it's better to merge everything through the arm-soc tree.
Cheers,
Signature · 1 line
Carlo Caione
PATCH v2 5/6 documentation: Add nvmem bindings documentation
In reply to Carlo CaioneFrom: Carlo Caione <[email protected]>
This patch add the bindings document of Amlogic eFuse driver.
--- .../devicetree/bindings/nvmem/amlogic-efuse.txt | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt
Documentation/devicetree/bindings/nvmem/amlogic-efuse.txt new file +39 -0
@@ -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 = <ð_mac>; + nvmem-cell-names = "eth_mac"; + };
Signature · 1 line
2.7.4
PATCH v2 5/6 documentation: Add nvmem bindings documentation
Quoted 6 lines · Carlo Caione
From: Carlo Caione <[email protected]>
This patch add the bindings document of Amlogic eFuse driver.
Signed-off-by Carlo Caione <[email protected]>Acked-by Rob Herring <[email protected]>
Quoted 51 lines
--- .../devicetree/bindings/nvmem/amlogic-efuse.txt | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+)create mode 100644
Documentation/devicetree/bindings/nvmem/amlogic-efuse.txtDocumentation/devicetree/bindings/nvmem/amlogic-efuse.txt new file +39
-0@@ -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 = <ð_mac>; + nvmem-cell-names = "eth_mac"; + };
PATCH v2 6/6 ARM64: dts: amlogic: gxbb: Enable NVMEM
In reply to Carlo CaioneFrom: Carlo Caione <[email protected]>
Add the NVMEM device node in the DTSI.
--- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +18 -0
@@ -103,6 +103,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
Signature · 1 line
2.7.4