Usar tarjeta intel integrada en Debian Unstable para MacBook Pro 6,2

Introducción

Hace días que quería ponerme con esto. Ya había hecho algún tanteo pero parecía que el soporte no era del todo fiable. MacBook Pro 6,2 así como otros modelos de MacBook Pro tienen dos tarjetas de video. Una tarjeta de video es la de bajos recursos (en mi caso Intel) que es la que se emplea de normal. Para trabajar con aplicaciones que usan 3D se pasa el control a la tarjeta de video dedicada de altos recursos (en mi caso Nvidia).

Cuándo te pones con un  macintel (Tiene un procesador Intel en lugar de los powerpc que iban en macs más antiguos), y sobre todo, viniendo de mac, pues eliges, (o más bien no lo sabes) la manera de arrancar con: Emulación de BIOS.

Esto significa que la EFI (algo así como una BIOS renovada, recordemos que la BIOS es del 81 o antes) emula una BIOS estándar de cara a los sistemas operativos para poder usar S.O. que no lo soporten como puede ser Windows (en algunas versiones) y Gnu/Linux (en algunas versiones o configuraciones).

Por de pronto en mi caso te enteras que hay que usar el arranque con emulación de BIOS porque es la única manera en que funcione el driver privativo de Nvidia (para sacarle todo el rendimiento a la tarjeta). Ahora mismo juraría (con mi configuración) que sí se puede usar pero no lo he probado.

Configuración utópica

La configuración utópica es la que podríamos usar con equipos en qué bumblebee funcione correctamente. Es decir, uno arranca con la tarjeta de video de bajos recursos y con un comando especial, optirun, las aplicaciones 3D para que empleen la tarjeta de video de altos recursos.

Si se quiere se puede prescindir totalmente de la tarjeta de vídeo de bajos recursos y pasar a la de altos recursos, aunque eso requiera de tener que parar las X y volverlas a arrancar a día de hoy.

La gracia es que no sólo no puedes pasar de una tarjeta de video a otra si no que encima puedes apagarlas de esa manera la batería no se resiente.

Esta configuración utópica se puede conseguir ahora mismo en Ubuntu 12.04. Se supone que yo también lo podré conseguir instalándome a mano (portando si necesario a Debian, bueno, no, que hay un repositorio) los paquetes de bumblebee.

Os doy un par de enlaces para los que no estéis interesados en Debian pero sí en Ubuntu y derivadas:

Apple Macbook Pro and Linux Hybrid Graphics — current status

Gmux Scripts – Git documentation

Y no hay que olvidar un par de vídeos sobre este tema:

Una demo completa de cómo se cambian entre las tarjetas de vídeo, bumblebee, nouveau y nvidia:

Y un ejemplo de uso de bumblebee:

Mi configuración actual

Hay un par de detalles curiosos sobre mi configuración. Ahora mismo tengo dos instalaciones idénticas de Debian Unstable (de hace dos semanas) prácticamente idénticas. Una tiene los cambios que os voy a describir y la otra no.

La gracia es que una de ellas la puedo cargar con emulación de BIOS y puedo trabajar con la tarjeta de altos recursos como siempre y, bueno, consumirá más, el ventilador se usará un montón, pero como llevo mucho tiempo con esa configuración, sé qué funciona. Bueno, quitando cuando la tarjeta nvidia se cuelga (se ve que son unos flaws y bueno, ya sabéis, entre Apple y Nvidia se echan la culpa).

Creo que con los drives nouveau no se me ha colgado ni una vez (he tenido tiempo de probarlos con estas pruebas) aunque al hacer scrolling de páginas webs hay unos artefactos incómodos.

Entonces, pues eso por un lado, vía la tradicional emulación de BIOS, la partición de tipo bios-grub, cargamos el Debian de la partición sda5 y tengo la configuración con nvidia.

