Add gpuperf patch
This commit is contained in:
parent
be3c479ad3
commit
9105d96954
330
patches/gpuperf.diff
Normal file
330
patches/gpuperf.diff
Normal file
@ -0,0 +1,330 @@
|
||||
This will throttle down your intel graphic card for
|
||||
better thermal management.
|
||||
It is bound to CPU performance settings via
|
||||
hw.setperf sysctl.
|
||||
|
||||
Main Test Machine
|
||||
cpu0: Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz, 2492.32 MHz, 06-2a-07
|
||||
inteldrm0 at pci0 dev 2 function 0 "Intel HD Graphics 3000" rev 0x09
|
||||
CPU 800MHz to 2500MHz
|
||||
GPU 650MHz to 1300MHz
|
||||
Secondary Test Machine
|
||||
cpu0: Intel(R) Core(TM) i3-9100 CPU @ 3.60GHz, 3593.36 MHz, 06-9e-0b
|
||||
inteldrm0 at pci0 dev 2 function 0 "Intel UHD Graphics 630" rev 0x00
|
||||
|
||||
CPU autothrottle -> GPU autothrottle (i.e 650MHz - 1300MHz)
|
||||
CPU perf = 100 -> GPU throttle to max. frequency (i.e. 1300MHz)
|
||||
CPU perf < 100 -> GPU throttle to base frequency (i.e. 650MHz)
|
||||
|
||||
Patch Version 8
|
||||
Adapt for new DRM code (OpenBSD 6.7-current)
|
||||
Patch Version 7
|
||||
Header shuffling
|
||||
Cleanup
|
||||
Patch Version 6
|
||||
Don't include in SMALL_KERNEL
|
||||
Copyright update
|
||||
Disable DEBUG output
|
||||
Patch apply directions have changed
|
||||
Patch Version 5
|
||||
Cleanup
|
||||
Patch Version 4
|
||||
Switch from percentage to performance groups (LOW, HIGH, AUTO)
|
||||
Cleanup
|
||||
Patch Version 3
|
||||
No longer implements a own sysctl
|
||||
Patch apply directions have changed
|
||||
Patch Version 2
|
||||
Patch apply directions have changed
|
||||
Includes man page change
|
||||
Header cleanup
|
||||
Patch Version 1
|
||||
Throttle down to base freq on haswell & broadwell
|
||||
Remove sensors, use debug printf
|
||||
Patch Version 0
|
||||
Initial POC
|
||||
Using sensors framework only for debug
|
||||
Only implemented for intel graphic
|
||||
To apply:
|
||||
cd /usr/src/sys && patch < gpuperf.diff
|
||||
Rebuild and install a new kernel:
|
||||
KK=`sysctl -n kern.osversion | cut -d# -f1`
|
||||
cd /usr/src/sys/arch/`machine`/compile/$KK
|
||||
make obj
|
||||
make config
|
||||
make
|
||||
make install
|
||||
Feedback and questions: programmer@netzbasis.de
|
||||
|
||||
Index: conf/files
|
||||
===================================================================
|
||||
RCS file: /var/cvs/src/sys/conf/files,v
|
||||
retrieving revision 1.690
|
||||
diff -u -p -r1.690 files
|
||||
--- conf/files 6 Jul 2020 04:09:46 -0000 1.690
|
||||
+++ conf/files 18 Jul 2020 19:43:06 -0000
|
||||
@@ -717,6 +717,7 @@ file kern/subr_autoconf.c
|
||||
file kern/subr_disk.c
|
||||
file kern/subr_evcount.c
|
||||
file kern/subr_extent.c
|
||||
+file kern/subr_gpuperf.c !small_kernel
|
||||
file kern/subr_hibernate.c hibernate
|
||||
file kern/subr_kubsan.c kubsan
|
||||
file kern/subr_log.c
|
||||
Index: dev/pci/drm/i915/i915_drv.c
|
||||
===================================================================
|
||||
RCS file: /var/cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v
|
||||
retrieving revision 1.132
|
||||
diff -u -p -r1.132 i915_drv.c
|
||||
--- dev/pci/drm/i915/i915_drv.c 28 Jun 2020 02:29:19 -0000 1.132
|
||||
+++ dev/pci/drm/i915/i915_drv.c 18 Jul 2020 19:46:36 -0000
|
||||
@@ -2605,12 +2605,70 @@ inteldrm_attachhook(struct device *self)
|
||||
|
||||
config_found_sm(self, &aa, wsemuldisplaydevprint,
|
||||
wsemuldisplaydevsubmatch);
|
||||
+
|
||||
+#ifdef __OpenBSD__
|
||||
+ gpuperf_register(dev_priv->sc_dev.dv_xname,
|
||||
+ inteldrm_set_gpuperf, dev_priv);
|
||||
+#endif /* __OpenBSD__ */
|
||||
+
|
||||
return;
|
||||
|
||||
fail:
|
||||
inteldrm_fatal_error = 1;
|
||||
inteldrm_forcedetach(dev_priv);
|
||||
}
|
||||
+
|
||||
+#ifdef __OpenBSD__
|
||||
+#ifdef GPUPERF_DEBUG
|
||||
+#define GPRINTF(x...) do { printf(x); } while(0)
|
||||
+#else
|
||||
+#define GPRINTF(x...)
|
||||
+#endif /* GPUPERF_DEBUG */
|
||||
+
|
||||
+int
|
||||
+inteldrm_set_gpuperf(gpuperf_level level, void *arg)
|
||||
+{
|
||||
+ struct inteldrm_softc *dev_priv = arg;
|
||||
+ struct intel_rps *rps = &dev_priv->gt.rps;
|
||||
+ u_int32_t min = rps->min_freq;
|
||||
+ u_int32_t max = rps->max_freq;
|
||||
+
|
||||
+ GPRINTF("inteldrm: min %u, max %u, min_s %u, max_s %u, b %u, act %d MHz\n",
|
||||
+ min, max, rps->min_freq_softlimit, rps->max_freq_softlimit,
|
||||
+ rps->boost_freq, intel_gpu_freq(dev_priv, rps->cur_freq));
|
||||
+
|
||||
+ /*
|
||||
+ * On haswell & broadwell min_freq_softlimit is higher than min_freq
|
||||
+ * by default. Allow those devices to clock down further by ignoring
|
||||
+ * this special case.
|
||||
+ */
|
||||
+ switch (level) {
|
||||
+ case GPU_AUTO:
|
||||
+ rps->max_freq_softlimit = max;
|
||||
+ rps->boost_freq = max;
|
||||
+ rps->min_freq_softlimit = min;
|
||||
+ break;
|
||||
+ case GPU_LOW:
|
||||
+ rps->max_freq_softlimit = min;
|
||||
+ rps->boost_freq = min;
|
||||
+ rps->min_freq_softlimit = min;
|
||||
+ break;
|
||||
+ case GPU_HIGH:
|
||||
+ rps->max_freq_softlimit = max;
|
||||
+ rps->boost_freq = max;
|
||||
+ rps->min_freq_softlimit = max;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ GPRINTF("inteldrm: min %u, max %u, min_s %u, max_s %u, b %u, act %d MHz\n",
|
||||
+ min, max, rps->min_freq_softlimit, rps->max_freq_softlimit,
|
||||
+ rps->boost_freq, intel_gpu_freq(dev_priv, rps->cur_freq));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif /* __OpenBSD__ */
|
||||
|
||||
int
|
||||
inteldrm_detach(struct device *self, int flags)
|
||||
Index: dev/pci/drm/i915/i915_drv.h
|
||||
===================================================================
|
||||
RCS file: /var/cvs/src/sys/dev/pci/drm/i915/i915_drv.h,v
|
||||
retrieving revision 1.92
|
||||
diff -u -p -r1.92 i915_drv.h
|
||||
--- dev/pci/drm/i915/i915_drv.h 29 Jun 2020 04:13:30 -0000 1.92
|
||||
+++ dev/pci/drm/i915/i915_drv.h 18 Jul 2020 19:43:06 -0000
|
||||
@@ -2000,3 +2000,8 @@ i915_coherent_map_type(struct drm_i915_p
|
||||
}
|
||||
|
||||
#endif
|
||||
+
|
||||
+#ifdef __OpenBSD__
|
||||
+#include <sys/gpuperf.h>
|
||||
+int inteldrm_set_gpuperf(gpuperf_level level, void *arg);
|
||||
+#endif /* __OpenBSD__ */
|
||||
Index: kern/sched_bsd.c
|
||||
===================================================================
|
||||
RCS file: /var/cvs/src/sys/kern/sched_bsd.c,v
|
||||
retrieving revision 1.63
|
||||
diff -u -p -r1.63 sched_bsd.c
|
||||
--- kern/sched_bsd.c 30 May 2020 14:42:59 -0000 1.63
|
||||
+++ kern/sched_bsd.c 18 Jul 2020 19:43:06 -0000
|
||||
@@ -540,6 +540,7 @@ int perfpolicy = PERFPOL_MANUAL;
|
||||
/*
|
||||
* The code below handles CPU throttling.
|
||||
*/
|
||||
+#include <sys/gpuperf.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
void setperf_auto(void *);
|
||||
@@ -630,6 +631,11 @@ sysctl_hwsetperf(void *oldp, size_t *old
|
||||
perflevel = newperf;
|
||||
cpu_setperf(perflevel);
|
||||
|
||||
+ if (perflevel == 100)
|
||||
+ gpuperf_set(GPU_HIGH);
|
||||
+ else
|
||||
+ gpuperf_set(GPU_LOW);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -674,9 +680,11 @@ sysctl_hwperfpolicy(void *oldp, size_t *
|
||||
|
||||
if (perfpolicy == PERFPOL_AUTO) {
|
||||
timeout_add_msec(&setperf_to, 200);
|
||||
+ gpuperf_set(GPU_AUTO);
|
||||
} else if (perfpolicy == PERFPOL_HIGH) {
|
||||
perflevel = 100;
|
||||
cpu_setperf(perflevel);
|
||||
+ gpuperf_set(GPU_HIGH);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Index: kern/subr_gpuperf.c
|
||||
===================================================================
|
||||
RCS file: kern/subr_gpuperf.c
|
||||
diff -N kern/subr_gpuperf.c
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ kern/subr_gpuperf.c 18 Jul 2020 19:43:06 -0000
|
||||
@@ -0,0 +1,79 @@
|
||||
+/* $OpenBSD$ */
|
||||
+
|
||||
+/*
|
||||
+ * Copyright (c) 2019, 2020 Benjamin Baier <ben@netzbasis.de>
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#include <sys/gpuperf.h>
|
||||
+#include <sys/param.h>
|
||||
+#include <sys/systm.h>
|
||||
+#include <sys/malloc.h>
|
||||
+
|
||||
+#ifdef GPUPERF_DEBUG
|
||||
+#define DPRINTF(x...) do { printf(x); } while(0)
|
||||
+#else
|
||||
+#define DPRINTF(x...)
|
||||
+#endif /* GPUPERF_DEBUG */
|
||||
+
|
||||
+struct gpuperf_dev {
|
||||
+ char name[16]; /* device name */
|
||||
+ void *arg; /* arg passthrough */
|
||||
+ int (*callback)(gpuperf_level, void *);
|
||||
+ LIST_ENTRY(gpuperf_dev) next;
|
||||
+};
|
||||
+
|
||||
+LIST_HEAD(, gpuperf_dev) gpuperf_list =
|
||||
+ LIST_HEAD_INITIALIZER(gpuperf_list);
|
||||
+
|
||||
+int
|
||||
+gpuperf_register(const char *name, int (*callback)(gpuperf_level, void *),
|
||||
+ void *arg)
|
||||
+{
|
||||
+ struct gpuperf_dev *dev;
|
||||
+ int status = 0;
|
||||
+
|
||||
+ if ((dev = malloc(sizeof(*dev), M_DEVBUF, M_NOWAIT)) == NULL)
|
||||
+ return -1;
|
||||
+
|
||||
+ strlcpy(dev->name, name, sizeof(dev->name));
|
||||
+ dev->callback = callback;
|
||||
+ dev->arg = arg;
|
||||
+
|
||||
+ LIST_INSERT_HEAD(&gpuperf_list, dev, next);
|
||||
+ status = dev->callback(GPU_AUTO, dev->arg);
|
||||
+
|
||||
+ DPRINTF("gpuperf: %s registered, status %d\n", dev->name, status);
|
||||
+
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+gpuperf_set(gpuperf_level level)
|
||||
+{
|
||||
+ struct gpuperf_dev *dev;
|
||||
+ int status = 0;
|
||||
+
|
||||
+ if ((level < GPU_AUTO) || (level > GPU_HIGH))
|
||||
+ return -1;
|
||||
+
|
||||
+ LIST_FOREACH(dev, &gpuperf_list, next) {
|
||||
+ status += dev->callback(level, dev->arg);
|
||||
+
|
||||
+ DPRINTF("gpuperf: requesting %d from %s, status %d\n",
|
||||
+ level, dev->name, status);
|
||||
+ }
|
||||
+
|
||||
+ return status;
|
||||
+}
|
||||
Index: sys/gpuperf.h
|
||||
===================================================================
|
||||
RCS file: sys/gpuperf.h
|
||||
diff -N sys/gpuperf.h
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ sys/gpuperf.h 18 Jul 2020 19:43:06 -0000
|
||||
@@ -0,0 +1,31 @@
|
||||
+/* $OpenBSD$ */
|
||||
+
|
||||
+/*
|
||||
+ * Copyright (c) 2019, 2020 Benjamin Baier <ben@netzbasis.de>
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _SYS_GPUPERF_H_
|
||||
+#define _SYS_GPUPERF_H_
|
||||
+
|
||||
+typedef enum {
|
||||
+ GPU_AUTO,
|
||||
+ GPU_LOW,
|
||||
+ GPU_HIGH
|
||||
+} gpuperf_level;
|
||||
+
|
||||
+int gpuperf_set(gpuperf_level);
|
||||
+int gpuperf_register(const char *, int (*)(gpuperf_level, void *), void *);
|
||||
+
|
||||
+#endif /* _SYS_GPUPERF_H_ */
|
Loading…
Reference in New Issue
Block a user