Mittwoch, 28. September 2016

Debian Jessie auf WD MyBook Live (MBL) - Teil 1: 4.x Kernel bauen

Nachdem ich nun schon einige Jahre Debian Wheezy auf meinem MyBookLive einsetze, bin ich neulich mal wieder über den Aktualitätsstand der Pakete gestolpert - so dass ich dem Leidensdruck nachgeben musste und auf Debian Jessie updaten musste.

Da uDev und Systemd nicht mit dem 2.6er Kernel zusammenarbeiten, musste ich zuerst einen aktuellen 4er Kernel kompilieren. Es gibt verschiedene Portierungen der 2.6er Patches auf die aktuellen Kernel, ausgehend von der Kernel 4.0 Portierung bis Kernel 4.1 Anpassungen.

Gestern habe ich gesehen, das das LEDE-Projekt (quasi Nachfolger von OpenWRT) ebenfalls seit einigen Monaten die Platform unterstützt. Ursprünglich fanden sich die Patches im GitHub von Christian Lamparter, inzwischen sind sie aber auch im offiziellen LEDE Repository.


Kernel 4.4


Für meinen Kernel habe ich den letzten 4.4.21 Kernel heruntergladen. Folgende Patches verwende ich aus dem LEDE Repository:

001-crypto4xx-integrate-ppc4xx-rng-into-crypto4xx.patch
002-powerpc_ibm_phy_add_ar8035.patch
010-dmaengine-Add-transfer-termination-synchronization-s.patch
011-dmaengine-core-Introduce-new-universal-API-to-reques.patch
012-dmaengine-Add-transfer-termination-synchronization-s.patch
015-dmaengine-dw-fixed.patch
020-sata-dwc.patch
040-backport_leds-convert-IDE-trigger-to-common-disk-trigger.patch
201-add-amcc-apollo3g-support.patch
701-powerpc_ibm_apm82181_phyclk_fix.patch
702-powerpc_ibm_phy_add_dt_parser.patch


Ich habe einen guten Tag (und eine Nacht) damit verbracht, die passenden Config-Parameter zu finden. Ausgehend von der 4.1.27 Konfiguration (Achtung 16k Pagesize!) von KL-Yang, sind insbesondere die GPIO Optionen hinzugekommen, die laut Device-Tree Spezifikation u.A. den SATA-Port ein und ausschalten.

Für bestehende Daten auf /dev/sda4 (/media) ist die Pagegröße von Bedeutung. Für eine optimale Performance ist die Partition ab Werk mit einer 64k Blockgröße formatiert. Der Kernel unterstützt standardmäßig nur 4k und muss mit der entsprechenden Option kompiliert werden:
CONFIG_PPC_64K_PAGES=y

Alternativ, wenn man die Datenpartition neu formatieren möchte und mit dem neuen Kernel ein wenig RAM sparen mag:

CONFIG_PPC_16K_PAGES=y

Folgende Einträge sind wichtig, damit der Kernel überhaupt auf der Hardware bootet:

CONFIG_APOLLO3G=y
CONFIG_460EX=y
CONFIG_SIMPLE_GPIO=y
CONFIG_SATA_DWC=y
CONFIG_PHYLIB=y
CONFIG_GPIO_GENERIC=y
CONFIG_GPIO_74XX_MMIO=y
CONFIG_GPIO_GENERIC_PLATFORM=y
CONFIG_DW_DMAC_CORE=y
CONFIG_DW_DMAC=y

Zu beachten sind ebenfalls folgende Änderungen:
CONFIG_CONSISTENT_SIZE=0x00A00000
CONFIG_IBM_EMAC=y
CONFIG_IBM_EMAC_RXB=256
CONFIG_IBM_EMAC_TXB=256
CONFIG_IBM_EMAC_POLL_WEIGHT=64
CONFIG_IBM_EMAC_RX_COPY_THRESHOLD=256

Während der erste Eintrag die DMA Speicherzuweisung für Peripherie sicherstellen soll, erhöhen die nachfolgenden Einträge die Queue Größen der Netzwerkkarte.

Das Cross-Compiling im LEDE-Build-System war zwar immer schnell fertig, allerdings konnte ich nicht alle Einstellungen frei wählen, weshalb ich den Kernel direkt auf dem MyBook kompiliert habe.

