<p>Martin Roth has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/20677">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">amd/XX/hudson: Remove #if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br><br>- Every platform except bettong had its own static version of<br>oem_fan_control, so remove the definition of oem_fan_control from imc.h,<br>and move it out of imc.c into bettong's BiosCallOuts.c.<br>- Move the fchec.h files, which do not seem mainboard specific out of<br>the mainboard directories into the southbridge/soc directories.<br>- Remove the unnecessary #if from around the #include "imc.h".<br>- Turn #if statements into if().<br>- imb-a180 had the whole fan control section commented out. Remove it.<br><br>Change-Id: Idd271c6ab618aa4badf81c702212e7de35317021<br>Signed-off-by: Martin Roth <martinroth@google.com><br>---<br>M src/mainboard/amd/bettong/BiosCallOuts.c<br>M src/mainboard/amd/db-ft3b-lc/BiosCallOuts.c<br>M src/mainboard/amd/lamar/BiosCallOuts.c<br>M src/mainboard/amd/olivehill/BiosCallOuts.c<br>M src/mainboard/amd/olivehillplus/BiosCallOuts.c<br>M src/mainboard/amd/parmer/BiosCallOuts.c<br>M src/mainboard/amd/thatcher/BiosCallOuts.c<br>M src/mainboard/asrock/imb-a180/BiosCallOuts.c<br>M src/mainboard/bap/ode_e20XX/BiosCallOuts.c<br>M src/mainboard/bap/ode_e21XX/BiosCallOuts.c<br>M src/mainboard/gizmosphere/gizmo2/BiosCallOuts.c<br>M src/mainboard/hp/pavilion_m6_1035dx/BiosCallOuts.c<br>M src/mainboard/lenovo/g505s/BiosCallOuts.c<br>M src/mainboard/pcengines/apu2/BiosCallOuts.c<br>R src/soc/amd/stoneyridge/include/fchec.h<br>M src/southbridge/amd/agesa/hudson/hudson.c<br>R src/southbridge/amd/pi/hudson/fchec.h<br>M src/southbridge/amd/pi/hudson/hudson.c<br>M src/southbridge/amd/pi/hudson/imc.c<br>M src/southbridge/amd/pi/hudson/imc.h<br>20 files changed, 847 insertions(+), 1,035 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/77/20677/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/mainboard/amd/bettong/BiosCallOuts.c b/src/mainboard/amd/bettong/BiosCallOuts.c<br>index a2bd36d..0a4944d 100644<br>--- a/src/mainboard/amd/bettong/BiosCallOuts.c<br>+++ b/src/mainboard/amd/bettong/BiosCallOuts.c<br>@@ -23,9 +23,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> #include "northbridge/amd/pi/dimmSpd.h"<br>@@ -54,6 +52,25 @@<br>         {64, Function1, FCH_GPIO_PULL_UP_ENABLE | FCH_GPIO_OUTPUT_VALUE | FCH_GPIO_OUTPUT_ENABLE | DrvStrengthSel_12mA},<br>      {-1}<br> };<br>+<br>+/* Bettong Hardware Monitor Fan Control<br>+ * Hardware limitation:<br>+ *  HWM will fail to read the input temperature via I2C if other<br>+ *  software switches the I2C address.  AMD recommends using IMC<br>+ *  to control fans, instead of HWM.<br>+ */<br>+static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br>+{<br>+     /* Enable IMC fan control. the recommand way */<br>+      imc_reg_init();<br>+<br>+   FchParams->Imc.ImcEnable = TRUE;<br>+  FchParams->Hwm.HwmControl = 1; /* 1 IMC, 0 HWM */<br>+ FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC, 1 enable IMC, 0 following hw strap setting */<br>+<br>+ LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+}<br>+<br> /**<br>  * Fch Oem setting callback<br>  *<br>@@ -74,16 +91,16 @@<br>    } else if (StdHeader->Func == AMD_INIT_ENV) {<br>              FCH_DATA_BLOCK *FchParams_env = (FCH_DATA_BLOCK *)FchData;<br>            printk(BIOS_DEBUG, "Fch OEM config in INIT ENV ");<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM))<br>                oem_fan_control(FchParams_env);<br>-#endif<br> <br>           /* XHCI configuration */<br>-#if IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE)<br>-         FchParams_env->Usb.Xhci0Enable = TRUE;<br>-#else<br>-            FchParams_env->Usb.Xhci0Enable = FALSE;<br>-#endif<br>+          if (IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE))<br>+                   FchParams_env->Usb.Xhci0Enable = TRUE;<br>+            else<br>+                 FchParams_env->Usb.Xhci0Enable = FALSE;<br>+<br>                 FchParams_env->Usb.Xhci1Enable = FALSE;<br>            FchParams_env->Usb.USB30PortInit = 8; /* 8: If USB3 port is unremoveable. */<br> <br>diff --git a/src/mainboard/amd/db-ft3b-lc/BiosCallOuts.c b/src/mainboard/amd/db-ft3b-lc/BiosCallOuts.c<br>index f992ece..1560226 100644<br>--- a/src/mainboard/amd/db-ft3b-lc/BiosCallOuts.c<br>+++ b/src/mainboard/amd/db-ft3b-lc/BiosCallOuts.c<br>@@ -22,9 +22,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> <br>@@ -140,128 +138,127 @@<br>      LibAmdMemCopy ((VOID *)(FchParams->Hwm.HwmFanControl), &oem_factl, (sizeof (FCH_HWM_FAN_CTR) * 5), FchParams->StdHeader);<br> <br>        /* Enable IMC fan control. the recommended way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+    if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br>+                /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br> <br>-     FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>-        FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+          FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>+                FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-       LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x00;    /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x00;    /* 6 | BIT3 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0;<br>+         /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x00;    /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x00;    /* 6 | BIT3 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 2;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0;<br> <br>-      /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0;       /* AC0 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0;       /* AC1 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0;       /* AC0 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0;       /* AC1 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0;       /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0;       /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0;       /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0x00;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0x00;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0x00;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0x00;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0x00;    /* AL7 percentage */<br>+              /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0;       /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0;       /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0;       /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0x00;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0x00;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0x00;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0x00;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0x00;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /* AC0 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /* AC1 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /* AC0 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /* AC1 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br> <br>-   FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br> <br>-      /* IMC Function */<br>-   FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    /*BIT0 | BIT4 |BIT8; */<br>+           /* IMC Function */<br>+           FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    /*BIT0 | BIT4 |BIT8; */<br> <br>-        /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>-  * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>-     * so we remove it from AGESA code. Please See FchInitLateHwm.<br>-        */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>+          * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>+             * so we remove it from AGESA code. Please See FchInitLateHwm.<br>+                */<br> <br>-#else /* HWM fan control, using the alternative method */<br>-   FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, using the alternative method */<br>+         FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/amd/lamar/BiosCallOuts.c b/src/mainboard/amd/lamar/BiosCallOuts.c<br>index 3a014b0..182cbab 100644<br>--- a/src/mainboard/amd/lamar/BiosCallOuts.c<br>+++ b/src/mainboard/amd/lamar/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> #include <device/azalia.h><br>@@ -155,130 +153,129 @@<br>      LibAmdMemCopy ((VOID *)(FchParams->Hwm.HwmFanControl), &oem_factl, (sizeof(FCH_HWM_FAN_CTR) * 5), FchParams->StdHeader);<br> <br>         /* Enable IMC fan control. the recommended way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+    if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;       /* 0 disable, 1 enable TSI Auto Polling */<br>+                /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;       /* 0 disable, 1 enable TSI Auto Polling */<br> <br>-     FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;    /* 6 | BIT3 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;    /* 6 | BIT3 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /* AC0 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /* AC1 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /* AC2 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /* AC3 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /* AC4 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /* AC5 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /* AC6 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /* critical threshold* in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /* AC0 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /* AC1 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /* AC2 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /* AC3 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /* AC4 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /* AC5 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /* AC6 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /* critical threshold* in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br>+              /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /* AC0 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /* AC1 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /* AC0 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /* AC1 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /* AC2 threshold in Celsius */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /* AC3 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /* AC4 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /* AC5 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /* AC6 threshold in Celsius, 0xFF is not define */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /* AC7 lowest threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /* critical threshold* in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br> <br>-   FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>-  FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     /* BIT0 | BIT2 | BIT5 */<br>+          FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br> <br>-      /* IMC Function */<br>-   FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;/* BIT0 | BIT4 |BIT8 */<br>+               /* IMC Function */<br>+           FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;/* BIT0 | BIT4 |BIT8 */<br> <br>-    /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>-  * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>-     * so we remove it from AGESA code. Please See FchInitLateHwm.<br>-        */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>+          * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>+             * so we remove it from AGESA code. Please See FchInitLateHwm.<br>+                */<br> <br>-#else /* HWM fan control, using the alternative method */<br>-   FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, using the alternative method */<br>+         FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/amd/olivehill/BiosCallOuts.c b/src/mainboard/amd/olivehill/BiosCallOuts.c<br>index 2361c03..e994da6 100644<br>--- a/src/mainboard/amd/olivehill/BiosCallOuts.c<br>+++ b/src/mainboard/amd/olivehill/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include <stdlib.h><br> <br> static AGESA_STATUS Fch_Oem_config(UINT32 Func, UINTN FchData, VOID *ConfigPtr);<br>@@ -109,72 +107,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>        /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/amd/olivehillplus/BiosCallOuts.c b/src/mainboard/amd/olivehillplus/BiosCallOuts.c<br>index 96e3289..5c1f414 100644<br>--- a/src/mainboard/amd/olivehillplus/BiosCallOuts.c<br>+++ b/src/mainboard/amd/olivehillplus/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> <br>@@ -123,128 +121,127 @@<br>      LibAmdMemCopy ((VOID *)(FchParams->Hwm.HwmFanControl), &oem_factl, (sizeof(FCH_HWM_FAN_CTR) * 5), FchParams->StdHeader);<br> <br>         /* Enable IMC fan control. the recommended way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+    if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br>+                /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br> <br>-     FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>-        FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+          FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>+                FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-       LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;    //6 | BIT3;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;    //6 | BIT3;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /*AC0 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /*AC1 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /*AC2 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /*AC3 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /*AC4 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /*AC5 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /*AC6 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /*critical threshold* in Celsius, 0xFF is not define */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /*AC0 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /*AC1 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /*AC2 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /*AC3 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /*AC4 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /*AC5 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /*AC6 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /*critical threshold* in Celsius, 0xFF is not define */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br>+              /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /*AC0 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /*AC1 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /*AC2 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /*AC3 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /*AC4 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /*AC5 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /*AC6 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /*critical threshold* in Celsius, 0xFF is not define */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /*AC0 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /*AC1 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /*AC2 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /*AC3 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /*AC4 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /*AC5 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /*AC6 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /*critical threshold* in Celsius, 0xFF is not define */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br> <br>-   FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /*Zone */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /*Zone */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br> <br>-      /* IMC Function */<br>-   FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    //BIT0 | BIT4 |BIT8;<br>+              /* IMC Function */<br>+           FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    //BIT0 | BIT4 |BIT8;<br> <br>-   /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>-  * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>-     * so we remove it from AGESA code. Please See FchInitLateHwm.<br>-        */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>+          * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>+             * so we remove it from AGESA code. Please See FchInitLateHwm.<br>+                */<br> <br>-#else /* HWM fan control, using the alternative method */<br>-   FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, using the alternative method */<br>+         FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/amd/parmer/BiosCallOuts.c b/src/mainboard/amd/parmer/BiosCallOuts.c<br>index c83e318..227718f 100644<br>--- a/src/mainboard/amd/parmer/BiosCallOuts.c<br>+++ b/src/mainboard/amd/parmer/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include <stdlib.h><br> <br> static AGESA_STATUS Fch_Oem_config(UINT32 Func, UINTN FchData, VOID *ConfigPtr);<br>@@ -109,72 +107,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>    /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/amd/thatcher/BiosCallOuts.c b/src/mainboard/amd/thatcher/BiosCallOuts.c<br>index a6a6279..5da1f08 100644<br>--- a/src/mainboard/amd/thatcher/BiosCallOuts.c<br>+++ b/src/mainboard/amd/thatcher/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include <stdlib.h><br> <br> static AGESA_STATUS Fch_Oem_config(UINT32 Func, UINTN FchData, VOID *ConfigPtr);<br>@@ -109,72 +107,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>    /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/asrock/imb-a180/BiosCallOuts.c b/src/mainboard/asrock/imb-a180/BiosCallOuts.c<br>index 163ae62..e346f1a 100644<br>--- a/src/mainboard/asrock/imb-a180/BiosCallOuts.c<br>+++ b/src/mainboard/asrock/imb-a180/BiosCallOuts.c<br>@@ -144,152 +144,6 @@<br> #define FREQ_14HZ                      0xFE<br> #define FREQ_11HZ                        0xFF<br> <br>-/* imb_a180 Hardware Monitor Fan Control<br>- * Hardware limitation:<br>- *  HWM failed to read the input temperture vi I2C,<br>- *  if other software switch the I2C switch by mistake or intention.<br>- *  We recommend to using IMC to control Fans, instead of HWM.<br>- */<br>-#if 0<br>-static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br>-{<br>-        FCH_HWM_FAN_CTR oem_factl[5] = {<br>-             /* temperature input, fan mode, frequency, low_duty, med_duty, multiplier, lowtemp, medtemp, hightemp, LinearRange, LinearHoldCount */<br>-               /* imb_a180 FanOUT0 Fan header J32 */<br>-                {FAN_INPUT_INTERNAL_DIODE, (FAN_STEPMODE | FAN_POLARITY_HIGH), FREQ_100HZ, 40, 60,  0, 40, 65, 85, 0, 0},<br>-            /* imb_a180 FanOUT1 Fan header J31*/<br>-         {FAN_INPUT_INTERNAL_DIODE, (FAN_STEPMODE | FAN_POLARITY_HIGH), FREQ_100HZ, 40, 60,  0, 40, 65, 85, 0, 0},<br>-            {FAN_INPUT_INTERNAL_DIODE, (FAN_STEPMODE | FAN_POLARITY_HIGH), FREQ_100HZ, 40, 60,  0, 40, 65, 85, 0, 0},<br>-            {FAN_INPUT_INTERNAL_DIODE, (FAN_STEPMODE | FAN_POLARITY_HIGH), FREQ_100HZ, 40, 60,  0, 40, 65, 85, 0, 0},<br>-            {FAN_INPUT_INTERNAL_DIODE, (FAN_STEPMODE | FAN_POLARITY_HIGH), FREQ_100HZ, 40, 60,  0, 40, 65, 85, 0, 0},<br>-    };<br>-   LibAmdMemCopy ((VOID *)(FchParams->Hwm.HwmFanControl), &oem_factl, (sizeof(FCH_HWM_FAN_CTR) * 5), FchParams->StdHeader);<br>-<br>-        /* Enable IMC fan control. the recommand way */<br>-#if defined CONFIG_HUDSON_IMC_FWM && (CONFIG_HUDSON_IMC_FWM == 1)<br>-  /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>-<br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>-<br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>-<br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x00; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x00;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0;    /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0;<br>-<br>-      /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0;///80;      /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0;    /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0;    /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0;    /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0;    /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0;    /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0;    /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0;    /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>-<br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0;    /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0;    /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0;    /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0x00; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0x00; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0x00; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0x00; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0x00; /* AL7 percentage */<br>-<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;//BIT0 | BIT2 | BIT5;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;    /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br>-<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01; /* zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;   /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;    /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;    /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;    /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;    /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;    /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;    /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br>-<br>-   FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01; /*Zone */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;    /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;    /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;    /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00; /* AL7 percentage */<br>-<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;  /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;//BIT0 | BIT2 | BIT5;<br>-  FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;    /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br>-<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;  /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;//BIT0 | BIT2 | BIT5;<br>-  FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;  /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;    /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br>-<br>-      /* IMC Function */<br>-   FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;//BIT0 | BIT4 |BIT8;<br>-<br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>-<br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>-}<br>-#endif<br>-<br> /**<br>  * Fch Oem setting callback<br>  *<br>@@ -313,9 +167,6 @@<br>           /* Azalia Controller OEM Codec Table Pointer */<br>               FchParams_env->Azalia.AzaliaOemCodecTablePtr = (CODEC_TBL_LIST*)CodecTableList;<br>            /* Azalia Controller Front Panel OEM Table Pointer */<br>-<br>-             /* Fan Control */<br>-            //oem_fan_control(FchParams_env);<br> <br>          /* XHCI configuration */<br>              FchParams_env->Usb.Xhci0Enable = IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE);<br>diff --git a/src/mainboard/bap/ode_e20XX/BiosCallOuts.c b/src/mainboard/bap/ode_e20XX/BiosCallOuts.c<br>index e6773b8..716560f 100644<br>--- a/src/mainboard/bap/ode_e20XX/BiosCallOuts.c<br>+++ b/src/mainboard/bap/ode_e20XX/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include <stdlib.h><br> #include <spd_bin.h><br> <br>@@ -111,72 +109,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>  /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 =   50; /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 =   45; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 =   40; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 =   50; /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 =   45; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 =   40; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 =  100; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 =   99; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 =   98; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 =  100; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 =   99; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 =   98; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/bap/ode_e21XX/BiosCallOuts.c b/src/mainboard/bap/ode_e21XX/BiosCallOuts.c<br>index 1a4ed5a..24c847f 100644<br>--- a/src/mainboard/bap/ode_e21XX/BiosCallOuts.c<br>+++ b/src/mainboard/bap/ode_e21XX/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> #include <spd_bin.h><br>@@ -125,128 +123,127 @@<br>    LibAmdMemCopy ((VOID *)(FchParams->Hwm.HwmFanControl), &oem_factl, (sizeof(FCH_HWM_FAN_CTR) * 5), FchParams->StdHeader);<br> <br>         /* Enable IMC fan control. the recommended way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+    if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br>+                /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;               /* 0 disable, 1 enable TSI Auto Polling */<br> <br>-     FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>-        FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+          FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;                          /* 1 IMC, 0 HWM */<br>+                FchParams->Imc.ImcEnableOverWrite = 1;                  /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-       LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;    //6 | BIT3;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d;    //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;    //6 | BIT3;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01;    /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /*AC0 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /*AC1 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /*AC2 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /*AC3 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /*AC4 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /*AC5 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /*AC6 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /*critical threshold* in Celsius, 0xFF is not define */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;    /*AC0 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c;    /*AC1 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32;    /*AC2 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff;    /*AC3 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff;    /*AC4 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff;    /*AC5 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff;    /*AC6 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff;    /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b;    /*critical threshold* in Celsius, 0xFF is not define */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br>+              /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a;    /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46;    /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28;    /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg1 = 0x01;    /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg2 = 0x55;    //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg3 = 0x17;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg6 = 0x90;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone1MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /*AC0 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /*AC1 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /*AC2 threshold in Celsius */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /*AC3 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /*AC4 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /*AC5 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /*AC6 threshold in Celsius, 0xFF is not define */<br>- FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /*critical threshold* in Celsius, 0xFF is not define */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg1 = 0x01;    /* zone */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg2 = 60;      /*AC0 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg3 = 40;      /*AC1 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg4 = 0;       /*AC2 threshold in Celsius */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg5 = 0;       /*AC3 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg6 = 0;       /*AC4 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg7 = 0;       /*AC5 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg8 = 0;       /*AC6 threshold in Celsius, 0xFF is not define */<br>+         FchParams->Imc.EcStruct.MsgFun83Zone1MsgReg9 = 0;       /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegA = 0;       /*critical threshold* in Celsius, 0xFF is not define */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone1MsgRegB = 0x00;<br> <br>-   FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /*Zone */<br>- FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>-      FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg1 = 0x01;    /*Zone */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg2 = 0;       /* AL0 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg3 = 0;       /* AL1 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg4 = 0;       /* AL2 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg5 = 0x00;    /* AL3 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg6 = 0x00;    /* AL4 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg7 = 0x00;    /* AL5 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg8 = 0x00;    /* AL6 percentage */<br>+              FchParams->Imc.EcStruct.MsgFun85Zone1MsgReg9 = 0x00;    /* AL7 percentage */<br> <br>-   FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>- FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg1 = 0x2;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg6 = 0x98;    /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg7 = 2;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg8 = 5;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone2MsgReg9 = 0;<br> <br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>-        FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>-     FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>-       FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>- FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg1 = 0x3;     /* Zone */<br>+                FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg2 = 0x0;     //BIT0 | BIT2 | BIT5;<br>+             FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg3 = 0x0;<br>+               FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg5 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg6 = 0x0;     /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg7 = 0;<br>+         FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg8 = 0;       /* PWM steping rate in unit of PWM level percentage */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone3MsgReg9 = 0;<br> <br>-      /* IMC Function */<br>-   FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    //BIT0 | BIT4 |BIT8;<br>+              /* IMC Function */<br>+           FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x333;    //BIT0 | BIT4 |BIT8;<br> <br>-   /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>-  * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>-     * so we remove it from AGESA code. Please See FchInitLateHwm.<br>-        */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMessage,<br>+          * AGESA put EcDefaultMessage as global data in ROM, so we can't override it.<br>+             * so we remove it from AGESA code. Please See FchInitLateHwm.<br>+                */<br> <br>-#else /* HWM fan control, using the alternative method */<br>-   FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, using the alternative method */<br>+         FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;                /* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/gizmosphere/gizmo2/BiosCallOuts.c b/src/mainboard/gizmosphere/gizmo2/BiosCallOuts.c<br>index b639e96..7163fc6 100644<br>--- a/src/mainboard/gizmosphere/gizmo2/BiosCallOuts.c<br>+++ b/src/mainboard/gizmosphere/gizmo2/BiosCallOuts.c<br>@@ -20,9 +20,7 @@<br> #include "heapManager.h"<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include <stdlib.h><br> <br> static AGESA_STATUS Fch_Oem_config(UINT32 Func, UINTN FchData, VOID *ConfigPtr);<br>@@ -109,72 +107,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>    /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x4e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x04;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x9a; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x01;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 =   50; /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 =   45; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 =   40; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 =   50; /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 =   45; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 =   40; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 =  100; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 =   99; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 =   98; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 =  100; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 =   99; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 =   98; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/hp/pavilion_m6_1035dx/BiosCallOuts.c b/src/mainboard/hp/pavilion_m6_1035dx/BiosCallOuts.c<br>index 87d6eae..7774cfa 100644<br>--- a/src/mainboard/hp/pavilion_m6_1035dx/BiosCallOuts.c<br>+++ b/src/mainboard/hp/pavilion_m6_1035dx/BiosCallOuts.c<br>@@ -105,72 +105,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>   /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+        } else { /* HWM fan control, the way not recommand */<br>+                FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/lenovo/g505s/BiosCallOuts.c b/src/mainboard/lenovo/g505s/BiosCallOuts.c<br>index 87d6eae..61eb494 100644<br>--- a/src/mainboard/lenovo/g505s/BiosCallOuts.c<br>+++ b/src/mainboard/lenovo/g505s/BiosCallOuts.c<br>@@ -105,72 +105,71 @@<br> static void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br> {<br>       /* Enable IMC fan control. the recommand way */<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+      if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br> <br>-  imc_reg_init();<br>+              imc_reg_init();<br> <br>-   /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>-    FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br>+               /* HwMonitorEnable = TRUE &&  HwmFchtsiAutoOpll ==FALSE to call FchECfancontrolservice */<br>+            FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = FALSE;/* 0 disable, 1 enable TSI Auto Polling */<br> <br>-    FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>-   FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br>+           FchParams->Imc.ImcEnable = TRUE;<br>+          FchParams->Hwm.HwmControl = 1;       /* 1 IMC, 0 HWM */<br>+           FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC , 1 enable IMC, 0 following hw strap setting */<br> <br>-        LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>+                LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br> <br>-     /* Thermal Zone Parameter */<br>- FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>-        FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>-   FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>-    FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>-      FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>-       FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br>+              /* Thermal Zone Parameter */<br>+         FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg2 = 0x3d; //BIT0 | BIT2 | BIT5;<br>+                FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg3 = 0x0e;//6 | BIT3;<br>+           FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg4 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg5 = 0x54;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg6 = 0x98; /* SMBUS Address for SMBUS based temperature sensor such as SB-TSI and ADM1032 */<br>+            FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg7 = 0x02;<br>+              FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg8 = 0x01; /* PWM steping rate in unit of PWM level percentage */<br>+               FchParams->Imc.EcStruct.MsgFun81Zone0MsgReg9 = 0x00;<br> <br>-   /* IMC Fan Policy temperature thresholds */<br>-  FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>-        FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>-    FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>-     FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>-      FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br>+              /* IMC Fan Policy temperature thresholds */<br>+          FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg2 = 0x46;///80;   /*AC0 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg3 = 0x3c; /*AC1 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg4 = 0x32; /*AC2 threshold in Celsius */<br>+                FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg5 = 0xff; /*AC3 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg6 = 0xff; /*AC4 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg7 = 0xff; /*AC5 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg8 = 0xff; /*AC6 threshold in Celsius, 0xFF is not define */<br>+            FchParams->Imc.EcStruct.MsgFun83Zone0MsgReg9 = 0xff; /*AC7 lowest threshold in Celsius, 0xFF is not define */<br>+             FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegA = 0x4b; /*critical threshold* in Celsius, 0xFF is not define */<br>+              FchParams->Imc.EcStruct.MsgFun83Zone0MsgRegB = 0x00;<br> <br>-   /* IMC Fan Policy PWM Settings */<br>-    FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>-      FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>-   FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>- FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br>+         /* IMC Fan Policy PWM Settings */<br>+            FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg0 = 0x00;<br>+              FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg1 = 0x00; /* Zone */<br>+           FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg2 = 0x5a; /* AL0 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg3 = 0x46; /* AL1 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg4 = 0x28; /* AL2 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg5 = 0xff; /* AL3 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg6 = 0xff; /* AL4 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg7 = 0xff; /* AL5 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg8 = 0xff; /* AL6 percentage */<br>+         FchParams->Imc.EcStruct.MsgFun85Zone0MsgReg9 = 0xff; /* AL7 percentage */<br> <br>-      FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br>+          FchParams->Imc.EcStruct.IMCFUNSupportBitMap = 0x111;//BIT0 | BIT4 |BIT8;<br> <br>-       /* NOTE:<br>-      * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>-  * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>-    * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>-       */<br>+          /* NOTE:<br>+              * FchInitLateHwm will overwrite the EcStruct with EcDefaultMassege,<br>+          * AGESA put EcDefaultMassege as global data in ROM, so we can't overwride it.<br>+            * so we remove it from AGESA code. Please Seee FchInitLateHwm.<br>+               */<br> <br>-#else /* HWM fan control, the way not recommand */<br>-  FchParams->Imc.ImcEnable = FALSE;<br>- FchParams->Hwm.HwMonitorEnable = TRUE;<br>-    FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>-<br>-#endif /* CONFIG_HUDSON_IMC_FWM */<br>+         } else { /* HWM fan control, the way not recommand */<br>+               FchParams->Imc.ImcEnable = FALSE;<br>+         FchParams->Hwm.HwMonitorEnable = TRUE;<br>+            FchParams->Hwm.HwmFchtsiAutoPoll = TRUE;/* 1 enable, 0 disable TSI Auto Polling */<br>+        }<br> }<br> <br> /**<br>diff --git a/src/mainboard/pcengines/apu2/BiosCallOuts.c b/src/mainboard/pcengines/apu2/BiosCallOuts.c<br>index a239b47..5822779 100644<br>--- a/src/mainboard/pcengines/apu2/BiosCallOuts.c<br>+++ b/src/mainboard/pcengines/apu2/BiosCallOuts.c<br>@@ -23,9 +23,7 @@<br> #include "FchPlatform.h"<br> #include "cbfs.h"<br> #include "gpio_ftns.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "imc.h"<br>-#endif<br> #include "hudson.h"<br> #include <stdlib.h><br> <br>diff --git a/src/mainboard/amd/gardenia/fchec.h b/src/soc/amd/stoneyridge/include/fchec.h<br>similarity index 100%<br>rename from src/mainboard/amd/gardenia/fchec.h<br>rename to src/soc/amd/stoneyridge/include/fchec.h<br>diff --git a/src/southbridge/amd/agesa/hudson/hudson.c b/src/southbridge/amd/agesa/hudson/hudson.c<br>index 101f5d4..20921d5 100644<br>--- a/src/southbridge/amd/agesa/hudson/hudson.c<br>+++ b/src/southbridge/amd/agesa/hudson/hudson.c<br>@@ -181,12 +181,10 @@<br> <br> static void hudson_final(void *chip_info)<br> {<br>-#if !IS_ENABLED(CONFIG_ACPI_ENABLE_THERMAL_ZONE)<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>+if (!IS_ENABLED(CONFIG_ACPI_ENABLE_THERMAL_ZONE) &&<br>+       IS_ENABLED(CONFIG_HUDSON_IMC_FWM))<br>    /* AMD AGESA does not enable thermal zone, so we enable it here. */<br>   enable_imc_thermal_zone();<br>-#endif<br>-#endif<br> }<br> <br> struct chip_operations southbridge_amd_agesa_hudson_ops = {<br>diff --git a/src/mainboard/amd/bettong/fchec.h b/src/southbridge/amd/pi/hudson/fchec.h<br>similarity index 100%<br>rename from src/mainboard/amd/bettong/fchec.h<br>rename to src/southbridge/amd/pi/hudson/fchec.h<br>diff --git a/src/southbridge/amd/pi/hudson/hudson.c b/src/southbridge/amd/pi/hudson/hudson.c<br>index 40b8b53..e306836 100644<br>--- a/src/southbridge/amd/pi/hudson/hudson.c<br>+++ b/src/southbridge/amd/pi/hudson/hudson.c<br>@@ -26,10 +26,7 @@<br> #include "hudson.h"<br> #include "smbus.h"<br> #include "smi.h"<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br> #include "fchec.h"<br>-#endif<br>-<br> <br> int acpi_get_sleep_type(void)<br> {<br>@@ -123,12 +120,11 @@<br> <br> static void hudson_final(void *chip_info)<br> {<br>-#if IS_ENABLED(CONFIG_HUDSON_IMC_FWM)<br>-        agesawrapper_fchecfancontrolservice();<br>-#if !IS_ENABLED(CONFIG_ACPI_ENABLE_THERMAL_ZONE)<br>-    enable_imc_thermal_zone();<br>-#endif<br>-#endif<br>+ if (IS_ENABLED(CONFIG_HUDSON_IMC_FWM)) {<br>+             agesawrapper_fchecfancontrolservice();<br>+               if (!IS_ENABLED(CONFIG_ACPI_ENABLE_THERMAL_ZONE))<br>+                    enable_imc_thermal_zone();<br>+   }<br> }<br> <br> struct chip_operations southbridge_amd_pi_hudson_ops = {<br>diff --git a/src/southbridge/amd/pi/hudson/imc.c b/src/southbridge/amd/pi/hudson/imc.c<br>index d11bb88..53e97fb 100644<br>--- a/src/southbridge/amd/pi/hudson/imc.c<br>+++ b/src/southbridge/amd/pi/hudson/imc.c<br>@@ -81,21 +81,3 @@<br>  WaitForEcLDN9MailboxCmdAck(&StdHeader);<br> }<br> #endif<br>-<br>-/* Bettong Hardware Monitor Fan Control<br>- * Hardware limitation:<br>- *  HWM will fail to read the input temperature via I2C if other<br>- *  software switches the I2C address.  AMD recommends using IMC<br>- *  to control fans, instead of HWM.<br>- */<br>-void oem_fan_control(FCH_DATA_BLOCK *FchParams)<br>-{<br>-     /* Enable IMC fan control. the recommand way */<br>-      imc_reg_init();<br>-<br>-   FchParams->Imc.ImcEnable = TRUE;<br>-  FchParams->Hwm.HwmControl = 1; /* 1 IMC, 0 HWM */<br>- FchParams->Imc.ImcEnableOverWrite = 1; /* 2 disable IMC, 1 enable IMC, 0 following hw strap setting */<br>-<br>- LibAmdMemFill(&(FchParams->Imc.EcStruct), 0, sizeof(FCH_EC), FchParams->StdHeader);<br>-}<br>diff --git a/src/southbridge/amd/pi/hudson/imc.h b/src/southbridge/amd/pi/hudson/imc.h<br>index 7e40730..65e275f 100644<br>--- a/src/southbridge/amd/pi/hudson/imc.h<br>+++ b/src/southbridge/amd/pi/hudson/imc.h<br>@@ -22,6 +22,5 @@<br> <br> void imc_reg_init(void);<br> void enable_imc_thermal_zone(void);<br>-void oem_fan_control(FCH_DATA_BLOCK *FchParams);<br> <br> #endif<br></pre><p>To view, visit <a href="https://review.coreboot.org/20677">change 20677</a>. To unsubscribe, 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/20677"/><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: Idd271c6ab618aa4badf81c702212e7de35317021 </div>
<div style="display:none"> Gerrit-Change-Number: 20677 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Martin Roth <martinroth@google.com> </div>