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