TSEC: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
TSEC (Tegra Security Engine Controller) is a NVIDIA Falcon microprocessor with crypto extensions | 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 | 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); | ||
// | // Clear TSEC_TEGRA_CTL_TKFI_KFUSE | ||
*(u32 *) | // This is TSEC_MMIO + 0x1000 + (0x20E00 / 0x40) | ||
*(u32 *)TSEC_TEGRA_CTL &= 0xEFFFF; | |||
// | // Set TSEC_SCP_CTL_PKEY_REQUEST_RELOAD | ||
*(u32 *) | // This is TSEC_MMIO + 0x1000 + (0x10600 / 0x40) | ||
*(u32 *)TSEC_SCP_CTL_PKEY |= 0x01; | |||
u32 | u32 is_pkey_loaded = 0; | ||
// Wait for | // Wait for TSEC_SCP_CTL_PKEY_LOADED | ||
while ( | while (!is_pkey_loaded) | ||
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 *) | // 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 | 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]]). | ||
== Key data == | == Key data == | ||
Line 924: | Line 1,139: | ||
| 0x00 | | 0x00 | ||
| 0x10 | | 0x10 | ||
| | | Empty | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
Line 944: | Line 1,159: | ||
| 0x50 | | 0x50 | ||
| 0x10 | | 0x10 | ||
| HOVI | | HOVI EKS seed | ||
|- | |- | ||
| 0x60 | | 0x60 | ||
| 0x10 | | 0x10 | ||
| HOVI | | HOVI COMMON seed | ||
|- | |- | ||
| 0x70 | | 0x70 |