Fix TPM chip hanging system before suspend/shutdown
Subsystems (3)
cover Fix TPM chip hanging system before suspend/shutdown
Fix hanging before shutdown/suspend behaviour on some buggy platform firmwares.
Adam Alves (1):
Some buggy firmwares might require the TPM device to be in default
locality (Locality 0) before suspend or shutdown. Failing to do so would leave the system in a hanged state before sleep or power off (after “reboot: Power down” message). Such is the case for the ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS board, I believe this might be the case for several other boards based on the bugs I have found on the internet while trying to find out how to fix my specific issue. Most forums suggest the user to disable the TPM device on firmware BIOS in order to work around this specific issue, which disables several nice security features provided by TPM, such as secure boot attestation, automatic decryption and hardware random generator.
drivers/char/tpm/tpm-chip.c | 9 ++++++++ drivers/char/tpm/tpm-interface.c | 36 +++++++++++++++++++++++++++++++- drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 46 insertions(+), 1 deletion(-)
Signature · 1 line
2.44.0
PATCH 1/1 Fix TPM chip hanging system before suspend/shutdown
My PC would hang on almost every shutdown/suspend until I started testing this patch and so far in the past week I haven’t experienced any problems anymore.
I suspect that the root cause on my specific board is that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
This issue might be related to the following bug:
https://bugzilla.kernel.org/show_bug.cgi?id=217890
Enable a user to configure the kernel
through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call dmi_check_system on the tpm_init function so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in case CONFIG_DMI is set though, since dmi_check_system is a non-op when CONFIG_DMI is not set.
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
--- drivers/char/tpm/tpm-chip.c | 9 ++++++++ drivers/char/tpm/tpm-interface.c | 36 +++++++++++++++++++++++++++++++- drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 46 insertions(+), 1 deletion(-)
drivers/char/tpm/tpm-chip.c +9 -0
@@ -139,6 +139,9 @@ void tpm_chip_stop(struct tpm_chip *chip) {tpm_go_idle (chip);tpm_relinquish_locality (chip); +// If locality is to be preserved, we need to make sure it is Locality 0. +if (chip->flags &TPM_CHIP_PRESERVE_LOCALITY ) +tpm_request_locality (chip);tpm_clk_disable (chip); }EXPORT_SYMBOL_GPL (tpm_chip_stop);
@@ -291,6 +294,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {
@@ -668,6 +674,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);
drivers/char/tpm/tpm-interface.c +35 -1
@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h"
@@ -382,6 +383,34 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on ready +* state before suspend/shutdown, otherwise suspend and shutdown might +* hang the system, so we need to adjust suspend code for handling this. +*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend,"The firmware expects TPM to be at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , system_id->ident); + tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = { + { + .ident ="TUF GAMING B460M-PLUS" , + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_BOARD_NAME ,"TUF GAMING B460M-PLUS" ), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; +/* * We are about to suspend. Save the TPM state * so that it can be restored.
@@ -394,6 +423,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;
@@ -431,7 +463,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; - chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ; + chip->flags &= ~(TPM_CHIP_PRESERVE_LOCALITY |TPM_CHIP_FLAG_SUSPENDED );/* * Guarantee that SUSPENDED is written last, so that hwrng does not
@@ -476,6 +508,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );
drivers/char/tpm/tpm.h +1 -0
@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);
include/linux/tpm.h +1 -0
@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_PRESERVE_LOCALITY = BIT(10), };#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)
Signature · 1 line
2.44.0
Jarkko Sakkinen
maintainerQuoted 44 lines · Adam Alves
My PC would hang on almost every shutdown/suspend until I started testing this patch and so far in the past week I haven’t experienced any problems anymore.
I suspect that the root cause on my specific board is that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
This issue might be related to the following bug:
https://bugzilla.kernel.org/show_bug.cgi?id=217890Enable a user to configure the kernel
through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, calldmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
Signed-off-by Adam Alves <[email protected]>--- drivers/char/tpm/tpm-chip.c | 9 ++++++++ drivers/char/tpm/tpm-interface.c | 36 +++++++++++++++++++++++++++++++- drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 46 insertions(+), 1 deletion(-)drivers/char/tpm/tpm-chip.c +0
-0
drivers/char/tpm/tpm-chip.c void tpm_chip_stop(struct tpm_chip *chip) · line 142
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -139,6 +139,9 @@ void tpm_chip_stop(struct tpm_chip *chip) {tpm_go_idle (chip);tpm_relinquish_locality (chip); +// If locality is to be preserved, we need to make sure it is Locality 0.
If you put that kind C++ comment you should also check out
https://www.kernel.org/doc/html/latest/process/coding-style.html
Other stuff that I said in my earlier response still applies.
BR, Jarkko
Thank you for the instructions!
First I used gmail and even setting it to text only it destroyed formatting. Later I set up git to send the e-mail directly.
I read everything you asked again and implemented all suggestions, sending it right away.
Em qui., 7 de mar. de 2024 às 16:54, Jarkko Sakkinen <[email protected]> escreveu:
Quoted 57 lines · Adam Alves
Quoted 44 lines
My PC would hang on almost every shutdown/suspend until I started testing this patch and so far in the past week I haven’t experienced any problems anymore.
I suspect that the root cause on my specific board is that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
This issue might be related to the following bug:
https://bugzilla.kernel.org/show_bug.cgi?id=217890Enable a user to configure the kernel
through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, calldmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
Signed-off-by Adam Alves <[email protected]>--- drivers/char/tpm/tpm-chip.c | 9 ++++++++ drivers/char/tpm/tpm-interface.c | 36 +++++++++++++++++++++++++++++++- drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 46 insertions(+), 1 deletion(-)drivers/char/tpm/tpm-chip.c +0
-0drivers/char/tpm/tpm-chip.c void tpm_chip_stop(struct tpm_chip *chip) · line 142
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -139,6 +139,9 @@ void tpm_chip_stop(struct tpm_chip *chip) {tpm_go_idle (chip);tpm_relinquish_locality (chip); +// If locality is to be preserved, we need to make sure it is Locality 0. If you put that kind C++ comment you should also check out
https://www.kernel.org/doc/html/latest/process/coding-style.htmlOther stuff that I said in my earlier response still applies.
BR, Jarkko
Signature · 1 line
Adam Oliveira Alves
PATCH v2 1/1 tpm: Fix suspend/shutdown on some boards by preserving chip Locality
In reply to Jarkko SakkinenSome buggy firmware might require the TPM device to be in default locality (Locality 0) before suspend or shutdown. Failing to do so would leave the system in a hanged state before sleep or power off (after “reboot: Power down” message). Such is the case for the ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS board, I believe this might be the case for several other boards based on some bugs over the internet while trying to find out how to fix my specific issue. Most forums suggest the user to disable the TPM device on firmware BIOS in order to work around this specific issue, which disables several security features provided by TPM.
The root cause might be that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call dmi_check_system on the tpm_init function so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in case CONFIG_DMI is set though, since dmi_check_system is a non-op when CONFIG_DMI is not set.
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
---v1->v2: fix formatting issues and simplified tpm_chip_stop code.
drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)
drivers/char/tpm/tpm-chip.c +12 -0
@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) { +if (chip->locality !=0 ) +tpm_request_locality (chip); +return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);
@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {
@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);
drivers/char/tpm/tpm-interface.c +37 -0
@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h"
@@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases. +*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident); + tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = { + { + .ident ="TUF GAMING B460M-PLUS" , + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_BOARD_NAME ,"TUF GAMING B460M-PLUS" ), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; +/* * We are about to suspend. Save the TPM state * so that it can be restored.
@@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;
@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/*
@@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );
drivers/char/tpm/tpm.h +1 -0
@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);
include/linux/tpm.h +1 -0
@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)
Signature · 1 line
2.44.0
Re: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Dear Adam,
Thank you very much for analyzing the problem and finding a fix. I have some small nits and questions. The current state is alright. Should you send another version, that you could address the nits.
Am 07.03.24 um 23:49 schrieb Adam Alves:
Quoted 4 lines
Some buggy firmware might require the TPM device to be in default locality (Locality 0) before suspend or shutdown. Failing to do so would leave the system in a hanged state before sleep or power off (after “reboot: Power down” message).
Out of curiosity, would reboot work?
Quoted 13 lines
Such is the case for the ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS board, I believe this might be the case for several other boards based on some bugs over the internet while trying to find out how to fix my specific issue. Most forums suggest the user to disable the TPM device on firmware BIOS in order to work around this specific issue, which disables several security features provided by TPM. > The root cause might be that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
Quoted 2 lines
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set
I’d use `` from Markdown.
Quoted 8 lines
before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call
dmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.
Could you please document the TPM for completeness?
Quoted 5 lines
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
Is the exception useful, if a user explicitly requests to disable the behavior? I was thinking for a case, where a newer system firmware has a fix (and the DMI check would need to be extended).
For completeness, I’d mention/paste the new log message.
Quoted 2 lines
Should this be backported to the stable series?
Quoted 61 lines
---
v1->v2: fix formatting issues and simplifiedtpm_chip_stopcode.drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)drivers/char/tpm/tpm-chip.c +12
-0@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) { +if (chip->locality !=0 ) +tpm_request_locality (chip); +return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);drivers/char/tpm/tpm-interface.c +1
-0@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h" @@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; }
drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 394
Quoted 10 lines
drivers/char/tpm/tpm-interface.c +9
-0+/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases. +*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." );
I was wondering, if there is a name, that would make clear, that it is not only during suspend. But I couldn’t come up with one.
Quoted 68 lines
drivers/char/tpm/tpm-interface.c +27
-0+ +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident); + tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = { + { + .ident ="TUF GAMING B460M-PLUS" , + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_BOARD_NAME ,"TUF GAMING B460M-PLUS" ), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; +/* * We are about to suspend. Save the TPM state * so that it can be restored. @@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/* @@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );drivers/char/tpm/tpm.h +1
-0@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);include/linux/tpm.h +0
-0
include/linux/tpm.h enum tpm_chip_flags { · line 290
Quoted 7 lines
include/linux/tpm.h +1
-0@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)
Kind regards,
Paul
Re: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Dear Paul,
Thank you very much for your review, I will provide a new version with some of your suggestions.
Quoted 1 line
Out of curiosity, would reboot work?
Reboot works, but clearly in an error handling path by the firmware (the whole system is powered off for some seconds and then turned backed on automatically), this doesn't happen when I am rebooting from another OS. With this fix, reboot goes softly in Linux as well.
Quoted 2 lines
I’d use `` from Markdown.
Could you please document the TPM for completeness?
Done. Will be submitted with a new version.
Quoted 3 lines
Is the exception useful, if a user explicitly requests to disable the behavior? I was thinking for a case, where a newer system firmware has a fix (and the DMI check would need to be extended).
Thanks! Will submit a new version with possibility to set module param to force enable, force disable and auto. Will also include cmdline documentation on parameter.
Quoted 1 line
For completeness, I’d mention/paste the new log message.
Will be submitted with a new version.
Quoted 1 line
Should this be backported to the stable series?
That would be great, please advise me if I need to do anything to allow that.
Quoted 1 line
Reviewed-by Paul Menzel <[email protected]>
Thank you, will include this on the next version, submitting shortly - I am currently testing.
Best,
Adam Alves
PATCH v3 1/1 tpm: Fix suspend/shutdown on some boards by preserving chip Locality
In reply to Paul MenzelSome buggy firmware might require the TPM device to be in default locality (Locality 0) before suspend or shutdown. Failing to do so would leave the system in a hanged state before sleep or power off (after “reboot: Power down” message). Such is the case for the ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS board with a TPM 2.0 Intel chip (rev. 500.16 - CRM start method), I believe this might be the case for several other boards based on some bugs over the internet while trying to find out how to fix my specific issue. Most forums suggest the user to disable the TPM device on firmware BIOS in order to work around this specific issue, which disables several security features provided by TPM.
The root cause might be that after the ACPI command to put the device to S3 or S5, some firmware application/driver will try to use the TPM chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
Enable a user to configure the kernel through tpm.sleep_locality_preserve=1 boot parameter so that the locality is preserved before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call dmi_check_system on the tpm_init function so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in case CONFIG_DMI is set though, since dmi_check_system is a non-op when CONFIG_DMI is not set.
In case tpm.sleep_locality_preserve=0 force the workaround to be disabled.
In case tpm.sleep_locality_preserve=-1 (the default) automatically enable the workaround for specific boards (currently only ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS, others should be added when we diagnose this specific issue), if a compatible board is detected an info message will be logged with the following text: "Board XXX: TPM locality preserved before suspend/shutdown.".
---v2->v3:
- Fixed quotes on commit text and included TPM chip used on test setup
- Allow forcing pre-fix behavior even for buggy boards
- Documented logged message for detected boards
- Changed parameter name to tpm_sleep_locality_preserve, since shutdown is also a sleep state
- Included kernel cmdline parameter documentation
.../admin-guide/kernel-parameters.txt | 8 ++++ drivers/char/tpm/tpm-chip.c | 12 ++++++ drivers/char/tpm/tpm-interface.c | 41 +++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 5 files changed, 63 insertions(+)
Documentation/admin-guide/kernel-parameters.txt +8 -0
@@ -6531,6 +6531,14 @@ This will guarantee that all the other pcrs are saved. + tpm.sleep_locality_preserve= [HW,TPM] + Format: { -1 | 0 | 1 } + Defines the locality behavior of the TPM chip before suspend/shutdown. + 0 -- Force normal behavior (relinquish before sleep) + 1 -- Force locality to be preserved before sleep + -1 -- Automatically set based on known buggy boards + Default: -1 + tpm_tis.interrupts= [HW,TPM] Enable interrupts for the MMIO based physical layer for the FIFO interface. By default it is set to false
drivers/char/tpm/tpm-chip.c +12 -0
@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) { +if (chip->locality !=0 ) +tpm_request_locality (chip); +return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);
@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_sleep_locality_preserve) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {
@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_sleep_locality_preserve) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);
drivers/char/tpm/tpm-interface.c +41 -0
71 lines not on this page · raw message
drivers/char/tpm/tpm.h +1 -0
@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern int tpm_sleep_locality_preserve;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);
include/linux/tpm.h +1 -0
@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)
Signature · 1 line
2.44.0
Jarkko Sakkinen
maintainerRe: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
In reply to Adam AlvesQuoted 10 lines · Adam Alves
Some buggy firmware might require the TPM device to be in default locality (Locality 0) before suspend or shutdown. Failing to do so would leave the system in a hanged state before sleep or power off (after “reboot: Power down” message). Such is the case for the ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS board, I believe this might be the case for several other boards based on some bugs over the internet while trying to find out how to fix my specific issue. Most forums suggest the user to disable the TPM device on firmware BIOS in order to work around this specific issue, which disables several security features provided by TPM.
Re-write the paragraph as
ASUSTeK TUF GAMING B460M-PLUS hangs on power down, after "reboot:
Power down" message
Please do not add discussion to the commit message it should only contain symptom and solution and rationale why the patch fixes the issue.
And please done add any open-ended arguments ("some ..."). We care only about identified bugs.
The lacking information here is the CPU model (/proc/cpuinfo), on which kernel version the bug was produced and what kind of TPM the system has (discrete chip or firmware TPM should be easy to check from BIOS).
Also, which firmwre version you have and have you tested with the most up to date firmware (BIOS)?
Before drawing any conclusions we need to know the environment better.
Quoted 2 lines
The root cause might be that after the ACPI command to put the device
What is "the ACPI command"? Refer to concrete items instead of asking to guess what you is the ACPI command for you.
Quoted 4 lines
chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
We don't speculate about the root cause here, only document it. Please move this paragraph before diffstat (see below)>
Quoted 10 lines
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call
dmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.
Please describe what the *kernel command-line" (for clarity sake) semantically means.
Also please remove anything about diangnosing. We care only about fixes.
Quoted 6 lines
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
This neither documents the default value. I'm also lost did setting this "1" or "0" fix the issue in your case?
So: firmware version and being up-to-date is important and also this needs to be reproduciable with the mainline Linux tree, not distro kernel or custom kernel.
Quoted 4 lines
---
<cover letter>
OK, I'll try to check what is done here but please re-read "describing your changes" before sending next version:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
Quoted 13 lines
v1->v2: fix formatting issues and simplifiedtpm_chip_stopcode.drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)drivers/char/tpm/tpm-chip.c +0
-0
drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 140
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) {
The commit message did not explain what this flag is and what is its purpose.
Also why you need to populate global flag inside chip, or the value of it?
Why this is not just:
if (tpm_locality_on_suspend) {?
drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 142
Quoted 2 lines
drivers/char/tpm/tpm-chip.c +2
-0+if (chip->locality !=0 ) +tpm_request_locality (chip);
This will unconditionally skip calling tpm_request_locality() because Linux only uses locality 0. Not sure what good does this make.
Quoted 46 lines
drivers/char/tpm/tpm-chip.c +9
-0+return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);drivers/char/tpm/tpm-interface.c +5
-0@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h" @@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases.
drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 399
Quoted 10 lines
drivers/char/tpm/tpm-interface.c +10
-0+*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident);
Please remove pr_info(), we do not want to bloat klog.
drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 405
Quoted 6 lines
drivers/char/tpm/tpm-interface.c +6
-0+ tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = {
The commit message did not introduce this. Also should have inline documentation.
/*
* What the heck this.
*/
Quoted 57 lines
drivers/char/tpm/tpm-interface.c +16
-0+ { + .ident = "TUF GAMING B460M-PLUS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_BOARD_NAME, "TUF GAMING B460M-PLUS"), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; + /* * We are about to suspend. Save the TPM state * so that it can be restored.@@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/* @@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );drivers/char/tpm/tpm.h +1
-0@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);include/linux/tpm.h +0
-0
include/linux/tpm.h enum tpm_chip_flags { · line 290
Quoted 7 lines
include/linux/tpm.h +1
-0@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)
BR, Jarkko
Re: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Quoted 4 lines
The lacking information here is the CPU model (
/proc/cpuinfo), on which kernel version the bug was produced and what kind of TPM the system has (discrete chip or firmware TPM should be easy to check from BIOS).
CPU model: Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz I am attaching data from /proc/cpuinfo
TPM: No info on mainboard documentation regarding TPM. BIOS is not clear whether or not it is discrete or firmware. Based on dmidecode (attached) I get the following:
TPM Device
Vendor ID: INTC
Specification Version: 2.0
Firmware Revision: 500.16
Description: INTEL
Characteristics:
Family configurable via platform software support
OEM-specific Information: 0x00000000
I also extracted TPM_CRB_INTF_ID_0 from the TPM: a13a808600084311 (Vendor ID 8086, Device ID a13a, Revision ID 00). The only match I found while browsing for this device ID is 100 Series/C230 Series Chipset Family MEI Controller #1, which is a PCI device, so it might not be related to the TPM.
The driver bound to the tpm0 device is tpm_crb. The disassembled TPM2 ACPI table is also attached in case it helps.
The bug was reproduced from upstream kernel version 6.8.0 (attached build .config that I used).
Quoted 2 lines
Also, which firmwre version you have and have you tested with the most up to date firmware (BIOS)?
I have the most updated firmware provided by ASUS: TUF GAMING B460M-PLUS BIOS 1601
Quoted 2 lines
What is "the ACPI command"? Refer to concrete items instead of asking to guess what you is the ACPI command for you.
I enabled ACPI_DEBUG on my kernel to know where the it was actually hanging. The last function is actually the last function that should be called by the kernel for a successful shutdown:
hwsleep-0078 hw_legacy_sleep : Entering sleep state [S5]^M
hwregs-0460 hw_write_pm1_control : ----Entry^M hwvalid-0097 hw_validate_io_request: ----Entry^M hwvalid-0111 hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^M
hwregs-0360 hw_write : Wrote: 0000000000001C01 width 16
to 0000000000001804 (SystemIO)^M
hwregs-0473 hw_write_pm1_control : ----Exit- AE_OK^M hwregs-0460 hw_write_pm1_control : ----Entry^M hwvalid-0097 hw_validate_io_request: ----Entry^M hwvalid-0111 hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^M
It is writing both SLP_TYP + SLP_EN to ACPI PM1b_CNT registers (as expected by specification). I checked the flags and it is in line with the flags required by the system ACPI tables.
I understand from that that the system is hanging after ACPI firmware takes over. The same issue happens if I force a EFI shutdown.
Since the the BUG has appeared again even with the fix implemented, I am holding this patch for now until I find a solution that permanently fixes the issue. The next time I try to submit a patch that will comply with all your suggestions, thank you very much.
I would appreciate if you had any hint on how I could keep digging to find the issue that might be causing this bug. This is an issue that only happens when I shutdown from Linux and my TPM is activated in BIOS. That's why my guess is that this is what should be causing it. From Windows, shutdown is always flawless.
Best regards,
Adam
Quoted 224 lines
Quoted 5 lines
chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
We don't speculate about the root cause here, only document it. Please move this paragraph before diffstat (see below)>
Quoted 10 lines
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call
dmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.Please describe what the *kernel command-line" (for clarity sake) semantically means.
Also please remove anything about diangnosing. We care only about fixes.
Quoted 6 lines
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
This neither documents the default value. I'm also lost did setting this "1" or "0" fix the issue in your case?
So: firmware version and being up-to-date is important and also this needs to be reproduciable with the mainline Linux tree, not distro kernel or custom kernel.
Quoted 4 lines
---
<cover letter>
OK, I'll try to check what is done here but please re-read "describing your changes" before sending next version:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
Quoted 13 lines
v1->v2: fix formatting issues and simplifiedtpm_chip_stopcode.drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)drivers/char/tpm/tpm-chip.c +0
-0drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 140
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) {The commit message did not explain what this flag is and what is its purpose.
Also why you need to populate global flag inside chip, or the value of it?
Why this is not just:
if (tpm_locality_on_suspend) {?
drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 142
Quoted 2 lines
drivers/char/tpm/tpm-chip.c +2
-0+if (chip->locality !=0 ) +tpm_request_locality (chip);This will unconditionally skip calling
tpm_request_locality()because Linux only uses locality 0. Not sure what good does this make.Quoted 46 lines
drivers/char/tpm/tpm-chip.c +9
-0+return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);drivers/char/tpm/tpm-interface.c +5
-0@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h" @@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases. drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 399
Quoted 10 lines
drivers/char/tpm/tpm-interface.c +10
-0+*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident);Please remove
pr_info(), we do not want to bloat klog.drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 405
Quoted 6 lines
drivers/char/tpm/tpm-interface.c +6
-0+ tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = {The commit message did not introduce this. Also should have inline documentation.
/*
* What the heck this.
*/Quoted 63 lines
drivers/char/tpm/tpm-interface.c +16
-0+ { + .ident = "TUF GAMING B460M-PLUS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_BOARD_NAME, "TUF GAMING B460M-PLUS"), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; + /* * We are about to suspend. Save the TPM state * so that it can be restored.@@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/* @@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );drivers/char/tpm/tpm.h +1
-0@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);include/linux/tpm.h +1
-0@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };
Quoted 4 lines
include/linux/tpm.h enum tpm_chip_flags { · line 290
Quoted 1 line
include/linux/tpm.h +0
-0#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)BR, Jarkko
--
Adam Oliveira Alves
# dmidecode 3.5 Getting SMBIOS data from sysfs. SMBIOS 3.2.0 present. Table at 0x7FBB4000.
Handle 0x0000, DMI type 0, 26 bytes
BIOS Information
Vendor: American Megatrends Inc.
Version: 1601
Release Date: 02/11/2022
Address: 0xF0000
Runtime Size: 64 kB
ROM Size: 16 MB
Characteristics:
PCI is supported
BIOS is upgradeable
BIOS shadowing is allowed
Boot from CD is supported
Selectable boot is supported
BIOS ROM is socketed
EDD is supported
5.25"/1.2 MB floppy services are supported (int 13h) 3.5"/720 kB floppy services are supported (int 13h) 3.5"/2.88 MB floppy services are supported (int 13h) Print screen service is supported (int 5h) Serial services are supported (int 14h) Printer services are supported (int 17h) ACPI is supported
USB legacy is supported
BIOS boot specification is supported Targeted content distribution is supported UEFI is supported
BIOS Revision: 16.1
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: ASUS
Product Name: System Product Name
Version: System Version
Serial Number: System Serial Number
UUID: 18e15754-7198-4cd0-b46a-3c7c3f3befe2 Wake-up Type: Power Switch
SKU Number: SKU
Family: To be filled by O.E.M.
Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
Manufacturer: ASUSTeK COMPUTER INC.
Product Name: TUF GAMING B460M-PLUS
Version: Rev 1.xx
Serial Number: 210378408203637
Asset Tag: Default string
Features:
Board is a hosting board
Board is replaceable
Location In Chassis: Default string
Chassis Handle: 0x0003
Type: Motherboard
Contained Object Handles: 0
Handle 0x0003, DMI type 3, 22 bytes
Chassis Information
Manufacturer: Default string
Type: Desktop
Lock: Not Present
Version: Default string
Serial Number: Default string
Asset Tag: Default string
Boot-up State: Safe
Power Supply State: Safe
Thermal State: Safe
Security Status: None
OEM Information: 0x00000000
Height: Unspecified
Number Of Power Cords: 1
Contained Elements: 0
SKU Number: Default string
Handle 0x0004, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: KBMS_USB910 Internal Connector Type: None
External Reference Designator: PS/2 Mouse/Keyboard External Connector Type: PS/2
Port Type: Mouse Port
Handle 0x0005, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: HDMI_DP
Internal Connector Type: None
External Reference Designator: HDMI_DP
External Connector Type: Other
Port Type: Other
Handle 0x0006, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: DVI
Internal Connector Type: None
External Reference Designator: DVI
External Connector Type: Other
Port Type: Other
Handle 0x0007, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: U32G1_34
Internal Connector Type: None
External Reference Designator: U32G1_34
External Connector Type: Access Bus (USB)
Port Type: USB
Handle 0x0008, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: LAN_U32G1_12 Internal Connector Type: None External Reference Designator: LAN_U32G1_12 External Connector Type: RJ-45
Port Type: Network Port
Handle 0x0009, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: AUDIO
Internal Connector Type: None
External Reference Designator: AUDIO
External Connector Type: Other
Port Type: Audio Port
Handle 0x000A, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: CPU_FAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x000B, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: CPU_OPT Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x000C, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: CHA_FAN1 Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x000D, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: CHA_FAN2 Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x000E, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: RGB_HEADER1 Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x000F, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: RGB_HEADER2 Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0010, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: ADD_GEN2 Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0011, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: COM Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0012, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: AAFP Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0013, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: PANEL Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0014, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: COM_DEBUG Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None
Port Type: Other
Handle 0x0015, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: USB78 Internal Connector Type: Access Bus (USB) External Reference Designator: Not Specified External Connector Type: None
Port Type: USB
Handle 0x0016, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: USB_E12 Internal Connector Type: Access Bus (USB) External Reference Designator: Not Specified External Connector Type: None
Port Type: USB
Handle 0x0017, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: U32G1_56 Internal Connector Type: Access Bus (USB) External Reference Designator: Not Specified External Connector Type: None
Port Type: USB
Handle 0x0018, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_1 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x0019, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_2 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001A, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_3 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001B, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_4 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001C, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_5 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001D, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: SATA6G_6 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001E, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: M.2_1(SOCKET3) Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x001F, DMI type 8, 9 bytes
Port Connector Information
Internal Reference Designator: M.2_2(SOCKET3) Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None
Port Type: SATA
Handle 0x0020, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_1
Type: x16 PCI Express
Current Usage: In Use
Length: Long
ID: 0
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:01:01.0
Handle 0x0021, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX1
Type: x1 PCI Express
Current Usage: In Use
Length: Short
ID: 1
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:02:0d.4
Handle 0x0022, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_2
Type: x16 PCI Express
Current Usage: Available
Length: Long
ID: 2
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:ff:0e.0
Handle 0x0023, DMI type 10, 6 bytes
On Board Device Information
Type: Video
Status: Enabled
Description: To Be Filled By O.E.M.
Handle 0x0024, DMI type 11, 5 bytes
OEM Strings
String 1: Default string
String 2: Default string
String 3: MARYLAND
String 4: Default string
String 5: Default string
String 6: Default string
String 7: Default string
String 8: Default string
Handle 0x0025, DMI type 12, 5 bytes
System Configuration Options
Option 1: Default string
Handle 0x0026, DMI type 32, 20 bytes
System Boot Information
Status: No errors detected
Handle 0x0027, DMI type 34, 11 bytes
Management Device
Description: Nuvoton NCT6798D Type: LM78 Address: 0x00000000 Address Type: I/O Port
Handle 0x0028, DMI type 26, 22 bytes
Voltage Probe
Description: LM78A
Location: Motherboard
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x0029, DMI type 36, 16 bytes
Management Device Threshold Data
Lower Non-critical Threshold: 1
Upper Non-critical Threshold: 2
Lower Critical Threshold: 3
Upper Critical Threshold: 4
Lower Non-recoverable Threshold: 5
Upper Non-recoverable Threshold: 6
Handle 0x002A, DMI type 35, 11 bytes
Management Device Component
Description: Default string Management Device Handle: 0x0027 Component Handle: 0x0028 Threshold Handle: 0x0029
Handle 0x002B, DMI type 28, 22 bytes
Temperature Probe
Description: LM78A
Location: Motherboard
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x002C, DMI type 36, 16 bytes
Management Device Threshold Data
Lower Non-critical Threshold: 1
Upper Non-critical Threshold: 2
Lower Critical Threshold: 3
Upper Critical Threshold: 4
Lower Non-recoverable Threshold: 5
Upper Non-recoverable Threshold: 6
Handle 0x002D, DMI type 35, 11 bytes
Management Device Component
Description: Default string Management Device Handle: 0x0027 Component Handle: 0x002B Threshold Handle: 0x002C
Handle 0x002E, DMI type 27, 15 bytes
Cooling Device
Temperature Probe Handle: 0x002B
Type: Power Supply Fan
Status: OK
Cooling Unit Group: 1
OEM-specific Information: 0x00000000
Nominal Speed: Unknown Or Non-rotating
Description: Cooling Dev 1
Handle 0x002F, DMI type 36, 16 bytes
Management Device Threshold Data
Lower Non-critical Threshold: 1
Upper Non-critical Threshold: 2
Lower Critical Threshold: 3
Upper Critical Threshold: 4
Lower Non-recoverable Threshold: 5
Upper Non-recoverable Threshold: 6
Handle 0x0030, DMI type 35, 11 bytes
Management Device Component
Description: Default string Management Device Handle: 0x0027 Component Handle: 0x002E Threshold Handle: 0x002F
Handle 0x0031, DMI type 27, 15 bytes
Cooling Device
Temperature Probe Handle: 0x002B
Type: Power Supply Fan
Status: OK
Cooling Unit Group: 1
OEM-specific Information: 0x00000000
Nominal Speed: Unknown Or Non-rotating
Description: Not Specified
Handle 0x0032, DMI type 36, 16 bytes
Management Device Threshold Data
Lower Non-critical Threshold: 1
Upper Non-critical Threshold: 2
Lower Critical Threshold: 3
Upper Critical Threshold: 4
Lower Non-recoverable Threshold: 5
Upper Non-recoverable Threshold: 6
Handle 0x0033, DMI type 35, 11 bytes
Management Device Component
Description: Default string Management Device Handle: 0x0027 Component Handle: 0x0031 Threshold Handle: 0x0032
Handle 0x0034, DMI type 29, 22 bytes
Electrical Current Probe
Description: ABC
Location: Motherboard
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x0035, DMI type 36, 16 bytes
Management Device Threshold Data
Handle 0x0036, DMI type 35, 11 bytes
Management Device Component
Description: Default string Management Device Handle: 0x0027 Component Handle: 0x0034 Threshold Handle: 0x0035
Handle 0x0037, DMI type 26, 22 bytes
Voltage Probe
Description: LM78A
Location: Power Unit
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x0038, DMI type 28, 22 bytes
Temperature Probe
Description: LM78A
Location: Power Unit
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x0039, DMI type 27, 15 bytes
Cooling Device
Temperature Probe Handle: 0x0038
Type: Power Supply Fan
Status: OK
Cooling Unit Group: 1
OEM-specific Information: 0x00000000
Nominal Speed: Unknown Or Non-rotating
Description: Cooling Dev 1
Handle 0x003A, DMI type 29, 22 bytes
Electrical Current Probe
Description: ABC
Location: Power Unit
Status: OK
Maximum Value: Unknown
Minimum Value: Unknown
Resolution: Unknown
Tolerance: Unknown
Accuracy: Unknown
OEM-specific Information: 0x00000000
Nominal Value: Unknown
Handle 0x003B, DMI type 39, 22 bytes System Power Supply
Power Unit Group: 1
Location: To Be Filled By O.E.M.
Name: To Be Filled By O.E.M.
Manufacturer: To Be Filled By O.E.M. Serial Number: To Be Filled By O.E.M. Asset Tag: To Be Filled By O.E.M. Model Part Number: To Be Filled By O.E.M.
Revision: To Be Filled By O.E.M. Max Power Capacity: Unknown
Status: Present, OK
Type: Switching
Input Voltage Range Switching: Auto-switch
Plugged: Yes
Hot Replaceable: No
Input Voltage Probe Handle: 0x0037 Cooling Device Handle: 0x0039 Input Current Probe Handle: 0x003A
Handle 0x003C, DMI type 40, 50 bytes
Additional Information 1
Referenced Handle: 0x0023 Referenced Offset: 0x01 String: To Be Filled By O.E.M. 1 Value: 0x00000000 Additional Information 2 Referenced Handle: 0x0001 Referenced Offset: 0x0f String: Not Specified Value: 0x0000001e Additional Information 3 Referenced Handle: 0x004e Referenced Offset: 0x01 String: Not Specified Value: 0x00000000 Additional Information 4 Referenced Handle: 0x0001 Referenced Offset: 0x1a String: PRODUCT_LINE Value: 0x00000000 Additional Information 5 Referenced Handle: 0x0001 Referenced Offset: 0x19 String: PRODUCT_SKU Value: 0x00000003
Handle 0x003D, DMI type 43, 31 bytes
TPM Device
Vendor ID: INTC
Specification Version: 2.0
Firmware Revision: 500.16
Description: INTEL
Characteristics:
Family configurable via platform software support
OEM-specific Information: 0x00000000
Handle 0x003E, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 64 GB
Error Information Handle: Not Provided
Number Of Devices: 4
Handle 0x003F, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x003E
Error Information Handle: Not Provided Total Width: 64 bits
Data Width: 64 bits
Size: 8 GB
Form Factor: DIMM
Set: None
Locator: ChannelA-DIMM1
Bank Locator: BANK 0
Type: DDR4
Type Detail: Synchronous
Speed: 2666 MT/s
Manufacturer: Kingston
Serial Number: E4BC807B
Asset Tag: 9876543210
Part Number: KHX2666C16/8G
Rank: 1
Configured Memory Speed: 2666 MT/s
Minimum Voltage: 1.2 V
Maximum Voltage: 1.2 V
Configured Voltage: 1.2 V
Memory Technology: DRAM
Memory Operating Mode Capability: Volatile memory Firmware Version: Not Specified
Module Manufacturer ID: Bank 2, Hex 0x98 Module Product ID: Unknown
Memory Subsystem Controller Manufacturer ID: Unknown Memory Subsystem Controller Product ID: Unknown Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
Handle 0x0040, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x003E
Error Information Handle: Not Provided Total Width: 64 bits
Data Width: 64 bits
Size: 8 GB
Form Factor: DIMM
Set: None
Locator: ChannelA-DIMM2
Bank Locator: BANK 1
Type: DDR4
Type Detail: Synchronous
Speed: 2666 MT/s
Manufacturer: Kingston
Serial Number: B8BC7B2E
Asset Tag: 9876543210
Part Number: KHX2666C16/8G
Rank: 1
Configured Memory Speed: 2666 MT/s
Minimum Voltage: 1.2 V
Maximum Voltage: 1.2 V
Configured Voltage: 1.2 V
Memory Technology: DRAM
Memory Operating Mode Capability: Volatile memory Firmware Version: Not Specified
Module Manufacturer ID: Bank 2, Hex 0x98 Module Product ID: Unknown
Memory Subsystem Controller Manufacturer ID: Unknown Memory Subsystem Controller Product ID: Unknown Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
Handle 0x0041, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x003E
Error Information Handle: Not Provided Total Width: 64 bits
Data Width: 64 bits
Size: 8 GB
Form Factor: DIMM
Set: None
Locator: ChannelB-DIMM1
Bank Locator: BANK 2
Type: DDR4
Type Detail: Synchronous
Speed: 2666 MT/s
Manufacturer: Kingston
Serial Number: BABC7B1E
Asset Tag: 9876543210
Part Number: KHX2666C16/8G
Rank: 1
Configured Memory Speed: 2666 MT/s
Minimum Voltage: 1.2 V
Maximum Voltage: 1.2 V
Configured Voltage: 1.2 V
Memory Technology: DRAM
Memory Operating Mode Capability: Volatile memory Firmware Version: Not Specified
Module Manufacturer ID: Bank 2, Hex 0x98 Module Product ID: Unknown
Memory Subsystem Controller Manufacturer ID: Unknown Memory Subsystem Controller Product ID: Unknown Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
Handle 0x0042, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x003E
Error Information Handle: Not Provided Total Width: 64 bits
Data Width: 64 bits
Size: 8 GB
Form Factor: DIMM
Set: None
Locator: ChannelB-DIMM2
Bank Locator: BANK 3
Type: DDR4
Type Detail: Synchronous
Speed: 2666 MT/s
Manufacturer: Kingston
Serial Number: E1BC7BE3
Asset Tag: 9876543210
Part Number: KHX2666C16/8G
Rank: 1
Configured Memory Speed: 2666 MT/s
Minimum Voltage: 1.2 V
Maximum Voltage: 1.2 V
Configured Voltage: 1.2 V
Memory Technology: DRAM
Memory Operating Mode Capability: Volatile memory Firmware Version: Not Specified
Module Manufacturer ID: Bank 2, Hex 0x98 Module Product ID: Unknown
Memory Subsystem Controller Manufacturer ID: Unknown Memory Subsystem Controller Product ID: Unknown Non-Volatile Size: None
Volatile Size: 8 GB
Cache Size: None
Logical Size: None
Handle 0x0043, DMI type 19, 31 bytes
Memory Array Mapped Address
Starting Address: 0x00000000000 Ending Address: 0x007FFFFFFFF Range Size: 32 GB Physical Array Handle: 0x003E Partition Width: 4
Handle 0x0044, DMI type 20, 35 bytes
Memory Device Mapped Address
Starting Address: 0x00000000000 Ending Address: 0x001FFFFFFFF Range Size: 8 GB Physical Device Handle: 0x003F Memory Array Mapped Address Handle: 0x0043 Partition Row Position: Unknown Interleave Position: 1 Interleaved Data Depth: 2
Handle 0x0045, DMI type 20, 35 bytes
Memory Device Mapped Address
Starting Address: 0x00400000000 Ending Address: 0x005FFFFFFFF Range Size: 8 GB Physical Device Handle: 0x0040 Memory Array Mapped Address Handle: 0x0043 Partition Row Position: Unknown Interleave Position: 1 Interleaved Data Depth: 2
Handle 0x0046, DMI type 20, 35 bytes
Memory Device Mapped Address
Starting Address: 0x00200000000 Ending Address: 0x003FFFFFFFF Range Size: 8 GB Physical Device Handle: 0x0041 Memory Array Mapped Address Handle: 0x0043 Partition Row Position: Unknown Interleave Position: 2 Interleaved Data Depth: 2
Handle 0x0047, DMI type 20, 35 bytes
Memory Device Mapped Address
Starting Address: 0x00600000000 Ending Address: 0x007FFFFFFFF Range Size: 8 GB Physical Device Handle: 0x0042 Memory Array Mapped Address Handle: 0x0043 Partition Row Position: Unknown Interleave Position: 2 Interleaved Data Depth: 2
Handle 0x0048, DMI type 221, 26 bytes
OEM-specific Type
Header and Data:
DD 1A 48 00 03 01 00 09 00 30 50 00 02 00 00 00 00 E2 00 03 00 FF FF FF FF FF
Strings:
Reference Code - CPU
uCode Version
TXT ACM version
Handle 0x0049, DMI type 221, 26 bytes
OEM-specific Type
Header and Data:
DD 1A 49 00 03 01 00 09 00 30 50 00 02 00 00 00 00 00 00 03 04 0E 05 19 CD 04
Strings:
Reference Code - ME
MEBx version
ME Firmware Version
Consumer SKU
Handle 0x004A, DMI type 221, 47 bytes
OEM-specific Type
Header and Data:
DD 2F 4A 00 06 01 00 09 00 30 50 00 02 03 FF FF FF FF FF 04 00 FF FF FF 00 00 05 00 FF FF FF 00 00 06 00 FF FF FF FF FF 07 00 0B 00 00 00 00
Strings:
Re.erence Code - CML PCH
PCH-CRID Status
Disabled
PCH-CRID Original Value
PCH-CRID New Value
OPROM - RST - RAID
CMLV PCH H Ax Hsio Version
Handle 0x004B, DMI type 221, 54 bytes
OEM-specific Type
Header and Data:
DD 36 4B 00 07 01 00 09 00 30 50 00 02 00 00 00 00 45 00 03 00 09 00 30 50 00 04 05 FF FF FF FF FF 06 00 00 00 00 05 00 07 00 00 00 00 05 00 08 00 FF FF FF FF FF
Strings:
Reference Code - SA - System Agent Reference Code - MRC
SA - PCIe Version
SA-CRID Status
Disabled
SA-CRID Original Value
SA-CRID New Value
OPROM - VBIOS
Handle 0x004C, DMI type 221, 12 bytes OEM-specific Type
Header and Data:
DD 0C 4C 00 01 01 00 04 00 00 00 00
Strings:
FSP Binary Version
Handle 0x004D, DMI type 7, 27 bytes
Cache Information
Socket Designation: L1 Cache
Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back
Location: Internal
Installed Size: 512 kB
Maximum Size: 512 kB
Supported SRAM Types:
Synchronous
Installed SRAM Type: Synchronous
Speed: Unknown
Error Correction Type: Parity
System Type: Unified
Associativity: 8-way Set-associative
Handle 0x004E, DMI type 7, 27 bytes
Cache Information
Socket Designation: L2 Cache
Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back
Location: Internal
Installed Size: 2 MB
Maximum Size: 2 MB
Supported SRAM Types:
Synchronous
Installed SRAM Type: Synchronous
Speed: Unknown
Error Correction Type: Single-bit ECC System Type: Unified
Associativity: 4-way Set-associative
Handle 0x004F, DMI type 7, 27 bytes
Cache Information
Socket Designation: L3 Cache
Configuration: Enabled, Not Socketed, Level 3 Operational Mode: Write Back
Location: Internal
Installed Size: 16 MB
Maximum Size: 16 MB
Supported SRAM Types:
Synchronous
Installed SRAM Type: Synchronous
Speed: Unknown
Error Correction Type: Multi-bit ECC System Type: Unified
Associativity: 16-way Set-associative
Handle 0x0050, DMI type 4, 48 bytes
Processor Information
Socket Designation: LGA1200
Type: Central Processor
Family: Core i7
Manufacturer: Intel(R) Corporation
ID: 55 06 0A 00 FF FB EB BF
Signature: Type 0, Family 6, Model 165, Stepping 5 Flags:
FPU (Floating-point unit on-chip)
VME (Virtual mode extension)
DE (Debugging extension)
PSE (Page size extension)
TSC (Time stamp counter)
MSR (Model specific registers)
PAE (Physical address extension)
MCE (Machine check exception)
CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call)
MTRR (Memory type range registers) PGE (Page global enable)
MCA (Machine check architecture)
CMOV (Conditional move instruction supported) PAT (Page attribute table)
PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store)
ACPI (ACPI supported)
MMX (MMX technology supported)
FXSR (FXSAVE and FXSTOR instructions supported) SSE (Streaming SIMD extensions)
SSE2 (Streaming SIMD extensions 2)
SS (Self-snoop)
HTT (Multi-threading)
TM (Thermal monitor supported)
PBE (Pending break enabled)
Version: Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
Voltage: 0.9 V
External Clock: 100 MHz
Max Speed: 8300 MHz
Current Speed: 2871 MHz
Status: Populated, Enabled
Upgrade: Other
L1 Cache Handle: 0x004D
L2 Cache Handle: 0x004E
L3 Cache Handle: 0x004F
Serial Number: To Be Filled By O.E.M.
Asset Tag: To Be Filled By O.E.M.
Part Number: To Be Filled By O.E.M.
Core Count: 8
Core Enabled: 8
Thread Count: 16
Characteristics:
64-bit capable
Multi-Core
Hardware Thread
Execute Protection
Enhanced Virtualization Power/Performance Control
Handle 0x0051, DMI type 131, 64 bytes
OEM-specific Type
Header and Data: 83 40 51 00 31 00 00 00 00 00 00 00 00 00 00 00 F8 00 C8 A3 00 00 00 00 01 00 00 00 05 00 0E 00 CD 04 19 00 00 00 00 00 FE 00 55 0D 00 00 00 00 00 00 00 00 22 00 00 00 76 50 72 6F 00 00 00 00
Handle 0x0052, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 1
Bus Address: 0000:00:00.0
Handle 0x0053, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 2
Bus Address: 0000:00:14.0
Handle 0x0054, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 3
Bus Address: 0000:00:16.0
Handle 0x0055, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - SATA
Type: SATA Controller
Status: Enabled
Type Instance: 1
Bus Address: 0000:00:17.0
Handle 0x0056, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 4
Bus Address: 0000:00:1f.0
Handle 0x0057, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 5
Bus Address: 0000:00:1f.2
Handle 0x0058, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Sound
Type: Sound
Status: Enabled
Type Instance: 1
Bus Address: 0000:00:1f.3
Handle 0x0059, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Other
Type: Other
Status: Enabled
Type Instance: 6
Bus Address: 0000:00:1f.4
Handle 0x005A, DMI type 41, 11 bytes
Onboard Device
Reference Designation: Onboard - Ethernet
Type: Ethernet
Status: Enabled
Type Instance: 1
Bus Address: 0000:00:1f.6
Handle 0x005B, DMI type 221, 89 bytes
OEM-specific Type
Header and Data:
DD 59 5B 00 0C 01 00 00 00 00 A6 00 02 00 FF FF FF FF FF 03 04 FF FF FF FF FF 05 06 FF FF FF FF FF 07 08 FF FF FF FF FF 09 00 00 00 00 00 00 0A 00 FF FF FF FF FF 0B 00 FF FF 00 00 00 0C 00 FF FF FF FF FF 0D 00 FF FF FF FF FF 0E 00 00 07 00 00 00 0F 00 00 02 00 0F 00
Strings:
Lan Phy Version
Sensor Firmware Version
Debug Mode Status
Disabled
Performance Mode Status
Disabled
Debug Use USB(Disabled:Serial) Disabled
ICC Overclocking Version
UNDI Version
EC FW Version
GOP Version
Royal Park Version
Platform Version
Client Silicon Version
Handle 0x005C, DMI type 14, 8 bytes
Group Associations
Name: $MEI Items: 1 0x0000 (OEM-specific)
Handle 0x005D, DMI type 219, 106 bytes
OEM-specific Type
Header and Data: DB 6A 5D 00 01 04 01 45 02 00 90 06 01 10 82 20 00 00 00 00 48 08 00 00 00 00 00 00 00 00 40 02 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 03 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Strings: MEI1 MEI2 MEI3 MEI4
Handle 0x005E, DMI type 136, 6 bytes
OEM-specific Type
Header and Data: 88 06 5E 00 00 00
Handle 0x005F, DMI type 14, 23 bytes
Group Associations
Name: Firmware Version Info Items: 6 0x0048 (OEM-specific) 0x0049 (OEM-specific) 0x004A (OEM-specific) 0x004B (OEM-specific) 0x004C (OEM-specific) 0x005B (OEM-specific)
Handle 0x0060, DMI type 13, 22 bytes
BIOS Language Information
Language Description Format: Long Installable Languages: 9 en|US|iso8859-1 fr|FR|iso8859-1 zh|TW|unicode zh|CN|unicode ja|JP|unicode de|DE|iso8859-1 es|ES|iso8859-1 ru|RU|iso8859-5 ko|KR|unicode Currently Installed Language: en|US|iso8859-1
Handle 0x0061, DMI type 127, 4 bytes
End Of Table
/*
* Intel ACPI Component Architecture
* AML/ASL+ Disassembler version 20220331 (64-bit version)
* Copyright (c) 2000 - 2022 Intel Corporation
*
* Disassembly of TPM2, Sun Feb 25 00:28:48 2024
*
* ACPI Data Table [TPM2]
*
* Format: [HexOffset DecimalOffset ByteLength] FieldName : FieldValue (in hex) */
[000h 0000 4] Signature : "TPM2" [Trusted Platform Module hardware interface Table] [004h 0004 4] Table Length : 0000004C [008h 0008 1] Revision : 04 [009h 0009 1] Checksum : DA [00Ah 0010 6] Oem ID : "ALASKA" [010h 0016 8] Oem Table ID : "A M I " [018h 0024 4] Oem Revision : 00000001 [01Ch 0028 4] Asl Compiler ID : "AMI " [020h 0032 4] Asl Compiler Revision : 00000000
[024h 0036 2] Platform Class : 0000 [026h 0038 2] Reserved : 0000 [028h 0040 8] Control Address : 00000000FED40040 [030h 0048 4] Start Method : 07 [Command Response Buffer]
[034h 0052 12] Method Parameters : 00 00 00 00 00 00 00 00 00 00 00 00
[040h 0064 4] Minimum Log Length : 00010000
[044h 0068 8] Log Address : 000000008E3FF000
Raw Table Data: Length 76 (0x4C)
0000: 54 50 4D 32 4C 00 00 00 04 DA 41 4C 41 53 4B 41 // TPM2L.....ALASKA
0010: 41 20 4D 20 49 20 00 00 01 00 00 00 41 4D 49 20 // A M I ......AMI
0020: 00 00 00 00 00 00 00 00 40 00 D4 FE 00 00 00 00 // ........@.......
0030: 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // ................
0040: 00 00 01 00 00 F0 3F 8E 00 00 00 00 // ......?.....processor : 0vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.080
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
apicid : 0
initial apicid : 0
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 1vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.020
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 1
cpu cores : 8
apicid : 2
initial apicid : 2
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 2vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.000
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 2
cpu cores : 8
apicid : 4
initial apicid : 4
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 3vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.091
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 3
cpu cores : 8
apicid : 6
initial apicid : 6
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 4vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.225
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 4
cpu cores : 8
apicid : 8
initial apicid : 8
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 5vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.216
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 5
cpu cores : 8
apicid : 10
initial apicid : 10
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 6vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.076
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 6
cpu cores : 8
apicid : 12
initial apicid : 12
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 7vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.000
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 7
cpu cores : 8
apicid : 14
initial apicid : 14
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 8vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.000
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
apicid : 1
initial apicid : 1
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 9vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.049
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 1
cpu cores : 8
apicid : 3
initial apicid : 3
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 10vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.000
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 2
cpu cores : 8
apicid : 5
initial apicid : 5
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 11vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.264
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 3
cpu cores : 8
apicid : 7
initial apicid : 7
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 12vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.027
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 4
cpu cores : 8
apicid : 9
initial apicid : 9
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 13vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 799.998
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 5
cpu cores : 8
apicid : 11
initial apicid : 11
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 14vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 799.990
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 6
cpu cores : 8
apicid : 13
initial apicid : 13
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
processor : 15vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
stepping : 5
microcode : 0xf8
cpu MHz : 800.002
cache size : 16384 KB
physical id : 0
siblings : 16
core id : 7
cpu cores : 8
apicid : 15
initial apicid : 15
fpu : yesfpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi pku ospke sgx_lc md_clear flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed eibrs_pbrsb gds
bogomips : 5799.77
clflush size : 64cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
Re: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Hi Jarkko,
I have an update here. I would like you to check if it makes sense before I submit a patch.
The problem might be related to the chip itself which leaves the idle state whenever the locality is relinquished.
I probed the chip while operating and noted that the TPM_CRB_CTRL_STS_0.tpmIdle bit (located at regs_t->ctrl_sts on crb_priv structure in tpm_crb.c) is always cleared whenever the locality is relinquished.
The result is that this chip never becomes idle since after going idle the locality is relinquished (tpm_chip_stop function in tpm-chip.c).
I patched the 7.8.0 kernel for bypassing the tpm_relinquish_locality call and so far the PC is suspending and power off normally, TPM_CRB_CTRL_STS_0.tpmIdle remains set whenever the device is not used now.
I believe this is related to this specific chip, if the fix remains working for 2 weeks I will submit the patch. Please advise me if it makes sense.
Best regards,
Adam
Em qua., 13 de mar. de 2024 às 14:02, Adam Alves <[email protected]> escreveu:
Quoted 325 lines
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Quoted 4 lines
The lacking information here is the CPU model (
/proc/cpuinfo), on which kernel version the bug was produced and what kind of TPM the system has (discrete chip or firmware TPM should be easy to check from BIOS).CPU model: Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz I am attaching data from
/proc/cpuinfoTPM: No info on mainboard documentation regarding TPM. BIOS is not clear whether or not it is discrete or firmware. Based on dmidecode (attached) I get the following:
TPM Device
Vendor ID: INTC
Specification Version: 2.0
Firmware Revision: 500.16
Description: INTEL
Characteristics:
Family configurable via platform software support
OEM-specific Information:0x00000000
I also extractedTPM_CRB_INTF_ID_0from the TPM:a13a808600084311(Vendor ID 8086, Device ID a13a, Revision ID 00). The only match I found while browsing for this device ID is 100 Series/C230 Series Chipset Family MEI Controller #1, which is a PCI device, so it might not be related to the TPM.The driver bound to the tpm0 device is
tpm_crb. The disassembled TPM2 ACPI table is also attached in case it helps.The bug was reproduced from upstream kernel version 6.8.0 (attached build .config that I used).
Quoted 2 lines
Also, which firmwre version you have and have you tested with the most up to date firmware (BIOS)?
I have the most updated firmware provided by ASUS: TUF GAMING B460M-PLUS BIOS 1601
Quoted 2 lines
What is "the ACPI command"? Refer to concrete items instead of asking to guess what you is the ACPI command for you.
I enabled
ACPI_DEBUGon my kernel to know where the it was actually hanging. The last function is actually the last function that should be called by the kernel for a successful shutdown:
hwsleep-0078hw_legacy_sleep: Entering sleep state [S5]^M
hwregs-0460hw_write_pm1_control: ----Entry^M hwvalid-0097hw_validate_io_request: ----Entry^M hwvalid-0111hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^M
hwregs-0360hw_write: Wrote: 0000000000001C01 width 16
to 0000000000001804 (SystemIO)^M
hwregs-0473hw_write_pm1_control: ----Exit- AE_OK^M hwregs-0460hw_write_pm1_control: ----Entry^M hwvalid-0097hw_validate_io_request: ----Entry^M hwvalid-0111hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^MIt is writing both
SLP_TYP+SLP_ENto ACPIPM1b_CNTregisters (as expected by specification). I checked the flags and it is in line with the flags required by the system ACPI tables.I understand from that that the system is hanging after ACPI firmware takes over. The same issue happens if I force a EFI shutdown.
Since the the BUG has appeared again even with the fix implemented, I am holding this patch for now until I find a solution that permanently fixes the issue. The next time I try to submit a patch that will comply with all your suggestions, thank you very much.
I would appreciate if you had any hint on how I could keep digging to find the issue that might be causing this bug. This is an issue that only happens when I shutdown from Linux and my TPM is activated in BIOS. That's why my guess is that this is what should be causing it. From Windows, shutdown is always flawless.
Best regards,
AdamQuoted 224 lines
Quoted 5 lines
chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
We don't speculate about the root cause here, only document it. Please move this paragraph before diffstat (see below)>
Quoted 10 lines
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call
dmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.Please describe what the *kernel command-line" (for clarity sake) semantically means.
Also please remove anything about diangnosing. We care only about fixes.
Quoted 6 lines
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
This neither documents the default value. I'm also lost did setting this "1" or "0" fix the issue in your case?
So: firmware version and being up-to-date is important and also this needs to be reproduciable with the mainline Linux tree, not distro kernel or custom kernel.
Quoted 4 lines
---
<cover letter>
OK, I'll try to check what is done here but please re-read "describing your changes" before sending next version:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
Quoted 13 lines
v1->v2: fix formatting issues and simplifiedtpm_chip_stopcode.drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)drivers/char/tpm/tpm-chip.c +0
-0drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 140
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) {The commit message did not explain what this flag is and what is its purpose.
Also why you need to populate global flag inside chip, or the value of it?
Why this is not just:
if (tpm_locality_on_suspend) {?
drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 142
Quoted 2 lines
drivers/char/tpm/tpm-chip.c +2
-0+if (chip->locality !=0 ) +tpm_request_locality (chip);This will unconditionally skip calling
tpm_request_locality()because Linux only uses locality 0. Not sure what good does this make.Quoted 46 lines
drivers/char/tpm/tpm-chip.c +9
-0+return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);drivers/char/tpm/tpm-interface.c +5
-0@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h" @@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases. drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 399
Quoted 10 lines
drivers/char/tpm/tpm-interface.c +10
-0+*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident);Please remove
pr_info(), we do not want to bloat klog.drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 405
Quoted 6 lines
drivers/char/tpm/tpm-interface.c +6
-0+ tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = {The commit message did not introduce this. Also should have inline documentation.
/*
* What the heck this.
*/Quoted 63 lines
drivers/char/tpm/tpm-interface.c +16
-0+ { + .ident = "TUF GAMING B460M-PLUS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_BOARD_NAME, "TUF GAMING B460M-PLUS"), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; + /* * We are about to suspend. Save the TPM state * so that it can be restored.@@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/* @@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );drivers/char/tpm/tpm.h +1
-0@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);include/linux/tpm.h +1
-0@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };Quoted 4 lines
include/linux/tpm.h enum tpm_chip_flags { · line 290
Quoted 1 line
include/linux/tpm.h +0
-0#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)BR, Jarkko
--
Adam Oliveira Alves
Signature · 1 line
Adam Oliveira Alves
Re: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Fixing a typo: I patched the 6.8.0 kernel.
Em qui., 14 de mar. de 2024 às 13:31, Adam Alves <[email protected]> escreveu:
Quoted 360 lines
Hi Jarkko,
I have an update here. I would like you to check if it makes sense before I submit a patch.
The problem might be related to the chip itself which leaves the idle state whenever the locality is relinquished.
I probed the chip while operating and noted that the TPM_CRB_CTRL_STS_0.tpmIdle bit (located at
regs_t->ctrl_stsoncrb_privstructure intpm_crb.c) is always cleared whenever the locality is relinquished.The result is that this chip never becomes idle since after going idle the locality is relinquished (
tpm_chip_stopfunction intpm-chip.c).I patched the 7.8.0 kernel for bypassing the
tpm_relinquish_localitycall and so far the PC is suspending and power off normally, TPM_CRB_CTRL_STS_0.tpmIdle remains set whenever the device is not used now.I believe this is related to this specific chip, if the fix remains working for 2 weeks I will submit the patch. Please advise me if it makes sense.
Best regards,
AdamEm qua., 13 de mar. de 2024 às 14:02, Adam Alves <[email protected]> escreveu:
Quoted 323 lines
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Quoted 4 lines
The lacking information here is the CPU model (
/proc/cpuinfo), on which kernel version the bug was produced and what kind of TPM the system has (discrete chip or firmware TPM should be easy to check from BIOS).CPU model: Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz I am attaching data from
/proc/cpuinfoTPM: No info on mainboard documentation regarding TPM. BIOS is not clear whether or not it is discrete or firmware. Based on dmidecode (attached) I get the following:
TPM Device
Vendor ID: INTC
Specification Version: 2.0
Firmware Revision: 500.16
Description: INTEL
Characteristics:
Family configurable via platform software support
OEM-specific Information:0x00000000
I also extractedTPM_CRB_INTF_ID_0from the TPM:a13a808600084311(Vendor ID 8086, Device ID a13a, Revision ID 00). The only match I found while browsing for this device ID is 100 Series/C230 Series Chipset Family MEI Controller #1, which is a PCI device, so it might not be related to the TPM.The driver bound to the tpm0 device is
tpm_crb. The disassembled TPM2 ACPI table is also attached in case it helps.The bug was reproduced from upstream kernel version 6.8.0 (attached build .config that I used).
Quoted 2 lines
Also, which firmwre version you have and have you tested with the most up to date firmware (BIOS)?
I have the most updated firmware provided by ASUS: TUF GAMING B460M-PLUS BIOS 1601
Quoted 2 lines
What is "the ACPI command"? Refer to concrete items instead of asking to guess what you is the ACPI command for you.
I enabled
ACPI_DEBUGon my kernel to know where the it was actually hanging. The last function is actually the last function that should be called by the kernel for a successful shutdown:
hwsleep-0078hw_legacy_sleep: Entering sleep state [S5]^M
hwregs-0460hw_write_pm1_control: ----Entry^M hwvalid-0097hw_validate_io_request: ----Entry^M hwvalid-0111hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^M
hwregs-0360hw_write: Wrote: 0000000000001C01 width 16
to 0000000000001804 (SystemIO)^M
hwregs-0473hw_write_pm1_control: ----Exit- AE_OK^M hwregs-0460hw_write_pm1_control: ----Entry^M hwvalid-0097hw_validate_io_request: ----Entry^M hwvalid-0111hw_validate_io_request: Address 0000000000001804 LastAddress 0000000000001805 Length 2 hwvalid-0128hw_validate_io_request: ----Exit- AE_OK^MIt is writing both
SLP_TYP+SLP_ENto ACPIPM1b_CNTregisters (as expected by specification). I checked the flags and it is in line with the flags required by the system ACPI tables.I understand from that that the system is hanging after ACPI firmware takes over. The same issue happens if I force a EFI shutdown.
Since the the BUG has appeared again even with the fix implemented, I am holding this patch for now until I find a solution that permanently fixes the issue. The next time I try to submit a patch that will comply with all your suggestions, thank you very much.
I would appreciate if you had any hint on how I could keep digging to find the issue that might be causing this bug. This is an issue that only happens when I shutdown from Linux and my TPM is activated in BIOS. That's why my guess is that this is what should be causing it. From Windows, shutdown is always flawless.
Best regards,
AdamQuoted 224 lines
Quoted 5 lines
chip expecting it to be in Locality 0 as expected by TCG PC Client Platform Firmware Profile Version 1.06 Revision 52 (3.1.1 – Pre-OS Environment) and then when it fails to do so it simply halts the whole system.
We don't speculate about the root cause here, only document it. Please move this paragraph before diffstat (see below)>
Quoted 10 lines
Enable a user to configure the kernel through “tpm.locality_on_suspend=1” boot parameter so that the locality is set before suspend/shutdown in order to diagnose whether or not the board is one of the buggy ones that require this workaround. Since this bug is related to the board/platform instead of the specific TPM chip, call
dmi_check_systemon thetpm_initfunction so that this setting is automatically enabled for boards specified in code (ASUS TUF GAMING B460M-PLUS already included) – automatic configuration only works in caseCONFIG_DMIis set though, sincedmi_check_systemis a non-op whenCONFIG_DMIis not set.Please describe what the *kernel command-line" (for clarity sake) semantically means.
Also please remove anything about diangnosing. We care only about fixes.
Quoted 6 lines
In case “tpm.locality_on_suspend=0” (the default) don't change any behavior thus preserving current functionality of any other board except ASUSTeK COMPUTER INC. TUF GAMING B460M-PLUS and possibly future boards as we successfully diagnose other boards with the same issue fixed by using “tpm.locality_on_suspend=1”.
This neither documents the default value. I'm also lost did setting this "1" or "0" fix the issue in your case?
So: firmware version and being up-to-date is important and also this needs to be reproduciable with the mainline Linux tree, not distro kernel or custom kernel.
Quoted 4 lines
---
<cover letter>
OK, I'll try to check what is done here but please re-read "describing your changes" before sending next version:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
Quoted 13 lines
v1->v2: fix formatting issues and simplifiedtpm_chip_stopcode.drivers/char/tpm/tpm-chip.c | 12 +++++++++++ drivers/char/tpm/tpm-interface.c | 37 ++++++++++++++++++++++++++++++++ drivers/char/tpm/tpm.h | 1 + include/linux/tpm.h | 1 + 4 files changed, 51 insertions(+)drivers/char/tpm/tpm-chip.c +0
-0drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 140
Quoted 4 lines
drivers/char/tpm/tpm-chip.c +1
-0@@ -137,6 +137,12 @@ EXPORT_SYMBOL_GPL(tpm_chip_start);*/ void tpm_chip_stop (struct tpm_chip *chip) { +if (chip->flags &TPM_CHIP_FLAG_PRESERVE_LOCALITY ) {The commit message did not explain what this flag is and what is its purpose.
Also why you need to populate global flag inside chip, or the value of it?
Why this is not just:
if (tpm_locality_on_suspend) {?
drivers/char/tpm/tpm-chip.c EXPORT_SYMBOL_GPL(tpm_chip_start); · line 142
Quoted 2 lines
drivers/char/tpm/tpm-chip.c +2
-0+if (chip->locality !=0 ) +tpm_request_locality (chip);This will unconditionally skip calling
tpm_request_locality()because Linux only uses locality 0. Not sure what good does this make.Quoted 46 lines
drivers/char/tpm/tpm-chip.c +9
-0+return ; + } +tpm_go_idle (chip);tpm_relinquish_locality (chip);tpm_clk_disable (chip);@@ -291,6 +297,9 @@ int tpm_class_shutdown(struct device *dev) { struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +down_write (&chip->ops_sem);if (chip->flags &TPM_CHIP_FLAG_TPM2 ) {if (!tpm_chip_start (chip)) {@@ -668,6 +677,9 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);drivers/char/tpm/tpm-interface.c +5
-0@@ -26,6 +26,7 @@#include <linux/suspend.h> #include <linux/freezer.h> #include <linux/tpm_eventlog.h> +#include <linux/dmi.h> #include "tpm.h" @@ -382,6 +383,36 @@ int tpm_auto_startup(struct tpm_chip *chip)return rc; } +/* +* Bug workaround - some boards expect the TPM to be on Locality 0 +* before suspend/shutdown, halting the system otherwise before +* suspend and shutdown. Change suspend behavior for these cases. drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 399
Quoted 10 lines
drivers/char/tpm/tpm-interface.c +10
-0+*/ +bool tpm_locality_on_suspend; +module_param_named (locality_on_suspend, tpm_locality_on_suspend, bool,0644 ); +MODULE_PARM_DESC (locality_on_suspend, +"Put TPM at locality 0 before suspend/shutdown." ); + +static int __init tpm_set_locality_on_suspend (const struct dmi_system_id *system_id) +{ +pr_info ("Board %s: TPM locality preserved before suspend/shutdown.\n" , + system_id->ident);Please remove
pr_info(), we do not want to bloat klog.drivers/char/tpm/tpm-interface.c int tpm_auto_startup(struct tpm_chip *chip) · line 405
Quoted 6 lines
drivers/char/tpm/tpm-interface.c +6
-0+ tpm_locality_on_suspend = true; + +return 0 ; +} + +static const struct dmi_system_id tpm_board_quirks[]__initconst = {The commit message did not introduce this. Also should have inline documentation.
/*
* What the heck this.
*/Quoted 63 lines
drivers/char/tpm/tpm-interface.c +16
-0+ { + .ident = "TUF GAMING B460M-PLUS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_BOARD_NAME, "TUF GAMING B460M-PLUS"), + }, + .callback = tpm_set_locality_on_suspend, + }, +}; + /* * We are about to suspend. Save the TPM state * so that it can be restored.@@ -394,6 +425,9 @@ int tpm_pm_suspend(struct device *dev)if (!chip)return -ENODEV ; +if (tpm_locality_on_suspend) + chip->flags |=TPM_CHIP_FLAG_PRESERVE_LOCALITY ; +if (chip->flags &TPM_CHIP_FLAG_ALWAYS_POWERED ) goto suspended;@@ -431,6 +465,7 @@ int tpm_pm_resume(struct device *dev)if (chip ==NULL )return -ENODEV ; + chip->flags &= ~TPM_CHIP_FLAG_PRESERVE_LOCALITY ; chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED ;/* @@ -476,6 +511,8 @@ static int __init tpm_init(void) {int rc; +dmi_check_system (tpm_board_quirks); + rc =class_register (&tpm_class);if (rc) {pr_err ("couldn't create tpm class\n" );drivers/char/tpm/tpm.h +1
-0@@ -236,6 +236,7 @@ extern dev_t tpm_devt;extern const struct file_operations tpm_fops;extern const struct file_operations tpmrm_fops;extern struct idr dev_nums_idr; +extern bool tpm_locality_on_suspend;ssize_t tpm_transmit (struct tpm_chip *chip,u8 *buf,size_t bufsiz);int tpm_get_timeouts (struct tpm_chip *);include/linux/tpm.h +1
-0@@ -284,6 +284,7 @@ enum tpm_chip_flags {TPM_CHIP_FLAG_FIRMWARE_UPGRADE =BIT (7 ),TPM_CHIP_FLAG_SUSPENDED =BIT (8 ),TPM_CHIP_FLAG_HWRNG_DISABLED =BIT (9 ), + TPM_CHIP_FLAG_PRESERVE_LOCALITY = BIT(10), };Quoted 4 lines
include/linux/tpm.h enum tpm_chip_flags { · line 290
Quoted 1 line
include/linux/tpm.h +0
-0#define to_tpm_chip (d) container_of(d, struct tpm_chip, dev)BR, Jarkko
Quoted 2 lines
--
Adam Oliveira Alves--
Adam Oliveira Alves
Signature · 1 line
Adam Oliveira Alves
Jarkko Sakkinen
maintainerRe: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
In reply to Adam AlvesQuoted 7 lines · Adam Alves
Hi Jarkko,
I have an update here. I would like you to check if it makes sense before I submit a patch.
The problem might be related to the chip itself which leaves the idle state whenever the locality is relinquished.
There's no real discrete chip. It is a TPM living in the firmware, namely management engine.
So first thing to check would be to update the BIOS entirely.
Quoted 7 lines
I probed the chip while operating and noted that the TPM_CRB_CTRL_STS_0.tpmIdle bit (located at
regs_t->ctrl_stsoncrb_privstructure intpm_crb.c) is always cleared whenever the locality is relinquished.The result is that this chip never becomes idle since after going idle the locality is relinquished (
tpm_chip_stopfunction intpm-chip.c).
This can be verified as tpm_crb does print "goIdle timed out" if it does not go to idle. Should be visible in klog.
BR, Jarkko
Jarkko Sakkinen
maintainerRe: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
In reply to Adam AlvesQuoted 11 lines · Adam Alves
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Thanks I'll definitely check these in detail.
Any possible bug fix (if we decide to fix anything) is tpm_crb.c including possible kernel command-line parameters or whatever. The current proposal affects all the possible pieces of TPM hardware so in all cases it is unacceptable.
Do you have dmesg/journactl transcript? Did you try to update the firmware?
BR, Jarkko
Jarkko Sakkinen
maintainerRe: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Quoted 15 lines · Jarkko Sakkinen
Quoted 11 lines · Adam Alves
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Thanks I'll definitely check these in detail.
Quoted 7 lines
Any possible bug fix (if we decide to fix anything) is
tpm_crb.cincluding possible kernel command-line parameters or whatever. The current proposal affects all the possible pieces of TPM hardware so in all cases it is unacceptable.Do you have dmesg/journactl transcript? Did you try to update the firmware?
OK so I do have ASUS motherboard and my TPM2 ACPI table is almost the same match but:
BIOS Information
Vendor: American Megatrends Inc.
Version: 2212
Release Date: 12/13/2022
Address: 0xF0000
Runtime Size: 64 kB
ROM Size: 24 MB
Where as in you dmidecode.txt:
Handle 0x0000, DMI type 0, 26 bytes
BIOS Information
Vendor: American Megatrends Inc. Version: 1601 Release Date: 02/11/2022 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 16 MB
So at least the BIOS version is older. Can you update BIOS and see if that could possibly fix the issue?
Make sure that it contains update for both BIOS and Management Engine.
BR, Jarkko
Jarkko Sakkinen
maintainerRe: [PATCH v2] tpm: Fix suspend/shutdown on some boards by preserving chip Locality
Quoted 46 lines · Jarkko Sakkinen
Quoted 15 lines · Jarkko Sakkinen
Quoted 11 lines · Adam Alves
Hi Jarkko,
Thank you very much for kindly reviewing this proposal.
After one week without any issues with my PC hanging, it happened again. It seems that the fix I am proposing is not final (it only reduced the frequency since it always happened when I shutdown after couple hours of power up time and now it only happened after two weeks with a similar usage rate).
I will share with you the data you requested below.
Thanks I'll definitely check these in detail.
Quoted 7 lines
Any possible bug fix (if we decide to fix anything) is
tpm_crb.cincluding possible kernel command-line parameters or whatever. The current proposal affects all the possible pieces of TPM hardware so in all cases it is unacceptable.Do you have dmesg/journactl transcript? Did you try to update the firmware?
OK so I do have ASUS motherboard and my TPM2 ACPI table is almost the same match but:
BIOS Information
Vendor: American Megatrends Inc.
Version: 2212
Release Date: 12/13/2022
Address:0xF0000
Runtime Size: 64 kB
ROM Size: 24 MBWhere as in you dmidecode.txt:
Handle
0x0000, DMI type 0, 26 bytes
BIOS InformationVendor: American Megatrends Inc. Version: 1601 Release Date: 02/11/2022 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 16 MB
Quoted 4 lines
So at least the BIOS version is older. Can you update BIOS and see if that could possibly fix the issue?
Make sure that it contains update for both BIOS and Management Engine.
AND if you end up still proposing any fix please make sure that it only changes tpm_crb.c so that there is something to analyze. Sprinkled arbitrary changes are not something we can really not say much.
If you don't know exactly what you are fixing and why please try to keep the fix local to the issue. But yeah, BIOS update is really the first trial here.
BR, Jarkko