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
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.
Keine Kommentare:
Kommentar veröffentlichen