summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/ksmn.c
diff options
context:
space:
mode:
authorbrynet <brynet@openbsd.org>2019-11-20 20:44:22 +0000
committerbrynet <brynet@openbsd.org>2019-11-20 20:44:22 +0000
commitbc9d16d1538b13eeaa1132757b14b7fc9a5d198a (patch)
tree725ac957550ca10d8d2ec752adc1c5b7e849b570 /sys/dev/pci/ksmn.c
parentHonour DEBUG (diff)
downloadwireguard-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.c21
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;
}