|
root / base / usr / src / uts / common / io / tpm / tpm_ddi.h
tpm_ddi.h C 118 lines 2.7 KB
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_TPM_DDI_H
#define	_TPM_DDI_H

/* Duration index is SHORT, MEDIUM, LONG, UNDEFINED */
#define	TPM_DURATION_MAX_IDX	3

/*
 * IO buffer size: this seems sufficient, but feel free to modify
 * This should be at minimum 765
 */
#define	TPM_IO_BUF_SIZE		4096

#define	TPM_IO_TIMEOUT		10000000

/*
 * Flags to keep track of for the allocated resources
 * so we know what to deallocate later on
 */
enum tpm_ddi_resources_flags {
	TPM_OPENED = 0x001,
	TPM_DIDMINOR = 0x002,
	TPM_DIDREGSMAP = 0x004,
	TPM_DIDINTMUTEX = 0x008,
	TPM_DIDINTCV = 0x010,
	TPM_DID_IO_ALLOC = 0x100,
	TPM_DID_IO_MUTEX = 0x200,
	TPM_DID_IO_CV = 0x400,
	TPM_DID_MUTEX = 0x800,
	TPM_DID_SOFT_STATE = 0x1000,
#ifdef sun4v
	TPM_HSVC_REGISTERED = 0x2000
#endif
};

typedef struct tpm_state tpm_state_t;

/* TPM specific data structure */
struct tpm_state {
	/* TPM specific */
	TPM_CAP_VERSION_INFO vers_info;

	/* OS specific */
	int 		instance;
	dev_info_t 	*dip;
	ddi_acc_handle_t handle;

	kmutex_t	dev_lock;
	uint8_t		dev_held;

	/*
	 * For read/write
	 */
	uint8_t		*iobuf;
	size_t		bufsize;
	uint8_t		iobuf_inuse;
	kmutex_t	iobuf_lock;
	kcondvar_t	iobuf_cv;

	/*
	 * For supporting the interrupt
	 */
	uint8_t			intr_enabled;
	ddi_intr_handle_t	*h_array;
	uint_t			intr_pri;
	unsigned int		state;

	uint8_t		*addr;		/* where TPM is mapped to */
	char		locality;	/* keep track of the locality */

	uint32_t flags;		/* flags to keep track of what is allocated */
	clock_t duration[4];	/* short,medium,long,undefined */
	clock_t timeout_a;
	clock_t timeout_b;
	clock_t timeout_c;
	clock_t timeout_d;
	clock_t timeout_poll;

	ddi_device_acc_attr_t accattr;

	/* For power management. */
	kmutex_t	pm_mutex;
	kcondvar_t	suspend_cv;
	uint32_t	suspended;

#ifdef KCF_TPM_RNG_PROVIDER
	/* For RNG */
	crypto_kcf_provider_handle_t	n_prov;
#endif
};

#endif	/* _TPM_DDI_H */