25 Jun, 2016
40 commits
-
Add documentation for the tpm_vtpm device driver that implements
support for providing TPM functionality to Linux containers.Parts of this documentation were recycled from the Xen vTPM
device driver documentation.Update the documentation for the ioctl numbers.
Signed-off-by: Stefan Berger
Reviewed-by: Jarkko SakkinenCC: linux-kernel@vger.kernel.org
CC: linux-doc@vger.kernel.org
CC: linux-api@vger.kernel.org
Tested-by: Jarkko Sakkinen
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
This patch implements a proxy driver for supporting multiple emulated TPMs
in a system.The driver implements a device /dev/vtpmx that is used to created
a client device pair /dev/tpmX (e.g., /dev/tpm10) and a server side that
is accessed using a file descriptor returned by an ioctl.
The device /dev/tpmX is the usual TPM device created by the core TPM
driver. Applications or kernel subsystems can send TPM commands to it
and the corresponding server-side file descriptor receives these
commands and delivers them to an emulated TPM.The driver retrievs the TPM 1.2 durations and timeouts. Since this requires
the startup of the TPM, we send a startup for TPM 1.2 as well as TPM 2.Signed-off-by: Stefan Berger
Reviewed-by: Jason GunthorpeCC: linux-kernel@vger.kernel.org
CC: linux-doc@vger.kernel.org
CC: linux-api@vger.kernel.org
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Introduce TPM_CHIP_FLAG_VIRTUAL to be used when the chip device has no
parent device.Prevent sysfs entries requiring a parent device from being created.
Signed-off-by: Stefan Berger
Reviewed-by: Jason Gunthorpe
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
The final thing preventing this was the way the sysfs files were
attached to the pdev. Follow the approach developed for ppi and move
the sysfs files to the chip->dev with symlinks from the pdev
for compatibility. Everything in the core now sanely uses container_of
to get the chip.Signed-off-by: Jason Gunthorpe
Signed-off-by: Stefan Berger
Tested-by: Jarkko Sakkinen
Tested-by: Stefan Berger
Signed-off-by: Jarkko Sakkinen -
Remove useless priv field in struct tpm_vendor_specific and take benefit
of chip->dev.driver_data. As priv is the latest field available in
struct tpm_vendor_specific, remove any reference to that structure.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Move tpm_vendor_specific data related to TCG PTP specification to tpm_chip.
Move all fields directly linked with well known TCG concepts and used in
TPM drivers (tpm_i2c_atmel, tpm_i2c_infineon, tpm_i2c_nuvoton, tpm_tis
and xen-tpmfront) as well as in TPM core files (tpm-sysfs, tpm-interface
and tpm2-cmd) in tpm_chip.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Dropped the field 'locality' from struct tpm_vendor_specific migrated it to
the private structures of st33zp24, tpm_i2c_infineon and tpm_tis.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Dropped the field 'read_queue' from struct tpm_vendor_specific and make it
available to the various private structures in the drivers.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Dropped the field 'irq' from struct tpm_vendor_specific and make it
available to the various private structures in the drivers using irqs.A dedicated flag TPM_CHIP_FLAG_IRQ is added for the upper layers.
In st33zp24, struct st33zp24_dev declaration is moved to st33zp24.h in
order to make accessible irq from other phy's(i2c, spi).In tpm_i2c_nuvoton, chip->vendor.priv is not directly allocated. We can
access irq field from priv_data in a cleaner way.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Dropped the field 'iobase' from struct tpm_vendor_specific and migrated
it to the private structures of tpm_atmel and tpm_tis.Signed-off-by: Christophe Ricard
Reviewed-by: Jason Gunthorpe
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Dropped list from struct tpm_vendor_specific as it is not used in any
place.It is initialized in tpm_i2c_infineon but not used at all in the code.
Signed-off-by: Christophe Ricard
Reviewed-by: Jason Gunthorpe
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Removed the field because it is not used for anything.
Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Dropped the field 'base' from struct tpm_vendor_specific and migrated
it to the private structures of tpm_atmel and tpm_nsc.Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Dropped manufacturer_id from struct tpm_vendor_specific and redeclared
it in the private struct priv_data that tpm_tis uses because the field
is only used tpm_tis.Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Introduced a private struct tpm_atmel_priv that contains the variables
have_region and region_size that were previously located in struct
tpm_vendor_specific. These fields were only used by tpm_atmel.Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Drop field int_queue from tpm_vendor_specific as it is used only by
tpm_tis. Probably all of the fields should be eventually dropped and
moved to the private structures of different drivers but it is better to
do this one step at a time in order not to break anything.Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Fixes: 20e0152393b41 ("tpm: fix crash in tpm_tis deinitialization")
Signed-off-by: Jarkko Sakkinen
Reported-by: Stefan Berger
Tested-by: Stefan Berger
Reviewed-By: Jason Gunthorpe -
On my Lenovo x250 the following situation occurs:
[18697.813871] tpm_crb MSFT0101:00: can't request region for resource
[mem 0xacdff080-0xacdfffff]The mapping of the control area overlaps the mapping of the command
buffer. The control area is mapped over page, which is not right. It
should mapped over sizeof(struct crb_control_area).Fixing this issue unmasks another issue. Command and response buffers
can overlap and they do interleave on this machine. According to the PTP
specification the overlapping means that they are mapped to the same
buffer.The commit has been also on a Haswell NUC where things worked before
applying this fix so that the both code paths for response buffer
initialization are tested.Cc: stable@vger.kernel.org
Fixes: 1bd047be37d9 ("tpm_crb: Use devm_ioremap_resource")
Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
We can get rid of tpm_reg variable in get_burstcount.
Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
When st33zp24_spi_acpi_request_resources() gets called we
already know that the entries in ->acpi_match_table have matched ACPI ID
of the device.
In addition spi_device pointer cannot be NULL in any case (otherwise I2C
core would not call ->probe() for the driver in the first place).Drop the two useless checks from the driver.
Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
When st33zp24_i2c_acpi_request_resources() gets called we
already know that the entries in ->acpi_match_table have matched ACPI ID
of the device.
In addition I2C client pointer cannot be NULL in any case (otherwise I2C
core would not call ->probe() for the driver in the first place).Drop the two useless checks from the driver.
Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
The iomem resource is needed only temporarily so it is better to pass
it on instead of storing it permanently. Named the variable as io_res
so that the code better documents itself.Signed-off-by: Jarkko Sakkinen
Reviewed-by: Stefan Berger -
rmmod crashes the driver because tpm_chip_unregister() already sets ops
to NULL. This commit fixes the issue by moving tpm2_shutdown() to
tpm_chip_unregister(). This commit is also cleanup because it removes
duplicate code from tpm_crb and tpm_tis to the core.Fixes: 4d3eac5e156a ("tpm: Provide strong locking for device removal")
Signed-off-by: Jarkko Sakkinen
Reviewed-by: Jason Gunthorpe -
Created a local variable pointing to the INT_ENABLE_x register. The
expression clearing INT_ENABLE_x.globalIntEnable is unreadable and
hard to modify without surpassing the 80 char boundary.Signed-off-by: Jarkko Sakkinen
Tested-by: Christophe Ricard -
A cleanup patch changed the prototype of the regular tpm_bios_log_setup
function, but not that of the stub that is used when the TPM is disabled,
causing a harmless build warning:drivers/char/tpm/tpm-chip.c: In function 'tpm1_chip_register':
drivers/char/tpm/tpm-chip.c:287:38: error: passing argument 1 of 'tpm_bios_log_setup' discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
chip->bios_dir = tpm_bios_log_setup(dev_name(&chip->dev));
In file included from ../drivers/char/tpm/tpm-chip.c:30:0:
../drivers/char/tpm/tpm_eventlog.h:83:31: note: expected 'char *' but argument is of type 'const char *'
static inline struct dentry **tpm_bios_log_setup(char *name)This changes the stub function to match the normal prototype,
avoiding that warning.Signed-off-by: Arnd Bergmann
Fixes: aca8db8088c3 ("tpm: Get rid of devname")
Signed-off-by: Jarkko Sakkinen -
Replace the device number bitmap with IDR. Extend the number of devices we
can create to 64k.
Since an IDR allows us to associate a pointer with an ID, we use this now
to rewrite tpm_chip_find_get() to simply look up the chip pointer by the
given device ID.Protect the IDR calls with a mutex.
Signed-off-by: Stefan Berger
Reviewed-by: Jason Gunthorpe
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
tpm_chip_alloc becomes a typical subsystem allocate call.
Signed-off-by: Jason Gunthorpe
Reviewed-by: Stefan Berger
Tested-by: Stefan Berger
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Now that the tpm core has strong locking around 'ops' it is possible
to remove a TPM driver, module and all, even while user space still
has things like /dev/tpmX open. For consistency and simplicity, drop
the module locking entirely.Signed-off-by: Stefan Berger
Reviewed-by: Jason Gunthorpe
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Add a read/write semaphore around the ops function pointers so
ops can be set to null when the driver un-registers.Previously the tpm core expected module locking to be enough to
ensure that tpm_unregister could not be called during certain times,
however that hasn't been sufficient for a long time.Introduce a read/write semaphore around 'ops' so the core can set
it to null when unregistering. This provides a strong fence around
the driver callbacks, guaranteeing to the driver that no callbacks
are running or will run again.For now the ops_lock is placed very high in the call stack, it could
be pushed down and made more granular in future if necessary.Signed-off-by: Jason Gunthorpe
Reviewed-by: Stefan Berger
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Now that we have a proper struct device just use dev_name() to
access this value instead of keeping two copies.Signed-off-by: Jason Gunthorpe
Signed-off-by: Stefan Berger
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
This is a hold over from before the struct device conversion.
- All prints should be using &chip->dev, which is the Linux
standard. This changes prints to use tpm0 as the device name,
not the PnP/etc ID.
- The few places involving sysfs/modules that really do need the
parent just use chip->dev.parent instead
- We no longer need to get_device(pdev) in any places since it is no
longer used by any of the code. The kref on the parent is held
by the device core during device_add and dropped in device_delSigned-off-by: Jason Gunthorpe
Signed-off-by: Stefan Berger
Tested-by: Stefan Berger
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Simplify st33zp24_spi_acpi_request_resources, st33zp24_spi_of_request_resources
and st33zp24_spi_request_resources to have the same prototype and using
spi_get_drvdata.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Simplify st33zp24_i2c_acpi_request_resources, st33zp24_i2c_of_request_resources
and st33zp24_i2c_request_resources to have the same prototype and using
i2c_get_clientdata.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Add support for acpi probing. SMO3324 is used for st33zp24.
It has been tested with the following acpi node on Minnowboard:Device (TPM1)
{
Name (_ADR, Zero) // _ADR: Address
Name (_HID, "SMO3324") // _HID: Hardware ID
Name (_CID, "SMO3324") // _CID: Compatible ID
Name (_DDN, "SMO TPM") // _DDN: DOS Device Name
Name (_UID, One) // _UID: Unique ID
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (SBUF, ResourceTemplate ()
{
SpiSerialBus (0, PolarityLow, FourWireMode, 8,
ControllerInitiated, 4000000, ClockPolarityLow,
ClockPhaseFirst, "\\_SB.SPI1",
0x00, ResourceConsumer, ,)
GpioInt (Edge, ActiveHigh, ExclusiveAndWake, PullNone, 0x0000,
"\\_SB.GPO2", 0x00, ResourceConsumer, ,)
{ // Pin list
0x0001
}
GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, IoRestrictionOutputOnly,
"\\_SB.GPO2", 0x00, ResourceConsumer, ,)
{ // Pin list
0x0002,
}
})
Return (SBUF) /* \_SB_.SPI1.TPM1._CRS.SBUF */
}
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}
}Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Add support for acpi probing. SMO3324 is used for st33zp24.
It has been tested with the following acpi node on Minnowboard:Device (TPM1)
{
Name (_ADR, Zero) // _ADR: Address
Name (_HID, "SMO3324") // _HID: Hardware ID
Name (_CID, "SMO3324") // _CID: Compatible ID
Name (_DDN, "SMO TPM") // _DDN: DOS Device Name
Name (_UID, One) // _UID: Unique ID
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (SBUF, ResourceTemplate ()
{
I2cSerialBus (0x0013, ControllerInitiated, 400000,
AddressingMode7Bit, "\\_SB.I2C7",
0x00, ResourceConsumer, ,)
GpioInt (Edge, ActiveHigh, ExclusiveAndWake, PullNone, 0x0000,
"\\_SB.GPO2", 0x00, ResourceConsumer, ,)
{ // Pin list
0x0001
}
GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, IoRestrictionOutputOnly,
"\\_SB.GPO2", 0x00, ResourceConsumer, ,)
{ // Pin list
0x0002,
}
})
Return (SBUF) /* \_SB_.I2C7.TPM1._CRS.SBUF */
}Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}
}Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Extend copyright header to 2016
Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Add check in st33zp24_spi_evaluate_latency helping to diagnose if the chip
is present or in a bad state.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
DT headers already define NOOP routines when CONFIG_OF is not defined.
[jarkko.sakkinen@linux.intel.com: I tested that the driver compiles
without warnings and errors with and without CONFIG_OF flag.]Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Tested-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
Remove spi_xfer from st33zp24_spi_phy structure and declare local spi_xfer
when needed instead.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen -
An affectation is enough when copying 1 byte. Remove memcpy usage where
possible.Signed-off-by: Christophe Ricard
Reviewed-by: Jarkko Sakkinen
Signed-off-by: Jarkko Sakkinen