All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <swboyd@chromium.org>
To: Heiko Stuebner <heiko@sntech.de>,
	Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Peter Huewe <peterhuewe@gmx.de>,
	Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
	Andrey Pronin <apronin@chromium.org>,
	linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org,
	Duncan Laurie <dlaurie@chromium.org>,
	Jason Gunthorpe <jgg@ziepe.ca>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Guenter Roeck <groeck@chromium.org>,
	Alexander Steffen <Alexander.Steffen@infineon.com>,
	<linux-kbuild@vger.kernel.org>
Subject: Re: [PATCH v6 4/4] tpm: tpm_tis_spi: Support cr50 devices
Date: Fri, 30 Aug 2019 08:40:42 -0700	[thread overview]
Message-ID: <5d69437b.1c69fb81.2722d.8556@mx.google.com> (raw)
In-Reply-To: <2926868.n5I8ZQlzTx@phil>

Quoting Heiko Stuebner (2019-08-30 08:33:48)
> Am Freitag, 30. August 2019, 00:41:10 CEST schrieb Stephen Boyd:
> > From: Andrey Pronin <apronin@chromium.org>
> > 
> > Add TPM2.0 PTP FIFO compatible SPI interface for chips with Cr50
> > firmware. The firmware running on the currently supported H1 Secure
> > Microcontroller requires a special driver to handle its specifics:
> > 
> >  - need to ensure a certain delay between SPI transactions, or else
> >    the chip may miss some part of the next transaction
> >  - if there is no SPI activity for some time, it may go to sleep,
> >    and needs to be waken up before sending further commands
> >  - access to vendor-specific registers
> > 
> > Cr50 firmware has a requirement to wait for the TPM to wakeup before
> > sending commands over the SPI bus. Otherwise, the firmware could be in
> > deep sleep and not respond. The method to wait for the device to wakeup
> > is slightly different than the usual flow control mechanism described in
> > the TCG SPI spec. Add a completion to tpm_tis_spi_transfer() before we
> > start a SPI transfer so we can keep track of the last time the TPM
> > driver accessed the SPI bus to support the flow control mechanism.
> > 
> > Split the cr50 logic off into a different file to keep it out of the
> > normal code flow of the existing SPI driver while making it all part of
> > the same module when the code is optionally compiled into the same
> > module. Export a new function, tpm_tis_spi_init(), and the associated
> > read/write/transfer APIs so that we can do this. Make the cr50 code wrap
> > the tpm_tis_spi_phy struct with its own struct to override the behavior
> > of tpm_tis_spi_transfer() by supplying a custom flow control hook. This
> > shares the most code between the core driver and the cr50 support
> > without combining everything into the core driver or exporting module
> > symbols.
> > 
> > Signed-off-by: Andrey Pronin <apronin@chromium.org>
> > Cc: Andrey Pronin <apronin@chromium.org>
> > Cc: Duncan Laurie <dlaurie@chromium.org>
> > Cc: Jason Gunthorpe <jgg@ziepe.ca>
> > Cc: Arnd Bergmann <arnd@arndb.de>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: Guenter Roeck <groeck@chromium.org>
> > Cc: Alexander Steffen <Alexander.Steffen@infineon.com>
> > Cc: Heiko Stuebner <heiko@sntech.de>
> > [swboyd@chromium.org: Replace boilerplate with SPDX tag, drop
> > suspended bit and remove ifdef checks in cr50.h, migrate to functions
> > exported in tpm_tis_spi.h, combine into one module instead of two]
> > Signed-off-by: Stephen Boyd <swboyd@chromium.org>
> 
> This variant breaks building the tpm as a module:
> 
> 
> WARNING: modpost: missing MODULE_LICENSE() in drivers/char/tpm/cr50_spi.o
> see include/linux/module.h for more information
> ERROR: "tpm_tis_spi_write32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read16" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_init" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_transfer" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_resume" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> ERROR: "cr50_spi_probe" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> make[2]: *** [../scripts/Makefile.modpost:103: modules-modpost] Fehler 1
> make[1]: *** [/home/devel/hstuebner/00_git-repos/linux-rockchip/Makefile:1302: modules] Fehler 2
> make[1]: Verzeichnis „/home/devel/hstuebner/00_git-repos/linux-rockchip/_build-arm64“ wird verlassen
> make: *** [Makefile:179: sub-make] Fehler 2
> 
> 
> After adding a dummy MODULE_LICENSE I end up with:
> 
> ERROR: "tpm_tis_spi_write32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read16" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_init" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_transfer" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_resume" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> ERROR: "cr50_spi_probe" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> 
> 
> So building things as modules this way clearly is not working. Going back
> to the previous approach makes the module happy again, aka:
> 
> diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
> index 6ff135d6f008..477fcddbff8c 100644
> --- a/drivers/char/tpm/Makefile
> +++ b/drivers/char/tpm/Makefile
> @@ -21,7 +21,9 @@ tpm-$(CONFIG_EFI) += eventlog/efi.o
>  tpm-$(CONFIG_OF) += eventlog/of.o
>  obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
>  obj-$(CONFIG_TCG_TIS) += tpm_tis.o
> -obj-$(CONFIG_TCG_TIS_SPI) += tpm_tis_spi.o cr50_spi.o
> +obj-$(CONFIG_TCG_TIS_SPI) += tpm_tis_spi_mod.o
> +tpm_tis_spi_mod-y := tpm_tis_spi.o
> +tpm_tis_spi_mod-y += cr50_spi.o
>  obj-$(CONFIG_TCG_TIS_I2C_ATMEL) += tpm_i2c_atmel.o
>  obj-$(CONFIG_TCG_TIS_I2C_INFINEON) += tpm_i2c_infineon.o
>  obj-$(CONFIG_TCG_TIS_I2C_NUVOTON) += tpm_i2c_nuvoton.o
> 

