<p>Nico Huber has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25513">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: sb/intel/bd82x6x/me: Try implementing HMRFPO message<br><br>Change-Id: I2664fc66a55b3b5cb8997114a8622a47181dd911<br>---<br>M src/mainboard/lenovo/t420/cmos.layout<br>M src/mainboard/lenovo/t420/devicetree.cb<br>M src/southbridge/intel/bd82x6x/me.c<br>M src/southbridge/intel/bd82x6x/me.h<br>M src/southbridge/intel/bd82x6x/me_8.x.c<br>5 files changed, 170 insertions(+), 48 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/13/25513/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/mainboard/lenovo/t420/cmos.layout b/src/mainboard/lenovo/t420/cmos.layout</span><br><span>index 5a9e570..da1afb4 100644</span><br><span>--- a/src/mainboard/lenovo/t420/cmos.layout</span><br><span>+++ b/src/mainboard/lenovo/t420/cmos.layout</span><br><span>@@ -74,6 +74,8 @@</span><br><span> # coreboot config options: cpu</span><br><span> #424          8       r       0        unused</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+424          1       e       1        request_hmrfpo</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # coreboot config options: northbridge</span><br><span> 432          3       e       11       gfx_uma_size</span><br><span> 435          2        e       12       hybrid_graphics_mode</span><br><span>diff --git a/src/mainboard/lenovo/t420/devicetree.cb b/src/mainboard/lenovo/t420/devicetree.cb</span><br><span>index bed406a..fe05a50 100644</span><br><span>--- a/src/mainboard/lenovo/t420/devicetree.cb</span><br><span>+++ b/src/mainboard/lenovo/t420/devicetree.cb</span><br><span>@@ -76,7 +76,7 @@</span><br><span>                     register "spi_uvscc" = "0x2005"</span><br><span>                  register "spi_lvscc" = "0x2005"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                 device pci 16.0 off end # Management Engine Interface 1</span><br><span style="color: hsl(120, 100%, 40%);">+                       device pci 16.0 on end # Management Engine Interface 1</span><br><span>                       device pci 16.1 off end # Management Engine Interface 2</span><br><span>                      device pci 16.2 off end # Management Engine IDE-R</span><br><span>                    device pci 16.3 off end # Management Engine KT</span><br><span>diff --git a/src/southbridge/intel/bd82x6x/me.c b/src/southbridge/intel/bd82x6x/me.c</span><br><span>index a5c5e52..1b88a3d 100644</span><br><span>--- a/src/southbridge/intel/bd82x6x/me.c</span><br><span>+++ b/src/southbridge/intel/bd82x6x/me.c</span><br><span>@@ -27,6 +27,7 @@</span><br><span> #include <console/console.h></span><br><span> #include <device/pci_ids.h></span><br><span> #include <device/pci_def.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <pc80/mc146818rtc.h></span><br><span> #include <string.h></span><br><span> #include <delay.h></span><br><span> #include <elog.h></span><br><span>@@ -458,39 +459,6 @@</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if IS_ENABLED(CONFIG_CHROMEOS) && 0 /* DISABLED */</span><br><span style="color: hsl(0, 100%, 40%);">-/* Tell ME to issue a global reset */</span><br><span style="color: hsl(0, 100%, 40%);">-int mkhi_global_reset(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct me_global_reset reset = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .request_origin = GLOBAL_RESET_BIOS_POST,</span><br><span style="color: hsl(0, 100%, 40%);">-               .reset_type     = CBM_RR_GLOBAL_RESET,</span><br><span style="color: hsl(0, 100%, 40%);">-  };</span><br><span style="color: hsl(0, 100%, 40%);">-      struct mkhi_header mkhi = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .group_id       = MKHI_GROUP_ID_CBM,</span><br><span style="color: hsl(0, 100%, 40%);">-            .command        = MKHI_GLOBAL_RESET,</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-      struct mei_header mei = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .is_complete    = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-            .length         = sizeof(mkhi) + sizeof(reset),</span><br><span style="color: hsl(0, 100%, 40%);">-         .host_address   = MEI_HOST_ADDRESS,</span><br><span style="color: hsl(0, 100%, 40%);">-             .client_address = MEI_ADDRESS_MKHI,</span><br><span style="color: hsl(0, 100%, 40%);">-     };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      printk(BIOS_NOTICE, "ME: Requesting global reset\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send request and wait for response */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (mei_sendrecv(&mei, &mkhi, &reset, NULL, 0) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            /* No response means reset will happen shortly... */</span><br><span style="color: hsl(0, 100%, 40%);">-            halt();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* If the ME responded it rejected the reset request */</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "ME: Global Reset failed\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #ifdef __SMM__</span><br><span> static void intel_me7_finalize_smm(void)</span><br><span> {</span><br><span>@@ -543,6 +511,75 @@</span><br><span> }</span><br><span> #else /* !__SMM__ */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int mkhi_hmrfpo_enable(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  u64 send = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              u64 unknown;</span><br><span style="color: hsl(120, 100%, 40%);">+          u32 status;</span><br><span style="color: hsl(120, 100%, 40%);">+   } receive;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mkhi_header mkhi = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .group_id       = MKHI_GROUP_ID_HMRFPO,</span><br><span style="color: hsl(120, 100%, 40%);">+               .command        = MKHI_HMRFPO_ENABLE,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mei_header mei = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .is_complete    = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+          .length         = sizeof(mkhi) + sizeof(send),</span><br><span style="color: hsl(120, 100%, 40%);">+                .host_address   = MEI_HOST_ADDRESS,</span><br><span style="color: hsl(120, 100%, 40%);">+           .client_address = MEI_ADDRESS_MKHI,</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send request and wait for response */</span><br><span style="color: hsl(120, 100%, 40%);">+      printk(BIOS_NOTICE, "ME: %s\n", __FUNCTION__);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (mei_sendrecv(&mei, &mkhi, &send, &receive, sizeof(receive)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printk(BIOS_ERR, "ME: HMRFPO ENABLE message failed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (receive.status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printk(BIOS_ERR, "ME: HMRFPO ENABLE returned with error\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int mkhi_hmrfpo_disable(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Tell ME to issue a global reset */</span><br><span style="color: hsl(120, 100%, 40%);">+static int mkhi_global_reset(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct me_global_reset reset = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .request_origin = GLOBAL_RESET_BIOS_POST,</span><br><span style="color: hsl(120, 100%, 40%);">+             .reset_type     = CBM_RR_GLOBAL_RESET,</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mkhi_header mkhi = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .group_id       = MKHI_GROUP_ID_CBM,</span><br><span style="color: hsl(120, 100%, 40%);">+          .command        = MKHI_GLOBAL_RESET,</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mei_header mei = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .is_complete    = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+          .length         = sizeof(mkhi) + sizeof(reset),</span><br><span style="color: hsl(120, 100%, 40%);">+               .host_address   = MEI_HOST_ADDRESS,</span><br><span style="color: hsl(120, 100%, 40%);">+           .client_address = MEI_ADDRESS_MKHI,</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printk(BIOS_NOTICE, "ME: Requesting global reset\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Send request and wait for response */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (mei_sendrecv(&mei, &mkhi, &reset, NULL, 0) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* No response means reset will happen shortly... */</span><br><span style="color: hsl(120, 100%, 40%);">+          halt();</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* If the ME responded it rejected the reset request */</span><br><span style="color: hsl(120, 100%, 40%);">+       printk(BIOS_ERR, "ME: Global Reset failed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Determine the path that we should take based on ME status */</span><br><span> static me_bios_path intel_me_path(device_t dev)</span><br><span> {</span><br><span>@@ -697,6 +734,9 @@</span><br><span> /* Check whether ME is present and do basic init */</span><br><span> static void intel_me_init(device_t dev)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       u8 request_hmrfpo = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct me_hfs hfs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         me_bios_path path = intel_me_path(dev);</span><br><span> </span><br><span>  /* Do initial setup and determine the BIOS path */</span><br><span>@@ -716,6 +756,17 @@</span><br><span>            if (intel_mei_setup(dev) < 0)</span><br><span>                     break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            /* Unlock ME if requested. */</span><br><span style="color: hsl(120, 100%, 40%);">+         get_option(&request_hmrfpo, "request_hmrfpo");</span><br><span style="color: hsl(120, 100%, 40%);">+          if (request_hmrfpo) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Unlock ME flash region */</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (mkhi_hmrfpo_enable() == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* Issue global reset */</span><br><span style="color: hsl(120, 100%, 40%);">+                              mkhi_global_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+                          return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL >= BIOS_DEBUG)</span><br><span>                /* Print ME firmware version */</span><br><span>              mkhi_get_fw_version();</span><br><span>@@ -729,9 +780,22 @@</span><br><span>                 */</span><br><span>          break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    case ME_DISABLE_BIOS_PATH:</span><br><span style="color: hsl(120, 100%, 40%);">+            pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (hfs.operation_mode == ME_HFS_MODE_OVER_MEI) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     mkhi_hmrfpo_disable();</span><br><span style="color: hsl(120, 100%, 40%);">+                        get_option(&request_hmrfpo, "request_hmrfpo");</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (request_hmrfpo) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         request_hmrfpo = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                           set_option("request_hmrfpo", &request_hmrfpo);</span><br><span style="color: hsl(120, 100%, 40%);">+                  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              mkhi_global_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     case ME_ERROR_BIOS_PATH:</span><br><span>     case ME_RECOVERY_BIOS_PATH:</span><br><span style="color: hsl(0, 100%, 40%);">-     case ME_DISABLE_BIOS_PATH:</span><br><span>   case ME_FIRMWARE_UPDATE_BIOS_PATH:</span><br><span>           break;</span><br><span>       }</span><br><span>diff --git a/src/southbridge/intel/bd82x6x/me.h b/src/southbridge/intel/bd82x6x/me.h</span><br><span>index f95a0b4..0f68d6a 100644</span><br><span>--- a/src/southbridge/intel/bd82x6x/me.h</span><br><span>+++ b/src/southbridge/intel/bd82x6x/me.h</span><br><span>@@ -181,6 +181,7 @@</span><br><span> </span><br><span> #define MKHI_GROUP_ID_CBM   0x00</span><br><span> #define MKHI_GROUP_ID_FWCAPS    0x03</span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_GROUP_ID_HMRFPO      0x05</span><br><span> #define MKHI_GROUP_ID_MDES      0x08</span><br><span> #define MKHI_GROUP_ID_GEN       0xff</span><br><span> </span><br><span>@@ -188,6 +189,10 @@</span><br><span> </span><br><span> #define MKHI_FWCAPS_GET_RULE     0x02</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_HMRFPO_ENABLE    0x01</span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_HMRFPO_LOCK  0x02</span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_HMRFPO_DISABLE       0x04</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define MKHI_MDES_ENABLE      0x09</span><br><span> </span><br><span> #define MKHI_GET_FW_VERSION 0x02</span><br><span>diff --git a/src/southbridge/intel/bd82x6x/me_8.x.c b/src/southbridge/intel/bd82x6x/me_8.x.c</span><br><span>index 6463f96..1e040d2 100644</span><br><span>--- a/src/southbridge/intel/bd82x6x/me_8.x.c</span><br><span>+++ b/src/southbridge/intel/bd82x6x/me_8.x.c</span><br><span>@@ -27,6 +27,7 @@</span><br><span> #include <console/console.h></span><br><span> #include <device/pci_ids.h></span><br><span> #include <device/pci_def.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <pc80/mc146818rtc.h></span><br><span> #include <string.h></span><br><span> #include <delay.h></span><br><span> #include <elog.h></span><br><span>@@ -425,7 +426,45 @@</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if IS_ENABLED(CONFIG_CHROMEOS) && 0 /* DISABLED */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __SMM__</span><br><span style="color: hsl(120, 100%, 40%);">+static int mkhi_hmrfpo_enable(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  u64 send = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              u64 unknown;</span><br><span style="color: hsl(120, 100%, 40%);">+          u32 status;</span><br><span style="color: hsl(120, 100%, 40%);">+   } receive;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mkhi_header mkhi = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .group_id       = MKHI_GROUP_ID_HMRFPO,</span><br><span style="color: hsl(120, 100%, 40%);">+               .command        = MKHI_HMRFPO_ENABLE,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mei_header mei = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .is_complete    = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+          .length         = sizeof(mkhi) + sizeof(send),</span><br><span style="color: hsl(120, 100%, 40%);">+                .host_address   = MEI_HOST_ADDRESS,</span><br><span style="color: hsl(120, 100%, 40%);">+           .client_address = MEI_ADDRESS_MKHI,</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send request and wait for response */</span><br><span style="color: hsl(120, 100%, 40%);">+      printk(BIOS_NOTICE, "ME: %s\n", __FUNCTION__);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (mei_sendrecv(&mei, &mkhi, &send, &receive, sizeof(receive)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printk(BIOS_ERR, "ME: HMRFPO ENABLE message failed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (receive.status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printk(BIOS_ERR, "ME: HMRFPO ENABLE returned with error\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int mkhi_hmrfpo_disable(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Tell ME to issue a global reset */</span><br><span> static int mkhi_global_reset(void)</span><br><span> {</span><br><span>@@ -686,6 +725,8 @@</span><br><span> {</span><br><span>       me_bios_path path = intel_me_path(dev);</span><br><span>      me_bios_payload mbp_data;</span><br><span style="color: hsl(120, 100%, 40%);">+     u8 request_hmrfpo = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct me_hfs hfs;</span><br><span> </span><br><span>       /* Do initial setup and determine the BIOS path */</span><br><span>   printk(BIOS_NOTICE, "ME: BIOS path: %s\n", me_bios_path_values[path]);</span><br><span>@@ -707,19 +748,16 @@</span><br><span>             if (intel_me_read_mbp(&mbp_data))</span><br><span>                        break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if IS_ENABLED(CONFIG_CHROMEOS) && 0 /* DISABLED */</span><br><span style="color: hsl(0, 100%, 40%);">-           /*</span><br><span style="color: hsl(0, 100%, 40%);">-               * Unlock ME in recovery mode.</span><br><span style="color: hsl(0, 100%, 40%);">-           */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (vboot_recovery_mode_enabled()) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Unlock ME if requested. */</span><br><span style="color: hsl(120, 100%, 40%);">+         get_option(&request_hmrfpo, "request_hmrfpo");</span><br><span style="color: hsl(120, 100%, 40%);">+          if (request_hmrfpo) {</span><br><span>                        /* Unlock ME flash region */</span><br><span style="color: hsl(0, 100%, 40%);">-                    mkhi_hmrfpo_enable();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Issue global reset */</span><br><span style="color: hsl(0, 100%, 40%);">-                        mkhi_global_reset();</span><br><span style="color: hsl(0, 100%, 40%);">-                    return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (mkhi_hmrfpo_enable() == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* Issue global reset */</span><br><span style="color: hsl(120, 100%, 40%);">+                              mkhi_global_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+                          return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> #if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL >= BIOS_DEBUG)</span><br><span>                me_print_fw_version(&mbp_data.fw_version_name);</span><br><span>@@ -732,9 +770,22 @@</span><br><span>            */</span><br><span>          break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    case ME_DISABLE_BIOS_PATH:</span><br><span style="color: hsl(120, 100%, 40%);">+            pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (hfs.operation_mode == ME_HFS_MODE_OVER_MEI) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     mkhi_hmrfpo_disable();</span><br><span style="color: hsl(120, 100%, 40%);">+                        get_option(&request_hmrfpo, "request_hmrfpo");</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (request_hmrfpo) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         request_hmrfpo = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                           set_option("request_hmrfpo", &request_hmrfpo);</span><br><span style="color: hsl(120, 100%, 40%);">+                  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              mkhi_global_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     case ME_ERROR_BIOS_PATH:</span><br><span>     case ME_RECOVERY_BIOS_PATH:</span><br><span style="color: hsl(0, 100%, 40%);">-     case ME_DISABLE_BIOS_PATH:</span><br><span>   case ME_FIRMWARE_UPDATE_BIOS_PATH:</span><br><span>           break;</span><br><span>       }</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25513">change 25513</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/25513"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2664fc66a55b3b5cb8997114a8622a47181dd911 </div>
<div style="display:none"> Gerrit-Change-Number: 25513 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nico Huber <nico.h@gmx.de> </div>