Skip to content

Commit

Permalink
Test IA32_PACKAGE_THERM_INTERRUPT before clearing Package Log bits
Browse files Browse the repository at this point in the history
  • Loading branch information
cyring committed Apr 10, 2021
1 parent 1119d6d commit 0ac6c83
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 49 deletions.
92 changes: 48 additions & 44 deletions corefreqk.c
Original file line number Diff line number Diff line change
Expand Up @@ -6704,56 +6704,60 @@ void ThermalMonitor_Set(CORE_RO *Core)
RDMSR(ThermStatus, MSR_IA32_THERM_STATUS);
}
}
Core->PowerThermal.Events = ( (ThermStatus.StatusBit
|ThermStatus.StatusLog ) << 0)
| (ThermStatus.PROCHOTLog << 1)
| (ThermStatus.CriticalTempLog << 2)
| ( (ThermStatus.Threshold1Log
|ThermStatus.Threshold2Log ) << 3)
| (ThermStatus.PwrLimitLog << 4)
| (ThermStatus.CurLimitLog << 5)
| (ThermStatus.XDomLimitLog << 6);
Core->PowerThermal.Events = \
( (ThermStatus.StatusBit | ThermStatus.StatusLog ) << 0 )
| (ThermStatus.PROCHOTLog << 1)
| (ThermStatus.CriticalTempLog << 2)
| ((ThermStatus.Threshold1Log | ThermStatus.Threshold2Log) << 3)
| (ThermStatus.PwrLimitLog << 4)
| (ThermStatus.CurLimitLog << 5)
| (ThermStatus.XDomLimitLog << 6);

if (PUBLIC(RO(Proc))->Features.Power.EAX.PTM
&& (Core->Bind == PUBLIC(RO(Proc))->Service.Core))
{
ClearBit = 0;
ThermStatus.value = 0;
RDMSR(ThermStatus, MSR_IA32_PACKAGE_THERM_STATUS);

if (PUBLIC(RO(Proc))->Features.Power.EAX.PTM
&& (Core->Bind == PUBLIC(RO(Proc))->Service.Core))
if (Clear_Events & EVENT_THERM_SENSOR) {
ThermStatus.StatusLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_PROCHOT) {
ThermStatus.PROCHOTLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_CRIT) {
ThermStatus.CriticalTempLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_THOLD) {
ThermStatus.Threshold1Log = 0;
ThermStatus.Threshold2Log = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_POWER_LIMIT) {
ThermStatus.PwrLimitLog = 0;
ClearBit = 1;
}
if (ClearBit)
{
ClearBit = 0;
ThermStatus.value = 0;
RDMSR(ThermStatus, MSR_IA32_PACKAGE_THERM_STATUS);

if (Clear_Events & EVENT_THERM_SENSOR) {
ThermStatus.StatusLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_PROCHOT) {
ThermStatus.PROCHOTLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_CRIT) {
ThermStatus.CriticalTempLog = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_THERM_THOLD) {
ThermStatus.Threshold1Log = 0;
ThermStatus.Threshold2Log = 0;
ClearBit = 1;
}
if (Clear_Events & EVENT_POWER_LIMIT) {
ThermStatus.PwrLimitLog = 0;
ClearBit = 1;
}
if (ClearBit) {
THERM_INTERRUPT ThermInterrupt = {.value = 0};
RDMSR(ThermInterrupt, MSR_IA32_PACKAGE_THERM_INTERRUPT);
if (!(ThermInterrupt.High_Temp_Int|ThermInterrupt.Low_Temp_Int))
{
WRMSR(ThermStatus, MSR_IA32_PACKAGE_THERM_STATUS);
RDMSR(ThermStatus, MSR_IA32_PACKAGE_THERM_STATUS);
}
PUBLIC(RO(Proc))->PowerThermal.Events = ((ThermStatus.StatusBit
|ThermStatus.StatusLog) << 0)
| (ThermStatus.PROCHOTLog << 1)
| (ThermStatus.CriticalTempLog << 2)
| ( (ThermStatus.Threshold1Log
|ThermStatus.Threshold2Log)<< 3)
| (ThermStatus.PwrLimitLog << 4);
}
PUBLIC(RO(Proc))->PowerThermal.Events = \
( (ThermStatus.StatusBit | ThermStatus.StatusLog) << 0 )
| (ThermStatus.PROCHOTLog << 1)
| (ThermStatus.CriticalTempLog << 2)
| ((ThermStatus.Threshold1Log | ThermStatus.Threshold2Log) << 3)
| (ThermStatus.PwrLimitLog << 4);
}

RDMSR(PfInfo, MSR_PLATFORM_INFO);

Expand Down
12 changes: 7 additions & 5 deletions intelmsr.h
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,7 @@ typedef union
} CORE_FIXED_PERF_CONTROL;

typedef union
{ /* R/W: IA32_THERM_INTERRUPT(19Bh) Core or Unique scope */
{ /* R/W: IA32_{PACKAGE_}THERM_INTERRUPT(19Bh{1B2h}) Core|Unique scope */
unsigned long long value;
struct
{
Expand All @@ -1111,13 +1111,14 @@ typedef union
Threshold1_Int : 16-15,
Threshold2_Value: 23-16,
Threshold2_Int : 24-23,
PLN_Enable : 25-24, /* Power Limit Notification */
ReservedBits2 : 64-25;
PLN_Enable : 25-24, /* Power Limit Notification */
HWP_Interrupt : 26-25, /* IA32_PACKAGE_THERM_INTERRUPT */
ReservedBits2 : 64-26;
};
} THERM_INTERRUPT;

typedef union
{
{ /* R/O-R/WC0: IA32_{PACKAGE_}THERM_STATUS(19Ch{1B1h}) */
unsigned long long value;
struct
{
Expand All @@ -1139,7 +1140,8 @@ typedef union
XDomLimitStatus : 15-14, /* HWP Feedback */
XDomLimitLog : 16-15, /* HWP Feedback */
DTS : 23-16,
ReservedBits1 : 27-23,
ReservedBits1 : 26-23,
HWP_Status : 27-26, /* IA32_PACKAGE_THERM_STATUS */
Resolution : 31-27,
ReadingValid : 32-31,
ReservedBits2 : 64-32;
Expand Down

0 comments on commit 0ac6c83

Please sign in to comment.