diff options
author | 2019-11-20 20:44:22 +0000 | |
---|---|---|
committer | 2019-11-20 20:44:22 +0000 | |
commit | bc9d16d1538b13eeaa1132757b14b7fc9a5d198a (patch) | |
tree | 725ac957550ca10d8d2ec752adc1c5b7e849b570 /sys/dev/pci/ksmn.c | |
parent | Honour DEBUG (diff) | |
download | wireguard-openbsd-bc9d16d1538b13eeaa1132757b14b7fc9a5d198a.tar.xz wireguard-openbsd-bc9d16d1538b13eeaa1132757b14b7fc9a5d198a.zip |
ksmn(4): Improve the precision of the fractional part of temperatures.
Before we were losing some precision in the raw value sensor conversion.
raw: 478 before: 59.70 after: 59.75 real: 59.750
raw: 479 before: 59.80 after: 59.88 real: 59.875
raw: 480 before: 60.00 after: 60.00 real: 60.000
Tested on Ryzen 7 2700X, Ryzen 5 2500U, and Zen2 by nte.
Diff and feedback from nte <lists at nte.email>
Diffstat (limited to 'sys/dev/pci/ksmn.c')
-rw-r--r-- | sys/dev/pci/ksmn.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/sys/dev/pci/ksmn.c b/sys/dev/pci/ksmn.c index 7d3477d4b32..e15718dd34e 100644 --- a/sys/dev/pci/ksmn.c +++ b/sys/dev/pci/ksmn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ksmn.c,v 1.2 2019/09/27 01:26:46 brynet Exp $ */ +/* $OpenBSD: ksmn.c,v 1.3 2019/11/20 20:44:22 brynet Exp $ */ /* * Copyright (c) 2019 Bryan Steele <brynet@openbsd.org> @@ -149,18 +149,21 @@ void ksmn_refresh(void *arg) { struct ksmn_softc *sc = arg; - struct ksensor *s = &sc->sc_sensor; - pcireg_t reg; - int c; + struct ksensor *s = &sc->sc_sensor; + pcireg_t reg; + int raw, offset = 0; pci_conf_write(sc->sc_pc, sc->sc_pcitag, SMN_17H_ADDR_R, SMU_17H_THM); reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, SMN_17H_DATA_R); - c = GET_CURTMP(reg) * 5 / 4; /* 1.25 */ + raw = GET_CURTMP(reg); if ((reg & CURTMP_17H_RANGE_SEL) != 0) - c -= CURTMP_17H_RANGE_ADJUST; - if (c > sc->sc_tctl_offset) - c -= sc->sc_tctl_offset; - s->value = c * 100000 + 273150000; + offset -= CURTMP_17H_RANGE_ADJUST; + offset -= sc->sc_tctl_offset; + /* convert to uC */ + offset *= 100000; + + /* convert raw (in steps of 0.125C) to uC, add offset, uC to uK. */ + s->value = ((raw * 125000) + offset) + 273150000; } |