| /* | |
| * Public TPM functions | |
| * | |
| * Copyright (C) 2011-2013 IBM Corporation | |
| * | |
| * Authors: | |
| * Stefan Berger <stefanb@us.ibm.com> | |
| * | |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
| * See the COPYING file in the top-level directory. | |
| */ | |
| #ifndef QEMU_TPM_H | |
| #define QEMU_TPM_H | |
| #include "qapi/qapi-types-tpm.h" | |
| #include "qom/object.h" | |
| #ifdef CONFIG_TPM | |
| int tpm_config_parse(QemuOptsList *opts_list, const char *optstr); | |
| int tpm_init(void); | |
| void tpm_cleanup(void); | |
| typedef enum TPMVersion { | |
| TPM_VERSION_UNSPEC = 0, | |
| TPM_VERSION_1_2 = 1, | |
| TPM_VERSION_2_0 = 2, | |
| } TPMVersion; | |
| #define TYPE_TPM_IF "tpm-if" | |
| typedef struct TPMIfClass TPMIfClass; | |
| DECLARE_CLASS_CHECKERS(TPMIfClass, TPM_IF, | |
| TYPE_TPM_IF) | |
| #define TPM_IF(obj) \ | |
| INTERFACE_CHECK(TPMIf, (obj), TYPE_TPM_IF) | |
| typedef struct TPMIf TPMIf; | |
| struct TPMIfClass { | |
| InterfaceClass parent_class; | |
| enum TpmModel model; | |
| void (*request_completed)(TPMIf *obj, int ret); | |
| enum TPMVersion (*get_version)(TPMIf *obj); | |
| bool ppi_enabled; | |
| }; | |
| #define TYPE_TPM_TIS_ISA "tpm-tis" | |
| #define TYPE_TPM_TIS_SYSBUS "tpm-tis-device" | |
| #define TYPE_TPM_CRB "tpm-crb" | |
| #define TYPE_TPM_SPAPR "tpm-spapr" | |
| #define TYPE_TPM_TIS_I2C "tpm-tis-i2c" | |
| #define TPM_IS_TIS_ISA(chr) \ | |
| object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_ISA) | |
| #define TPM_IS_TIS_SYSBUS(chr) \ | |
| object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_SYSBUS) | |
| #define TPM_IS_CRB(chr) \ | |
| object_dynamic_cast(OBJECT(chr), TYPE_TPM_CRB) | |
| #define TPM_IS_SPAPR(chr) \ | |
| object_dynamic_cast(OBJECT(chr), TYPE_TPM_SPAPR) | |
| #define TPM_IS_TIS_I2C(chr) \ | |
| object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_I2C) | |
| /* returns NULL unless there is exactly one TPM device */ | |
| static inline TPMIf *tpm_find(void) | |
| { | |
| Object *obj = object_resolve_path_type("", TYPE_TPM_IF, NULL); | |
| return TPM_IF(obj); | |
| } | |
| static inline TPMVersion tpm_get_version(TPMIf *ti) | |
| { | |
| if (!ti) { | |
| return TPM_VERSION_UNSPEC; | |
| } | |
| return TPM_IF_GET_CLASS(ti)->get_version(ti); | |
| } | |
| static inline bool tpm_ppi_enabled(TPMIf *ti) | |
| { | |
| if (!ti) { | |
| return false; | |
| } | |
| return TPM_IF_GET_CLASS(ti)->ppi_enabled; | |
| } | |
| #else /* CONFIG_TPM */ | |
| #define tpm_init() (0) | |
| #define tpm_cleanup() | |
| /* needed for an alignment check in non-tpm code */ | |
| static inline Object *TPM_IS_CRB(Object *obj) | |
| { | |
| return NULL; | |
| } | |
| #endif /* CONFIG_TPM */ | |
| #endif /* QEMU_TPM_H */ |