Re: [tpmdd-devel] [PATCH v4 1/2] tpm: devicetree: document properties for cr50

2016-07-29 Thread Rob Herring
On Fri, Jul 29, 2016 at 11:27:52AM -0600, Jason Gunthorpe wrote:
> On Thu, Jul 28, 2016 at 06:55:13PM -0700, Andrey Pronin wrote:
> > Add TPM2.0 PTP FIFO compatible SPI interface for chips with Cr50
> > firmware.
> 
> Since this is now a trivial device, does it still need a dedicated
> file?

There is no trivial devices file for SPI, only I2C. We could add one, 
but this is fine as is for me.

Acked-by: Rob Herring 

--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


Re: [tpmdd-devel] [PATCH v4 1/2] tpm: devicetree: document properties for cr50

2016-07-29 Thread Jason Gunthorpe
On Thu, Jul 28, 2016 at 06:55:13PM -0700, Andrey Pronin wrote:
> Add TPM2.0 PTP FIFO compatible SPI interface for chips with Cr50
> firmware.

Since this is now a trivial device, does it still need a dedicated
file?

Jason

--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


Re: [tpmdd-devel] [PATCH] tpm: fix cacheline alignment for DMA-able buffers

2016-07-29 Thread Jason Gunthorpe
On Thu, Jul 28, 2016 at 07:59:13PM -0700, Andrey Pronin wrote:
> Annotate buffers used in spi transactions as cacheline_aligned
> to use in DMA transfers.
> 
> Signed-off-by: Andrey Pronin 
>  drivers/char/tpm/st33zp24/spi.c | 4 ++--
>  drivers/char/tpm/tpm_tis_spi.c  | 4 ++--
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/char/tpm/st33zp24/spi.c b/drivers/char/tpm/st33zp24/spi.c
> index 9f5a011..0e9aad9 100644
> +++ b/drivers/char/tpm/st33zp24/spi.c
> @@ -70,8 +70,8 @@
>  struct st33zp24_spi_phy {
>   struct spi_device *spi_device;
>  
> - u8 tx_buf[ST33ZP24_SPI_BUFFER_SIZE];
> - u8 rx_buf[ST33ZP24_SPI_BUFFER_SIZE];
> + u8 tx_buf[ST33ZP24_SPI_BUFFER_SIZE] cacheline_aligned;
> + u8 rx_buf[ST33ZP24_SPI_BUFFER_SIZE] cacheline_aligned;
>  
>   int io_lpcpd;
>   int latency;

Hurm, this still looks wrong to me. Aligning the start of buffers is
not enough, the DMA'able space must also end on a cache line as well.

So, the buffers must also always be placed at the end of the struct.

IMHO It would be cleaner and safer to always kmalloc the DMA buffer
alone than to try and optimize like this.

Jason

--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


Re: [tpmdd-devel] [PATCH 2/2] TPM2.0:Adds securityfs support for TPM2.0 eventlog

2016-07-29 Thread Jason Gunthorpe
On Fri, Jul 29, 2016 at 02:44:39AM -0400, Nayna Jain wrote:
  
> + chip->bios_dir = tpm_bios_log_setup(chip);
> +

And the next somewhat pre-existing issue is that we call
tpm_bios_log_setup even if we don't have access to a bios log.

Does the bios log ever change or is it static at boot? Can we move
read_log into the chip and do it once so we can tell if it worked
before creating security fs stuff??

> +++ b/drivers/char/tpm/tpm2.h

You should probably pick a different name if this is only bios log
stuff.

> +struct tcg_efispecideventalgorithmsize {
> + u16 algorithm_id;
> + u16 digest_size;
> +} __packed;

The bios log is defined to be host endian?

Please refernce the standard in a comment that these structs are
coming from.

> +int read_log(struct tpm_bios_log *log)
> +{
> + struct device_node *np;
> + u32 logSize;
> + const u32 *sizep;
> + const u64 *basep;
> +
> + if (log->bios_event_log != NULL) {
> + pr_err("%s: ERROR - Eventlog already initialized\n",
> __func__);

No to all this logging.

If you really need some of it then use dev_dbg(>dev) pr_err is
not acceptable.

Yes, this means you need to safely get tpm_chip into read_log. Please
make that a singular patch because the lifetime model will be quite
complex.

> + np = of_find_node_by_name(NULL, "tpm");
> + if (!np) {
> + pr_err("%s: ERROR - tpm entry not supported\n", __func__);
> + return -ENODEV;
> + }

If you are doing of stuff then you need to document it in
Documentation/device-tree, so NAK on this without a proper
documentation patch. (make sure you follow the special rules for these
patches)

What is 'tpm' ? Is that the DT node that the TPM driver is binding
too? If so then you need to use chip->pdev->of_node instead of
'of_find_node_by_name'.

Same comments applies to the pre-existing tpm_of.c, please fix that as
well.

Why have you substantially copied tpm_of and called it tpm2_of? Don't
do that.

> +
> + sizep = of_get_property(np, "linux,sml-size", NULL);
> + if (sizep == NULL) {
> + pr_err("%s: ERROR - sml-get-allocated-size not found\n",
> + __func__);
> + goto cleanup_eio;
> + }
> + logSize = be32_to_cpup(sizep);

If you call endianness converters then make sure to tag
properly. eg sizep should be a be32, etc. Audit everything in
eventlog, I saw other cases..

> + log->bios_event_log = kmalloc(logSize, GFP_KERNEL);
> + if (!log->bios_event_log) {
> + pr_err("%s: ERROR - Not enough memory for firmware 
> measurements\n",
> + __func__);

Never log for ENOMEM, the kernel logs extensively already.

>  #if defined(CONFIG_TCG_IBMVTPM) || defined(CONFIG_TCG_IBMVTPM_MODULE) || \
> - defined(CONFIG_ACPI)
> -extern struct dentry **tpm_bios_log_setup(const char *);
> -extern void tpm_bios_log_teardown(struct dentry **);
> + defined(CONFIG_ACPI) || defined(CONFIG_PPC64)
> +extern struct dentry **tpm_bios_log_setup(struct tpm_chip *chip);
> +extern void tpm_bios_log_teardown(struct tpm_chip *chip);

I'm really deeply unhappy about these ifdefs and the general scheme
that was used to force this special difference into the tpm core.

Please find another way to do it.

IMHO, 'read_log' should simply try ACPI and OF in sequence to find the
log.

> + num_files = chip->flags & TPM_CHIP_FLAG_TPM2 ? 2 : 3;
> + ret = kmalloc_array(num_files, sizeof(struct dentry *), GFP_KERNEL);
> + if (!ret)
> + goto out;

Follow the sysfs pattern please.

Jason

--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


Re: [tpmdd-devel] [PATCH 1/2] TPM2.0: Refactor eventlog init functions for TPM1.2 and

2016-07-29 Thread Jason Gunthorpe
On Fri, Jul 29, 2016 at 02:44:38AM -0400, Nayna Jain wrote:
> Refactored eventlog.c file into tpm_eventlog.c and tpm_eventlog_init.c

If you are going to work on this stuff (and have the ability to test
it) can you fix some of the generic pre-existing problems too?

> +static int tpm_ascii_bios_measurements_open(struct inode *inode,
> + struct file *file)

> +static int tpm_binary_bios_measurements_open(struct inode *inode,
> +  struct file *file)

We don't need two (or more!) identical versions of this function, and it
is easy to fix:

> + bin_file =
> + securityfs_create_file("binary_bios_measurements",
> +S_IRUSR | S_IRGRP, tpm_dir, NULL,
> +_binary_bios_measurements_ops);

Replace NULL with _binary_b_measurments_seqops and recover it  in
the generic open using the inode->i_private pointer.

> + ret = kmalloc(3 * sizeof(struct dentry *), GFP_KERNEL);
> + if (!ret)
> + goto out_ascii;

I can't find a kfree for this memory, looks like it is leaking, please
fix it.

Do not allocate memory for this, just include the dentry array
directly in the tpm_chip as the sysfs does today.

You can change the signatures to accept tpm_chip in a cleanup patch as
well, moving from the tpm2 patch.

Jason

--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


[tpmdd-devel] [PATCH 2/2] TPM2.0:Adds securityfs support for TPM2.0 eventlog

2016-07-29 Thread Nayna Jain
Adds securityfs support for TPM2.0.
This patch currently supports only binary_bios_measurements.

Signed-off-by: Nayna Jain 
---
 drivers/char/tpm/Makefile|   8 +-
 drivers/char/tpm/tpm-chip.c  |  20 ++--
 drivers/char/tpm/tpm2.h  |  75 
 drivers/char/tpm/tpm2_eventlog.c | 224 +++
 drivers/char/tpm/tpm2_of.c   |  77 
 drivers/char/tpm/tpm_eventlog.h  |  10 +-
 drivers/char/tpm/tpm_eventlog_init.c |  71 ---
 7 files changed, 446 insertions(+), 39 deletions(-)
 create mode 100644 drivers/char/tpm/tpm2.h
 create mode 100644 drivers/char/tpm/tpm2_eventlog.c
 create mode 100644 drivers/char/tpm/tpm2_of.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index 9136762..3f4b8bc 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -6,10 +6,14 @@ tpm-y := tpm-interface.o tpm-dev.o tpm-sysfs.o tpm-chip.o 
tpm2-cmd.o
 tpm-$(CONFIG_ACPI) += tpm_ppi.o
 
 ifdef CONFIG_ACPI
-   tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_acpi.o
+   tpm-y += tpm_eventlog_init.o tpm2_eventlog.o tpm_eventlog.o tpm_acpi.o
 else
 ifdef CONFIG_TCG_IBMVTPM
-   tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_of.o
+   tpm-y += tpm_eventlog_init.o tpm2_eventlog.o tpm_eventlog.o tpm_of.o
+else
+ifdef CONFIG_PPC64
+   tpm-y += tpm_eventlog_init.o tpm2_eventlog.o tpm_eventlog.o tpm2_of.o
+endif
 endif
 endif
 obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index 5a2f043..57b2201 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -283,20 +283,9 @@ static int tpm1_chip_register(struct tpm_chip *chip)
 
tpm_sysfs_add_device(chip);
 
-   chip->bios_dir = tpm_bios_log_setup(dev_name(>dev));
-
return 0;
 }
 
-static void tpm1_chip_unregister(struct tpm_chip *chip)
-{
-   if (chip->flags & TPM_CHIP_FLAG_TPM2)
-   return;
-
-   if (chip->bios_dir)
-   tpm_bios_log_teardown(chip->bios_dir);
-}
-
 static void tpm_del_legacy_sysfs(struct tpm_chip *chip)
 {
struct attribute **i;
@@ -358,11 +347,14 @@ int tpm_chip_register(struct tpm_chip *chip)
if (rc)
return rc;
 
+   chip->bios_dir = tpm_bios_log_setup(chip);
+
tpm_add_ppi(chip);
 
rc = tpm_add_char_device(chip);
if (rc) {
-   tpm1_chip_unregister(chip);
+   if (chip->bios_dir)
+   tpm_bios_log_teardown(chip);
return rc;
}
 
@@ -398,7 +390,9 @@ void tpm_chip_unregister(struct tpm_chip *chip)
 
tpm_del_legacy_sysfs(chip);
 
-   tpm1_chip_unregister(chip);
+   if (chip->bios_dir)
+   tpm_bios_log_teardown(chip);
+
tpm_del_char_device(chip);
 }
 EXPORT_SYMBOL_GPL(tpm_chip_unregister);
diff --git a/drivers/char/tpm/tpm2.h b/drivers/char/tpm/tpm2.h
new file mode 100644
index 000..0b1a871a
--- /dev/null
+++ b/drivers/char/tpm/tpm2.h
@@ -0,0 +1,75 @@
+#ifndef __TPM2_H__
+#define __TPM2_H__
+
+#define TPM_ALG_SHA1_DIGEST_SIZE   20
+#define TPM_ALG_SHA256_DIGEST_SIZE 32
+#define TPM_ALG_SHA384_DIGEST_SIZE 48
+
+#define HASH_COUNT 3
+#define MAX_TPM_LOG_MSG128
+
+extern const struct seq_operations tpm2_binary_b_measurments_seqops;
+
+/* Event log header algorithm spec. */
+struct tcg_efispecideventalgorithmsize {
+   u16 algorithm_id;
+   u16 digest_size;
+} __packed;
+
+/* Event log header data. */
+struct tcg_efispecideventstruct {
+   u8  signature[16];
+   u32 platform_class;
+   u8  spec_version_minor;
+   u8  spec_version_major;
+   u8  spec_errata;
+   u8  uintnsize;
+   u32 num_algs;
+   struct tcg_efispecideventalgorithmsize  digest_sizes[HASH_COUNT];
+   u8  vendor_info_size;
+   u8  vendor_info[0];
+} __packed;
+
+/* Header entry for eventlog. */
+struct tcg_pcr_event {
+   u32 pcr_index;
+   u32 event_type;
+   u8  digest[20];
+   u32 event_size;
+   u8  event[MAX_TPM_LOG_MSG];
+} __packed;
+
+/* Digest union for crypto agility. */
+union tpmu_ha {
+   u8   sha1[TPM_ALG_SHA1_DIGEST_SIZE];
+   u8   sha256[TPM_ALG_SHA256_DIGEST_SIZE];
+   u8   sha384[TPM_ALG_SHA384_DIGEST_SIZE];
+} __packed;
+
+/* Crypto Agile algorithm and respective digest. */
+struct tpmt_ha {
+   u16 algorithm_id;
+   union tpmu_ha   digest;
+} __packed;
+
+/* Crypto agile digests list. */
+struct tpml_digest_values {
+   u32 count;
+ 

[tpmdd-devel] [PATCH 1/2] TPM2.0: Refactor eventlog init functions for TPM1.2 and

2016-07-29 Thread Nayna Jain
Refactored eventlog.c file into tpm_eventlog.c and tpm_eventlog_init.c

Breakdown is:

* tpm_eventlog_init.c : Moved eventlog initialization methods like
to setup securityfs, to open and release seqfile from tpm_eventlog.c
to this file. This is to keep the logic of initialization for TPM1.2
and TPM2.0 in common file.

* tpm_eventlog.c : This file now has only methods specific to parsing
and iterate TPM1.2 entry log formats. It can understand only TPM1.2
and is called by methods in tpm_eventlog_init if identified TPM device
is TPM1.2.

Signed-off-by: Nayna Jain 
---
 drivers/char/tpm/Makefile|   4 +-
 drivers/char/tpm/tpm_eventlog.c  | 156 +
 drivers/char/tpm/tpm_eventlog.h  |   3 +
 drivers/char/tpm/tpm_eventlog_init.c | 183 +++
 4 files changed, 192 insertions(+), 154 deletions(-)
 create mode 100644 drivers/char/tpm/tpm_eventlog_init.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index a385fb8..9136762 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -6,10 +6,10 @@ tpm-y := tpm-interface.o tpm-dev.o tpm-sysfs.o tpm-chip.o 
tpm2-cmd.o
 tpm-$(CONFIG_ACPI) += tpm_ppi.o
 
 ifdef CONFIG_ACPI
-   tpm-y += tpm_eventlog.o tpm_acpi.o
+   tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_acpi.o
 else
 ifdef CONFIG_TCG_IBMVTPM
-   tpm-y += tpm_eventlog.o tpm_of.o
+   tpm-y += tpm_eventlog_init.o tpm_eventlog.o tpm_of.o
 endif
 endif
 obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c
index e722886..b8f22ec 100644
--- a/drivers/char/tpm/tpm_eventlog.c
+++ b/drivers/char/tpm/tpm_eventlog.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005, 2012 IBM Corporation
+ * Copyright (C) 2005, 2012, 2016 IBM Corporation
  *
  * Authors:
  * Kent Yoder 
@@ -11,6 +11,7 @@
  * Maintained by: 
  *
  * Access to the eventlog created by a system's firmware / BIOS
+ * specific to TPM 1.2.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -257,20 +258,6 @@ static int tpm_binary_bios_measurements_show(struct 
seq_file *m, void *v)
 
 }
 
-static int tpm_bios_measurements_release(struct inode *inode,
-struct file *file)
-{
-   struct seq_file *seq = file->private_data;
-   struct tpm_bios_log *log = seq->private;
-
-   if (log) {
-   kfree(log->bios_event_log);
-   kfree(log);
-   }
-
-   return seq_release(inode, file);
-}
-
 static int tpm_ascii_bios_measurements_show(struct seq_file *m, void *v)
 {
int len = 0;
@@ -304,151 +291,16 @@ static int tpm_ascii_bios_measurements_show(struct 
seq_file *m, void *v)
return 0;
 }
 
-static const struct seq_operations tpm_ascii_b_measurments_seqops = {
+const struct seq_operations tpm_ascii_b_measurments_seqops = {
.start = tpm_bios_measurements_start,
.next = tpm_bios_measurements_next,
.stop = tpm_bios_measurements_stop,
.show = tpm_ascii_bios_measurements_show,
 };
 
-static const struct seq_operations tpm_binary_b_measurments_seqops = {
+const struct seq_operations tpm_binary_b_measurments_seqops = {
.start = tpm_bios_measurements_start,
.next = tpm_bios_measurements_next,
.stop = tpm_bios_measurements_stop,
.show = tpm_binary_bios_measurements_show,
 };
-
-static int tpm_ascii_bios_measurements_open(struct inode *inode,
-   struct file *file)
-{
-   int err;
-   struct tpm_bios_log *log;
-   struct seq_file *seq;
-
-   log = kzalloc(sizeof(struct tpm_bios_log), GFP_KERNEL);
-   if (!log)
-   return -ENOMEM;
-
-   if ((err = read_log(log)))
-   goto out_free;
-
-   /* now register seq file */
-   err = seq_open(file, _ascii_b_measurments_seqops);
-   if (!err) {
-   seq = file->private_data;
-   seq->private = log;
-   } else {
-   goto out_free;
-   }
-
-out:
-   return err;
-out_free:
-   kfree(log->bios_event_log);
-   kfree(log);
-   goto out;
-}
-
-static const struct file_operations tpm_ascii_bios_measurements_ops = {
-   .open = tpm_ascii_bios_measurements_open,
-   .read = seq_read,
-   .llseek = seq_lseek,
-   .release = tpm_bios_measurements_release,
-};
-
-static int tpm_binary_bios_measurements_open(struct inode *inode,
-struct file *file)
-{
-   int err;
-   struct tpm_bios_log *log;
-   struct seq_file *seq;
-
-   log = kzalloc(sizeof(struct tpm_bios_log), GFP_KERNEL);
-   if (!log)
-   return -ENOMEM;
-
-   if ((err = read_log(log)))
-   goto out_free;
-
-   /* now 

[tpmdd-devel] [PATCH 0/2] Cover Letter - TPM2.0: Add securityfs support for

2016-07-29 Thread Nayna Jain
Overview:
=
Patch adds support for enabling securityfs for TPM2.0.
The patch currently adds support for only binary_bios_measurements.

The structure for TPM2.0 is compliant with TCG Spec for 2.0 family.
Also , the reading of data has the assumption that writer would have
followed TCG Spec and so everything is in little-endian.

The tpm device driver code has been refactored to:
* Identify the TPM version - 1.2 or 2.0
* Calls corresponding compatible seq_ops for iterating over eventlog.

Files Description:
===

* tpm-chip.c : Adds call to setup bios log for TPM2.0.

* tpm2_of.c : Reads the device tree entries to find the location
and size of event.

* tpm_eventlog_init.c : Provides common initialization functions
 between TPM2.0 and TPM1.2 to setup securityfs entries and seq_ops
 iterator.  The functions has been moved from tpm_eventlog.c into this file.

* tpm_eventlog.c : Provides functions only specific to TPM1.2
version. Common initialization functions are moved to tpm_eventlog_init.c

* tpm2_eventlog.c : Provides functions specific only for TPM2.0
eventlog format.

* tpm2.h : Header file for TPM2.0 structures and functions.

Nayna Jain (2):
  TPM2.0: Refactor eventlog methods.
  TPM2.0:Adds securityfs support for TPM2.0 eventlog

 drivers/char/tpm/Makefile|   8 +-
 drivers/char/tpm/tpm-chip.c  |  20 ++--
 drivers/char/tpm/tpm2.h  |  75 
 drivers/char/tpm/tpm2_eventlog.c | 224 +++
 drivers/char/tpm/tpm2_of.c   |  77 
 drivers/char/tpm/tpm_eventlog.c  | 156 +---
 drivers/char/tpm/tpm_eventlog.h  |  13 +-
 drivers/char/tpm/tpm_eventlog_init.c | 216 +
 8 files changed, 617 insertions(+), 172 deletions(-)
 create mode 100644 drivers/char/tpm/tpm2.h
 create mode 100644 drivers/char/tpm/tpm2_eventlog.c
 create mode 100644 drivers/char/tpm/tpm2_of.c
 create mode 100644 drivers/char/tpm/tpm_eventlog_init.c

-- 
2.5.0


--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel


Re: [tpmdd-devel] Regarding recently Added TPM2.0 support to the Nuvoton i2c driver

2016-07-29 Thread Nayna
Thanks everyone for discussion and clarifying the design points. This 
helps and we can now test by changing our device-tree entries.

Also, we are assuming that just updating .compatible device tree entry 
should do the fix. We don't have to add any additional .data property. 
And driver will match .data value even for nuvoton,npct650 from device 
driver npct601 entry, where .data is explicitly specified.

Thanks & Regards,
- Nayna

On 07/28/2016 04:04 AM, George Wilson wrote:
> On Wed, Jul 27, 2016 at 11:42:29AM -0600, Jason Gunthorpe wrote:
>>> Should not the device tree tell you what is actually *there* and let the
>>> driver code decide what is compatible?  Rather than the firmware trying to
>>> make a guess as to which Nuvoton device id to try to match in the Nuvoton
>>> driver code?
>>
>> Yes, that is what I suggested:
>>
>>compatible = "nuvoton,npct650", "nuvoton,npct601"
>>
>> Today's kernel has no idea what 650 is, but since the DT says it is
>> compatible with the 601 then today's kernel will bind to it. 601 is
>> the kernel documented compatible tag for that specific I2C
>> API.
>
> So in this case, early firmware would simply pass the additional
> compatible string.
>
>> Perhaps we should add 6xx as the generic flavor? I'm not as clear on
>> what DT maintainers think about that, but there is precedent.
>
> We thought about suggesting that too.  However,
> http://elinux.org/Device_Tree_Usage advises:
>
>Warning: Don't use wildcard compatible values, like
>"fsl,mpc83xx-uart" or similar. Silicon vendors will invariably
>make a change that breaks your wildcard assumptions the moment
>it is too late to change it. Instead, choose a specific silicon
>implementations and make all subsequent silicon compatible with
>it.
>
> It looks like the driver's compatible table is on the right track and
> we need to make our platform's device tree conform to its expectations.
>


--
___
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel