2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2004 IBM Corporation
*
* Authors :
* Leendert van Doorn < leendert @ watson . ibm . com >
* Dave Safford < safford @ watson . ibm . com >
* Reiner Sailer < sailer @ watson . ibm . com >
* Kylene Hall < kjhall @ us . ibm . com >
*
* Maintained by : < tpmdd_devel @ lists . sourceforge . net >
*
* Device driver for TCG / TCPA TPM ( trusted platform module ) .
* Specifications at www . trustedcomputinggroup . org
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation , version 2 of the
* License .
*
*/
# include <linux/module.h>
# include <linux/version.h>
# include <linux/pci.h>
# include <linux/delay.h>
# include <linux/fs.h>
# include <linux/miscdevice.h>
2005-06-24 09:01:48 +04:00
enum tpm_timeout {
TPM_TIMEOUT = 5 , /* msecs */
} ;
2005-04-17 02:20:36 +04:00
/* TPM addresses */
2005-06-24 09:01:48 +04:00
enum tpm_addr {
2005-06-26 01:55:39 +04:00
TPM_SUPERIO_ADDR = 0x2E ,
2005-06-24 09:01:48 +04:00
TPM_ADDR = 0x4E ,
} ;
2005-06-24 09:02:00 +04:00
extern ssize_t tpm_show_pubek ( struct device * , struct device_attribute * attr ,
char * ) ;
extern ssize_t tpm_show_pcrs ( struct device * , struct device_attribute * attr ,
char * ) ;
extern ssize_t tpm_show_caps ( struct device * , struct device_attribute * attr ,
char * ) ;
extern ssize_t tpm_store_cancel ( struct device * , struct device_attribute * attr ,
const char * , size_t ) ;
2005-04-17 02:20:36 +04:00
struct tpm_chip ;
struct tpm_vendor_specific {
u8 req_complete_mask ;
u8 req_complete_val ;
2005-06-24 09:02:02 +04:00
u8 req_canceled ;
2005-04-17 02:20:36 +04:00
u16 base ; /* TPM base address */
int ( * recv ) ( struct tpm_chip * , u8 * , size_t ) ;
int ( * send ) ( struct tpm_chip * , u8 * , size_t ) ;
void ( * cancel ) ( struct tpm_chip * ) ;
2005-10-31 02:03:23 +03:00
u8 ( * status ) ( struct tpm_chip * ) ;
2005-04-17 02:20:36 +04:00
struct miscdevice miscdev ;
2005-06-24 09:02:00 +04:00
struct attribute_group * attr_group ;
2005-04-17 02:20:36 +04:00
} ;
struct tpm_chip {
2005-10-31 02:03:24 +03:00
struct device * dev ; /* Device stuff */
2005-04-17 02:20:36 +04:00
int dev_num ; /* /dev/tpm# */
int num_opens ; /* only one allowed */
int time_expired ;
/* Data passed to and from the tpm via the read/write calls */
u8 * data_buffer ;
atomic_t data_pending ;
struct semaphore buffer_mutex ;
struct timer_list user_read_timer ; /* user needs to claim result */
struct semaphore tpm_mutex ; /* tpm is processing */
struct tpm_vendor_specific * vendor ;
struct list_head list ;
} ;
2005-06-26 01:55:39 +04:00
static inline int tpm_read_index ( int base , int index )
2005-04-17 02:20:36 +04:00
{
2005-06-26 01:55:39 +04:00
outb ( index , base ) ;
return inb ( base + 1 ) & 0xFF ;
2005-04-17 02:20:36 +04:00
}
2005-06-26 01:55:39 +04:00
static inline void tpm_write_index ( int base , int index , int value )
2005-04-17 02:20:36 +04:00
{
2005-06-26 01:55:39 +04:00
outb ( index , base ) ;
outb ( value & 0xFF , base + 1 ) ;
2005-04-17 02:20:36 +04:00
}
2005-10-31 02:03:24 +03:00
extern int tpm_register_hardware ( struct device * ,
2005-04-17 02:20:36 +04:00
struct tpm_vendor_specific * ) ;
extern int tpm_open ( struct inode * , struct file * ) ;
extern int tpm_release ( struct inode * , struct file * ) ;
extern ssize_t tpm_write ( struct file * , const char __user * , size_t ,
loff_t * ) ;
extern ssize_t tpm_read ( struct file * , char __user * , size_t , loff_t * ) ;
2005-10-31 02:03:24 +03:00
extern void tpm_remove_hardware ( struct device * ) ;
2005-04-17 02:25:24 +04:00
extern int tpm_pm_suspend ( struct pci_dev * , pm_message_t ) ;
2005-04-17 02:20:36 +04:00
extern int tpm_pm_resume ( struct pci_dev * ) ;