Skip to content

Commit

Permalink
[PATCH] tpm: remove pci dependency
Browse files Browse the repository at this point in the history
Since the tpm does not have it's own pci id we have been consuming the lpc
bus.  This is not correct and causes problems to support non lpc bus chips.
This patch removes the dependency on pci_dev from tpm.c The subsequent patches
will stop the supported chips from registering as pci drivers.

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Kylene Jo Hall authored and Linus Torvalds committed Oct 31, 2005
1 parent b4ed3e3 commit e659a3f
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 72 deletions.
65 changes: 30 additions & 35 deletions drivers/char/tpm/tpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
if (count == 0)
return -ENODATA;
if (count > bufsiz) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"invalid count value %x %zx \n", count, bufsiz);
return -E2BIG;
}

down(&chip->tpm_mutex);

if ((rc = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"tpm_transmit: tpm_send: error %zd\n", rc);
goto out;
}
Expand All @@ -86,7 +86,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
}

if ((status == chip->vendor->req_canceled)) {
dev_err(&chip->pci_dev->dev, "Operation Canceled\n");
dev_err(chip->dev, "Operation Canceled\n");
rc = -ECANCELED;
goto out;
}
Expand All @@ -97,14 +97,14 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,


chip->vendor->cancel(chip);
dev_err(&chip->pci_dev->dev, "Operation Timed out\n");
dev_err(chip->dev, "Operation Timed out\n");
rc = -ETIME;
goto out;

out_recv:
rc = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
if (rc < 0)
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"tpm_transmit: tpm_recv: error %zd\n", rc);
out:
up(&chip->tpm_mutex);
Expand Down Expand Up @@ -139,15 +139,14 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
__be32 index;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

