/* SPDX-License-Identifier: BSD-3-Clause */

/*
 * TPM error codes.
 *
 * Copy-pasted and lightly edited from TCG TPM Main Part 2 TPM Structures
 * Version 1.2 Level 2 Revision 116 1 March 2011.
 */

#ifndef TSS_ERRORS_H_
#define TSS_ERRORS_H_

#include <stdint.h>

typedef uint32_t tpm_result_t;
#define TPM_Vendor_Specific32 0x400

#define TPM_BASE 0x0

#define TPM_NON_FATAL (0x800 + TPM_BASE)
#define TPM_CB_ERROR TPM_Vendor_Specific32

#define TPM_SUCCESS               ((tpm_result_t) (TPM_BASE + 0x00))
#define TPM_BADINDEX              ((tpm_result_t) (TPM_BASE + 0x02))
#define TPM_BAD_PARAMETER         ((tpm_result_t) (TPM_BASE + 0x03))
#define TPM_FAIL                  ((tpm_result_t) (TPM_BASE + 0x09))
#define TPM_OWNER_SET             ((tpm_result_t) (TPM_BASE + 0x14))
#define TPM_IOERROR               ((tpm_result_t) (TPM_BASE + 0x1F))
#define TPM_INVALID_POSTINIT      ((tpm_result_t) (TPM_BASE + 0x26))
#define TPM_BAD_PRESENCE          ((tpm_result_t) (TPM_BASE + 0x2D))
#define TPM_AREA_LOCKED           ((tpm_result_t) (TPM_BASE + 0x3C))
#define TPM_MAXNVWRITES           ((tpm_result_t) (TPM_BASE + 0x48))

#define TPM_RETRY          ((tpm_result_t) (TPM_NON_FATAL + 0x00))
#define TPM_NEEDS_SELFTEST ((tpm_result_t) (TPM_NON_FATAL + 0x01))
#define TPM_DOING_SELFTEST ((tpm_result_t) (TPM_NON_FATAL + 0x02))

/* The following values are defind at the offset 0x480 which is a combination
 *    of the 32-bit vendor specific value from the TCG standard(0x400) and an
 *    offset of 0x80 to assist in identifying these return values when the 8-bit
 *    truncated value is used.
 *
 * Valid offset range is 128-255(0x80-0xFF)
*/

#define TPM_CB_ALREADY_INITIALIZED    ((tpm_result_t) (TPM_CB_ERROR + 0x80))
#define TPM_CB_INTERNAL_INCONSISTENCY ((tpm_result_t) (TPM_CB_ERROR + 0x81))
#define TPM_CB_MUST_REBOOT            ((tpm_result_t) (TPM_CB_ERROR + 0x82))
#define TPM_CB_CORRUPTED_STATE        ((tpm_result_t) (TPM_CB_ERROR + 0x83))
#define TPM_CB_COMMUNICATION_ERROR    ((tpm_result_t) (TPM_CB_ERROR + 0x84))
#define TPM_CB_RESPONSE_TOO_LARGE     ((tpm_result_t) (TPM_CB_ERROR + 0x85))
#define TPM_CB_NO_DEVICE              ((tpm_result_t) (TPM_CB_ERROR + 0x86))
#define TPM_CB_INPUT_TOO_SMALL        ((tpm_result_t) (TPM_CB_ERROR + 0x87))
#define TPM_CB_WRITE_FAILURE          ((tpm_result_t) (TPM_CB_ERROR + 0x88))
#define TPM_CB_READ_EMPTY             ((tpm_result_t) (TPM_CB_ERROR + 0x89))
#define TPM_CB_READ_FAILURE           ((tpm_result_t) (TPM_CB_ERROR + 0x8A))
#define TPM_CB_NV_DEFINED             ((tpm_result_t) (TPM_CB_ERROR + 0x8B))
#define TPM_CB_INVALID_ARG            ((tpm_result_t) (TPM_CB_ERROR + 0x8C))
#define TPM_CB_HASH_ERROR             ((tpm_result_t) (TPM_CB_ERROR + 0x8D))
#define TPM_CB_NO_SUCH_COMMAND        ((tpm_result_t) (TPM_CB_ERROR + 0x8E))
#define TPM_CB_RANGE                  ((tpm_result_t) (TPM_CB_ERROR + 0x8F))
#define TPM_CB_FAIL                   ((tpm_result_t) (TPM_CB_ERROR + 0x90))
#define TPM_CB_TIMEOUT                ((tpm_result_t) (TPM_CB_ERROR + 0x91))

#endif /* TSS_ERRORS_H_ */
