int32_t nand_secure_write(struct amlnand_chip * aml_chip, char *buf,int len) { secure_t *secure_ptr = NULL; int error = 0; if(len > CONFIG_SECURE_SIZE) { aml_nand_msg("key data len too much,%s\n",__func__); return -EFAULT; } secure_ptr = kzalloc(CONFIG_SECURE_SIZE, GFP_KERNEL); if(secure_ptr == NULL) return -ENOMEM; memset(secure_ptr,0,CONFIG_SECURE_SIZE); memcpy(secure_ptr->data + 0, buf, len); amlnand_get_device(aml_chip, CHIP_WRITING); error = amlnand_save_info_by_name(aml_chip, (unsigned char *)&(aml_chip->nand_secure),(unsigned char *)secure_ptr,SECURE_INFO_HEAD_MAGIC, CONFIG_SECURE_SIZE); if (error) { printk("save key error,%s\n",__func__); error = -EFAULT; goto exit; } exit: amlnand_release_device(aml_chip); kfree(secure_ptr); return error; }
/* * This funcion reads the u-boot keyionment variables. * The f_pos points directly to the key location. */ static int32_t nand_key_read(aml_keybox_provider_t * provider, uint8_t *buf,int len,int flags) { struct amlnand_chip * aml_chip = provider->priv; meson_key *key_ptr = NULL; int error = 0; if(len > KEYSIZE) { printk("key data len too much,%s\n",__func__); return -EFAULT; } key_ptr = kzalloc(CONFIG_KEYSIZE, GFP_KERNEL); if(key_ptr == NULL) return -ENOMEM; amlnand_get_device(aml_chip, CHIP_READING); memset(key_ptr,0,CONFIG_KEYSIZE); error = amlnand_read_info_by_name(aml_chip, (unsigned char *)&(aml_chip->nand_key),(unsigned char *)key_ptr,KEY_INFO_HEAD_MAGIC, CONFIG_KEYSIZE); //error = aml_nand_read_key(aml_chip, (u_char *)key_ptr); if (error) { printk("read key error,%s\n",__func__); error = -EFAULT; goto exit; } memcpy(buf, key_ptr->data, len); exit: amlnand_release_device(aml_chip); kfree(key_ptr); return 0; }
int roomboot_nand_read(struct amlnand_phydev *phydev) { struct amlnand_chip *aml_chip = (struct amlnand_chip *)phydev->priv; struct phydev_ops *devops = &(phydev->ops); struct hw_controller *controller = &(aml_chip->controller); struct chip_operation *operation = &(aml_chip->operation); struct chip_ops_para *ops_para = &(aml_chip->ops_para); uint64_t offset , write_len; unsigned char * buffer; int ret = 0; int oob_set = 0; offset = devops->addr; write_len = devops->len; buffer = devops->datbuf; memset(devops, 0x0, sizeof(struct phydev_ops)); devops->addr = offset; devops->len = write_len; devops->datbuf = buffer; devops->oobbuf = NULL; devops->mode = NAND_HW_ECC; if(controller->oob_mod) { oob_set = controller->oob_mod; NFC_CLR_OOB_MODE(3<<26); controller->oob_mod =0; } amlnand_get_device(aml_chip, CHIP_READING); ret = read_uboot(phydev); if(ret < 0){ aml_nand_dbg("nand read failed at %llx",devops->addr); } amlnand_release_device(aml_chip); if(oob_set) { controller->oob_mod =oob_set; NFC_SET_OOB_MODE(3<<26); } return ret ; }