Das Bild zeigt, dass der Linux-Kernel Ihnen über GPIO Hallo sagt.
In diesem Abschnitt der Geschichte über die Portierung von RISC-V RocketChip auf eine chinesische Cyclone-IV-Platine werden wir Linux starten und lernen, wie wir den IP-Core des Speicherkontrollers konfigurieren, und wir werden die DTS-Beschreibung der Hardware etwas anpassen. Dieser Artikel ist eine Fortsetzung , aber im Gegensatz zu dem erheblich expandierten vorherigen wird er ziemlich kurz sein.
… Da setup_smp nur aufgerufen wird, wenn der Kernel mit SMP-Unterstützung konfiguriert ist, können wir versuchen, die Mehrkernunterstützung zu deaktivieren. Es wäre unangenehm, wenn ich auch noch atomare Unterstützung im Speichermodul implementieren müsste (ich dachte, damit kümmert sich der Cache selbst), aber im Einprozessfall sollte es uns nicht stören.
Es hat trotzdem nicht funktioniert…
[ 0.000000] OF: fdt: Ignoriere den Speicherbereich 0x80000000 - 0x80200000
[ 0.000000] Linux-Version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc-Version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Do Jul 4 18:38:10 MSK 2019
[ 0.000000] Bootkonsole [early0] aktiviert
[ 0.000000] Anfangs-Ramdisk bei: 0x(____ptrval____) (16777216 Bytes)
[ 0.000000] Zonenbereiche:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Beweglicher Zonenstart für jeden Knoten
[ 0.000000] Frühzeitige Speicher-Knotenzeilen
[ 0.000000] Knoten 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem-Einrichtung Knoten 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Software-IO-TLB: gemappt [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] Kann "cpu" Gerätebaum-Eintrag nicht finden
[ 0.000000] Gebaut 1 Zonelisten, Mobilitätsgruppierung aktiv. Gesamte Seiten: 258055
[ 0.000000] Kernel-Befehlszeile: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry-Cache-Hash-Tabelleneinträge: 131072 (Ordnung: 8, 1048576 Bytes)
[ 0.000000] Inode-Cache-Hash-Tabelleneinträge: 65536 (Ordnung: 7, 524288 Bytes)
[ 0.000000] Sortiere __ex_table...
[ 0.000000] BUG: Schadhafter Seitenzustand im Prozess Swapper pfn:80bf7
[ 0.000000] Seite:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[ 0.000000] flags: 0x0()
[ 0.000000] raw: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[ 0.000000] raw: 0000000000000001 0000000000000000 00000000ffff00ff
[ 0.000000] Seite wurde gedumpt, weil: mapcount ungleich null
[ 0.000000] Module verknüpft:
[ 0.000000] CPU: 0 PID: 0 Comm: Swapper Nicht verunreinigt 4.19.0-sifive-1+ #1
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe000094bb0>] free_pcppages_bulk+0x106\/0x36c
[ 0.000000] [<ffffffe0000957be>] free_unref_page_commit.isra.23+0x86\/0x8e
[ 0.000000] [<ffffffe0000960bc>] free_unref_page+0x44\/0x58
[ 0.000000] [<ffffffe0000960de>] __free_pages.part.28+0xe\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] Sperren der Debugging wegen Kernelverunreinigung deaktiviert
[ 0.000000] BUG: Schadhafter Seitenzustand im Prozess Swapper pfn:80bf9
[ 0.000000] Seite:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] Seite wurde gedumpt, weil: mapcount ungleich null
[ 0.000000] Module verknüpft:
[ 0.000000] CPU: 0 PID: 0 Comm: Swapper Verunreinigt: G B 4.19.0-sifive-1+ #1
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe\/0x430
[ 0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] BUG: Schadhafter Seitenzustand im Prozess Swapper pfn:80bfa
[ 0.000000] Seite:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] Seite wurde gedumpt, weil: mapcount ungleich null
[ 0.000000] Module verknüpft:
[ 0.000000] CPU: 0 PID: 0 Comm: Swapper Verunreinigt: G B 4.19.0-sifive-1+ #1
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe\/0x430
[ 0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] BUG: Schadhafter Seitenzustand im Prozess Swapper pfn:80bfb
[ 0.000000] Seite:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] Seite wurde gedumpt, weil: mapcount ungleich null
[ 0.000000] Module verknüpft:
[ 0.000000] CPU: 0 PID: 0 Comm: Swapper Verunreinigt: G B 4.19.0-sifive-1+ #1
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe\/0x430
[ 0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] BUG: Schadhafter Seitenzustand im Prozess Swapper pfn:80bfc
[ 0.000000] Seite:ffffffe03f029f20 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
...Es ist interessant, dass ich nach all dem Debuggen sehen wollte, wie der "Referenz"-Ausgang des Kernels aussehen sollte, sagte make qemu, und ich sah einen ähnlichen Fehler.
Leider ist die nächste Ebene (Linux-Kernel) komplizierter: GDB, das über JTAG mit RocketChip verbunden ist, arbeitet anscheinend mit physischen Adressen, unabhängig davon, wie das MMU eingestellt ist, und der Kernel hatte zu diesem Zeitpunkt bereits die Adresszuordnung konfiguriert, daher ist es nicht einfach zu sagen display/10i $pc das wird so nicht funktionieren — wir werden nur viel sehen unimp. Aber wenn wir bereits den Offset herausgefunden haben (es scheint, dass 0x80200000 -> 0xffffffe000000000), kann man tricksen:
1: x/10i $pc
=> 0xffffffe000002436 : unimp
0xffffffe000002438 : unimp
0xffffffe00000243a : unimp
0xffffffe00000243c : unimp
0xffffffe00000243e : unimp
0xffffffe000002440 : unimp
0xffffffe000002442 : unimp
0xffffffe000002444 : unimp
0xffffffe000002446 : unimp
0xffffffe000002448 : unimp
(gdb) undisplay 1
(gdb) display/10i ($pc - 0xffffffe000002436 + 0x80202436)
2: x/10i ($pc - 0xffffffe000002436 + 0x80202436)
0x80202436: addi sp,sp,-96
0x80202438: sd s0,80(sp)
0x8020243a: sd s1,72(sp)
0x8020243c: sd s2,64(sp)
0x8020243e: sd s3,56(sp)
0x80202440: sd s4,48(sp)
0x80202442: sd s5,40(sp)
0x80202444: sd s6,32(sp)
0x80202446: sd s7,24(sp)
0x80202448: sd s8,16(sp)Breakpoints werden ähnlich gesetzt:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Fortsetzen.
Programm erhielt Signal SIGTRAP, Trace/breakpoint trap.
setup_smp () bei /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
58 while ((dn = of_find_node_by_type(dn, "cpu"))) {
(gdb) bt
#0 setup_smp () bei /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1 0xffffffe0000022a2 in setup_arch () bei /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2 0x0000000000000000 in ?? ()
Backtrace gestoppt: Rahmen hat PC nicht gespeichertAllerdings müssen sie manuell entfernt werden, um weiterzumachen — für GDB ist das ein völlig unverständlicher Trap. Ach ja, wenn Sie zufällig sagen s oder n anstatt si, wird GDB versuchen, einen impliziten Breakpoint einzufügen, der aus verständlichen Gründen nicht gesetzt wird, aber GDB lässt sich davon nicht abhalten. Aber eilen Sie nicht, um das Board neu zu starten — meiner Erfahrung nach reicht es aus, nur GDB neu zu starten (beachten Sie, dass alte Breakpoints möglicherweise nicht verschwinden).
Eigentlich müssen wir uns mit dem ursprünglichen Problem auseinandersetzen: das Setzen von Debug- printk in die Funktion of_find_node_by_type, die vom Boot-Prozessor-Kernelcode verwendet wird, zeigt, dass es anstelle von Gerätenamen auf Müll stößt. Zum Beispiel nimmt es irgendwie die Zeile „Serieller Port“, obwohl es diese offensichtlich nicht im dtb im Feld gibt. device_type. Ich habe nach diesen Bytes im Kernel-Image gesucht, sie gefunden, die Offset betrachtet und das Offensichtliche verstanden: Die Kernelgröße in den Boot-Parametern ist eindeutig unterschätzt: Es sind 8 Mb zugewiesen, aber es benötigt mehr als zehn. Ich habe 16 Mb zugewiesen, aber die Probleme hörten nicht auf. Nach einigen Versuchen, das FDT von verschiedenen Adressen zu lesen (standardmäßig wird die Adresse im Register an den Kernel übergeben a1), beschloss ich schließlich, zu verfolgen, was dort geparst wird. Glücklicherweise konnte ich anstelle der Schritte mit dem Debugger (und wir wissen, dass es Nuancen bei der Adressübersetzung gibt, die noch gelöst werden müssen) einfach und improvisiert in der Datei jetzt drivers/of/fdt.c . Letztendlich ergab sich: das Zeichen „#“ #define pr_debug printkHinzufügen von Debug-Ausgaben
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c index 3db0d71d128b..fac47df9d1db 100644 --- a/arch/riscv/kernel/setup.c +++ b/arch/riscv/kernel/setup.c @@ -173,6 +173,7 @@ asmlinkage void __init setup_vm(void)void __init parse_dtb(unsigned int hartid, void *dtb) { + printk("HART = %u DTB = %lxn", hartid, dtb); early_init_dt_scan(__va(dtb)); }diff --git a/drivers/of/base.c b/drivers/of/base.c index 74eaedd5b860..c019e4158e1d 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -940,10 +940,12 @@ struct device_node *of_find_node_by_type(struct device_node *from, unsigned long flags;raw_spin_lock_irqsave(&devtree_lock, flags); - for_each_of_allnodes_from(from, np) + for_each_of_allnodes_from(from, np) { + printk("%lx %lx [%s] | [%s]n", from, np, np->type, type); if (np->type && (of_node_cmp(np->type, type) == 0) && of_node_get(np)) break; + } of_node_put(from); raw_spin_unlock_irqrestore(&devtree_lock, flags); return np; diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 800ad252cf9c..2b45870ebada 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -31,6 +31,8 @@#include "of_private.h"+#define pr_debug printk + /* * of_fdt_limit_memory - Begrenze die Anzahl der Regionen im /memory-Knoten * @limit: maximale Einträge @@ -1253,6 +1255,7 @@ bool __init early_init_dt_scan(void *params) */ void __init unflatten_device_tree(void) { + printk("INITIAL: %lxn", initial_boot_params); __unflatten_device_tree(initial_boot_params, NULL, &of_root, early_init_dt_alloc_memory_arch, false);
Ausgabe auf dem GerätOutput auf Hardware
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
SiFive RISC-V Core IP
{
#address-cells = ;
#size-cells = ;
compatible = "freechips,rocketchip-unknown-dev";
model = "freechips,rocketchip-unknown";
chosen {
linux,initrd-start = ;
riscv,kernel-end = ;
riscv,kernel-start = ;
#address-cells = ;
#size-cells = ;
bootargs = ;
}
firmware {
sifive,uboot = "YYYY-MM-DD";
}
aliases {
serial0 = ;
}
cpus {
#address-cells = ;
#size-cells = ;
cpu@0 {
device_type = "cpu";
clock-frequency = ;
compatible = "sifive,rocket0", "riscv";
d-cache-block-size = ;
d-cache-sets = ;
d-cache-size = ;
d-tlb-sets = ;
d-tlb-size = ;
i-cache-block-size = ;
i-cache-sets = ;
i-cache-size = ;
i-tlb-sets = ;
i-tlb-size = ;
mmu-type = "riscv,sv39";
next-level-cache = ;
reg = ;
riscv,isa = "rv64imafdc";
status = "okay";
timebase-frequency = ;
tlb-split;
interrupt-controller {
#interrupt-cells = ;
compatible = "riscv,cpu-intc";
interrupt-controller;
phandle = ;
}
}
}
ram@80000000 {
device_type = "memory";
reg = ;
reg-names = "mem";
phandle = ;
}
soc {
#address-cells = ;
#size-cells = ;
compatible = "freechips,rocketchip-unknown-soc", "simple-bus";
ranges;
clint@2000000 {
compatible = "riscv,clint0";
interrupts-extended = ;
reg = ;
reg-names = "control";
}
debug-controller@0 {
compatible = "sifive,debug-013", "riscv,debug-013";
interrupts-extended = ;
reg = ;
reg-names = "control";
}
gpio@64002000 {
#gpio-cells = ;
#interrupt-cells = ;
compatible = "sifive,gpio0";
gpio-controller;
interrupt-controller;
interrupt-parent = ;
interrupts = ;
reg = ;
reg-names = "control";
}
interrupt-controller@c000000 {
#interrupt-cells = ;
compatible = "riscv,plic0";
interrupt-controller;
interrupts-extended = ;
reg = ;
reg-names = "control";
riscv,max-priority = ;
riscv,ndev = ;
phandle = ;
}
rom@10000 {
compatible = "sifive,maskrom0";
reg = ;
reg-names = "mem";
}
serial@64000000 {
compatible = "sifive,uart0";
interrupt-parent = ;
interrupts = ;
reg = ;
reg-names = "control";
}
spi@64001000 {
#address-cells = ;
#size-cells = ;
compatible = "sifive,spi0";
interrupt-parent = ;
interrupts = ;
reg = ;
reg-names = "control";
mmc@0 {
compatible = "mmc-spi-slot";
disable-wp;
reg = ;
spi-max-frequency = ;
voltage-ranges = ;
}
}
tlclk {
#clock-cells = ;
clock-frequency = ;
clock-output-names = "tlclk";
compatible = "fixed-clock";
}
}
}
[ 0.000000] HART = 0 DTB = 81200000
[ 0.000000] search "chosen", depth: 0, uname:
[ 0.000000] search "chosen", depth: 1, uname: chosen
[ 0.000000] Looking for initrd properties...
[ 0.000000] Command line is: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] dt_root_size_cells = 1
[ 0.000000] dt_root_addr_cells = 1
[ 0.000000] memory scan node ram@80000000, reg size 8,
[ 0.000000] - 80000000 , 40000000
[ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] initrd not found or empty - disabling initrd
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] INITIAL: ffffffe001000000
[ 0.000000] -> unflatten_device_tree()
[ 0.000000] Unflattening device tree:
[ 0.000000] magic: d00dfeed
[ 0.000000] size: 00001000
[ 0.000000] version: 00000011
[ 0.000000] size is 13512, allocating...
[ 0.000000] unflattening (____ptrval____)...
[ 0.000000] fixed up name for ->
[ 0.000000] fixed up name for chosen -> chosen
[ 0.000000] fixed up name for firmware -> firmware
[ 0.000000] fixed up name for aliases -> aliases
[ 0.000000] fixed up name for cpus -> cpus
[ 0.000000] fixed up name for cpu@0 -> cpu
[ 0.000000] fixed up name for interrupt-controller -> interrupt-controller
[ 0.000000] fixed up name for ram@80000000 -> ram
[ 0.000000] fixed up name for soc -> soc
[ 0.000000] fixed up name for clint@2000000 -> clint
[ 0.000000] fixed up name for debug-controller@0 -> debug-controller
[ 0.000000] fixed up name for gpio@64002000 -> gpio
[ 0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[ 0.000000] fixed up name for rom@10000 -> rom
[ 0.000000] fixed up name for serial@64000000 -> serial
[ 0.000000] fixed up name for spi@64001000 -> spi
[ 0.000000] fixed up name for mmc@0 -> mmc
[ 0.000000] fixed up name for tlclk -> tlclk
[ 0.000000] <- unflatten_device_tree()
[ 0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] 0 ffffffe03effcab0 [attach() failed for %s with error %d
[ 0.000000] ] | [cpu]
[ 0.000000] 0 ffffffe03eff0020 [(null)] | [cpu]Ausgabe in QEMU
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
SiFive RISC-V Core IP
{
#address-cells = ;
#size-cells = ;
compatible = "riscv-virtio";
model = "riscv-virtio,qemu";
chosen {
linux,initrd-start = ;
linux,initrd-end = ;
riscv,kernel-start = ;
riscv,kernel-end = ;
bootargs = "";
stdout-path = ;
}
uart@10000000 {
interrupts = ;
interrupt-parent = ;
clock-frequency = ;
reg = ;
compatible = "ns16550a";
}
test@100000 {
reg = ;
compatible = "sifive,test0";
}
virtio_mmio@10008000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10007000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10006000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10005000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10004000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10003000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10002000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10001000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
cpus {
#address-cells = ;
#size-cells = ;
timebase-frequency = ;
cpu@0 {
device_type = "cpu";
reg = ;
status = "okay";
compatible = "riscv";
riscv,isa = "rv64imafdcsu";
mmu-type = "riscv,sv48";
clock-frequency = ;
interrupt-controller {
#interrupt-cells = ;
interrupt-controller;
compatible = "riscv,cpu-intc";
linux,phandle = ;
phandle = ;
}
}
}
memory@80000000 {
device_type = "memory";
reg = ;
}
soc {
#address-cells = ;
#size-cells = ;
compatible = "simple-bus";
ranges;
pci@30000000 {
interrupt-map-mask = ;
interrupt-map = ;
ranges = ;
reg = ;
dma-coherent;
bus-range = ;
linux,pci-domain = ;
device_type = "pci";
compatible = "pci-host-ecam-generic";
#size-cells = ;
#interrupt-cells = ;
#address-cells = ;
}
interrupt-controller@c000000 {
linux,phandle = ;
phandle = ;
riscv,ndev = ;
riscv,max-priority = ;
reg-names = "control";
reg = ;
interrupts-extended = ;
interrupt-controller;
compatible = "riscv,plic0";
#interrupt-cells = ;
#address-cells = ;
}
clint@2000000 {
interrupts-extended = ;
reg = ;
compatible = "riscv,clint0";
}
}
}
[ 0.000000] HART = 0 DTB = 80e00000
[ 0.000000] search "chosen", depth: 0, uname:
[ 0.000000] search "chosen", depth: 1, uname: chosen
[ 0.000000] Looking for initrd properties...
[ 0.000000] initrd_start=0x88000000 initrd_end=0x88442b86
[ 0.000000] Command line is: earlyprintk
[ 0.000000] dt_root_size_cells = 2
[ 0.000000] dt_root_addr_cells = 2
[ 0.000000] memory scan node memory@80000000, reg size 16,
[ 0.000000] - 80000000 , 40000000
[ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] Initial ramdisk at: 0x(____ptrval____) (4467590 bytes)
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] INITIAL: ffffffe000c00000
[ 0.000000] -> unflatten_device_tree()
[ 0.000000] Unflattening device tree:
[ 0.000000] magic: d00dfeed
[ 0.000000] size: 00000d56
[ 0.000000] version: 00000011
[ 0.000000] size is 14192, allocating...
[ 0.000000] unflattening (____ptrval____)...
[ 0.000000] fixed up name for ->
[ 0.000000] fixed up name for chosen -> chosen
[ 0.000000] fixed up name for uart@10000000 -> uart
[ 0.000000] fixed up name for test@100000 -> test
[ 0.000000] fixed up name for virtio_mmio@10008000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10007000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10006000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10005000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10004000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10003000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10002000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10001000 -> virtio_mmio
[ 0.000000] fixed up name for cpus -> cpus
[ 0.000000] fixed up name for cpu@0 -> cpu
[ 0.000000] fixed up name for interrupt-controller -> interrupt-controller
[ 0.000000] fixed up name for memory@80000000 -> memory
[ 0.000000] fixed up name for soc -> soc
[ 0.000000] fixed up name for pci@30000000 -> pci
[ 0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[ 0.000000] fixed up name for clint@2000000 -> clint
[ 0.000000] <- unflatten_device_tree()
[ 0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effec00 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effeee8 [memory] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff0b0 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff320 [pci] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff858 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efffd58 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] elf_hwcap is 0x112d
[ 0.000000] percpu: Embedded 17 pages/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 258055
[ 0.000000] Kernel command line: earlyprintk
[ 0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[ 0.000000] Sorting __ex_table...
[ 0.000000] Memory: 949716K/1046528K available (6565K kernel code, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K reserved, 0K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[ 0.000000] plic: mapped 53 interrupts to 2 (out of 2) handlers.
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[ 0.000000] Console: colour dummy device 80x25
[ 0.000000] console [tty0] enabled
[ 0.000000] bootconsole [early0] disabled
[ 0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 20.00 BogoMIPS (lpj=100000)
[ 0.000000] pid_max: default: 32768 minimum: 301
[ 0.000000] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.000000] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.020000] rcu: Hierarchical SRCU implementation.
[ 0.020000] smp: Bringing up secondary CPUs ...
[ 0.020000] smp: Brought up 1 node, 1 CPU
[ 0.050000] devtmpfs: initialized
[ 0.050000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.050000] random: get_random_u32 called from bucket_table_alloc+0x76/0x17a with crng_init=0
[ 0.050000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.050000] futex hash table entries: 256 (order: 2, 16384 bytes)
[ 0.060000] NET: Registered protocol family 16
[ 0.090000] vgaarb: loaded
[ 0.090000] SCSI subsystem initialized
[ 0.090000] usbcore: registered new interface driver usbfs
[ 0.090000] usbcore: registered new interface driver hub
[ 0.090000] usbcore: registered new device driver usb
[ 0.090000] pps_core: LinuxPPS API ver. 1 registered
[ 0.090000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 0.090000] PTP clock support registered
[ 0.100000] Advanced Linux Sound Architecture Driver Initialized.
[ 0.100000] clocksource: Switched to clocksource riscv_clocksource
[ 0.110000] NET: Registered protocol family 2
[ 0.110000] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes)
[ 0.110000] TCP established hash table entries: 8192 (order: 4, 65536 bytes)
[ 0.110000] TCP bind hash table entries: 8192 (order: 5, 131072 bytes)
[ 0.110000] TCP: Hash tables configured (established 8192 bind 8192)
[ 0.110000] UDP hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] NET: Registered protocol family 1
[ 0.120000] Unpacking initramfs...
[ 0.590000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 0.620000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 0.620000] io scheduler noop registered
[ 0.620000] io scheduler deadline registered
[ 0.620000] io scheduler cfq registered (default)
[ 0.620000] io scheduler mq-deadline registered
[ 0.620000] io scheduler kyber registered
[ 0.620000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[ 0.690000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 0.690000] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10, base_baud = 230400) is a 16550A
[ 0.720000] console [ttyS0] enabled
[ 0.720000] [drm] radeon kernel modesetting enabled.
[ 0.720000] [drm] amdgpu kernel modesetting enabled.
[ 0.730000] loop: module loaded
[ 0.730000] libphy: Fixed MDIO Bus: probed
[ 0.740000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[ 0.740000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 0.740000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.740000] ehci-pci: EHCI PCI platform driver
[ 0.740000] ehci-platform: EHCI generic platform driver
[ 0.740000] mousedev: PS/2 mouse device common for all mice
[ 0.740000] usbcore: registered new interface driver usbhid
[ 0.740000] usbhid: USB HID core driver
[ 0.740000] usbcore: registered new interface driver snd-usb-audio
[ 0.740000] NET: Registered protocol family 10
[ 0.750000] Segment Routing with IPv6
[ 0.750000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[ 0.750000] NET: Registered protocol family 17
[ 0.750000] Key type dns_resolver registered
[ 0.760000] ALSA device list:
[ 0.760000] No soundcards found.
[ 0.770000] Freeing unused kernel memory: 208K
[ 0.770000] This architecture does not have kernel memory protection.
[ 0.770000] Run /init as init process(Die "timestampverknüpften" Zeilen gibt der Kernel aus, davor zeigt der Baum BBL) Auf der einen Seite wird FDT erfolgreich gelesen, auf der anderen Seite ergibt sich ein bisschen Unsinn im geparsten "Objekt"-Baum.
Im Debugging-Prozess wurde mir klar, dass BBL die "doppelte" Adresse nicht lesen konnte, nicht weil ein Fehler in der Konfiguration war, sondern einfach, weil am Wurzelknoten gesetzt wurde. #address-cells = <1>; #size-cells = <1>;.
Durch das erweiterte Debug-Ausgabe sah ich, dass die Zeiger auf type und name "getroffen" waren, und zwar auf eine ziemlich seltsame Weise: Ihr erster (beginnend mit null) Byte war auf Null gesetzt, etwas wie 0xabcdef -> 0xab00ef. Ich musste auf die vertraute Taktik zurückgreifen: , die Adressen kennen, an denen der beschädigte Speicher liegt, um die Funktion zu ergänzen printk und diese Daten auszudrucken. Nun auch die Aufrufe printk ein bisschen zu verteilen, wo sie wenig sind. Leider wurde es nicht viel klarer. Dann begann ich, mit der disassemblierten objdump Version abzugleichen, manuell Breakpoints zu setzen und schrittweise den problematischen Codeabschnitt zu durchlaufen. Und da entdeckte ich etwas Rätselhaftes und Unangenehmes: Wenn ich einen Breakpoint irgendwo weit entfernt vom known-good Zustand setze, dann sehe ich den beschädigten Speicher. Aber wenn ich versuche, schrittweise anzuschleichen, gelingt es dem Fehler, sich zu verstecken! Das Ganze riecht nach einem defekten Speicherkontroller und einem Cache, der den Fehler verbirgt, wenn ich ständig den erforderlichen Wert anfordere. Und was ist, wenn…
Wir ersetzen den Speicher.
Festhaltend an der Möglichkeit, das Problem nicht auf meiner Seite zu lösen, vermutete ich, dass ich vielleicht einfach einen defekten Speicher-Riegel erhalten habe. Ich erinnerte mich daran, dass das Netbook ein Jahrzehnt alt ist – es ist nicht nur ein tragbarer Computer, sondern auch eine wertvolle Quelle für DDR2 SO-DIMM. Außerdem kann man den herausgenommenen Speicher von der Platine einsetzen und erhält fast sofortige Abstürze bei Memtest (Linux hat übrigens fast bis zur grafischen Oberfläche hochgeladen). Aber wiederholen Sie so ein Experiment besser nicht, wenn Ihnen die Informationen auf den bereitgestellten Festplatten wichtig sind…). Auf der einen Seite könnte man annehmen, dass der Speicher einfach nicht zu diesem Netbook passt. Auf der anderen Seite konnte es ja booten! Es keimte die Hoffnung auf, dass der Speicher einfach "defekt" ist und das Problem nicht in meiner Hülle liegt.
Das bedeutet, wir müssen versuchen, vorübergehend mit netbook-Speicher zu starten. Leider kann Quartus 18 diesen IP Core nicht so aktualisieren, dass er bearbeitet werden kann. Es ist also an der Zeit, das Erstellen neuer Instanzen zu lernen. Es stellte sich als recht einfach heraus: Wir suchen im IP Catalog nach dem Punkt DDR2 SDRAM Controller mit ALTMEMPHY Intel FPGA IP und erhalten einen Block mit demselben Interface wie zuvor. Das einzige Problem ist, die richtigen Speichereinstellungen vorzunehmen.
Wir erhalten die Parameter des Speichermoduls.
Es gibt einen relativ offensichtlichen Weg, das Modul einzurichten: die Parameter aus SPD auszulesen. Tatsächlich, wenn ein gewöhnlicher Computer die SPD-Daten ausliest und den Controller entsprechend einrichtet, lasst uns diese Daten auf dem vorhandenen Netbook auslesen und in die Tabelle eintragen.
Unter Ubuntu geschieht dies : wir müssen das Paket i2c-tools, die Module laden eeprom und i2c-i801 (ich bin mir jedoch nicht sicher, ob der zweite Treiber überall passt), danach starten wir decode-dimms.:
Ausgabe von decode-dimms.
# decode-dimms version 6231 (2014-02-20 10:54:34 +0100)
Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/0-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x00)
SPD Revision Invalid
Fundamental Memory type Unknown (0x00)
---=== Manufacturing Information ===---
Manufacturer Undefined
Part Number Undefined
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/4-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x00)
SPD Revision Invalid
Fundamental Memory type Unknown (0x00)
---=== Manufacturing Information ===---
Manufacturer Undefined
Part Number Undefined
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/6-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x76)
# of bytes written to SDRAM EEPROM 128
Total number of bytes in EEPROM 256
Fundamental Memory type DDR2 SDRAM
SPD Revision 1.2
---=== Memory Characteristics ===---
Maximum module speed 800 MHz (PC2-6400)
Size 1024 MB
Banks x Rows x Columns x Bits 8 x 13 x 10 x 64
Ranks 2
SDRAM Device Width 16 bits
Module Height 30.0 mm
Module Type SO-DIMM (67.6 mm)
DRAM Package Planar
Voltage Interface Level SSTL 1.8V
Module Configuration Type No Parity
Refresh Rate Reduced (7.8 us) - Self Refresh
Supported Burst Lengths 4, 8
tCL-tRCD-tRP-tRAS 6-6-6-18
Supported CAS Latencies (tCL) 6T, 5T, 4T
Minimum Cycle Time 2.50 ns at CAS 6 (tCK min)
3.00 ns at CAS 5
3.75 ns at CAS 4
Maximum Access Time 0.40 ns at CAS 6 (tAC)
0.45 ns at CAS 5
0.50 ns at CAS 4
Maximum Cycle Time (tCK max) 8.00 ns
---=== Timing Parameters ===---
Address/Command Setup Time Before Clock (tIS) 0.17 ns
Address/Command Hold Time After Clock (tIH) 0.25 ns
Data Input Setup Time Before Strobe (tDS) 0.05 ns
Data Input Hold Time After Strobe (tDH) 0.12 ns
Minimum Row Precharge Delay (tRP) 15.00 ns
Minimum Row Active to Row Active Delay (tRRD) 10.00 ns
Minimum RAS# to CAS# Delay (tRCD) 15.00 ns
Minimum RAS# Pulse Width (tRAS) 45.00 ns
Write Recovery Time (tWR) 15.00 ns
Minimum Write to Read CMD Delay (tWTR) 7.50 ns
Minimum Read to Pre-charge CMD Delay (tRTP) 7.50 ns
Minimum Active to Auto-refresh Delay (tRC) 60.00 ns
Minimum Recovery Delay (tRFC) 127.50 ns
Maximum DQS to DQ Skew (tDQSQ) 0.20 ns
Maximum Read Data Hold Skew (tQHS) 0.30 ns
---=== Manufacturing Information ===---
Manufacturer Samsung
Manufacturing Location Code 0x02
Part Number M4 70T2864QZ3-CF7
Revision Code 0x3351
Manufacturing Date 2009-W34
Assembly Serial Number 0x79C64E9A
Number of SDRAM DIMMs detected and decoded: 3Das Problem ist, dass einige Timings hier nicht angegeben sind, also gehen wir den zweiten Weg.
Was steht auf den Modulen:


