services: docker: Fix service definition.
[jackhill/guix/guix.git] / gnu / services / pm.scm
CommitLineData
bfbf6e1e
MO
1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
3;;;
4;;; This file is part of GNU Guix.
5;;;
6a18183f 6;;; GNU Guix is free software; you can redistribute it and/or modify
bfbf6e1e
MO
7;;; it under the terms of the GNU General Public License as published by
8;;; the Free Software Foundation, either version 3 of the License, or
9;;; (at your option) any later version.
10;;;
11;;; GNU Guix is distributed in the hope that it will be useful,
12;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of the GNU General Public License
17;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
18
19(define-module (gnu services pm)
20 #:use-module (guix gexp)
21 #:use-module (guix packages)
22 #:use-module (guix records)
d7fa39cc 23 #:use-module (gnu packages admin)
bfbf6e1e
MO
24 #:use-module (gnu packages linux)
25 #:use-module (gnu services)
26 #:use-module (gnu services base)
27 #:use-module (gnu services configuration)
28 #:use-module (gnu services shepherd)
29 #:use-module (gnu system shadow)
30 #:export (tlp-service-type
d7fa39cc
CAW
31 tlp-configuration
32
33 thermald-configuration
34 thermald-service-type))
bfbf6e1e
MO
35
36(define (uglify-field-name field-name)
37 (let ((str (symbol->string field-name)))
38 (string-join (string-split
39 (string-upcase
40 (if (string-suffix? "?" str)
41 (substring str 0 (1- (string-length str)))
42 str))
43 #\-)
44 "_")))
45
46(define (serialize-field field-name val)
47 (format #t "~a=~a\n" (uglify-field-name field-name) val))
48
49(define (serialize-boolean field-name val)
50 (serialize-field field-name (if val "1" "0")))
51(define-maybe boolean)
52
53(define (serialize-string field-name val)
54 (serialize-field field-name val))
55(define-maybe string)
56
57(define (space-separated-string-list? val)
58 (and (list? val)
59 (and-map (lambda (x)
60 (and (string? x) (not (string-index x #\space))))
61 val)))
62(define (serialize-space-separated-string-list field-name val)
63 (serialize-field field-name
64 (format #f "~s"
65 (string-join val " "))))
66(define-maybe space-separated-string-list)
67
68(define (non-negative-integer? val)
69 (and (exact-integer? val) (not (negative? val))))
70(define (serialize-non-negative-integer field-name val)
71 (serialize-field field-name val))
72(define-maybe non-negative-integer)
73
74(define (on-off-boolean? val)
75 (boolean? val))
76(define (serialize-on-off-boolean field-name val)
77 (serialize-field field-name (if val "on" "off")))
78(define-maybe on-off-boolean)
79
80(define (y-n-boolean? val)
81 (boolean? val))
82(define (serialize-y-n-boolean field-name val)
83 (serialize-field field-name (if val "Y" "N")))
84
85(define-configuration tlp-configuration
86 (tlp
87 (package tlp)
88 "The TLP package.")
89
90 (tlp-enable?
91 (boolean #t)
92 "Set to true if you wish to enable TLP.")
93
94 (tlp-default-mode
95 (string "AC")
96 "Default mode when no power supply can be detected. Alternatives are
97AC and BAT.")
98
99 (disk-idle-secs-on-ac
100 (non-negative-integer 0)
101 "Number of seconds Linux kernel has to wait after the disk goes idle,
102before syncing on AC.")
103
104 (disk-idle-secs-on-bat
105 (non-negative-integer 2)
106 "Same as @code{disk-idle-ac} but on BAT mode.")
107
108 (max-lost-work-secs-on-ac
109 (non-negative-integer 15)
110 "Dirty pages flushing periodicity, expressed in seconds.")
111
112 (max-lost-work-secs-on-bat
113 (non-negative-integer 60)
114 "Same as @code{max-lost-work-secs-on-ac} but on BAT mode.")
115
116 (cpu-scaling-governor-on-ac
117 (maybe-space-separated-string-list 'disabled)
118 "CPU frequency scaling governor on AC mode. With intel_pstate
119driver, alternatives are powersave and performance. With acpi-cpufreq driver,
120alternatives are ondemand, powersave, performance and conservative.")
121
122 (cpu-scaling-governor-on-bat
123 (maybe-space-separated-string-list 'disabled)
124 "Same as @code{cpu-scaling-governor-on-ac} but on BAT mode.")
125
126 (cpu-scaling-min-freq-on-ac
127 (maybe-non-negative-integer 'disabled)
128 "Set the min available frequency for the scaling governor on AC.")
129
130 (cpu-scaling-max-freq-on-ac
131 (maybe-non-negative-integer 'disabled)
132 "Set the max available frequency for the scaling governor on AC.")
133
134 (cpu-scaling-min-freq-on-bat
135 (maybe-non-negative-integer 'disabled)
136 "Set the min available frequency for the scaling governor on BAT.")
137
138 (cpu-scaling-max-freq-on-bat
139 (maybe-non-negative-integer 'disabled)
140 "Set the max available frequency for the scaling governor on BAT.")
141
142 (cpu-min-perf-on-ac
143 (maybe-non-negative-integer 'disabled)
144 "Limit the min P-state to control the power dissipation of the CPU,
145in AC mode. Values are stated as a percentage of the available performance.")
146
147 (cpu-max-perf-on-ac
148 (maybe-non-negative-integer 'disabled)
149 "Limit the max P-state to control the power dissipation of the CPU,
150in AC mode. Values are stated as a percentage of the available performance.")
151
152 (cpu-min-perf-on-bat
153 (maybe-non-negative-integer 'disabled)
154 "Same as @code{cpu-min-perf-on-ac} on BAT mode.")
155
156 (cpu-max-perf-on-bat
157 (maybe-non-negative-integer 'disabled)
158 "Same as @code{cpu-max-perf-on-ac} on BAT mode.")
159
160 (cpu-boost-on-ac?
161 (maybe-boolean 'disabled)
162 "Enable CPU turbo boost feature on AC mode.")
163
164 (cpu-boost-on-bat?
165 (maybe-boolean 'disabled)
166 "Same as @code{cpu-boost-on-ac?} on BAT mode.")
167
168 (sched-powersave-on-ac?
169 (boolean #f)
170 "Allow Linux kernel to minimize the number of CPU cores/hyper-threads
171used under light load conditions.")
172
173 (sched-powersave-on-bat?
174 (boolean #t)
175 "Same as @code{sched-powersave-on-ac?} but on BAT mode.")
176
177 (nmi-watchdog?
178 (boolean #f)
179 "Enable Linux kernel NMI watchdog.")
180
181 (phc-controls
182 (maybe-string 'disabled)
183 "For Linux kernels with PHC patch applied, change CPU voltages.
184An example value would be @samp{\"F:V F:V F:V F:V\"}.")
185
186 (energy-perf-policy-on-ac
187 (string "performance")
188 "Set CPU performance versus energy saving policy on AC. Alternatives are
189performance, normal, powersave.")
190
191 (energy-perf-policy-on-bat
192 (string "powersave")
193 "Same as @code{energy-perf-policy-ac} but on BAT mode.")
194
195 (disks-devices
196 (space-separated-string-list '("sda"))
197 "Hard disk devices.")
198
199 (disk-apm-level-on-ac
200 (space-separated-string-list '("254" "254"))
201 "Hard disk advanced power management level.")
202
203 (disk-apm-level-on-bat
204 (space-separated-string-list '("128" "128"))
205 "Same as @code{disk-apm-bat} but on BAT mode.")
206
207 (disk-spindown-timeout-on-ac
208 (maybe-space-separated-string-list 'disabled)
209 "Hard disk spin down timeout. One value has to be specified for
210each declared hard disk.")
211
212 (disk-spindown-timeout-on-bat
213 (maybe-space-separated-string-list 'disabled)
214 "Same as @code{disk-spindown-timeout-on-ac} but on BAT mode.")
215
216 (disk-iosched
217 (maybe-space-separated-string-list 'disabled)
218 "Select IO scheduler for disk devices. One value has to be specified
219for each declared hard disk. Example alternatives are cfq, deadline and noop.")
220
221 (sata-linkpwr-on-ac
222 (string "max_performance")
223 "SATA aggressive link power management (ALPM) level. Alternatives are
224min_power, medium_power, max_performance.")
225
226 (sata-linkpwr-on-bat
227 (string "min_power")
228 "Same as @code{sata-linkpwr-ac} but on BAT mode.")
229
230 (sata-linkpwr-blacklist
231 (maybe-string 'disabled)
232 "Exclude specified SATA host devices for link power management.")
233
234 (ahci-runtime-pm-on-ac?
235 (maybe-on-off-boolean 'disabled)
236 "Enable Runtime Power Management for AHCI controller and disks
237on AC mode.")
238
239 (ahci-runtime-pm-on-bat?
240 (maybe-on-off-boolean 'disabled)
241 "Same as @code{ahci-runtime-pm-on-ac} on BAT mode.")
242
243 (ahci-runtime-pm-timeout
244 (non-negative-integer 15)
245 "Seconds of inactivity before disk is suspended.")
246
247 (pcie-aspm-on-ac
248 (string "performance")
249 "PCI Express Active State Power Management level. Alternatives are
250default, performance, powersave.")
251
252 (pcie-aspm-on-bat
253 (string "powersave")
254 "Same as @code{pcie-aspm-ac} but on BAT mode.")
255
256 (radeon-power-profile-on-ac
257 (string "high")
258 "Radeon graphics clock speed level. Alternatives are
259low, mid, high, auto, default.")
260
261 (radeon-power-profile-on-bat
262 (string "low")
263 "Same as @code{radeon-power-ac} but on BAT mode.")
264
265 (radeon-dpm-state-on-ac
266 (string "performance")
267 "Radeon dynamic power management method (DPM). Alternatives are
268battery, performance.")
269
270 (radeon-dpm-state-on-bat
271 (string "battery")
272 "Same as @code{radeon-dpm-state-ac} but on BAT mode.")
273
274 (radeon-dpm-perf-level-on-ac
275 (string "auto")
276 "Radeon DPM performance level. Alternatives are
277auto, low, high.")
278
279 (radeon-dpm-perf-level-on-bat
280 (string "auto")
281 "Same as @code{radeon-dpm-perf-ac} but on BAT mode.")
282
283 (wifi-pwr-on-ac?
284 (on-off-boolean #f)
285 "Wifi power saving mode.")
286
287 (wifi-pwr-on-bat?
288 (on-off-boolean #t)
289 "Same as @code{wifi-power-ac?} but on BAT mode.")
290
291 (wol-disable?
292 (y-n-boolean #t)
293 "Disable wake on LAN.")
294
295 (sound-power-save-on-ac
296 (non-negative-integer 0)
297 "Timeout duration in seconds before activating audio power saving
298 on Intel HDA and AC97 devices. A value of 0 disables power saving.")
299
300 (sound-power-save-on-bat
301 (non-negative-integer 1)
302 "Same as @code{sound-powersave-ac} but on BAT mode.")
303
304 (sound-power-save-controller?
305 (y-n-boolean #t)
306 "Disable controller in powersaving mode on Intel HDA devices.")
307
308 (bay-poweroff-on-bat?
309 (boolean #f)
310 "Enable optical drive in UltraBay/MediaBay on BAT mode.
311Drive can be powered on again by releasing (and reinserting) the eject lever
312or by pressing the disc eject button on newer models.")
313
314 (bay-device
315 (string "sr0")
316 "Name of the optical drive device to power off.")
317
318 (runtime-pm-on-ac
319 (string "on")
320 "Runtime Power Management for PCI(e) bus devices. Alternatives are
321on and auto.")
322
323 (runtime-pm-on-bat
324 (string "auto")
325 "Same as @code{runtime-pm-ac} but on BAT mode.")
326
327 (runtime-pm-all?
328 (boolean #t)
329 "Runtime Power Management for all PCI(e) bus devices, except
330blacklisted ones.")
331
332 (runtime-pm-blacklist
333 (maybe-space-separated-string-list 'disabled)
9fc221b5 334 "Exclude specified PCI(e) device addresses from Runtime Power Management.")
bfbf6e1e
MO
335
336 (runtime-pm-driver-blacklist
337 (space-separated-string-list '("radeon" "nouveau"))
338 "Exclude PCI(e) devices assigned to the specified drivers from
339Runtime Power Management.")
340
341 (usb-autosuspend?
342 (boolean #t)
343 "Enable USB autosuspend feature.")
344
345 (usb-blacklist
346 (maybe-string 'disabled)
347 "Exclude specified devices from USB autosuspend.")
348
349 (usb-blacklist-wwan?
350 (boolean #t)
351 "Exclude WWAN devices from USB autosuspend.")
352
353 (usb-whitelist
354 (maybe-string 'disabled)
355 "Include specified devices into USB autosuspend, even if they are
356already excluded by the driver or via @code{usb-blacklist-wwan?}.")
357
358 (usb-autosuspend-disable-on-shutdown?
359 (maybe-boolean 'disabled)
360 "Enable USB autosuspend before shutdown.")
361
362 (restore-device-state-on-startup?
363 (boolean #f)
364 "Restore radio device state (bluetooth, wifi, wwan) from previous
365shutdown on system startup."))
366
367
368(define (tlp-shepherd-service config)
369 (let* ((tlp-bin (file-append
370 (tlp-configuration-tlp config) "/bin/tlp"))
371 (tlp-action (lambda args
372 #~(lambda _
373 (zero? (system* #$tlp-bin #$@args))))))
374 (list (shepherd-service
375 (documentation "Run TLP script.")
376 (provision '(tlp))
377 (requirement '(user-processes))
378 (start (tlp-action "init" "start"))
379 (stop (tlp-action "init" "stop"))))))
380
381(define (tlp-activation config)
382 (let* ((config-str (with-output-to-string
383 (lambda ()
384 (serialize-configuration
385 config
386 tlp-configuration-fields))))
387 (config-file (plain-file "tlp" config-str)))
388 (with-imported-modules '((guix build utils))
389 #~(begin
390 (use-modules (guix build utils))
8a890f3c 391 (copy-file #$config-file "/etc/tlp.conf")))))
bfbf6e1e
MO
392
393(define tlp-service-type
394 (service-type
395 (name 'tlp)
396 (extensions
397 (list
398 (service-extension shepherd-root-service-type
399 tlp-shepherd-service)
400 (service-extension udev-service-type
401 (compose list tlp-configuration-tlp))
402 (service-extension activation-service-type
3d3c5650 403 tlp-activation)))
94b98ef7
LC
404 (default-value (tlp-configuration))
405 (description "Run TLP, a power management tool.")))
bfbf6e1e
MO
406
407(define (generate-tlp-documentation)
408 (generate-documentation
409 `((tlp-configuration ,tlp-configuration-fields))
410 'tlp-configuration))
d7fa39cc
CAW
411
412\f
413
414;;;
415;;; thermald
416;;;
417;;; This service implements cpu scaling. Helps prevent overheating!
418
419(define-record-type* <thermald-configuration>
420 thermald-configuration make-thermald-configuration
421 thermald-configuration?
422 (ignore-cpuid-check? thermald-ignore-cpuid-check? ;boolean
423 (default #f))
424 (thermald thermald-thermald ;package
425 (default thermald)))
426
427(define (thermald-shepherd-service config)
428 (list
429 (shepherd-service
430 (provision '(thermald))
431 (documentation "Run thermald cpu frequency scaling.")
432 (start #~(make-forkexec-constructor
433 '(#$(file-append (thermald-thermald config) "/sbin/thermald")
434 "--no-daemon"
435 #$@(if (thermald-ignore-cpuid-check? config)
436 '("--ignore-cpuid-check")
437 '()))))
438 (stop #~(make-kill-destructor)))))
439
440(define thermald-service-type
441 (service-type
442 (name 'thermald)
443 (extensions (list (service-extension shepherd-root-service-type
444 thermald-shepherd-service)))
94b98ef7
LC
445 (default-value (thermald-configuration))
446 (description "Run thermald, a CPU frequency scaling service that helps
447prevent overheating.")))