[FOSS_TLK]security: tlk: add device tree support
Varun Wadekar [Mon, 17 Nov 2014 05:10:40 +0000 (10:10 +0530)]
Control the driver loading sequence from the device tree. Logger
and storage can also be controlled from the device tree now. There
is no need for CONFIG_OTE_LOGGER moving on.

Change-Id: I91de33462d6df288265c810af9cf3eab66c27c2d
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/755005
Reviewed-by: Automatic_Commit_Validation_User

security/tlk_driver/Kconfig
security/tlk_driver/ote_device.c
security/tlk_driver/ote_fs.c
security/tlk_driver/ote_log.c
security/tlk_driver/ote_protocol.h

index d43c17e..9f2c15d 100644 (file)
@@ -13,10 +13,3 @@ config TRUSTED_LITTLE_KERNEL
          This option adds kernel support for communication with the
          Trusted LK secure OS monitor/runtime support.
          If you are unsure how to answer this question, answer N.
-
-config OTE_ENABLE_LOGGER
-       bool "Enable TLK logs in linux kmsg"
-       depends on TRUSTED_LITTLE_KERNEL
-       help
-        This option adds support in the kernel driver to read the logs
-        from the secure world and make them available as a part of kmsg.
index 6045ea2..8fe6ccd 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/outercache.h>
 #include <linux/list.h>
 #include <linux/dma-mapping.h>
+#include <linux/of.h>
 
 #include "ote_protocol.h"
 
@@ -492,10 +493,28 @@ struct miscdevice tlk_misc_device = {
        .fops = &tlk_device_fops,
 };
 
+static struct device_node *get_tlk_device_node(void)
+{
+       struct device_node *node;
+
+       node = of_find_compatible_node(NULL, NULL,
+                       "nvidia,trusted-little-kernel");
+       if (!node)
+               pr_info("TLK node not present in the FDT\n");
+
+       return node;
+}
+
 static int __init tlk_init(void)
 {
        int ret;
 
+       /* check if the driver node is present in the device tree */
+       if (get_tlk_device_node() == NULL) {
+               pr_err("%s: fail\n", __func__);
+               return -ENODEV;
+       }
+
        INIT_LIST_HEAD(&(tlk_dev.used_cmd_list));
        INIT_LIST_HEAD(&(tlk_dev.free_cmd_list));
 
@@ -507,3 +526,26 @@ static int __init tlk_init(void)
 }
 
 module_init(tlk_init);
+
+int ote_property_is_disabled(const char *str)
+{
+       struct device_node *tlk;
+       const char *prop;
+
+       /* check if the driver node is present in the device tree */
+       tlk = get_tlk_device_node();
+       if (!tlk) {
+               pr_err("%s: fail\n", __func__);
+               return -ENODEV;
+       }
+
+       if (of_property_read_string(tlk, str, &prop)) {
+               pr_warn("missing \"%s\" property\n", str);
+               return -ENXIO;
+       }
+
+       if (strcmp("enabled", prop))
+               return -ENOTSUPP;
+
+       return 0;
+}
index 741c1c9..8849879 100644 (file)
@@ -76,7 +76,14 @@ void tlk_ss_op(void)
 static int __init tlk_ss_init(void)
 {
        dma_addr_t ss_op_shmem_dma;
-       int32_t ret;
+       int ret;
+
+       /* storage disabled? */
+       ret = ote_property_is_disabled("storage");
+       if (ret) {
+               pr_err("%s: fail (%d)\n", __func__, ret);
+               return ret;
+       }
 
        /* allocate shared memory buffer */
        ss_op_shmem = dma_alloc_coherent(NULL, sizeof(struct te_ss_op),
index 0e8f6b2..d884060 100644 (file)
@@ -40,8 +40,6 @@ struct circular_buffer {
        char *buf;
 };
 
-#if defined(CONFIG_OTE_ENABLE_LOGGER)
-
 static int ote_logging_enabled;
 struct circular_buffer *cb;
 
@@ -167,9 +165,6 @@ void ote_print_logs(void)
        cb->start = cb->end;
        kfree(buffer);
 }
-#else
-void ote_print_logs(void) {}
-#endif
 
 /*
  * Call function to initialize circular buffer.
@@ -179,8 +174,23 @@ void ote_print_logs(void) {}
 static int __init ote_logger_init(void)
 {
        uintptr_t smc_args[MAX_EXT_SMC_ARGS];
+       int ret;
+
+       /* logger disabled? */
+       ret = ote_property_is_disabled("logger");
+       if (ret == -ENODEV) {
+               /* TLK device node is absent */
+               pr_err("%s: fail (%d)\n", __func__, ret);
+               return ret;
+       } else if (ret == -ENOTSUPP) {
+               /* Node is present, but logger is disabled */
+               smc_args[0] = TE_SMC_INIT_LOGGER;
+               smc_args[1] = 0;
+               tlk_generic_smc(smc_args[0], smc_args[1], 0);
+
+               return ret;
+       }
 
-#if defined(CONFIG_OTE_ENABLE_LOGGER)
        if (circ_buf_init(&cb) != 0)
                return -1;
 
@@ -192,11 +202,6 @@ static int __init ote_logger_init(void)
                ote_logging_enabled = 1;
 
        ote_print_logs();
-#else
-       smc_args[0] = TE_SMC_INIT_LOGGER;
-       smc_args[1] = 0;
-       tlk_generic_smc(smc_args[0], smc_args[1], 0);
-#endif
 
        return 0;
 }
index b6256b8..fc9048b 100644 (file)
@@ -243,5 +243,6 @@ int te_handle_ss_ioctl(struct file *file, unsigned int ioctl_num,
                unsigned long ioctl_param);
 void ote_print_logs(void);
 void tlk_ss_op(void);
+int ote_property_is_disabled(const char *str);
 
 #endif