^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012 IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Author: Ashley Lai <ashleydlai@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Maintained by: <tpmdd-devel@lists.sourceforge.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Device driver for TCG/TCPA TPM (trusted platform module).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Specifications at www.trustedcomputinggroup.org
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifndef __TPM_IBMVTPM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define __TPM_IBMVTPM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* vTPM Message Format 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) struct ibmvtpm_crq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) u8 valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) u8 msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) __be16 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) __be32 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) __be64 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) } __attribute__((packed, aligned(8)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct ibmvtpm_crq_queue {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct ibmvtpm_crq *crq_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) u32 index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) u32 num_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) wait_queue_head_t wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct ibmvtpm_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct vio_dev *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct ibmvtpm_crq_queue crq_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) dma_addr_t crq_dma_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) u32 rtce_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) void __iomem *rtce_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) dma_addr_t rtce_dma_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) spinlock_t rtce_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) wait_queue_head_t wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u16 res_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u32 vtpm_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 tpm_processing_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define CRQ_RES_BUF_SIZE PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* Initialize CRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define INIT_CRQ_CMD 0xC001000000000000LL /* Init cmd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define INIT_CRQ_COMP_CMD 0xC002000000000000LL /* Init complete cmd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define INIT_CRQ_RES 0x01 /* Init respond */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define INIT_CRQ_COMP_RES 0x02 /* Init complete respond */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define VALID_INIT_CRQ 0xC0 /* Valid command for init crq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* vTPM CRQ response is the message type | 0x80 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define VTPM_MSG_RES 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define IBMVTPM_VALID_CMD 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* vTPM CRQ message types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define VTPM_GET_VERSION 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define VTPM_GET_VERSION_RES (0x01 | VTPM_MSG_RES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define VTPM_TPM_COMMAND 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define VTPM_TPM_COMMAND_RES (0x02 | VTPM_MSG_RES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define VTPM_GET_RTCE_BUFFER_SIZE 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define VTPM_GET_RTCE_BUFFER_SIZE_RES (0x03 | VTPM_MSG_RES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define VTPM_PREPARE_TO_SUSPEND 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define VTPM_PREPARE_TO_SUSPEND_RES (0x04 | VTPM_MSG_RES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #endif