* [PATCH v7 0/3] Add Amlogic secure monitor driver @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg Cc: Carlo Caione From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> In the Amlogic SoCs the secure monitor calls are used for a lot of reasons: interact with the NVMEM (efuses), check the reboot reason, set USB boot, ... This driver defines a generic interface towards the secure monitor that can be used by more specialized drivers to interact with the secure monitor itself without worrying about bounce buffers managing. Changelog: v7: * dropped "simple-bus" v6: * Added comments * Fix checking u32 < 0 * s/-ENODEV/-EINVAL/ in the probe function * Use WARN_ON() v5: * Moved IDs from DT to header file * Made read/write bounce buffers not mandatory * Introduced helper meson_sm_map_shmem() v4: * Changed patches order * Removed now useless PATCH 2/4 * Changed compatible to be SoC-specific * In the DT now we use SoC-agnostic IDs for the SMC functions. These IDs are traslated into SoC specific function IDs inside the driver * Added error checking on meson_sm_call() to retrieve the base address * Improved printing on errors v3: * Moved driver to drivers/firmware * Added EXPORT_SYMBOL macros * Changed '_' in '-' * Introduced 'struct meson_sm_firmware' and 'meson_sm_get_fw()' to be used by drivers using the secure-monitor to enforce probe ordering v2: * All the SMC function identifiers are now in a SoC-specific header file to be included by the DTS files so the SMC commands are now defined in the DT instead to be hardcoded into the driver * Patchset is no longer an RFC * Better error management and boundary checking * s/unsigned int/u32/ * SMC call not only on CPU 0 * Fix memory leaking * s/amlogic/meson/ in the directory names Carlo Caione (3): firmware: Amlogic: Add secure monitor driver documentation: Add secure monitor binding documentation ARM64: dts: amlogic: gxbb: Enable secure monitor .../bindings/firmware/meson/meson_sm.txt | 27 ++ arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 6 + drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 +++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 +++ 8 files changed, 388 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.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 include/linux/firmware/meson/meson_sm.h -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 0/3] Add Amlogic secure monitor driver @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linus-amlogic From: Carlo Caione <carlo@endlessm.com> In the Amlogic SoCs the secure monitor calls are used for a lot of reasons: interact with the NVMEM (efuses), check the reboot reason, set USB boot, ... This driver defines a generic interface towards the secure monitor that can be used by more specialized drivers to interact with the secure monitor itself without worrying about bounce buffers managing. Changelog: v7: * dropped "simple-bus" v6: * Added comments * Fix checking u32 < 0 * s/-ENODEV/-EINVAL/ in the probe function * Use WARN_ON() v5: * Moved IDs from DT to header file * Made read/write bounce buffers not mandatory * Introduced helper meson_sm_map_shmem() v4: * Changed patches order * Removed now useless PATCH 2/4 * Changed compatible to be SoC-specific * In the DT now we use SoC-agnostic IDs for the SMC functions. These IDs are traslated into SoC specific function IDs inside the driver * Added error checking on meson_sm_call() to retrieve the base address * Improved printing on errors v3: * Moved driver to drivers/firmware * Added EXPORT_SYMBOL macros * Changed '_' in '-' * Introduced 'struct meson_sm_firmware' and 'meson_sm_get_fw()' to be used by drivers using the secure-monitor to enforce probe ordering v2: * All the SMC function identifiers are now in a SoC-specific header file to be included by the DTS files so the SMC commands are now defined in the DT instead to be hardcoded into the driver * Patchset is no longer an RFC * Better error management and boundary checking * s/unsigned int/u32/ * SMC call not only on CPU 0 * Fix memory leaking * s/amlogic/meson/ in the directory names Carlo Caione (3): firmware: Amlogic: Add secure monitor driver documentation: Add secure monitor binding documentation ARM64: dts: amlogic: gxbb: Enable secure monitor .../bindings/firmware/meson/meson_sm.txt | 27 ++ arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 6 + drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 +++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 +++ 8 files changed, 388 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.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 include/linux/firmware/meson/meson_sm.h -- 2.7.4 ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 0/3] Add Amlogic secure monitor driver @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel From: Carlo Caione <carlo@endlessm.com> In the Amlogic SoCs the secure monitor calls are used for a lot of reasons: interact with the NVMEM (efuses), check the reboot reason, set USB boot, ... This driver defines a generic interface towards the secure monitor that can be used by more specialized drivers to interact with the secure monitor itself without worrying about bounce buffers managing. Changelog: v7: * dropped "simple-bus" v6: * Added comments * Fix checking u32 < 0 * s/-ENODEV/-EINVAL/ in the probe function * Use WARN_ON() v5: * Moved IDs from DT to header file * Made read/write bounce buffers not mandatory * Introduced helper meson_sm_map_shmem() v4: * Changed patches order * Removed now useless PATCH 2/4 * Changed compatible to be SoC-specific * In the DT now we use SoC-agnostic IDs for the SMC functions. These IDs are traslated into SoC specific function IDs inside the driver * Added error checking on meson_sm_call() to retrieve the base address * Improved printing on errors v3: * Moved driver to drivers/firmware * Added EXPORT_SYMBOL macros * Changed '_' in '-' * Introduced 'struct meson_sm_firmware' and 'meson_sm_get_fw()' to be used by drivers using the secure-monitor to enforce probe ordering v2: * All the SMC function identifiers are now in a SoC-specific header file to be included by the DTS files so the SMC commands are now defined in the DT instead to be hardcoded into the driver * Patchset is no longer an RFC * Better error management and boundary checking * s/unsigned int/u32/ * SMC call not only on CPU 0 * Fix memory leaking * s/amlogic/meson/ in the directory names Carlo Caione (3): firmware: Amlogic: Add secure monitor driver documentation: Add secure monitor binding documentation ARM64: dts: amlogic: gxbb: Enable secure monitor .../bindings/firmware/meson/meson_sm.txt | 27 ++ arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 6 + drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 +++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 +++ 8 files changed, 388 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.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 include/linux/firmware/meson/meson_sm.h -- 2.7.4 ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <1465587851-24184-1-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org>]
* [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver 2016-06-10 19:44 ` Carlo Caione (?) @ 2016-06-10 19:44 ` Carlo Caione -1 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg Cc: Carlo Caione From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> 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 <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> --- drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 ++++++++++++++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 ++++ 6 files changed, 355 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 6664f11..686e395 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -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 diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 474bada..fc4bb09 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -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/ diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig new file mode 100644 index 0000000..fff11a3 --- /dev/null +++ b/drivers/firmware/meson/Kconfig @@ -0,0 +1,8 @@ +# +# Amlogic Secure Monitor driver +# +config MESON_SM + bool + default ARCH_MESON + 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..ef548ad --- /dev/null +++ b/drivers/firmware/meson/meson_sm.c @@ -0,0 +1,312 @@ +/* + * Amlogic Secure Monitor driver + * + * Copyright (C) 2016 Endless Mobile, Inc. + * Author: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> + * + * 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/>. + */ + +#include <stdarg.h> +#include <asm/cacheflush.h> +#include <asm/compiler.h> +#include <linux/arm-smccc.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/smp.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_firmware { + struct device *dev; + const struct meson_sm_chip *chip; + void __iomem *sm_shmem_in_base; + void __iomem *sm_shmem_out_base; +}; + +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 */ }, + }, +}; + +static u32 meson_sm_get_cmd(const struct meson_sm_chip *chip, unsigned int cmd_index) +{ + unsigned int i; + + for (i = 0; chip->cmd[i].smc_id; i++) + if (chip->cmd[i].index == cmd_index) + return chip->cmd[i].smc_id; + + return 0; +} + +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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 cmd, lret; + + if (!fw) + return -EINVAL; + + 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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (!fw->chip->cmd_shmem_out_base) + return -EINVAL; + + if (meson_sm_call(fw, 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 + * + * @fw: Meson secure-monitor firmware pointer + * @buffer: Buffer containing data to send + * @b_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(struct meson_sm_firmware *fw, void *buffer, + unsigned int b_size, unsigned int cmd_index, + u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (b_size > fw->chip->shmem_size) + return -EINVAL; + + if (!fw->chip->cmd_shmem_in_base) + return -EINVAL; + + memcpy(fw->sm_shmem_in_base, buffer, b_size); + + if (meson_sm_call(fw, cmd_index, &size, arg0, arg1, arg2, arg3, arg4) < 0) + return -EINVAL; + + if (!size) + return -EINVAL; + + return size; +} +EXPORT_SYMBOL(meson_sm_call_write); + +/** + * meson_sm_get_fw - get Meson firmware struct + * + * @firmware_node: Device node of the secure-monitor + * + * Return: Meson secure-monitor firmware struct on success, NULL on error + */ +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node) +{ + struct platform_device *pdev = of_find_device_by_node(firmware_node); + + /* + * Returns NULL is the firmware device is not ready. + */ + if (!pdev) + return NULL; + + return platform_get_drvdata(pdev); +} +EXPORT_SYMBOL(meson_sm_get_fw); + +static const struct of_device_id meson_sm_ids[] = { + { .compatible = "amlogic,meson-gxbb-sm", .data = &gxbb_chip }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, meson_sm_ids); + +static int meson_sm_probe(struct platform_device *pdev) +{ + const struct meson_sm_chip *chip; + struct meson_sm_firmware *fw; + struct device_node *np; + const struct of_device_id *matched_np; + + np = of_find_matching_node_and_match(NULL, meson_sm_ids, &matched_np); + if (!np) { + dev_err(&pdev->dev, "no matching node\n"); + return -EINVAL; + } + + chip = matched_np->data; + if (!chip) { + dev_err(&pdev->dev, "unable to setup secure-monitor data\n"); + return -EINVAL; + } + + fw = devm_kzalloc(&pdev->dev, sizeof(*fw), GFP_KERNEL); + if (!fw) + return -ENOMEM; + + 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; + } + + fw->dev = &pdev->dev; + fw->chip = chip; + platform_set_drvdata(pdev, fw); + + dev_info(fw->dev, "enabled\n"); + + return 0; + +out: + if (fw->sm_shmem_in_base) + iounmap(fw->sm_shmem_in_base); + + return -EINVAL; +} + +static struct platform_driver meson_sm_platform_driver = { + .probe = meson_sm_probe, + .driver = { + .name = "meson-sm", + .of_match_table = meson_sm_ids, + }, +}; + +static int __init meson_sm_init(void) +{ + struct platform_device *meson_sm_device; + int ret; + + ret = platform_driver_register(&meson_sm_platform_driver); + if (ret) { + pr_err("unable to register driver\n"); + return ret; + } + + meson_sm_device = platform_device_register_simple("meson-sm", + -1, NULL, 0); + if (IS_ERR(meson_sm_device)) { + pr_err("unable to register device\n"); + platform_driver_unregister(&meson_sm_platform_driver); + return PTR_ERR(meson_sm_device); + } + + return 0; +} +device_initcall(meson_sm_init); + +MODULE_AUTHOR("Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>"); +MODULE_DESCRIPTION("Amlogic secure monitor driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h new file mode 100644 index 0000000..863b231 --- /dev/null +++ b/include/linux/firmware/meson/meson_sm.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2016 Endless Mobile, Inc. + * Author: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> + * + * 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_ + +#define SM_EFUSE_READ 0 +#define SM_EFUSE_WRITE 1 +#define SM_EFUSE_USER_MAX 2 + +struct meson_sm_firmware; + +int meson_sm_call(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4); +int meson_sm_call_write(struct meson_sm_firmware *fw, 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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4); +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node); + +#endif /* _MESON_SM_FW_H_ */ -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linus-amlogic 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... Signed-off-by: Carlo Caione <carlo@endlessm.com> --- drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 ++++++++++++++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 ++++ 6 files changed, 355 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 6664f11..686e395 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -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 diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 474bada..fc4bb09 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -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/ diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig new file mode 100644 index 0000000..fff11a3 --- /dev/null +++ b/drivers/firmware/meson/Kconfig @@ -0,0 +1,8 @@ +# +# Amlogic Secure Monitor driver +# +config MESON_SM + bool + default ARCH_MESON + 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..ef548ad --- /dev/null +++ b/drivers/firmware/meson/meson_sm.c @@ -0,0 +1,312 @@ +/* + * 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/>. + */ + +#include <stdarg.h> +#include <asm/cacheflush.h> +#include <asm/compiler.h> +#include <linux/arm-smccc.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/smp.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_firmware { + struct device *dev; + const struct meson_sm_chip *chip; + void __iomem *sm_shmem_in_base; + void __iomem *sm_shmem_out_base; +}; + +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 */ }, + }, +}; + +static u32 meson_sm_get_cmd(const struct meson_sm_chip *chip, unsigned int cmd_index) +{ + unsigned int i; + + for (i = 0; chip->cmd[i].smc_id; i++) + if (chip->cmd[i].index == cmd_index) + return chip->cmd[i].smc_id; + + return 0; +} + +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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 cmd, lret; + + if (!fw) + return -EINVAL; + + 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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (!fw->chip->cmd_shmem_out_base) + return -EINVAL; + + if (meson_sm_call(fw, 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 + * + * @fw: Meson secure-monitor firmware pointer + * @buffer: Buffer containing data to send + * @b_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(struct meson_sm_firmware *fw, void *buffer, + unsigned int b_size, unsigned int cmd_index, + u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (b_size > fw->chip->shmem_size) + return -EINVAL; + + if (!fw->chip->cmd_shmem_in_base) + return -EINVAL; + + memcpy(fw->sm_shmem_in_base, buffer, b_size); + + if (meson_sm_call(fw, cmd_index, &size, arg0, arg1, arg2, arg3, arg4) < 0) + return -EINVAL; + + if (!size) + return -EINVAL; + + return size; +} +EXPORT_SYMBOL(meson_sm_call_write); + +/** + * meson_sm_get_fw - get Meson firmware struct + * + * @firmware_node: Device node of the secure-monitor + * + * Return: Meson secure-monitor firmware struct on success, NULL on error + */ +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node) +{ + struct platform_device *pdev = of_find_device_by_node(firmware_node); + + /* + * Returns NULL is the firmware device is not ready. + */ + if (!pdev) + return NULL; + + return platform_get_drvdata(pdev); +} +EXPORT_SYMBOL(meson_sm_get_fw); + +static const struct of_device_id meson_sm_ids[] = { + { .compatible = "amlogic,meson-gxbb-sm", .data = &gxbb_chip }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, meson_sm_ids); + +static int meson_sm_probe(struct platform_device *pdev) +{ + const struct meson_sm_chip *chip; + struct meson_sm_firmware *fw; + struct device_node *np; + const struct of_device_id *matched_np; + + np = of_find_matching_node_and_match(NULL, meson_sm_ids, &matched_np); + if (!np) { + dev_err(&pdev->dev, "no matching node\n"); + return -EINVAL; + } + + chip = matched_np->data; + if (!chip) { + dev_err(&pdev->dev, "unable to setup secure-monitor data\n"); + return -EINVAL; + } + + fw = devm_kzalloc(&pdev->dev, sizeof(*fw), GFP_KERNEL); + if (!fw) + return -ENOMEM; + + 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; + } + + fw->dev = &pdev->dev; + fw->chip = chip; + platform_set_drvdata(pdev, fw); + + dev_info(fw->dev, "enabled\n"); + + return 0; + +out: + if (fw->sm_shmem_in_base) + iounmap(fw->sm_shmem_in_base); + + return -EINVAL; +} + +static struct platform_driver meson_sm_platform_driver = { + .probe = meson_sm_probe, + .driver = { + .name = "meson-sm", + .of_match_table = meson_sm_ids, + }, +}; + +static int __init meson_sm_init(void) +{ + struct platform_device *meson_sm_device; + int ret; + + ret = platform_driver_register(&meson_sm_platform_driver); + if (ret) { + pr_err("unable to register driver\n"); + return ret; + } + + meson_sm_device = platform_device_register_simple("meson-sm", + -1, NULL, 0); + if (IS_ERR(meson_sm_device)) { + pr_err("unable to register device\n"); + platform_driver_unregister(&meson_sm_platform_driver); + return PTR_ERR(meson_sm_device); + } + + return 0; +} +device_initcall(meson_sm_init); + +MODULE_AUTHOR("Carlo Caione <carlo@endlessm.com>"); +MODULE_DESCRIPTION("Amlogic secure monitor driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h new file mode 100644 index 0000000..863b231 --- /dev/null +++ b/include/linux/firmware/meson/meson_sm.h @@ -0,0 +1,32 @@ +/* + * 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_ + +#define SM_EFUSE_READ 0 +#define SM_EFUSE_WRITE 1 +#define SM_EFUSE_USER_MAX 2 + +struct meson_sm_firmware; + +int meson_sm_call(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4); +int meson_sm_call_write(struct meson_sm_firmware *fw, 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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4); +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node); + +#endif /* _MESON_SM_FW_H_ */ -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 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... Signed-off-by: Carlo Caione <carlo@endlessm.com> --- drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/meson/Kconfig | 8 + drivers/firmware/meson/Makefile | 1 + drivers/firmware/meson/meson_sm.c | 312 ++++++++++++++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 32 ++++ 6 files changed, 355 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 6664f11..686e395 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -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 diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 474bada..fc4bb09 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -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/ diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig new file mode 100644 index 0000000..fff11a3 --- /dev/null +++ b/drivers/firmware/meson/Kconfig @@ -0,0 +1,8 @@ +# +# Amlogic Secure Monitor driver +# +config MESON_SM + bool + default ARCH_MESON + 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..ef548ad --- /dev/null +++ b/drivers/firmware/meson/meson_sm.c @@ -0,0 +1,312 @@ +/* + * 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/>. + */ + +#include <stdarg.h> +#include <asm/cacheflush.h> +#include <asm/compiler.h> +#include <linux/arm-smccc.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/smp.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_firmware { + struct device *dev; + const struct meson_sm_chip *chip; + void __iomem *sm_shmem_in_base; + void __iomem *sm_shmem_out_base; +}; + +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 */ }, + }, +}; + +static u32 meson_sm_get_cmd(const struct meson_sm_chip *chip, unsigned int cmd_index) +{ + unsigned int i; + + for (i = 0; chip->cmd[i].smc_id; i++) + if (chip->cmd[i].index == cmd_index) + return chip->cmd[i].smc_id; + + return 0; +} + +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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 cmd, lret; + + if (!fw) + return -EINVAL; + + 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 + * + * @fw: Meson secure-monitor firmware pointer + * @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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (!fw->chip->cmd_shmem_out_base) + return -EINVAL; + + if (meson_sm_call(fw, 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 + * + * @fw: Meson secure-monitor firmware pointer + * @buffer: Buffer containing data to send + * @b_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(struct meson_sm_firmware *fw, void *buffer, + unsigned int b_size, unsigned int cmd_index, + u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) +{ + u32 size; + + if (b_size > fw->chip->shmem_size) + return -EINVAL; + + if (!fw->chip->cmd_shmem_in_base) + return -EINVAL; + + memcpy(fw->sm_shmem_in_base, buffer, b_size); + + if (meson_sm_call(fw, cmd_index, &size, arg0, arg1, arg2, arg3, arg4) < 0) + return -EINVAL; + + if (!size) + return -EINVAL; + + return size; +} +EXPORT_SYMBOL(meson_sm_call_write); + +/** + * meson_sm_get_fw - get Meson firmware struct + * + * @firmware_node: Device node of the secure-monitor + * + * Return: Meson secure-monitor firmware struct on success, NULL on error + */ +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node) +{ + struct platform_device *pdev = of_find_device_by_node(firmware_node); + + /* + * Returns NULL is the firmware device is not ready. + */ + if (!pdev) + return NULL; + + return platform_get_drvdata(pdev); +} +EXPORT_SYMBOL(meson_sm_get_fw); + +static const struct of_device_id meson_sm_ids[] = { + { .compatible = "amlogic,meson-gxbb-sm", .data = &gxbb_chip }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, meson_sm_ids); + +static int meson_sm_probe(struct platform_device *pdev) +{ + const struct meson_sm_chip *chip; + struct meson_sm_firmware *fw; + struct device_node *np; + const struct of_device_id *matched_np; + + np = of_find_matching_node_and_match(NULL, meson_sm_ids, &matched_np); + if (!np) { + dev_err(&pdev->dev, "no matching node\n"); + return -EINVAL; + } + + chip = matched_np->data; + if (!chip) { + dev_err(&pdev->dev, "unable to setup secure-monitor data\n"); + return -EINVAL; + } + + fw = devm_kzalloc(&pdev->dev, sizeof(*fw), GFP_KERNEL); + if (!fw) + return -ENOMEM; + + 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; + } + + fw->dev = &pdev->dev; + fw->chip = chip; + platform_set_drvdata(pdev, fw); + + dev_info(fw->dev, "enabled\n"); + + return 0; + +out: + if (fw->sm_shmem_in_base) + iounmap(fw->sm_shmem_in_base); + + return -EINVAL; +} + +static struct platform_driver meson_sm_platform_driver = { + .probe = meson_sm_probe, + .driver = { + .name = "meson-sm", + .of_match_table = meson_sm_ids, + }, +}; + +static int __init meson_sm_init(void) +{ + struct platform_device *meson_sm_device; + int ret; + + ret = platform_driver_register(&meson_sm_platform_driver); + if (ret) { + pr_err("unable to register driver\n"); + return ret; + } + + meson_sm_device = platform_device_register_simple("meson-sm", + -1, NULL, 0); + if (IS_ERR(meson_sm_device)) { + pr_err("unable to register device\n"); + platform_driver_unregister(&meson_sm_platform_driver); + return PTR_ERR(meson_sm_device); + } + + return 0; +} +device_initcall(meson_sm_init); + +MODULE_AUTHOR("Carlo Caione <carlo@endlessm.com>"); +MODULE_DESCRIPTION("Amlogic secure monitor driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h new file mode 100644 index 0000000..863b231 --- /dev/null +++ b/include/linux/firmware/meson/meson_sm.h @@ -0,0 +1,32 @@ +/* + * 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_ + +#define SM_EFUSE_READ 0 +#define SM_EFUSE_WRITE 1 +#define SM_EFUSE_USER_MAX 2 + +struct meson_sm_firmware; + +int meson_sm_call(struct meson_sm_firmware *fw, unsigned int cmd_index, + u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4); +int meson_sm_call_write(struct meson_sm_firmware *fw, 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(struct meson_sm_firmware *fw, void *buffer, + unsigned int cmd_index, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 arg4); +struct meson_sm_firmware *meson_sm_get_fw(struct device_node *firmware_node); + +#endif /* _MESON_SM_FW_H_ */ -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1465587851-24184-2-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver 2016-06-10 19:44 ` Carlo Caione (?) @ 2016-06-16 6:06 ` Carlo Caione -1 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-16 6:06 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg On 10/06/16 21:44, Carlo Caione wrote: > From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> > > 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 <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> Ping? -- Carlo Caione -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver @ 2016-06-16 6:06 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-16 6:06 UTC (permalink / raw) To: linus-amlogic On 10/06/16 21:44, Carlo Caione wrote: > 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... > > Signed-off-by: Carlo Caione <carlo@endlessm.com> Ping? -- Carlo Caione ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 1/3] firmware: Amlogic: Add secure monitor driver @ 2016-06-16 6:06 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-16 6:06 UTC (permalink / raw) To: linux-arm-kernel On 10/06/16 21:44, Carlo Caione wrote: > 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... > > Signed-off-by: Carlo Caione <carlo@endlessm.com> Ping? -- Carlo Caione ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 2/3] documentation: Add secure monitor binding documentation 2016-06-10 19:44 ` Carlo Caione (?) @ 2016-06-10 19:44 ` Carlo Caione -1 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg Cc: Carlo Caione From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> Add the binding documentation for the Amlogic secure monitor driver. Signed-off-by: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> --- .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ 1 file changed, 27 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..d017675 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt @@ -0,0 +1,27 @@ +* 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"; + }; + }; + +Example of the node using the secure monitor: + + efuse: efuse { + compatible = "amlogic,meson-gxbb-efuse"; + secure-monitor = <&sm>; + #address-cells = <1>; + #size-cells = <1>; + + ... + }; + -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 2/3] documentation: Add secure monitor binding documentation @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linus-amlogic From: Carlo Caione <carlo@endlessm.com> Add the binding documentation for the Amlogic secure monitor driver. Signed-off-by: Carlo Caione <carlo@endlessm.com> --- .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ 1 file changed, 27 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..d017675 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt @@ -0,0 +1,27 @@ +* 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"; + }; + }; + +Example of the node using the secure monitor: + + efuse: efuse { + compatible = "amlogic,meson-gxbb-efuse"; + secure-monitor = <&sm>; + #address-cells = <1>; + #size-cells = <1>; + + ... + }; + -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 2/3] documentation: Add secure monitor binding documentation @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel From: Carlo Caione <carlo@endlessm.com> Add the binding documentation for the Amlogic secure monitor driver. Signed-off-by: Carlo Caione <carlo@endlessm.com> --- .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ 1 file changed, 27 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..d017675 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/meson/meson_sm.txt @@ -0,0 +1,27 @@ +* 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"; + }; + }; + +Example of the node using the secure monitor: + + efuse: efuse { + compatible = "amlogic,meson-gxbb-efuse"; + secure-monitor = <&sm>; + #address-cells = <1>; + #size-cells = <1>; + + ... + }; + -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1465587851-24184-3-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v7 2/3] documentation: Add secure monitor binding documentation 2016-06-10 19:44 ` Carlo Caione (?) @ 2016-06-14 20:10 ` Rob Herring -1 siblings, 0 replies; 18+ messages in thread From: Rob Herring @ 2016-06-14 20:10 UTC (permalink / raw) To: Carlo Caione Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg, Carlo Caione On Fri, Jun 10, 2016 at 09:44:10PM +0200, Carlo Caione wrote: > From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> > > Add the binding documentation for the Amlogic secure monitor driver. > > Signed-off-by: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> > --- > .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 2/3] documentation: Add secure monitor binding documentation @ 2016-06-14 20:10 ` Rob Herring 0 siblings, 0 replies; 18+ messages in thread From: Rob Herring @ 2016-06-14 20:10 UTC (permalink / raw) To: linus-amlogic On Fri, Jun 10, 2016 at 09:44:10PM +0200, Carlo Caione wrote: > From: Carlo Caione <carlo@endlessm.com> > > Add the binding documentation for the Amlogic secure monitor driver. > > Signed-off-by: Carlo Caione <carlo@endlessm.com> > --- > .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 2/3] documentation: Add secure monitor binding documentation @ 2016-06-14 20:10 ` Rob Herring 0 siblings, 0 replies; 18+ messages in thread From: Rob Herring @ 2016-06-14 20:10 UTC (permalink / raw) To: linux-arm-kernel On Fri, Jun 10, 2016 at 09:44:10PM +0200, Carlo Caione wrote: > From: Carlo Caione <carlo@endlessm.com> > > Add the binding documentation for the Amlogic secure monitor driver. > > Signed-off-by: Carlo Caione <carlo@endlessm.com> > --- > .../bindings/firmware/meson/meson_sm.txt | 27 ++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > create mode 100644 Documentation/devicetree/bindings/firmware/meson/meson_sm.txt Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 3/3] ARM64: dts: amlogic: gxbb: Enable secure monitor 2016-06-10 19:44 ` Carlo Caione (?) @ 2016-06-10 19:44 ` Carlo Caione -1 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-6IF/jdPJHihWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, khilman-rdvid1DuHRBWk0Htik3J/w, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, narmstrong-rdvid1DuHRBWk0Htik3J/w, bjdooks-gM/Ye1E23mwN+BqQ9rBEUg Cc: Carlo Caione From: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> Add the secure monitor node in the Amlogic Meson GXBB DTSI file to enable it. Signed-off-by: Carlo Caione <carlo-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> --- 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 76b3b6d..092f10e 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -123,6 +123,12 @@ #size-cells = <2>; ranges; + firmware { + sm: secure-monitor { + compatible = "amlogic,meson-gxbb-sm"; + }; + }; + cbus: cbus@c1100000 { compatible = "simple-bus"; reg = <0x0 0xc1100000 0x0 0x100000>; -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 3/3] ARM64: dts: amlogic: gxbb: Enable secure monitor @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 UTC (permalink / raw) To: linus-amlogic 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 76b3b6d..092f10e 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -123,6 +123,12 @@ #size-cells = <2>; ranges; + firmware { + sm: secure-monitor { + compatible = "amlogic,meson-gxbb-sm"; + }; + }; + cbus: cbus at c1100000 { compatible = "simple-bus"; reg = <0x0 0xc1100000 0x0 0x100000>; -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v7 3/3] ARM64: dts: amlogic: gxbb: Enable secure monitor @ 2016-06-10 19:44 ` Carlo Caione 0 siblings, 0 replies; 18+ messages in thread From: Carlo Caione @ 2016-06-10 19:44 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 76b3b6d..092f10e 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -123,6 +123,12 @@ #size-cells = <2>; ranges; + firmware { + sm: secure-monitor { + compatible = "amlogic,meson-gxbb-sm"; + }; + }; + cbus: cbus at c1100000 { compatible = "simple-bus"; reg = <0x0 0xc1100000 0x0 0x100000>; -- 2.7.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2016-06-16 6:06 UTC | newest] Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-06-10 19:44 [PATCH v7 0/3] Add Amlogic secure monitor driver Carlo Caione 2016-06-10 19:44 ` Carlo Caione 2016-06-10 19:44 ` Carlo Caione [not found] ` <1465587851-24184-1-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org> 2016-06-10 19:44 ` [PATCH v7 1/3] firmware: Amlogic: Add " Carlo Caione 2016-06-10 19:44 ` Carlo Caione 2016-06-10 19:44 ` Carlo Caione [not found] ` <1465587851-24184-2-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org> 2016-06-16 6:06 ` Carlo Caione 2016-06-16 6:06 ` Carlo Caione 2016-06-16 6:06 ` Carlo Caione 2016-06-10 19:44 ` [PATCH v7 2/3] documentation: Add secure monitor binding documentation Carlo Caione 2016-06-10 19:44 ` Carlo Caione 2016-06-10 19:44 ` Carlo Caione [not found] ` <1465587851-24184-3-git-send-email-carlo-KA+7E9HrN00dnm+yROfE0A@public.gmane.org> 2016-06-14 20:10 ` Rob Herring 2016-06-14 20:10 ` Rob Herring 2016-06-14 20:10 ` Rob Herring 2016-06-10 19:44 ` [PATCH v7 3/3] ARM64: dts: amlogic: gxbb: Enable secure monitor Carlo Caione 2016-06-10 19:44 ` Carlo Caione 2016-06-10 19:44 ` Carlo Caione
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.