xref: /qemu/include/sysemu/tpm.h (revision fcd9a353)
1bdee56f5SPaolo Bonzini /*
2bdee56f5SPaolo Bonzini  * Public TPM functions
3bdee56f5SPaolo Bonzini  *
4bdee56f5SPaolo Bonzini  * Copyright (C) 2011-2013 IBM Corporation
5bdee56f5SPaolo Bonzini  *
6bdee56f5SPaolo Bonzini  * Authors:
7bdee56f5SPaolo Bonzini  *  Stefan Berger    <stefanb@us.ibm.com>
8bdee56f5SPaolo Bonzini  *
9bdee56f5SPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10bdee56f5SPaolo Bonzini  * See the COPYING file in the top-level directory.
11bdee56f5SPaolo Bonzini  */
12bdee56f5SPaolo Bonzini #ifndef QEMU_TPM_H
13bdee56f5SPaolo Bonzini #define QEMU_TPM_H
14bdee56f5SPaolo Bonzini 
159af23989SMarkus Armbruster #include "qapi/qapi-types-tpm.h"
166b287efeSPhilippe Mathieu-Daudé #include "qom/object.h"
17bdee56f5SPaolo Bonzini 
18e542b718SStefan Berger #ifdef CONFIG_TPM
19e542b718SStefan Berger 
20fcd9a353SPhilippe Mathieu-Daudé int tpm_config_parse(QemuOptsList *opts_list, const char *optstr);
21d64072c0SMarkus Armbruster int tpm_init(void);
22bdee56f5SPaolo Bonzini void tpm_cleanup(void);
23bdee56f5SPaolo Bonzini 
24116694c3SStefan Berger typedef enum TPMVersion {
25116694c3SStefan Berger     TPM_VERSION_UNSPEC = 0,
26116694c3SStefan Berger     TPM_VERSION_1_2 = 1,
27116694c3SStefan Berger     TPM_VERSION_2_0 = 2,
28116694c3SStefan Berger } TPMVersion;
29116694c3SStefan Berger 
3067af320cSMarc-André Lureau #define TYPE_TPM_IF "tpm-if"
31db1015e9SEduardo Habkost typedef struct TPMIfClass TPMIfClass;
328110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(TPMIfClass, TPM_IF,
338110fa1dSEduardo Habkost                        TYPE_TPM_IF)
3467af320cSMarc-André Lureau #define TPM_IF(obj)                             \
3567af320cSMarc-André Lureau     INTERFACE_CHECK(TPMIf, (obj), TYPE_TPM_IF)
3667af320cSMarc-André Lureau 
37aa1b35b9SMarc-André Lureau typedef struct TPMIf TPMIf;
3867af320cSMarc-André Lureau 
39db1015e9SEduardo Habkost struct TPMIfClass {
4067af320cSMarc-André Lureau     InterfaceClass parent_class;
4167af320cSMarc-André Lureau 
42191adc94SMarc-André Lureau     enum TpmModel model;
436a8a2354SMarc-André Lureau     void (*request_completed)(TPMIf *obj, int ret);
449af7a721SMarc-André Lureau     enum TPMVersion (*get_version)(TPMIf *obj);
45db1015e9SEduardo Habkost };
4667af320cSMarc-André Lureau 
4743bc7f84SEric Auger #define TYPE_TPM_TIS_ISA            "tpm-tis"
48229de57aSEric Auger #define TYPE_TPM_TIS_SYSBUS         "tpm-tis-device"
494ab6cb4cSMarc-André Lureau #define TYPE_TPM_CRB                "tpm-crb"
503676bc69SStefan Berger #define TYPE_TPM_SPAPR              "tpm-spapr"
51139fdb3eSNinad Palsule #define TYPE_TPM_TIS_I2C            "tpm-tis-i2c"
52711b20b4SStefan Berger 
5343bc7f84SEric Auger #define TPM_IS_TIS_ISA(chr)                         \
5443bc7f84SEric Auger     object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_ISA)
5580bde693SEric Auger #define TPM_IS_TIS_SYSBUS(chr)                      \
5680bde693SEric Auger     object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_SYSBUS)
574ab6cb4cSMarc-André Lureau #define TPM_IS_CRB(chr)                             \
584ab6cb4cSMarc-André Lureau     object_dynamic_cast(OBJECT(chr), TYPE_TPM_CRB)
593676bc69SStefan Berger #define TPM_IS_SPAPR(chr)                           \
603676bc69SStefan Berger     object_dynamic_cast(OBJECT(chr), TYPE_TPM_SPAPR)
61139fdb3eSNinad Palsule #define TPM_IS_TIS_I2C(chr)                      \
62139fdb3eSNinad Palsule     object_dynamic_cast(OBJECT(chr), TYPE_TPM_TIS_I2C)
63ff5ce21eSMarc-André Lureau 
643dfd5a2aSMarc-André Lureau /* returns NULL unless there is exactly one TPM device */
tpm_find(void)653dfd5a2aSMarc-André Lureau static inline TPMIf *tpm_find(void)
66711b20b4SStefan Berger {
673dfd5a2aSMarc-André Lureau     Object *obj = object_resolve_path_type("", TYPE_TPM_IF, NULL);
685cb18b3dSStefan Berger 
693dfd5a2aSMarc-André Lureau     return TPM_IF(obj);
705cb18b3dSStefan Berger }
713dfd5a2aSMarc-André Lureau 
tpm_get_version(TPMIf * ti)723dfd5a2aSMarc-André Lureau static inline TPMVersion tpm_get_version(TPMIf *ti)
733dfd5a2aSMarc-André Lureau {
743dfd5a2aSMarc-André Lureau     if (!ti) {
755cb18b3dSStefan Berger         return TPM_VERSION_UNSPEC;
76711b20b4SStefan Berger     }
77711b20b4SStefan Berger 
789af7a721SMarc-André Lureau     return TPM_IF_GET_CLASS(ti)->get_version(ti);
793dfd5a2aSMarc-André Lureau }
803dfd5a2aSMarc-André Lureau 
81e542b718SStefan Berger #else /* CONFIG_TPM */
82e542b718SStefan Berger 
83e542b718SStefan Berger #define tpm_init()  (0)
84e542b718SStefan Berger #define tpm_cleanup()
85e542b718SStefan Berger 
864168cdadSEric Auger /* needed for an alignment check in non-tpm code */
TPM_IS_CRB(Object * obj)874168cdadSEric Auger static inline Object *TPM_IS_CRB(Object *obj)
884168cdadSEric Auger {
894168cdadSEric Auger      return NULL;
904168cdadSEric Auger }
914168cdadSEric Auger 
92e542b718SStefan Berger #endif /* CONFIG_TPM */
93e542b718SStefan Berger 
94bdee56f5SPaolo Bonzini #endif /* QEMU_TPM_H */
95