In diesem Fall ist die Aufschrift auf den Chips interessanter: K4T1G164QQ-HCF7. Wenn wir diese Zeile bei Google eingeben, erhalten wir ein Datenblatt von mehreren Dutzend Seiten mit allen notwendigen Parametern, die wir sorgsam in die Eigenschaften von IP Core einpflegen können. Achten Sie jedoch auf die Maßeinheiten: irgendwo ns, irgendwo — ps, und manchmal sogar Bruchteile von tCK.Ich werde Ihnen nicht beibringen, worauf Sie achten sollten — ich habe vieles durch Ausprobieren herausgefunden (ich kann dabei jedoch nicht garantieren, dass man so den Speicher oder FPGA "zerschießen" kann). Ich möchte nur auf Folgendes hinweisen: Ich konnte den Controller sehr lange nicht zum Laufen bringen, und der letzte Schritt war die Erkenntnis, dass ich die Breite aller Schnittstellen zum Speicher mit dem generierten Code in Verilog überprüfen muss: denn wenn in MemIfBundle angegeben ist val mem_ba = IO(Output(UInt(2.W))), und es 8 Banken gibt (d.h. die Adresse hat eine Breite von 3 Bit), dann ist alles, was wir haben — ein hängender Ausgang vom Speicherkontroller — ein Problem, aber nicht kritisch, daher wird alles synthetisiert, funktioniert aber nicht.
Vielleicht würde alles auch mit dem alten Modul funktionieren, wenn man den Controller aktualisiert, aber momentan habe ich keine Lust, mich mit potenziellen flüchtigen Bugs zu beschäftigen: ich habe auch so genug.
Also, nach der Verschiebung timebase-frequency in DTS von der Ebene der spezifischen CPU auf die Ebene des Knotens. cpus (auf eine ganz klar geäußerte Bitte des Kerns), erhalten wir:
Versteckter Text
[ 0.000000] OF: fdt: Ignoriere den Speicherbereich 0x80000000 - 0x80200000
[ 0.000000] Linux-Version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc-Version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Di 9. Jul 22:42:36 MSK 2019
[ 0.000000] bootconsole [early0] aktiviert
[ 0.000000] Initial ramdisk bei: 0x(____ptrval____) (16777216 Bytes)
[ 0.000000] Zonenbereiche:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Start der beweglichen Zone für jeden Knoten
[ 0.000000] Frühzeitige Bereich der Speicherknoten
[ 0.000000] Knoten 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem-Richtlinienknoten 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Software-IO-TLB: gemappt [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap ist 0x112d
[ 0.000000] percpu: Eingebettete 17 Seiten/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] 1 Zonelisten gebaut, Mobilitätsgruppierung aktiv. Gesamte Seiten: 258055
[ 0.000000] Kernel-Befehlszeile: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry-Cache-Hash-Tabelleneinträge: 131072 (Ordnung: 8, 1048576 Bytes)
[ 0.000000] Inode-Cache-Hash-Tabelleneinträge: 65536 (Ordnung: 7, 524288 Bytes)
[ 0.000000] Sortierung __ex_table...
[ 0.000000] Speicher: 937696K\/1046528K verfügbar (6565K Kernel-Code, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K reserviert, 0K cma-reserviert)
[ 0.000000] SLUB: HWalign=64, Ordnung=0-3, MinObjects=0, CPUs=1, Knoten=1
[ 0.000000] rcu: Hierarchische RCU-Implementierung.
[ 0.000000] rcu: RCU-Ereignisverfolgung ist aktiviert.
[ 0.000000] rcu: RCU schränkt CPUs von NR_CPUS=8 auf nr_cpu_ids=1 ein.
[ 0.000000] rcu: Geometrie für rcu_fanout_leaf=16, nr_cpu_ids=1 anpassen
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, vorab zugewiesene irqs: 0
[ 0.000000] plic: 8 Interrupts auf 1 (von 2) Handler abgebildet.
[ 0.000000] Clocksource: riscv_clocksource: Maske: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Konsole: Farb-Dummy-Gerät 80x25
[ 0.000000] Kalibrierung der Verzögerungsschleife (übersprungen), Wert berechnet mit Timerfrequenz.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: Standard: 32768 Mindest: 301
[ 0.030000] Mount-Cache-Hash-Tabelleneinträge: 2048 (Ordnung: 2, 16384 Bytes)
[ 0.040000] Mountpoint-Cache-Hash-Tabelleneinträge: 2048 (Ordnung: 2, 16384 Bytes)
[ 0.140000] rcu: Hierarchische SRCU-Implementierung.
[ 0.190000] smp: Sekundäre CPUs werden hochgefahren ...
[ 0.190000] smp: 1 Knoten, 1 CPU hochgefahren
[ 0.220000] devtmpfs: initialisiert
[ 0.300000] random: get_random_u32 wurde aus bucket_table_alloc+0x76\/0x17a unter crng_init=0 aufgerufen
[ 0.330000] clocksource: jiffies: Maske: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex-Hash-Tabelleneinträge: 256 (Ordnung: 2, 16384 Bytes)
[ 0.380000] NET: Protokollfamilie 16 registriert
[ 1.850000] vgaarb: geladen
[ 1.870000] SCSI-Subsystem initialisiert
[ 1.900000] usbcore: neuer Schnittstellentreiber usbfs registriert
[ 1.910000] usbcore: neuer Schnittstellentreiber hub registriert
[ 1.920000] usbcore: neuer Gerätetreiber usb registriert
[ 1.930000] pps_core: LinuxPPS-API-Version 1 registriert
[ 1.940000] pps_core: Software-Version 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 1.950000] PTP-Uhrunterstützung registriert
[ 1.970000] Treiber der Advanced Linux Sound Architecture initialisiert.
[ 2.010000] clocksource: Zu riscv_clocksource gewechselt
[ 2.600000] NET: Protokollfamilie 2 registriert
[ 2.640000] tcp_listen_portaddr_hash Hash-Tabelleneinträge: 512 (Ordnung: 1, 8192 Bytes)
[ 2.650000] TCP-etablierte Hash-Tabelleneinträge: 8192 (Ordnung: 4, 65536 Bytes)
[ 2.670000] TCP-bind Hash-Tabelleneinträge: 8192 (Ordnung: 5, 131072 Bytes)
[ 2.700000] TCP: Hash-Tabellen konfiguriert (etabliert 8192 bind 8192)
[ 2.720000] UDP Hash-Tabelleneinträge: 512 (Ordnung: 2, 16384 Bytes)
[ 2.730000] UDP-Lite Hash-Tabelleneinträge: 512 (Ordnung: 2, 16384 Bytes)
[ 2.750000] NET: Protokollfamilie 1 registriert
[ 2.770000] Entpacken von initramfs...
[ 23.980000] Entpacken von initramfs fehlgeschlagen: Abfall im komprimierten Archiv
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Blockebene SCSI-Generik (bsg) Treiber-Version 0.4 geladen (major 251)
[ 25.030000] io-Scheduler noop registriert
[ 25.040000] io-Scheduler deadline registriert
[ 25.050000] io-Scheduler cfq registriert (Standard)
[ 25.060000] io-Scheduler mq-deadline registriert
[ 25.060000] io-Scheduler kyber registriert
[ 25.120000] sifive_gpio 64002000.gpio: SiFive GPIO-Chip registriert 6 GPIOs
[ 25.150000] shpchp: Standard-Hot-Plug-PCI-Controller-Treiber-Version: 0.4
[ 28.870000] Serial: 8250\/16550-Treiber, 4 Ports, IRQ-Teilung deaktiviert
[ 28.940000] sifive-serial 64000000.serial: Controller-Uhr nicht gefunden
[ 28.950000] sifive-serial: Prüfung von 64000000.serial fehlgeschlagen mit Fehler -2
[ 28.980000] [drm] radeon Kernel-Moduseinstellungs aktiviert.
[ 28.990000] [drm] amdgpu Kernel-Moduseinstellungs aktiviert.
[ 29.500000] loop: Modul geladen
[ 29.610000] sifive_spi 64001000.spi: Bus-Uhr nicht gefunden
[ 29.620000] sifive_spi: Prüfung von 64001000.spi fehlgeschlagen mit Fehler -2
[ 29.640000] libphy: Fester MDIO-Bus: geprüft
[ 29.680000] e1000e: Intel(R) PRO\/1000-Netzwerktreiber - 3.2.6-k
[ 29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: USB 2.0 'Enhanced' Host-Controller-Treiber
[ 29.710000] ehci-pci: EHCI-PCI-Plattformtreiber
[ 29.720000] ehci-platform: EHCI-generischer Plattformtreiber
[ 29.750000] mousedev: PS\/2-Mausgerät standardmäßig für alle Mäuse
[ 29.790000] usbcore: neuer Schnittstellentreiber usbhid registriert
[ 29.800000] usbhid: USB HID-Kerntreiber
[ 29.820000] usbcore: neuer Schnittstellentreiber snd-usb-audio registriert
[ 29.900000] NET: Protokollfamilie 10 registriert
[ 29.960000] Segment-Routing mit IPv6
[ 29.960000] sit: IPv6, IPv4 und MPLS über IPv4 Tunneling-Treiber
[ 30.020000] NET: Protokollfamilie 17 registriert
[ 30.020000] Schlüsseltype dns_resolver registriert
[ 30.070000] bootconsole [early0] verwendet init-Speicher und muss deaktiviert werden, selbst bevor die echte bereit ist
[ 30.080000] bootconsole [early0] deaktiviertNach dem passiert sichtbar nichts.
Jetzt können wir versuchen, drei Probleme zu lösen:
[ 23.980000] Initramfs-Entpacken fehlgeschlagen: Müll im komprimierten Archiv
...
[ 28.940000] sifive-serial 64000000.serial: Controller-Takt nicht gefunden
...
[ 29.610000] sifive_spi 64001000.spi: Bus-Takt konnte nicht gefunden werden… sowie mit dem Anhalten der Ausgabe auf der Konsole.
Mit zwei Problemen bezüglich der Frequenzen ist es ganz einfach: Man muss Punkte hinzufügen clocks zu den benötigten Geräteunterbäumen, um den Knoten eine aussagekräftige Beschriftung zu geben tlclk:
diff --git a/arch/riscv/dts/zeowaa-1gb.dts b/arch/riscv/dts/zeowaa-1gb.dts
index 4b2cebc..1347e76 100644
--- a/arch/riscv/dts/zeowaa-1gb.dts
+++ b/arch/riscv/dts/zeowaa-1gb.dts
@@ -96,6 +97,7 @@
L8: serial@64000000 {
compatible = "sifive,uart0";
interrupt-parent = <&L0>;
+ clocks = <&tlclk>;
interrupts = <>;
reg = <>;
reg-names = "control";
@@ -107,6 +109,7 @@
interrupt-parent = <&L0>;
interrupts = <>;
reg = <>;
+ clocks = <&tlclk>;
reg-names = "control";
L12: mmc@0 {
compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
voltage-ranges = <>;
};
};
- L11: tlclk {
+ tlclk: tlclk {
#clock-cells = <>;
clock-frequency = <>;
clock-output-names = "tlclk";Durch Hinzufügen der Zeile #define pr_debug printk zu Beginn der Datei init/initramfs.c, erhalten wir anstelle von initramfs eine etwas detailliertere Nachricht über Müll:
[ 2.760000] Initramfs wird entpackt...
[ 2.770000] Gzip komprimierte Daten erkannt
[ 23.940000] (null) komprimierte Daten erkannt
[ 23.970000] Initramfs-Entpacken fehlgeschlagen: Müll im komprimierten ArchivDas heißt, der Müll ist möglicherweise kein anstatt initramfs, sondern zusammen.
Okay, er hat etwas gefunden, vielleicht reicht das. Aber wo ist die Konsole hin? Die Suche ergibt einen Link zu einem Problem auf GitHub: — es stellt sich heraus, dass ein UART nach Meinung des Treibers nicht einmal erwähnenswert ist. Aber datierte 11. Juli 2018 — vor einem Jahr. Es stellte sich heraus, dass dieser Commit nie in den Baum gelangte, aus dem ich den Kernel baue. Durch manuelles Anwenden dieses Patches erhielt ich ein funktionierendes Linux! Es stellte sich heraus, dass das Problem mit initramfs tatsächlich nicht kritisch war.
Nachdem ich mich als user=root, passwort=sifive eingeloggt hatte, konnte ich ohne große Probleme (außer dass ich verstehen musste, dass die GPIO-Nummer eine Basis hat, von der alles zählt, und die einfach aus der entsprechenden Pseudo-Datei zu lesen ist) über sysfs die LED auf der Platine einschalten.
Wie beim letzten Mal füge ich ein Textvideo zum Start von Linux bei. Beim Wechsel der Konsole von earlyprintk auf die Standardausgabe erscheint etwas störendes, das wie eine Ausgabe bei falsch eingestellter UART-Geschwindigkeit aussieht. Interessanterweise hat der Player diese "Kochstelle" erfolgreich verarbeitet.
Quelle: habr.com
