@@ -283,6 +283,14 @@ static unsigned long long Clear_Events = 0;
283
283
module_param(Clear_Events, ullong, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
284
284
MODULE_PARM_DESC(Clear_Events, "Clear Thermal and Power Events");
285
285
286
+ static unsigned int ThermalPoint_Count = 0;
287
+ static signed short ThermalPoint[THM_POINTS_DIM] = {
288
+ -1, -1, -1, -1, -1
289
+ };
290
+ module_param_array(ThermalPoint, short, &ThermalPoint_Count, \
291
+ S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
292
+ MODULE_PARM_DESC(ThermalPoint, "Thermal Point");
293
+
286
294
static int ThermalScope = -1;
287
295
module_param(ThermalScope, int, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
288
296
MODULE_PARM_DESC(ThermalScope, "[0:None; 1:SMT; 2:Core; 3:Package]");
@@ -8117,15 +8125,60 @@ void ThermalMonitor_IA32(CORE_RO *Core)
8117
8125
8118
8126
RDMSR(ThermInterrupt, MSR_IA32_THERM_INTERRUPT);
8119
8127
8120
- Core->ThermalPoint.Value[THM_THRESHOLD_1] = \
8121
- Core->PowerThermal.Param.Offset[0]
8122
- - Core->PowerThermal.Param.Offset[1]
8123
- - ThermInterrupt.Threshold1_Value;
8128
+ if (ThermalPoint_Count < THM_POINTS_DIM)
8129
+ {
8130
+ unsigned short WrRdMSR = 0;
8131
+
8132
+ if (ThermalPoint_Count > THM_THRESHOLD_1) {
8133
+ if (ThermalPoint[THM_THRESHOLD_1] > 0)
8134
+ {
8135
+ COMPUTE_THERMAL(INVERSE_INTEL,
8136
+ ThermInterrupt.Threshold1_Value,
8137
+ Core->PowerThermal.Param,
8138
+ ThermalPoint[THM_THRESHOLD_1]);
8139
+
8140
+ ThermInterrupt.Threshold1_Int = 1;
8141
+ WrRdMSR = 1;
8142
+ }
8143
+ else if (ThermalPoint[THM_THRESHOLD_1] == 0)
8144
+ {
8145
+ ThermInterrupt.Threshold1_Value = 0;
8146
+ ThermInterrupt.Threshold1_Int = 0;
8147
+ WrRdMSR = 1;
8148
+ }
8149
+ }
8150
+ if (ThermalPoint_Count > THM_THRESHOLD_2) {
8151
+ if (ThermalPoint[THM_THRESHOLD_2] > 0)
8152
+ {
8153
+ COMPUTE_THERMAL(INVERSE_INTEL,
8154
+ ThermInterrupt.Threshold2_Value,
8155
+ Core->PowerThermal.Param,
8156
+ ThermalPoint[THM_THRESHOLD_2]);
8157
+
8158
+ ThermInterrupt.Threshold2_Int = 1;
8159
+ WrRdMSR = 1;
8160
+ }
8161
+ else if (ThermalPoint[THM_THRESHOLD_2] == 0)
8162
+ {
8163
+ ThermInterrupt.Threshold2_Value = 0;
8164
+ ThermInterrupt.Threshold2_Int = 0;
8165
+ WrRdMSR = 1;
8166
+ }
8167
+ }
8168
+ if (WrRdMSR == 1) {
8169
+ WRMSR(ThermInterrupt, MSR_IA32_THERM_INTERRUPT);
8170
+ RDMSR(ThermInterrupt, MSR_IA32_THERM_INTERRUPT);
8171
+ }
8172
+ }
8173
+ COMPUTE_THERMAL(INTEL,
8174
+ Core->ThermalPoint.Value[THM_THRESHOLD_1],
8175
+ Core->PowerThermal.Param,
8176
+ ThermInterrupt.Threshold1_Value);
8124
8177
8125
- Core->ThermalPoint.Value[THM_THRESHOLD_2] = \
8126
- Core->PowerThermal.Param.Offset[0]
8127
- - Core->PowerThermal.Param.Offset[1]
8128
- - ThermInterrupt.Threshold2_Value;
8178
+ COMPUTE_THERMAL(INTEL,
8179
+ Core->ThermalPoint.Value[THM_THRESHOLD_2],
8180
+ Core->PowerThermal.Param,
8181
+ ThermInterrupt.Threshold2_Value) ;
8129
8182
8130
8183
if (ThermInterrupt.Threshold1_Int) {
8131
8184
BITSET(LOCKLESS, Core->ThermalPoint.State, THM_THRESHOLD_1);
@@ -8203,15 +8256,61 @@ void ThermalMonitor_IA32(CORE_RO *Core)
8203
8256
8204
8257
RDMSR(ThermInterrupt, MSR_IA32_PACKAGE_THERM_INTERRUPT);
8205
8258
8206
- PUBLIC(RO(Proc))->ThermalPoint.Value[THM_THRESHOLD_1] = \
8207
- Core->PowerThermal.Param.Offset[0]
8208
- - Core->PowerThermal.Param.Offset[1]
8209
- - ThermInterrupt.Threshold1_Value;
8259
+ if (ThermalPoint_Count < THM_POINTS_DIM)
8260
+ {
8261
+ unsigned short WrRdMSR = 0;
8262
+
8263
+ if (ThermalPoint_Count > THM_THRESHOLD_1) {
8264
+ if (ThermalPoint[THM_THRESHOLD_1] > 0)
8265
+ {
8266
+ COMPUTE_THERMAL(INVERSE_INTEL,
8267
+ ThermInterrupt.Threshold1_Value,
8268
+ Core->PowerThermal.Param,
8269
+ ThermalPoint[THM_THRESHOLD_1]);
8270
+
8271
+ ThermInterrupt.Threshold1_Int = 1;
8272
+ WrRdMSR = 1;
8273
+ }
8274
+ else if (ThermalPoint[THM_THRESHOLD_1] == 0)
8275
+ {
8276
+ ThermInterrupt.Threshold1_Value = 0;
8277
+ ThermInterrupt.Threshold1_Int = 0;
8278
+ WrRdMSR = 1;
8279
+ }
8280
+ }
8281
+ if (ThermalPoint_Count > THM_THRESHOLD_2) {
8282
+ if (ThermalPoint[THM_THRESHOLD_2] > 0)
8283
+ {
8284
+ COMPUTE_THERMAL(INVERSE_INTEL,
8285
+ ThermInterrupt.Threshold2_Value,
8286
+ Core->PowerThermal.Param,
8287
+ ThermalPoint[THM_THRESHOLD_2]);
8288
+
8289
+ ThermInterrupt.Threshold2_Int = 1;
8290
+ WrRdMSR = 1;
8291
+ }
8292
+ else if (ThermalPoint[THM_THRESHOLD_2] == 0)
8293
+ {
8294
+ ThermInterrupt.Threshold2_Value = 0;
8295
+ ThermInterrupt.Threshold2_Int = 0;
8296
+ WrRdMSR = 1;
8297
+ }
8298
+ }
8299
+ if (WrRdMSR == 1) {
8300
+ WRMSR(ThermInterrupt, MSR_IA32_PACKAGE_THERM_INTERRUPT);
8301
+ RDMSR(ThermInterrupt, MSR_IA32_PACKAGE_THERM_INTERRUPT);
8302
+ }
8303
+ }
8304
+
8305
+ COMPUTE_THERMAL(INTEL,
8306
+ PUBLIC(RO(Proc))->ThermalPoint.Value[THM_THRESHOLD_1],
8307
+ Core->PowerThermal.Param,
8308
+ ThermInterrupt.Threshold1_Value);
8210
8309
8211
- PUBLIC(RO(Proc))->ThermalPoint.Value[THM_THRESHOLD_2] = \
8212
- Core->PowerThermal.Param.Offset[0]
8213
- - Core->PowerThermal.Param.Offset[1]
8214
- - ThermInterrupt.Threshold2_Value;
8310
+ COMPUTE_THERMAL(INTEL,
8311
+ PUBLIC(RO(Proc))->ThermalPoint.Value[THM_THRESHOLD_2],
8312
+ Core->PowerThermal.Param,
8313
+ ThermInterrupt.Threshold2_Value) ;
8215
8314
8216
8315
if (ThermInterrupt.Threshold1_Int) {
8217
8316
BITSET(LOCKLESS, PUBLIC(RO(Proc))->ThermalPoint.State,
0 commit comments