diff options
author | Ludovic Courtès <ludo@gnu.org> | 2022-11-03 17:57:51 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-11-15 12:16:43 +0100 |
commit | 514fedbf3966b7fbab31a6c63b4210ec8b5b0c9a (patch) | |
tree | a52de4c819000a1f8507567f4f43eebdc0fab63a /gnu/installer/hardware.scm | |
parent | 6b39c3afccbc2fa91746f379f46f6acfa47c8f62 (diff) |
installer: Report known-unsupported PCI devices.
* gnu/installer/hardware.scm: New file.
* gnu/local.mk (INSTALLER_MODULES): Add it.
* po/guix/POTFILES.in: Add it.
* gnu/installer.scm (installer-steps): Pass #:pci-database to the
'welcome' step procedure.
* gnu/installer/newt.scm (welcome-page): Add #:pci-database and pass it
to 'run-welcome-page'.
* gnu/installer/newt/welcome.scm (check-hardware-support): Add #:pci-database.
Enumerate unsupported PCI devices and run an error page when unsupported
devices are found.
(run-welcome-page): Add #:pci-database and pass it to
'check-hardware-support' and to the recursive call.
* gnu/installer/record.scm (<installer>)[welcome-page]: Adjust comment.
* doc/guix.texi (Hardware Considerations): Mention it.
Diffstat (limited to 'gnu/installer/hardware.scm')
-rw-r--r-- | gnu/installer/hardware.scm | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/gnu/installer/hardware.scm b/gnu/installer/hardware.scm new file mode 100644 index 0000000000..cd1a1767d8 --- /dev/null +++ b/gnu/installer/hardware.scm @@ -0,0 +1,90 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2022 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu installer hardware) + #:use-module (gnu build linux-modules) + #:use-module (guix i18n) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-71) + #:export (unsupported-pci-device? + pci-device-description)) + +(define %unsupported-linux-modules + ;; List of Linux modules that are useless without non-free firmware. + ;; + ;; Currently only drivers for PCI devices are listed. USB devices such as + ;; "btintel" would require support to list USB devices and read the USB + ;; device ID database. Punt for now as this is usually less critical. + ;; + ;; This list is currently manually maintained based on information on + ;; non-free firmware available from + ;; <https://packages.debian.org/search?keywords=firmware&searchon=names&suite=stable§ion=all>. + '(;; WiFi. + "brcmfmac" + "ipw2100" + "ipw2200" + "iwlwifi" + "mwl8k" + "rtl8188ee" + "rtl818x_pci" + "rtl8192ce" + "rtl8192de" + "rtl8192ee" + + ;; Ethernet. + "bnx2" + "bnx2x" + "liquidio" + + ;; Graphics. + "amdgpu" + "radeon" + + ;; Multimedia. + "ivtv")) + +(define unsupported-pci-device? + ;; Arrange to load the module alias database only once. + (let ((aliases (delay (known-module-aliases)))) + (lambda (device) + "Return true if DEVICE is known to not be supported by free software." + (any (lambda (module) + (member module %unsupported-linux-modules)) + (matching-modules (pci-device-module-alias device) + (force aliases)))))) + +(define (pci-device-description pci-database) + "Return a procedure that, given a PCI device, returns a string describing +it." + (define (with-fallback lookup) + (lambda (vendor-id id) + (let ((vendor name (lookup vendor-id id))) + (values (or vendor (number->string vendor-id 16)) + (or name (number->string id 16)))))) + + (define pci-lookup + (with-fallback (load-pci-device-database pci-database))) + + (lambda (device) + (let ((vendor name (pci-lookup (pci-device-vendor device) + (pci-device-id device)))) + (if (network-pci-device? device) + ;; TRANSLATORS: The two placeholders are the manufacturer + ;; and name of a PCI device. + (format #f (G_ "~a ~a (networking device)") + vendor name) + (string-append vendor " " name))))) |