lenovo_fix.py 893 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env python2
  2. import glob
  3. import os
  4. import struct
  5. from periphery import MMIO
  6. from time import sleep
  7. UPDATE_RATE_SEC = 15
  8. def writemsr(msr, val):
  9. n = glob.glob('/dev/cpu/[0-9]*/msr')
  10. for c in n:
  11. f = os.open(c, os.O_WRONLY)
  12. os.lseek(f, msr, os.SEEK_SET)
  13. os.write(f, struct.pack('Q', val))
  14. os.close(f)
  15. if not n:
  16. raise OSError("msr module not loaded (run modprobe msr)")
  17. def main():
  18. mchbar_mmio = MMIO(0xfed159a0, 8)
  19. while True:
  20. # set temperature trip point to 97 C
  21. writemsr(0x1a2, 0x3000000)
  22. # set MSR to PL1 45W, max duration - PL2 45W, 2ms
  23. writemsr(0x610, 0x42816800fe8168)
  24. # set MCHBAR register to the same PL1/2 values
  25. mchbar_mmio.write32(0, 0x00fe8168)
  26. mchbar_mmio.write32(4, 0x00428168)
  27. sleep(UPDATE_RATE_SEC)
  28. if __name__ == '__main__':
  29. main()