Desde hace unos días estoy tratando de dejar a punto una vieja laptop. Antes solía usar la opción ide=nodma en el kernel ya que el módulo piix pensaba que había DMA y eso resultaba en timeouts insoportables. Al intentar usar Ubuntu (sin éxito en este pobre carro viejo), la opción seguía andando, pero al instalar un etch dejó de prestarme atención.

Luego de varias horas de investigación, lectura de código fuente incluída, pude solucionarlo. Y les cuento para quién se vea con algo similar (al menos acá encontré alguien con el problema).

Encontré que el código que procesa esa opción está en drivers/ide/ide.c, que termina en ide-core.ko en los kernels super modulares que trae etch. No sé si antes esto no era módulo, ni cómo hace Ubuntu para que funcione; pero al ser un módulo, ide.c no recibe la command line del kernel. Según Documentation/ide.txt, hay que usar insmod ide.o options="..", obviamente este archivo no está muy actualizado :-).

El problema es pasar esa opción al módulo, que se carga desde el initramfs. Encontré que hay una manera de detener el script de initramfs y dar un shell. Pasando la opción break[=top|modules|premount|mount|bottom|init] corta la ejecución en un determinado momento, dando un shell de busybox. Cuando se cierra el shell el booteo continúa normalmente. Ahí pude cargar el módulo a mano y ver que efectivamente la opción nodma funcionaba.

Seguí leyendo el contenido del initramfs y aunque no encontré cómo hace la carga de módulos de disco, veo que usa un modprobe completo, con /etc/modprobe.d incluído! Deduje que lo copiaba del root filesystem, así que creé un archivo nuevo en ese directorio y corrí update-initramfs y problema solucionado.

Ahora me gustaría que alguien me diga si esto estaba escrito en algún lado, porque realmente no lo encontré. Ni cómo pasar opciones que solían pasarse por cmdline, ni que era tan fácil como configurar un módulo tal cual es usado fuera de initramfs.