coreboot-kgpe-d16/src/mainboard/lenovo/l520
Evgeny Zinoviev 833e9bad47 sb/intel/bd82x6x: Support ME Soft Temporary Disable Mode
- Add support for ME Soft Temporary Disable Mode. In this mode, ME
  doesn't load its kernel and freezes at Bring UP (BUP) phase. This mode
  is saved in ME NVRAM (and thus will remain for next reboots and
  poweroffs).

- Add support of new CMOS option for Sandy Bridge and Ivy Bridge
  ThinkPads.

HOW TO USE

To disable ME:
1. nvramtool -w me_state=Disabled
2. reboot

To enable it back:
1. nvramtool -w me_state=Normal
2. reboot

To check current status:
intelmetool -m

Tested on ThinkPad X230 and ThinkPad X220.

BACKGROUND

There's no Intel documentation that would explain how this should be
implemented, in public. Working binary sequence for MKHI command to put
ME in Soft Temporary Disable Mode, as well as a way to bring ME out of
it (by writing to H_GS register), was found and published by researchers
from PT Security:

1.  To disable ME, BIOS issues the disable command (before End of Post)
    and reboots. ME is supposed to be disabled on the next boot after
    DID (DRAM Init Done).

    My numerous tests show that issuing the command and rebooting is not
    enough. If we reboot too early, ME will not be disabled. Apparently,
    it is doing something in background after receiving the command. It
    works with a delay of 500-1000 ms.

    I also tried to dump all known (documented) registers, such as GMES
    and HFS, before and during the next 2 seconds after execution of the
    disable command to find a possible indication that something's
    changed in ME and we're ready to reboot. Found nothing
    unfortunately.

2.  To enable ME back, host writes value 0x20000000 to H_GS.

    PT slides don't contain any more information on it, but my tests
    show, that after writing this value, GMES[31:28] is changing from
    0x01 (BUP phase) to 0x03 (Policy Module) to 0x06 (Host
    Communication). Then, after some more time, fw_init_complete bit of
    HFS becomes 1.

    This means that ME starts loading its kernel immediately, without
    reboot.

    On the other hand, Lenovo BIOS clearly perform a reboot after
    enabling it (one reboot after saving the settings, then ThinkPad
    logo appears, and then one more reboot). I'm assuming we have to
    reset too.

Change-Id: Ic01526c9731cbef4e8552bbc352133a2415787c2
Signed-off-by: Evgeny Zinoviev <me@ch1p.io>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/37115
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Nico Huber <nico.h@gmx.de>
2021-02-07 23:06:52 +00:00
..
acpi mb/lenovo/l520: Convert to ASL 2.0 syntax 2021-01-24 21:42:32 +00:00
acpi_tables.c ACPI: Select ACPI_SOC_NVS only where suitable 2021-01-18 07:21:34 +00:00
board_info.txt
cmos.default sb/intel/bd82x6x: Support ME Soft Temporary Disable Mode 2021-02-07 23:06:52 +00:00
cmos.layout sb/intel/bd82x6x: Support ME Soft Temporary Disable Mode 2021-02-07 23:06:52 +00:00
devicetree.cb cpu/intel/model_206ax: Rename cX_acpower options 2021-01-06 16:51:30 +00:00
dsdt.asl ACPI: Add top-level ASL 2021-01-27 15:35:13 +00:00
early_init.c
gma-mainboard.ads
gpio.c
hda_verb.c
Kconfig
Kconfig.name
mainboard.c
Makefile.inc arch/x86: Use wildcard for mb/smihandler.c 2021-01-24 21:06:22 +00:00
smihandler.c mb/lenovo: Prepend EC event number with 0x to denote hex notation 2020-07-26 21:40:16 +00:00