u32 XilSKey_EfusePl_InitData(XilSKey_EPl *PlInstancePtr) { u32 PlStatus; PlStatus = XST_SUCCESS; /** * Copy the xilskeyinput.h values into PL eFUSE structure elements */ /** * Assign FUSE CNTRL bits[1:5] to the PL eFUSE structure elements. */ PlInstancePtr->ForcePowerCycle = XSK_EFUSEPL_FORCE_PCYCLE_RECONFIG; PlInstancePtr->KeyWrite = XSK_EFUSEPL_DISABLE_KEY_WRITE; PlInstancePtr->AESKeyRead = XSK_EFUSEPL_DISABLE_AES_KEY_READ; PlInstancePtr->UserKeyRead = XSK_EFUSEPL_DISABLE_USER_KEY_READ; PlInstancePtr->CtrlWrite = XSK_EFUSEPL_DISABLE_FUSE_CNTRL_WRITE; /** * Assign the FUSE CNTRL bits[8:10] into the PL eFUSE structure elements */ PlInstancePtr->UseAESOnly = XSK_EFUSEPL_FORCE_USE_AES_ONLY; PlInstancePtr->JtagDisable = XSK_EFUSEPL_DISABLE_JTAG_CHAIN; PlInstancePtr->AESKeyExclusive = XSK_EFUSEPL_BBRAM_KEY_DISABLE; PlInstancePtr->JtagMioTDI = XSK_EFUSEPL_MIO_JTAG_TDI; PlInstancePtr->JtagMioTDO = XSK_EFUSEPL_MIO_JTAG_TDO; PlInstancePtr->JtagMioTCK = XSK_EFUSEPL_MIO_JTAG_TCK; PlInstancePtr->JtagMioTMS = XSK_EFUSEPL_MIO_JTAG_TMS; PlInstancePtr->JtagMioMuxSel = XSK_EFUSEPL_MIO_JTAG_MUX_SELECT; PlInstancePtr->JtagMuxSelLineDefVal = XSK_EFUSEPL_MIO_MUX_SEL_DEFAULT_VAL; /* * Variable to check whether internal system initialization is done. */ PlInstancePtr->SystemInitDone = 0; /** * Assign the user selection for AES & USER Low Key (or) * User High Key (or) both */ PlInstancePtr->ProgAESandUserLowKey = XSK_EFUSEPL_PROGRAM_AES_AND_USER_LOW_KEY; PlInstancePtr->ProgUserHighKey = XSK_EFUSEPL_PROGRAM_USER_HIGH_KEY; if (PlInstancePtr->ProgAESandUserLowKey == TRUE) { /** * Validation of AES Key */ PlStatus = XilSKey_Efuse_ValidateKey((char *)XSK_EFUSEPL_AES_KEY, XSK_EFUSEPL_AES_KEY_STRING_SIZE); if(PlStatus != XST_SUCCESS) { goto PL_INIT_ERROR; } /** * Validation of User Low Key */ PlStatus = XilSKey_Efuse_ValidateKey((char *)XSK_EFUSEPL_USER_LOW_KEY, XSK_EFUSEPL_USER_LOW_KEY_STRING_SIZE); if(PlStatus != XST_SUCCESS) { goto PL_INIT_ERROR; } /** * Assign the AES Key Value */ XilSKey_Efuse_ConvertStringToHexLE((char *)XSK_EFUSEPL_AES_KEY , &PlInstancePtr->AESKey[0], XSK_EFUSEPL_AES_KEY_SIZE_IN_BITS); /** * Assign the User Low key [7:0] bits */ XilSKey_Efuse_ConvertStringToHexLE((char *)XSK_EFUSEPL_USER_LOW_KEY , &PlInstancePtr->UserKey[0], XSK_EFUSEPL_USER_LOW_KEY_SIZE_IN_BITS); } if (PlInstancePtr->ProgUserHighKey == TRUE) { /** * Validation of User High Key */ PlStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPL_USER_HIGH_KEY, XSK_EFUSEPL_USER_HIGH_KEY_STRING_SIZE); if(PlStatus != XST_SUCCESS) { goto PL_INIT_ERROR; } /** * Assign the User High key [31:8] bits */ XilSKey_Efuse_ConvertStringToHexLE((char *)XSK_EFUSEPL_USER_HIGH_KEY , &PlInstancePtr->UserKey[1], XSK_EFUSEPL_USER_HIGH_KEY_SIZE_IN_BITS); } PL_INIT_ERROR: return PlStatus; }
static inline u32 XilSKey_EfusePs_ZynqMp_InitData( XilSKey_ZynqMpEPs *PsInstancePtr) { u32 PsStatus; PsStatus = XST_SUCCESS; /* * Copy the xilskey_efuseps_zynqmp_input.h values into * PS eFUSE structure elements */ /* Secure and control bits for programming */ PsInstancePtr->PrgrmgSecCtrlBits.AesKeyRead = XSK_EFUSEPS_AES_RD_LOCK; PsInstancePtr->PrgrmgSecCtrlBits.AesKeyWrite = XSK_EFUSEPS_AES_WR_LOCK; PsInstancePtr->PrgrmgSecCtrlBits.UseAESOnly = XSK_EFUSEPs_FORCE_USE_AES_ONLY; PsInstancePtr->PrgrmgSecCtrlBits.BbramDisable = XSK_EFUSEPS_BBRAM_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.PMUError = XSK_EFUSEPS_ERR_OUTOF_PMU_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.JtagDisable = XSK_EFUSEPS_JTAG_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.DFTDisable = XSK_EFUSEPS_DFT_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.ProgGate0 = XSK_EFUSEPS_PROG_GATE_0_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.ProgGate1 = XSK_EFUSEPS_PROG_GATE_1_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.ProgGate2 = XSK_EFUSEPS_PROG_GATE_2_DISABLE; PsInstancePtr->PrgrmgSecCtrlBits.SecureLock = XSK_EFUSEPS_SECURE_LOCK; PsInstancePtr->PrgrmgSecCtrlBits.RSAEnable = XSK_EFUSEPS_RSA_ENABLE; PsInstancePtr->PrgrmgSecCtrlBits.PPK0WrLock = XSK_EFUSEPS_PPK0_WR_LOCK; PsInstancePtr->PrgrmgSecCtrlBits.PPK0Revoke = XSK_EFUSEPS_PPK0_REVOKE; PsInstancePtr->PrgrmgSecCtrlBits.PPK1WrLock = XSK_EFUSEPS_PPK1_WR_LOCK; PsInstancePtr->PrgrmgSecCtrlBits.PPK1Revoke = XSK_EFUSEPS_PPK1_REVOKE; /* User control bits */ PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk0 = XSK_EFUSEPS_USER_WRLK_0; PsInstancePtr->PrgrmgSecCtrlBits. UserWrLk1 = XSK_EFUSEPS_USER_WRLK_1; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk2 = XSK_EFUSEPS_USER_WRLK_2; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk3 = XSK_EFUSEPS_USER_WRLK_3; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk4 = XSK_EFUSEPS_USER_WRLK_4; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk5 = XSK_EFUSEPS_USER_WRLK_5; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk6 = XSK_EFUSEPS_USER_WRLK_6; PsInstancePtr->PrgrmgSecCtrlBits.UserWrLk7 = XSK_EFUSEPS_USER_WRLK_7; /* For writing into eFuse */ PsInstancePtr->PrgrmAesKey = XSK_EFUSEPS_WRITE_AES_KEY; PsInstancePtr->PrgrmUserKey = XSK_EFUSEPS_WRITE_USER_KEY; PsInstancePtr->PrgrmPpk0Hash = XSK_EFUSEPS_WRITE_PPK0_HASH; PsInstancePtr->PrgrmPpk1Hash = XSK_EFUSEPS_WRITE_PPK1_HASH; PsInstancePtr->PrgrmSpkID = XSK_EFUSEPS_WRITE_SPKID; PsInstancePtr->PrgrmJtagUserCode = XSK_EFUSEPS_WRITE_JTAG_USERCODE; /* Variable for Timer Intialization */ PsInstancePtr->IntialisedTimer = 0; /* Copying PPK hash types */ PsInstancePtr->IsPpk0Sha3Hash = XSK_EFUSEPS_PPK0_IS_SHA3; PsInstancePtr->IsPpk1Sha3Hash = XSK_EFUSEPS_PPK1_IS_SHA3; /* Copy the keys to be programmed */ if (PsInstancePtr->PrgrmUserKey == TRUE) { /* Validation of User High Key */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_USER_KEY, XSK_EFUSEPS_USER_KEY_STRING_LEN); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the User key [255:0]bits */ XilSKey_Efuse_ConvertStringToHexLE( (char *)XSK_EFUSEPS_USER_KEY , &PsInstancePtr->UserKey[0], XSK_EFUSEPS_USER_KEY_LEN_IN_BITS); } if (PsInstancePtr->PrgrmAesKey == TRUE) { /* Validation of AES Key */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_AES_KEY, XSK_EFUSEPS_AES_KEY_STRING_LEN); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the AES Key Value */ XilSKey_Efuse_ConvertStringToHexLE( (char *)XSK_EFUSEPS_AES_KEY, &PsInstancePtr->AESKey[0], XSK_EFUSEPS_AES_KEY_LEN_IN_BITS); } /* Is PPK0 hash programming is enabled */ if (PsInstancePtr->PrgrmPpk0Hash == TRUE) { /* If Sha3 hash is programming into Efuse PPK0 */ if (PsInstancePtr->IsPpk0Sha3Hash == TRUE) { /* Validation of PPK0 sha3 hash */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_PPK0_HASH, XSK_EFUSEPS_PPK_SHA3_HASH_STRING_LEN_96); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the PPK0 sha3 hash */ XilSKey_Efuse_ConvertStringToHexBE( (char *)XSK_EFUSEPS_PPK0_HASH, &PsInstancePtr->Ppk0Hash[0], XSK_EFUSEPS_PPK_SHA3HASH_LEN_IN_BITS_384); } /* If Sha2 hash is programming into Efuse PPK0 */ else { /* Validation of PPK0 sha2 hash */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_PPK0_HASH, XSK_EFUSEPS_PPK_SHA2_HASH_STRING_LEN_64); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the PPK0 sha3 hash */ XilSKey_Efuse_ConvertStringToHexBE( (char *)XSK_EFUSEPS_PPK0_HASH, &PsInstancePtr->Ppk0Hash[0], XSK_EFUSEPS_PPK_SHA2HASH_LEN_IN_BITS_256); } } /* Is PPK1 hash programming is enabled */ if (PsInstancePtr->PrgrmPpk1Hash == TRUE) { /* If Sha3 hash is programming into Efuse PPK1 */ if (PsInstancePtr->IsPpk1Sha3Hash == TRUE) { /* Validation of PPK1 sha3 hash */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_PPK1_HASH, XSK_EFUSEPS_PPK_SHA3_HASH_STRING_LEN_96); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the PPK1 sha3 hash */ XilSKey_Efuse_ConvertStringToHexBE( (char *)XSK_EFUSEPS_PPK1_HASH, &PsInstancePtr->Ppk1Hash[0], XSK_EFUSEPS_PPK_SHA3HASH_LEN_IN_BITS_384); } /* If Sha2 hash is programming into Efuse PPK1 */ else { /* Validation of PPK1 sha2 hash */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_PPK1_HASH, XSK_EFUSEPS_PPK_SHA2_HASH_STRING_LEN_64); if(PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the PPK1 sha2 hash */ XilSKey_Efuse_ConvertStringToHexBE( (char *)XSK_EFUSEPS_PPK1_HASH, &PsInstancePtr->Ppk1Hash[0], XSK_EFUSEPS_PPK_SHA2HASH_LEN_IN_BITS_256); } } if (PsInstancePtr->PrgrmJtagUserCode == TRUE) { /* Validation of JTAG user code */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_JTAG_USERCODE, XSK_EFUSEPS_JTAG_USER_CODE_STRING_LEN); if (PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the JTAG user code */ XilSKey_Efuse_ConvertStringToHexLE( (char *)XSK_EFUSEPS_JTAG_USERCODE, &PsInstancePtr->JtagUserCode[0], XSK_EFUSEPS_JTAG_USER_CODE_LEN_IN_BITS); } if (PsInstancePtr->PrgrmSpkID == TRUE) { /* Validation of SPK ID */ PsStatus = XilSKey_Efuse_ValidateKey( (char *)XSK_EFUSEPS_SPK_ID, XSK_EFUSEPS_SPK_ID_STRING_LEN); if (PsStatus != XST_SUCCESS) { goto ERROR; } /* Assign the JTAG user code */ XilSKey_Efuse_ConvertStringToHexLE( (char *)XSK_EFUSEPS_SPK_ID, &PsInstancePtr->SpkId[0], XSK_EFUSEPS_SPKID_LEN_IN_BITS); } ERROR: return PsStatus; }