Por otro lado, arranco un grub basado en EFI, activo la tarjeta de vídeo de bajos recursos y desactivo la tarjeta de vídeo de altos recursos, cargamos del Debian de la partición  sda6 y la batería se me dobla de 2 horas máximo a 4 horas máximo. (Sí, tengo pendiente mejorar este tema con powertop y demás. De momento no me preocupa.).

Arranque via EFI

Lo primero que necesitamos es arrancar por EFI en lugar de por emulación de BIOS aunque, en mi caso, al tener dos particiones puedo tener las dos opciones.

Detección arquitectura EFI

Yo diría que todas las EFI ahora ya deben ser de 64bit pero más vale ser precavido. Ahora necesitaremos a nuestro Mac OS X que espero aún conservéis instalado. Por lo visto a parte de para detectar la arquitectura EFI también sirve para poder aplicar actualizaciones del firmware de EFI.

Arrancamos en él y arrancamos una terminal. En ella escribiremos:

ioreg -l -p IODeviceTree | grep firmware-abi

Si el resultado es:

EFI32

entonces es que se está empleando un firmware de EFI de arquitectura:

32-bit (i386) EFI

.

Si el resultado es:

EFI64

entonces es que se está empleando un firmware de EFI de arquitectura:

64-bit (x86_64) EFI

.

En mi caso fue EFI64.

Preparar partición efi en sistema

Para que todo esto funcione necesitamos la partición efi montada en nuestro sistema.

En primer lugar crearemos el directorio /boot/efi con:

mkdir /boot/efi

.
A continuación editaremos el fichero:

/etc/fstab

(en mi caso la partición efi está en sda1 y es de tipo FAT32). Añadiremos la línea:

/dev/sda1       /boot/efi       vfat    defaults        0       0

.
Guardamos el fichero y para aplicar el montaje haremos:

mount -a

.

Instalar paquete Grub2 basado en amd64

Aquí podemos perder el arranque basado en emulación de bios. Así que si como en mi caso tenéis Debian instalado en dos particiones independientes os aconsejo que la otra (no esta que empleais para el tema efi / tarjeta de video de bajos recursos ) haga un:

grub-install /dev/sda

para que arranque por defecto con ella sin problema.

A lo que íbamos instalamos el paquete:

grub-efi-amd64

Este paquete ha de coincidir con la arquitectura del firmware de EFI que hemos detectado al arrancar en Mac OS X.

Como veréis os desinstalará el paquete grub-pc (que es del de la bios, ahora es cuándo uno se da cuenta de por qué el paquete de grub2 no es ni grub ni grub2,… si no grub-pc… pues eso es… porque también existe grub-efi-amd64 entre otros).

Instalar grub

Para instalar el grub basado en EFI, y evitar todo problemas con la EFI, haremos:

grub-install --removable

.

En este punto podríamos reiniciar. Nos daríamos cuenta de que hay una nueva opción en REFIT para arrancar este grub especial y que no nos va el entorno gráfico si tenemos suerte. Así que de momento no aconsejo reiniciar. De hecho necesitamos algún fichero más.

Dump de memoria de BIOS

Se necesita un dump de memoria de BIOS. De hecho no tengo claro que sea necesario, pero ahora no me voy a poner a probar si funciona mejor o no con o sin él.

Este dump sirve para que algunas tarjetas gráficas, nuestra tarjeta de bajos recursos, se sienta cómoda y sepa cómo interactuar con la parte gráfica que gestiona o presenta la BIOS. O eso he creído entender. Simplemente haremos:

dd if=/dev/mem of=/boot/vbios.bin bs=65536 skip=12 count=1
dd if=/dev/mem of=/boot/int10.bin bs=4 skip=16 count=1

Compilar Kernel con parches

Requisitos para compilar Kernel

Instalaremos muchos paquetes relacionados con la compilación del kernel. En mi caso necesité instalar:

