cocafe / msr-utility

Little CLI utility to control Model Specific Registers (MSRs) on Windows via WinRing0 driver, 64+ cores supported
73 stars 11 forks source link

Use utility to disable bd-prochot permanently? #8

Open BPMData opened 8 months ago

BPMData commented 8 months ago

Hello all;

I have a brand new MSI Raider laptop that is now permanently throttled to a nearly unusable 400 mhz per core because, after overheating once, bd-prochot is ALWAYS on.

My understanding is Bd-prochot is controlled by bit[0] of MSR 0x1FC. In linux at least, simply writing 2 seems to override bd-prochot permanently.

Is this what I need to run?

msr-cmd.exe -l write 0x1FC 0x0000000000000002

Any help would be very appreciated! I hate to have to return my entire laptop for something as stupid as one registry key being set wrong.

cocafe commented 8 months ago

In fact, it is not permanent, registers will be reset after S3/S4 resume or reboot. You need to create a task in task scheduler to set MSR again on such events occur.

Simply if you don't understand register things too much, you can use Throttlestop to do the job. If disabling BDPROCHOT in Throttlestop solves the problem, then register below may work.

Download the mingw port of the tool. Since you didn't mention what CPU you are using, here is the register of boardwell:

#define MSR_POWER_CTL                           0x1fc
#define PCH_NEG_DISABLE                         (1 << 30) // PKG C-state Lat. Neg.
#define PCH_NEG_DISABLE_SHIFT                   30
#define LTR_SW_DISABLE                          (1 << 29)  // LTR_IIO_DISABLE, LTR: Snoop Related
#define LTR_SW_DISABLE_SHIFT                    29 // ???
#define LTR_SW_INPUT_DISABLE                    28 // LTR_SW_DISABLE, LTR Software Input, Disable = Ignore SW LTR input.
#define PROCHOT_LOCK                            (1 << 27)
#define PROCHOT_LOCK_SHIFT                      27
#define PROCHOT_RESPONSE                        (1 << 26)
#define PROCHOT_RESPONSE_SHIFT                  26
#define PWR_PERF_TUNING_CFG_MODE                (1 << 25) // if set 0, turbo is disabled 
#define PWR_PERF_TUNING_CFG_MODE_SHIFT          25
#define PWR_PERF_TUNING_ENABLE_DYN_SWITCHING    (1 << 24) // Enable/Disable dynamic switching feature in the power performance tuning algorithm.
#define PWR_PERF_TUNING_ENABLE_DYN_SHIFT        24        // Power/Performance Switch
#define PWR_PERF_TUNING_DISABLE_EEP_CTRL        (1 << 23) // DYNAMIC_P_STATE_CTRL, EE-P Control
#define PWR_PERF_TUNING_DISABLE_EEP_SHIFT       23
#define PWR_PERF_TUNING_DISABLE_SAPM_CTRL       (1 << 22) // DISABLE THIS DROPS BENCHAMRKS PTS
#define PWR_PERF_TUNING_DISABLE_SAPM_SHIFT      22
#define DIS_PROCHOT_OUT                         (1 << 21)
#define DIS_PROCHOT_OUT_SHIFT                   21
#define DIS_RACE_TO_HALT_OPTIMIZATION           (1 << 20)
#define DIS_RACE_TO_HALT_OPTIMIZATION_SHIFT     20         // Gen 6~12, SDM
#define EE_TURBO_DISABLE                        (1 << 19)
#define EE_TURBO_DISABLE_SHIFT                  19
#define ENERGY_EFFICIENT_PSTATE_ENABLE          (1 << 18)
#define ENERGY_EFFICIENT_PSTATE_ENABLE_SHIFT    18
#define PHOLD_SR_DISABLE                        (1 << 17)
#define PHOLD_SR_DISABLE_SHIFT                  17
#define PHOLD_CST_PREVENTION_INIT               (1 << 16)
#define PHOLD_CST_PREVENTION_INIT_SHIFT         16
#define FAST_BRK_INT_EN                         (1 << 4) // Disable = Use 'fast' VID swing rate
#define FAST_BRK_INT_EN_SHIFT                   4
#define FAST_BRK_SNP_EN                         (1 << 3) // Disable = Use 'fast' VID swing rate
#define FAST_BRK_SNP_EN_SHIFT                   3
#define SAPM_IMC_C2_POLICY_EN                   (1 << 2)
#define SAPM_IMC_C2_POLICY_SHIFT                2
#define C1E_ENABLE                              (1 << 1)
#define C1E_ENABLE_SHIFT                        1
#define ENABLE_BIDIR_PROCHOT_EN                 (1 << 0)
#define ENABLE_BIDIR_PROCHOT_EN_SHIFT           0
#define IA32_MISC_ENABLE        0x1a0   // thread scope
#define  FAST_STRINGS_ENABLE_BIT    BIT(0)
#define  TM1_TM2_EMTTM_ENABLE_BIT   BIT(3)  // Automatic Thermal Control Circuit Enable (R/W)
#define  MISC_TURBO_DISABLE     BIT(6)      
#define  PERF_MONITORING        BIT(7)
#define  SPEED_STEP_ENABLE_BIT      BIT(16)
#define  MONITOR_MWAIT_SUPPORT      BIT(18) // should not change on the fly
#define  BURST_MODE_DISABLE             BIT(38)

msr-cmd getbit 0x1fc 27: check bit 27 of 0x1fc is set by bios or not, if set, prochot bit is probably locked (read only). msr-cmd -A setbit 0x1fc 0 0: disable ENABLE_BIDIR_PROCHOT_EN msr-cmd -A setbit 0x1a0 3 0: TM1_TM2_EMTTM_ENABLE_BIT is also thermal control related, you may wanna disable it