ARM: Start/Wakeup/Bringup die anderen CPU-Kerne/APs und passieren Sie die start-Adresse?

Ich habe schlug meinen Kopf mit diesem für die letzten 3-4 Tage und ich kann nicht finden, eine ANSTÄNDIGE Begründung Dokumentation (von ARM oder inoffiziell), um mir zu helfen.
Ich habe einen ODROID-XU board (big.WENIG 2 x Cortex-A15 + 2 x Cortex-A7) board und ich versuche zu verstehen, ein wenig mehr über die ARM-Architektur. In meinem "Experimentieren" code habe ich jetzt angekommen in der Phase, wo ich will AUFWACHEN, DIE ANDEREN KERNE AUS IHRER WFI (wait-for-interrupt) Zustand.

Die fehlenden Informationen versuche ich noch zu finden ist:

1. Wenn du die Basis-Adresse des memory-mapped-GIC-ich verstehe, dass ich brauche, um zu Lesen CBAR; Aber kein Teil der Dokumentation erklärt, wie die bits in CBAR (2 PERIPHBASE Werte) sollten so angeordnet sein, das Finale GIC-Basis-Adresse

2. Beim senden einer SGI-durch die GICD_SGIR registrieren, was die interrupt-ID zwischen 0 und 15 soll ich wählen? Spielt es eine Rolle?

3. Beim senden einer SGI-durch die GICD_SGIR registrieren, wie kann ich sagen, die anderen Kerne , WO Sie STARTEN Sie die AUSFÜHRUNG VON?

4. Wie wirkt sich die Tatsache, dass mein code geladen wird, indem der U-BOOT bootloader beeinflussen diesen Zusammenhang?

Den Cortex-A-Series Programmer ' s Guide v3.0 (gefunden hier: link) gibt die folgenden in Abschnitt 22.5.2 (SMP boot in Linux, Seite 271):

, Während der primäre Kern wird zu Booten, die sekundären Kerne werden in einem standby-Zustand, mit dem
WFI-Anweisung. Es (der primäre Kern) eine Start-Adresse für den sekundären Kerne und wecken Sie mit einem
Inter-Prozessor-Interrupt(IPI), das bedeutet eine SGI signalisiert durch die GIC

Wie macht Linux das? Die Dokumentation-S keine anderen details über "Es wird eine Start-Adresse für den sekundären Kerne".

Meine frustration wächst und ich wäre sehr dankbar für Antworten.
Vielen Dank im Voraus!

ZUSÄTZLICHE DETAILS

Dokumentation, die ich benutze:

  • ARMv7-A&R Architecture Reference Manual
  • - Cortex-A15-TRM (Technical Reference Manual)
  • Cortex-A15 MPCore TRM
  • Cortex-A-Series Programmer ' s Guide v3.0
  • GICv2 Architektur Spezifikation

Was ich getan habe, von nun:

  • UBOOT lädt mich auf 0x40008000; ich habe-Übersetzung-Tabellen (TTBs), geschrieben TTBR0 und TTBCR entsprechend und zugeordnet 0x40008000 zu 0x8000_0000 (2GB), so dass ich auch aktiviert die MMU
  • Set-up-Ausnahme-Handler, die meine eigene
  • Ich habe Printf-Funktionen über die serielle Schnittstelle (UART2 auf ODROID-XU)

Alle oben genannten scheint, richtig zu arbeiten.

Was ich versuche zu tun, nun:

  • Holen Sie sich die GIC-Basis-Adresse => im moment lese ich CBAR und ich einfach UND (&) seinen Wert mit 0xFFFF8000 und verwenden Sie diese als die GIC-Basis-Adresse, obwohl ich bin mir fast sicher, dies ist nicht richtig
  • Aktivieren der GIC-Verteiler (bei offset 0x1000 von GIC-Basis-Adresse?), durch das schreiben GICD_CTLR mit dem Wert 0x1
  • Konstruieren eine SGI mit dem folgenden Parameter: Group = 0, ID = 0, TargetListFilter = "Alle CPUs Außer Mir" und senden Sie es (schreiben) durch die GICD_SGIR GIC registrieren
  • Da ich nicht bestanden haben alle die start-Adresse für die anderen Kerne nichts passiert, nachdem diese

....UPDATE....

Habe ich begonnen zu suchen, auf dem Linux-kernel und QEMU source-codes, die auf der Suche nach einer Antwort. Hier ist, was ich herausgefunden habe (bitte korrigieren Sie mich, wenn ich falsch Liege):

  • Beim Hochfahren das board ALLE KERNE starten das ausführen der reset-Vektor
  • Eine software (firmware) Komponente führt WFI auf dem sekundären Kerne und einige andere code, der die Funktion eines Protokolls zwischen diesen sekundären Kerne und der primäre Kern, wenn Sie letzteres will, um Sie aufwachen, wieder
  • Zum Beispiel, das Protokoll über die EnergyCore ECX-1000 (Highbank) board ist wie folgt:

**(1)** the secondary cores enter WFI and when

**(2)** the primary core sends an SGI to wake them up

**(3)** they check if the value at address (0x40 + 0x10 * coreid) is non-null;

**(4)** if it is non-null, they use it as an address to jump to (execute a BX)