apt-get install kernel-wedge libelf-dev libdw-dev \
libnewt-dev asciidoc binutils-dev linux-tools \
libncurses-dev kernel-package

Obtención parches

Necesitamos unos cuántos parches para tener un sistema mínimamente usable. Veamos como construir u obtener cada uno de ellos. Estos parches funcionaron para un kernel Debian Unstable 3.2.17.

Parche de optimus

El nombre puesto es un poco al azar. Simplemente necesitaba este parche para que el de mbp pudiera aplicarse.

Para construirlo primero obtendremos los cambios del git del proyecto mbp y haremos el diff a partir de 2 de sus commits comparando dos instantáneas del mismo. Resumiendo el proceso sería así:

git clone git@github.com:ah-/ubuntu-kernel-mbp.git
cd ubuntu-kernel-mbp
git diff \
3c1fedf528b3bc528d4c32928ed6d661b1661ebf \
f733998b2fb211634cb6744d315d68610368c3ab \
> /tmp/optimus.diff

Pondré este fichero en el apartado de ficheros para que se pueda descargar.

Parche de mbp

Este parche contiene los cambios del proyecto Linux Hybrid Graphics dentro de Ubuntu y una adaptación para que funcione. Si ya habéis hecho el git clone y no habéis borrado el directorio anterior podéis ir directo al git diff en las siguientes intrucciones:

git clone git@github.com:ah-/ubuntu-kernel-mbp.git
cd ubuntu-kernel-mbp
git diff \
5bd8904728de43976c1d2c157ef3f81c1de5e5a8 \
e1c80ff27ef7096891808fbf14fc3442224a3cbc \
> /tmp/parche_mbp_v2.diff

Yo en realidad hice:

git diff \
5bd8904728de43976c1d2c157ef3f81c1de5e5a8 \
gmux \
> /tmp/parche_mbp_v2.diff

porque gmux es la cabeza del desarrollo, no obstante os dejo las instantáneas que usé para que tengáis algo que al menos a una persona le funciona.

Este parche lo editaremos para quitarle el primer chunk de la diferencia que se aplica al fichero nouveau_acpi.c.

Este fichero también lo dejaré en la sección de Ficheros.

Parche. Habilitar ventiladores y sensores

Simplemente se trata de modificar una línea.

Está descrito en: Macbookpro 8,3 con Ubuntu y EFI . Post MacBook Pro 8,1 y Maverick. Ubuntu Forums.

Parche. Habilitar backlight

Ya que estamos compilando el kernel no vamos a desaprovechar la oportunidad para que nos funcionen bien el control del brillo de la pantalla.

De nuevo podéis encontrar el parche en: Macbookpro 8,3 con Ubuntu y EFI . Post MacBook Pro 8,1 y Maverick. Ubuntu Forums.

Lo dejaré en ficheros como apple_backlight.diff por si el día de mañana no está en el foro.

Preparación directorio compilación kernel

Ahora vamos a preparar un directorio dónde pondremos el código fuente del kernel de Debian para aplicarle los cambios descritos anteriormente. Para ello en nuevo directorio haremos:

sudo apt-get source linux-image-$(uname -r)

Si no va bien probaremos con por ejemplo algo más explicito como:

sudo apt-get source linux-image-3.2.0-2-amd64

Lamentablemente esto nos hará trabajar como root de aquí en adelante pero… qué le vamos a hacer.

Aplicación parches

Nos aseguramos que estamos en el directorio correcto.

cd linux-2.6-3.2.17

Suponiendo que hemos guardado los parches en /tmp simplemente haremos:

patch -p1 < /tmp/optimus.diff
patch -p1 < /tmp/parche_mbp_v2.diff
patch -p1 < /tmp/apple_backlight.diff

.

Para el parche de los ventiladores y los sensores, simplemente hacemos como dice en el foro.

Dentro de ese mismo directorio editamos el fichero:

drivers/hwmon/applesmc.c

buscamos la función:

