<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>