Todo sabemos que el portátil Dell XPS 13 es una gran equipo. Además en algunos modelos incluye soporte para Ubuntu, así que parece que todo tendría que haber sido perfecto. Pero no ha sido así del todo. La primera versión de 2015 sí que da ciertos problemas de drivers cuando quieres usar otro Linux que no sea el oficial (véase Linux support for the Dell XPS 13 9343 en el blog de Major Hayden).
Si bien esos problemas se han ido solucionando conforme se actualizaba el núcleo de Linux, curiosamente ha quedado un bug relativo al sonido: en algunos modelos, no todos si no parece ser que únicamente los modelos con micro i7, en el modo de sonido I2S se introducen molestos clicks más audibles cuanto menor sea el volumen.
Puedes seguir en Bug 1188741 – No sound on Dell XPS 13 9343 (2015 model), pero al final la conclusión a la que vas a llegar es que la único solución es recompilar el núcleo para forzar el uso del estándar HDA en la tarjeta de sonido en vez del más nuevo I2S. Desafortunadamente no hay opción ni parámetro para eso. Sólo te queda recompilar e instalar una versión personalizada del núcleo, como explican de forma clara en la página de Arch Linux destinada a este equipo.
Por tanto, veamos cómo recompilar el núcleo en Fedora para forzar el modo HDA en tarjetas de sonido Realtek ALC3263. Si bien reconfigurar el núcleo es sencillo, compilarlo lleva mucho tiempo y recursos de CPU, así que escoge primero un equipo potente, con la mayor cantidad de núcleos y bien ventilado para no sobrecalentar demasiado la CPU.

1. Bajarse el código fuente

Uno de los mayores errores de novato es pensar que «bajarse» el núcleo quiere decir bajare el núcleo original de Linux, desde kernel.org. Nada más erróneo. El núcleo que usa cualquier distribución se basa en el núcleo original, pero fuertemente reconfigurado y parcheado. Lo que hay que hacer se bajarse el código fuente de tú distribución. Luego hacer los cambio necesarios para recompilarlo y obtener un núcleo compatible con el que viene por defecto en tu sistema.
En Fedora, la forma más cómoda de bajarse el código fuente de la última versión del núcleo es usar el propio comando dnf para bajarse el fichero SRPM con el código fuente y los parches de Fedora. Ejecutar (como usuario normal):

$ dnf download --source --destdir . kernel

En mi caso este comando bajó desde los repositorios de Fedora el fichero kernel-4.12.14-200.fc25.src.rpm, que será el que usemos como ejemplo. Es necesario descomprimir el fichero con el comando rpm. Antes de descomprimir el fichero podría ser necesario que movieras los directorios SPECS y SOURCES de $HOME/rpmbuild si tienes ahí ficheros que no quieres que se mezclen con los del núcleo.

rpm -U ./kernel-4.12.14-200.fc25.src.rpm

Esto descomprime:

  • kernel.spec$HOME/rpmbuild/SPECS
  • Resto (*.tar.gz, *.patch, etc.) → $HOME/rpmbuild/SOURCES

2. Modificar el proceso de compilación

Hay que editar el fichero kernel.spec en $HOME/rpmbuild/SPECS. Hay que introducir dos cambios:

  1. Cambiar el id de compilación para que el fichero RPM resultante no se llame igual que los originales de Fedora. Para ello localizamos la línea donde pone
    # define buildid .local

    y añadimos debajo

    %define buildid .local

    Puedes poner el nombre que quieras: .local, .hda, etc. Pero siempre empezando por un punto.

  2. Buscar la línea donde se ejecuta mrproper. Pone algo así:
    make -s mrproper
    cp configs/$Config .config

    e inserta debajo el texto sed -ri ‘s/# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not set/CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y/’ .config, de forma que el fichero queda así:

    make -s mrproper
    cp configs/$Config .config
    sed -ri 's/# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not set/CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y/' .config

3. Compilar el nuevo núcleo

El proceso de compilación creará un nuevo fichero RPM que podremos instalar en nuestro sistema. Para ello basta ejecutar el comando

rpmbuild -ba ./kernel.spec

y esperar unas cuentas horas, que dependerán de la potencia de tu equipo.
Tras una compilación exitosa, se crean los ficheros RPM binarios en $HOME/rpmbuild/RPMS/x86_64 y un nuevo fichero de fuentes en $HOME/rpmbuild/SRPMS/kernel-4.12.14-200.local.fc25.src.rpm. Este último fichero no lo necesitamos puesto que no es más que un reempaquetado del que nos bajamos con nuestro fichero kernel.spec.

4. Instalar el núcleo

Antes de instalar los ficheros binarios, conviene ver qué ficheros del núcleo tenemos instalados actualmente:

dnf list installed | grep kernel
kernel.x86_64                4.12.14-200.fc25           @updates
kernel-core.x86_64           4.12.14-200.fc25           @updates
kernel-devel.x86_64          4.12.14-200.fc25           @updates
kernel-headers.x86_64        4.12.14-200.fc25           @updates
kernel-modules.x86_64        4.12.14-200.fc25           @updates
kernel-modules-extra.x86_64  4.12.14-200.fc25           @updates

A partir de ahí instalamos primero el núcleo:

sudo dnf install \
 ./kernel-4.12.14-200.local.fc25.x86_64.rpm \
 ./kernel-core-4.12.14-200.local.fc25.x86_64.rpm \
 ./kernel-modules-4.12.14-200.local.fc25.x86_64.rpm  \
 ./kernel-modules-extra-4.12.14-200.local.fc25.x86_64.rpm

Y luego, si como en mi caso fuesen necesarios, los ficheros de desarrollo:

sudo dnf install \
 ./kernel-devel-4.12.14-200.local.fc25.x86_64.rpm \
 ./kernel-headers-4.12.14-200.local.fc25.x86_64.rpm

Para probar el núcleo es necesario reiniciar en frío, apagando completamente el equipo dos veces.

5. Salvar el núcleo como el favorito para el arranque

Esta operación debe realizarse como administrador. Hay que editar el fichero /boot/efi/EFI/fedora/grubenv y añadir al principio del fichero la línea

saved_entry=Fedora (4.12.14-200.local.fc25.x86_64) 24 (Workstation Edition)

El contenido de la línea debe ser el mismo que se muestra por pantalla en el momento del arranque. Si no quieres equivocarte en su contenido puedes copiar y pegar la entrada de menú desde el fichero /boot/efi/EFI/fedora/grub.cfg
Opcionalmente, puedes plantearte impedir la sustitución del núcleo en futuras actualizaciones del sistema, tal y como describo en Forzar en Fedora la no sustitución de una versión del kernel de Linux.