Re: [PATCH v3 1/2] tpm: Add tpm_tis_i2c backend for tpm_tis_core
From: Alexander Steffen
Date: Mon May 23 2022 - 12:10:31 EST
On 23.05.22 11:44, Krzysztof Kozlowski wrote:
On 23/05/2022 11:32, Krzysztof Kozlowski wrote:
On 23/05/2022 10:55, Alexander Steffen wrote:
On 22.05.22 10:30, Krzysztof Kozlowski wrote:
Without bindings, new compatibles and properties cannot be accepted, so NAK.
Could you be more specific as to what the correct solution is here?
Usually, I'd just look at what the existing code does, but that is a
little messy:
* socionext,synquacer-tpm-mmio is documented only in
Documentation/devicetree/bindings/trivial-devices.yaml
* nuvoton,npct601 is documented in trivial-devices.yaml and is also
mentioned in Documentation/devicetree/bindings/security/tpm/tpm-i2c.txt
* nuvoton,npct650 is only mentioned in tpm-i2c.txt, but appears nowhere
in the code
* infineon,tpm_i2c_infineon appears only in tpm_i2c_infineon.c, but is
documented nowhere
* tpm_tis_spi_main.c has all its compatibles documented in
tpm_tis_spi.txt, except google,cr50, which is documented in
google,cr50.txt, even though it has the same properties
* tpm_tis_i2c_cr50.c uses the exact same google,cr50, even though that
is explicitly documented as a device "on SPI Bus" and lists
spi-max-frequency as one of its required properties, which does not make
any sense for an I2C device
* According to the feedback in
https://patchwork.kernel.org/project/linux-integrity/patch/20220404081835.495-4-johannes.holland@xxxxxxxxxxxx/#24801807,
the text format, that is currently used everywhere in
Documentation/devicetree/bindings/security/tpm/, is deprecated anyway
and should be replaced by YAML
So would you be okay with just adding the compatibles from tpm_tis_i2c.c
to trivial-devices.yaml, so that checkpatch does not complain anymore,
and leave the cleanup of the mess above for later?
To trivial-devices you should add only bindings of really trivial
devices, which do not have any other properties, even when the bindings
are finished. This means you describe fully the hardware and still have
only reg+compatible.
If this device fits such case - no other hardware properties than reg -
then, feel free to document it in trivial-devices. However I am not sure
that TPM devices are that trivial... For example tpm-i2c.txt defines
also interrupts and label.
If the device is not trivial, it should be documented in bindings,
either dedicated or some existing ones.
Ok, let's see whether I understood that correctly:
I think, in general, TPMs are trivial devices: They sit on the I2C or
SPI bus waiting for commands, but don't do much else. They might have
TPM-specific properties, like whether they implement the 1.2 or 2.0
command set, but we don't encode those in the device tree, since the
driver tries to detect the available functionality dynamically (which
makes sense, since some TPMs can be upgraded from 1.2 to 2.0, so that is
not a static property of the device). Other properties, such as the
maximum SPI frequency, are not TPM-specific, but apply to every SPI
device and might be limited by either the SPI device itself or the SPI
controller (or the user, wishing to run at lower frequencies, for
whatever reason).
Looking at the code, there are some TPM-specific properties in use
though: There is the powered-while-suspended flag, which only the TPM
driver looks at (in drivers/char/tpm/eventlog/of.c). It is not specific
to a single TPM (a single compatible string), but can be set for all the
TPMs. Also, the linux,sml-* properties might be TPM-specific, though
they get set in arch/powerpc/kernel/prom_init.c to communicate some
information to the TPM driver. And there is lpcpd-gpios, which is only
used by st33zp24.
Now the purpose of trivial-devices.yaml is to specify a schema of valid
device definitions. It only allows the properties reg, interrupts and
spi-max-frequency in addition to the compatible strings. So, strictly
speaking, none of the TPMs should be listed there, since all the TPMs
can, in theory, use the powered-while-suspended flag, which is not
allowed by the schema. With other properties the schema does not seem to
be too strict, since it applies to both I2C and SPI devices, but allows
the spi-max-frequency property, even though that does not make sense for
I2C devices.
So the correct solution could be this: Replace all the text files in
Documentation/devicetree/bindings/security/tpm/ with a single
trivial-tpms.yaml (similar to trivial-devices.yaml) and also move all
the TPMs from trivial-devices.yaml there. This allows to properly
document the powered-while-suspended flag and other generic TPM
properties. st33zp24 should get its own YAML, to document lpcpd-gpios,
that is only used by this driver. I'm not quite sure what to do with
ibmvtpm.txt, since that seems to document several properties, that are
not referenced in the TPM driver at all but instead get used by some
scsi driver (e.g. ibm,loc-code), so I'd probably ignore it for now. What
do you think?
As for tpm_tis_i2c, if there are no other objections to its current
state, I'd add its compatible strings to trivial-devices.yaml for now,
then do the cleanup as described above later. It does not make the code
more wrong, since trivial-devices.yaml already contains some TPM
devices, that are very similar to what tpm_tis_i2c now supports (i.e.
that also don't have special properties), but allows for more time to do
the cleanup properly, without holding up tpm_tis_i2c.
Kind regards
Alexander