PMU microcode commands

Introduction

Todo

write me

Sample Implementation

Example of setting up, running and handling potential error or timeout states.

Pseudocode:

// Define interface to Falcon
#define PDAEMON_SCRATCH0  0x10a040
#define PDAEMON_SCRATCH1  0x10a044

// Preparatory step
#define PUNITS_UNK008     0x022408

temp = nvkm_rd32(PUNITS_UNK008);
nvkm_wr32((PUNITS_UNK008, temp | 0x2);

// Prepare and send PMU microcode command

command_id     = NV_UCODE_CMD_COMMAND_EID;  // 0x02
command_status = NV_UCODE_CMD_STS_NEW;      // 0x01

command_packet = command_id & 0xFFFFFFF | command_status;

nvkm_wr32(PDAEMON_SCRATCH0, command_packet);

// Loop whilst awaiting response
for (i = 0; i < 50000; ++i) {
  pmu_command_response = nvkm_rd32(PDAEMON_SCRATCH0);

  pmu_command_response_status = pmu_command_response & 0xF0000000;

  if (pmu_command_response_status == 0x30000000)       // NV_UCODE_CMD_STS_COMPLETE
    break;
  if ( (pmu_command_response_status != 0x20000000) &&  // NV_UCODE_CMD_STS_PENDING
       (pmu_command_response_status != 0x10000000) )   // NV_UCODE_CMD_STS_NEW
  {
    RESPONSE_UNK1 = 1;
    break;
  }

  if (i == 50000-1)
    RESPONSE_UNK2 = 1;
}

if (RESPONSE_UNK1 || RESPONSE_UNK2) {
  // Handle timeouts
}
else {
  pmu_error_code = nvkm_rd32(PDAEMON_SCRATCH1);
  if (pmu_error_code & 0x7FFFFFFF) {
    // Handle error code
  }
  if ( (pmu_error_code & 0x80000000) == 0x80000000) {
    // getlog_cmd_do()
  }

  // Handle PMU command responses
}

Commands

XXX: Gaps expected. Based upon PMU microcode shipped with 390.67

Opcode Name Description
0x00 NV_UCODE_CMD_COMMAND_NONE  
0x01    
0x02 NV_UCODE_CMD_COMMAND_EID EEPROM ID
0x03 NV_UCODE_CMD_COMMAND_ESI Structure Init
0x04 NV_UCODE_CMD_COMMAND_ERD Read EEPROM
0x05 NV_UCODE_CMD_COMMAND_EWR Write EEPROM
0x06 NV_UCODE_CMD_COMMAND_ESE Erase Sector
0x07 NV_UCODE_CMD_COMMAND_ECE Erase Chip
0x08 NV_UCODE_CMD_COMMAND_RRD Read priv register using PMU microcode
0x09 NV_UCODE_CMD_COMMAND_RWR Write priv register using PMU microcode
0x0a NV_UCODE_CMD_COMMAND_PREP  
0x0b NV_UCODE_CMD_COMMAND_CLOSE  
0x0c NV_UCODE_CMD_COMMAND_EPROT Set Software Protection
0x0d NV_UCODE_CMD_COMMAND_ERDSR Read Status Register
0x0e NV_UCODE_CMD_COMMAND_VV Verify VBIOS
0x0f NV_UCODE_CMD_COMMAND_ECID  
0x10 NV_UCODE_CMD_COMMAND_LICVERIFY  
0x11 NV_UCODE_CMD_COMMAND_BSI_INFO  
0x12 NV_UCODE_CMD_COMMAND_HULKPROC  
0x13 NV_UCODE_CMD_COMMAND_ARB  
0x14 NV_UCODE_CMD_COMMAND_UNK14 Related to license file generation
0x15    
0x16    
0x17 NV_UCODE_CMD_COMMAND_OTP_READ  
0x18 NV_UCODE_CMD_COMMAND_OTP_READLOCK  

Command Status

Opcode Name Description
0x00 NV_UCODE_CMD_STS_NONE  
0x01 NV_UCODE_CMD_STS_NEW  
0x02 NV_UCODE_CMD_STS_PENDING  
0x03 NV_UCODE_CMD_STS_COMPLETE  

Error Codes

XXX: Gaps expected. Based upon PMU microcode shipped with 390.67

Opcode Name Description
0x00 NV_UCODE_ERR_CODE_CMD_NOERROR No error
0x01 NV_UCODE_ERR_CODE_CMD_TIMEOUT Timeout occurred waiting for PMU
0x02 NV_UCODE_ERR_CODE_CMD_DEPENDENCY May need other command to be issued first before carrying out this command
0x03 NV_UCODE_ERR_CODE_CMD_EID_RD_ERROR EEPROM ID process failed
0x04 NV_UCODE_ERR_CODE_CMD_ERD_BUF_WR_ERROR Cannot write more bytes than size of image buffer
0x05 NV_UCODE_ERR_CODE_CMD_EWR_BUF_RD_ERROR Cannot read more bytes than size of image buffer
0x06 NV_UCODE_ERR_CODE_CMD_UNSUPPORTED_GPU  
0x07 NV_UCODE_ERR_CODE_CMD_UNSUPPORTED_COMMAND Invalid command
0x08 NV_UCODE_ERR_CODE_CMD_UNSUPPORTED_PARAMETER Supplied parameter is invalid or out of range
0x09 NV_UCODE_ERR_CODE_CMD_SECURE_REV_LOCK_VIOLATION  
0x0a NV_UCODE_ERR_CODE_LOAD_VBIOS_VERIFY_UCODE_FAIL  
0x0b NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_DEBUG_FUSE_BOARD  
0x0c NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_DEVID_FAIL  
0x0d NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_CERT_NOT_FOUND  
0x0e NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_CERT_PARSE_FAIL  
0x0f NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_CERT_VERIFY_FAIL  
0x10 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_HAT_FAIL  
0x11 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_BIOS_SIG_FAIL  
0x12 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_HULK_INIT_FAIL  
0x13 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_HULK_KA_NOT_FOUND  
0x14 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_HULK_TYPE_INVALID  
0x15 NV_UCODE_ERR_CODE_CMD_VBIOS_VERIFY_HULK_SIG_INVALID  
0x16 NV_UCODE_ERR_CODE_CERT_UNKNOWN_ERROR  
0x17 NV_UCODE_ERR_CODE_CERT_EXT_NOT_FOUND  
0x18 NV_UCODE_ERR_CODE_CERT_SIGNATURE_NOT_FOUND  
0x19 NV_UCODE_ERR_CODE_CERT_RSA1K_SIGNATURE_INVALID  
0x1a NV_UCODE_ERR_CODE_CERT_EXT_NO_SUB_STRUCT_FOUND  
0x1b NV_UCODE_ERR_CODE_CERT_UNSUPPORTED_VERSION  
0x1c NV_UCODE_ERR_CODE_CERT_NO_EXTENSION_EXIST  
0x1d NV_UCODE_ERR_CODE_CERT_T7QV1_PAYLOAD_SIZE_ERROR  
0x1e NV_UCODE_ERR_CODE_CERT_T7_SW_FEATURE_PAYLOAD_SIZE_ERROR  
0x1f NV_UCODE_ERR_CODE_CERT_T7_UNSUPPORTED_HW_STRUCT_VERSION  
0x20 NV_UCODE_ERR_CODE_CERT_T7_EXTENSIONS_NUM_EXCEED_LIMIT  
0x21 NV_UCODE_ERR_CODE_CERT_UGPU_PERSONALITY_MIS_MATCH  
0x22 NV_UCODE_ERR_CODE_CERT_UNKNOWN_HULK_FEATURE  
0x23 NV_UCODE_ERR_CODE_CERT_HULK_ECID_MISMATCH  
0x24 NV_UCODE_ERR_CODE_CERT_HULK_ECID_ENCODING_UNKNOWN  
0x25 NV_UCODE_ERR_CODE_ECID_ENCODING_ALGO_UNKNOWN  
0x26 NV_UCODE_ERR_CODE_CERT_T7_REG_OVERRIDE_TYPE_UNKNOWN  
0x27 NV_UCODE_ERR_CODE_LICVERIFY_UNSUPPORTED_LIC_TYPE  
0x28 NV_UCODE_ERR_CODE_UNSUPPORTED_CONFIG  
0x29 NV_UCODE_ERR_CODE_BSI_INFO_BRSS_INVALID  
0x2a NV_UCODE_ERR_CODE_IMEM_TO_DMEM_COPY_INVALID_PARA  
0x2b NV_UCODE_ERR_CODE_DERIVED_KEY_TYPE_INVALID  
0x2c NV_UCODE_ERR_CODE_UCODE_NOT_IN_HS_MODE  
0x2d NV_UCODE_ERR_CODE_VBIOS_DEVINIT_OFFSETS_INVALID  
0x2e NV_UCODE_ERR_CODE_VBIOS_DEVINIT_SIG_INVALID  
0x2f NV_UCODE_ERR_CODE_CERT_HULK_DEVID_MISMATCH  
0x30 NV_UCODE_ERR_CODE_CERT_HULK_NO_ID_MATCH_FOUND  
0x31 NV_UCODE_ERR_CODE_CERT_HULK_DATA_BUFFER_TOO_SMALL  
0x32 NV_UCODE_ERR_CODE_CERT_HULK_INFOROM_NOT_FOUND  
0x33 NV_UCODE_ERR_CODE_CERT_HULK_INFOROM_UL_GLOB_NOT_FOUND  
0x34 NV_UCODE_ERR_CODE_CERT_HULK_INFOROM_HLK_OBJ_NOT_VALID  
0x35 NV_UCODE_ERR_CODE_CERT_UGPU_LICENSE_PROCESSING_FAILED  
0x36 NV_UCODE_ERR_CODE_UGPU_PROCESSING_FAILED_INVALID_ULF_OBJECT  
0x37 NV_UCODE_ERR_CODE_UGPU_PROCESSING_FAILED_INVALID_UPR_OBJECT  
0x38 NV_UCODE_ERR_CODE_CERT20_INTBLK_VDPA_HEADER_INVALID  
0x39 NV_UCODE_ERR_CODE_CERT20_INTBLK_INT_SIG_HEADER_INVALID  
0x3a NV_UCODE_ERR_CODE_CERT20_INTBLK_INT_SIG_CRYPTO_UNDEFINED  
0x3b NV_UCODE_ERR_CODE_CERT20_VDPA_UNEXPECTED_MAJOR_TYPE  
0x3c NV_UCODE_ERR_CODE_CERT20_VDPA_UNEXPECTED_MINOR_TYPE  
0x3d NV_UCODE_ERR_CODE_CERT20_VDPA_ENTRY_SIZE_LARGER_THAN_DATA_BUFFER  
0x3e NV_UCODE_ERR_CODE_CERT20_VDPA_UNEXPECTED_CODE_TYPE  
0x3f NV_UCODE_ERR_CODE_CERT20_VDPA_NOT_FINALIZED  
0x40 NV_UCODE_ERR_CODE_CERT20_VDPA_SIG_INVALID  
0x41 NV_UCODE_ERR_CODE_CERT20_VDPA_ENTRY_NOT_FOUND  
0x42 NV_UCODE_ERR_CODE_CERT20_VDPA_CERT_INTBLK_MISMATCH  
0x43 NV_UCODE_ERR_CODE_CERT20_VDPA_ENTRY_FOUND_DATA_MISMATCH  
0x44 NV_UCODE_ERR_CODE_CERT20_VDPA_DATA_INVALID  
0x45 NV_UCODE_ERR_CODE_CERT20_VDPA_FLASH_SIZE_LARGER_THAN_EXPECTED  
0x46 NV_UCODE_ERR_CODE_CERT20_VDPA_DEVID_MISMATCH  
0x47 NV_UCODE_ERR_CODE_GPU_INITIALIZATION_TABLES_SIG_CHECK_FAILED Also known as NV_UCODE_ERR_CODE_VBIOS_DEVINIT_TABLES_SIG_INVALID
0x48 NV_UCODE_ERR_CODE_GPU_INITIALIZATION_SCRIPTS_SIG_CHECK_FAILED Also known as NV_UCODE_ERR_CODE_VBIOS_DEVINIT_SCRIPTS_SIG_INVALID
0x49    
0x4a NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_LICENSE_NOT_PRESENT  
0x4b NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_LICENSE_KA_NOT_FOUND  
0x4c NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_LICENSE_TYPE_INVALID  
0x4d NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_3AES_SIG_MISMATCH_WITH_GPU_FUSE  
0x4e NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_NO_3AES_SIG  
0x4f NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_LICENSE_HULK_AES_SIG_INVALID  
0x50 NV_UCODE_ERR_CODE_VERIFY_ENG_HULK_LICENSE_NVF_ENG_AES_SIG_INVALID  
0x51 NV_UCODE_ERR_CODE_CHECK_ERASE_LICENSE_ERASE_DISALLOWED  
0x52 NV_UCODE_ERR_CODE_CMD_PREP_LICENSE_SIZE_OVERFLOW  
0x53 NV_UCODE_ERR_CODE_CMD_EWR_NO_ERASE_NOT_PERMITTED  
0x54 NV_UCODE_ERR_CODE_CMD_EWR_NO_VERIFY_NOT_PERMITTED  
0x55 NV_UCODE_ERR_CODE_CMD_ESE_NOT_PERMITTED  
0x56 NV_UCODE_ERR_CODE_CMD_ECE_NOT_PERMITTED  
0x57 NV_UCODE_ERR_CODE_CERT20_VDPA_UNEXPECTED_INSTANCE  
0x58 NV_UCODE_ERR_CODE_DEVID_MATCH_LIST_MORE_DEVIDS_THAN_BUFFERS  
0x59 NV_UCODE_ERR_CODE_DEVID_MATCH_LIST_SIG_INVALID  
0x5a NV_UCODE_ERR_CODE_DEVID_MATCH_LIST_DEVID_MATCH_FAILED  
0x5b NV_UCODE_ERR_CODE_DEVID_MATCH_LIST_DEVID_NOT_FOR_THE_GPU  
0x5c NV_UCODE_ERR_CODE_DEVID_MATCH_LIST_DEVID_OUT_OF_HAT_COVERAGE  
0x5d NV_UCODE_ERR_CODE_PUSH_POLL_DMEM_COPY_BUFFER_OVERFLOW  
0x5e NV_UCODE_ERR_CODE_PUSH_POLL_DMEM_COPY_DATA_OUT_OF_RANGE  
0x5f NV_UCODE_ERR_CODE_CERT20_INTBLK_VDPA_BLOCK_OVERSIZE  
0x60    
0x61    
0x62    
0x63    
0x64    
0x65    
0x66    
0x67    
0x68    
0x69    
0x6a    
0x6b    
0x6c NV_UCODE_ERR_CODE_CMD_EWR_OK_TO_FLASH_CHECK_FAILED  
0x6e NV_UCODE_ERR_CODE_HW_SPI_TIMEOUT  
0x6f    
0x70    
0x71    
0x72    
0x73 NV_UCODE_ERR_CODE_CERT21_FMT_HAT_ENTRY_NUMBER_INVALID  
0x74 NV_UCODE_ERR_CODE_CERT21_FMT_HAT_ENTRY_FOMMATTER_TOO_LONG  
0x75 NV_UCODE_ERR_CODE_CERT21_FMT_FORMATTER_DATA_BLOCK_OVER_SIZE  
0x76 NV_UCODE_ERR_CODE_CERT21_FMT_UNEXPECTED_FORMATTER_TYPE  
0x77 NV_UCODE_ERR_CODE_CERT21_FMT_EXCEED_FORMATTER_LENGTH  
0x78 NV_UCODE_ERR_CODE_EEPROM_OTP_DEVICE_UNSUPPORTED  
0x79 NV_UCODE_ERR_CODE_EEPROM_OTP_ERASE_NOT_PRESENT  
0x7a NV_UCODE_ERR_CODE_EEPROM_OTP_FACTORY_LOCK_NOT_PRESENT  
0x7b NV_UCODE_ERR_CODE_EEPROM_OTP_FACTORY_REGION_NOT_PRESENT  
0x7c NV_UCODE_ERR_CODE_EEPROM_OTP_USER_ADDRESS_OUT_OF_RANGE  
0x7d NV_UCODE_ERR_CODE_EEPROM_OTP_FACTORY_ADDRESS_OUT_OF_RANGE  
0x7f    
0x80    
0x81    
0x82 NV_UCODE_ERR_CODE_PLAY_READY_PDUB_SIG_INVALID  
0x83 NV_UCODE_ERR_CODE_PLAY_READY_PDUB_ENTRY_NOT_FOUND  
0x84 NV_UCODE_ERR_CODE_PLAY_READY_EXIT_FOR_DEVINIT_NOT_RUN  
0x85 NV_UCODE_ERR_CODE_PLAY_READY_PDUB_PRIV_CONN_STATE_MISMATCH  
0x86 NV_UCODE_ERR_CODE_PLAY_READY_OTP_ENTRY_NOT_AVAILABLE  
0x87 NV_UCODE_ERR_CODE_PLAY_READY_SEC2_MUTEX_ACQUIRE_FAILED  
0x88 NV_UCODE_ERR_CODE_PLAY_READY_SEC2_MUTEX_RELEASE_FAILED  
0x89 NV_UCODE_ERR_CODE_VERIFY_ENG_LICENSE_INCORRECT_TYPE  
0x8a NV_UCODE_ERR_CODE_INVALID_FALCON  
0x8b NV_UCODE_ERR_CODE_NUM_REPAIR_ENTRIES_EXCEEDS_MAX_ALLOWED  
0x8c NV_UCODE_ERR_CODE_INVALID_REPAIR_OBJECT  
0x8d NV_UCODE_ERR_CODE_BCRT2x_CERT_BUFFER_OVERFLOW  
0x8e NV_UCODE_ERR_CODE_BCRT2x_HAT_ENTRIES_BUFFER_OVERFLOW  
0x8f NV_UCODE_ERR_CODE_BCRT2x_HAT_HEADER_OVER_SIZE  
0x90 NV_UCODE_ERR_CODE_BCRT2x_RSA_SIG_HEADER_OVER_SIZE  
0x91    
0x92 NV_UCODE_ERR_CODE_BCRT2X_CERT_BLOCK_VERSION_UNEXPECTED  
0x93 NV_UCODE_ERR_CODE_BCRT2X_CERT_CONTROL_HEADER_OVERFLOW  
0x94 NV_UCODE_ERR_CODE_BCRT2X_MAX_SECURITYZONE_REACHED  
0x95 NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIGNATURES_SIZE_CHECK_FAILED  
0x96 NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIG_STRUCT_SIZE_CHECK_FAILED  
0x97 NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIG_ZONE_NUM_INVALID  
0x98 NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIG_ALGO_INVALID  
0x99 NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_BUILT_IN_SEC_ZONE_MISSING  
0x9a NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIGNATURE_INVALID  
0x9b NV_UCODE_ERR_CODE_BCRT2X_SECURITYZONE_SIG_NOT_FOUND  
0x9c NV_UCODE_ERR_CODE_BCRT2X_VDPA_ENTRY_VERIFY_HASH_MISMATCH  
0x9d NV_UCODE_ERR_CODE_BCRT2X_VDPA_INTBLK_ENTRIES_NUM_EXCEED_MAX