Billedet viser, at Linux-kernen hilser dig via GPIO.
I denne del af historien om porteringen af RISC-V RocketChip til det kinesiske kort med Cyclone IV, får vi til sidst Linux til at køre, og samtidig lærer vi at konfigurere IP Core-controlleren til hukommelsen samt justere dts-beskrivelsen af hardwaren. Denne artikel er en fortsættelse af , men i modsætning til den ret omfattende forrige del, vil den være temmelig kort.
… Da setup_smp kun kaldes, hvis kernen er konfigureret med SMP-support, kan man forsøge at deaktivere multikernestøtte. Det ville være uheldigt, hvis jeg også skulle implementere atomaritet i hukommelsesmodulet (jeg troede, at cach'en klarede det selv), men i en enkeltkerne-situation bør det ikke genere os.
Det lykkedes stadig ikke…
[ 0.000000] OF: fdt: Ignoriranje memorijskega obsega 0x80000000 - 0x80200000
[ 0.000000] Linux različica 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc različica 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Čet Jul 4 18:38:10 MSK 2019
[ 0.000000] bootconsole [early0] omogočen
[ 0.000000] Začetni ramdisk pri: 0x(____ptrval____) (16777216 bajtov)
[ 0.000000] Obseg območij:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Začetek premikljivih območij za vsak vozlišče
[ 0.000000] Zgodnji obseg pomnilnika vozlišča
[ 0.000000] vozlišče 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Nastavitev pomnilnika vozlišča 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] programsko IO TLB: mapirano [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] Ni mogoče najti vnosa "cpu" v drevesu naprav
[ 0.000000] Zgrajeni so 1 seznami območij, premikanje skupin. Skupaj strani: 258055
[ 0.000000] Ukazna vrstica jedra: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Hash tabela za predpomnilnik dentry: 131072 (naročilo: 8, 1048576 bajtov)
[ 0.000000] Hash tabela za predpomnilnik inode: 65536 (naročilo: 7, 524288 bajtov)
[ 0.000000] Sortiranje __ex_table...
[ 0.000000] BUG: Slaba stanja strani v procesu swapper pfn:80bf7
[ 0.000000] stran:ffffffe03f029e08 št.:0 mapcount:-65280 mapiranje:0000000000000000 indeks:0x1
[ 0.000000] zastavice: 0x0()
[ 0.000000] surovo: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[ 0.000000] surovo: 0000000000000001 0000000000000000 00000000ffff00ff
[ 0.000000] stran je bila izpuščena zaradi: nenulčnega mapcount
[ 0.000000] Modul so povezani:
[ 0.000000] CPU: 0 PID: 0 Komanda: swapper Ni obremenjena 4.19.0-sifive-1+ #1
[ 0.000000] Sledi klic:
[ 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] Onemogočeno sledenje zaklepanju zaradi obremenjenja jedra
[ 0.000000] BUG: Slaba stanja strani v procesu swapper pfn:80bf9
[ 0.000000] stran:ffffffe03f029e78 št.:0 mapcount:-65280 mapiranje:0000000000000000 indeks:0x0
[ 0.000000] zastavice: 0x0()
[ 0.000000] surovo: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[ 0.000000] surovo: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] stran je bila izpuščena zaradi: nenulčnega mapcount
[ 0.000000] Modul so povezani:
[ 0.000000] CPU: 0 PID: 0 Komanda: swapper Obremenjena: G B 4.19.0-sifive-1+ #1
[ 0.000000] Sledi klic:
[ 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: Slaba stanja strani v procesu swapper pfn:80bfa
[ 0.000000] stran:ffffffe03f029eb0 št.:0 mapcount:-65280 mapiranje:0000000000000000 indeks:0x0
[ 0.000000] zastavice: 0x0()
[ 0.000000] surovo: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[ 0.000000] surovo: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] stran je bila izpuščena zaradi: nenulčnega mapcount
[ 0.000000] Modul so povezani:
[ 0.000000] CPU: 0 PID: 0 Komanda: swapper Obremenjena: G B 4.19.0-sifive-1+ #1
[ 0.000000] Sledi klic:
[ 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: Slaba stanja strani v procesu swapper pfn:80bfc
[ 0.000000] stran:ffffffe03f029f20 št.:0 mapcount:-65280 mapiranje:0000000000000000 indeks:0x0
[ 0.000000] zastavice: 0x0()
[ 0.000000] surovo: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[ 0.000000] surovo: 0000000000000000 0000000000000000 00000000ffff00ff
...Zanimljivo je da sam nakon cijelog debagiranja odlučio pogledati kako bi trebao izgledati „referentni“ izlaz jezgre, rekao make qemu, i vidio sličnu grešku.
Nažalost, sljedeća razina (Linux kernel) je složenija: GDB, povezan preko JTAG-a s RocketChip-om, očigledno radi s fizičkim adresama bez obzira na to kako je MMU podešen, a jezgra je u relevantnom trenutku već postavila mapiranje adresa, pa jednostavno reći display/10i $pc neće proći — vidjet ćemo samo mnogo unimp. Ipak, ako smo već utvrdili pomak (izgleda da 0x80200000 -> 0xffffffe000000000), možemo malo prevariti:
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)Breakpointi se postavljaju na sličan način:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Nastavak.
Program je primio signal SIGTRAP, Signal/trap za točku prekida.
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 je zaustavljen: okvir nije sačuvao PCSamo što ih moram ručno ukloniti da bismo nastavili — za GDB je to nekakav potpuno nejasan trap. Ah da, ako slučajno kažete s ili n namesto si, gdb će pokušati umetnuti nevidljivi breakpoint, koji iz očitih razloga neće biti postavljen, ali ne možete ni odvratiti GDB. Ali ne žurite s ponovnim pokretanjem ploče — prema mojim zapažanjima, dovoljno je ponovo pokrenuti samo gdb (imajte na umu da stari breakpointi možda neće nestati).
U biti, morat ćemo se suočiti s prvobitnim problemom: postavljanje debagiranja printk u funkciju of_find_node_by_type, ki jo uporablja koda za iskanje zagonskega procesorja, kaže, da vidi nekakšen šum namesto imen vrst naprav. Na primer, nekje dobi vrstico »Serijski priključek«, čeprav ta izrecno ne obstaja v dtb v polju device_type. Ko sem iskal te bajte v jedru, sem jih našel, pogledal na offset in razumel očitno: velikost jedra v zagonih je očitno podcenjena: dodeljenih je 8Mb, vendar zasede več kot deset. Dodelil sem 16Mb, vendar čudnosti niso prenehale. Po skakljanju z branjem FDT z različnih naslovov (zelo pogosto se naslov predaja jedru v registru a1), sem končno sklenil, da bom sledil, kaj točno sedaj tukaj razčlenjuje. Na srečo, namesto da bi se sprehajal s privzeto orodjem za odpravljanje napak (in se spomnimo, da so tukaj določene posebnosti s pretvorbo naslovov, ki jih je še treba na nek način rešiti), lahko preprosto in na silo v datoteki drivers/of/fdt.c določim #define pr_debug printk. Na koncu je prišlo do:
dodajanje izhodnih podatkov
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 - omejiti število območij v vozlišču /memory
* @limit: maksimum vnosa
@@ -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);Izpis na strojni opremi
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]Izpis v 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 core, and the tree outputs BBL before them) On one hand, FDT reads successfully, on the other hand — it turns out to be some nonsense in the parsed 'object' tree.
During debugging, I realized that BBL could not read the 'double' address not because there was an error in the config, but simply because the root node was configured incorrectly. #address-cells = <1>; #size-cells = <1>;.
By expanding the debug output, I saw that the pointers to type in name had 'collided', and quite strangely: their first (starting from zero) byte was zeroed out, something like 0xabcdef -> 0xab00ef. I had to use a familiar tactic: knowing the addresses where the corrupted memory is located, I had to add code to the function printk to print this data. And the function calls printk had to be shuffled around where they were scarce. Unfortunately, it did not become much clearer. Then I started, cross-referencing with the disassembled objdump version, to manually set breakpoints and step through the problematic section of code. And here it was discovered that if you immediately set a breakpoint somewhere far from a known-good state, then, upon stopping there, I would see already corrupted memory. But if I tried to sneak up on it step by step, the error manages to hide! This smells like a faulty memory controller and a cache hiding the error if the required value is constantly requested. And what if…
We replace the memory
Holding onto the possibility of solving the problem not on my side, I assumed that maybe I just got a faulty memory stick. Then I remembered that the ten-year-old netbook is not only a portable computer but also a valuable source of DDR2 SO-DIMM. As a bonus, you can put the memory pulled from the board into it, and get almost instantaneous hanging of Memtest (Linux, by the way, almost loaded to the graphical interface during this. But it's better not to repeat such an experiment if the data on the mounted drives is dear to you…). On one hand, one might assume that the memory simply did not fit this particular netbook. On the other hand, it was able to boot! There was hope that the memory was simply 'faulty', and the problem was not in my wrapper.
Torej, treba poskusiti začasno zagnati s pomnilnikom iz netbooka. Na žalost Quartus 18 ne more nadgraditi tega IP jedra tako, da bi ga bilo mogoče urejati. To pomeni, da je vendarle prišel čas, da se naučimo ustvarjati nove instance. Vse se je izkazalo za precej preprosto: v IP katalogu poiščemo postavko DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP in dobimo blok z istim vmesnikom, kot prej. Edina težava je pravilno nastaviti parametre pomnilnika.
Dobimo parametre pomnilnika
Obstaja relativno očiten način za nastavitev modula: prebrati parametre iz SPD. Res je, če običajen računalnik prebere podatke SPD in nastavi po njih krmilnik, potem jih preberimo na obstoječem netbooku in jih vpišemo v tabelo.
Na Ubuntu to poteka : treba je namestiti paket i2c-tools, naložiti module eeprom in i2c-i801 (nisem pa prepričan, da bo drugi gonilnik deloval povsod), nato pa zagnati decode-dimms:
Izhod 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: 3Težava je v tem, da nekateri časi tukaj niso navedeni, zato bomo šli po drugi poti.
Kaj je napisano na modulih:


V tem primeru je zanimivejša oznaka na samih pomnilniških čipih: K4T1G164QQ-HCF7. Po vnosu te črte v Google dobimo datasheet, dolg več deset strani, z vsemi potrebnimi parametri, ki jih lahko previdno pretipkamo v lastnosti IP jedra. Le pazite na enote mere: nekje ns, nekje — ps, občasno pa tudi delčki tCK. Ne bom vas učil, na kaj je treba biti pozoren, saj sem sam veliko nastavljal na pamet (ne morem pa jamčiti, da s tem ne morete "uničiti" pomnilnika ali FPGA). Opažam le to: dolgo časa nisem mogel spraviti krmilnika v delo in zadnji korak je bilo spoznanje, da je treba preveriti širino vseh vmesnikov za pomnilnik v skladu s generiranim kodo v Verilogu: kajti ko v MemIfBundle navedemo val mem_ba = IO(Output(UInt(2.W))), in bank 8 (t.j. naslovna širina 3 bita), potem vse, kar imamo — visijoč izhod iz krmilnika pomnilnika — je problem, vendar ne kritičen, zato se vse sintetizira, vendar ne deluje.
Mogoče bi se vse zagnalo tudi s starim modulom, če bi nadgradili krmilnik, vendar mi trenutno ni do raziskovanja potencialnih plavajočih napak: z lastnimi imam dovolj.
Torej, po premiku timebase-frequency v DTS z ravni konkretnega CPU na raven vozlišča cpu (na povsem razumljivo prošnjo jedra), dobimo:
Skriti tekst
[ 0.000000] OF: fdt: Ignoriranje raspona memorije 0x80000000 - 0x80200000
[ 0.000000] Linux verzija 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc verzija 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Uto Jul 9 22:42:36 MSK 2019
[ 0.000000] bootconsole [early0] omogućen
[ 0.000000] Početni ramdisk na: 0x(____ptrval____) (16777216 bajtova)
[ 0.000000] Rasponi zona:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Početna zona za svaki čvor
[ 0.000000] Rane memorijske zone
[ 0.000000] čvor 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem podešavanje čvora 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] softverski IO TLB: mapirano [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap je 0x112d
[ 0.000000] percpu: Ugrađeno 17 stranica/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Izgrađena su 1 zonelista, mobilna grupacija uključena. Ukupne stranice: 258055
[ 0.000000] Kernel komanda: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash tabela unosa: 131072 (red: 8, 1048576 bajtova)
[ 0.000000] Inode-cache hash tabela unosa: 65536 (red: 7, 524288 bajtova)
[ 0.000000] Sortiranje __ex_table...
[ 0.000000] Memorija: 937696K\/1046528K dostupno (6565K kernel koda, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K rezervirano, 0K cma-rezervirano)
[ 0.000000] SLUB: HWalign=64, Redosled=0-3, MinObjects=0, CPU=1, Čvorovi=1
[ 0.000000] rcu: Hijerarhijska RCU implementacija.
[ 0.000000] rcu: RCU praćenje događaja je omogućeno.
[ 0.000000] rcu: RCU ograničava CPU iz NR_CPUS=8 na nr_cpu_ids=1.
[ 0.000000] rcu: Podešavanje geometrije za rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, predefinisani irqi: 0
[ 0.000000] plic: mapirano 8 prekida na 1 (iz 2) rukovaoca.
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Konsole: boja dummy uređaja 80x25
[ 0.000000] Kalibracija petlje kašnjenja (preskočeno), vrednost izračunata korišćenjem frekvencije timera.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: podrazumevano: 32768 minimum: 301
[ 0.030000] Mount-cache hash tabela unosa: 2048 (red: 2, 16384 bajtova)
[ 0.040000] Mountpoint-cache hash tabela unosa: 2048 (red: 2, 16384 bajtova)
[ 0.140000] rcu: Hijerarhijska SRCU implementacija.
[ 0.190000] smp: Pokretanje sekundarnih CPU-a ...
[ 0.190000] smp: Pokrenut 1 čvor, 1 CPU
[ 0.220000] devtmpfs: inicijalizovan
[ 0.300000] random: get_random_u32 pozvano iz bucket_table_alloc+0x76/0x17a sa crng_init=0
[ 0.330000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex hash tabela unosa: 256 (red: 2, 16384 bajtova)
[ 0.380000] NET: Registrovana porodica protokola 16
[ 1.850000] vgaarb: učitano
[ 1.870000] SCSI podsistem inicijalizovan
[ 1.900000] usbcore: registrovan novi interfejs vozača usbfs
[ 1.910000] usbcore: registrovan novi interfejs vozača hub
[ 1.920000] usbcore: registrovan novi uređaj vozača usb
[ 1.930000] pps_core: LinuxPPS API ver. 1 registrovan
[ 1.940000] pps_core: Softverska ver. 5.3.6 - Autorska prava 2005-2007 Rodolfo Giometti
[ 1.950000] PTP satna podrška registrovana
[ 1.970000] Napredna Linux zvučna arhitektura drajver inicijalizovan.
[ 2.010000] clocksource: Prebačeno na clocksource riscv_clocksource
[ 2.600000] NET: Registrovana porodica protokola 2
[ 2.640000] tcp_listen_portaddr_hash hash tabela unosa: 512 (red: 1, 8192 bajtova)
[ 2.650000] TCP uspostavljena hash tabela unosa: 8192 (red: 4, 65536 bajtova)
[ 2.670000] TCP bind hash tabela unosa: 8192 (red: 5, 131072 bajtova)
[ 2.700000] TCP: Hash tabele konfigurisan (uspostavljeni 8192 bind 8192)
[ 2.720000] UDP hash tabela unosa: 512 (red: 2, 16384 bajtova)
[ 2.730000] UDP-Lite hash tabela unosa: 512 (red: 2, 16384 bajtova)
[ 2.750000] NET: Registrovana porodica protokola 1
[ 2.770000] Raspakivanje initramfs...
[ 23.980000] Raspakivanje initramfs nije uspelo: smeće u komprimovanoj arhivi
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Blok sloj SCSI generički (bsg) drajver verzija 0.4 učitan (major 251)
[ 25.030000] io scheduler noop registrovan
[ 25.040000] io scheduler deadline registrovan
[ 25.050000] io scheduler cfq registrovan (podrazumevano)
[ 25.060000] io scheduler mq-deadline registrovan
[ 25.060000] io scheduler kyber registrovan
[ 25.120000] sifive_gpio 64002000.gpio: SiFive GPIO čip registrovan 6 GPIO-a
[ 25.150000] shpchp: Standardni drajver za Hot Plug PCI kontroler verzija: 0.4
[ 28.870000] Serial: 8250/16550 drajver, 4 porta, deljenje IRQ-a onemogućeno
[ 28.940000] sifive-serial 64000000.serial: nije moguće pronaći kontroler sat
[ 28.950000] sifive-serial: pokušaj 64000000.serial nije uspeo sa greškom -2
[ 28.980000] [drm] radeon kernel modesetting omogućeno.
[ 28.990000] [drm] amdgpu kernel modesetting omogućeno.
[ 29.500000] loop: modul učitan
[ 29.610000] sifive_spi 64001000.spi: Nije moguće pronaći sat magistrale
[ 29.620000] sifive_spi: pokušaj 64001000.spi nije uspeo sa greškom -2
[ 29.640000] libphy: Fiksna MDIO magistrala: proba
[ 29.680000] e1000e: Intel(R) PRO/1000 mrežni drajver - 3.2.6-k
[ 29.690000] e1000e: Autorska prava(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: USB 2.0 'Poboljšani' drajver host kontrolera (EHCI)
[ 29.710000] ehci-pci: EHCI PCI platform drajver
[ 29.720000] ehci-platform: EHCI generički platform drajver
[ 29.750000] mousedev: PS/2 miš uređaj zajednički za sve miševe
[ 29.790000] usbcore: registrovan novi interfejs vozača usbhid
[ 29.800000] usbhid: USB HID glavni drajver
[ 29.820000] usbcore: registrovan novi interfejs vozača snd-usb-audio
[ 29.900000] NET: Registrovana porodica protokola 10
[ 29.960000] Segment routing sa IPv6
[ 29.960000] sit: IPv6, IPv4 i MPLS preko IPv4 tunel vozač
[ 30.020000] NET: Registrovana porodica protokola 17
[ 30.020000] Tip ključa dns_resolver registrovan
[ 30.070000] bootconsole [early0] koristi inicijalnu memoriju i mora biti onemogućen čak i pre nego što stvarna bude spremna
[ 30.080000] bootconsole [early0] onemogućenПосле этого ничего не видно.
Теперь можно попытаться решить три проблемы:
[ 23.980000] Не удалось распаковать initramfs: мусор в сжатом архиве
...
[ 28.940000] sifive-serial 64000000.serial: не удается найти тактовый сигнал контроллера
...
[ 29.610000] sifive_spi 64001000.spi: Не удалось найти шину тактового сигнала… а также с прекращением вывода в консоль.
С двумя проблемами с тактами справиться довольно просто: нужно добавить пункты clocks в поддеревья нужных устройств, дав им удобные имена меток для узла 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";Добавив строку #define pr_debug printk в начало файла init/initramfs.c, выводящее сообщение о мусоре вместо initramfs, мы получаем немного более подробное сообщение:
[ 2.760000] Распаковка initramfs...
[ 2.770000] Обнаружены сжатые данные gzip
[ 23.940000] Обнаружены (null) сжатые данные
[ 23.970000] Не удалось распаковать initramfs: мусор в сжатом архивеТо есть, возможно, мусор не namesto initramfs, а skupaj.
Окей, что-то он нашёл, возможно, этого достаточно. А куда делась консоль? Поиск даёт ссылку на проблему на GitHub: — оказывается, один UART это, по мнению драйвера, даже не стоит обсуждать. Но датировано 11 июля 2018 года — год назад. Оказалось, этот коммит так и не попал в дерево, из которого у меня собирается ядро. Применив этот патч вручную, я получил работающий Linux! Оказалось, проблема с initramfs действительно не критична.
Залогинившись как user=root, password=sifive, я смог без особых проблем (за исключением того, чтобы понять, что у номера GPIO есть базовый номер, от которого всё считается, и который просто нужно прочитать из соответствующего псевдо-файла) через sysfs зажечь светодиод на плате.
Kot v prejšnjem primeru, prilagam besedilni video zagona Linuxa. Med preklapljanjem konzole z earlyprintk na običajno pride do nekakšnega šuma, ki spominja na izpis ob napačno nastavljeni hitrosti UART. Kar je zanimivo, predvajalnik je uspešno obdelal to 'kašo'.
Izvor: habr.com
