unifykey: fix bug for read/write efuse key
authorZhongfu Luo <zhongfu.luo@amlogic.com>
Fri, 13 Jul 2018 10:21:59 +0000 (18:21 +0800)
committerYixun Lan <yixun.lan@amlogic.com>
Fri, 13 Jul 2018 10:52:44 +0000 (03:52 -0700)
PD#168551: need to use unifykey to read/write efuse key

1.fix efuse config name to CONFIG_AMLOGIC_EFUSE
2.add correct efuse key read funciton

Change-Id: I415f1b68d5de090220b1bd96db299452af176626
Signed-off-by: Zhongfu Luo <zhongfu.luo@amlogic.com>
drivers/amlogic/efuse/efuse64.c
drivers/amlogic/unifykey/unifykey.c
include/linux/amlogic/efuse.h

index de552e7ec680a99e719bb9a1ac0d82c7e664b0b4..f1a5c7a4cd30a69db3d1d82fd3d453a31297b5cf 100644 (file)
@@ -309,6 +309,11 @@ ssize_t efuse_user_attr_store(char *name, const char *buf, size_t count)
        }
 
        local_buf = kzalloc(sizeof(char)*(count), GFP_KERNEL);
+       if (!local_buf) {
+               ret = -ENOMEM;
+               pr_err("efuse: failed to allocate memory!\n");
+               return ret;
+       }
 
        memcpy(local_buf, buf, count);
 
@@ -367,6 +372,12 @@ ssize_t efuse_user_attr_show(char *name, char *buf)
        }
 
        local_buf = kzalloc(sizeof(char)*(info.size), GFP_KERNEL);
+       if (!local_buf) {
+               ret = -ENOMEM;
+               pr_err("efuse: failed to allocate memory!\n");
+               return ret;
+       }
+
        memset(local_buf, 0, info.size);
 
        pos = ((loff_t)(info.offset)) & 0xffffffff;
@@ -394,6 +405,44 @@ error_exit:
        return ret;
 }
 
+ssize_t efuse_user_attr_read(char *name, char *buf)
+{
+       char *local_buf;
+       ssize_t ret;
+       struct efusekey_info info;
+       loff_t pos;
+
+       if (efuse_getinfo(name, &info) < 0) {
+               pr_err("%s is not found\n", name);
+               return -EFAULT;
+       }
+
+       local_buf = kzalloc(sizeof(char)*(info.size), GFP_KERNEL);
+       if (!local_buf) {
+               ret = -ENOMEM;
+               pr_err("efuse: failed to allocate memory!\n");
+               return ret;
+       }
+
+       memset(local_buf, 0, info.size);
+
+       pos = ((loff_t)(info.offset)) & 0xffffffff;
+       ret = efuse_read_usr(local_buf, info.size, &pos);
+       if (ret == -1) {
+               pr_err("ERROR: efuse read user data fail!\n");
+               goto error_exit;
+       }
+       if (ret != info.size)
+               pr_err("ERROR: read %zd byte(s) not %d byte(s) data\n",
+                       ret, info.size);
+
+       memcpy(buf, local_buf, info.size);
+
+error_exit:
+       kfree(local_buf);
+       return ret;
+}
+
 static ssize_t userdata_show(struct class *cla,
        struct class_attribute *attr, char *buf)
 {
index 74ca4ae0773e004a4ae12faa5d0670df5410d14c..0f602b2edf8fef1cb6d586c18dcc66711f95f7cc 100644 (file)
@@ -283,7 +283,7 @@ static int key_efuse_init(struct key_info_t *uk_info,
 static int key_efuse_write(char *keyname, unsigned char *keydata,
                unsigned int datalen)
 {
-#ifdef CONFIG_EFUSE
+#if defined(CONFIG_ARM64) && defined(CONFIG_AMLOGIC_EFUSE)
        char *title = keyname;
        struct efusekey_info info;
 
@@ -306,7 +306,7 @@ static int key_efuse_write(char *keyname, unsigned char *keydata,
 static int key_efuse_read(char *keyname, unsigned char *keydata,
                unsigned int datalen, unsigned int *reallen)
 {
-#ifdef CONFIG_EFUSE
+#if defined(CONFIG_ARM64) && defined(CONFIG_AMLOGIC_EFUSE)
        char *title = keyname;
        struct efusekey_info info;
        int err = 0;
@@ -320,7 +320,7 @@ static int key_efuse_read(char *keyname, unsigned char *keydata,
                return -ENOMEM;
        memset(buf, 0, info.size);
 
-       err = efuse_user_attr_show(title, buf);
+       err = efuse_user_attr_read(title, buf);
        if (err >= 0) {
                *reallen = info.size;
                if (datalen > info.size)
@@ -337,7 +337,7 @@ static int key_efuse_read(char *keyname, unsigned char *keydata,
 static int key_efuse_query(char *keyname, unsigned int *keystate)
 {
        int err =  -EINVAL;
-#ifdef CONFIG_EFUSE
+#if defined(CONFIG_ARM64) && defined(CONFIG_AMLOGIC_EFUSE)
        int i;
        char *title = keyname;
        struct efusekey_info info;
@@ -351,7 +351,7 @@ static int key_efuse_query(char *keyname, unsigned int *keystate)
                return -ENOMEM;
        }
        memset(buf, 0, info.size);
-       err = efuse_user_attr_show(title, buf);
+       err = efuse_user_attr_read(title, buf);
        *keystate = KEY_NO_EXIST;
        if (err > 0) {
                for (i = 0; i < info.size; i++) {
@@ -543,7 +543,7 @@ int key_unify_size(struct aml_unifykey_dev *ukdev,
 
        if (unifykey->permit & KEY_M_PERMIT_READ) {
                switch (unifykey->dev) {
-#ifdef CONFIG_EFUSE
+#if defined(CONFIG_ARM64) && defined(CONFIG_AMLOGIC_EFUSE)
                case KEY_M_EFUSE:
                {
                        struct efusekey_info info;
index 11f20be00cae540b03728a22aefd4dcace789e87..4e51fd6852c362df6ff3c1ae3f925bb20dfee7ac 100644 (file)
@@ -30,6 +30,7 @@ extern int efusekeynum;
 int efuse_getinfo(char *item, struct efusekey_info *info);
 ssize_t efuse_user_attr_show(char *name, char *buf);
 ssize_t efuse_user_attr_store(char *name, const char *buf, size_t count);
+ssize_t efuse_user_attr_read(char *name, char *buf);
 #else
 int efuse_read_intlItem(char *intl_item, char *buf, int size);
 #endif