To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
drivers/char/tpm/tpm.h | 20 +++++++++++
drivers/char/tpm/tpm_tis.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 105 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
drivers/char/tpm/tpm.h | 20 ++++++++++
drivers/char/tpm/tpm_tis.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 114 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-05 13:32:32
On Thu, Jun 01, 2017 at 07:04:04PM -0700, Azhar Shaikh wrote:
quoted hunk
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
drivers/char/tpm/tpm.h | 20 ++++++++++
drivers/char/tpm/tpm_tis.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 114 insertions(+)
You said that this code does not work compared to a version that does
only static ioremap.
I compared this to the other version. One of the major differences is
that outb() is done before releasing the mapping. Don't know or
understand what difference that would make but it is a semantic
difference.
Another observation is that should you have wmb() before outb() to make
sure that all the write operations are complete?
quoted hunk
++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned off+ */+static void enable_lpc_clk_run(void)+{+ u32 clkrun_val;+ void __iomem *ilb_base_addr = NULL;++ ilb_base_addr = (void __iomem *)+ kmap_atomic_pfn(INTEL_LEGACY_BLK_BASE_ADDR >> PAGE_SHIFT);++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ kunmap_atomic(ilb_base_addr);+ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);+}+#else+static void disable_lpc_clk_run(void)+{+}+static void enable_lpc_clk_run(void)+{+}+#endif+ static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len, u8 *result) { struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);+ if (is_bsw())+ disable_lpc_clk_run();
Do is_bsw() instead inside so that this can be unconditionally called.
quoted hunk
+ while (len--) *result++ = ioread8(phy->iobase + addr);++ if (is_bsw())+ enable_lpc_clk_run();+ return 0; }
@@ -104,8 +170,15 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, { struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);+ if (is_bsw())+ disable_lpc_clk_run();+ while (len--) iowrite8(*value++, phy->iobase + addr);++ if (is_bsw())+ enable_lpc_clk_run();+ return 0; }
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Monday, June 5, 2017 6:32 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v2] tpm: Enable CLKRUN protocol for Braswell systems
On Thu, Jun 01, 2017 at 07:04:04PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems, disable
CLKRUN protocol during TPM transactions and re-enable once the
transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
drivers/char/tpm/tpm.h | 20 ++++++++++
drivers/char/tpm/tpm_tis.c | 94
++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 114 insertions(+)
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index
++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ kunmap_atomic(ilb_base_addr);+ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);+}
You said that this code does not work compared to a version that does only
static ioremap.
I compared this to the other version. One of the major differences is that
outb() is done before releasing the mapping. Don't know or understand what
difference that would make but it is a semantic difference.
I tried unmapping after outb() and wmb(), still code does not work.
Another observation is that should you have wmb() before outb() to make
sure that all the write operations are complete?
I think you meant to say add wmb() 'after' outb() and not before.
quoted
++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned+off */ static void enable_lpc_clk_run(void) {+ u32 clkrun_val;+ void __iomem *ilb_base_addr = NULL;++ ilb_base_addr = (void __iomem *)+ kmap_atomic_pfn(INTEL_LEGACY_BLK_BASE_ADDR >>
PAGE_SHIFT);
quoted
++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ kunmap_atomic(ilb_base_addr);+ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);+}+#else+static void disable_lpc_clk_run(void) { } static void+enable_lpc_clk_run(void) { } #endif+ static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-06 17:13:58
On Mon, Jun 05, 2017 at 06:42:55PM +0000, Shaikh, Azhar wrote:
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Monday, June 5, 2017 6:32 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v2] tpm: Enable CLKRUN protocol for Braswell systems
On Thu, Jun 01, 2017 at 07:04:04PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems, disable
CLKRUN protocol during TPM transactions and re-enable once the
transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
drivers/char/tpm/tpm.h | 20 ++++++++++
drivers/char/tpm/tpm_tis.c | 94
++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 114 insertions(+)
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index
++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ kunmap_atomic(ilb_base_addr);+ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);+}
You said that this code does not work compared to a version that does only
static ioremap.
I compared this to the other version. One of the major differences is that
outb() is done before releasing the mapping. Don't know or understand what
difference that would make but it is a semantic difference.
I tried unmapping after outb() and wmb(), still code does not work.
Send ioremap() version (or any version that actually works).
quoted
Another observation is that should you have wmb() before outb() to make
sure that all the write operations are complete?
I think you meant to say add wmb() 'after' outb() and not before.
Yes, that is correct.
quoted
quoted
++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned+off */ static void enable_lpc_clk_run(void) {+ u32 clkrun_val;+ void __iomem *ilb_base_addr = NULL;++ ilb_base_addr = (void __iomem *)+ kmap_atomic_pfn(INTEL_LEGACY_BLK_BASE_ADDR >>
PAGE_SHIFT);
quoted
++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ kunmap_atomic(ilb_base_addr);+ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);+}+#else+static void disable_lpc_clk_run(void) { } static void+enable_lpc_clk_run(void) { } #endif+ static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 103 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 107 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
++#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000+#define ILB_REMAP_SIZE 0x100+#define LPC_CNTRL_REG_OFFSET 0x84+#define LPC_CLKRUN_EN (1 << 2)++void __iomem *ilb_base_addr;++/**+ * disable_lpc_clk_run() - clear LPC CLKRUN_EN i.e. clocks will be free running+ */+static void disable_lpc_clk_run(void)+{+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
quoted hunk
+}++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned off+ */+static void enable_lpc_clk_run(void)+{+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();+}
So what you actually want to do is fold all the errata crap into an x86
specific chunk and just define disable/enable_lpc_clk_run() as null
functions on everything else.
I'd pick better names too - if other platforms need a hook here it won't
I imagine be about LPC. Possibly you want names like
platform_begin_tpm_xfer(data);
platform_end_tpm_xfer(data);
@@ -191,6 +287,10 @@ static int tpm_tis_pnp_init(struct pnp_dev *pnp_dev, acpi_dev_handle = ACPI_HANDLE(&pnp_dev->dev); }+ if (is_bsw())+ ilb_base_addr = ioremap(INTEL_LEGACY_BLK_BASE_ADDR,+ ILB_REMAP_SIZE);+
This suggests to me that the bsw stuff wants to wrap the standard methods
because it's weird and ugly having random magic hardware globals in what
should be standard code.
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Alan Cox [mailto:gnomes at lxorguk.ukuu.org.uk]
Sent: Wednesday, June 7, 2017 2:45 PM
To: Shaikh, Azhar <redacted>
Cc: jarkko.sakkinen at linux.intel.com; jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net; linux-kernel at vger.kernel.org; linux-
security-module at vger.kernel.org
Subject: Re: [PATCH v3] tpm: Enable CLKRUN protocol for Braswell systems
quoted
+++ b/drivers/char/tpm/tpm_tis.c
@@ -89,13 +89,89 @@ static inline int is_itpm(struct acpi_device *dev)
++#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000+#define ILB_REMAP_SIZE 0x100+#define LPC_CNTRL_REG_OFFSET 0x84+#define LPC_CLKRUN_EN (1 << 2)++void __iomem *ilb_base_addr;++/**+ * disable_lpc_clk_run() - clear LPC CLKRUN_EN i.e. clocks will be+free running */ static void disable_lpc_clk_run(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
Memory barrier to enforce the order so that the outb() is completed, which ensures that the LPC clocks are running before sending any TPM command.
quoted
+}++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned+off */ static void enable_lpc_clk_run(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();+}
Same
quoted
+
static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16
So what you actually want to do is fold all the errata crap into an x86 specific
chunk and just define disable/enable_lpc_clk_run() as null functions on
everything else.
Ok, will do.
I'd pick better names too - if other platforms need a hook here it won't I
imagine be about LPC. Possibly you want names like
platform_begin_tpm_xfer(data);
platform_end_tpm_xfer(data);
How about these? Since most of the functions in this driver begin with 'tpm_'
disable_lpc_clk_run() - > tpm_start_xfer()
enable_lpc_clk_run() -> tpm_end_xfer()
quoted
@@ -104,8 +180,13 @@ static int tpm_tcg_write_bytes(struct
@@ -191,6 +287,10 @@ static int tpm_tis_pnp_init(struct pnp_dev
*pnp_dev,
quoted
acpi_dev_handle = ACPI_HANDLE(&pnp_dev->dev); }+ if (is_bsw())+ ilb_base_addr = ioremap(INTEL_LEGACY_BLK_BASE_ADDR,+ ILB_REMAP_SIZE);+
This suggests to me that the bsw stuff wants to wrap the standard methods
because it's weird and ugly having random magic hardware globals in what
should be standard code.
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-08 12:38:39
On Thu, Jun 08, 2017 at 01:11:43AM +0000, Shaikh, Azhar wrote:
quoted
-----Original Message-----
From: Alan Cox [mailto:gnomes at lxorguk.ukuu.org.uk]
Sent: Wednesday, June 7, 2017 2:45 PM
To: Shaikh, Azhar <redacted>
Cc: jarkko.sakkinen at linux.intel.com; jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net; linux-kernel at vger.kernel.org; linux-
security-module at vger.kernel.org
Subject: Re: [PATCH v3] tpm: Enable CLKRUN protocol for Braswell systems
quoted
+++ b/drivers/char/tpm/tpm_tis.c
@@ -89,13 +89,89 @@ static inline int is_itpm(struct acpi_device *dev)
++#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000+#define ILB_REMAP_SIZE 0x100+#define LPC_CNTRL_REG_OFFSET 0x84+#define LPC_CLKRUN_EN (1 << 2)++void __iomem *ilb_base_addr;++/**+ * disable_lpc_clk_run() - clear LPC CLKRUN_EN i.e. clocks will be+free running */ static void disable_lpc_clk_run(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
Memory barrier to enforce the order so that the outb() is completed, which ensures that the LPC clocks are running before sending any TPM command.
quoted
quoted
+}++/**+ * enable_lpc_clk_run() - set LPC CLKRUN_EN i.e. clocks can be turned+off */ static void enable_lpc_clk_run(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();+}
Same
quoted
+
static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16
So what you actually want to do is fold all the errata crap into an x86 specific
chunk and just define disable/enable_lpc_clk_run() as null functions on
everything else.
Ok, will do.
quoted
I'd pick better names too - if other platforms need a hook here it won't I
imagine be about LPC. Possibly you want names like
platform_begin_tpm_xfer(data);
platform_end_tpm_xfer(data);
How about these? Since most of the functions in this driver begin with 'tpm_'
disable_lpc_clk_run() - > tpm_start_xfer()
enable_lpc_clk_run() -> tpm_end_xfer()
tpm_platform_begin_xfer() would be the best alternative as it highlights
platform quirk better.
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
Memory barrier to enforce the order so that the outb() is completed, which ensures that the LPC clocks are running before sending any TPM command.
wmb() doesn't do that. It merely ensures that the write has been posted
to the fabric. If as I suspect your LPC bus implements outb() as a
non-posted write you don't need the wmb(). If it doesn't then you need to
issue whatever access is needed to the fabric to ensure the post
completed (eg for PCI if you do an MMIO write you must do an MMIO read
from the same devfn).
Secondly outb(0x80, 0xCC) doesn't write 0xCC to port 0x80. It writes 0x80
to port 0xCC !
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jason Gunthorpe <hidden> Date: 2017-06-08 18:39:31
On Thu, Jun 08, 2017 at 07:22:59PM +0100, Alan Cox wrote:
quoted
quoted
quoted
+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
Memory barrier to enforce the order so that the outb() is
completed, which ensures that the LPC clocks are running before
sending any TPM command.
wmb() doesn't do that. It merely ensures that the write has been posted
to the fabric. If as I suspect your LPC bus implements outb() as a
non-posted write you don't need the wmb().
I think the point here is to bootstrap the sleeping LPC bus clock
before a TPM command is issued, presumably because the auto-wakeup circuit
is busted or something.
For that purpose all that should be required is strong ordering of the
outb relative to the other TPM commands at the LPC interface FIFO. I
also think the wmb is not needed because outb is already defined to be
strongly in order with respect to writel/readl ?
Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
For that purpose all that should be required is strong ordering of the
outb relative to the other TPM commands at the LPC interface FIFO. I
also think the wmb is not needed because outb is already defined to be
strongly in order with respect to writel/readl ?
That's my assumption but given this is all some kind of 'it's broken'
fixup I thought best to ask. Assuming there is nothing else magical going
on then yes it should be deleted.
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Alan Cox [mailto:gnomes at lxorguk.ukuu.org.uk]
Sent: Thursday, June 8, 2017 11:23 AM
To: Shaikh, Azhar <redacted>
Cc: jarkko.sakkinen at linux.intel.com; jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net; linux-kernel at vger.kernel.org; linux-
security-module at vger.kernel.org
Subject: Re: [PATCH v3] tpm: Enable CLKRUN protocol for Braswell systems
quoted
quoted
quoted
+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code
is x86 specific
Memory barrier to enforce the order so that the outb() is completed,
which ensures that the LPC clocks are running before sending any TPM
command.
wmb() doesn't do that. It merely ensures that the write has been posted to
the fabric. If as I suspect your LPC bus implements outb() as a non-posted
write you don't need the wmb(). If it doesn't then you need to issue
whatever access is needed to the fabric to ensure the post completed (eg for
PCI if you do an MMIO write you must do an MMIO read from the same
devfn).
Secondly outb(0x80, 0xCC) doesn't write 0xCC to port 0x80. It writes 0x80 to
port 0xCC !
Oops my bad! I got that reversed. Will change it.
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Alan Cox [mailto:gnomes at lxorguk.ukuu.org.uk]
Sent: Thursday, June 8, 2017 11:50 AM
To: Jason Gunthorpe <redacted>
Cc: Shaikh, Azhar <redacted>;
jarkko.sakkinen at linux.intel.com; tpmdd-devel at lists.sourceforge.net; linux-
kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v3] tpm: Enable CLKRUN protocol for Braswell systems
quoted
For that purpose all that should be required is strong ordering of the
outb relative to the other TPM commands at the LPC interface FIFO. I
also think the wmb is not needed because outb is already defined to be
strongly in order with respect to writel/readl ?
That's my assumption but given this is all some kind of 'it's broken'
fixup I thought best to ask. Assuming there is nothing else magical going on
then yes it should be deleted.
As Jason mentioned, outb is already define to be strongly ordered, then wmb is not needed.
I will delete it.
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-10 11:07:01
On Thu, Jun 08, 2017 at 12:39:20PM -0600, Jason Gunthorpe wrote:
On Thu, Jun 08, 2017 at 07:22:59PM +0100, Alan Cox wrote:
quoted
quoted
quoted
quoted
+ outb(0x80, 0xCC);++ /* Make sure the above write is completed */+ wmb();
Why the wmb(). It doesn't do what the comment says! Also this code is x86
specific
Memory barrier to enforce the order so that the outb() is
completed, which ensures that the LPC clocks are running before
sending any TPM command.
wmb() doesn't do that. It merely ensures that the write has been posted
to the fabric. If as I suspect your LPC bus implements outb() as a
non-posted write you don't need the wmb().
I think the point here is to bootstrap the sleeping LPC bus clock
before a TPM command is issued, presumably because the auto-wakeup circuit
is busted or something.
For that purpose all that should be required is strong ordering of the
outb relative to the other TPM commands at the LPC interface FIFO. I
also think the wmb is not needed because outb is already defined to be
strongly in order with respect to writel/readl ?
Jason
writel AFAIK guarantees by itself strong RW ordering.
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-10 11:13:43
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning in your
opinion?
Related.
I looked again the kmap version of the patch and still cannot figure
out what could be wrong. Obviously the wrong outb() cause unexpected
behavior.
Do you have chances to grab klog from kmap version with correct outb?
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Saturday, June 10, 2017 4:14 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems, disable
CLKRUN protocol during TPM transactions and re-enable once the
transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for
everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning in your
opinion?
Oh yes! It is definitely worth mentioning. I forgot to mention that.
Will definitely mention it in the changelog for the next version if any or will re send v4 with updated changelog for v3.
Related.
I looked again the kmap version of the patch and still cannot figure out what
could be wrong. Obviously the wrong outb() cause unexpected behavior.
Do you have chances to grab klog from kmap version with correct outb?
I have not tried the kmap version with corrected outb(). Will give that a try.
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-12 07:50:08
On Sat, Jun 10, 2017 at 04:35:50PM +0000, Shaikh, Azhar wrote:
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Saturday, June 10, 2017 4:14 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems, disable
CLKRUN protocol during TPM transactions and re-enable once the
transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for
everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning in your
opinion?
Oh yes! It is definitely worth mentioning. I forgot to mention that.
Will definitely mention it in the changelog for the next version if any or will re send v4 with updated changelog for v3.
quoted
Related.
I looked again the kmap version of the patch and still cannot figure out what
could be wrong. Obviously the wrong outb() cause unexpected behavior.
Do you have chances to grab klog from kmap version with correct outb?
I have not tried the kmap version with corrected outb(). Will give that a try.
quoted
/Jarkko
Thank you!
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Monday, June 12, 2017 12:50 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Sat, Jun 10, 2017 at 04:35:50PM +0000, Shaikh, Azhar wrote:
quoted
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Saturday, June 10, 2017 4:14 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell
systems
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable once
the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions
for everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning in
your opinion?
Oh yes! It is definitely worth mentioning. I forgot to mention that.
Will definitely mention it in the changelog for the next version if any or will
re send v4 with updated changelog for v3.
quoted
quoted
Related.
I looked again the kmap version of the patch and still cannot figure
out what could be wrong. Obviously the wrong outb() cause unexpected
behavior.
quoted
quoted
Do you have chances to grab klog from kmap version with correct outb?
I have not tried the kmap version with corrected outb(). Will give that a try.
quoted
/Jarkko
Thank you!
Even with the corrected outb(), kmap version fails to boot. Could not get boot logs :-(
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-14 14:46:29
On Wed, Jun 14, 2017 at 12:51:25AM +0000, Shaikh, Azhar wrote:
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Monday, June 12, 2017 12:50 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Sat, Jun 10, 2017 at 04:35:50PM +0000, Shaikh, Azhar wrote:
quoted
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Saturday, June 10, 2017 4:14 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell
systems
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable once
the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions
for everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning in
your opinion?
Oh yes! It is definitely worth mentioning. I forgot to mention that.
Will definitely mention it in the changelog for the next version if any or will
re send v4 with updated changelog for v3.
quoted
quoted
Related.
I looked again the kmap version of the patch and still cannot figure
out what could be wrong. Obviously the wrong outb() cause unexpected
behavior.
quoted
quoted
Do you have chances to grab klog from kmap version with correct outb?
I have not tried the kmap version with corrected outb(). Will give that a try.
quoted
/Jarkko
Thank you!
Even with the corrected outb(), kmap version fails to boot. Could not get boot logs :-(
quoted
/Jarkko
Lets go with the ioremap() version for now.
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Wednesday, June 14, 2017 7:46 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Wed, Jun 14, 2017 at 12:51:25AM +0000, Shaikh, Azhar wrote:
quoted
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Monday, June 12, 2017 12:50 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org; linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell
systems
On Sat, Jun 10, 2017 at 04:35:50PM +0000, Shaikh, Azhar wrote:
quoted
quoted
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Saturday, June 10, 2017 4:14 AM
To: Shaikh, Azhar <redacted>
Cc: jgunthorpe at obsidianresearch.com;
tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org;
linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell
systems
On Thu, Jun 08, 2017 at 04:46:33PM -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run () and
enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub
functions for everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
The wrong parameter order in outb() is not worth of mentioning
in your opinion?
Oh yes! It is definitely worth mentioning. I forgot to mention that.
Will definitely mention it in the changelog for the next version
if any or will
re send v4 with updated changelog for v3.
quoted
quoted
Related.
I looked again the kmap version of the patch and still cannot
figure out what could be wrong. Obviously the wrong outb() cause
unexpected
behavior.
quoted
quoted
Do you have chances to grab klog from kmap version with correct
outb?
quoted
quoted
quoted
quoted
I have not tried the kmap version with corrected outb(). Will give that a
try.
quoted
quoted
quoted
quoted
/Jarkko
Thank you!
Even with the corrected outb(), kmap version fails to boot. Could not
get boot logs :-(
quoted
/Jarkko
Lets go with the ioremap() version for now.
Okay. I will re-send the same [PATCH v4] after updating the change log for v3.
/Jarkko
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run() and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
- Correct the parameters for outb()
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-18 23:52:43
On Wed, 2017-06-14 at 12:39 -0700, Azhar Shaikh wrote:
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
Does not merge to my tree:
git://git.infradead.org/users/jjs/linux-tpmdd.git
Please fix.
/Jarkko
quoted hunk
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run() and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
- Correct the parameters for outb()
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-----Original Message-----
From: Jarkko Sakkinen [mailto:jarkko.sakkinen at linux.intel.com]
Sent: Sunday, June 18, 2017 4:53 PM
To: Shaikh, Azhar <redacted>;
jgunthorpe at obsidianresearch.com; tpmdd-devel at lists.sourceforge.net;
linux-kernel at vger.kernel.org
Cc: linux-security-module at vger.kernel.org
Subject: Re: [PATCH v4] tpm: Enable CLKRUN protocol for Braswell systems
On Wed, 2017-06-14 at 12:39 -0700, Azhar Shaikh wrote:
quoted
To overcome a hardware limitation on Intel Braswell systems, disable
CLKRUN protocol during TPM transactions and re-enable once the
transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
Does not merge to my tree:
git://git.infradead.org/users/jjs/linux-tpmdd.git
Please fix.
Sure will rebase and send again.
/Jarkko
quoted
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run() and enable_lpc_clk_run()
to avoid
- build breakage on architectures which do not implement
kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of
kmap_atomic_pfn()/kunmap_atomic()
quoted
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and
enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for
everything else
- Rename the functions disable_lpc_clk_run() ->
tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
- Correct the parameters for outb()
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112
+++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index
+0); }++/**+ * tpm_platform_begin_xfer() - clear LPC CLKRUN_EN i.e. clocks will+be running */ static void tpm_platform_begin_xfer(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Disable LPC CLKRUN# */+ clkrun_val &= ~LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0xCC, 0x80);++}++/**+ * tpm_platform_end_xfer() - set LPC CLKRUN_EN i.e. clocks can be+turned off */ static void tpm_platform_end_xfer(void) {+ u32 clkrun_val;++ if (!is_bsw())+ return;++ clkrun_val = ioread32(ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /* Enable LPC CLKRUN# */+ clkrun_val |= LPC_CLKRUN_EN;+ iowrite32(clkrun_val, ilb_base_addr + LPC_CNTRL_REG_OFFSET);++ /*+ * Write any random value on port 0x80 which is on LPC, to make+ * sure LPC clock is running before sending any TPM command.+ */+ outb(0xCC, 0x80);++}+#else+static inline bool is_bsw(void)+{+ return false;+}++static void tpm_platform_begin_xfer(void) { }++static void tpm_platform_end_xfer(void) { } #endif+ static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run() and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
- Correct the parameters for outb()
Changes from v4:
- Rebased to apply on git://git.infradead.org/users/jjs/linux-tpmdd.git
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jarkko Sakkinen <hidden> Date: 2017-06-19 14:51:47
On Sun, Jun 18, 2017 at 07:17:59PM -0700, Azhar Shaikh wrote:
To overcome a hardware limitation on Intel Braswell systems,
disable CLKRUN protocol during TPM transactions and re-enable
once the transaction is completed.
Signed-off-by: Azhar Shaikh <redacted>
Reviewed-by: Jarkko Sakkinen <redacted>
Tested-by: Jarkko Sakkinen <redacted> (compilation)
/Jarkko
quoted hunk
---
Changes from v1:
- Add CONFIG_X86 around disable_lpc_clk_run() and enable_lpc_clk_run() to avoid
- build breakage on architectures which do not implement kmap_atomic_pfn()
Changes from v2:
- Use ioremap()/iounmap() instead of kmap_atomic_pfn()/kunmap_atomic()
- Move is_bsw() and all macros from tpm.h to tpm_tis.c file.
- Add the is_bsw() check in disable_lpc_clk_run() and enable_lpc_clk_run()
- instead of adding it in each read/write API.
Changes from v3:
- Move the code under #ifdef CONFIG_X86 and create stub functions for everything else
- Rename the functions disable_lpc_clk_run() -> tpm_platform_begin_xfer() and
- enable_lpc_clk_run() -> tpm_platform_end_xfer()
- Remove wmb()
- Correct the parameters for outb()
Changes from v4:
- Rebased to apply on git://git.infradead.org/users/jjs/linux-tpmdd.git
drivers/char/tpm/tpm.h | 4 ++
drivers/char/tpm/tpm_tis.c | 112 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html