183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */ 21259dcd7SChristophe Ricard /* 31259dcd7SChristophe Ricard * Copyright (C) 2011 Infineon Technologies 41259dcd7SChristophe Ricard * 51259dcd7SChristophe Ricard * Authors: 61259dcd7SChristophe Ricard * Peter Huewe <huewe.external@infineon.com> 71259dcd7SChristophe Ricard * 81259dcd7SChristophe Ricard * Version: 2.1.1 91259dcd7SChristophe Ricard * 101259dcd7SChristophe Ricard * Description: 111259dcd7SChristophe Ricard * Device driver for TCG/TCPA TPM (trusted platform module). 121259dcd7SChristophe Ricard * Specifications at www.trustedcomputinggroup.org 131259dcd7SChristophe Ricard * 141259dcd7SChristophe Ricard * It is based on the Linux kernel driver tpm.c from Leendert van 151259dcd7SChristophe Ricard * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall. 161259dcd7SChristophe Ricard */ 171259dcd7SChristophe Ricard 181259dcd7SChristophe Ricard #ifndef _TPM_TIS_I2C_H 191259dcd7SChristophe Ricard #define _TPM_TIS_I2C_H 201259dcd7SChristophe Ricard 211259dcd7SChristophe Ricard #include <linux/compiler.h> 221259dcd7SChristophe Ricard #include <linux/types.h> 231259dcd7SChristophe Ricard 241259dcd7SChristophe Ricard enum tpm_timeout { 251259dcd7SChristophe Ricard TPM_TIMEOUT_MS = 5, 261259dcd7SChristophe Ricard TIS_SHORT_TIMEOUT_MS = 750, 271259dcd7SChristophe Ricard TIS_LONG_TIMEOUT_MS = 2000, 281259dcd7SChristophe Ricard SLEEP_DURATION_US = 60, 291259dcd7SChristophe Ricard SLEEP_DURATION_LONG_US = 210, 301259dcd7SChristophe Ricard }; 311259dcd7SChristophe Ricard 321259dcd7SChristophe Ricard /* Size of external transmit buffer (used in tpm_transmit)*/ 331259dcd7SChristophe Ricard #define TPM_BUFSIZE 4096 341259dcd7SChristophe Ricard 351259dcd7SChristophe Ricard /* Index of Count field in TPM response buffer */ 361259dcd7SChristophe Ricard #define TPM_RSP_SIZE_BYTE 2 371259dcd7SChristophe Ricard #define TPM_RSP_RC_BYTE 6 381259dcd7SChristophe Ricard 391259dcd7SChristophe Ricard struct tpm_chip { 401259dcd7SChristophe Ricard int is_open; 411259dcd7SChristophe Ricard int locality; 421259dcd7SChristophe Ricard u32 vend_dev; 43*06425aa0SMiquel Raynal u8 rid; 441259dcd7SChristophe Ricard unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* msec */ 451259dcd7SChristophe Ricard ulong chip_type; 461259dcd7SChristophe Ricard }; 471259dcd7SChristophe Ricard 481259dcd7SChristophe Ricard struct tpm_input_header { 491259dcd7SChristophe Ricard __be16 tag; 501259dcd7SChristophe Ricard __be32 length; 511259dcd7SChristophe Ricard __be32 ordinal; 521259dcd7SChristophe Ricard } __packed; 531259dcd7SChristophe Ricard 541259dcd7SChristophe Ricard struct tpm_output_header { 551259dcd7SChristophe Ricard __be16 tag; 561259dcd7SChristophe Ricard __be32 length; 571259dcd7SChristophe Ricard __be32 return_code; 581259dcd7SChristophe Ricard } __packed; 591259dcd7SChristophe Ricard 601259dcd7SChristophe Ricard struct timeout_t { 611259dcd7SChristophe Ricard __be32 a; 621259dcd7SChristophe Ricard __be32 b; 631259dcd7SChristophe Ricard __be32 c; 641259dcd7SChristophe Ricard __be32 d; 651259dcd7SChristophe Ricard } __packed; 661259dcd7SChristophe Ricard 671259dcd7SChristophe Ricard struct duration_t { 681259dcd7SChristophe Ricard __be32 tpm_short; 691259dcd7SChristophe Ricard __be32 tpm_medium; 701259dcd7SChristophe Ricard __be32 tpm_long; 711259dcd7SChristophe Ricard } __packed; 721259dcd7SChristophe Ricard 731259dcd7SChristophe Ricard union cap_t { 741259dcd7SChristophe Ricard struct timeout_t timeout; 751259dcd7SChristophe Ricard struct duration_t duration; 761259dcd7SChristophe Ricard }; 771259dcd7SChristophe Ricard 781259dcd7SChristophe Ricard struct tpm_getcap_params_in { 791259dcd7SChristophe Ricard __be32 cap; 801259dcd7SChristophe Ricard __be32 subcap_size; 811259dcd7SChristophe Ricard __be32 subcap; 821259dcd7SChristophe Ricard } __packed; 831259dcd7SChristophe Ricard 841259dcd7SChristophe Ricard struct tpm_getcap_params_out { 851259dcd7SChristophe Ricard __be32 cap_size; 861259dcd7SChristophe Ricard union cap_t cap; 871259dcd7SChristophe Ricard } __packed; 881259dcd7SChristophe Ricard 891259dcd7SChristophe Ricard union tpm_cmd_header { 901259dcd7SChristophe Ricard struct tpm_input_header in; 911259dcd7SChristophe Ricard struct tpm_output_header out; 921259dcd7SChristophe Ricard }; 931259dcd7SChristophe Ricard 941259dcd7SChristophe Ricard union tpm_cmd_params { 951259dcd7SChristophe Ricard struct tpm_getcap_params_out getcap_out; 961259dcd7SChristophe Ricard struct tpm_getcap_params_in getcap_in; 971259dcd7SChristophe Ricard }; 981259dcd7SChristophe Ricard 991259dcd7SChristophe Ricard struct tpm_cmd_t { 1001259dcd7SChristophe Ricard union tpm_cmd_header header; 1011259dcd7SChristophe Ricard union tpm_cmd_params params; 1021259dcd7SChristophe Ricard } __packed; 1031259dcd7SChristophe Ricard 1041259dcd7SChristophe Ricard /* Max number of iterations after i2c NAK */ 1051259dcd7SChristophe Ricard #define MAX_COUNT 3 1061259dcd7SChristophe Ricard 1071259dcd7SChristophe Ricard /* 1081259dcd7SChristophe Ricard * Max number of iterations after i2c NAK for 'long' commands 1091259dcd7SChristophe Ricard * 1101259dcd7SChristophe Ricard * We need this especially for sending TPM_READY, since the cleanup after the 1111259dcd7SChristophe Ricard * transtion to the ready state may take some time, but it is unpredictable 1121259dcd7SChristophe Ricard * how long it will take. 1131259dcd7SChristophe Ricard */ 1141259dcd7SChristophe Ricard #define MAX_COUNT_LONG 50 1151259dcd7SChristophe Ricard 1161259dcd7SChristophe Ricard enum tis_access { 1171259dcd7SChristophe Ricard TPM_ACCESS_VALID = 0x80, 1181259dcd7SChristophe Ricard TPM_ACCESS_ACTIVE_LOCALITY = 0x20, 1191259dcd7SChristophe Ricard TPM_ACCESS_REQUEST_PENDING = 0x04, 1201259dcd7SChristophe Ricard TPM_ACCESS_REQUEST_USE = 0x02, 1211259dcd7SChristophe Ricard }; 1221259dcd7SChristophe Ricard 1231259dcd7SChristophe Ricard enum tis_status { 1241259dcd7SChristophe Ricard TPM_STS_VALID = 0x80, 1251259dcd7SChristophe Ricard TPM_STS_COMMAND_READY = 0x40, 1261259dcd7SChristophe Ricard TPM_STS_GO = 0x20, 1271259dcd7SChristophe Ricard TPM_STS_DATA_AVAIL = 0x10, 1281259dcd7SChristophe Ricard TPM_STS_DATA_EXPECT = 0x08, 1291259dcd7SChristophe Ricard }; 1301259dcd7SChristophe Ricard 1311259dcd7SChristophe Ricard #endif 132