I wasn't happy that I had to make a tpm_tis_spi_mod target to get the
.ko to build properly but I thought it was because of the extra Kconfig
option. If two files can't be combined into one .ko and have it be named
tpm_tis_spi.ko then we have to do the above workaround. Or we can
#include the cr50_spi.c file into tpm_tis_spi.c file. Or we can rename
tpm_tis_spi.c to tpm_tis_spi_base.c and then do the above change with a
tpm_tis_spi-y. Maybe Masahiro has some hints.


WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <swboyd@chromium.org>
To: Heiko Stuebner <heiko@sntech.de>,
	Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Peter Huewe <peterhuewe@gmx.de>,
	Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
	Andrey Pronin <apronin@chromium.org>,
	linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org,
	Duncan Laurie <dlaurie@chromium.org>,
	Jason Gunthorpe <jgg@ziepe.ca>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Guenter Roeck <groeck@chromium.org>,
	Alexander Steffen <Alexander.Steffen@infineon.com>,
	linux-kbuild@vger.kernel.org
Subject: Re: [PATCH v6 4/4] tpm: tpm_tis_spi: Support cr50 devices
Date: Fri, 30 Aug 2019 08:40:42 -0700	[thread overview]
Message-ID: <5d69437b.1c69fb81.2722d.8556@mx.google.com> (raw)
In-Reply-To: <2926868.n5I8ZQlzTx@phil>