memcpy(data, cap_pcr, sizeof(cap_pcr));
if ((len = tpm_transmit(chip, data, sizeof(data)))
< CAP_PCR_RESULT_SIZE) {
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
dev_dbg(chip->dev, "A TPM error (%d) occurred "
"attempting to determine the number of PCRS\n",
be32_to_cpu(*((__be32 *) (data + 6))));
return 0;
Expand All @@ -161,7 +160,7 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
memcpy(data + 10, &index, 4);
if ((len = tpm_transmit(chip, data, sizeof(data)))
< READ_PCR_RESULT_SIZE){
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred"
dev_dbg(chip->dev, "A TPM error (%d) occurred"
" attempting to read PCR %d of %d\n",
be32_to_cpu(*((__be32 *) (data + 6))), i, num_pcrs);
goto out;
Expand Down Expand Up @@ -191,8 +190,7 @@ ssize_t tpm_show_pubek(struct device *dev, struct device_attribute *attr,
int i, rc;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

Expand All @@ -205,7 +203,7 @@ ssize_t tpm_show_pubek(struct device *dev, struct device_attribute *attr,

if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
READ_PUBEK_RESULT_SIZE) {
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
dev_dbg(chip->dev, "A TPM error (%d) occurred "
"attempting to read the PUBEK\n",
be32_to_cpu(*((__be32 *) (data + 6))));
rc = 0;
Expand Down Expand Up @@ -274,8 +272,7 @@ ssize_t tpm_show_caps(struct device *dev, struct device_attribute *attr,
ssize_t len;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

Expand Down Expand Up @@ -339,21 +336,21 @@ int tpm_open(struct inode *inode, struct file *file)
}

if (chip->num_opens) {
dev_dbg(&chip->pci_dev->dev,
dev_dbg(chip->dev,
"Another process owns this TPM\n");
rc = -EBUSY;
goto err_out;
}

chip->num_opens++;
pci_dev_get(chip->pci_dev);
get_device(chip->dev);

spin_unlock(&driver_lock);

chip->data_buffer = kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL);
if (chip->data_buffer == NULL) {
chip->num_opens--;
pci_dev_put(chip->pci_dev);
put_device(chip->dev);
return -ENOMEM;
}

Expand All @@ -378,7 +375,7 @@ int tpm_release(struct inode *inode, struct file *file)
chip->num_opens--;
del_singleshot_timer_sync(&chip->user_read_timer);
atomic_set(&chip->data_pending, 0);
pci_dev_put(chip->pci_dev);
put_device(chip->dev);
kfree(chip->data_buffer);
spin_unlock(&driver_lock);
return 0;
Expand Down Expand Up @@ -447,12 +444,12 @@ ssize_t tpm_read(struct file * file, char __user * buf,

EXPORT_SYMBOL_GPL(tpm_read);

void __devexit tpm_remove(struct pci_dev *pci_dev)
void tpm_remove_hardware(struct device *dev)
{
struct tpm_chip *chip = pci_get_drvdata(pci_dev);
struct tpm_chip *chip = dev_get_drvdata(dev);

if (chip == NULL) {
dev_err(&pci_dev->dev, "No device data found\n");
dev_err(dev, "No device data found\n");
return;
}

Expand All @@ -462,22 +459,20 @@ void __devexit tpm_remove(struct pci_dev *pci_dev)

spin_unlock(&driver_lock);

pci_set_drvdata(pci_dev, NULL);
dev_set_drvdata(dev, NULL);
misc_deregister(&chip->vendor->miscdev);
kfree(chip->vendor->miscdev.name);

sysfs_remove_group(&pci_dev->dev.kobj, chip->vendor->attr_group);

pci_disable_device(pci_dev);
sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);

dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));

kfree(chip);

pci_dev_put(pci_dev);
put_device(dev);
}

EXPORT_SYMBOL_GPL(tpm_remove);
EXPORT_SYMBOL_GPL(tpm_remove_hardware);

static u8 savestate[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
Expand Down Expand Up @@ -524,7 +519,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
* upon errant exit from this function specific probe function should call
* pci_disable_device
*/
int tpm_register_hardware(struct pci_dev *pci_dev,
int tpm_register_hardware(struct device *dev,
struct tpm_vendor_specific *entry)
{
#define DEVNAME_SIZE 7
Expand Down Expand Up @@ -563,7 +558,7 @@ int tpm_register_hardware(struct pci_dev *pci_dev,

dev_num_search_complete:
if (chip->dev_num < 0) {
dev_err(&pci_dev->dev,
dev_err(dev,
"No available tpm device numbers\n");
kfree(chip);
return -ENODEV;
Expand All @@ -576,29 +571,29 @@ int tpm_register_hardware(struct pci_dev *pci_dev,
scnprintf(devname, DEVNAME_SIZE, "%s%d", "tpm", chip->dev_num);
chip->vendor->miscdev.name = devname;

chip->vendor->miscdev.dev = &(pci_dev->dev);
chip->pci_dev = pci_dev_get(pci_dev);
chip->vendor->miscdev.dev = dev;
chip->dev = get_device(dev);

if (misc_register(&chip->vendor->miscdev)) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"unable to misc_register %s, minor %d\n",
chip->vendor->miscdev.name,
chip->vendor->miscdev.minor);
pci_dev_put(pci_dev);
put_device(dev);
kfree(chip);
dev_mask[i] &= !(1 << j);
return -ENODEV;
}

spin_lock(&driver_lock);

pci_set_drvdata(pci_dev, chip);
dev_set_drvdata(dev, chip);

list_add(&chip->list, &tpm_chip_list);

spin_unlock(&driver_lock);

sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
sysfs_create_group(&dev->kobj, chip->vendor->attr_group);

return 0;
}
Expand Down
6 changes: 3 additions & 3 deletions drivers/char/tpm/tpm.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ struct tpm_vendor_specific {
};

struct tpm_chip {
struct pci_dev *pci_dev; /* PCI device stuff */
struct device *dev; /* Device stuff */

int dev_num; /* /dev/tpm# */
int num_opens; /* only one allowed */
Expand Down Expand Up @@ -92,13 +92,13 @@ static inline void tpm_write_index(int base, int index, int value)
outb(value & 0xFF, base+1);
}

extern int tpm_register_hardware(struct pci_dev *,
extern int tpm_register_hardware(struct device *,
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 *);
extern void __devexit tpm_remove(struct pci_dev *);
extern void tpm_remove_hardware(struct device *);
extern int tpm_pm_suspend(struct pci_dev *, pm_message_t);
extern int tpm_pm_resume(struct pci_dev *);
26 changes: 17 additions & 9 deletions drivers/char/tpm/tpm_atmel.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
for (i = 0; i < 6; i++) {
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading header\n");
return -EIO;
}
Expand All @@ -66,12 +66,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
size = be32_to_cpu(*native_size);

if (count < size) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"Recv size(%d) less than available space\n", size);
for (; i < size; i++) { /* clear the waiting data anyway */
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading data\n");
return -EIO;
}
Expand All @@ -83,7 +83,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
for (; i < size; i++) {
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading data\n");
return -EIO;
}
Expand All @@ -93,7 +93,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
/* make sure data available is gone */
status = inb(chip->vendor->base + 1);
if (status & ATML_STATUS_DATA_AVAIL) {
dev_err(&chip->pci_dev->dev, "data available is stuck\n");
dev_err(chip->dev, "data available is stuck\n");
return -EIO;
}

Expand All @@ -104,9 +104,9 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
{
int i;

dev_dbg(&chip->pci_dev->dev, "tpm_atml_send: ");
dev_dbg(chip->dev, "tpm_atml_send:\n");
for (i = 0; i < count; i++) {
dev_dbg(&chip->pci_dev->dev, "0x%x(%d) ", buf[i], buf[i]);
dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);
outb(buf[i], chip->vendor->base);
}

Expand Down Expand Up @@ -193,7 +193,7 @@ static int __devinit tpm_atml_init(struct pci_dev *pci_dev,
goto out_err;
}

if ((rc = tpm_register_hardware(pci_dev, &tpm_atmel)) < 0)
if ((rc = tpm_register_hardware(&pci_dev->dev, &tpm_atmel)) < 0)
goto out_err;

dev_info(&pci_dev->dev,
Expand All @@ -206,6 +206,14 @@ static int __devinit tpm_atml_init(struct pci_dev *pci_dev,
return rc;
}

static void __devexit tpm_atml_remove(struct pci_dev *pci_dev)
{
struct tpm_chip *chip = pci_get_drvdata(pci_dev);

if ( chip )
tpm_remove_hardware(chip->dev);
}

static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
Expand All @@ -226,7 +234,7 @@ static struct pci_driver atmel_pci_driver = {
.name = "tpm_atmel",
.id_table = tpm_pci_tbl,
.probe = tpm_atml_init,
.remove = __devexit_p(tpm_remove),
.remove = __devexit_p(tpm_atml_remove),
.suspend = tpm_pm_suspend,
.resume = tpm_pm_resume,
};
Expand Down
Loading

0 comments on commit e659a3f

Please sign in to comment.