1ac90053dSEric Auger /* 2ac90053dSEric Auger * tpm_tis.h - QEMU's TPM TIS common header 3ac90053dSEric Auger * 4ac90053dSEric Auger * Copyright (C) 2006,2010-2013 IBM Corporation 5ac90053dSEric Auger * 6ac90053dSEric Auger * Authors: 7ac90053dSEric Auger * Stefan Berger <stefanb@us.ibm.com> 8ac90053dSEric Auger * David Safford <safford@us.ibm.com> 9ac90053dSEric Auger * 10ac90053dSEric Auger * Xen 4 support: Andrease Niederl <andreas.niederl@iaik.tugraz.at> 11ac90053dSEric Auger * 12ac90053dSEric Auger * This work is licensed under the terms of the GNU GPL, version 2 or later. 13ac90053dSEric Auger * See the COPYING file in the top-level directory. 14ac90053dSEric Auger * 15ac90053dSEric Auger * Implementation of the TIS interface according to specs found at 16ac90053dSEric Auger * http://www.trustedcomputinggroup.org. This implementation currently 17ac90053dSEric Auger * supports version 1.3, 21 March 2013 18ac90053dSEric Auger * In the developers menu choose the PC Client section then find the TIS 19ac90053dSEric Auger * specification. 20ac90053dSEric Auger * 21ac90053dSEric Auger * TPM TIS for TPM 2 implementation following TCG PC Client Platform 22*6eedbb5bSMichael Tokarev * TPM Profile (PTP) Specification, Family 2.0, Revision 00.43 23ac90053dSEric Auger */ 24ac90053dSEric Auger #ifndef TPM_TPM_TIS_H 25ac90053dSEric Auger #define TPM_TPM_TIS_H 26ac90053dSEric Auger 27ac90053dSEric Auger #include "sysemu/tpm_backend.h" 28ac90053dSEric Auger #include "tpm_ppi.h" 29ac90053dSEric Auger 30ac90053dSEric Auger #define TPM_TIS_NUM_LOCALITIES 5 /* per spec */ 31ac90053dSEric Auger #define TPM_TIS_LOCALITY_SHIFT 12 32ac90053dSEric Auger #define TPM_TIS_NO_LOCALITY 0xff 33ac90053dSEric Auger 34ac90053dSEric Auger #define TPM_TIS_IS_VALID_LOCTY(x) ((x) < TPM_TIS_NUM_LOCALITIES) 35ac90053dSEric Auger 36ac90053dSEric Auger #define TPM_TIS_BUFFER_MAX 4096 37ac90053dSEric Auger 38ac90053dSEric Auger typedef enum { 39ac90053dSEric Auger TPM_TIS_STATE_IDLE = 0, 40ac90053dSEric Auger TPM_TIS_STATE_READY, 41ac90053dSEric Auger TPM_TIS_STATE_COMPLETION, 42ac90053dSEric Auger TPM_TIS_STATE_EXECUTION, 43ac90053dSEric Auger TPM_TIS_STATE_RECEPTION, 44ac90053dSEric Auger } TPMTISState; 45ac90053dSEric Auger 46ac90053dSEric Auger /* locality data -- all fields are persisted */ 47ac90053dSEric Auger typedef struct TPMLocality { 48ac90053dSEric Auger TPMTISState state; 49ac90053dSEric Auger uint8_t access; 50ac90053dSEric Auger uint32_t sts; 51ac90053dSEric Auger uint32_t iface_id; 52ac90053dSEric Auger uint32_t inte; 53ac90053dSEric Auger uint32_t ints; 54ac90053dSEric Auger } TPMLocality; 55ac90053dSEric Auger 56ac90053dSEric Auger typedef struct TPMState { 57ac90053dSEric Auger MemoryRegion mmio; 58ac90053dSEric Auger 59ac90053dSEric Auger unsigned char buffer[TPM_TIS_BUFFER_MAX]; 60ac90053dSEric Auger uint16_t rw_offset; 61ac90053dSEric Auger 62ac90053dSEric Auger uint8_t active_locty; 63ac90053dSEric Auger uint8_t aborting_locty; 64ac90053dSEric Auger uint8_t next_locty; 65ac90053dSEric Auger 66ac90053dSEric Auger TPMLocality loc[TPM_TIS_NUM_LOCALITIES]; 67ac90053dSEric Auger 68ac90053dSEric Auger qemu_irq irq; 69ac90053dSEric Auger uint32_t irq_num; 70ac90053dSEric Auger 71ac90053dSEric Auger TPMBackendCmd cmd; 72ac90053dSEric Auger 73ac90053dSEric Auger TPMBackend *be_driver; 74ac90053dSEric Auger TPMVersion be_tpm_version; 75ac90053dSEric Auger 76ac90053dSEric Auger size_t be_buffer_size; 77ac90053dSEric Auger 78ac90053dSEric Auger bool ppi_enabled; 79ac90053dSEric Auger TPMPPI ppi; 80ac90053dSEric Auger } TPMState; 81ac90053dSEric Auger 82ac90053dSEric Auger extern const VMStateDescription vmstate_locty; 83ac90053dSEric Auger extern const MemoryRegionOps tpm_tis_memory_ops; 84ac90053dSEric Auger 85ac90053dSEric Auger int tpm_tis_pre_save(TPMState *s); 86ac90053dSEric Auger void tpm_tis_reset(TPMState *s); 87ac90053dSEric Auger enum TPMVersion tpm_tis_get_tpm_version(TPMState *s); 88ac90053dSEric Auger void tpm_tis_request_completed(TPMState *s, int ret); 89bbadfb2eSNinad Palsule uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size); 90bbadfb2eSNinad Palsule void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size); 91bbadfb2eSNinad Palsule uint16_t tpm_tis_get_checksum(TPMState *s); 92ac90053dSEric Auger 93ac90053dSEric Auger #endif /* TPM_TPM_TIS_H */ 94