static int __init applesmc_init(void)

Y dentro de ello cambiamos:

if (!dmi_check_system(applesmc_whitelist)) {

por:

if (0 && !dmi_check_system(applesmc_whitelist)) {

.

Configuración kernel

Para poder compilar el kernel hay que saber qué características queremos que tenga. Esto se hace con el fichero .config.

En mi caso por un lado cojo el fichero /boot/config-`uname -r` como plantilla. En él desactivo el driver rts5139 que no lo necesito y daba problemas de compilación con:

sed -i s/CONFIG_RTS5139=m/CONFIG_RTS5139=n/ .config

y para evitarnos problemas con la tarjeta gráfica integrada la vamos a instalar directamente en el kernel, es decir, que no la emplearemos como módulo.

Así pues nos aseguramos de tener estos valores en el .config:

CONFIG_DRM_I915=y
CONFIG_DRM_I915_KMS=y

Compilación

Yo he hecho en primer lugar:

sudo make clean
sudo make mrproper

aunque creo que no son necesarios.

A continuación he puesto el .config definido anteriormente.

Y finalmente he lanzado el proceso de compilación con:

sudo make-kpkg clean
sudo make-kpkg –initrd kernel_image kernel_headers

Aquí es dónde voy y digo que os vayáis a tomar un café. Pues no. Podéis comer durante 2 horas, hacer la digestión y volver. De todas maneras mientras os compila podéis ir adelantando otros puntos del documento.

Por cierto, antes del make-kpkg clean podeis lanzar un sudo make menuconfig para quitar del kernel lo que necesitéis y que no os ocupe el paquete 100 MB como el mio. Pero, vamos, yo os lo aconsejo en una segunda fase.

Instalación Kernel

Si la compilación del kernel ha ido correctamente lo instalaremos bajando al directorio superior haciendo:

cd ..
dpkg -i *deb

En principio sólo deberíamos tener dos paquetes como podrían ser:

linux-headers-3.2.17_3.2.17-10.00.Custom_amd64.deb
linux-image-3.2.17_3.2.17-10.00.Custom_amd64.deb

Configuración Apple Backlight

Para que nos funcione Apple Backlight a parte del parche en el kernel necesitamos crear el fichero:

/etc/modprobe.d/apple_bl.conf

con el contenido:

options apple_bl use_gmux=1

Configuración entradas grub especiales

Esto se puede hacer de muchas maneras. Os explico como lo he hecho yo.

En primer lugar he copiado el fichero:

/etc/grub.d/10_linux

como:

/etc/grub.d/42_inteltest

.

Si ejecutamos update-grub lo que estamos consiguiendo es que la parte correspondiente al arranque de Gnu/Linux esté duplicado.

Editaremos el fichero para poner nuestras entradas especiales. Luego ya, si eso, ya se pueden formalizar de otra manera.

En la función:

linux_entry ()

cambiaremos:

title="$(gettext_quoted "%s, with Linux %s")"

por:

title="INTELTEST $(gettext_quoted "%s, with Linux %s")"

.

Esto nos hace que las entradas generadas por este script las identifiquemos fácilmente porque empiezan por INTELTEST.

Ahora vayamos a lo importante.

Las líneas:

  cat << EOF
    echo    '$message'
    linux    ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
  if test -n "${initrd}" ; then
    message="$(gettext_printf "Loading initial ramdisk ...")"
    cat << EOF
    echo    '$message'
    initrd    ${rel_dirname}/${initrd}
EOF

pasan a ser:

  cat << EOF
    echo    '$message'
    fix_video
    loadbios /boot/vbios.bin /boot/int10.bin
    linux    ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} \
video=efifb i915.lvds_channel=2 i915.modeset=1 \
i915.lvds_use_ssc=0
EOF
  if test -n "${initrd}" ; then
    message="$(gettext_printf "Loading initial ramdisk ...")"
    cat << EOF
    echo    '$message'
    initrd    ${rel_dirname}/${initrd}
set video=debug
insmod efi_gop
insmod font

if loadfont /boot/grub/unicode.pf2
then
    insmod gfxterm
    set gfxmode=auto
    set gfxpayload=keep
    terminal_output gfxterm
fi

    outb 0x728 1 # Switch select
    outb 0x710 2 # Switch display
    outb 0x740 2 # Switch DDC
    outb 0x750 0 # Power down discrete graphics
EOF

Aquí es muy importante que la línea del kernel esté en una misma línea sin el símbolo \ que he puesto. Es decir, en lugar de las 3 líneas que sólo ocupe 1 linea.

Para que los cambios surtan efecto haremos:

update-grub

Deshabilitar Nvidia

A parte de deshabilitar Nvidia físicamente gracias a un parámetro del arranque, en el sistema nos tendrá que molestar lo menos posible, así que la deshabilitaremos.

Deshabilitar modulo de Nvidia

Creamos el fichero:

/etc/modprobe.d/blacklist-nvidia.conf

con el contenido:

blacklist nvidia

Deshabilitar driver nvidia de las Xorg

Simplemente se trata de renombar el fichero xorg.conf que seguramente ya tengamos si estamos usando el nvidia propietario. Para ello hacemos algo como:

mv /etc/X11/xorg.conf \
/etc/X11/xorg.conf_nvidia_antes_solo_intel

Cómo usar todo esto

Una vez llegados a este punto simplemente reiniciamos la máquina de forma normal. En el arranque de rEFit nos aparecerá una entrada especial para nuestro grub efi.

En él hemos de encontrar la entrada correspondiente al kernel que hemos compilado que empiece por INTELTEST.

Una vez elegido, veremos un par de segundos de texto, unos 15 segundos en negro porque no se carga el driver de intel correctamente y finalmente se verá el arranque de Gnu/Linux que ya ha empezado.

Mejoras

La mejora más evidente es instalar bumblebee y demás herramientas para poder hacer switching al vuelo (sin necesidad de reiniciar aunque sea apagando las xorg) o mejor aún para poder usar la tarjeta de vídeo de altos recursos a la par que la de bajos recursos para aplicaciones 3D.

Otros puntos que me gustaría explorar son:

  • Establecer un parámetro de arranque y luego procesarlo para por ejemplo arrancar con tarjeta de vídeo de bajos recursos o la otra tarjeta. Así sólo necesitaría elegir en el grub la configuración que quiero. Un arranque restituirá el fichero xorg.conf y desbloquearía el modulo de nvidia por ejemplo.

Ficheros

Aquí os dejo un tar.gz con todos los ficheros que he ido nombrando.

mbp62_dedicated_intel_patches-tar-gz.pdf

Renombradlo como tar.gz para poder trabajar con él fácilmente puesto que le he cambiado la extensión a pdf.

Bibliografía

Anuncios

3 comentarios to “Usar tarjeta intel integrada en Debian Unstable para MacBook Pro 6,2”

  1. Debian Unstable with Kernel 3.8 – MBP 6,2 | El blog de adrian15 Says:

    […] What I want to test is if I can use my MacBookPro 6,2 integrated Intel Graphics card without having to apply any patch to the kernel as I had already done. […]

  2. BCM5974 trackpad with Linux Kernel 3.10 | El blog de adrian15 Says:

    […] you might know I was using a patched Linux Kernel 3.2 so that my integrated Intel card was used as default. So, here’s the strange thing, although I’m not setting up BCM5974 through xorg.conf […]

  3. Control screen brightness when booting in EFI Mode with Linux 3.10 in MBP 6,2 | El blog de adrian15 Says:

    […] do was to remove that use_gmux parametre. You can find it explained in one of my former articles: Usar tarjeta intel integrada en Debian Unstable para MacBook Pro 6,2 […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: