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 Sakkinen

    CC: 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

    Stefan Berger
     
  • 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 Gunthorpe

    CC: 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

    Stefan Berger
     
  • 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

    Stefan Berger
     
  • 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

    Jason Gunthorpe
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • Removed the field because it is not used for anything.

    Signed-off-by: Jarkko Sakkinen
    Reviewed-by: Jason Gunthorpe

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Christophe Ricard
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Jarkko Sakkinen
     
  • 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

    Arnd Bergmann
     
  • 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

    Stefan Berger
     
  • 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

    Jason Gunthorpe
     
  • 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

    Stefan Berger
     
  • 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

    Jason Gunthorpe
     
  • 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

    Jason Gunthorpe
     
  • 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_del

    Signed-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

    Jason Gunthorpe
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • Extend copyright header to 2016

    Signed-off-by: Christophe Ricard
    Reviewed-by: Jarkko Sakkinen
    Signed-off-by: Jarkko Sakkinen

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD
     
  • 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

    Christophe RICARD