Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Copyright (C) 2004 IBM Corporation
  3 *
  4 * Authors:
  5 * Leendert van Doorn <leendert@watson.ibm.com>
  6 * Dave Safford <safford@watson.ibm.com>
  7 * Reiner Sailer <sailer@watson.ibm.com>
  8 * Kylene Hall <kjhall@us.ibm.com>
  9 *
 10 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
 11 *
 12 * Device driver for TCG/TCPA TPM (trusted platform module).
 13 * Specifications at www.trustedcomputinggroup.org	 
 14 *
 15 * This program is free software; you can redistribute it and/or
 16 * modify it under the terms of the GNU General Public License as
 17 * published by the Free Software Foundation, version 2 of the
 18 * License.
 19 * 
 20 */
 21#include <linux/module.h>
 22#include <linux/delay.h>
 23#include <linux/fs.h>
 24#include <linux/mutex.h>
 25#include <linux/sched.h>
 26#include <linux/miscdevice.h>
 27#include <linux/platform_device.h>
 28#include <linux/io.h>
 29#include <linux/tpm.h>
 30
 31enum tpm_timeout {
 32	TPM_TIMEOUT = 5,	/* msecs */
 33};
 34
 35/* TPM addresses */
 36enum tpm_addr {
 37	TPM_SUPERIO_ADDR = 0x2E,
 38	TPM_ADDR = 0x4E,
 39};
 40
 
 
 
 
 
 41extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
 42				char *);
 43extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
 44				char *);
 45extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr,
 46				char *);
 47extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr,
 48				char *);
 49extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr,
 50				const char *, size_t);
 51extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr,
 52				char *);
 53extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr,
 54				char *);
 55extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
 56				char *);
 57extern ssize_t tpm_show_temp_deactivated(struct device *,
 58					 struct device_attribute *attr, char *);
 59extern ssize_t tpm_show_durations(struct device *,
 60				  struct device_attribute *attr, char *);
 61extern ssize_t tpm_show_timeouts(struct device *,
 62				 struct device_attribute *attr, char *);
 63
 64struct tpm_chip;
 65
 66struct tpm_vendor_specific {
 67	const u8 req_complete_mask;
 68	const u8 req_complete_val;
 69	const u8 req_canceled;
 70	void __iomem *iobase;		/* ioremapped address */
 71	unsigned long base;		/* TPM base address */
 72
 73	int irq;
 74	int probed_irq;
 75
 76	int region_size;
 77	int have_region;
 78
 79	int (*recv) (struct tpm_chip *, u8 *, size_t);
 80	int (*send) (struct tpm_chip *, u8 *, size_t);
 81	void (*cancel) (struct tpm_chip *);
 82	u8 (*status) (struct tpm_chip *);
 83	void (*release) (struct device *);
 84	struct miscdevice miscdev;
 85	struct attribute_group *attr_group;
 86	struct list_head list;
 87	int locality;
 88	unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
 89	bool timeout_adjusted;
 90	unsigned long duration[3]; /* jiffies */
 91	bool duration_adjusted;
 92
 93	wait_queue_head_t read_queue;
 94	wait_queue_head_t int_queue;
 95};
 96
 
 
 97struct tpm_chip {
 98	struct device *dev;	/* Device stuff */
 99
100	int dev_num;		/* /dev/tpm# */
101	unsigned long is_open;	/* only one allowed */
102	int time_expired;
103
104	/* Data passed to and from the tpm via the read/write calls */
105	u8 *data_buffer;
106	atomic_t data_pending;
107	struct mutex buffer_mutex;
108
109	struct timer_list user_read_timer;	/* user needs to claim result */
110	struct work_struct work;
111	struct mutex tpm_mutex;	/* tpm is processing */
112
113	struct tpm_vendor_specific vendor;
114
115	struct dentry **bios_dir;
116
117	struct list_head list;
118	void (*release) (struct device *);
119};
120
121#define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor)
122
123static inline void tpm_chip_put(struct tpm_chip *chip)
124{
125	module_put(chip->dev->driver->owner);
126}
127
128static inline int tpm_read_index(int base, int index)
129{
130	outb(index, base);
131	return inb(base+1) & 0xFF;
132}
133
134static inline void tpm_write_index(int base, int index, int value)
135{
136	outb(index, base);
137	outb(value & 0xFF, base+1);
138}
139struct tpm_input_header {
140	__be16	tag;
141	__be32	length;
142	__be32	ordinal;
143}__attribute__((packed));
144
145struct tpm_output_header {
146	__be16	tag;
147	__be32	length;
148	__be32	return_code;
149}__attribute__((packed));
150
151struct	stclear_flags_t {
152	__be16	tag;
153	u8	deactivated;
154	u8	disableForceClear;
155	u8	physicalPresence;
156	u8	physicalPresenceLock;
157	u8	bGlobalLock;
158}__attribute__((packed));
159
160struct	tpm_version_t {
161	u8	Major;
162	u8	Minor;
163	u8	revMajor;
164	u8	revMinor;
165}__attribute__((packed));
166
167struct	tpm_version_1_2_t {
168	__be16	tag;
169	u8	Major;
170	u8	Minor;
171	u8	revMajor;
172	u8	revMinor;
173}__attribute__((packed));
174
175struct	timeout_t {
176	__be32	a;
177	__be32	b;
178	__be32	c;
179	__be32	d;
180}__attribute__((packed));
181
182struct duration_t {
183	__be32	tpm_short;
184	__be32	tpm_medium;
185	__be32	tpm_long;
186}__attribute__((packed));
187
188struct permanent_flags_t {
189	__be16	tag;
190	u8	disable;
191	u8	ownership;
192	u8	deactivated;
193	u8	readPubek;
194	u8	disableOwnerClear;
195	u8	allowMaintenance;
196	u8	physicalPresenceLifetimeLock;
197	u8	physicalPresenceHWEnable;
198	u8	physicalPresenceCMDEnable;
199	u8	CEKPUsed;
200	u8	TPMpost;
201	u8	TPMpostLock;
202	u8	FIPS;
203	u8	operator;
204	u8	enableRevokeEK;
205	u8	nvLocked;
206	u8	readSRKPub;
207	u8	tpmEstablished;
208	u8	maintenanceDone;
209	u8	disableFullDALogicInfo;
210}__attribute__((packed));
211
212typedef union {
213	struct	permanent_flags_t perm_flags;
214	struct	stclear_flags_t	stclear_flags;
215	bool	owned;
216	__be32	num_pcrs;
217	struct	tpm_version_t	tpm_version;
218	struct	tpm_version_1_2_t tpm_version_1_2;
219	__be32	manufacturer_id;
220	struct timeout_t  timeout;
221	struct duration_t duration;
222} cap_t;
223
224struct	tpm_getcap_params_in {
225	__be32	cap;
226	__be32	subcap_size;
227	__be32	subcap;
228}__attribute__((packed));
229
230struct	tpm_getcap_params_out {
231	__be32	cap_size;
232	cap_t	cap;
233}__attribute__((packed));
234
235struct	tpm_readpubek_params_out {
236	u8	algorithm[4];
237	u8	encscheme[2];
238	u8	sigscheme[2];
239	__be32	paramsize;
240	u8	parameters[12]; /*assuming RSA*/
241	__be32	keysize;
242	u8	modulus[256];
243	u8	checksum[20];
244}__attribute__((packed));
245
246typedef union {
247	struct	tpm_input_header in;
248	struct	tpm_output_header out;
249} tpm_cmd_header;
250
251#define TPM_DIGEST_SIZE 20
252struct tpm_pcrread_out {
253	u8	pcr_result[TPM_DIGEST_SIZE];
254}__attribute__((packed));
255
256struct tpm_pcrread_in {
257	__be32	pcr_idx;
258}__attribute__((packed));
259
260struct tpm_pcrextend_in {
261	__be32	pcr_idx;
262	u8	hash[TPM_DIGEST_SIZE];
263}__attribute__((packed));
264
265typedef union {
266	struct	tpm_getcap_params_out getcap_out;
267	struct	tpm_readpubek_params_out readpubek_out;
268	u8	readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
269	struct	tpm_getcap_params_in getcap_in;
270	struct	tpm_pcrread_in	pcrread_in;
271	struct	tpm_pcrread_out	pcrread_out;
272	struct	tpm_pcrextend_in pcrextend_in;
273} tpm_cmd_params;
274
275struct tpm_cmd_t {
276	tpm_cmd_header	header;
277	tpm_cmd_params	params;
278}__attribute__((packed));
279
280ssize_t	tpm_getcap(struct device *, __be32, cap_t *, const char *);
281
282extern void tpm_get_timeouts(struct tpm_chip *);
283extern void tpm_gen_interrupt(struct tpm_chip *);
284extern void tpm_continue_selftest(struct tpm_chip *);
285extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
286extern struct tpm_chip* tpm_register_hardware(struct device *,
287				 const struct tpm_vendor_specific *);
288extern int tpm_open(struct inode *, struct file *);
289extern int tpm_release(struct inode *, struct file *);
290extern void tpm_dev_vendor_release(struct tpm_chip *);
291extern ssize_t tpm_write(struct file *, const char __user *, size_t,
292			 loff_t *);
293extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
294extern void tpm_remove_hardware(struct device *);
295extern int tpm_pm_suspend(struct device *, pm_message_t);
296extern int tpm_pm_resume(struct device *);
297
 
