Großprojekt beendet
Geschrieben von MMind am Donnerstag, 7. Februar 2013 in E-Book Reader
Vor ein paar Tagen kam mit der Aufnahme in den Samsung-Maintainer-Tree mein bisher größtes Restrukturierungsprojekt der älteren Samsung-SoCs zu einem vorläufigen Ende. Im Kern ging es dabei um eine Neuordnung des Codes, der die Interrupt-Controller der S3C24XX-SoCs steuert, um später DeviceTree-Unterstützung für die S3C24XX-SoCs realisieren zu können — mehr zu DeviceTree folgt in einem späteren Eintrag.
Bisheriger Zustand
Die S3C24XX-SoCs verwenden zwar den selben Interrupt-Controller, dessen innere Struktur unterscheidet sich jedoch zwischen allen SoC-Varianten. Im Endeffekt handelt es sich »nur« um unterschiedlich belegte Bits in den Registern des Controllers. Zur Verdeutlichung ein kleines Beispiel:
Bit | 0 | ... | 18 | ... |
---|---|---|---|---|
S3C2410 | EINT0 | ... | DMA1 | ... |
S3C2416 | EINT0 | ... | UART3 | ... |
Der S3C2410 signalisiert also in Bit 18 Interrupts des zweiten DMA-Kanals, während der S3C2416 dort Interrupts der vierten seriellen Schnittstelle signalisiert.
Implementiert war das Ganze dann derart, dass ein generischer Interrupt-Init die Struktur für den S3C2410 zusammenbaute und später dann eine SoC-spezifische zweite Init-Funktion, die geänderten Werte überschrieb. Diese zweite Funktion wurde über einen arch_initcall und damit zu einem gänzlich anderen Zeitpunkt gestartet.
Ein zweites großes Manko war die Festlegung auf statische Interrupt-Nummern. In arch/arm/mach-s3c24xx/include/mach/irqs.h waren den jeweiligen Interrupts feste Nummern zugewiesen und diese Nummern wurden auch durch den ganzen Interrupt-Code verstreut verwendet. D.h. es fanden sich überall Fragmente wie das folgende:
if (irq >= IRQ_EINT0 && irq <= IRQ_EINT3) ....
Dadurch kam es zu vielen Code-Dopplungen die sich nur in den verwendeten Interrupt-Nummern unterschieden.
Als drittes großes Problem ist noch das fehlen einer IRQ-Domain, welche aber für DeviceTree-Unterstützung absolut notwendig ist.
Der gesamte Prozess zog sich von Anfang November bis Ende Januar und große Teile davon entstanden auf den Flughäfen von Barcelone, Frankfurt und Hong Kong .
Neue Weltordnung
Nach dem Entfernen und Hinzufügen von 1132 respektive 688 Codezeilen stellt sich das System nun folgendermassen dar. Der gesamte Aufbau folgt nun einem deklarativen Ansatz. In einer speziellen Struktur werden die Parameter der Interrupt, also Typ und gegebenenfalls Eltern-Interrupt deklariert. Die mehrfach vorhandenen Funktionen zum quittieren, maskieren und demaskieren von Interrupts sind verschwunden und wurden durch einen einzigen Satz von Funktionen ersetzt, die ihr spezifisches Verhalten aus der Interrupt-Deklaration ableiten.
Ebenso wird jetzt für jeden der Subinterrupt-Controller eine IRQ-Domain erstellt und der vorherige zweistufige Init ist auch normalisiert.
Ausblick
Als Restarbeit müssen noch die S3C2412, S3C2440 und S3C2442 Varianten in die neue Struktur konvertiert werden. Nachdem das generelle Konzept aber angenommen wurde, ist dies nichtmehr allzu schwierig. Die eigentliche DeviceTree-Unterstützung im Interrupt-Code ist dann auch nur noch eine relativ kleine Änderung, die auch schon im Großen und Ganzen existiert und nur noch etwas Feinschliff benötigt.
Seite 1 von 1, insgesamt 1 Einträge