**(5)** otherwise, they re-enter standby state, by re-executing WFI

**(6)** So, if I had an EnergyCore ECX-1000 board, I should write (0x40 + 0x10 * coreid) with the address I want each of the cores to jump to and send an SGI

Fragen:

  • 1. Was ist die software-Komponente, die das tut? Liegt es an der BL1-binary, die ich geschrieben habe auf der SD-Karte, oder ist es das U-BOOT?
  • 2. Von dem was ich verstehe, ist dieses software-Protokoll unterscheidet sich von board zu board. Ist das so, oder funktioniert es nur hängt von der zugrunde liegenden Prozessor?
  • 3. Wo finde ich Informationen über dieses Protokoll abholen ein ARM-board? - finde ich es auf der offiziellen ARM-website oder auf der board-Seite?
  • Ich glaube, dass diese Art der Initialisierung (d.h. aufwachen-die sekundären Kerne aus dem standby-Modus) erfolgt durch ROM-code die vorinstallierte vom chip-Hersteller (z.B. TI, Samsung, ...). Dies ist zum Beispiel, wie es gemacht wird in der TI OMAP ist. omappedia.org/wiki/Bootloader_Project
  • Ich glaube, dass (offensichtlich) es muss einer der folgenden sein: ROM-code, BL1 code => beide unzugänglich (BL1 verschlüsselt [unterzeichnet]), oder den bootloader...habe ich ein wenig gesucht durch den bootloader Quellen, aber ich habe nicht gefunden eine Beziehung zu dieser SMP-Protokoll; plus, Linux scheint es nicht zu verlassen sich auf Argumente aus dem bootloader zu entdecken, das Protokoll (vielleicht durch einen ATAG), das führt mich zu glauben, dass das, was ich Suche, ist entweder in der ROM-code oder in der BL1-code...die Frage ist, welche und, da Sie inaccesible direkt, wo finde ich details darüber, was Sie tun, für mein board (ODROID-XU)...
  • Ich nehme an, du meintest "also setzen die sekundären Kerne im standby"
  • Diese Art von details versehen werden kann, durch irgendeine Art von Hersteller-SoC technischen Datenblatt. Deshalb würde ich zuerst versuchen, den Samsung Ressourcen, speziell Exynos 5. Ich konnte'f finden Sie die entsprechende Platte schnell genug, damit ich einen link zu ähnlichen OMAP-chip, nur um Ihnen eine Idee geben, wie TI behandelt diese Dinge.
  • oh, glauben Sie mir, ich versuchte das auch; diese Liste habe ich hier gedruckt von Dokumentationen ist nicht vollständig: ich habe auch Exynos 5 Dual Bedienungsanleitung, suchte nach weiteren relevanten samsung-Dokumente...aber leider konnte ich nicht finden, die benötigten Informationen in Ihren docs; es ist alles ein großes Durcheinander...also ich hatte gehofft, dass jemand anderes das bereits getan hat, dies würde mir helfen, vielleicht jemand, der kennt die Interna des linux-kernel auf ARM-Architekturen... und leider ist hier das was das internet sagt mir, link
  • Ich bin noch auf der Suche und versuchen, etwas aus dem kernel-Quellcode, ich hoffe ich finde weitere relevante Informationen vorhanden..
  • Leider einige Hersteller nicht verschenken ALLE relevanten SoC Informationen als gratis-Mittagessen (Lesen Sie es so: Sie tun, aber unter NDA). Dieser SoC, wie Sie sagen, erscheint in dieser Gruppe. Aber auch diese Art von Funktionalität ist nicht sollten ausgesetzt werden, um einen Benutzer. Deshalb ist der TI behandelt es als ROM-code. Ich würde erwarten, dass die von Samsung haben es getan das gleiche. Deshalb würde ich nicht erwarten, dass man einen solchen Implementierungsdetails in Linux-kernel.
  • Aber wieder, wenn Sie genug Zeit haben, könnten Sie Blättern Sie durch die Plattform-spezifische (Exynos 5) Sachen und sehen, wenn Sie finden etwas, das bezeichnend. Oder versuchen, direkt den support von Samsung. Viel Glück 🙂
  • Ich hatte einen kurzen Blick auf die Exynos-code fand ich in der Android-bezogenen release. Dort finden Sie einige SMP-den zugehörigen code. Es gibt durchaus einige Dinge in Bezug auf das Booten der sekundären Kerne. Also, haben Sie einen Blick auf die folgenden Dateien: android.googlesource.com/kernel/exynos/+/... android.googlesource.com/kernel/exynos/+/...
  • Könnte ich Sie bitten, aktualisieren Sie Ihre Frage etwas zu markieren, was genau sind Ihre aktuellen Fragen? Du hast eindeutig zu viel Arbeit gemacht bei der Untersuchung dieser und aktualisiert haben, die Frage mit Ihren Ergebnissen, so dass ich nicht mehr wissen, zum Beispiel, ob die GIC-Basis-Adresse ist eine Frage mehr (wenn ich mich Recht erinnere, ist es GICbase = ((CBAR & 0x000000FF) << 32) | (CBAR & 0xFFFF0000), aber es ist schon mehr als ein Jahr her, seit ich gearbeitet habe, alle ARM-cores).

Schreibe einen Kommentar