Quoting Heiko Stuebner (2019-08-30 08:33:48)
> Am Freitag, 30. August 2019, 00:41:10 CEST schrieb Stephen Boyd:
> > From: Andrey Pronin <apronin@chromium.org>
> > 
> > Add TPM2.0 PTP FIFO compatible SPI interface for chips with Cr50
> > firmware. The firmware running on the currently supported H1 Secure
> > Microcontroller requires a special driver to handle its specifics:
> > 
> >  - need to ensure a certain delay between SPI transactions, or else
> >    the chip may miss some part of the next transaction
> >  - if there is no SPI activity for some time, it may go to sleep,
> >    and needs to be waken up before sending further commands
> >  - access to vendor-specific registers
> > 
> > Cr50 firmware has a requirement to wait for the TPM to wakeup before
> > sending commands over the SPI bus. Otherwise, the firmware could be in
> > deep sleep and not respond. The method to wait for the device to wakeup
> > is slightly different than the usual flow control mechanism described in
> > the TCG SPI spec. Add a completion to tpm_tis_spi_transfer() before we
> > start a SPI transfer so we can keep track of the last time the TPM
> > driver accessed the SPI bus to support the flow control mechanism.
> > 
> > Split the cr50 logic off into a different file to keep it out of the
> > normal code flow of the existing SPI driver while making it all part of
> > the same module when the code is optionally compiled into the same
> > module. Export a new function, tpm_tis_spi_init(), and the associated
> > read/write/transfer APIs so that we can do this. Make the cr50 code wrap
> > the tpm_tis_spi_phy struct with its own struct to override the behavior
> > of tpm_tis_spi_transfer() by supplying a custom flow control hook. This
> > shares the most code between the core driver and the cr50 support
> > without combining everything into the core driver or exporting module
> > symbols.
> > 
> > Signed-off-by: Andrey Pronin <apronin@chromium.org>
> > Cc: Andrey Pronin <apronin@chromium.org>
> > Cc: Duncan Laurie <dlaurie@chromium.org>
> > Cc: Jason Gunthorpe <jgg@ziepe.ca>
> > Cc: Arnd Bergmann <arnd@arndb.de>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: Guenter Roeck <groeck@chromium.org>
> > Cc: Alexander Steffen <Alexander.Steffen@infineon.com>
> > Cc: Heiko Stuebner <heiko@sntech.de>
> > [swboyd@chromium.org: Replace boilerplate with SPDX tag, drop
> > suspended bit and remove ifdef checks in cr50.h, migrate to functions
> > exported in tpm_tis_spi.h, combine into one module instead of two]
> > Signed-off-by: Stephen Boyd <swboyd@chromium.org>
> 
> This variant breaks building the tpm as a module:
> 
> 
> WARNING: modpost: missing MODULE_LICENSE() in drivers/char/tpm/cr50_spi.o
> see include/linux/module.h for more information
> ERROR: "tpm_tis_spi_write32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read16" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_init" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_transfer" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_resume" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> ERROR: "cr50_spi_probe" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> make[2]: *** [../scripts/Makefile.modpost:103: modules-modpost] Fehler 1
> make[1]: *** [/home/devel/hstuebner/00_git-repos/linux-rockchip/Makefile:1302: modules] Fehler 2
> make[1]: Verzeichnis „/home/devel/hstuebner/00_git-repos/linux-rockchip/_build-arm64“ wird verlassen
> make: *** [Makefile:179: sub-make] Fehler 2
> 
> 
> After adding a dummy MODULE_LICENSE I end up with:
> 
> ERROR: "tpm_tis_spi_write32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read32" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_read16" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_init" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_transfer" [drivers/char/tpm/cr50_spi.ko] undefined!
> ERROR: "tpm_tis_spi_resume" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> ERROR: "cr50_spi_probe" [drivers/char/tpm/tpm_tis_spi.ko] undefined!
> 
> 
> So building things as modules this way clearly is not working. Going back
> to the previous approach makes the module happy again, aka:
> 
> diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
> index 6ff135d6f008..477fcddbff8c 100644
> --- a/drivers/char/tpm/Makefile
> +++ b/drivers/char/tpm/Makefile
> @@ -21,7 +21,9 @@ tpm-$(CONFIG_EFI) += eventlog/efi.o
>  tpm-$(CONFIG_OF) += eventlog/of.o
>  obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
>  obj-$(CONFIG_TCG_TIS) += tpm_tis.o
> -obj-$(CONFIG_TCG_TIS_SPI) += tpm_tis_spi.o cr50_spi.o
> +obj-$(CONFIG_TCG_TIS_SPI) += tpm_tis_spi_mod.o
> +tpm_tis_spi_mod-y := tpm_tis_spi.o
> +tpm_tis_spi_mod-y += cr50_spi.o
>  obj-$(CONFIG_TCG_TIS_I2C_ATMEL) += tpm_i2c_atmel.o
>  obj-$(CONFIG_TCG_TIS_I2C_INFINEON) += tpm_i2c_infineon.o
>  obj-$(CONFIG_TCG_TIS_I2C_NUVOTON) += tpm_i2c_nuvoton.o
> 

I wasn't happy that I had to make a tpm_tis_spi_mod target to get the
.ko to build properly but I thought it was because of the extra Kconfig
option. If two files can't be combined into one .ko and have it be named
tpm_tis_spi.ko then we have to do the above workaround. Or we can
#include the cr50_spi.c file into tpm_tis_spi.c file. Or we can rename
tpm_tis_spi.c to tpm_tis_spi_base.c and then do the above change with a
tpm_tis_spi-y. Maybe Masahiro has some hints.

  reply	other threads:[~2019-08-30 15:40 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-29 22:41 [PATCH v6 0/4] tpm: Add driver for cr50 Stephen Boyd
2019-08-29 22:41 ` [PATCH v6 1/4] dt-bindings: tpm: document properties " Stephen Boyd
2019-08-29 22:41 ` [PATCH v6 2/4] tpm: Add a flag to indicate TPM power is managed by firmware Stephen Boyd
2019-08-29 22:41 ` [PATCH v6 3/4] tpm: tpm_tis_spi: Introduce a flow control callback Stephen Boyd
2019-08-29 22:41 ` [PATCH v6 4/4] tpm: tpm_tis_spi: Support cr50 devices Stephen Boyd
2019-08-30 15:33   ` Heiko Stuebner
2019-08-30 15:40     ` Stephen Boyd [this message]
2019-08-30 15:40       ` Stephen Boyd
2019-09-02 16:53   ` kbuild test robot
2019-09-02 18:19   ` kbuild test robot
2019-09-03 16:39   ` Jarkko Sakkinen
2019-09-03 16:52     ` Stephen Boyd
2019-09-07 17:04       ` Jarkko Sakkinen
2019-09-07 17:20         ` Heiko Stübner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5d69437b.1c69fb81.2722d.8556@mx.google.com \
    --to=swboyd@chromium.org \
    --cc=Alexander.Steffen@infineon.com \
    --cc=apronin@chromium.org \
    --cc=arnd@arndb.de \
    --cc=dlaurie@chromium.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=groeck@chromium.org \
    --cc=heiko@sntech.de \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=jgg@ziepe.ca \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterhuewe@gmx.de \
    --cc=yamada.masahiro@socionext.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.