Line 1:
Line 1:
−
TSEC (Tegra Security Engine Controller) is a NVIDIA Falcon microprocessor with crypto extensions. Therefore, all information in this page related to Falcon is identical for TSEC and vice versa.
+
TSEC (Tegra Security Engine Controller) is a dedicated unit powered by a NVIDIA Falcon microprocessor with crypto extensions.
= Driver =
= Driver =
−
A host driver for communicating with the TSEC/Falcon is mapped to physical address 0x54500000 with a total size of 0x40000 bytes and exposes several registers.
+
A host driver for communicating with the TSEC is mapped to physical address 0x54500000 with a total size of 0x40000 bytes and exposes several registers.
== Registers ==
== Registers ==
+
Registers from 0x54501000 to 0x54502000 are a MMIO window for communicating with the Falcon microprocessor. From this range, the subset of registers from 0x54501400 to 0x54501FE8 are specific to the TSEC.
+
{| class="wikitable" border="1"
{| class="wikitable" border="1"
! Name
! Name
! Address
! Address
! Width
! Width
+
|-
+
| FALCON_IRQSSET
+
| 0x54501000
+
| 0x04
+
|-
+
| FALCON_IRQSCLR
+
| 0x54501004
+
| 0x04
+
|-
+
| FALCON_IRQSTAT
+
| 0x54501008
+
| 0x04
+
|-
+
| FALCON_IRQMODE
+
| 0x5450100C
+
| 0x04
|-
|-
| [[#FALCON_IRQMSET|FALCON_IRQMSET]]
| [[#FALCON_IRQMSET|FALCON_IRQMSET]]
| 0x54501010
| 0x54501010
+
| 0x04
+
|-
+
| FALCON_IRQMCLR
+
| 0x54501014
+
| 0x04
+
|-
+
| FALCON_IRQMASK
+
| 0x54501018
| 0x04
| 0x04
|-
|-
Line 28:
Line 54:
| [[#FALCON_ITFEN|FALCON_ITFEN]]
| [[#FALCON_ITFEN|FALCON_ITFEN]]
| 0x54501048
| 0x54501048
+
| 0x04
+
|-
+
| FALCON_IDLESTATE
+
| 0x5450104C
+
| 0x04
+
|-
+
| FALCON_CURCTX
+
| 0x54501050
+
| 0x04
+
|-
+
| FALCON_NXTCTX
+
| 0x54501054
+
| 0x04
+
|-
+
| FALCON_SCRATCH2
+
| 0x54501080
+
| 0x04
+
|-
+
| FALCON_SCRATCH3
+
| 0x54501084
+
| 0x04
+
|-
+
| FALCON_ENGCTL
+
| 0x545010A4
| 0x04
| 0x04
|-
|-
Line 36:
Line 86:
| [[#FALCON_BOOTVEC|FALCON_BOOTVEC]]
| [[#FALCON_BOOTVEC|FALCON_BOOTVEC]]
| 0x54501104
| 0x54501104
+
| 0x04
+
|-
+
| FALCON_HWCFG
+
| 0x54501108
| 0x04
| 0x04
|-
|-
Line 56:
Line 110:
| [[#FALCON_DMATRFFBOFFS|FALCON_DMATRFFBOFFS]]
| [[#FALCON_DMATRFFBOFFS|FALCON_DMATRFFBOFFS]]
| 0x5450111C
| 0x5450111C
+
| 0x04
+
|-
+
| FALCON_CPUCTL_ALIAS
+
| 0x54501130
+
| 0x04
+
|-
+
| FALCON_EXTERRADDR
+
| 0x54501168
+
| 0x04
+
|-
+
| FALCON_EXTERRSTAT
+
| 0x5450116C
+
| 0x04
+
|-
+
| FALCON_CODE_INDEX
+
| 0x54501180
+
| 0x04
+
|-
+
| FALCON_CODE
+
| 0x54501184
+
| 0x04
+
|-
+
| FALCON_CODE_VIRT_ADDR
+
| 0x54501188
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX0
+
| 0x545011C0
+
| 0x04
+
|-
+
| FALCON_DATA0
+
| 0x545011C4
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX1
+
| 0x545011C8
+
| 0x04
+
|-
+
| FALCON_DATA1
+
| 0x545011CC
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX2
+
| 0x545011D0
+
| 0x04
+
|-
+
| FALCON_DATA2
+
| 0x545011D4
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX3
+
| 0x545011D8
+
| 0x04
+
|-
+
| FALCON_DATA3
+
| 0x545011DC
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX4
+
| 0x545011E0
+
| 0x04
+
|-
+
| FALCON_DATA4
+
| 0x545011E4
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX5
+
| 0x545011E8
+
| 0x04
+
|-
+
| FALCON_DATA5
+
| 0x545011EC
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX6
+
| 0x545011F0
+
| 0x04
+
|-
+
| FALCON_DATA6
+
| 0x545011F4
+
| 0x04
+
|-
+
| FALCON_DATA_INDEX7
+
| 0x545011F8
+
| 0x04
+
|-
+
| FALCON_DATA7
+
| 0x545011FC
+
| 0x04
+
|-
+
| FALCON_ICD_CMD
+
| 0x54501200
+
| 0x04
+
|-
+
| FALCON_ICD_ADDR
+
| 0x54501204
+
| 0x04
+
|-
+
| FALCON_ICD_WDATA
+
| 0x54501208
+
| 0x04
+
|-
+
| FALCON_ICD_RDATA
+
| 0x5450120C
+
| 0x04
+
|-
+
| FALCON_SCTL
+
| 0x54501240
+
| 0x04
+
|-
+
| TSEC_AUTH_MODE
+
| 0x5450140C
+
| 0x04
+
|-
+
| [[#TSEC_SCP_CTL_PKEY|TSEC_SCP_CTL_PKEY]]
+
| 0x54501418
+
| 0x04
+
|-
+
| TSEC_DMA_CMD
+
| 0x54501700
+
| 0x04
+
|-
+
| TSEC_DMA_ADDR
+
| 0x54501704
+
| 0x04
+
|-
+
| TSEC_DMA_VAL
+
| 0x54501708
+
| 0x04
+
|-
+
| TSEC_DMA_UNK
+
| 0x5450170C
+
| 0x04
+
|-
+
| [[#TSEC_TEGRA_CTL|TSEC_TEGRA_CTL]]
+
| 0x54501838
| 0x04
| 0x04
|-
|-
Line 143:
Line 333:
=== FALCON_DMATRFFBOFFS ===
=== FALCON_DMATRFFBOFFS ===
Takes the offset for Falcon's target memory being transferred.
Takes the offset for Falcon's target memory being transferred.
+
+
=== TSEC_SCP_CTL_PKEY ===
+
{| class="wikitable" border="1"
+
! Bits
+
! Description
+
|-
+
| 0
+
| TSEC_SCP_CTL_PKEY_REQUEST_RELOAD
+
|-
+
| 1
+
| TSEC_SCP_CTL_PKEY_LOADED
+
|-
+
|}
+
+
=== TSEC_TEGRA_CTL ===
+
{| class="wikitable" border="1"
+
! Bits
+
! Description
+
|-
+
| 16
+
| TSEC_TEGRA_CTL_TKFI_KFUSE
+
|-
+
|}
= Boot Process =
= Boot Process =
Line 475:
Line 688:
cmov(c7, c0);
cmov(c7, c0);
−
// Update engine specific IO (crypto?)
+
// Clear TSEC_TEGRA_CTL_TKFI_KFUSE
−
*(u32 *)0x00020E00 &= 0xEFFFF;
+
// This is TSEC_MMIO + 0x1000 + (0x20E00 / 0x40)
+
*(u32 *)TSEC_TEGRA_CTL &= 0xEFFFF;
−
// Update engine specific IO (crypto?)
+
// Set TSEC_SCP_CTL_PKEY_REQUEST_RELOAD
−
*(u32 *)0x00010600 |= 0x01;
+
// This is TSEC_MMIO + 0x1000 + (0x10600 / 0x40)
+
*(u32 *)TSEC_SCP_CTL_PKEY |= 0x01;
−
u32 wait_10600 = 0;
+
u32 is_pkey_loaded = 0;
−
// Wait for some device
+
// Wait for TSEC_SCP_CTL_PKEY_LOADED
−
while (wait_10600 == 0)
+
while (!is_pkey_loaded)
−
wait_10600 = (*(u32 *)0x00010600 & 0x02);
+
is_pkey_loaded = (*(u32 *)TSEC_SCP_CTL_PKEY & 0x02);
// Read data segment size from IO space
// Read data segment size from IO space
Line 515:
Line 730:
// Exit Authenticated Mode
// Exit Authenticated Mode
−
*(u32 *)0x00010300 = 0;
+
// This is TSEC_MMIO + 0x1000 + (0x10300 / 0x40)
+
*(u32 *)TSEC_AUTH_MODE = 0;
return;
return;
Line 621:
Line 837:
else if (key_version == 0x02) // Use HOVI_COMMON_01
else if (key_version == 0x02) // Use HOVI_COMMON_01
hovi_key_addr = key_buf + 0x60;
hovi_key_addr = key_buf + 0x60;
−
else if (key_version == 0x03) // Use device key
+
else if (key_version == 0x03) // Use empty key
hovi_key_addr = key_buf + 0x00;
hovi_key_addr = key_buf + 0x00;
else
else
Line 912:
Line 1,128:
== Stage 2 ==
== Stage 2 ==
This stage is decrypted by Stage 1 using a key generated by encrypting a seed with an hardware secret (see [[TSEC#keygen|keygen]]).
This stage is decrypted by Stage 1 using a key generated by encrypting a seed with an hardware secret (see [[TSEC#keygen|keygen]]).
−
The hardware secret is, presumably, a 16 bytes key located at offset 0x26 inside the KFUSE array.
== Key data ==
== Key data ==
Line 924:
Line 1,139:
| 0x00
| 0x00
| 0x10
| 0x10
−
| Device key
+
| Empty
|-
|-
| 0x10
| 0x10
Line 944:
Line 1,159:
| 0x50
| 0x50
| 0x10
| 0x10
−
| HOVI eks seed
+
| HOVI EKS seed
|-
|-
| 0x60
| 0x60
| 0x10
| 0x10
−
| HOVI common seed
+
| HOVI COMMON seed
|-
|-
| 0x70
| 0x70