Subject: installer: Support uvesafb to install on machines without KMS.
From: "pelzflorian (Florian Pelz)" <[email-masked]>
To: [email-masked]
Date: Fri, 10 Apr 2020 14:54:47 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

uvesafb should be run in the Guix System installer image so the GUI
installer can be used on more systems, including AMD GPU systems.

uvesafb is needed to support systems that otherwise need nonfree
firmware or drivers (many current and older AMD GPUs as well as old
machines like Uniwill U50SI1 with Silicon Integrated Systems GPU). I
attach a patch I made previously at
<https://lists.gnu.org/archive/html/guix-patches/2020-04/msg00226.html>
(plus proper indentation and copyright statement).  I believe it could
be included in the installer even though it is a little hacky.

Note that the installed system will need uvesafb (or nonfree firmware)
too, so the patch alone won’t make these systems work out of the box.
But these things are easier to setup when the system can be installed
via the GUI installer.  I wrote the same about the issue previously at
<https://lists.gnu.org/archive/html/guix-devel/2020-03/msg00350.html>.

On some machines uvesafb still requires to add a kernel parameter
nomodeset (or sometimes possibly vga=793 or something; nomodeset was
enough on tested machines, some machines don’t need nomodeset).

In my testing so far uvesafb did not cause any trouble on systems that
don’t need it.  I have not tested non-x86 systems and just hope the
code won’t break those.

When the dust has settled on the kernel-module-configuration-service
discussed by Brice Waegeneire and Danny Milosavljevic
<https://lists.gnu.org/archive/html/guix-patches/2020-04/msg00272.html>,
a proper uvesafb service can be added.  Then I can make and test one
and it could also be used in the installer.  That would be the clean
solution.  In particular, it could detect the resolution to use for
uvesafb automatically by running the attached code testvbe.scm as
root.  But how to run that code depends on the
kernel-module-configuration-service if/when it exists.  (I did not
know how to extend etc-service-type with a file created at runtime not
build time, but maybe kernel-module-configuration-service works
differently anyway.)

On Fri, Apr 10, 2020 at 12:38:05PM +0200, Ludovic Courtès wrote:
<https://lists.gnu.org/archive/html/guix-devel/2020-04/msg00187.html>
> "pelzflorian (Florian Pelz)" <[email-masked]> skribis:
> > On an Acer Aspire 5738PG with ATI Mobility Radeon HD 4570 the
> > installer remains black.  I pressed ctrl-alt-f3 and typed
> >
> > modprobe uvesafb v86d=$(guix build v86d | head -n1)/sbin/v86d mode_option=1024x768
> 
> Could we come up with a udev rule or a modprobe.d snippet so that this
> happens automatically?
> 
> I found things like:
> 
>   https://bbs.archlinux.org/viewtopic.php?id=165480
> 
> Or should we give up on v86d like Gentoo:
> 
>   https://wiki.gentoo.org/wiki/Uvesafb
> 
> ?
> 
> (Perhaps this is best discussed in a specific issue on bug-guix.)

I believe uvesafb can easily be supported on Guix System via
kernel-module-loader-service/configuration-service.

Regards,
Florian
From de24448076379a1792a7e1031471d5ae33c8c440 Mon Sep 17 00:00:00 2001
From: Florian Pelz <[email-masked]>
Date: Fri, 10 Apr 2020 14:35:38 +0200
Subject: [PATCH] installer: Load uvesafb kernel module.

This enables the installer to display when no Kernel Mode Setting is available
(e.g. many AMD GPUs, old SIS GPUs).

* gnu/system/install.scm (%installation-services): Add kernel-module-loader
service for loading uvesafb.
---
 gnu/system/install.scm | 231 ++++++++++++++++++++++-------------------
 1 file changed, 126 insertions(+), 105 deletions(-)

diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index c15c2c7814..d9fc0a6941 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016 Andreas Enge <[email-masked]>
 ;;; Copyright © 2017 Marius Bakke <[email-masked]>
 ;;; Copyright © 2017, 2019 Tobias Geerinckx-Rice <[email-masked]>
+;;; Copyright © 2020 Florian Pelz <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,11 +27,13 @@
   #:use-module (gnu bootloader u-boot)
   #:use-module (guix gexp)
   #:use-module (guix store)
+  #:use-module (guix utils)
   #:use-module (guix monads)
   #:use-module ((guix packages) #:select (package-version))
   #:use-module ((guix store) #:select (%store-prefix))
   #:use-module (gnu installer)
   #:use-module (gnu services dbus)
