diff options
author | Mohammed Habibulla <moch@google.com> | 2016-01-20 14:24:35 -0800 |
---|---|---|
committer | Mohammed Habibulla <moch@google.com> | 2016-01-20 14:24:35 -0800 |
commit | f50fa4cb6f8e34cf991c5e127c6d9ce66df0844d (patch) | |
tree | c73ab4662868cb1f59cae4b6786ab013f6958b59 | |
parent | 101cccb03c4a70a328a74366c88bc6ccaafef931 (diff) | |
download | pxa-v3.14-f50fa4cb6f8e34cf991c5e127c6d9ce66df0844d.tar.gz |
abox_edge: Enable CONFIG_MRVL_TZDD for security driver.
Update marvell security drive update to date.
BUG=25833706
Change-Id: I305347e9571401ef59ee94d7bdf21cbfbaf8a5f4
17 files changed, 180 insertions, 109 deletions
diff --git a/arch/arm/configs/abox_edge_defconfig b/arch/arm/configs/abox_edge_defconfig index 0891dd31f13..5b091000a64 100644..100755 --- a/arch/arm/configs/abox_edge_defconfig +++ b/arch/arm/configs/abox_edge_defconfig @@ -3055,7 +3055,7 @@ CONFIG_MRVL_WL_SD8777=y CONFIG_MRVL_WL_BUILD_TYPE=y CONFIG_MRVL_DEBUG=n CONFIG_MRVL_LOG=n -# CONFIG_MRVL_TZDD is not set +CONFIG_MRVL_TZDD=y # CONFIG_MRVL_SW_JTAG is not set CONFIG_MRVL_PANIC_FLUSH=y # CONFIG_PXA_RAMDUMP is not set diff --git a/drivers/marvell/security/mmp-tzdd/src/Makefile b/drivers/marvell/security/mmp-tzdd/src/Makefile index dcb493b86cb..f8a98e1e473 100644 --- a/drivers/marvell/security/mmp-tzdd/src/Makefile +++ b/drivers/marvell/security/mmp-tzdd/src/Makefile @@ -14,7 +14,7 @@ TZDD_PERF_REC := N # sharedMem context checking TZDD_SHAREDMEM_CONTEXT_CHECKING := N -obj-m := tzdd.o +obj-$(CONFIG_MRVL_TZDD) := tzdd.o tzdd-objs := \ osa/osa.o \ osa/osa_atomic.o \ diff --git a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_internal.h b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_internal.h index 7d42d2880f8..1320919815f 100644..100755 --- a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_internal.h +++ b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_internal.h @@ -31,6 +31,8 @@ typedef struct { int32_t idx_read; /* res pool read index */ int32_t idx_write; /* req pool write index */ + uint32_t req_tw; /* call back request number */ + uint32_t rsp_tw; /* call back response number */ } cm_index_header_t; /* smi trap arguments */ diff --git a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_misc_ntw.c b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_misc_ntw.c index 9691230b996..851cb2323b1 100644 --- a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_misc_ntw.c +++ b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_misc_ntw.c @@ -75,3 +75,17 @@ inline void _cm_update_out_write_idx(int32_t idx) return; } + +inline uint32_t _cm_get_cb_req_num(void) +{ + cm_index_header_t *in_head = (cm_index_header_t*)in_header; + + return in_head->req_tw; +} + +inline uint32_t _cm_get_cb_rsp_num(void) +{ + cm_index_header_t *in_head = (cm_index_header_t*)in_header; + + return in_head->rsp_tw; +} diff --git a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_ntw.c b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_ntw.c index c3f1eba9c92..70d4854b632 100644 --- a/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_ntw.c +++ b/drivers/marvell/security/mmp-tzdd/src/comm/ntw/tee_cm_ntw.c @@ -45,6 +45,9 @@ extern void cm_call_smi(void *arg); extern int32_t _cm_get_out_write_idx(void); extern void _cm_update_out_write_idx(int32_t idx); +extern uint32_t _cm_get_cb_req_num(void); +extern uint32_t _cm_get_cb_rsp_num(void); + /* get out empty size */ uint32_t _out_empty_size(void) { @@ -218,3 +221,13 @@ void tee_cm_get_msgm_head(void *msg_head) return; } + +uint32_t tee_cm_get_cb_req_num(void) +{ + return _cm_get_cb_req_num(); +} + +uint32_t tee_cm_get_cb_rsp_num(void) +{ + return _cm_get_cb_rsp_num(); +} diff --git a/drivers/marvell/security/mmp-tzdd/src/dbg/ntw/tee_dbg_log.c b/drivers/marvell/security/mmp-tzdd/src/dbg/ntw/tee_dbg_log.c index 20c0fc81668..f0876fc5a1f 100644 --- a/drivers/marvell/security/mmp-tzdd/src/dbg/ntw/tee_dbg_log.c +++ b/drivers/marvell/security/mmp-tzdd/src/dbg/ntw/tee_dbg_log.c @@ -20,10 +20,10 @@ #include <linux/proc_fs.h> #include <linux/seq_file.h> -#define _TEE_DBG_PROC_LOG_TMP_BUF_SZ (255) /* max size of string */ -#define _TEE_DBG_PROC_LOG_BUF_SZ \ - (0x80000 - _TEE_DBG_PROC_LOG_TMP_BUF_SZ - sizeof(tee_dbg_log_t)) -#define _TEE_DBG_PROC_ENABLE (0x55aa55aa) +#define _TEE_DBG_PROC_LEVEL0 (0x00000000) +#define _TEE_DBG_PROC_LEVEL1 (0x55aa55aa) +#define _TEE_DBG_PROC_LEVEL2 (0x66bb66bb) +#define _TEE_DBG_PROC_LEVEL3 (0x77cc77cc) #define IS_DBG_PROC_MAGIC_VALID(_m) \ (('P' == _m[0]) && \ @@ -31,71 +31,79 @@ ('O' == _m[2]) && \ ('c' == _m[3])) +#define INIT_DBG_PROC_CTRL_MAGIC(_m) do { \ + _m[0] = 'C'; \ + _m[1] = 't'; \ + _m[2] = 'R'; \ + _m[3] = 'l'; \ + } while (0) + typedef struct _tee_dbg_log_t { uint8_t magic[4]; uint32_t write_offset; - uint32_t round; - bool round_rollback; + uint64_t round; + uint32_t log_buf_sz; } tee_dbg_log_t; typedef struct _tee_dbg_log_ctl_t { - volatile uint32_t enable; + volatile uint8_t magic[4]; + volatile uint32_t level; } tee_dbg_log_ctl_t; static tee_dbg_log_t *_g_tee_dbg_log_header; static tee_dbg_log_ctl_t *_g_tee_dbg_log_ctl_header; static uint8_t *_g_tee_dbg_log_buf; +static uint32_t _g_tee_dbg_log_buf_sz; void tee_dbg_log_init(ulong_t buffer, ulong_t ctl) { _g_tee_dbg_log_header = (tee_dbg_log_t *) buffer; _g_tee_dbg_log_ctl_header = (tee_dbg_log_ctl_t *) ctl; _g_tee_dbg_log_buf = (uint8_t *) (_g_tee_dbg_log_header + 1); - printk(KERN_ERR "proc log buf: %lx, ctl: %lx\n", buffer, ctl); + + if (!IS_DBG_PROC_MAGIC_VALID(_g_tee_dbg_log_header->magic)) { + printk(KERN_ERR "proc log invalid magic\n"); + return; + } + _g_tee_dbg_log_buf_sz = _g_tee_dbg_log_header->log_buf_sz; + + INIT_DBG_PROC_CTRL_MAGIC(_g_tee_dbg_log_ctl_header->magic); + + printk(KERN_ERR "proc log buf: 0x%lx, size: 0x%x, ctl: 0x%lx\n", + buffer, _g_tee_dbg_log_buf_sz, ctl); + return; } static uint32_t g_snapshot_write_offset; -static uint32_t g_snapshot_round; -static uint32_t g_snapshot_round_rollback; -static uint32_t g_read_round; +static uint64_t g_snapshot_round; +static uint64_t g_read_round; static uint32_t g_read_offset; static uint32_t g_read_count; -static bool g_proc_log_eanbled; +static uint32_t g_proc_log_level; static void *log_seq_start(struct seq_file *s, loff_t *pos) { g_snapshot_write_offset = _g_tee_dbg_log_header->write_offset; g_snapshot_round = _g_tee_dbg_log_header->round; - g_snapshot_round_rollback = _g_tee_dbg_log_header->round_rollback; - if (!IS_DBG_PROC_MAGIC_VALID(_g_tee_dbg_log_header->magic)) + if ((!IS_DBG_PROC_MAGIC_VALID(_g_tee_dbg_log_header->magic)) || + (!_g_tee_dbg_log_buf_sz)) return NULL; if (g_read_round == g_snapshot_round - && g_read_offset == g_snapshot_write_offset) + && g_read_offset == g_snapshot_write_offset) /* nothing to read */ return NULL; - if (g_snapshot_round_rollback) { - if (g_snapshot_round != 0 || - g_snapshot_round != 0xFFFFFFFF || - g_snapshot_write_offset > g_read_offset) { - seq_printf(s, - "=========================rollback==========================\n"); - g_read_offset = g_snapshot_write_offset; - g_read_round = g_snapshot_round - 1; - g_snapshot_round_rollback = false; - } - } else { - if (g_snapshot_round > g_read_round + 1 || - (g_snapshot_round == g_read_round + 1 - && g_snapshot_write_offset > g_read_offset)) { - g_read_offset = g_snapshot_write_offset; - g_read_round = g_snapshot_round - 1; - seq_printf(s, - "--------------------------rollback--------------------------\n"); - } + if ((g_snapshot_round > g_read_round + 1) || + (g_snapshot_round == g_read_round + 1 + && g_snapshot_write_offset > g_read_offset)) { + g_read_offset = g_snapshot_write_offset; + g_read_round = g_snapshot_round - 1; + seq_printf(s, + "--------------------------rollback--------------------------\n"); } + g_read_count = s->count; return _g_tee_dbg_log_buf + g_read_offset; @@ -103,15 +111,11 @@ static void *log_seq_start(struct seq_file *s, loff_t *pos) static void *log_seq_next(struct seq_file *s, void *v, loff_t *pos) { - g_read_offset += s->count - g_read_count + 1; - if (g_read_offset > _TEE_DBG_PROC_LOG_BUF_SZ) { - g_read_offset -= _TEE_DBG_PROC_LOG_BUF_SZ; - g_read_round++; - } g_read_count = s->count; - if ((g_read_round == g_snapshot_round - && g_read_offset >= g_snapshot_write_offset) - || g_read_round > g_snapshot_round) + + if (g_read_round == g_snapshot_round + && g_read_offset == g_snapshot_write_offset) + /* nothing to read */ return NULL; return _g_tee_dbg_log_buf + g_read_offset; @@ -124,8 +128,20 @@ static void log_seq_stop(struct seq_file *s, void *v) static int log_seq_show(struct seq_file *s, void *v) { - seq_printf(s, "%s", (int8_t *) v); - return 0; + int ret; + ret = seq_printf(s, "%s", (int8_t *) v); + if (ret) { + /* over flow */ + } else { + g_read_offset += s->count - g_read_count + 1; + } + + if (g_read_offset > _g_tee_dbg_log_buf_sz) { + g_read_offset -= _g_tee_dbg_log_buf_sz; + g_read_round++; + } + + return ret; } static const struct seq_operations log_seq_ops = { @@ -150,8 +166,7 @@ static const struct file_operations log_file_ops = { static int ctl_seq_show(struct seq_file *m, void *v) { - seq_printf(m, "tee proc log %s\n", - g_proc_log_eanbled ? "enabled" : "disabled"); + seq_printf(m, "tee proc log level %d\n", g_proc_log_level); return 0; } @@ -167,17 +182,25 @@ static ssize_t ctl_write(struct file *file, const char *buf, get_user(val, buf); switch (val) { + case '0': + _g_tee_dbg_log_ctl_header->level = _TEE_DBG_PROC_LEVEL0; + g_proc_log_level = 0; + break; case '1': - _g_tee_dbg_log_ctl_header->enable = _TEE_DBG_PROC_ENABLE; - g_proc_log_eanbled = true; + _g_tee_dbg_log_ctl_header->level = _TEE_DBG_PROC_LEVEL1; + g_proc_log_level = 1; break; - case '0': - _g_tee_dbg_log_ctl_header->enable = 0; - g_proc_log_eanbled = false; + case '2': + _g_tee_dbg_log_ctl_header->level = _TEE_DBG_PROC_LEVEL2; + g_proc_log_level = 2; + break; + case '3': + _g_tee_dbg_log_ctl_header->level = _TEE_DBG_PROC_LEVEL3; + g_proc_log_level = 3; break; default: - printk(KERN_ERR "value should be 1 or 0\n"); - return 0; + printk(KERN_ERR "value should be 0/1/2/3\n"); + return count; } return count; diff --git a/drivers/marvell/security/mmp-tzdd/src/inc/tee_cm.h b/drivers/marvell/security/mmp-tzdd/src/inc/tee_cm.h index f7b1777a2ba..d49dfcd1f1f 100644 --- a/drivers/marvell/security/mmp-tzdd/src/inc/tee_cm.h +++ b/drivers/marvell/security/mmp-tzdd/src/inc/tee_cm.h @@ -38,6 +38,11 @@ extern void tee_cm_recv_data(uint8_t *buf); extern void tee_cm_smi(uint32_t flag); extern void tee_cm_get_msgm_head(void *msg_head); +extern uint32_t tee_cm_get_cb_req_num(void); +extern uint32_t tee_cm_get_cb_rsp_num(void); +extern void tee_cm_update_cb_req_num(uint32_t req_tw); +extern void tee_cm_update_cb_rsq_num(uint32_t rsp_tw); + /* read RB phys address */ static inline uint32_t _read_rb_phys_addr(void) { diff --git a/drivers/marvell/security/mmp-tzdd/src/main/teec_cb.c b/drivers/marvell/security/mmp-tzdd/src/main/teec_cb.c index 5d464270239..6ef71fee8a5 100644 --- a/drivers/marvell/security/mmp-tzdd/src/main/teec_cb.c +++ b/drivers/marvell/security/mmp-tzdd/src/main/teec_cb.c @@ -253,6 +253,7 @@ teec_cb_handle_t teec_reg_cb(const teec_cb_uuid_t *uuid, attr.prio = 0; /* highest prio */ attr.stack_addr = NULL; /* not used */ attr.stack_size = 0; /* not used */ + attr.flags = OSA_PF_FREEZER_SKIP; cb->worker = osa_create_thread(_teec_cb_worker, cb, &attr); OSA_ASSERT(cb->worker); diff --git a/drivers/marvell/security/mmp-tzdd/src/main/teec_client_api.c b/drivers/marvell/security/mmp-tzdd/src/main/teec_client_api.c index 7aa8c6565d1..40173959280 100644 --- a/drivers/marvell/security/mmp-tzdd/src/main/teec_client_api.c +++ b/drivers/marvell/security/mmp-tzdd/src/main/teec_client_api.c @@ -807,6 +807,7 @@ TEEC_Result TEEC_OpenSession(TEEC_Context *context, unsigned long flags; local_irq_save(flags); current->flags |= PF_NOFREEZE; + current->flags |= PF_FREEZER_SKIP; local_irq_restore(flags); } break; diff --git a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_internal.h b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_internal.h index 57b57513539..76de7e36ffe 100644 --- a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_internal.h +++ b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_internal.h @@ -42,6 +42,7 @@ #include <linux/atomic.h> #include <linux/compat.h> #include <linux/uidgid.h> +#include <linux/sched.h> #include "tee_mrvl_imp.h" #include "tee_client_api.h" diff --git a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_main.c b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_main.c index 3a1dc80f3bf..44ba47b8d59 100644 --- a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_main.c +++ b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_main.c @@ -28,11 +28,11 @@ MODULE_LICENSE("GPL"); */ #ifdef TEE_RES_CFG_16M -#define TZDD_VERSION "TEEC Drvier Version 1.1.4 16MB, kernel_3_10/3_14" +#define TZDD_VERSION "TEEC Drvier Version 1.1.10 16MB, kernel_3_10/3_14" #elif defined(TEE_RES_CFG_24M) -#define TZDD_VERSION "TEEC Drvier Version 1.1.4 24MB, kernel_3_10/3_14" +#define TZDD_VERSION "TEEC Drvier Version 1.1.10 24MB, kernel_3_10/3_14" #else -#define TZDD_VERSION "TEEC Drvier Version 1.1.4, kernel_3_10/3_14" +#define TZDD_VERSION "TEEC Drvier Version 1.1.10, kernel_3_10/3_14" #endif #define TZDD_DRV_NAME "tzdd" diff --git a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_pt.c b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_pt.c index a71a4e83daf..0b69fa7f206 100644 --- a/drivers/marvell/security/mmp-tzdd/src/main/tzdd_pt.c +++ b/drivers/marvell/security/mmp-tzdd/src/main/tzdd_pt.c @@ -20,19 +20,20 @@ #include "tzdd_internal.h" #include "tzdd_pt_core.h" +extern uint32_t tee_cm_get_cb_req_num(void); +extern uint32_t tee_cm_get_cb_rsp_num(void); + #ifdef CONFIG_64BIT -#define CALL_SMC (0x72000000) -#define CALL_IPI (0x73000000) +#define CALL_SMC (0x72000000) +#define CALL_IPI (0x73000000) #else -#define CALL_SMC (0x33000000) -#define CALL_IPI (0x34000000) +#define CALL_SMC (0x33000000) +#define CALL_IPI (0x34000000) #endif static uint32_t _g_tzdd_send_num; static bool _g_pt_thread_stop_flag; -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG - uint32_t g_msg_sent; uint32_t g_msg_recv; uint32_t g_msg_fake; @@ -42,8 +43,6 @@ uint32_t g_pst_ipi_num; uint32_t g_pre_dmy_num; uint32_t g_pst_dmy_num; -#endif /* TEE_DEBUG_ENALBE_PROC_FS_LOG */ - static int tzdd_proxy_thread(void *data) { tzdd_dev_t *dev; @@ -61,6 +60,7 @@ static int tzdd_proxy_thread(void *data) set_cpus_allowed_ptr(current, cpumask_of(0)); TZDD_DBG("tzdd_proxy_thread on cpu %d\n", smp_processor_id()); + current->flags |= PF_FREEZER_SKIP; nice = task_nice(current); TZDD_DBG("tzdd_proxy_thread: nice = %d\n", nice); @@ -96,19 +96,13 @@ static int tzdd_proxy_thread(void *data) } tee_add_time_record_point("npct"); /* Call IPI to TW */ -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG g_pre_ipi_num++; -#endif tee_cm_smi(CALL_IPI); -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG g_pst_ipi_num++; -#endif tee_add_time_record_point("npbt"); _g_tzdd_send_num++; -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG g_msg_sent++; -#endif } res_size = tee_cm_get_data_size(); @@ -118,33 +112,27 @@ static int tzdd_proxy_thread(void *data) msg_flag = tzdd_pt_recv(); if (msg_flag == TEE_MSG_IGNORE_COUNTER) { /* do nothing */ -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG g_msg_ignd++; -#endif } else { /* TEE_MSG_FAKE && TEE_MSG_NORMAL */ -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG if (TEE_MSG_NORMAL == msg_flag) g_msg_recv++; else if (TEE_MSG_FAKE == msg_flag) g_msg_fake++; else OSA_ASSERT(0); -#endif _g_tzdd_send_num--; } res_size = tee_cm_get_data_size(); } tee_add_time_record_point("nprm"); - if (_g_tzdd_send_num) { -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG - g_pre_dmy_num++; -#endif - tee_cm_smi(CALL_SMC); -#ifdef TEE_DEBUG_ENALBE_PROC_FS_LOG - g_pst_dmy_num++; -#endif - } else { + /* + * all the requests are trapped in the callbacks in secure world. + * requests from secure world are all served by PT. + * */ + if (0 ==_g_tzdd_send_num || + ((_g_tzdd_send_num == (tee_cm_get_cb_req_num() - tee_cm_get_cb_rsp_num())) + && (tee_cm_get_cb_req_num() == g_msg_ignd))) { /* release D1P LPM constraint */ if (true == is_lpm_blocked) { pm_qos_update_request(&(dev->tzdd_lpm_cons), @@ -162,6 +150,11 @@ static int tzdd_proxy_thread(void *data) break; } tee_add_time_record_point("npet"); + } else { + g_pre_dmy_num++; + + tee_cm_smi(CALL_SMC); + g_pst_dmy_num++; } } diff --git a/drivers/marvell/security/mmp-tzdd/src/msgm/ntw/tee_msgm_op_internal.h b/drivers/marvell/security/mmp-tzdd/src/msgm/ntw/tee_msgm_op_internal.h index 6294d834d3b..e2ac96de929 100644 --- a/drivers/marvell/security/mmp-tzdd/src/msgm/ntw/tee_msgm_op_internal.h +++ b/drivers/marvell/security/mmp-tzdd/src/msgm/ntw/tee_msgm_op_internal.h @@ -41,15 +41,22 @@ extern const char cmd_magic[]; /* for translate cmd idx */ #define TEE_TW_SUB_CMD_SIZE (8) #define TEE_TW_PREM_CMD_MASK ((1 << (32 - TEE_TW_SUB_CMD_SIZE)) - 1) + /* for parameters */ #define PARAM_NUMBERS (4) -#define IS_TYPE_NONE(_m) (0x0 == (_m)) -#define IS_TYPE_VALUE(_m) ((_m) >= 0x1 && (_m) <= 0x3) -#define IS_TYPE_TMPREF(_m) ((_m) >= 0x5 && (_m) <= 0x7) -#define IS_TYPE_MEMREF(_m) ((_m) >= 0xc && (_m) <= 0xf) -/* common macro */ -#define IS_PARAM_TAGED_INPUT(_m) (((_m) & 0x1) == 0x1) -#define IS_PARAM_TAGED_OUTPUT(_m) (((_m) & 0x2) == 0x2) +#define IS_TYPE_NONE(_m) (TEEC_NONE == (_m)) +#define IS_TYPE_VALUE(_m) ((_m) >= TEEC_VALUE_INPUT && (_m) <= TEEC_VALUE_INOUT) +/* + * shared memory in secure world is treated as + * the tmpref memory in non-secure world + */ +#define IS_TYPE_TMPREF(_m) ((_m) >= TEEC_MEMREF_TEMP_INPUT && (_m) <= TEEC_MEMREF_TEMP_INOUT) +#define IS_TYPE_MEMREF(_m) ((_m) >= TEEC_MEMREF_WHOLE && (_m) <= TEEC_MEMREF_PARTIAL_INOUT) + +/* memory in/out */ +#define IS_PARAM_TAGED_INPUT(_m) (((_m) & TEEC_MEM_INPUT) == TEEC_MEM_INPUT) +#define IS_PARAM_TAGED_OUTPUT(_m) (((_m) & TEEC_MEM_OUTPUT) == TEEC_MEM_OUTPUT) + #define OFFSETOF(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) /* vvv cmd_body struct vvv */ diff --git a/drivers/marvell/security/mmp-tzdd/src/osa/include/osa_thread.h b/drivers/marvell/security/mmp-tzdd/src/osa/include/osa_thread.h index 0b018924022..faba46eac36 100644 --- a/drivers/marvell/security/mmp-tzdd/src/osa/include/osa_thread.h +++ b/drivers/marvell/security/mmp-tzdd/src/osa/include/osa_thread.h @@ -36,11 +36,14 @@ #define OSA_THRD_PRIO_ABOVE_IDLE (6) #define OSA_THRD_PRIO_IDLE (7) +#define OSA_PF_FREEZER_SKIP PF_FREEZER_SKIP /* Freezer should not count it as freezable */ + struct osa_thread_attr { uint8_t *name; uint32_t prio; void *stack_addr; uint32_t stack_size; + uint32_t flags; }; /* for OSA in secure world */ diff --git a/drivers/marvell/security/mmp-tzdd/src/osa/osa_mem.c b/drivers/marvell/security/mmp-tzdd/src/osa/osa_mem.c index f42318dbb81..8376a75d362 100644 --- a/drivers/marvell/security/mmp-tzdd/src/osa/osa_mem.c +++ b/drivers/marvell/security/mmp-tzdd/src/osa/osa_mem.c @@ -134,13 +134,15 @@ void __kernel *osa_kmem_alloc(uint32_t size) OSA_ASSERT(size); if (size < OSA_128K) - return kmalloc(size, GFP_KERNEL); + return (void __kernel *)kmalloc(size, GFP_KERNEL); else if (size <= KMEM_ALLOC_MAX_SIZE) { struct page *page; struct _pages_record *record; void __kernel *ret; - record = kmalloc(sizeof(struct _pages_record), GFP_KERNEL); + record = + (struct _pages_record *) + kmalloc(sizeof(struct _pages_record), GFP_KERNEL); if (!record) { osa_dbg_print(DBG_ERR, "ERROR - failed to alloc a page record in osa_kmem_alloc\n"); @@ -296,7 +298,9 @@ void __kernel *osa_pages_alloc(uint32_t nr) void *phys; uint32_t i; - record = kmalloc(sizeof(struct _pages_record), GFP_KERNEL); + record = + (struct _pages_record *) + kmalloc(sizeof(struct _pages_record), GFP_KERNEL); if (!record) { osa_dbg_print(DBG_ERR, "ERROR - failed to alloc a page record in osa_pages_alloc\n"); @@ -318,8 +322,8 @@ void __kernel *osa_pages_alloc(uint32_t nr) * remap_pfn_range works in the condition of * PageReserved is set. */ - phys = (void *)(unsigned long) - __virt_to_phys((unsigned long)ret); + phys = (void *)(ulong_t) + __virt_to_phys((ulong_t)ret); for (i = 0; i < nr; i++) { SetPageReserved(pfn_to_page (((ulong_t) phys >> PAGE_SHIFT) + i)); @@ -372,7 +376,8 @@ void osa_pages_free(void __kernel *addr) OSA_ASSERT(ptr != &_g_alloc_pages_list); - phys = (void *)(unsigned long)__virt_to_phys((unsigned long)addr); + phys = (void *)(ulong_t) + __virt_to_phys((ulong_t)addr); nr = record->size >> PAGE_SHIFT; for (i = 0; i < nr; i++) { ClearPageReserved(pfn_to_page @@ -519,8 +524,8 @@ void *osa_alloc_phys_mem(uint32_t size, bool is_cached, uint32_t alignment, *phys = NULL; return NULL; } - alloc_phys_addr = (void *)(unsigned long) - __virt_to_phys((unsigned long)alloc_virt_addr); + alloc_phys_addr = (void *)(ulong_t) + __virt_to_phys((ulong_t)alloc_virt_addr); } else { alloc_virt_addr = dma_alloc_coherent(NULL, mem_blk_size, @@ -741,6 +746,7 @@ static osa_err_t _virt_to_phys_by_pg_mapping_ex(struct mm_struct *mm, pmd_t *pmd; pte_t *pte; ulong_t pfn; + #ifdef CONFIG_64BIT uint64_t mair; #else @@ -1034,7 +1040,7 @@ void *osa_virt_to_phys_ex(void *virt_addr, bool *cacheable) if (virt_addr < high_memory && (ulong_t) virt_addr >= PAGE_OFFSET) { *cacheable = true; - return (void *)(unsigned long) + return (void *)(ulong_t) __virt_to_phys((ulong_t)virt_addr); } else { ret = _osa_virt_to_phys_by_cp15_ex((ulong_t)virt_addr, cacheable, &pa); diff --git a/drivers/marvell/security/mmp-tzdd/src/osa/osa_sync.c b/drivers/marvell/security/mmp-tzdd/src/osa/osa_sync.c index c92620070cd..f579be15366 100644 --- a/drivers/marvell/security/mmp-tzdd/src/osa/osa_sync.c +++ b/drivers/marvell/security/mmp-tzdd/src/osa/osa_sync.c @@ -261,6 +261,7 @@ osa_err_t osa_wait_for_sem(osa_sem_t handle, int32_t msec) } down(&(sem->sem)); + sem_up = true; if (msec > 0) @@ -401,19 +402,17 @@ osa_err_t osa_wait_for_sem(osa_sem_t handle, int32_t msec) OSA_ASSERT(sem && IS_SEM_VALID(sem)); if (0 == msec) { - ret = down_trylock(&(sem->sem)); - if (ret) + if (ret) { return OSA_SEM_WAIT_FAILED; - else + } else { return OSA_OK; - + } } else if (msec > 0) { - ret = down_timeout(&(sem->sem), (msec * HZ + 500) / 1000); - if (ret < 0) + if (ret < 0) { return OSA_SEM_WAIT_TO; - + } } else down(&(sem->sem)); @@ -491,7 +490,7 @@ static osa_mutex_t _osa_create_mutex(uint32_t init_val) mutex = kmalloc(sizeof(struct _mutex), GFP_KERNEL); if (!mutex) { osa_dbg_print(DBG_ERR, - "ERROR - failed to kmalloc in osa_create_mutex\n"); + "ERROR - failed to kmalloc in osa_create_mutex\n"); return NULL; } diff --git a/drivers/marvell/security/mmp-tzdd/src/osa/osa_thread.c b/drivers/marvell/security/mmp-tzdd/src/osa/osa_thread.c index f3859c1ad33..a263e6702e5 100644 --- a/drivers/marvell/security/mmp-tzdd/src/osa/osa_thread.c +++ b/drivers/marvell/security/mmp-tzdd/src/osa/osa_thread.c @@ -212,6 +212,9 @@ osa_thread_t osa_create_thread(void (*func) (void *), void *arg, return ret; } + if (attr->flags & OSA_PF_FREEZER_SKIP) + ret->task->flags |= attr->flags; + while (_THREAD_UNKNOWN == ret->status) yield(); |