diff --git a/inc/switchtec/mfg.h b/inc/switchtec/mfg.h index 04758264..e1df14a0 100644 --- a/inc/switchtec/mfg.h +++ b/inc/switchtec/mfg.h @@ -52,18 +52,27 @@ #define SWITCHTEC_PSID_DWORD_S 4 #define OTP_MULTI_DWORD_IMAGE_BIAK0 656 -#define OTP_DWORD_0 0 -#define OTP_DWORD_10 10 +#define OTP_DWORD_0 0 +#define OTP_DWORD_10 10 +#define OTP_DWORD_11 11 +#define OTP_DWORD_12 12 +#define OTP_DWORD_13 13 #define OTP_DWORD_19 19 #define OTP_DWORD_20 20 +#define OTP_DWORD_21 21 +#define OTP_DWORD_22 22 +#define OTP_DWORD_23 23 +#define OTP_DWORD_25 25 #define OTP_DWORD_61 61 +/* DWORD 0 — PRODUCT FLAGS */ #define OTP_DWORD_0_PRODUCT_DEVSEL_LSB 0 #define OTP_DWORD_0_PRODUCT_DEVSEL_MSK 0x0000003F #define OTP_DWORD_0_PRODUCT_DEVSEL_FAMILY_BIT (1U << 5) #define OTP_DWORD_0_PRODUCT_SECSC_LSB 22 #define OTP_DWORD_0_PRODUCT_SECSC_MSK 0x00400000 +/* DWORD 10 — TWI RECOVERY */ #define OTP_DWORD_10_SMBUS_SMBRMRPCADDR_LSB 5 #define OTP_DWORD_10_SMBUS_SMBRMRPCADDR_MSK 0x00007FE0 #define OTP_DWORD_10_SMBUS_SMBRIF_LSB 1 @@ -72,12 +81,107 @@ #define OTP_DWORD_10_SMBUS_SMBRATYPE_MSK 0x00000018 #define OTP_DWORD_10_SMBUS_SMBROCPADDR_LSB 18 #define OTP_DWORD_10_SMBUS_SMBROCPADDR_MSK 0x0FFC0000 -/* DWORD 19 — Boot Image Integrity Check Format */ + +/* DWORD 11 — I3C PID HIGH */ +#define OTP_DWORD_11_I3C_I3CPID_LSB 0 +#define OTP_DWORD_11_I3C_I3CPID_MSK 0xFFFFFFFF +/* DWORD 12 — I3C PID LOW */ +#define OTP_DWORD_12_I3C_I3CPID2_LSB 0 +#define OTP_DWORD_12_I3C_I3CPID2_MSK 0x0000FFFF +/* DWORD 13 — I3C RECOVERY FIELDS */ +#define OTP_DWORD_13_I3C_I3CADDR_LSB 0 +#define OTP_DWORD_13_I3C_I3CADDR_MSK 0x0000007F +#define OTP_DWORD_13_I3C_I3CINST_LSB 7 +#define OTP_DWORD_13_I3C_I3CINST_MSK 0x00000180 + +/* DWORD 19 — ALGO DISABLE, ROM KEY DISABLE, FAILOVER, TOKEN DISABLE */ +#define OTP_DWORD_19_CONTROL_CRC32D_LSB 0 +#define OTP_DWORD_19_CONTROL_CRC32D_MSK 0x00000001 +#define OTP_DWORD_19_CONTROL_ECDSAP384D_LSB 1 +#define OTP_DWORD_19_CONTROL_ECDSAP384D_MSK 0x00000002 +#define OTP_DWORD_19_CONTROL_ECDSAP521D_LSB 2 +#define OTP_DWORD_19_CONTROL_ECDSAP521D_MSK 0x00000004 +#define OTP_DWORD_19_CONTROL_RSA3KSHA2D_LSB 3 +#define OTP_DWORD_19_CONTROL_RSA3KSHA2D_MSK 0x00000008 +#define OTP_DWORD_19_CONTROL_RSA4KSHA2D_LSB 4 +#define OTP_DWORD_19_CONTROL_RSA4KSHA2D_MSK 0x00000010 +#define OTP_DWORD_19_CONTROL_DILITHIUM5D_LSB 5 +#define OTP_DWORD_19_CONTROL_DILITHIUM5D_MSK 0x00000020 +#define OTP_DWORD_19_CONTROL_IRK1R_LSB 6 +#define OTP_DWORD_19_CONTROL_IRK1R_MSK 0x00000040 +#define OTP_DWORD_19_CONTROL_IRK2R_LSB 7 +#define OTP_DWORD_19_CONTROL_IRK2R_MSK 0x00000080 +#define OTP_DWORD_19_CONTROL_IRK3R_LSB 8 +#define OTP_DWORD_19_CONTROL_IRK3R_MSK 0x00000100 +#define OTP_DWORD_19_CONTROL_IRK4R_LSB 9 +#define OTP_DWORD_19_CONTROL_IRK4R_MSK 0x00000200 +#define OTP_DWORD_19_CONTROL_BFUD_LSB 20 +#define OTP_DWORD_19_CONTROL_BFUD_MSK 0x00100000 +#define OTP_DWORD_19_CONTROL_BFSMBUSD_LSB 21 +#define OTP_DWORD_19_CONTROL_BFSMBUSD_MSK 0x00200000 +#define OTP_DWORD_19_CONTROL_BFI3CD_LSB 22 +#define OTP_DWORD_19_CONTROL_BFI3CD_MSK 0x00400000 +#define OTP_DWORD_19_CONTROL_BF2UD_LSB 23 +#define OTP_DWORD_19_CONTROL_BF2UD_MSK 0x00800000 +#define OTP_DWORD_19_CONTROL_BF2SMBUSD_LSB 24 +#define OTP_DWORD_19_CONTROL_BF2SMBUSD_MSK 0x01000000 +#define OTP_DWORD_19_CONTROL_BF2I3CD_LSB 25 +#define OTP_DWORD_19_CONTROL_BF2I3CD_MSK 0x02000000 #define OTP_DWORD_19_CONTROL_BIICFCRCD_LSB 29 #define OTP_DWORD_19_CONTROL_BIICFCRCD_MSK 0x20000000 -/* DWORD 20 — Boot Image Integrity Check Format (continued) */ +#define OTP_DWORD_19_CONTROL_BIICFEC384D_LSB 30 +#define OTP_DWORD_19_CONTROL_BIICFEC384D_MSK 0x40000000 +#define OTP_DWORD_19_CONTROL_BIICFEC521D_LSB 31 +#define OTP_DWORD_19_CONTROL_BIICFEC521D_MSK 0x80000000 + +/* DWORD 20 — HASH FORMAT DISABLE */ +#define OTP_DWORD_20_CONTROL_BIICFR3SD_LSB 0 +#define OTP_DWORD_20_CONTROL_BIICFR3SD_MSK 0x00000001 #define OTP_DWORD_20_CONTROL_BIICFRS2D_LSB 1 #define OTP_DWORD_20_CONTROL_BIICFRS2D_MSK 0x00000002 +#define OTP_DWORD_20_CONTROL_BIIDILITHIUM5D_LSB 2 +#define OTP_DWORD_20_CONTROL_BIIDILITHIUM5D_MSK 0x00000004 + +/* DWORD 21 — KEY READ MASK VECTOR */ +#define OTP_DWORD_21_CONTROL_BIAKRMV_LSB 0 +#define OTP_DWORD_21_CONTROL_BIAKRMV_MSK 0x00000FFF +/* DWORD 22 — KEY READ MASK REQUEST VECTOR */ +#define OTP_DWORD_22_CONTROL_BIAKRMRV_LSB 0 +#define OTP_DWORD_22_CONTROL_BIAKRMRV_MSK 0x00000FFF + +/* DWORD 23 — KEY STATUS (BIAKxS) */ +#define OTP_DWORD_23_CONTROL_BIAK0S_LSB 0 +#define OTP_DWORD_23_CONTROL_BIAK0S_MSK 0x00000003 +#define OTP_DWORD_23_CONTROL_BIAK1S_LSB 2 +#define OTP_DWORD_23_CONTROL_BIAK1S_MSK 0x0000000C +#define OTP_DWORD_23_CONTROL_BIAK2S_LSB 4 +#define OTP_DWORD_23_CONTROL_BIAK2S_MSK 0x00000030 +#define OTP_DWORD_23_CONTROL_BIAK3S_LSB 6 +#define OTP_DWORD_23_CONTROL_BIAK3S_MSK 0x000000C0 +#define OTP_DWORD_23_CONTROL_BIAK4S_LSB 8 +#define OTP_DWORD_23_CONTROL_BIAK4S_MSK 0x00000300 +#define OTP_DWORD_23_CONTROL_BIAK5S_LSB 10 +#define OTP_DWORD_23_CONTROL_BIAK5S_MSK 0x00000C00 +#define OTP_DWORD_23_CONTROL_BIAK6S_LSB 12 +#define OTP_DWORD_23_CONTROL_BIAK6S_MSK 0x00003000 +#define OTP_DWORD_23_CONTROL_BIAK7S_LSB 14 +#define OTP_DWORD_23_CONTROL_BIAK7S_MSK 0x0000C000 +#define OTP_DWORD_23_CONTROL_BIAK8S_LSB 16 +#define OTP_DWORD_23_CONTROL_BIAK8S_MSK 0x00030000 +#define OTP_DWORD_23_CONTROL_BIAK9S_LSB 18 +#define OTP_DWORD_23_CONTROL_BIAK9S_MSK 0x000C0000 +#define OTP_DWORD_23_CONTROL_BIAK10S_LSB 20 +#define OTP_DWORD_23_CONTROL_BIAK10S_MSK 0x00300000 +#define OTP_DWORD_23_CONTROL_BIAK11S_LSB 22 +#define OTP_DWORD_23_CONTROL_BIAK11S_MSK 0x00C00000 + +/* DWORD 25 — PUFAC FIELDS */ +#define OTP_DWORD_25_CONTROL_PUFACS_LSB 0 +#define OTP_DWORD_25_CONTROL_PUFACS_MSK 0x00000003 +#define OTP_DWORD_25_CONTROL_PUFACRM_LSB 4 +#define OTP_DWORD_25_CONTROL_PUFACRM_MSK 0x00000010 +#define OTP_DWORD_25_CONTROL_PUFACRMR_LSB 5 +#define OTP_DWORD_25_CONTROL_PUFACRMR_MSK 0x00000020 #define OTP_DWORD_61_MFGMSTT_SECSTATESET_LSB 4 #define OTP_DWORD_61_MFGMSTT_SECSTATESET_MSK 0x00000010 diff --git a/lib/mfg.c b/lib/mfg.c index daee0fcd..f860775f 100644 --- a/lib/mfg.c +++ b/lib/mfg.c @@ -727,6 +727,7 @@ int security_settings_get_gen6(struct switchtec_dev *dev, if (ret) return ret; + /* DWORD 10 — TWI RECOVERY */ state->twi_rcvry_address_mrpc = (reply_otp[OTP_DWORD_10] & OTP_DWORD_10_SMBUS_SMBRMRPCADDR_MSK) >> OTP_DWORD_10_SMBUS_SMBRMRPCADDR_LSB; state->twi_rcvry_bus = (reply_otp[OTP_DWORD_10] & OTP_DWORD_10_SMBUS_SMBRIF_MSK) @@ -735,9 +736,101 @@ int security_settings_get_gen6(struct switchtec_dev *dev, >> OTP_DWORD_10_SMBUS_SMBRATYPE_LSB; state->twi_rcvry_address_ocp = (reply_otp[OTP_DWORD_10] & OTP_DWORD_10_SMBUS_SMBROCPADDR_MSK) >> OTP_DWORD_10_SMBUS_SMBROCPADDR_LSB; + + /* DWORD 0 — PRODUCT FLAGS */ state->secsc = (reply_otp[OTP_DWORD_0] & OTP_DWORD_0_PRODUCT_SECSC_MSK) >> OTP_DWORD_0_PRODUCT_SECSC_LSB; + /* DWORD 25 — PUFAC */ + state->puf_ac_status = (reply_otp[OTP_DWORD_25] & OTP_DWORD_25_CONTROL_PUFACS_MSK) + >> OTP_DWORD_25_CONTROL_PUFACS_LSB; + + /* DWORD 23 — KEY HASH STATUS */ + state->otp_key0_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK0S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK0S_LSB; + state->otp_key1_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK1S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK1S_LSB; + state->otp_key2_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK2S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK2S_LSB; + state->otp_key3_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK3S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK3S_LSB; + state->otp_key4_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK4S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK4S_LSB; + state->otp_key5_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK5S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK5S_LSB; + state->otp_key6_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK6S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK6S_LSB; + state->otp_key7_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK7S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK7S_LSB; + state->otp_key8_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK8S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK8S_LSB; + state->otp_key9_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK9S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK9S_LSB; + state->otp_key10_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK10S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK10S_LSB; + state->otp_key11_hash_status = (reply_otp[OTP_DWORD_23] & OTP_DWORD_23_CONTROL_BIAK11S_MSK) + >> OTP_DWORD_23_CONTROL_BIAK11S_LSB; + + /* DWORD 20 — HASH TABLE DISABLE */ + state->has_table_sha2_384_disable = (reply_otp[OTP_DWORD_20] & OTP_DWORD_20_CONTROL_BIICFR3SD_MSK) + >> OTP_DWORD_20_CONTROL_BIICFR3SD_LSB; + state->has_table_sha2_512_disable = (reply_otp[OTP_DWORD_20] & OTP_DWORD_20_CONTROL_BIICFRS2D_MSK) + >> OTP_DWORD_20_CONTROL_BIICFRS2D_LSB; + state->has_table_sha3_512_disable = (reply_otp[OTP_DWORD_20] & OTP_DWORD_20_CONTROL_BIIDILITHIUM5D_MSK) + >> OTP_DWORD_20_CONTROL_BIIDILITHIUM5D_LSB; + state->has_table_crc32_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_CRC32D_MSK) + >> OTP_DWORD_19_CONTROL_CRC32D_LSB; + + /* DWORD 11-13 — I3C IDENTIFIERS */ + state->i3c_pid_high = (reply_otp[OTP_DWORD_11] & OTP_DWORD_11_I3C_I3CPID_MSK) + >> OTP_DWORD_11_I3C_I3CPID_LSB; + state->i3c_pid_low = (reply_otp[OTP_DWORD_12] & OTP_DWORD_12_I3C_I3CPID2_MSK) + >> OTP_DWORD_12_I3C_I3CPID2_LSB; + state->i3c_rcvry_address = (reply_otp[OTP_DWORD_13] & OTP_DWORD_13_I3C_I3CADDR_MSK) + >> OTP_DWORD_13_I3C_I3CADDR_LSB; + state->i3c_rcvry_bus = (reply_otp[OTP_DWORD_13] & OTP_DWORD_13_I3C_I3CINST_MSK) + >> OTP_DWORD_13_I3C_I3CINST_LSB; + + /* DWORD 19 — ALGO/BOOT/FAILOVER/TOKEN DISABLE FLAGS */ + state->algo_crc_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_CRC32D_MSK) + >> OTP_DWORD_19_CONTROL_CRC32D_LSB; + state->algo_ecdsa_p384_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_ECDSAP384D_MSK) + >> OTP_DWORD_19_CONTROL_ECDSAP384D_LSB; + state->algo_ecdsa_p521_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_ECDSAP521D_MSK) + >> OTP_DWORD_19_CONTROL_ECDSAP521D_LSB; + state->algo_rsa3ksha2_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_RSA3KSHA2D_MSK) + >> OTP_DWORD_19_CONTROL_RSA3KSHA2D_LSB; + state->algo_rsa4ksha2_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_RSA4KSHA2D_MSK) + >> OTP_DWORD_19_CONTROL_RSA4KSHA2D_LSB; + state->algo_dilithium5_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_DILITHIUM5D_MSK) + >> OTP_DWORD_19_CONTROL_DILITHIUM5D_LSB; + state->rom_key_1_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_IRK1R_MSK) + >> OTP_DWORD_19_CONTROL_IRK1R_LSB; + state->rom_key_2_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_IRK2R_MSK) + >> OTP_DWORD_19_CONTROL_IRK2R_LSB; + state->rom_key_3_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_IRK3R_MSK) + >> OTP_DWORD_19_CONTROL_IRK3R_LSB; + state->rom_key_4_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_IRK4R_MSK) + >> OTP_DWORD_19_CONTROL_IRK4R_LSB; + state->boot_from_uart_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BFUD_MSK) + >> OTP_DWORD_19_CONTROL_BFUD_LSB; + state->boot_from_smbus_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BFSMBUSD_MSK) + >> OTP_DWORD_19_CONTROL_BFSMBUSD_LSB; + state->boot_from_i3c_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BFI3CD_MSK) + >> OTP_DWORD_19_CONTROL_BFI3CD_LSB; + state->failover_to_uart_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BF2UD_MSK) + >> OTP_DWORD_19_CONTROL_BF2UD_LSB; + state->failover_to_smbus_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BF2SMBUSD_MSK) + >> OTP_DWORD_19_CONTROL_BF2SMBUSD_LSB; + state->failover_to_i3c_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BF2I3CD_MSK) + >> OTP_DWORD_19_CONTROL_BF2I3CD_LSB; + state->static_token_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BIICFCRCD_MSK) + >> OTP_DWORD_19_CONTROL_BIICFCRCD_LSB; + state->psid_only_token_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BIICFEC384D_MSK) + >> OTP_DWORD_19_CONTROL_BIICFEC384D_LSB; + state->uid_only_token_disable = (reply_otp[OTP_DWORD_19] & OTP_DWORD_19_CONTROL_BIICFEC521D_MSK) + >> OTP_DWORD_19_CONTROL_BIICFEC521D_LSB; + /* get 192 dwords of OTP content from offset 656 for keys*/ cmd.subcmd = MRPC_GET_SECURE_OTP; cmd.OTP_dword_offset = OTP_MULTI_DWORD_IMAGE_BIAK0;