298#ifdef CONFIG_ACPI
299extern struct dentry ** tpm_bios_log_setup(char *);
300extern void tpm_bios_log_teardown(struct dentry **);
301#else
302static inline struct dentry ** tpm_bios_log_setup(char *name)
303{
304	return NULL;
305}
306static inline void tpm_bios_log_teardown(struct dentry **dir)
307{
308}
309#endif
v3.5.6
  1/*
  2 * Copyright (C) 2004 IBM Corporation
  3 *
  4 * Authors:
  5 * Leendert van Doorn <leendert@watson.ibm.com>
  6 * Dave Safford <safford@watson.ibm.com>
  7 * Reiner Sailer <sailer@watson.ibm.com>
  8 * Kylene Hall <kjhall@us.ibm.com>
  9 *
 10 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
 11 *
 12 * Device driver for TCG/TCPA TPM (trusted platform module).
 13 * Specifications at www.trustedcomputinggroup.org	 
 14 *
 15 * This program is free software; you can redistribute it and/or
 16 * modify it under the terms of the GNU General Public License as
 17 * published by the Free Software Foundation, version 2 of the
 18 * License.
 19 * 
 20 */
 21#include <linux/module.h>
 22#include <linux/delay.h>
 23#include <linux/fs.h>
 24#include <linux/mutex.h>
 25#include <linux/sched.h>
 26#include <linux/miscdevice.h>
 27#include <linux/platform_device.h>
 28#include <linux/io.h>
 29#include <linux/tpm.h>
 30
 31enum tpm_timeout {
 32	TPM_TIMEOUT = 5,	/* msecs */
 33};
 34
 35/* TPM addresses */
 36enum tpm_addr {
 37	TPM_SUPERIO_ADDR = 0x2E,
 38	TPM_ADDR = 0x4E,
 39};
 40
 41#define TPM_WARN_DOING_SELFTEST 0x802
 42#define TPM_ERR_DEACTIVATED     0x6
 43#define TPM_ERR_DISABLED        0x7
 44
 45#define TPM_HEADER_SIZE		10
 46extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
 47				char *);
 48extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
 49				char *);
 50extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr,
 51				char *);
 52extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr,
 53				char *);
 54extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr,
 55				const char *, size_t);
 56extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr,
 57				char *);
 58extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr,
 59				char *);
 60extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
 61				char *);
 62extern ssize_t tpm_show_temp_deactivated(struct device *,
 63					 struct device_attribute *attr, char *);
 64extern ssize_t tpm_show_durations(struct device *,
 65				  struct device_attribute *attr, char *);
 66extern ssize_t tpm_show_timeouts(struct device *,
 67				 struct device_attribute *attr, char *);
 68
 69struct tpm_chip;
 70
 71struct tpm_vendor_specific {
 72	const u8 req_complete_mask;
 73	const u8 req_complete_val;
 74	const u8 req_canceled;
 75	void __iomem *iobase;		/* ioremapped address */
 76	unsigned long base;		/* TPM base address */
 77
 78	int irq;
 79	int probed_irq;
 80
 81	int region_size;
 82	int have_region;
 83
 84	int (*recv) (struct tpm_chip *, u8 *, size_t);
 85	int (*send) (struct tpm_chip *, u8 *, size_t);
 86	void (*cancel) (struct tpm_chip *);
 87	u8 (*status) (struct tpm_chip *);
 88	void (*release) (struct device *);
 89	struct miscdevice miscdev;
 90	struct attribute_group *attr_group;
 91	struct list_head list;
 92	int locality;
 93	unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
 94	bool timeout_adjusted;
 95	unsigned long duration[3]; /* jiffies */
 96	bool duration_adjusted;
 97
 98	wait_queue_head_t read_queue;
 99	wait_queue_head_t int_queue;
100};
101
102#define TPM_VID_INTEL    0x8086
103
104struct tpm_chip {
105	struct device *dev;	/* Device stuff */
106
107	int dev_num;		/* /dev/tpm# */
108	unsigned long is_open;	/* only one allowed */
109	int time_expired;
110
111	/* Data passed to and from the tpm via the read/write calls */
112	u8 *data_buffer;
113	atomic_t data_pending;
114	struct mutex buffer_mutex;
115
116	struct timer_list user_read_timer;	/* user needs to claim result */
117	struct work_struct work;
118	struct mutex tpm_mutex;	/* tpm is processing */
119
120	struct tpm_vendor_specific vendor;
121
122	struct dentry **bios_dir;
123
124	struct list_head list;
125	void (*release) (struct device *);
126};
127
128#define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor)
129
130static inline void tpm_chip_put(struct tpm_chip *chip)
131{
132	module_put(chip->dev->driver->owner);
133}
134
135static inline int tpm_read_index(int base, int index)
136{
137	outb(index, base);
138	return inb(base+1) & 0xFF;
139}
140
141static inline void tpm_write_index(int base, int index, int value)
142{
143	outb(index, base);
144	outb(value & 0xFF, base+1);
145}
146struct tpm_input_header {
147	__be16	tag;
148	__be32	length;
149	__be32	ordinal;
150}__attribute__((packed));
151
152struct tpm_output_header {
153	__be16	tag;
154	__be32	length;
155	__be32	return_code;
156}__attribute__((packed));
157
158struct	stclear_flags_t {
159	__be16	tag;
160	u8	deactivated;
161	u8	disableForceClear;
162	u8	physicalPresence;
163	u8	physicalPresenceLock;
164	u8	bGlobalLock;
165}__attribute__((packed));
166
167struct	tpm_version_t {
168	u8	Major;
169	u8	Minor;
170	u8	revMajor;
171	u8	revMinor;
172}__attribute__((packed));
173
174struct	tpm_version_1_2_t {
175	__be16	tag;
176	u8	Major;
177	u8	Minor;
178	u8	revMajor;
179	u8	revMinor;
180}__attribute__((packed));
181
182struct	timeout_t {
183	__be32	a;
184	__be32	b;
185	__be32	c;
186	__be32	d;
187}__attribute__((packed));
188
189struct duration_t {
190	__be32	tpm_short;
191	__be32	tpm_medium;
192	__be32	tpm_long;
193}__attribute__((packed));
194
195struct permanent_flags_t {
196	__be16	tag;
197	u8	disable;
198	u8	ownership;
199	u8	deactivated;
200	u8	readPubek;
201	u8	disableOwnerClear;
202	u8	allowMaintenance;
203	u8	physicalPresenceLifetimeLock;
204	u8	physicalPresenceHWEnable;
205	u8	physicalPresenceCMDEnable;
206	u8	CEKPUsed;
207	u8	TPMpost;
208	u8	TPMpostLock;
209	u8	FIPS;
210	u8	operator;
211	u8	enableRevokeEK;
212	u8	nvLocked;
213	u8	readSRKPub;
214	u8	tpmEstablished;
215	u8	maintenanceDone;
216	u8	disableFullDALogicInfo;
217}__attribute__((packed));
218
219typedef union {
220	struct	permanent_flags_t perm_flags;
221	struct	stclear_flags_t	stclear_flags;
222	bool	owned;
223	__be32	num_pcrs;
224	struct	tpm_version_t	tpm_version;
225	struct	tpm_version_1_2_t tpm_version_1_2;
226	__be32	manufacturer_id;
227	struct timeout_t  timeout;
228	struct duration_t duration;
229} cap_t;
230
231struct	tpm_getcap_params_in {
232	__be32	cap;
233	__be32	subcap_size;
234	__be32	subcap;
235}__attribute__((packed));
236
237struct	tpm_getcap_params_out {
238	__be32	cap_size;
239	cap_t	cap;
240}__attribute__((packed));
241
242struct	tpm_readpubek_params_out {
243	u8	algorithm[4];
244	u8	encscheme[2];
245	u8	sigscheme[2];
246	__be32	paramsize;
247	u8	parameters[12]; /*assuming RSA*/
248	__be32	keysize;
249	u8	modulus[256];
250	u8	checksum[20];
251}__attribute__((packed));
252
253typedef union {
254	struct	tpm_input_header in;
255	struct	tpm_output_header out;
256} tpm_cmd_header;
257
258#define TPM_DIGEST_SIZE 20
259struct tpm_pcrread_out {
260	u8	pcr_result[TPM_DIGEST_SIZE];
261}__attribute__((packed));
262
263struct tpm_pcrread_in {
264	__be32	pcr_idx;
265}__attribute__((packed));
266
267struct tpm_pcrextend_in {
268	__be32	pcr_idx;
269	u8	hash[TPM_DIGEST_SIZE];
270}__attribute__((packed));
271
272typedef union {
273	struct	tpm_getcap_params_out getcap_out;
274	struct	tpm_readpubek_params_out readpubek_out;
275	u8	readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
276	struct	tpm_getcap_params_in getcap_in;
277	struct	tpm_pcrread_in	pcrread_in;
278	struct	tpm_pcrread_out	pcrread_out;
279	struct	tpm_pcrextend_in pcrextend_in;
280} tpm_cmd_params;
281
282struct tpm_cmd_t {
283	tpm_cmd_header	header;
284	tpm_cmd_params	params;
285}__attribute__((packed));
286
287ssize_t	tpm_getcap(struct device *, __be32, cap_t *, const char *);
288
289extern int tpm_get_timeouts(struct tpm_chip *);
290extern void tpm_gen_interrupt(struct tpm_chip *);
291extern int tpm_do_selftest(struct tpm_chip *);
292extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
293extern struct tpm_chip* tpm_register_hardware(struct device *,
294				 const struct tpm_vendor_specific *);
295extern int tpm_open(struct inode *, struct file *);
296extern int tpm_release(struct inode *, struct file *);
297extern void tpm_dev_vendor_release(struct tpm_chip *);
298extern ssize_t tpm_write(struct file *, const char __user *, size_t,
299			 loff_t *);
300extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
301extern void tpm_remove_hardware(struct device *);
302extern int tpm_pm_suspend(struct device *, pm_message_t);
303extern int tpm_pm_resume(struct device *);
304extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
305			     wait_queue_head_t *);
306#ifdef CONFIG_ACPI
307extern struct dentry ** tpm_bios_log_setup(char *);
308extern void tpm_bios_log_teardown(struct dentry **);
309#else
310static inline struct dentry ** tpm_bios_log_setup(char *name)
311{
312	return NULL;
313}
314static inline void tpm_bios_log_teardown(struct dentry **dir)
315{
316}
317#endif