+  #:use-module (gnu services linux)
   #:use-module (gnu services networking)
   #:use-module (gnu services shepherd)
   #:use-module (gnu services ssh)
@@ -50,6 +53,7 @@
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages nvi)
+  #:use-module (gnu packages xorg)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-26)
   #:export (installation-os
@@ -304,111 +308,128 @@ Access documentation at any time by pressing Alt-F2.\x1b[0m
     (define bare-bones-os
       (load "examples/bare-bones.tmpl"))
 
-    (list (service virtual-terminal-service-type)
-
-          (service kmscon-service-type
-                   (kmscon-configuration
-                    (virtual-terminal "tty1")
-                    (login-program (installer-program))))
-
-          (login-service (login-configuration
-                          (motd motd)))
-
-          ;; Documentation.  The manual is in UTF-8, but
-          ;; 'console-font-service' sets up Unicode support and loads a font
-          ;; with all the useful glyphs like em dash and quotation marks.
-          (service documentation-service-type "tty2")
-
-          ;; Documentation add-on.
-          %configuration-template-service
-
-          ;; A bunch of 'root' ttys.
-          (normal-tty "tty3")
-          (normal-tty "tty4")
-          (normal-tty "tty5")
-          (normal-tty "tty6")
-
-          ;; The usual services.
-          (syslog-service)
-
-          ;; The build daemon.  Register the default substitute server key(s)
-          ;; as trusted to allow the installation process to use substitutes by
-          ;; default.
-          (service guix-service-type
-                   (guix-configuration (authorize-key? #t)))
-
-          ;; Start udev so that useful device nodes are available.
-          ;; Use device-mapper rules for cryptsetup & co; enable the CRDA for
-          ;; regulations-compliant WiFi access.
-          (udev-service #:rules (list lvm2 crda))
-
-          ;; Add the 'cow-store' service, which users have to start manually
-          ;; since it takes the installation directory as an argument.
-          (cow-store-service)
-
-          ;; Install Unicode support and a suitable font.
-          (service console-font-service-type
-                   (map (match-lambda
-                          ("tty2"
-                           ;; Use a font that contains characters such as
-                           ;; curly quotes as found in the manual.
-                           '("tty2" . "LatGrkCyr-8x16"))
-                          (tty
-                           ;; Use a font that doesn't have more than 256
-                           ;; glyphs so that we can use colors with varying
-                           ;; brightness levels (see note in setfont(8)).
-                           `(,tty . "lat9u-16")))
-                        '("tty1" "tty2" "tty3" "tty4" "tty5" "tty6")))
-
-          ;; To facilitate copy/paste.
-          (service gpm-service-type)
-
-          ;; Add an SSH server to facilitate remote installs.
-          (service openssh-service-type
-                   (openssh-configuration
-                    (port-number 22)
-                    (permit-root-login #t)
-                    ;; The root account is passwordless, so make sure
-                    ;; a password is set before allowing logins.
-                    (allow-empty-passwords? #f)
-                    (password-authentication? #t)
-
-                    ;; Don't start it upfront.
-                    (%auto-start? #f)))
-
-          ;; Since this is running on a USB stick with a overlayfs as the root
-          ;; file system, use an appropriate cache configuration.
-          (nscd-service (nscd-configuration
-                         (caches %nscd-minimal-caches)))
-
-          ;; Having /bin/sh is a good idea.  In particular it allows Tramp
-          ;; connections to this system to work.
-          (service special-files-service-type
-                   `(("/bin/sh" ,(file-append (canonical-package bash)
-                                              "/bin/sh"))))
-
-          ;; Loopback device, needed by OpenSSH notably.
-          (service static-networking-service-type
-                   (list (static-networking (interface "lo")
-                                            (ip "127.0.0.1")
-                                            (requirement '())
-                                            (provision '(loopback)))))
-
-          (service wpa-supplicant-service-type)
-          (dbus-service)
-          (service connman-service-type
-                   (connman-configuration
-                    (disable-vpn? #t)))
-
-          ;; Keep a reference to BARE-BONES-OS to make sure it can be
-          ;; installed without downloading/building anything.  Also keep the
-          ;; things needed by 'profile-derivation' to minimize the amount of
-          ;; download.
-          (service gc-root-service-type
-                   (list bare-bones-os
-                         glibc-utf8-locales
-                         texinfo
-                         (canonical-package guile-2.2))))))
+    (cons*
+     (service virtual-terminal-service-type)
+
+     (service kmscon-service-type
+              (kmscon-configuration
+               (virtual-terminal "tty1")
+               (login-program (installer-program))))
+
+     (login-service (login-configuration
+                     (motd motd)))
+
+     ;; Documentation.  The manual is in UTF-8, but
+     ;; 'console-font-service' sets up Unicode support and loads a font
+     ;; with all the useful glyphs like em dash and quotation marks.
+     (service documentation-service-type "tty2")
+
+     ;; Documentation add-on.
+     %configuration-template-service
+
+     ;; A bunch of 'root' ttys.
+     (normal-tty "tty3")
+     (normal-tty "tty4")
+     (normal-tty "tty5")
+     (normal-tty "tty6")
+
+     ;; The usual services.
+     (syslog-service)
+
+     ;; The build daemon.  Register the default substitute server key(s)
+     ;; as trusted to allow the installation process to use substitutes by
+     ;; default.
+     (service guix-service-type
+              (guix-configuration (authorize-key? #t)))
+
+     ;; Start udev so that useful device nodes are available.
+     ;; Use device-mapper rules for cryptsetup & co; enable the CRDA for
+     ;; regulations-compliant WiFi access.
+     (udev-service #:rules (list lvm2 crda))
+
+     ;; Add the 'cow-store' service, which users have to start manually
+     ;; since it takes the installation directory as an argument.
+     (cow-store-service)
+
+     ;; Install Unicode support and a suitable font.
+     (service console-font-service-type
+              (map (match-lambda
+                    ("tty2"
+                     ;; Use a font that contains characters such as
+                     ;; curly quotes as found in the manual.
+                     '("tty2" . "LatGrkCyr-8x16"))
+                    (tty
+                     ;; Use a font that doesn't have more than 256
+                     ;; glyphs so that we can use colors with varying
+                     ;; brightness levels (see note in setfont(8)).
+                     `(,tty . "lat9u-16")))
+                   '("tty1" "tty2" "tty3" "tty4" "tty5" "tty6")))
+
+     ;; To facilitate copy/paste.
+     (service gpm-service-type)
+
+     ;; Add an SSH server to facilitate remote installs.
+     (service openssh-service-type
+              (openssh-configuration
+               (port-number 22)
+               (permit-root-login #t)
+               ;; The root account is passwordless, so make sure
+               ;; a password is set before allowing logins.
+               (allow-empty-passwords? #f)
+               (password-authentication? #t)
+
+               ;; Don't start it upfront.
+               (%auto-start? #f)))
+
+     ;; Since this is running on a USB stick with a overlayfs as the root
+     ;; file system, use an appropriate cache configuration.
+     (nscd-service (nscd-configuration
+                    (caches %nscd-minimal-caches)))
+
+     ;; Having /bin/sh is a good idea.  In particular it allows Tramp
+     ;; connections to this system to work.
+     (service special-files-service-type
+              `(("/bin/sh" ,(file-append (canonical-package bash)
+                                         "/bin/sh"))))
+
+     ;; Loopback device, needed by OpenSSH notably.
+     (service static-networking-service-type
+              (list (static-networking (interface "lo")
+                                       (ip "127.0.0.1")
+                                       (requirement '())
+                                       (provision '(loopback)))))
+
+     (service wpa-supplicant-service-type)
+     (dbus-service)
+     (service connman-service-type
+              (connman-configuration
+               (disable-vpn? #t)))
+
+     ;; Keep a reference to BARE-BONES-OS to make sure it can be
+     ;; installed without downloading/building anything.  Also keep the
+     ;; things needed by 'profile-derivation' to minimize the amount of
+     ;; download.
+     (service gc-root-service-type
+              (list bare-bones-os
+                    glibc-utf8-locales
+                    texinfo
+                    (canonical-package guile-2.2)))
+     (if (member (%current-system) '("x86_64-linux" "i686-linux"))
+         ;; Load uvesafb to show installer when no KMS is available.
+         `(,(service kernel-module-loader-service-type '("uvesafb"))
+           ,(let ((uvesafb-options
+                   #~(with-output-to-file #$output
+                       (lambda _
+                         (format #t
+                                 (string-join `("options" "uvesafb"
+                                                ,(string-append "v86d=" #$v86d
+                                                                "/sbin/v86d")
+                                                "mode_option=1024x768")))))))
+              (simple-service 'uvesafb-configuration etc-service-type
+                              (list `("modprobe.d/uvesafb.conf"
+                                      ,(computed-file "uvesafb-options"
+                                                      uvesafb-options))))))
+         '()))))
 
 (define %issue
   ;; Greeting.
-- 
2.26.0