A képen a Linux kernel üdvözöl titeket a GPIO-n keresztül.
Ebben a részben a RISC-V RocketChip portálásának történetében végre elindítjuk a Linuxot, valamint megtanuljuk konfigurálni az IP Core memóriavezérlőt, és egy kicsit módosítjuk a dts leírást a hardverről. Ez a cikk a folytatása , de ellentétben a jelentősen megnövekedett elődjével, ez meglehetősen rövid lesz.
… Mivel setup_smp csak akkor kerül meghívásra, ha a kernel SMP támogatással van konfigurálva, érdemes megpróbálni letiltani a többmagúságot. Nem lenne kellemes, ha a memória modulban az atomaritás támogatását is meg kellene valósítanom (azt hittem, hogy ezzel a cache önállóan foglalkozik), de egymagos esetben ez nem okozhat problémát számunkra.
Még mindig nem indult el…
[ 0.000000] OF: fdt: Figyelmen kívül hagyva a memória tartomány 0x80000000 - 0x80200000
[ 0.000000] Linux verzió 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc verzió 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Csüt Jul 4 18:38:10 MSK 2019
[ 0.000000] bootconsole [early0] engedélyezve
[ 0.000000] Kezdeti ramdisk itt: 0x(____ptrval____) (16777216 bájt)
[ 0.000000] Zóna tartományok:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normális [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Mozgatható zóna kezdete minden csomópont számára
[ 0.000000] Korai memória csomópont tartományok
[ 0.000000] csomópont 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem beállítás csomópont 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] szoftveres IO TLB: leképezve [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] Nem sikerült megtalálni a "cpu" eszközfa bejegyzést
[ 0.000000] Összesen 1 zónalista épült, mozgathatósági csoportosítás engedélyezve. Összesen oldal: 258055
[ 0.000000] Kernel parancssor: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash táblázat bejegyzései: 131072 (rend: 8, 1048576 bájt)
[ 0.000000] Inode-cache hash táblázat bejegyzései: 65536 (rend: 7, 524288 bájt)
[ 0.000000] Rendezés __ex_table...
[ 0.000000] BUG: Rossz oldalállapot a swapper folyamatban pfn:80bf7
[ 0.000000] oldal:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[ 0.000000] zászlók: 0x0()
[ 0.000000] nyers: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[ 0.000000] nyers: 0000000000000001 0000000000000000 00000000ffff00ff
[ 0.000000] oldal kiírták, mert: nemnulla mapcount
[ 0.000000] Modulok összekötve:
[ 0.000000] CPU: 0 PID: 0 Komp. swapper Nem szennyezett 4.19.0-sifive-1+ #1
[ 0.000000] Hívás Nyom:
[ 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] Zárva a zár hibakeresés a kernel szennyezése miatt
[ 0.000000] BUG: Rossz oldalállapot a swapper folyamatban pfn:80bf9
[ 0.000000] oldal:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] zászlók: 0x0()
[ 0.000000] nyers: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[ 0.000000] nyers: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] oldal kiírták, mert: nemnulla mapcount
[ 0.000000] Modulok összekötve:
[ 0.000000] CPU: 0 PID: 0 Komp. swapper Szennyezett: G B 4.19.0-sifive-1+ #1
[ 0.000000] Hívás Nyom:
[ 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: Rossz oldalállapot a swapper folyamatban pfn:80bfa
[ 0.000000] oldal:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] zászlók: 0x0()
[ 0.000000] nyers: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[ 0.000000] nyers: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] oldal kiírták, mert: nemnulla mapcount
[ 0.000000] Modulok összekötve:
[ 0.000000] CPU: 0 PID: 0 Komp. swapper Szennyezett: G B 4.19.0-sifive-1+ #1
[ 0.000000] Hívás Nyom:
[ 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: Rossz oldalállapot a swapper folyamatban pfn:80bfb
[ 0.000000] oldal:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] zászlók: 0x0()
[ 0.000000] nyers: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[ 0.000000] nyers: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] oldal kiírták, mert: nemnulla mapcount
[ 0.000000] Modulok összekötve:
[ 0.000000] CPU: 0 PID: 0 Komp. swapper Szennyezett: G B 4.19.0-sifive-1+ #1
[ 0.000000] Hívás Nyom:
[ 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Érdekes, hogy a teljes hibakeresés után úgy döntöttem, megnézem, hogyan kell kinéznie a "referencia" mag kimenetének, mondta make qemu, és hasonló hibát láttam.
Sajnos a következő szint (Linux kernel) bonyolultabb: a GDB, amely JTAG-on keresztül csatlakozik a RocketChip-hez, nyilvánvalóan fizikai címekkel dolgozik, függetlenül attól, hogy az MMU hogyan van beállítva, és a mag már beállította a címek leképezését az említett pillanatban, így egyszerűen mondani display/10i $pc nem fog működni — csak sok unimp. Viszont, ha már megállapítottuk az eltolást (úgy tűnik, hogy 0x80200000 -> 0xffffffe000000000), akkor lehet trükközni:
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)A töréspontokat hasonlóan állítják be:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Folytatás.
A program jelet kapott SIGTRAP, Nyomkövetési/töréspont csapda.
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 ?? ()
A visszakeresés leállt: a keret nem mentette a PC-tCsak annyit kér, hogy manuálisan távolítsam el őket, hogy továbbléphessek — a GDB számára ez valami teljesen érthetetlen csapda. Óh igen, ha véletlenül azt mondja s vagy n $CI_COMMIT_TAG si, a gdb megpróbál beszúrni egy implicit töréspontot, ami nyilvánvaló okokból nem áll be, de már nem tudja lebeszélni GDB-t. De ne siess a táblára való újraindítással — tapasztalataim szerint elegendő csak a gdb-t újraindítani (ne feledje, hogy a régi töréspontok valószínűleg nem fognak eltűnni).
Valójában foglalkoznia kell az eredeti problémával: a hibakeresési printk a függvényben. of_find_node_by_type, amelyet a boot CPU keresztezésére használnak, azt mutatja, hogy valamilyen szemétt láthat, ahelyett, hogy eszköztípus neveket látna. Például úgy tűnik, hogy egy "Sorozatport" szöveget valahonnan behoz, holott az nyilvánvalóan nincs a dtb-ben a mezőben. eszköztípus. A kernel képeiben keresve megtaláltam ezeket a biteket, megnéztem a eltolást, és a nyilvánvalót kiértettem: a kernel mérete a betöltési paraméterekben nyilvánvalóan alábecsült: 8Mb-ot kapott, de valójában több mint tízet foglal el. 16Mb-ot osztottam ki, de a furcsaságok nem szűntek meg. Az FDT olvasásával kapcsolatos különféle címen való jártasság után (a cím normálisan az kernelnek van átadva a regiszterben a1), végül úgy döntöttem, hogy nyomozni fogok, hogy mi történik most a parsing során. Szerencsére, a debugger felkutatása helyett (és emlékezzünk arra, hogy vannak finomságok a címek fordításával kapcsolatban, amelyeket valahogyan meg kell oldani), egyszerűen, bár kissé primitíven, a drivers/of/fdt.c kell #define pr_debug printk. Végül ezt kaptam:
debug kimenet hozzáadása
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);Kimenet a hardveren
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]Kimenet a QEMU-ban
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(A BBL prints lines with "time stamps" before them, and the core outputs a tree) On one hand, the FDT is read successfully, but on the other hand, 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 was set. #address-cells = <1>; #size-cells = <1>;.
By expanding the debug output, I saw that the pointers to type és name "collided" in a rather strange way: their first byte (starting from zero) was nullified, something like 0xabcdef -> 0xab00ef. I had to use a familiar tactic: knowing the addresses of the corrupted memory, I added a function printk to print this data. And also spread out the calls printk where they were sparse. Unfortunately, it didn't become much clearer. Then I started manually placing breakpoints, comparing with the disassembled objdump version, and stepping through the problematic section of the code. And then a mysterious and unpleasant discovery emerged: if I immediately set a breakpoint somewhere far from a known-good state, I would see already corrupted memory when I stopped there. But if I tried to sneak up to it step by step, the error managed to hide itself! It smells like a faulty memory controller and a cache hiding the error if the required value is constantly requested. But what if...
Replacing the memory
Clinging to the possibility of solving the problem not on my end, I speculated that maybe I just had a faulty memory stick. Then I remembered that a decade-old netbook is not only a portable computer but also a valuable source of DDR2 SO-DIMM. As a bonus, you can insert memory taken from the board, and get an almost instant Memtest hang (Linux, by the way, booted almost to the graphical interface in this case. But better not repeat such an experiment if you value the information on the mounted disks...). On one hand, it can be assumed that the memory simply didn't fit this particular netbook. On the other hand, it managed to boot! There was hope that the memory was simply "faulty" and the problem was not in my wrapper.
Tehát, próbálnunk kell ideiglenesen az netbook memóriával indítani. Sajnos a Quartus 18 nem tudja frissíteni ezt az IP Core-t úgy, hogy szerkeszthető legyen. Így elérkezett az idő, hogy megtanuljunk új instanciákat létrehozni. Mindez meglehetősen egyszerűnek bizonyult: keressük meg az IP Catalogban a DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP elemet, és kapunk egy blokkot, amely ugyanazzal a felülettel rendelkezik, mint korábban. Az egyetlen probléma a memória megfelelő beállítása.
A memóriamodul paraméterei
Van egy viszonylag nyilvánvaló módja a modul beállításának: olvasni az SPD-ből származó paramétereket. Valóban, ha a szokásos számítógép kiolvassa az SPD adatokat és ennek megfelelően állítja be a vezérlőt, akkor nézzük meg ezeket az adatokat az adott netbook-on, és írjuk be őket egy táblázatba.
Ubuntu alatt ezt meg lehet csinálni : fel kell telepíteni a csomagot i2c-tools, be kell tölteni a modulokat eeprom és i2c-i801 (nem tudom igazán, hogy a második illesztőprogram mindenhol megfelelő-e), majd futtatni kell a decode-dimms:
A decode-dimms kimenete
# 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: 3A probléma az, hogy itt néhány időzítés nincs megadva, így a második utat választjuk.
Mit írnak a modulokon:


