Under Construction...


If you can not detect a TPM on your machine.

1. Check HW spec

1-1. Check the Windows XP device driver info

http://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-66306 ThinkCentre M55 Small (タイプ 8800, 8808) ThinkCentre M55 Tower (タイプ 8802, 8811) ThinkCentre M55 Ultra Small (タイプ 8799, 8009, 8803, 8807) ThinkStation S10(タイプ 6483, 6423) uses Broadcom TPm chip.

http://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-66304 ThinkCentre M55p Small (タイプ 8800, 8808) ThinkCentre M55p Tower (タイプ 8811) uses Atmel TPM chip.

http://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-58054 ThinkPad R60, R60e, R61 ThinkPad T42, T42p ThinkPad T60, T60p, T61, T61p ThinkPad X300 ThinkPad X41, X41 Tablet ThinkPad X60, X60s, X60 Tablet ThinkPad X61, X61s, X61 Tablet ThinkPad Z60m, Z60t ThinkPad Z61e, Z61m, Z61p, Z61t uses Atmel TPM 1.2 chip.

http://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-70813 ThinkCentre M58 Small (タイプ 7174, 6258) ThinkCentre M58 Tower (タイプ 7244, 6239) ThinkCentre M58 Ultra Small (タイプ 7187) ThinkCentre M58p Small (タイプ 7346, 7220, 6137, 6234) ThinkCentre M58p Tower (タイプ 7347, 7188, 6138, 6209) ThinkCentre M58p Ultra Small (タイプ 7345, 6136) uses Winbond TPM 1.2 chip.

http://www-06.ibm.com/jp/domino05/pc/download/download.nsf/jtechinfo/MIGR-70123 ThinkPad R400 ThinkPad R500 ThinkPad T400 ThinkPad T500 ThinkPad W500 ThinkPad W700 ThinkPad X200, X200, X200 Tablet ThinkPad X301 uses Intel Integrated TPM.

2. Check Linux Kernel supports TPM or not

2.1. Check Kernel Configulation

Check /boot/config-XXXX file, which may have the following lines

CONFIG_PNPACPI=y
CONFIG_PNP=y
CONFIG_TCG_TPM=m
CONFIG_TCG_TIS=m
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m

2.2. Install Linux TPM Driver

e.g. Thinkpad X60

# /sbin/modprobe tpm_tis
# dmesg | tail
<snip>
tpm_tis 00:0b: 1.2 TPM (device-id 0x3202, rev-id 5)
# cat /sys/class/misc/tpm0/device/id
ATM1200
PNP0c31
/sbin/modprobe tpm_tis force=1 interrupts=0

e.g. Intel iTPM on GM45

# cat /sys/class/misc/tpm0/device/caps
Manufacturer: 0x494e5443

2.3. mount security fs

# mount -t securityfs none /sys/kernel/security
# cat /sys/kernel/security/tpm0/ascii_bios_measurements
 0 13cb4e01fde5d83f521ce265a6a0d5eeb0114daf 08 [S-CRTM Version]
 0 b5b241ead6d2ff8e5f8c049f1e8bc157bb71b190 01 [POST CODE]
 0 ec5446d7e84aa3bc22a5dd7fb0a290831dce5818 01 [POST CODE]
<snip>

Add following line to /etc/fstab

securityfs /sys/kernel/security securityfs rw 0 0

3. Where is TPM

3.1. Check BIOS ACPI Table

Install iasl. e.g. yum install iasl

cat /proc/acpi/dsdt > dsdt.dat
iasl -d dsdt.dat

File, dsdt.dsl is generated.

Thinkpad X60, Atmel TPM v1.2

                Device (TPM)
                {
                    Name (_HID, EisaId ("ATM1200"))
                    Name (_CID, 0x310CD041)
                    Method (_STA, 0, NotSerialized)
                    {
                        If (And (\TPMP, 0x01))
                        {
                            Store (0x0F, Local0)
                        }
                        Else
                        {
                            Store (0x00, Local0)
                        }

                        Return (Local0)
                    }

                    Name (_CRS, ResourceTemplate ()
                    {
                        Memory32Fixed (ReadWrite,
                            0xFED40000,         // Address Base
                            0x00001000,         // Address Length
                            )
                    })

This is typical definition. "ATM1200" is the device ID.

Thinkpad X200, Intel iTPM

<snip>
                Device (TPM)
                {
                    Method (_HID, 0, NotSerialized)
                    {
                        TPHY (0x00)
                        If (LEqual (TPMV, 0x01))
                        {
                            Return (0x0201D824)
                        }

                        If (LEqual (TPMV, 0x02))
                        {
                            Return (0x0435CF4D)
                        }

                        If (LEqual (TPMV, 0x03))
                        {
                            Return (0x02016D08)
                        }

                        If (LEqual (TPMV, 0x04))
                        {
                            Return (0x01016D08)
                        }

                        If (LOr (LEqual (TPMV, 0x05), LEqual (TPMV, 0x06)))
                        {
                            Return (0x0010A35C)
                        }

                        If (LEqual (TPMV, 0x08))
                        {
                            Return (0x00128D06)
                        }

                        If (LEqual (TPMV, 0x09))
                        {
                            Return ("INTC0102")
                        }

                        Return (0x310CD041)
                    }

                    Name (_CID, 0x310CD041)
                    Name (_UID, 0x01)
<snip>
This is new definiton. It seems current Linux PnP driver can't support this. use force=1 option with tpm_tis driver.

3.2. Check IO ports

cat /proc/ioport

4. Fix the driver

4.1 Ubuntu 8.10
$ sudo apt-get install fakeroot build-essential makedumpfile 
$ sudo apt-get build-dep linux
$ sudo apt-get build-dep linux-image-$(uname -r)
$ apt-get source linux-image-$(uname -r)

Modify driver code, then just rebuild the tpm driver.

$ cd linux-2.6.27/drivers/char/tpm
$ make -C /usr/src/linux M=`pwd` V=1

$ sudo cp -b tpm_tis.ko /lib/modules/$(uname -r)/kernel/drivers/char/tpm/tpm_tis.ko

$ sudo modprobe tpm_tis 

$ sudo modprobe tpm_tis force=1 interrupts=0

$ lsmod | grep tpm
tpm_tis                17676  0 
tpm                    22848  1 tpm_tis
tpm_bios               14080  1 tpm

$ cat /sys/class/misc/tpm0/device/pcrs
$ sudo less /sys/kernel/security/tpm0/ascii_bios_measurements 

$ sudo modprobe -r tpm_tis
$ sudo apt-get install tpm-tools
$ /usr/sbin/tpm_getpubek
Public Endorsement Key:
  Version:   01010000
  Usage:     0x0002 (Unknown)
  Flags:     0x00000000 (!VOLATILE, !MIGRATABLE, !REDIRECTION)
  AuthUsage: 0x00 (Never)
  Algorithm:         0x00000020 (Unknown)
  Encryption Scheme: 0x00000012 (Unknown)
  Signature Scheme:  0x00000010 (Unknown)
  Public Key:
	c31d0e0b b963be82 3520493e f2dc1eb0 8b2e8b98 cd22cc37 9c4ea3b4 b97705e4
<snip>
4.2 Fedora

tpmdd project http://sourceforge.net/projects/tpmdd