På billedet sender Linux-kernen hilsner til dig via GPIO.
I denne del af historien om porteringen af RISC-V RocketChip til det kinesiske board med Cyclone IV, får vi endelig Linux til at køre, og vi lærer også at konfigurere IP Core hukommelseskontrolleren selv og redigere dts-beskrivelsen af hardwaren en smule. Denne artikel er en fortsættelse af , men i modsætning til den ret udvidede forgænger, vil den være ret kort.
… Da setup_smp kaldes, kun hvis kernen er konfigureret med SMP-support, kan vi prøve at deaktivere multikern. Det vil være ubehageligt, hvis jeg også skal implementere understøttelse af atomiskhed i hukommelsesmodulet (jeg troede, at cachen ville håndtere det selv), men i en enkernet konfiguration burde det ikke påvirke os.
Det lykkedes stadig ikke...
[ 0.000000] OF: fdt: Ignorerer hukommelsesområde 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 Tors Jul 4 18:38:10 MSK 2019
[ 0.000000] bootconsole [early0] aktiveret
[ 0.000000] Initial ramdisk ved: 0x(____ptrval____) (16777216 bytes)
[ 0.000000] Zoneområder:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Flyttelig zone start for hver node
[ 0.000000] Tidlige hukommelsesnodeområder
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem opsætning af node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] software IO TLB: mapperet [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] Kunne ikke finde "cpu" enhedstræ indgang
[ 0.000000] Bygget 1 zonelister, mobilitetsgruppering aktiveret. Samlet antal sider: 258055
[ 0.000000] Kernel kommandolinje: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hashtag tabel poster: 131072 (ordre: 8, 1048576 bytes)
[ 0.000000] Inode-cache hashtag tabel poster: 65536 (ordre: 7, 524288 bytes)
[ 0.000000] Sortering __ex_table...
[ 0.000000] BUG: Dårlig side tilstand i proces swapper pfn:80bf7
[ 0.000000] side: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] side dumped fordi: nonzero mapcount
[ 0.000000] Moduler linkerede:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Ikke forurenet 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] Deaktiverer låsefejldebugging på grund af kernelforurening
[ 0.000000] BUG: Dårlig side tilstand i proces swapper pfn:80bf9
[ 0.000000] side: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] side dumped fordi: nonzero mapcount
[ 0.000000] Moduler linkerede:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Forurenet: 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: Dårlig side tilstand i proces swapper pfn:80bfa
[ 0.000000] side: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] side dumped fordi: nonzero mapcount
[ 0.000000] Moduler linkerede:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Forurenet: 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: Dårlig side tilstand i proces swapper pfn:80bfb
[ 0.000000] side: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] side dumped fordi: nonzero mapcount
[ 0.000000] Moduler linkerede:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Forurenet: 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: Dårlig side tilstand i proces swapper pfn:80bfc
[ 0.000000] side: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
...Det er interessant, at efter al fejlfinding besluttede jeg at se, hvordan den "reference" output fra kernen skal se ud, sagde make qemu, og så jeg så en lignende fejl.
Desværre er næste niveau (Linux kernel) sværere: GDB, der er tilsluttet via JTAG til RocketChip, arbejder angiveligt med fysiske adresser uanset hvordan MMU er konfigureret, og kernen har på det relevante tidspunkt allerede konfigureret adressevisningen, så det er ikke muligt bare at sige display/10i $pc , vi vil kun se meget unimp. Men hvis vi allerede har fundet ud af offset'et (det ser ud til, at 0x80200000 -> 0xffffffe000000000), så kan vi snige os uden om:
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)Breakpoint-ene placeres på samme måde:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Fortsætte.
Programmet modtog signal SIGTRAP, Trace/breakpoint trap.
setup_smp () at /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 () at /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1 0xffffffe0000022a2 in setup_arch () at /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2 0x0000000000000000 in ?? ()
Backtrace stopped: frame did not save the PCDet eneste problem er, at de skal fjernes manuelt for at gå videre — for GDB er det en fuldstændig uforståelig trap. Åh ja, hvis du ved et uheld siger s eller n i stedet for si, vil gdb forsøge at indsætte en implicit breakpoint, som af åbenlyse grunde ikke bliver sat, men der er ingen måde at afvise GDB. Men skynd dig ikke at genstarte boardet — efter mine observationer er det tilstrækkeligt bare at genstarte gdb (vær opmærksom på, at gamle breakpoint måske ikke forsvinder).
Faktisk skal vi finde ud af det oprindelige problem: placeringen af debug printk til funktionen of_find_node_by_type, der bruges af boot-procesorkernen som søgekode, viser, at den ser nogle affald i stedet for enhedernes typenavne. For eksempel tager den linjen "Serial port" et eller andet sted fra, selvom der tydeligvis ikke er noget sådant i dtb-feltet. device_type. Efter at have søgt efter disse bytes i kernen fandt jeg dem, kiggede på forskydningen og indså det åbenlyse: størrelsen af kernen i bootparametrene er klart undervurderet: den har 8 Mb tildelt, men bruger mere end ti. Jeg tildelte 16 Mb, men mærkeligheden stoppede ikke. Efter en række forsøg med at læse FDT fra forskellige adresser (den standardadresse, der sendes til kernen i registrene a1), besluttede jeg endelig at spore, hvad der faktisk nu parses. Heldigvis, i stedet for at gå rundt med en debugger (og vi husker, at der er nuancer med oversættelse af adresser, der stadig skal løses på en eller anden måde), kan man bare og klodset angive i filen drivers/of/fdt.c angive #define pr_debug printk. Resultatet blev:
tilføjelse af debug-output
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 - limit the number of regions in the /memory node
* @limit: maximum entries
@@ -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);Output på 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]Output 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 <giometti@linux.it>
[ 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(«Timestamped» lines are output by the kernel, before which the tree displays BBL) On one hand, FDT reads successfully, on the other — it turns into some nonsense in the parsed 'object' tree.
During debugging, I realized that BBL couldn't read the 'double' address not because there was an error in the config, but simply because the root node had been set. #address-cells = <1>; #size-cells = <1>;.
By expanding the debug output, I saw that the pointers were type og name 'broken', in quite a strange way: their first (starting from zero) byte was reset, something like 0xabcdef -> 0xab00ef. I had to use the familiar tactic: knowing the addresses of the corrupted memory, I wrote into the function printk to print this data. And also the calls themselves printk to spread around, where there are few of them. Unfortunately, it didn't become much clearer. Then I started, cross-referencing with the disassembled objdump version, to manually set breakpoints and step through the problematic piece of code. And then a mysterious and unpleasant discovery happened: if I immediately set a breakpoint somewhere far from a known-good state, then, upon stopping there, I see already corrupted memory. But if I try to quietly sneak up on it step by step, the error manages to hide! It smells like a faulty memory controller and a cache hiding the error if continuously querying the needed value. And what if...
Replacing the memory
Clinging to the possibility of solving the problem not on my end, I suggested that maybe I just got a faulty stick of memory. Then I remembered that a ten-year-old netbook — is not just a portable computer but also a valuable source of DDR2 SO-DIMM. As a bonus, you can insert the memory removed from the board and get almost instant Memtest freeze (Linux, by the way, managed to load almost to the graphical interface. But better not repeat such an experiment if you value information on mounted disks...). On one hand, it could be assumed that the memory simply didn’t fit this netbook. On the other hand, it did manage to boot! There’s hope that the memory is simply 'faulty', and the problem isn't in my wrapper.
Det betyder, at vi skal forsøge midlertidigt at starte med bærbar hukommelse. Desværre kan Quartus 18 ikke opgradere denne IP Core, så den kan redigeres. Det er derfor tid til at lære at oprette nye instanser. Det viste sig at være ret enkelt: vi søger i IP-kataloget efter DDR2 SDRAM Controller med ALTMEMPHY Intel FPGA IP og får en blok med samme grænseflade som før. Det eneste problem er at indstille de rigtige hukommelsesindstillinger.
Vi får hukommelsesmodulens parametre
Der er en relativt åbenlys måde at indstille modulet på: læse parametre fra SPD. Faktisk, hvis en almindelig computer læser SPD-data og indstiller controlleren baseret på dem, lad os da læse disse data på den nuværende netbook og indtaste dem i et regneark.
På Ubuntu gør man det : man skal installere pakken i2c-tools, indlæse modulerne eeprom og i2c-i801 (jeg er ikke sikker på, at den anden driver passer alle steder), hvorefter vi skal køre decode-dimms:
Output fra 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: 3Problemet er, at nogle timingoplysninger ikke er angivet, så vi går den anden vej.
Hvad står der på modulerne:


I dette tilfælde er det mere interessant at se på inskriptionen på selve hukommelseschipsene: K4T1G164QQ-HCF7. Ved at google denne sætning får vi et datablad på flere dusin sider med alle nødvendige specifikationer, som kan indtastes omhyggeligt i IP Core's egenskaber. Vær blot opmærksom på måleenhederne: nogle steder ns, andre steder — ps, og nogle gange i det hele taget dele tCK. Jeg vil ikke lære dig, hvad du skal være opmærksom på — jeg har selv gjort meget ved forsøgsmetoden (jeg kan ikke garantere, at man ikke kan "brænde" hukommelsen eller FPGA'en på den måde). Jeg vil dog påpege dette: jeg kunne meget længe ikke få controlleren til at fungere, og det sidste skridt var at indse, at jeg skulle kontrollere bredden af alle grænseflader til hukommelsen i forhold til den genererede kode i Verilog: når der i MemIfBundle er nævnt val mem_ba = IO(Output(UInt(2.W))), og der er 8 banker (dvs. adressebredden er 3 bit), så alt hvad vi har — udgangen fra hukommelsescontrolleren, som hænger i luften — er et problem, men ikke kritisk, så det synthesiseres, men fungerer ikke.
Det er muligt, at det hele ville fungere med det gamle modul, hvis controlleren blev opdateret, men lige nu orker jeg ikke at finde ud af potentielle flydende bugs: jeg har nok af mine egne.
Så, efter at have flyttet timebase-frequency til DTS fra at være på et specifikt CPU-niveau til at være på niveau med noden cpus (efter en helt forståelig forespørgsel fra kernen), får vi:
Skjult tekst
[ 0.000000] OF: fdt: Ignorerer hukommelsesområde 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 Tue Jul 9 22:42:36 MSK 2019
[ 0.000000] bootconsole [early0] aktiveret
[ 0.000000] Initial ramdisk ved: 0x(____ptrval____) (16777216 bytes)
[ 0.000000] Zone omfang:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Flytbar zone start for hver node
[ 0.000000] Tidlige hukommelsenode omfang
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] software IO TLB: kortlagt [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap er 0x112d
[ 0.000000] percpu: Indlejret 17 sider/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Bygget 1 zonelister, mobilitetsgruppering aktiv. Total sider: 258055
[ 0.000000] Kernels kommandolinje: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash tabel indgange: 131072 (orden: 8, 1048576 bytes)
[ 0.000000] Inode-cache hash tabel indgange: 65536 (orden: 7, 524288 bytes)
[ 0.000000] Sortering __ex_table...
[ 0.000000] Hukommelse: 937696K\/1046528K tilgængelig (6565K kernel kode, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K reserveret, 0K cma-reserveret)
[ 0.000000] SLUB: HWalign=64, Ordre=0-3, MinObjects=0, CPUer=1, Noder=1
[ 0.000000] rcu: Hierarkisk RCU implementering.
[ 0.000000] rcu: RCU hændelsessporing er aktiveret.
[ 0.000000] rcu: RCU begrænser CPUer fra NR_CPUS=8 til nr_cpu_ids=1.
[ 0.000000] rcu: Justerer geometri for rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, forudallokerede irqs: 0
[ 0.000000] plic: kortlagt 8 afbrydelser til 1 (ud af 2) håndterere.
[ 0.000000] clocksource: riscv_clocksource: maske: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Console: farvet dummy enhed 80x25
[ 0.000000] Kalibrerer forsinkelsesloop (sprunget over), værdi beregnet ved hjælp af timer frekvens.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: standard: 32768 minimum: 301
[ 0.030000] Mount-cache hash tabel indgange: 2048 (orden: 2, 16384 bytes)
[ 0.040000] Mountpoint-cache hash tabel indgange: 2048 (orden: 2, 16384 bytes)
[ 0.140000] rcu: Hierarkisk SRCU implementering.
[ 0.190000] smp: Opstarter sekundære CPUer ...
[ 0.190000] smp: Opstartet 1 node, 1 CPU
[ 0.220000] devtmpfs: initialiseret
[ 0.300000] random: get_random_u32 kaldt fra bucket_table_alloc+0x76\/0x17a med crng_init=0
[ 0.330000] clocksource: jiffies: maske: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex hash tabel indgange: 256 (orden: 2, 16384 bytes)
[ 0.380000] NET: Registreret protokol familie 16
[ 1.850000] vgaarb: indlæst
[ 1.870000] SCSI subsystem initialiseret
[ 1.900000] usbcore: registreret ny interface driver usbfs
[ 1.910000] usbcore: registreret ny interface driver hub
[ 1.920000] usbcore: registreret ny enhedsdriver usb
[ 1.930000] pps_core: LinuxPPS API ver. 1 registreret
[ 1.940000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 1.950000] PTP klok støtte registreret
[ 1.970000] Avanceret Linux Lydarkitektur Driver Initialiseret.
[ 2.010000] clocksource: Skiftet til clocksource riscv_clocksource
[ 2.600000] NET: Registreret protokol familie 2
[ 2.640000] tcp_listen_portaddr_hash hash tabel indgange: 512 (orden: 1, 8192 bytes)
[ 2.650000] TCP etableret hash tabel indgange: 8192 (orden: 4, 65536 bytes)
[ 2.670000] TCP bind hash tabel indgange: 8192 (orden: 5, 131072 bytes)
[ 2.700000] TCP: Hash tabeller konfigureret (etableret 8192 bind 8192)
[ 2.720000] UDP hash tabel indgange: 512 (orden: 2, 16384 bytes)
[ 2.730000] UDP-Lite hash tabel indgange: 512 (orden: 2, 16384 bytes)
[ 2.750000] NET: Registreret protokol familie 1
[ 2.770000] Udpakker initramfs...
[ 23.980000] Initramfs udpakning fejlede: junk i den komprimerede arkiv
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Block lagers SCSI generisk (bsg) driver version 0.4 indlæst (major 251)
[ 25.030000] io scheduler noop registreret
[ 25.040000] io scheduler deadline registreret
[ 25.050000] io scheduler cfq registreret (standard)
[ 25.060000] io scheduler mq-deadline registreret
[ 25.060000] io scheduler kyber registreret
[ 25.120000] sifive_gpio 64002000.gpio: SiFive GPIO chip registreret 6 GPIOs
[ 25.150000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[ 28.870000] Serial: 8250\/16550 driver, 4 porte, IRQ deling deaktiveret
[ 28.940000] sifive-serial 64000000.serial: kunne ikke finde controller klok
[ 28.950000] sifive-serial: probe af 64000000.serial fejlede med fejl -2
[ 28.980000] [drm] radeon kernel modesetting aktiveret.
[ 28.990000] [drm] amdgpu kernel modesetting aktiveret.
[ 29.500000] loop: modul indlæst
[ 29.610000] sifive_spi 64001000.spi: Kunne ikke finde bus klok
[ 29.620000] sifive_spi: probe af 64001000.spi fejlede med fejl -2
[ 29.640000] libphy: Fixed MDIO Bus: inspiceret
[ 29.680000] e1000e: Intel(R) PRO\/1000 Netværksdriver - 3.2.6-k
[ 29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: USB 2.0 'Forbedret' Vært Controller (EHCI) Driver
[ 29.710000] ehci-pci: EHCI PCI platform driver
[ 29.720000] ehci-platform: EHCI generisk platform driver
[ 29.750000] mousedev: PS\/2 mus enhed fælles for alle mus
[ 29.790000] usbcore: registreret ny interface driver usbhid
[ 29.800000] usbhid: USB HID kerne driver
[ 29.820000] usbcore: registreret ny interface driver snd-usb-audio
[ 29.900000] NET: Registreret protokol familie 10
[ 29.960000] Segment Routing med IPv6
[ 29.960000] sit: IPv6, IPv4 og MPLS over IPv4 tunneling driver
[ 30.020000] NET: Registreret protokol familie 17
[ 30.020000] Nøgletype dns_resolver registreret
[ 30.070000] bootconsole [early0] bruger init hukommelse og skal deaktiveres selv før den virkelige er klar
[ 30.080000] bootconsole [early0] deaktiveretEfter dette sker der ikke noget synligt.
Nu kan vi prøve at tackle tre problemer:
[ 23.980000] Initramfs udpakkede fejlen: affald i den komprimerede archive
...
[ 28.940000] sifive-serial 64000000.serial: kan ikke finde controller clock
...
[ 29.610000] sifive_spi 64001000.spi: Kan ikke finde bus clock… samt ophør af udskrivning til konsollen.
Det er slet ikke svært at tackle to problemer med frekvenser: vi skal blot tilføje punkterne clocks til underræderne af de nødvendige enheder, for nemheds skyld med et beskrivende navn til noden 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 = <0x64000000 0x1000>;
reg-names = "control";
@@ -107,6 +109,7 @@
interrupt-parent = <&L0>;
interrupts = <>;
reg = <0x64001000 0x1000>;
+ clocks = <&tlclk>;
reg-names = "control";
L12: mmc@0 {
compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
voltage-ranges = <3300 3300>;
};
};
- L11: tlclk {
+ tlclk: tlclk {
#clock-cells = <>;
clock-frequency = <>;
clock-output-names = "tlclk";Ved at tilføje linjen #define pr_debug printk i begyndelsen af filen init/initramfs.c, der viser en besked om affald i stedet for initramfs, får vi en lidt mere detaljeret besked:
[ 2.760000] Udpakkede initramfs...
[ 2.770000] Registreret gzip komprimerede data
[ 23.940000] Registreret (null) komprimerede data
[ 23.970000] Initramfs udpakkede fejlen: affald i den komprimerede archiveSå det er muligt, at affaldet ikke er i stedet for initramfs, men sammen.
Okay, han fandt noget, måske er det nok. Men hvor blev konsollen af? Søgningen giver et link til et problem på GitHub: — det viser sig, at en UART ifølge driveren ikke er værd at tale om. Men dato tilbage til 11. juli 2018 - et år siden. Det viste sig, at denne commit aldrig kom ind i det træ, som jeg kompilere kernen fra. Ved manuelt at anvende denne patch, fik jeg en fungerende Linux! Det viste sig, at problemet med initramfs virkelig ikke var kritisk.
Login som user=root, password=sifive, kunne jeg uden større problemer (bortset fra at forstå, at GPIO-nummeret har en base, som alt beregnes fra, og som bare skal læses fra den tilsvarende pseudo-fil) gennem sysfs tænde LED'en på boardet.
Som tidligere vedlægger jeg en tekstvideo om opstart af Linux. Under skiftet af konsollen fra earlyprintk til standardvisning er der noget støj, der ligner output fra en forkert indstillet UART-hastighed. Interessant nok fungerede afspilleren fint med denne "grød."
Kilde: habr.com