Ebben az esetben érdekesebb a memóriachipek felirata: K4T1G164QQ-HCF7. Ezt a sort beírva a Google-ba, datasheet-et kapunk több tucat oldalon keresztül, minden szükséges paraméterrel, amelyeket gondosan be lehet írni az IP Core tulajdonságai közé. Csak ügyeljen a mértékegységekre: néha ns, néha - A folyamatok listájának megjelenítése., és néha még tizedek is tCK. Nem szeretném megtanítani, hogy mire figyeljen, sok mindent a tapasztalat révén állítottam be (ezzel együtt nem tudom garantálni, hogy ez nem "égetheti el" a memóriát vagy a FPGA-t). Csak annyit emelnék ki, hogy nagyon sokáig nem tudtam rávenni a vezérlőt, hogy működjön, és az utolsó lépés az volt, hogy rájöttem, hogy ellenőriznem kell minden memóriához vezető interfész szélességét, hogy megfeleljen a generált Verilog kódnak: hiszen amikor a MemIfBundle azt írja elő val mem_ba = IO(Output(UInt(2.W))), és a bankok 8 (azaz a cím szélessége 3 bit), akkor minden, amink van, a memória vezérlőből lógó output - probléma, de nem kritikus, ezért minden szintetizálódik, de nem működik.
Lehet, hogy a régi modul is működött volna, ha frissítjük a vezérlőt, de egyelőre nincs kedvem foglalkozni a potenciális lebegő hibákkal: nekem is van elég a sajátommal.
Tehát, miután áthelyeztük timebase-frequency a DTS-ben egy adott CPU szintjéről egy csomópont szintjére cpus (a well-understood request from the core), we get:
Rejtett szöveg
[ 0.000000] OF: fdt: Figyelmen kívül hagyva a memória tartomány 0x80000000 - 0x80200000
[ 0.000000] Linux verzió 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc verzió 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP 2019. július 9. 22:42:36 MSK
[ 0.000000] bootconsole [early0] engedélyezve
[ 0.000000] Kezdeti ramdisk a következőnél: 0x(____ptrval____) (16777216 bájt)
[ 0.000000] Zóna tartományok:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normál [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Áthelyezhető zóna kezdete minden csomópontnál
[ 0.000000] Korai memória csomópont tartományok
[ 0.000000] csomópont 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem beállítás a 0. csomóponthoz [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] szoftveres IO TLB: leképezve [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap értéke: 0x112d
[ 0.000000] percpu: Beágyazott 17 oldal/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] 1 zonalista építve, mobilitási csoportosítás engedélyezve. Összes oldal: 258055
[ 0.000000] Kernel parancssor: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash táblázat bejegyzései: 131072 (rend: 8, 1048576 bájt)
[ 0.000000] Inode-cache hash táblázat bejegyzései: 65536 (rend: 7, 524288 bájt)
[ 0.000000] __ex_table rendezése...
[ 0.000000] Memória: 937696K\/1046528K elérhető (6565K kernel kód, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K fenntartva, 0K cma-fenntartva)
[ 0.000000] SLUB: HWalign=64, Rend=0-3, MinObjects=0, CPU-k=1, Csomópontok=1
[ 0.000000] rcu: Hierarchikus RCU megvalósítás.
[ 0.000000] rcu: RCU esemény nyomkövetés engedélyezve.
[ 0.000000] rcu: RCU a CPU-kat NR_CPUS=8-ról nr_cpu_ids=1-re korlátozza.
[ 0.000000] rcu: Geometria állítása rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, előre allokált irqs: 0
[ 0.000000] plic: 8 megszakítást térképezett 1 (2-ből) kezelőre.
[ 0.000000] óraforrás: riscv_clocksource: maszk: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Konzol: színes dummy eszköz 80x25
[ 0.000000] Késleltetés kalibrálása (átugorva), érték a időzítő gyakorisága alapján kiszámítva.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: alapértelmezett: 32768 minimum: 301
[ 0.030000] Mount-cache hash táblázat bejegyzései: 2048 (rend: 2, 16384 bájt)
[ 0.040000] Mountpoint-cache hash táblázat bejegyzései: 2048 (rend: 2, 16384 bájt)
[ 0.140000] rcu: Hierarchikus SRCU megvalósítás.
[ 0.190000] smp: Másodlagos CPU-k indítása ...
[ 0.190000] smp: 1 csomópont, 1 CPU elindítva
[ 0.220000] devtmpfs: inicializálva
[ 0.300000] random: get_random_u32 hívás a bucket_table_alloc+0x76\/0x17a-ból crng_init=0 mellett
[ 0.330000] óraforrás: jiffies: maszk: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex hash táblázat bejegyzései: 256 (rend: 2, 16384 bájt)
[ 0.380000] NET: Regisztrált protokollcsalád 16
[ 1.850000] vgaarb: betöltve
[ 1.870000] SCSI alrendszer inicializálva
[ 1.900000] usbcore: regisztrált új interfészmeghajtó usbfs
[ 1.910000] usbcore: regisztrált új interfészmeghajtó hub
[ 1.920000] usbcore: regisztrált új eszközmeghajtó usb
[ 1.930000] pps_core: LinuxPPS API ver. 1 regisztrálva
[ 1.940000] pps_core: Szoftver verzió 5.3.6 - Szerzői jog 2005-2007 Rodolfo Giometti
[ 1.950000] PTP óra támogatás regisztrálva
[ 1.970000] Fejlett Linux Hangarchitektúra Meghajtó Inicializálva.
[ 2.010000] óraforrás: Átváltva riscv_clocksource-ra
[ 2.600000] NET: Regisztrált protokollcsalád 2
[ 2.640000] tcp_listen_portaddr_hash hash táblázat bejegyzései: 512 (rend: 1, 8192 bájt)
[ 2.650000] TCP létrehozott hash táblázat bejegyzései: 8192 (rend: 4, 65536 bájt)
[ 2.670000] TCP bind hash táblázat bejegyzései: 8192 (rend: 5, 131072 bájt)
[ 2.700000] TCP: Hash táblázatok konfigurálva (létrehozott 8192 bind 8192)
[ 2.720000] UDP hash táblázat bejegyzései: 512 (rend: 2, 16384 bájt)
[ 2.730000] UDP-Lite hash táblázat bejegyzései: 512 (rend: 2, 16384 bájt)
[ 2.750000] NET: Regisztrált protokollcsalád 1
[ 2.770000] Initramfs kibővítése...
[ 23.980000] Initramfs kibővítése meghiúsult: szemét a tömörített archívumban
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Blokk szintű SCSI általános (bsg) meghajtó verzió 0.4 betöltve (fő 251)
[ 25.030000] io ütemező noop regisztrálva
[ 25.040000] io ütemező deadline regisztrálva
[ 25.050000] io ütemező cfq regisztrálva (alapértelmezett)
[ 25.060000] io ütemező mq-deadline regisztrálva
[ 25.060000] io ütemező kyber regisztrálva
[ 25.120000] sifive_gpio 64002000.gpio: SiFive GPIO chip regisztrálva 6 GPIO
[ 25.150000] shpchp: Standard Hot Plug PCI Controller Driver verzió: 0.4
[ 28.870000] Soros: 8250\/16550 meghajtó, 4 port, IRQ megosztás letiltva
[ 28.940000] sifive-serial 64000000.serial: nem található az óra vezérlő
[ 28.950000] sifive-serial: 64000000.serial vizsgálata meghiúsult - hiba -2
[ 28.980000] [drm] radeon kernele módosítása engedélyezve.
[ 28.990000] [drm] amdgpu kernele módosítása engedélyezve.
[ 29.500000] loop: modul betöltődött
[ 29.610000] sifive_spi 64001000.spi: Nem található busz óra
[ 29.620000] sifive_spi: 64001000.spi vizsgálata meghiúsult - hiba -2
[ 29.640000] libphy: Fix MDIO Bus: vizsgálva
[ 29.680000] e1000e: Intel(R) PRO\/1000 Hálózati Meghajtó - 3.2.6-k
[ 29.690000] e1000e: Szerzői jog (c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: USB 2.0 'Fejlett' Host Controller (EHCI) Meghajtó
[ 29.710000] ehci-pci: EHCI PCI platform meghajtó
[ 29.720000] ehci-platform: EHCI általános platform meghajtó
[ 29.750000] mousedev: PS\/2 egér eszköz közös minden egérhez
[ 29.790000] usbcore: regisztrált új interfészmeghajtó usbhid
[ 29.800000] usbhid: USB HID magjának meghajtója
[ 29.820000] usbcore: regisztrált új interfészmeghajtó snd-usb-audio
[ 29.900000] NET: Regisztrált protokollcsalád 10
[ 29.960000] Szeletelés IPv6-tal
[ 29.960000] sit: IPv6, IPv4 és MPLS IPv4-en keresztül alagút meghajtó
[ 30.020000] NET: Regisztrált protokollcsalád 17
[ 30.020000] Kulcs típusa dns_resolver regisztrálva
[ 30.070000] bootconsole [early0] az init memóriát használja, és le kell tiltani, még a valódi használat előtt is
[ 30.080000] bootconsole [early0] letiltvaEzután semmi látható nem történik.
Most három problémával lehet megpróbálni megbirkózni:
[ 23.980000] Initramfs kibővítése nem sikerült: szemét a tömörített archívumban
...
[ 28.940000] sifive-serial 64000000.serial: nem található a vezérlő óra
...
[ 29.610000] sifive_spi 64001000.spi: nem található a busz óra… valamint a konzolra írás leállításával.
Két frekvenciaproblémával nem nehéz megbirkózni: pontokat kell hozzáadni, clocks a szükséges eszközök aláágába, kényelmi szempontból érthető nevekkel elnevezve a csomópontot 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";Egy sort hozzáadva #define pr_debug printk a fájl elejéhez init/initramfs.c, ahelyett, hogy a moslékra vonatkozó üzenetet adnánk ki az initramfs-ből, kicsit részletesebb üzenetet kapunk:
[ 2.760000] Initramfs kibővítése...
[ 2.770000] Gzip tömörített adatot észlelt
[ 23.940000] (null) tömörített adatot észlelt
[ 23.970000] Initramfs kibővítése nem sikerült: szemét a tömörített archívumbanEzért lehet, hogy a szemét nem $CI_COMMIT_TAG initramfs, hanem együtt.
Rendben, valamiért talált, talán ez már elég. De hova lett a konzol? A keresés hivatkozást ad egy GitHub-problémára: — kiderült, hogy egy UART-ról a meghajtó véleménye szerint tényleg nem érdemes beszélni. De 2018. július 11-én datálva - egy éve. Kiderült, hogy ez a commit sosem került be abba a fába, amelyből az én kernel verzióm épül. Az ezen patch manuális alkalmazásával működő Linuxot kaptam! Kiderült, hogy az initramfs probléma valójában nem volt kritikus.
Bejelentkezve, mint user=root, password=sifive, gond nélkül sikerült (kivéve, hogy megértsem, hogy a GPIO számának van egy alapja, amiről minden számít, és azt a hozzá tartozó ál-fájlokból kell csak kiolvasni) a sysfs LED-et felkapcsolni az áramkörön.
Ahogy legutóbb, csatolom a Linux indításáról készült szöveges videót. Amikor a konzolt az earlyprintk-ról az alapértelmezettre váltjuk, valamilyen zajt hallani, ami hasonlít a helytelenül beállított UART sebesség kimenetéhez. Érdekes módon a lejátszó sikeresen feldolgozta ezt a 'zavart'.
Forrás: habr.com
