1*36e3d877SAbhi.Singh /* 2*36e3d877SAbhi.Singh * Copyright (c) 2025, Arm Limited. All rights reserved. 3*36e3d877SAbhi.Singh * 4*36e3d877SAbhi.Singh * SPDX-License-Identifier: BSD-3-Clause 5*36e3d877SAbhi.Singh */ 6*36e3d877SAbhi.Singh 7*36e3d877SAbhi.Singh #ifndef TPM2_H 8*36e3d877SAbhi.Singh #define TPM2_H 9*36e3d877SAbhi.Singh 10*36e3d877SAbhi.Singh #include <assert.h> 11*36e3d877SAbhi.Singh #include <endian.h> 12*36e3d877SAbhi.Singh #include <errno.h> 13*36e3d877SAbhi.Singh #include <stdint.h> 14*36e3d877SAbhi.Singh 15*36e3d877SAbhi.Singh #include <drivers/tpm/tpm2_chip.h> 16*36e3d877SAbhi.Singh 17*36e3d877SAbhi.Singh /* Return values */ 18*36e3d877SAbhi.Singh enum tpm_ret_value { 19*36e3d877SAbhi.Singh TPM_SUCCESS = 0, 20*36e3d877SAbhi.Singh TPM_ERR_RESPONSE = -1, 21*36e3d877SAbhi.Singh TPM_INVALID_PARAM = -2, 22*36e3d877SAbhi.Singh TPM_ERR_TIMEOUT = -3, 23*36e3d877SAbhi.Singh TPM_ERR_TRANSFER = -4, 24*36e3d877SAbhi.Singh }; 25*36e3d877SAbhi.Singh 26*36e3d877SAbhi.Singh /* 27*36e3d877SAbhi.Singh * TPM FIFO register space address offsets 28*36e3d877SAbhi.Singh */ 29*36e3d877SAbhi.Singh #define TPM_FIFO_REG_ACCESS 0x00 30*36e3d877SAbhi.Singh #define TPM_FIFO_REG_INTR_ENABLE 0x08 31*36e3d877SAbhi.Singh #define TPM_FIFO_REG_INTR_VECTOR 0x0C 32*36e3d877SAbhi.Singh #define TPM_FIFO_REG_INTR_STS 0x10 33*36e3d877SAbhi.Singh #define TPM_FIFO_REG_INTF_CAPS 0x14 34*36e3d877SAbhi.Singh #define TPM_FIFO_REG_STATUS 0x18 35*36e3d877SAbhi.Singh #define TPM_FIFO_REG_BURST_COUNT_LO 0x19 36*36e3d877SAbhi.Singh #define TPM_FIFO_REG_BURST_COUNT_HI 0x20 37*36e3d877SAbhi.Singh #define TPM_FIFO_REG_DATA_FIFO 0x24 38*36e3d877SAbhi.Singh #define TPM_FIFO_REG_VENDID 0xF00 39*36e3d877SAbhi.Singh #define TPM_FIFO_REG_DEVID 0xF02 40*36e3d877SAbhi.Singh #define TPM_FIFO_REG_REVID 0xF04 41*36e3d877SAbhi.Singh 42*36e3d877SAbhi.Singh #define TPM_ST_NO_SESSIONS U(0x8001) 43*36e3d877SAbhi.Singh #define TPM_ST_SESSIONS U(0x8002) 44*36e3d877SAbhi.Singh 45*36e3d877SAbhi.Singh #define TPM_SU_CLEAR U(0x0000) 46*36e3d877SAbhi.Singh #define TPM_SU_STATE U(0x0001) 47*36e3d877SAbhi.Singh 48*36e3d877SAbhi.Singh #define TPM_MIN_AUTH_SIZE 9 49*36e3d877SAbhi.Singh #define TPM_RS_PW 0x40000009 50*36e3d877SAbhi.Singh #define TPM_ZERO_NONCE_SIZE 0 51*36e3d877SAbhi.Singh #define TPM_ATTRIBUTES_DISABLE 0 52*36e3d877SAbhi.Singh #define TPM_ZERO_HMAC_SIZE 0 53*36e3d877SAbhi.Singh #define TPM_SINGLE_HASH_COUNT 1 54*36e3d877SAbhi.Singh 55*36e3d877SAbhi.Singh 56*36e3d877SAbhi.Singh #define TPM_CMD_STARTUP U(0x0144) 57*36e3d877SAbhi.Singh #define TPM_CMD_PCR_READ U(0x017E) 58*36e3d877SAbhi.Singh #define TPM_CMD_PCR_EXTEND U(0x0182) 59*36e3d877SAbhi.Singh 60*36e3d877SAbhi.Singh #define TPM_RESPONSE_SUCCESS U(0x0000) 61*36e3d877SAbhi.Singh 62*36e3d877SAbhi.Singh #define TPM_ACCESS_ACTIVE_LOCALITY U(1 << 5) 63*36e3d877SAbhi.Singh #define TPM_ACCESS_VALID U(1 << 7) 64*36e3d877SAbhi.Singh #define TPM_ACCESS_RELINQUISH_LOCALITY U(1 << 5) 65*36e3d877SAbhi.Singh #define TPM_ACCESS_REQUEST_USE U(1 << 1) 66*36e3d877SAbhi.Singh #define TPM_ACCESS_REQUEST_PENDING U(1 << 2) 67*36e3d877SAbhi.Singh 68*36e3d877SAbhi.Singh #define TPM_STAT_VALID U(1 << 7) 69*36e3d877SAbhi.Singh #define TPM_STAT_COMMAND_READY U(1 << 6) 70*36e3d877SAbhi.Singh #define TPM_STAT_GO U(1 << 5) 71*36e3d877SAbhi.Singh #define TPM_STAT_AVAIL U(1 << 4) 72*36e3d877SAbhi.Singh #define TPM_STAT_EXPECT U(1 << 3) 73*36e3d877SAbhi.Singh 74*36e3d877SAbhi.Singh #define TPM_READ_HEADER -1 75*36e3d877SAbhi.Singh 76*36e3d877SAbhi.Singh #define TPM_HEADER_SIZE 10 77*36e3d877SAbhi.Singh #define MAX_SIZE_CMDBUF 256 78*36e3d877SAbhi.Singh #define MAX_CMD_DATA (MAX_SIZE_CMDBUF - TPM_HEADER_SIZE) 79*36e3d877SAbhi.Singh 80*36e3d877SAbhi.Singh #pragma pack(1) 81*36e3d877SAbhi.Singh typedef struct tpm_cmd_hdr { 82*36e3d877SAbhi.Singh uint16_t tag; 83*36e3d877SAbhi.Singh uint32_t cmd_size; 84*36e3d877SAbhi.Singh uint32_t cmd_code; 85*36e3d877SAbhi.Singh } tpm_cmd_hdr; 86*36e3d877SAbhi.Singh 87*36e3d877SAbhi.Singh typedef struct tpm_cmd { 88*36e3d877SAbhi.Singh tpm_cmd_hdr header; 89*36e3d877SAbhi.Singh uint8_t data[MAX_CMD_DATA]; 90*36e3d877SAbhi.Singh } tpm_cmd; 91*36e3d877SAbhi.Singh #pragma pack() 92*36e3d877SAbhi.Singh 93*36e3d877SAbhi.Singh int tpm_interface_init(struct tpm_chip_data *chip_data, uint8_t locality); 94*36e3d877SAbhi.Singh 95*36e3d877SAbhi.Singh int tpm_interface_close(struct tpm_chip_data *chip_data, uint8_t locality); 96*36e3d877SAbhi.Singh 97*36e3d877SAbhi.Singh int tpm_startup(struct tpm_chip_data *chip_data, uint16_t mode); 98*36e3d877SAbhi.Singh 99*36e3d877SAbhi.Singh int tpm_pcr_extend(struct tpm_chip_data *chip_data, uint32_t index, 100*36e3d877SAbhi.Singh uint16_t algorithm, const uint8_t *digest, 101*36e3d877SAbhi.Singh uint32_t digest_len); 102*36e3d877SAbhi.Singh 103*36e3d877SAbhi.Singh #endif /* TPM2_H */ 104