Changes

Jump to navigation Jump to search
5,143 bytes added ,  02:44, 10 September 2019
Line 11: Line 11:  
!  Address
 
!  Address
 
|-
 
|-
| [[#FUSE_CTRL|FUSE_CTRL]]
+
| [[#FUSE_FUSECTRL|FUSE_FUSECTRL]]
 
| 0x7000F800
 
| 0x7000F800
 
|-
 
|-
| [[#FUSE_REG_ADDR|FUSE_REG_ADDR]]
+
| [[#FUSE_FUSEADDR|FUSE_FUSEADDR]]
 
| 0x7000F804
 
| 0x7000F804
 
|-
 
|-
| [[#FUSE_REG_READ|FUSE_REG_READ]]
+
| [[#FUSE_FUSERDATA|FUSE_FUSERDATA]]
 
| 0x7000F808
 
| 0x7000F808
 
|-
 
|-
| [[#FUSE_REG_WRITE|FUSE_REG_WRITE]]
+
| [[#FUSE_FUSEWDATA|FUSE_FUSEWDATA]]
 
| 0x7000F80C
 
| 0x7000F80C
 
|-
 
|-
| FUSE_TIME_RD1
+
| FUSE_FUSETIME_RD1
 
| 0x7000F810
 
| 0x7000F810
 
|-
 
|-
| FUSE_TIME_RD2
+
| FUSE_FUSETIME_RD2
 
| 0x7000F814
 
| 0x7000F814
 
|-
 
|-
| FUSE_TIME_PGM1
+
| FUSE_FUSETIME_PGM1
 
| 0x7000F818
 
| 0x7000F818
 
|-
 
|-
| [[#FUSE_TIME_PGM2|FUSE_TIME_PGM2]]
+
| [[#FUSE_FUSETIME_PGM2|FUSE_FUSETIME_PGM2]]
 
| 0x7000F81C
 
| 0x7000F81C
 
|-
 
|-
| [[#FUSE_PRIV2INTFC|FUSE_PRIV2INTFC]]
+
| [[#FUSE_PRIV2INTFC_START|FUSE_PRIV2INTFC_START]]
 
| 0x7000F820
 
| 0x7000F820
 
|-
 
|-
Line 44: Line 44:  
| 0x7000F828
 
| 0x7000F828
 
|-
 
|-
| [[#FUSE_DIS_PGM|FUSE_DIS_PGM]]
+
| [[#FUSE_DISABLEREGPROGRAM|FUSE_DISABLEREGPROGRAM]]
 
| 0x7000F82C
 
| 0x7000F82C
 
|-
 
|-
| [[#FUSE_WRITE_ACCESS|FUSE_WRITE_ACCESS]]
+
| [[#FUSE_WRITE_ACCESS_SW|FUSE_WRITE_ACCESS_SW]]
 
| 0x7000F830
 
| 0x7000F830
 
|-
 
|-
 
| FUSE_PWR_GOOD_SW
 
| FUSE_PWR_GOOD_SW
 
| 0x7000F834
 
| 0x7000F834
 +
|-
 +
| FUSE_PRIV2RESHIFT
 +
| 0x7000F83C
 +
|-
 +
| FUSE_FUSETIME_RD3
 +
| 0x7000F84C
 
|-
 
|-
 
| FUSE_PRIVATE_KEY0_NONZERO
 
| FUSE_PRIVATE_KEY0_NONZERO
Line 69: Line 75:  
|}
 
|}
   −
==== FUSE_CTRL ====
+
==== FUSE_FUSECTRL ====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
!  Bits
 
!  Bits
Line 75: Line 81:  
|-
 
|-
 
| 0-1
 
| 0-1
| Fuse command (1 = FUSE_READ; 2 = FUSE_WRITE; 3 = FUSE_SENSE)
+
| FUSE_FUSECTRL_CMD
 +
0x00: IDLE
 +
0x01: READ
 +
0x02: WRITE
 +
0x03: SENSE_CTRL
 
|-
 
|-
 
| 16-20
 
| 16-20
| Fuse state (4 = STATE_IDLE)
+
| FUSE_FUSECTRL_STATE
 +
0x00: STATE_RESET
 +
0x01: STATE_POST_RESET
 +
0x02: STATE_LOAD_ROW0
 +
0x03: STATE_LOAD_ROW1
 +
0x04: STATE_IDLE
 +
0x05: STATE_READ_SETUP
 +
0x06: STATE_READ_STROBE
 +
0x07: STATE_SAMPLE_FUSES
 +
0x08: STATE_READ_HOLD
 +
0x09: STATE_FUSE_SRC_SETUP
 +
0x0A: STATE_WRITE_SETUP
 +
0x0B: STATE_WRITE_ADDR_SETUP
 +
0x0C: STATE_WRITE_PROGRAM
 +
0x0D: STATE_WRITE_ADDR_HOLD
 +
0x0E: STATE_FUSE_SRC_HOLD
 +
0x0F: STATE_READ_BEFORE_WRITE_SETUP
 +
|-
 +
| 21
 +
| FUSE_FUSECTRL_MARGIN_READ
 +
|-
 +
| 22
 +
| FUSE_FUSECTRL_RWL
 +
|-
 +
| 23
 +
| FUSE_FUSECTRL_TRCS
 +
|-
 +
| 24
 +
| FUSE_FUSECTRL_AT1
 +
|-
 +
| 25
 +
| FUSE_FUSECTRL_AT0
 
|-
 
|-
 
| 26
 
| 26
| Fuse power down mode flag (FUSE_CTRL_PD)
+
| FUSE_FUSECTRL_PD_CTRL
 
|-
 
|-
 
| 30
 
| 30
| Fuse sense status (FUSE_CTRL_SENSE_DONE)
+
| FUSE_FUSECTRL_FUSE_SENSE_DONE
 +
|-
 +
| 31
 +
| FUSE_FUSECTRL_RECORD_SHIFT_DONE
 
|}
 
|}
    
Before fuse reading/writing the power down mode must be disabled.
 
Before fuse reading/writing the power down mode must be disabled.
FUSE_SENSE mode flushes programmed values into the [[Fuses#Cache_registers|cache registers]].
+
SENSE_CTRL mode flushes programmed values into the [[Fuses#Cache_registers|cache registers]].
   −
==== FUSE_REG_ADDR ====
+
==== FUSE_FUSEADDR ====
 
This register takes the address of the fuse to be read/written/sensed.
 
This register takes the address of the fuse to be read/written/sensed.
   −
==== FUSE_REG_READ ====
+
==== FUSE_FUSERDATA ====
 
This register receives the value read from the fuse.
 
This register receives the value read from the fuse.
   −
==== FUSE_REG_WRITE ====
+
==== FUSE_FUSEWDATA ====
 
This register takes the value to be written to the fuse.
 
This register takes the value to be written to the fuse.
   −
==== FUSE_TIME_PGM2 ====
+
==== FUSE_FUSETIME_PGM2 ====
 
This register takes the fuse programming pulse (0xC0 == 19200 kHz).
 
This register takes the fuse programming pulse (0xC0 == 19200 kHz).
   −
==== FUSE_PRIV2INTFC ====
+
==== FUSE_PRIV2INTFC_START ====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
!  Bits
 
!  Bits
Line 108: Line 152:  
|-
 
|-
 
| 0
 
| 0
| FUSE_PRIV2INTFC_SDATA
+
| FUSE_PRIV2INTFC_START_DATA
 
|-
 
|-
 
| 1
 
| 1
| FUSE_PRIV2INTFC_SKIP_RECORDS
+
| FUSE_PRIV2INTFC_START_SKIP_RECORDS
 
|}
 
|}
   −
==== FUSE_DIS_PGM ====
+
==== FUSE_DISABLEREGPROGRAM ====
 
If set to 0x01, this register disables fuse programming.
 
If set to 0x01, this register disables fuse programming.
   −
==== FUSE_WRITE_ACCESS ====
+
==== FUSE_WRITE_ACCESS_SW ====
 
If set to 0x01, this register disables software writes to the fuse driver registers.
 
If set to 0x01, this register disables software writes to the fuse driver registers.
   Line 133: Line 177:  
| FUSE_ODM_LOCK
 
| FUSE_ODM_LOCK
 
| 0x7000F908
 
| 0x7000F908
 +
|-
 +
| FUSE_OPT_OPENGL_EN
 +
| 0x7000F90C
 
|-
 
|-
 
| [[#FUSE_SKU_INFO|FUSE_SKU_INFO]]
 
| [[#FUSE_SKU_INFO|FUSE_SKU_INFO]]
 
| 0x7000F910
 
| 0x7000F910
 
|-
 
|-
| FUSE_CPU_SPEEDO_0
+
| FUSE_CPU_SPEEDO_0_CALIB
 
| 0x7000F914
 
| 0x7000F914
 
|-
 
|-
| FUSE_CPU_IDDQ
+
| FUSE_CPU_IDDQ_CALIB
 
| 0x7000F918
 
| 0x7000F918
 
|-
 
|-
Line 152: Line 199:  
| 0x7000F924
 
| 0x7000F924
 
|-
 
|-
| FUSE_FT_REV
+
| [[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]]
 
| 0x7000F928
 
| 0x7000F928
 
|-
 
|-
| FUSE_CPU_SPEEDO_1
+
| FUSE_CPU_SPEEDO_1_CALIB
 
| 0x7000F92C
 
| 0x7000F92C
 
|-
 
|-
| FUSE_CPU_SPEEDO_2
+
| FUSE_CPU_SPEEDO_2_CALIB
 
| 0x7000F930
 
| 0x7000F930
 
|-
 
|-
| FUSE_SOC_SPEEDO_0
+
| FUSE_SOC_SPEEDO_0_CALIB
 
| 0x7000F934
 
| 0x7000F934
 
|-
 
|-
| [[#FUSE_SOC_SPEEDO_1|FUSE_SOC_SPEEDO_1]]
+
| [[#FUSE_SOC_SPEEDO_1_CALIB|FUSE_SOC_SPEEDO_1_CALIB]]
 
| 0x7000F938
 
| 0x7000F938
 
|-
 
|-
| FUSE_SOC_SPEEDO_2
+
| FUSE_SOC_SPEEDO_2_CALIB
 
| 0x7000F93C
 
| 0x7000F93C
 
|-
 
|-
| FUSE_SOC_IDDQ
+
| FUSE_SOC_IDDQ_CALIB
 
| 0x7000F940
 
| 0x7000F940
 
|-
 
|-
Line 221: Line 268:  
| 0x7000F980
 
| 0x7000F980
 
|-
 
|-
| FUSE_TSENSOR_1
+
| FUSE_TSENSOR1_CALIB
 
| 0x7000F984
 
| 0x7000F984
 
|-
 
|-
| FUSE_TSENSOR_2
+
| FUSE_TSENSOR2_CALIB
 
| 0x7000F988
 
| 0x7000F988
 
|-
 
|-
Line 230: Line 277:  
| 0x7000F98C
 
| 0x7000F98C
 
|-
 
|-
| FUSE_CP_REV
+
| [[#FUSE_OPT_CP_REV|FUSE_OPT_CP_REV]]
 
| 0x7000F990
 
| 0x7000F990
 
|-
 
|-
Line 236: Line 283:  
| 0x7000F994
 
| 0x7000F994
 
|-
 
|-
| FUSE_TSENSOR_0
+
| FUSE_TSENSOR0_CALIB
 
| 0x7000F998
 
| 0x7000F998
 
|-
 
|-
| FUSE_FIRST_BOOTROM_PATCH_SIZE_REG
+
| FUSE_FIRST_BOOTROM_PATCH_SIZE
 
| 0x7000F99C
 
| 0x7000F99C
 
|-
 
|-
Line 260: Line 307:  
| 0x7000F9B4
 
| 0x7000F9B4
 
|-
 
|-
| FUSE_ARM_JTAG_DISABLE
+
| FUSE_ARM_JTAG_DIS
 
| 0x7000F9B8
 
| 0x7000F9B8
 
|-
 
|-
Line 269: Line 316:  
| 0x7000F9C0
 
| 0x7000F9C0
 
|-
 
|-
| FUSE_VP8_ENABLE
+
| FUSE_OPT_VP9_DISABLE
 
| 0x7000F9C4
 
| 0x7000F9C4
 
|-
 
|-
Line 302: Line 349:  
| 0x7000F9EC
 
| 0x7000F9EC
 
|-
 
|-
| FUSE_SKU_USB_CALIB
+
| FUSE_USB_CALIB
 
| 0x7000F9F0
 
| 0x7000F9F0
 
|-
 
|-
Line 314: Line 361:  
| 0x7000F9FC
 
| 0x7000F9FC
 
|-
 
|-
| FUSE_VENDOR_CODE
+
| FUSE_OPT_VENDOR_CODE
 
| 0x7000FA00
 
| 0x7000FA00
 
|-
 
|-
| FUSE_FAB_CODE
+
| FUSE_OPT_FAB_CODE
 
| 0x7000FA04
 
| 0x7000FA04
 
|-
 
|-
| FUSE_LOT_CODE_0
+
| FUSE_OPT_LOT_CODE_0
 
| 0x7000FA08
 
| 0x7000FA08
 
|-
 
|-
| FUSE_LOT_CODE_1
+
| FUSE_OPT_LOT_CODE_1
 
| 0x7000FA0C
 
| 0x7000FA0C
 
|-
 
|-
| FUSE_WAFER_ID
+
| FUSE_OPT_WAFER_ID
 
| 0x7000FA10
 
| 0x7000FA10
 
|-
 
|-
| FUSE_X_COORDINATE
+
| FUSE_OPT_X_COORDINATE
 
| 0x7000FA14
 
| 0x7000FA14
 
|-
 
|-
| FUSE_Y_COORDINATE
+
| FUSE_OPT_Y_COORDINATE
 
| 0x7000FA18
 
| 0x7000FA18
 
|-
 
|-
| FUSE_OPS_RESERVED
+
| FUSE_OPT_SEC_DEBUG_EN
 +
| 0x7000FA1C
 +
|-
 +
| FUSE_OPT_OPS_RESERVED
 
| 0x7000FA20
 
| 0x7000FA20
 
|-
 
|-
Line 341: Line 391:  
| 0x7000FA24
 
| 0x7000FA24
 
|-
 
|-
| FUSE_GPU_IDDQ
+
| FUSE_GPU_IDDQ_CALIB
 
| 0x7000FA28
 
| 0x7000FA28
 
|-
 
|-
| FUSE_TSENSOR_3
+
| FUSE_TSENSOR3_CALIB
 
| 0x7000FA2C
 
| 0x7000FA2C
 
|-
 
|-
Line 361: Line 411:  
| FUSE_SKU_BOND_OUT_W
 
| FUSE_SKU_BOND_OUT_W
 
| 0x7000FA40
 
| 0x7000FA40
 +
|-
 +
| FUSE_OPT_SAMPLE_TYPE
 +
| 0x7000FA44
 
|-
 
|-
 
| FUSE_OPT_SUBREVISION
 
| FUSE_OPT_SUBREVISION
 
| 0x7000FA48
 
| 0x7000FA48
 
|-
 
|-
| FUSE_TSENSOR_4
+
| FUSE_OPT_SW_RESERVED_0
 +
| 0x7000FA4C
 +
|-
 +
| FUSE_OPT_SW_RESERVED_1
 +
| 0x7000FA50
 +
|-
 +
| FUSE_TSENSOR4_CALIB
 
| 0x7000FA54
 
| 0x7000FA54
 
|-
 
|-
| FUSE_TSENSOR_5
+
| FUSE_TSENSOR5_CALIB
 
| 0x7000FA58
 
| 0x7000FA58
 
|-
 
|-
| FUSE_TSENSOR_6
+
| FUSE_TSENSOR6_CALIB
 
| 0x7000FA5C
 
| 0x7000FA5C
 
|-
 
|-
| FUSE_TSENSOR_7
+
| FUSE_TSENSOR7_CALIB
 
| 0x7000FA60
 
| 0x7000FA60
 
|-
 
|-
| FUSE_OPT_PRIV_SEC_DIS
+
| FUSE_OPT_PRIV_SEC_EN
 
| 0x7000FA64
 
| 0x7000FA64
 
|-
 
|-
Line 383: Line 442:  
| 0x7000FA68
 
| 0x7000FA68
 
|-
 
|-
| FUSE_FALCON_DEBUG_DISABLE
+
| FUSE_FUSE2TSEC_DEBUG_DISABLE
 
| 0x7000FA7C
 
| 0x7000FA7C
 
|-
 
|-
Line 389: Line 448:  
| 0x7000FA80
 
| 0x7000FA80
 
|-
 
|-
| FUSE_DEBUG_AUTH_OVERRIDE
+
| FUSE_OPT_CP_BIN
 +
| 0x7000FA84
 +
|-
 +
| FUSE_OPT_GPU_DISABLE
 +
| 0x7000FA88
 +
|-
 +
| FUSE_OPT_FT_BIN
 +
| 0x7000FA8C
 +
|-
 +
| FUSE_OPT_DONE_MAP
 +
| 0x7000FA90
 +
|-
 +
| FUSE_APB2JTAG_DISABLE
 +
| 0x7000FA98
 +
|-
 +
| FUSE_ODM_INFO
 
| 0x7000FA9C
 
| 0x7000FA9C
 +
|-
 +
| FUSE_ARM_CRYPT_DE_FEATURE
 +
| 0x7000FAA8
 +
|-
 +
| FUSE_WOA_SKU_FLAG
 +
| 0x7000FAC0
 +
|-
 +
| FUSE_ECO_RESERVE_1
 +
| 0x7000FAC4
 
|-
 
|-
 
| FUSE_GCPLEX_CONFIG_FUSE
 
| FUSE_GCPLEX_CONFIG_FUSE
 
| 0x7000FAC8
 
| 0x7000FAC8
 
|-
 
|-
| FUSE_TSENSOR_8
+
| FUSE_PRODUCTION_MONTH
 +
| 0x7000FACC
 +
|-
 +
| FUSE_RAM_REPAIR_INDICATOR
 +
| 0x7000FAD0
 +
|-
 +
| FUSE_TSENSOR9_CALIB
 
| 0x7000FAD4
 
| 0x7000FAD4
 +
|-
 +
| FUSE_VMIN_CALIBRATION
 +
| 0x7000FADC
 +
|-
 +
| FUSE_AGING_SENSOR_CALIBRATION
 +
| 0x7000FAE0
 
|-
 
|-
 
| FUSE_DEBUG_AUTHENTICATION
 
| FUSE_DEBUG_AUTHENTICATION
Line 404: Line 499:  
| 0x7000FAE8
 
| 0x7000FAE8
 
|-
 
|-
| FUSE_AID
+
| FUSE_SECURE_PROVISION_INFO
 +
| 0x7000FAEC
 +
|-
 +
| FUSE_OPT_GPU_DISABLE_CP1
 +
| 0x7000FAF0
 +
|-
 +
| FUSE_SPARE_ENDIS
 +
| 0x7000FAF4
 +
|-
 +
| FUSE_ECO_RESERVE_0
 
| 0x7000FAF8
 
| 0x7000FAF8
 
|-
 
|-
| FUSE_SPARE_REALIGNMENT_REG
+
| FUSE_SPARE_REALIGNMENT_REG_OLD
 
| 0x7000FAFC
 
| 0x7000FAFC
 
|-
 
|-
 
| FUSE_RESERVED_CALIB0
 
| FUSE_RESERVED_CALIB0
 
| 0x7000FB04
 
| 0x7000FB04
 +
|-
 +
| FUSE_RESERVED_CALIB1
 +
| 0x7000FB08
 
|-
 
|-
 
| FUSE_OPT_GPU_TPC0_DISABLE
 
| FUSE_OPT_GPU_TPC0_DISABLE
 
| 0x7000FB0C
 
| 0x7000FB0C
 
|-
 
|-
| FUSE_TSENSOR_9
+
| FUSE_OPT_GPU_TPC0_DISABLE_CP1
 +
| 0x7000FB10
 +
|-
 +
| FUSE_OPT_CPU_DISABLE
 +
| 0x7000FB14
 +
|-
 +
| FUSE_OPT_CPU_DISABLE_CP1
 +
| 0x7000FB18
 +
|-
 +
| FUSE_TSENSOR10_CALIB
 
| 0x7000FB1C
 
| 0x7000FB1C
 +
|-
 +
| FUSE_TSENSOR10_CALIB_AUX
 +
| 0x7000FB20
 +
|-
 +
| FUSE_OPT_RAM_SVOP_DP
 +
| 0x7000FB24
 +
|-
 +
| FUSE_OPT_RAM_SVOP_PDP
 +
| 0x7000FB28
 +
|-
 +
| FUSE_OPT_RAM_SVOP_REG
 +
| 0x7000FB2C
 +
|-
 +
| FUSE_OPT_RAM_SVOP_SP
 +
| 0x7000FB30
 +
|-
 +
| FUSE_OPT_RAM_SVOP_SMPDP
 +
| 0x7000FB34
 +
|-
 +
| FUSE_OPT_GPU_TPC0_DISABLE_CP2
 +
| 0x7000FB38
 
|-
 
|-
 
| FUSE_OPT_GPU_TPC1_DISABLE
 
| FUSE_OPT_GPU_TPC1_DISABLE
 
| 0x7000FB3C
 
| 0x7000FB3C
 +
|-
 +
| FUSE_OPT_GPU_TPC1_DISABLE_CP1
 +
| 0x7000FB40
 +
|-
 +
| FUSE_OPT_GPU_TPC1_DISABLE_CP2
 +
| 0x7000FB44
 +
|-
 +
| FUSE_OPT_CPU_DISABLE_CP2
 +
| 0x7000FB48
 +
|-
 +
| FUSE_OPT_GPU_DISABLE_CP2
 +
| 0x7000FB4C
 
|-
 
|-
 
| FUSE_USB_CALIB_EXT
 
| FUSE_USB_CALIB_EXT
 
| 0x7000FB50
 
| 0x7000FB50
 +
|-
 +
| FUSE_RESERVED_FIELD
 +
| 0x7000FB54
 
|-
 
|-
 
| FUSE_OPT_ECC_EN
 
| FUSE_OPT_ECC_EN
 
| 0x7000FB58
 
| 0x7000FB58
 +
|-
 +
| FUSE_SPARE_REALIGNMENT_REG
 +
| 0x7000FB7C
 
|-
 
|-
 
| FUSE_SPARE_BIT_0
 
| FUSE_SPARE_BIT_0
Line 527: Line 682:  
==== FUSE_SKU_INFO ====
 
==== FUSE_SKU_INFO ====
 
Stores the SKU ID (must be 0x83).
 
Stores the SKU ID (must be 0x83).
 +
 +
==== FUSE_OPT_FT_REV ====
 +
Stores the FT (Final Test) revision.
 +
 +
Original launch units have this value set to 0xA0 (revision 5.0). The first batch of patched units have this value set to 0xC0 (revision 6.0). The second batch of patched units have this value set to 0xE0 (revision 7.0)
    
==== FUSE_FA ====
 
==== FUSE_FA ====
 
Stores failure analysis mode.
 
Stores failure analysis mode.
   −
==== FUSE_SOC_SPEEDO_1 ====
+
==== FUSE_SOC_SPEEDO_1_CALIB ====
 
Stores the bootrom patch version.
 
Stores the bootrom patch version.
    
==== FUSE_RESERVED_ODM0 ====
 
==== FUSE_RESERVED_ODM0 ====
This appears to store a hardware ID.
+
This stores an hardware ID.
    
==== FUSE_RESERVED_ODM1 ====
 
==== FUSE_RESERVED_ODM1 ====
This appears to store a hardware ID.
+
This stores an hardware ID.
    
==== FUSE_RESERVED_ODM2 ====
 
==== FUSE_RESERVED_ODM2 ====
Line 546: Line 706:  
|-
 
|-
 
| 0-4
 
| 0-4
| [5.0.0+] Used as key generation
+
| [5.0.0+] Used as key generation (patched units only)
 
|}
 
|}
   −
This appears to store a hardware ID.
+
This stores an hardware ID in original launch units, but in patched units it stores a single value (key generation).
    
==== FUSE_RESERVED_ODM3 ====
 
==== FUSE_RESERVED_ODM3 ====
This appears to store a hardware ID.
+
This stores an hardware ID in original launch units, but in patched units it's empty.
    
==== FUSE_RESERVED_ODM4 ====
 
==== FUSE_RESERVED_ODM4 ====
Line 567: Line 727:  
| [1.0.0-3.0.2] 3-5
 
| [1.0.0-3.0.2] 3-5
 
[4.0.0+] 3-7
 
[4.0.0+] 3-7
| DRAM id
+
| DRAM ID
 
|-
 
|-
 
| 8
 
| 8
Line 579: Line 739:  
|-
 
|-
 
| 11
 
| 11
| [5.0.0+] SoC variant (0 = T210; 1 = T214)
+
| [5.0.0+] Unit patch flag (0 = unpatched; 1 = patched)
 
|-
 
|-
 
| 16-19
 
| 16-19
| [4.0.0+] New unit type
+
| [4.0.0+] New unit type (0 = Erista; 1 = Mariko; 2 = Mariko Lite)
 
|}
 
|}
   Line 593: Line 753:  
This register returns the value programmed into index 0x3C of the fuse array.
 
This register returns the value programmed into index 0x3C of the fuse array.
   −
==== FUSE_SPARE_BIT_2 ====
+
==== FUSE_PUBLIC_KEY ====
Stores part of the speedo fusing revision.
+
This stores the SHA256 hash of the 2048-bit RSA key expected at BCT+0x210.
   −
==== FUSE_SPARE_BIT_3 ====
+
==== FUSE_OPT_CP_REV ====
Stores part of the speedo fusing revision.
+
Stores the CP (Chip Probing) revision.
   −
==== FUSE_SPARE_BIT_4 ====
+
Original launch units have this value set to 0xA0 (revision 5.0). Patched units have this value set to 0x103 (revision 8.3).
Stores part of the speedo fusing revision.
  −
 
  −
==== FUSE_SPARE_BIT_5 ====
  −
Must be non-zero on retail units, otherwise the first bootloader panics.
  −
On debug units it can be zero, which tells the bootloader to choose from two debug master key seeds. If set to non-zero on a debug unit, it tells the bootloader to choose from two retail master key seeds (only the last one matches the retail master key seed).
      
==== FUSE_PRIVATE_KEY ====
 
==== FUSE_PRIVATE_KEY ====
 
This stores the 160-bit private key (128 bit SBK + 32-bit device key).
 
This stores the 160-bit private key (128 bit SBK + 32-bit device key).
 
Reads to these registers after the SBK is locked out produce all-FF output.
 
Reads to these registers after the SBK is locked out produce all-FF output.
  −
==== FUSE_PUBLIC_KEY ====
  −
This stores the SHA256 hash of the 2048-bit RSA key expected at BCT+0x210.
      
==== FUSE_RESERVED_SW ====
 
==== FUSE_RESERVED_SW ====
Line 638: Line 790:     
This caches the value of the sw_reserved fuse from the hardware array.
 
This caches the value of the sw_reserved fuse from the hardware array.
 +
 +
Original launch units have the RCM USB controller mode set to USB 2.0, while the first batch of patched units have the RCM USB controller mode set to XUSB.
    
==== FUSE_PKC_DISABLE ====
 
==== FUSE_PKC_DISABLE ====
 
This caches the value of the pkc_disable fuse from the hardware array.
 
This caches the value of the pkc_disable fuse from the hardware array.
 +
 +
==== FUSE_SPARE_BIT_2 ====
 +
Stores part of the speedo fusing revision.
 +
 +
==== FUSE_SPARE_BIT_3 ====
 +
Stores part of the speedo fusing revision.
 +
 +
==== FUSE_SPARE_BIT_4 ====
 +
Stores part of the speedo fusing revision.
 +
 +
==== FUSE_SPARE_BIT_5 ====
 +
Must be non-zero on retail units, otherwise the first bootloader panics.
 +
On debug units it can be zero, which tells the bootloader to choose from two debug master key seeds. If set to non-zero on a debug unit, it tells the bootloader to choose from two master key seeds (with the second one being the retail master key seed).
 +
 +
[4.0.0+] This value is no longer used during boot.
    
== eFuses ==
 
== eFuses ==
Line 719: Line 888:     
=== bootrom_ipatch ===
 
=== bootrom_ipatch ===
Tegra210 based hardware such as the Switch provides support for bootrom patches. The patch data is burned to the hardware fuse array using a specific format (see [https://gist.github.com/shuffle2/f8728159da100e9df2606d43925de0af shuffle2's ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP. The revision stored in FUSE_CP_REV indicates the unique set of values stored in ipatch fuses.
+
Tegra210 based hardware such as the Switch provides support for bootrom patches. The patch data is burned to the hardware fuse array using a specific format (see [https://gist.github.com/shuffle2/f8728159da100e9df2606d43925de0af shuffle2's ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP.
    
The following represents the patch data dumped from a Switch console:
 
The following represents the patch data dumped from a Switch console:
Line 727: Line 896:  
RAM:00000000
 
RAM:00000000
 
RAM:00000000 irom_svc_dispatch
 
RAM:00000000 irom_svc_dispatch
RAM:00000000  STMFD  SP!, {R0-R2}                  ; ipatches:
+
RAM:00000000  STMFD  SP!, {R0-R2}                  ; ipatches (new):
 +
RAM:00000000                                        ;  0  b57df00    16ae    df00 : svc #0x00 (offset 0x48)
 +
RAM:00000000                                        ;  1 1820df22    3040    df22 : svc #0x22 (offset 0x8c)
 +
RAM:00000000                                        ;  2 3797df26    6f2e    df26 : svc #0x26 (offset 0x94)
 +
RAM:00000000                                        ;  3 3b4d2100    769a    2100 : movs r1, #0x00
 +
RAM:00000000                                        ;  4  42bdf2c      856    df2c : svc #0x2c (offset 0xa0)
 +
RAM:00000000                                        ;  5 37aadf42    6f54    df42 : svc #0x42 (offset 0xcc)
 +
RAM:00000000                                        ;  6  972df4b    12e4    df4b : svc #0x4b (offset 0xde)
 +
RAM:00000000                                        ;  7 2293df54    4526    df54 : svc #0x54 (offset 0xf0)
 +
RAM:00000000                                        ;  8 21fadf5d    43f4    df5d : svc #0x5d (offset 0x102)
 +
RAM:00000000                                        ;  9 bba2ac57    17744    ac57 : data
 +
RAM:00000000                                        ; 10 bbac3d19    17758    3d19 : data
 +
RAM:00000000                                        ; 11 1e952001    3d2a    2001 : movs r0, #0x01
 +
RAM:00000000                                        ;
 +
RAM:00000000                                        ; ipatches (old):
 
RAM:00000000                                        ;  0  b57df00    16ae    df00 : svc #0x00 (offset 0x48)
 
RAM:00000000                                        ;  0  b57df00    16ae    df00 : svc #0x00 (offset 0x48)
 
RAM:00000000                                        ;  1 1820df22    3040    df22 : svc #0x22 (offset 0x8c)
 
RAM:00000000                                        ;  1 1820df22    3040    df22 : svc #0x22 (offset 0x8c)
Line 1,036: Line 1,219:     
==== ipatch 3 ====
 
==== ipatch 3 ====
This patch pertains to XHCI IRQ clearing checks and forces a result code to be 0.
+
This patch ensures that waiting on PRC_PENDING from the XUSB_DEV register T_XUSB_DEV_XHCI_PORTSC never fails.
 +
 
 +
In the second batch of patched units ([[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]] set to revision 7.0) this patch has been replaced with a fix for [[Switch_System_Flaws#Hardware|CVE-2018-6242]] (arbitrary copy when handling USB control requests in RCM). By setting R1 to 0 at address 0x0010769A in the bootrom, the upper 16 bits of the USB control request's wLength field are cleared out, effectively limiting the request's size to a maximum of 255 bytes.
    
==== ipatch 4 ====
 
==== ipatch 4 ====
Line 1,091: Line 1,276:     
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
  u32 FUSE_DEBUG_AUTH_OVERRIDE = 0x7000FA9C;
+
  u32 FUSE_ODM_INFO = 0x7000FA9C;
   −
  u32 debug_auth_override_val = *(u32 *)FUSE_DEBUG_AUTH_OVERRIDE;
+
  u32 odm_info = *(u32 *)FUSE_ODM_INFO;
  debug_auth_override_val = ((debug_auth_override_val >> 0x08) << 0x01);
+
  debug_auth_override_val = ((odm_info >> 0x08) << 0x01);
    
  // Override debug authentication value stored in IRAM
 
  // Override debug authentication value stored in IRAM
Line 1,164: Line 1,349:     
==== ipatch 11 ====
 
==== ipatch 11 ====
This patch pertains to the [[Security_Engine|Security Engine]] context restore process and forces SE_OPERATION_UNK1 to be 0x01.
+
This patch forces the value of [[Security_Engine|SE_TZRAM_SECURITY]] to be 0x01 instead of restoring it from the saved SE context.
    
== Anti-downgrade ==
 
== Anti-downgrade ==
Line 1,206: Line 1,391:  
| 6.2.0
 
| 6.2.0
 
| 8
 
| 8
 +
| 1
 +
|-
 +
| 7.0.0-8.0.1
 +
| 9
 +
| 1
 +
|-
 +
| 8.1.0
 +
| 10
 +
| 1
 +
|-
 +
| 9.0.0
 +
| 11
 
| 1
 
| 1
 
|}
 
|}

Navigation menu