make
make uImage
make modules_install
cp  arch/powerpc/boot/uImage ../
cd ..

Anschließend findet sich im aktuellen Verzeichnis der Kernel als "uImage".
Zum Booten braucht man nun neben dem Boot-Script noch die DeviceTree-Definitionen.

Das Boot-Script erstelle ich aus folgender Text-Datei (boot.txt):

echo Boot from U-boot configuration
setenv boot_args 'setenv bootargs root=/dev/sda1 ro rootfstype=ext3 rootflags=data=ordered'
setenv load_sata 'sata init; ext2load sata 1:1 ${kernel_addr_r} /boot/uImage; ext2load sata 1:1 ${fdt_addr_r} /boot/apollo3g.dtb'
setenv boot_sata 'run load_sata; run boot_args addtty; bootm ${kernel_addr_r} - ${fdt_addr_r}'
echo ==== Loading Linux kernel, Device tree, Root filesystem ====
run boot_sata

Mit dem Kommando (Paket u-boot-tools erforderlich):

mkimage -A powerpc -O linux -T script -C none -a 0 -e 0 -n 'Execute uImage' -d boot.txt boot.scr

Die DeviceTree-definitionen hole ich wieder aus dem LEDE-Projekt ( /usr/src/linux muss ein Symlink auf den Kernel sein ):

mkdir dts
cd dts
wget https://raw.githubusercontent.com/lede-project/source/master/target/linux/apm821xx/dts/apollo3g.dts
wget https://raw.githubusercontent.com/lede-project/source/master/target/linux/apm821xx/dts/apollo3g.dtsi
cd ..
cpp -nostdinc -x assembler-with-cpp -I/usr/src/linux/arch/powerpc/boot/dts -I/usr/src/linux/arch/powerpc/boot/dts/include -undef -D__DTS__ -o apollo3g.tmp dts/apollo3g.dts
/usr/src/linux/scripts/dtc/dtc -O dtb -idts/apollo3g.dts --space 16384 -o apollo3g.dtb apollo3g.tmp
rm -f apollo3g.tmp

Nun sollten im Verzeichnis die drei zum Booten benötigten Dateien liegen:
  • boot.scr
  • uImage
  • apollo3g.dtb
Diese gehören nachher ins /boot Verzeichnis. Der U-Boot Loader schaut auf der ersten Partition (ext2/3 formatiert), ob es eine Datei /boot/boot.scr gibt und startet diese gegebenenfalls. Als Fallback wird danach die zweite Partition durchsucht.

Die Kernelmodule unter /lib/modules/4.4.21 werden später ebenfalls benötigt.

Leider bekomme ich unabhängig von der Page Size nur Datentransferraten um die 20MB/s mit dd auf die Datenpartition. Deshalb arbeite ich weiterhin mit einem 4.1er Kernel.
 

Kernel 4.1


Aktuell verwende ich den Kernel 4.1.33.
Folgende Patches habe ich angewendet:

01_mbl.patch
02_ppc4xx_ocm_enable.patch
03_enable_leds.patch
04_enable_button.patch
0004-Fix-emac-NAPI-buget-exhuast.patch

Unter drivers/leds/Makefile muss noch eine Zeile einkommentiert werden:

# LED Core
obj-$(CONFIG_NEW_LEDS)                  += led-core.o
#obj-$(CONFIG_LEDS_CLASS)               += led-class.o
obj-$(CONFIG_LEDS_CLASS_FLASH)          += led-class-flash.o
obj-$(CONFIG_LEDS_TRIGGERS)             += led-triggers.o

Um den DeviceTree zu erstellen nutze ich folgende Kommandozeile ( /usr/src/linux zeigt auf 4.1er Kernel):

/usr/src/linux/scripts/dtc/dtc -O dtb --space 16384 -o apollo3g.dtb /usr/src/linux/arch/powerpc/boot/dts/apollo3g.dts

Alle anderen Schritte sind analog zum 4.4er Kernel.
Bei einer Pagesize von 16k erhalte ich  nun Schreibraten zwischen 65MB/s und 75MB/s auf eine entsprechend formatierte Partition.