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.
This commit is contained in:
Ludovic Courtès 2022-11-03 17:57:51 +01:00
parent 6b39c3afcc
commit 514fedbf39
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
8 changed files with 134 additions and 11 deletions

View file

@ -2234,6 +2234,9 @@ Linux-libre driver. Free firmware exists for both and is available
out-of-the-box on Guix System, as part of @code{%base-firmware} out-of-the-box on Guix System, as part of @code{%base-firmware}
(@pxref{operating-system Reference, @code{firmware}}). (@pxref{operating-system Reference, @code{firmware}}).
The installer warns you early on if it detects devices that are known
@emph{not} to work due to the lack of free firmware or free drivers.
@cindex RYF, Respects Your Freedom @cindex RYF, Respects Your Freedom
The @uref{https://www.fsf.org/, Free Software Foundation} runs The @uref{https://www.fsf.org/, Free Software Foundation} runs
@uref{https://www.fsf.org/ryf, @dfn{Respects Your Freedom}} (RYF), a @uref{https://www.fsf.org/ryf, @dfn{Respects Your Freedom}} (RYF), a

View file

@ -46,6 +46,7 @@ (define-module (gnu installer)
#:use-module (gnu packages nano) #:use-module (gnu packages nano)
#:use-module (gnu packages ncurses) #:use-module (gnu packages ncurses)
#:use-module (gnu packages package-management) #:use-module (gnu packages package-management)
#:use-module (gnu packages pciutils)
#:use-module (gnu packages tls) #:use-module (gnu packages tls)
#:use-module (gnu packages xorg) #:use-module (gnu packages xorg)
#:use-module (gnu system locale) #:use-module (gnu system locale)
@ -226,7 +227,9 @@ (define (installer-steps)
(id 'welcome) (id 'welcome)
(compute (lambda _ (compute (lambda _
((installer-welcome-page current-installer) ((installer-welcome-page current-installer)
#$(local-file "installer/aux-files/logo.txt"))))) #$(local-file "installer/aux-files/logo.txt")
#:pci-database
#$(file-append pciutils "/share/hwdata/pci.ids.gz")))))
;; Ask the user to select a timezone under glibc format. ;; Ask the user to select a timezone under glibc format.
(installer-step (installer-step
@ -358,6 +361,7 @@ (define installer-builder
(with-extensions (list guile-gcrypt guile-newt (with-extensions (list guile-gcrypt guile-newt
guile-parted guile-bytestructures guile-parted guile-bytestructures
guile-json-3 guile-git guile-webutils guile-json-3 guile-git guile-webutils
guile-zlib ;for (gnu build linux-modules)
(current-guix) gnutls) (current-guix) gnutls)
(with-imported-modules `(,@(source-module-closure (with-imported-modules `(,@(source-module-closure
`(,@modules `(,@modules

View file

@ -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&section=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)))))

View file

@ -172,8 +172,8 @@ (define* (locale-page #:key
(define (timezone-page zonetab) (define (timezone-page zonetab)
(run-timezone-page zonetab)) (run-timezone-page zonetab))
(define (welcome-page logo) (define* (welcome-page logo #:key pci-database)
(run-welcome-page logo)) (run-welcome-page logo #:pci-database pci-database))
(define (menu-page steps) (define (menu-page steps)
(run-menu-page steps)) (run-menu-page steps))

View file

@ -19,8 +19,10 @@
(define-module (gnu installer newt welcome) (define-module (gnu installer newt welcome)
#:use-module ((gnu build linux-modules) #:use-module ((gnu build linux-modules)
#:select (modules-loaded)) #:select (modules-loaded
pci-devices))
#:use-module (gnu installer dump) #:use-module (gnu installer dump)
#:use-module (gnu installer hardware)
#:use-module (gnu installer steps) #:use-module (gnu installer steps)
#:use-module (gnu installer utils) #:use-module (gnu installer utils)
#:use-module (gnu installer newt page) #:use-module (gnu installer newt page)
@ -30,6 +32,8 @@ (define-module (gnu installer newt welcome)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-34) #:use-module (srfi srfi-34)
#:use-module (srfi srfi-35) #:use-module (srfi srfi-35)
#:use-module (srfi srfi-71)
#:use-module (ice-9 format)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 receive) #:use-module (ice-9 receive)
#:use-module (newt) #:use-module (newt)
@ -121,7 +125,7 @@ (define (choice->item str)
(lambda () (lambda ()
(destroy-form-and-pop form)))))) (destroy-form-and-pop form))))))
(define (check-hardware-support) (define (check-hardware-support pci-database)
"Warn about unsupported devices." "Warn about unsupported devices."
(when (member "uvesafb" (modules-loaded)) (when (member "uvesafb" (modules-loaded))
(run-error-page (G_ "\ (run-error-page (G_ "\
@ -129,9 +133,28 @@ (define (check-hardware-support)
work well with only free software. Expect trouble. If after installation, work well with only free software. Expect trouble. If after installation,
the system does not boot, perhaps you will need to add nomodeset to the the system does not boot, perhaps you will need to add nomodeset to the
kernel arguments and need to configure the uvesafb kernel module.") kernel arguments and need to configure the uvesafb kernel module.")
(G_ "Pre-install warning")))) (G_ "Pre-install warning")))
(define (run-welcome-page logo) (let ((devices (pci-devices)))
(match (filter unsupported-pci-device? devices)
(() ;no unsupported device
#t)
(unsupported
(run-error-page (format #f (G_ "\
Devices not supported by free software were found on your computer:
~{ - ~a~%~}
Unfortunately, it means those devices will not be usable.
To address it, we recommend choosing hardware that respects your freedom as a \
user--hardware for which free drivers and firmware exist. See \"Hardware \
Considerations\" in the manual for more information.")
(map (pci-device-description pci-database)
unsupported))
(G_ "Hardware support warning")
#:width 76)))))
(define* (run-welcome-page logo #:key pci-database)
"Run a welcome page with the given textual LOGO displayed at the center of "Run a welcome page with the given textual LOGO displayed at the center of
the page. Ask the user to choose between manual installation, graphical the page. Ask the user to choose between manual installation, graphical
installation and reboot." installation and reboot."
@ -161,15 +184,16 @@ (define (run-welcome-page logo)
#:listbox-items #:listbox-items
`((,(G_ "Graphical install using a terminal based interface") `((,(G_ "Graphical install using a terminal based interface")
. .
,check-hardware-support) ,(lambda ()
(check-hardware-support pci-database)))
(,(G_ "Install using the shell based process") (,(G_ "Install using the shell based process")
. .
,(lambda () ,(lambda ()
(check-hardware-support) (check-hardware-support pci-database)
;; Switch to TTY3, where a root shell is available for shell based ;; Switch to TTY3, where a root shell is available for shell based
;; install. The other root TTY's would have been ok too. ;; install. The other root TTY's would have been ok too.
(system* "chvt" "3") (system* "chvt" "3")
(run-welcome-page logo))) (run-welcome-page logo #:pci-database pci-database)))
(,(G_ "Reboot") (,(G_ "Reboot")
. .
,(lambda () ,(lambda ()

View file

@ -89,7 +89,7 @@ (define-record-type* <installer>
(partition-page installer-partition-page) (partition-page installer-partition-page)
;; procedure void -> void ;; procedure void -> void
(services-page installer-services-page) (services-page installer-services-page)
;; procedure (logo) -> void ;; procedure (logo #:pci-database) -> void
(welcome-page installer-welcome-page) (welcome-page installer-welcome-page)
;; procedure (menu-proc) -> void ;; procedure (menu-proc) -> void
(parameters-menu installer-parameters-menu) (parameters-menu installer-parameters-menu)

View file

@ -787,6 +787,7 @@ INSTALLER_MODULES = \
%D%/installer/connman.scm \ %D%/installer/connman.scm \
%D%/installer/dump.scm \ %D%/installer/dump.scm \
%D%/installer/final.scm \ %D%/installer/final.scm \
%D%/installer/hardware.scm \
%D%/installer/hostname.scm \ %D%/installer/hostname.scm \
%D%/installer/keymap.scm \ %D%/installer/keymap.scm \
%D%/installer/locale.scm \ %D%/installer/locale.scm \

View file

@ -30,6 +30,7 @@ guix/import/pypi.scm
guix/import/texlive.scm guix/import/texlive.scm
gnu/installer.scm gnu/installer.scm
gnu/installer/connman.scm gnu/installer/connman.scm
gnu/installer/hardware.scm
gnu/installer/hostname.scm gnu/installer/hostname.scm
gnu/installer/keymap.scm gnu/installer/keymap.scm
gnu/installer/locale.scm gnu/installer/locale.scm