Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*
 * 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 ;
}