From 4b236df7c4e74fb90b6f7331a9457e8cf7302538 Mon Sep 17 00:00:00 2001 From: Zhongfu Luo Date: Fri, 7 Dec 2018 17:26:52 +0800 Subject: [PATCH] defendkey: G12A: support secure upgrade check [3/4] PD#SWPL-2347 Problem: G12A need to support secure upgrade check Solution: 1.modify reserve memory mode 2.only use cpu0 in defendkey write process Verify: G12A skt board verify pass Change-Id: Iad771381e959a79dcba7a0adb862295fa5ba5dee Signed-off-by: Zhongfu Luo --- drivers/amlogic/defendkey/defendkey.c | 43 ++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/drivers/amlogic/defendkey/defendkey.c b/drivers/amlogic/defendkey/defendkey.c index 6fabe80767e4..1a7162326793 100644 --- a/drivers/amlogic/defendkey/defendkey.c +++ b/drivers/amlogic/defendkey/defendkey.c @@ -35,13 +35,20 @@ #include #include #include "securekey.h" +#include #define DEFENDKEY_DEVICE_NAME "defendkey" #define DEFENDKEY_CLASS_NAME "defendkey" void __iomem *mem_base_virt; unsigned long mem_size; unsigned long random_virt; -static struct reserved_mem defendkey_rmem; + +struct defendkey_mem { + unsigned long base; + unsigned long size; +}; + +struct defendkey_mem defendkey_rmem; #define CMD_SECURE_CHECK _IO('d', 0x01) #define CMD_DECRYPT_DTB _IO('d', 0x02) @@ -170,7 +177,10 @@ static ssize_t defendkey_write(struct file *file, unsigned long mem_base_phy, copy_base, copy_size; uint64_t option = 0, random = 0, option_random = 0; int i; + struct cpumask task_cpumask; + cpumask_copy(&task_cpumask, ¤t->cpus_allowed); + set_cpus_allowed_ptr(current, cpumask_of(0)); mem_base_phy = defendkey_rmem.base; mem_base_virt = phys_to_virt(mem_base_phy); @@ -257,6 +267,7 @@ static ssize_t defendkey_write(struct file *file, ret_value = ret_success; } exit: + set_cpus_allowed_ptr(current, &task_cpumask); return ret_value; } @@ -343,17 +354,35 @@ static struct class defendkey_class = { .class_attrs = defendkey_class_attrs, }; -static int __init rmem_defendkey_setup(struct reserved_mem *rmem) +static int __init early_defendkey_para(char *buf) { - defendkey_rmem.base = rmem->base; - defendkey_rmem.size = rmem->size; + int ret; - pr_info("Reserved memory: created defendkey at 0x%p, size %ld MiB\n", - (void *)rmem->base, (unsigned long)rmem->size / SZ_1M); + if (!buf) + return -EINVAL; + + ret = sscanf(buf, "%lx,%lx", + &defendkey_rmem.base, &defendkey_rmem.size); + if (ret != 2) { + pr_err("invalid boot args \"defendkey\"\n"); + return -EINVAL; + } + + pr_info("%s, base:%lx, size:%lx\n", + __func__, defendkey_rmem.base, defendkey_rmem.size); + + ret = memblock_reserve(defendkey_rmem.base, + PAGE_ALIGN(defendkey_rmem.size)); + if (ret < 0) { + pr_info("reserve memblock %lx - %lx failed\n", + defendkey_rmem.base, + defendkey_rmem.base + PAGE_ALIGN(defendkey_rmem.size)); + return -EINVAL; + } return 0; } -RESERVEDMEM_OF_DECLARE(defendkey, "amlogic, defendkey", rmem_defendkey_setup); +early_param("defendkey", early_defendkey_para); static int aml_defendkey_probe(struct platform_device *pdev) {