Π§Π°ΡΡ‚ΡŒ 4: Всё-Ρ‚Π°ΠΊΠΈ запускаСм Linux Π½Π° RocketChip RISC-V

Π§Π°ΡΡ‚ΡŒ 4: Всё-Ρ‚Π°ΠΊΠΈ запускаСм Linux Π½Π° RocketChip RISC-V На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Linux kernel ΡˆΠ»Ρ‘Ρ‚ Π²Π°ΠΌ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· GPIO.

Π’ этой части истории с ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ RISC-V RocketChip Π½Π° ΠΊΠΈΡ‚Π°ΠΉΡΠΊΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ с Cyclone IV ΠΌΡ‹ всё-Ρ‚Π°ΠΊΠΈ запустим Linux, Π° Ρ‚Π°ΠΊΠΆΠ΅ научимся сами ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ IP Core ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° памяти ΠΈ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ dts-описаниС Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ являСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ части, Π½ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ изрядно Ρ€Π°Π·Ρ€ΠΎΡΡˆΠ΅ΠΉΡΡ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ довольно ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ.

… ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ setup_smp вызываСтся, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ядро сконфигурировано с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ SMP, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡΠ΄Π΅Ρ€Π½ΠΎΡΡ‚ΡŒ. Π‘ΡƒΠ΄Π΅Ρ‚ нСприятно, Ссли ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ памяти ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ атомарности (ΠΌΠ½Π΅ казалось, с этим кСш возится ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ), Π½ΠΎ Π² одноядСрном случаС ΠΎΠ½ΠΎ Π½Π°ΠΌ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ.

Всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ Π²Π·Π»Π΅Ρ‚Π΅Π»ΠΎ…

[    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 Thu Jul 4 18:38:10 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (16777216 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] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] Unable to find "cpu" devicetree entry
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 258055
[    0.000000] Kernel command line: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[    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] BUG: Bad page state in process swapper  pfn:80bf7
[    0.000000] page:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[    0.000000] raw: 0000000000000001 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe000094bb0>] free_pcppages_bulk+0x106/0x36c
[    0.000000] [<ffffffe0000957be>] free_unref_page_commit.isra.23+0x86/0x8e
[    0.000000] [<ffffffe0000960bc>] free_unref_page+0x44/0x58
[    0.000000] [<ffffffe0000960de>] __free_pages.part.28+0xe/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] Disabling lock debugging due to kernel taint
[    0.000000] BUG: Bad page state in process swapper  pfn:80bf9
[    0.000000] page:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfa
[    0.000000] page:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfb
[    0.000000] page:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] page dumped because: nonzero mapcount
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G    B             4.19.0-sifive-1+ #1
[    0.000000] Call Trace:
[    0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0/0xa0
[    0.000000] [<ffffffe00002d1da>] show_stack+0x2a/0x34
[    0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20/0x28
[    0.000000] [<ffffffe00009499c>] bad_page+0xe4/0x102
[    0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38/0x7a
[    0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe/0x430
[    0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a/0x22
[    0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86/0x90
[    0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156/0x1ba
[    0.000000] [<ffffffe0000023f8>] mem_init+0x36/0x44
[    0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa/0x328
[    0.000000] [<ffffffe000000058>] _sinittext+0x58/0x5c
[    0.000000] BUG: Bad page state in process swapper  pfn:80bfc
[    0.000000] page:ffffffe03f029f20 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] flags: 0x0()
[    0.000000] raw: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[    0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
...

Занятно, Ρ‡Ρ‚ΠΎ послС всСй ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ «рСфСрСнсный» Π²Ρ‹Π²ΠΎΠ΄ ядра, сказал make qemu, ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π» Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π£Π²Ρ‹, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ (Linux kernel) слоТнСС: GDB, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· JTAG ΠΊ RocketChip, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, с физичСскими адрСсами Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ настроСно MMU, Π° ядро Π² ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ нас ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ настроило ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ адрСсов, поэтому просто ΡΠΊΠ°Π·Π°Ρ‚ΡŒ display/10i $pc Π½Π΅ получится β€” ΡƒΠ²ΠΈΠ΄ΠΈΠΌ лишь ΠΌΠ½ΠΎΠ³ΠΎ unimp. Π—Π°Ρ‚ΠΎ, Ссли ΠΌΡ‹ ΡƒΠΆΠ΅ выяснили смСщСниС (ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ 0x80200000 -> 0xffffffe000000000), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ…ΠΈΡ‚Ρ€ΠΈΡ‚ΡŒ:

1: x/10i $pc
=> 0xffffffe000002436 <setup_smp>:      unimp
   0xffffffe000002438 <setup_smp+2>:    unimp
   0xffffffe00000243a <setup_smp+4>:    unimp
   0xffffffe00000243c <setup_smp+6>:    unimp
   0xffffffe00000243e <setup_smp+8>:    unimp
   0xffffffe000002440 <setup_smp+10>:   unimp
   0xffffffe000002442 <setup_smp+12>:   unimp
   0xffffffe000002444 <setup_smp+14>:   unimp
   0xffffffe000002446 <setup_smp+16>:   unimp
   0xffffffe000002448 <setup_smp+18>:   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)

Π‘Ρ€Π΅ΠΊΠΏΠΎΠΈΠ½Ρ‚Ρ‹ ΠΏΡ€ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ:

(gdb) p setup_smp
$1 = {<text variable, no debug info>} 0xffffffe000002436 <setup_smp>
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
setup_smp () at /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
58              while ((dn = of_find_node_by_type(dn, "cpu"))) {
(gdb) bt
#0  setup_smp () at /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1  0xffffffe0000022a2 in setup_arch () at /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2  0x0000000000000000 in ?? ()
Backtrace stopped: frame did not save the PC

Π’ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… приходится Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΉΡ‚ΠΈ дальшС β€” для GDB это ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСпонятный trap. Ах Π΄Π°, Ссли Π²Ρ‹ случайно скаТСтС s ΠΈΠ»ΠΈ n вмСсто si, gdb попытаСтся Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСявный Π±Ρ€Π΅ΠΊΠΏΠΎΠΈΠ½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π½Π΅ выставится, Π½ΠΎ ΠΈ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ GDB ΡƒΠΆΠ΅ Π½ΠΈΠΊΠ°ΠΊ. Но Π½Π΅ ΡΠΏΠ΅ΡˆΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ»Π°Ρ‚Ρƒ β€” ΠΏΠΎ ΠΌΠΎΠΈΠΌ наблюдСниям, достаточно ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ gdb (ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ старыС breakpoint-Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ исчСзнут).

БобствСнно, придётся Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: расстановка ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… printk Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ of_find_node_by_type, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ΄ΠΎΠΌ поиска Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ процСссорного ядра, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ мусор вмСсто Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² устройств. НапримСр, ΠΎΠ½ΠΎ ΠΎΡ‚ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ Π±Π΅Ρ€Ρ‘Ρ‚ строчку Β«Serial portΒ», хотя Ρ‚Π°ΠΊΠΎΠ³ΠΎ явно Π½Π΅Ρ‚ Π² dtb Π² ΠΏΠΎΠ»Π΅ device_type. Поискав эти Π±Π°ΠΉΡ‚Ρ‹ Π² ΠΎΠ±Ρ€Π°Π·Π΅ ядра, я ΠΈΡ… Π½Π°ΡˆΡ‘Π», посмотрСл Π½Π° смСщСниС, ΠΈ понял ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅: Ρ€Π°Π·ΠΌΠ΅Ρ€ ядра Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ явно Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½Ρ‘Π½: Π΅ΠΌΡƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ 8Mb, Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ½ΠΎ большС дСсяти. Π’Ρ‹Π΄Π΅Π»ΠΈΠ» 16Mb, Π½ΠΎ странности Π½Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ. ПослС плясок с Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ FDT с Ρ€Π°Π·Π½Ρ‹Ρ… адрСсов (ΡˆΡ‚Π°Ρ‚Π½ΠΎ адрСс пСрСдаётся ядру Π² рСгистрС a1), я, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ€Π΅ΡˆΠΈΠ» Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° Ρ‡Ρ‚ΠΎ ΠΆΠ΅ сСйчас Ρ‚Π°ΠΌ парсится. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, вмСсто Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ (Π° ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡŽΠ°Π½ΡΡ‹ с трансляциСй адрСсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ), ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈ ΠΊΠΎΡΡ‚Ρ‹Π»ΡŒΠ½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ drivers/of/fdt.c ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ #define pr_debug printk. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°

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);

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΆΠ΅Π»Π΅Π·Π΅

                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 = <0x00000001>;
  #size-cells = <0x00000001>;
  compatible = "freechips,rocketchip-unknown-dev";
  model = "freechips,rocketchip-unknown";
  chosen {
    linux,initrd-start = <0x82000000>;
    riscv,kernel-end = <0x81200000>;
    riscv,kernel-start = <0x80200000>;
    #address-cells = <0x00000001>;
    #size-cells = <0x00000000>;
    bootargs = <0x64656275 0x6720636f 0x6e736f6c 0x653d7474 0x79534946 0x302c3132 0x35323030 0x20726f6f 0x743d2f64 0x65762f6d 0x6d63626c 0x6b307032 0x206c6f67 0x6c657665 0x6c3d3720 0x726f6f74 0x77616974>;
  }
  firmware {
    sifive,uboot = "YYYY-MM-DD";
  }
  aliases {
    serial0 = <0x2f736f63 0x2f736572 0x69616c40 0x36343030 0x30303030>;
  }
  cpus {
    #address-cells = <0x00000001>;
    #size-cells = <0x00000000>;
    cpu@0 {
      device_type = "cpu";
      clock-frequency = <0x00000000>;
      compatible = "sifive,rocket0", "riscv";
      d-cache-block-size = <0x00000010>;
      d-cache-sets = <0x00000040>;
      d-cache-size = <0x00001000>;
      d-tlb-sets = <0x00000001>;
      d-tlb-size = <0x00000020>;
      i-cache-block-size = <0x00000010>;
      i-cache-sets = <0x00000040>;
      i-cache-size = <0x00001000>;
      i-tlb-sets = <0x00000001>;
      i-tlb-size = <0x00000020>;
      mmu-type = "riscv,sv39";
      next-level-cache = <0x00000001>;
      reg = <0x00000000>;
      riscv,isa = "rv64imafdc";
      status = "okay";
      timebase-frequency = <0x000f4240>;
      tlb-split;
      interrupt-controller {
        #interrupt-cells = <0x00000001>;
        compatible = "riscv,cpu-intc";
        interrupt-controller;
        phandle = <0x00000002>;
      }
    }
  }
  ram@80000000 {
    device_type = "memory";
    reg = <0x80000000 0x40000000>;
    reg-names = "mem";
    phandle = <0x00000001>;
  }
  soc {
    #address-cells = <0x00000001>;
    #size-cells = <0x00000001>;
    compatible = "freechips,rocketchip-unknown-soc", "simple-bus";
    ranges;
    clint@2000000 {
      compatible = "riscv,clint0";
      interrupts-extended = <0x00000002 0x00000003 0x00000002 0x00000007>;
      reg = <0x02000000 0x00010000>;
      reg-names = "control";
    }
    debug-controller@0 {
      compatible = "sifive,debug-013", "riscv,debug-013";
      interrupts-extended = <0x00000002 0x0000ffff>;
      reg = <0x00000000 0x00001000>;
      reg-names = "control";
    }
    gpio@64002000 {
      #gpio-cells = <0x00000002>;
      #interrupt-cells = <0x00000002>;
      compatible = "sifive,gpio0";
      gpio-controller;
      interrupt-controller;
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008>;
      reg = <0x64002000 0x00001000>;
      reg-names = "control";
    }
    interrupt-controller@c000000 {
      #interrupt-cells = <0x00000001>;
      compatible = "riscv,plic0";
      interrupt-controller;
      interrupts-extended = <0x00000002 0x0000000b 0x00000002 0x00000009>;
      reg = <0x0c000000 0x04000000>;
      reg-names = "control";
      riscv,max-priority = <0x00000007>;
      riscv,ndev = <0x00000008>;
      phandle = <0x00000003>;
    }
    rom@10000 {
      compatible = "sifive,maskrom0";
      reg = <0x00010000 0x00002000>;
      reg-names = "mem";
    }
    serial@64000000 {
      compatible = "sifive,uart0";
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000002>;
      reg = <0x64000000 0x00001000>;
      reg-names = "control";
    }
    spi@64001000 {
      #address-cells = <0x00000001>;
      #size-cells = <0x00000000>;
      compatible = "sifive,spi0";
      interrupt-parent = <0x00000003>;
      interrupts = <0x00000001>;
      reg = <0x64001000 0x00001000>;
      reg-names = "control";
      mmc@0 {
        compatible = "mmc-spi-slot";
        disable-wp;
        reg = <0x00000000>;
        spi-max-frequency = <0x01312d00>;
        voltage-ranges = <0x00000ce4 0x00000ce4>;
      }
    }
    tlclk {
      #clock-cells = <0x00000000>;
      clock-frequency = <0x017d7840>;
      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]

Π’Ρ‹Π²ΠΎΠ΄ Π² 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 = <0x00000002>;
#size-cells = <0x00000002>;
compatible = "riscv-virtio";
model = "riscv-virtio,qemu";
chosen {
linux,initrd-start = <0x00000000 0x88000000>;
linux,initrd-end = <0x00000000 0x88442b86>;
riscv,kernel-start = <0x00000000 0x80200000>;
riscv,kernel-end = <0x00000000 0x80c482ac>;
bootargs = "";
stdout-path = <0x2f756172 0x74403130 0x30303030>;
}
uart@10000000 {
interrupts = <0x0000000a>;
interrupt-parent = <0x00000002>;
clock-frequency = <0x00384000>;
reg = <0x00000000 0x10000000 0x00000000 0x00000100>;
compatible = "ns16550a";
}
test@100000 {
reg = <0x00000000 0x00100000 0x00000000 0x00001000>;
compatible = "sifive,test0";
}
virtio_mmio@10008000 {
interrupts = <0x00000008>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10008000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10007000 {
interrupts = <0x00000007>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10007000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10006000 {
interrupts = <0x00000006>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10006000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10005000 {
interrupts = <0x00000005>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10005000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10004000 {
interrupts = <0x00000004>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10004000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10003000 {
interrupts = <0x00000003>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10003000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10002000 {
interrupts = <0x00000002>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10002000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
virtio_mmio@10001000 {
interrupts = <0x00000001>;
interrupt-parent = <0x00000002>;
reg = <0x00000000 0x10001000 0x00000000 0x00001000>;
compatible = "virtio,mmio";
}
cpus {
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
timebase-frequency = <0x00989680>;
cpu@0 {
device_type = "cpu";
reg = <0x00000000>;
status = "okay";
compatible = "riscv";
riscv,isa = "rv64imafdcsu";
mmu-type = "riscv,sv48";
clock-frequency = <0x3b9aca00>;
interrupt-controller {
#interrupt-cells = <0x00000001>;
interrupt-controller;
compatible = "riscv,cpu-intc";
linux,phandle = <0x00000001>;
phandle = <0x00000001>;
}
}
}
memory@80000000 {
device_type = "memory";
reg = <0x00000000 0x80000000 0x00000000 0x40000000>;
}
soc {
#address-cells = <0x00000002>;
#size-cells = <0x00000002>;
compatible = "simple-bus";
ranges;
pci@30000000 {
interrupt-map-mask = <0x00001800 0x00000000 0x00000000 0x00000007>;
interrupt-map = <0x00000000 0x00000000 0x00000000 0x00000001 0x00000002 0x00000020 0x00000000 0x00000000 0x00000000 0x00000002 0x00000002 0x00000021 0x00000000 0x00000000 0x00000000 0x00000003 0x00000002 0x00000022 0x00000000 0x00000000 0x00000000 0x00000004 0x00000002 0x00000023 0x00000800 0x00000000 0x00000000 0x00000001 0x00000002 0x00000021 0x00000800 0x00000000 0x00000000 0x00000002 0x00000002 0x00000022 0x00000800 0x00000000 0x00000000 0x00000003 0x00000002 0x00000023 0x00000800 0x00000000 0x00000000 0x00000004 0x00000002 0x00000020 0x00001000 0x00000000 0x00000000 0x00000001 0x00000002 0x00000022 0x00001000 0x00000000 0x00000000 0x00000002 0x00000002 0x00000023 0x00001000 0x00000000 0x00000000 0x00000003 0x00000002 0x00000020 0x00001000 0x00000000 0x00000000 0x00000004 0x00000002 0x00000021 0x00001800 0x00000000 0x00000000 0x00000001 0x00000002 0x00000023 0x00001800 0x00000000 0x00000000 0x00000002 0x00000002 0x00000020 0x00001800 0x00000000 0x00000000 0x00000003 0x00000002 0x00000021 0x00001800 0x00000000 0x00000000 0x00000004 0x00000002 0x00000022>;
ranges = <0x01000000 0x00000000 0x00000000 0x00000000 0x03000000 0x00000000 0x00010000 0x02000000 0x00000000 0x40000000 0x00000000 0x40000000 0x00000000 0x40000000>;
reg = <0x00000000 0x30000000 0x00000000 0x10000000>;
dma-coherent;
bus-range = <0x00000000 0x000002ff>;
linux,pci-domain = <0x00000000>;
device_type = "pci";
compatible = "pci-host-ecam-generic";
#size-cells = <0x00000002>;
#interrupt-cells = <0x00000001>;
#address-cells = <0x00000003>;
}
interrupt-controller@c000000 {
linux,phandle = <0x00000002>;
phandle = <0x00000002>;
riscv,ndev = <0x00000035>;
riscv,max-priority = <0x00000007>;
reg-names = "control";
reg = <0x00000000 0x0c000000 0x00000000 0x04000000>;
interrupts-extended = <0x00000001 0x0000000b 0x00000001 0x00000009>;
interrupt-controller;
compatible = "riscv,plic0";
#interrupt-cells = <0x00000001>;
#address-cells = <0x00000000>;
}
clint@2000000 {
interrupts-extended = <0x00000001 0x00000003 0x00000001 0x00000007>;
reg = <0x00000000 0x02000000 0x00000000 0x00010000>;
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] 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 <[email protected]>
[    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

(«ВаймстСмпнутыми» строчки Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ядро, ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ BBL) Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, FDT ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ читаСтся, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” получаСтся какая-Ρ‚ΠΎ Ρ‡Π΅ΠΏΡƒΡ…Π° Π² распарсСнном Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌΒ» Π΄Π΅Ρ€Π΅Π²Π΅.

Π’ процСссС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ я понял, Ρ‡Ρ‚ΠΎ BBL Π½Π΅ ΠΌΠΎΠ³ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«Π΄Π²ΠΎΠΉΠ½ΠΎΠΉΒ» адрСс Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Π±Ρ‹Π»Π° ошибка, Π° просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π±Ρ‹Π» выставлСн #address-cells = <1>; #size-cells = <1>;.

Π Π°ΡΡˆΠΈΡ€ΠΈΠ² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄, я ΡƒΠ²ΠΈΠ΄Π΅Π», Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° type ΠΈ name «побились», ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ довольно странным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Ρƒ Π½ΠΈΡ… обнулился ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ (начиная с нуля) Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ 0xabcdef -> 0xab00ef. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Ρ‚Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ: зная адрСса, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ находится поврСТдённая ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ printk ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ этих Π΄Π°Π½Π½Ρ‹Ρ…. Ну ΠΈ самих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² printk ΠΏΠΎΡ€Π°ΡΠΊΠΈΠ΄Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΈΡ… ΠΌΠ°Π»ΠΎ. Π£Π²Ρ‹, сильно понятнСС Π½Π΅ стало. Π’ΠΎΠ³Π΄Π° я стал, ΡΠ²Π΅Ρ€ΡΡΡΡŒ с дизассСмблированной objdump вСрсиСй, Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ€Π°ΡΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ breakpoint-Ρ‹ ΠΈ ΠΏΠΎ шагам ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ участок ΠΊΠΎΠ΄Π°. И Ρ‚ΡƒΡ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΎΡΡŒ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎΠ΅ ΠΈ нСприятноС: Ссли сразу ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ known-good состояния, Ρ‚ΠΎ, ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΡΡŒ Π½Π° Π½Π΅ΠΉ, я ΡƒΠ²ΠΈΠΆΡƒ ΡƒΠΆΠ΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Но Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ‚ΠΈΡ…ΠΎ ΠΏΠΎΠ΄ΠΊΡ€Π°ΡΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΉ ΠΏΠΎ шагам, Ρ‚ΠΎ ошибка успСваСт ΡΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒΡΡ! Π”Π΅Π»ΠΎ ΠΏΠ°Ρ…Π½Π΅Ρ‚ Π±ΠΈΡ‚Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ памяти ΠΈ кСшом, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли постоянно Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. А Ρ‡Ρ‚ΠΎ Ссли…

ЗамСняСм ΠΏΠ°ΠΌΡΡ‚ΡŒ

ЦСпляясь Π·Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π΅ Π½Π° своСй сторонС, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚, ΠΌΠ½Π΅ просто ΠΏΡ€ΠΈΡˆΠ»Π° битая ΠΏΠ»Π°Π½ΠΊΠ° памяти. Π’ΡƒΡ‚ я вспомнил, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚Π±ΡƒΠΊ дСсятилСтнСй давности β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Π½ΠΎ ΠΈ Ρ†Π΅Π½Π½Ρ‹ΠΉ источник DDR2 SO-DIMM. Бонусом, Π² Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡƒΠ½ΡƒΡ‚ΡŒ Π²Ρ‹Π½ΡƒΡ‚ΡƒΡŽ ΠΈΠ· ΠΏΠ»Π°Ρ‚Ρ‹ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ зависаниС Memtest (Linux, кстати, ΠΏΡ€ΠΈ этом грузился ΠΏΠΎΡ‡Ρ‚ΠΈ Π΄ΠΎ графичСской ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Но Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ повторяйтС Ρ‚Π°ΠΊΠΎΠΉ экспСримСнт, Ссли Π²Π°ΠΌ Π΄ΠΎΡ€ΠΎΠ³Π° информация Π½Π° ΠΏΠΎΠ΄ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… дисках…). Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ просто ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ подошла ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΊ этому Π½Π΅Ρ‚Π±ΡƒΠΊΡƒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΎΠ½ ΠΆΠ΅ смог Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ! Появилась Π½Π°Π΄Π΅ΠΆΠ΄Π°, Ρ‡Ρ‚ΠΎ просто ΠΏΠ°ΠΌΡΡ‚ΡŒ «битая», ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Π² ΠΌΠΎΠ΅ΠΉ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ΅.

Π—Π½Π°Ρ‡ΠΈΡ‚, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ с Π½Π΅Ρ‚Π±ΡƒΡ‡Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. К соТалСнию, Quartus 18 Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ΠΈΡ‚ΡŒ этот IP Core Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π—Π½Π°Ρ‡ΠΈΡ‚, всё-Ρ‚Π°ΠΊΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ инстансы. Всё оказалось довольно просто: ΠΈΡ‰Π΅ΠΌ Π² IP Catalog ΠΏΡƒΠ½ΠΊΡ‚ DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π±Π»ΠΎΠΊ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ интСрфСйсом, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. ЕдинствСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€” это Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ настройки памяти.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ модуля памяти

Π•ΡΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ способ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ: ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· SPD. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ SPD ΠΈ настраиваСт ΠΏΠΎ Π½ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡΡ Π½Π΅Ρ‚Π±ΡƒΠΊΠ΅ ΠΈ Π²ΠΎΠ±ΡŒΡ‘ΠΌ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ.

На Ubuntu это дСлаСтся вСсьма Π½Π΅Ρ…ΠΈΡ‚Ρ€ΠΎ: Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ i2c-tools, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ eeprom ΠΈ i2c-i801 (Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, ΠΏΡ€Π°Π²Π΄Π°, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π²Π΅Π·Π΄Π΅), послС Ρ‡Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ decode-dimms:

Π’Ρ‹Π²ΠΎΠ΄ 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: 3

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠΈΠ½Π³ΠΎΠ² здСсь Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, поэтому ΠΏΠΎΠΉΠ΄Ρ‘ΠΌ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ.

Π§Ρ‚ΠΎ Ρƒ нас написано Π½Π° модулях:

Π§Π°ΡΡ‚ΡŒ 4: Всё-Ρ‚Π°ΠΊΠΈ запускаСм Linux Π½Π° RocketChip RISC-VΠ§Π°ΡΡ‚ΡŒ 4: Всё-Ρ‚Π°ΠΊΠΈ запускаСм Linux Π½Π° RocketChip RISC-V

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС интСрСснСС надпись Π½Π° самих микросхСмах памяти: K4T1G164QQ-HCF7. Π—Π°Π±ΠΈΠ² эту строчку Π² Π“ΡƒΠ³Π», ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ datasheet Π½Π° нСсколько дСсятков страниц со всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ‚ΡŒ Π² свойства IP Core. Волько ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния: Π³Π΄Π΅-Ρ‚ΠΎ ns, Π³Π΄Π΅-Ρ‚ΠΎ β€” ps, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΄ΠΎΠ»ΠΈ tCK. Π£Ρ‡ΠΈΡ‚ΡŒ вас, Π½Π° Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, я Π½Π΅ Π±ΡƒΠ΄Ρƒ β€” сам ΠΌΠ½ΠΎΠ³ΠΎΠ΅ настраивал ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ‚Ρ‹ΠΊΠ° (Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΈ этом Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ нСльзя Β«ΡΠΆΠ΅Ρ‡ΡŒΒ» ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠŸΠ›Π˜Π‘). ΠžΠ±Ρ€Π°Ρ‰Ρƒ лишь Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²ΠΎΡ‚ Π½Π° Ρ‡Ρ‚ΠΎ: я ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΠ»Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΈ послСдним шагом Π±Ρ‹Π»ΠΎ осознаниС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Ρƒ всСх интСрфСйсов ΠΊ памяти Π½Π° соотвСтствиС сгСнСрированному ΠΊΠΎΠ΄Ρƒ Π½Π° Verilog: вСдь ΠΊΠΎΠ³Π΄Π° Π² MemIfBundle ΡƒΠΊΠ°Π·Π°Π½ val mem_ba = IO(Output(UInt(2.W))), Π° Π±Π°Π½ΠΊΠΎΠ² 8 (Ρ‚.Π΅. адрСс ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ 3 Π±ΠΈΡ‚Π°), Ρ‚ΠΎ всё, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ β€” висящий Π² Π²ΠΎΠ·Π΄ΡƒΡ…Π΅ output ΠΈΠ· ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° памяти β€” ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π½ΠΎ Π½Π΅ критичСская, поэтому всё синтСзируСтся, Π½ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, всё Π±Ρ‹ завСлось ΠΈ со старым ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, Ссли ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π½ΠΎ ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ лСнь Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ Π±Π°Π³Π°ΠΌΠΈ: ΠΌΠ½Π΅ ΠΈ своих Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚.

Π˜Ρ‚Π°ΠΊ, послС пСрСмСщСния timebase-frequency Π² DTS с уровня ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ CPU Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΡƒΠ·Π»Π° cpus (ΠΏΠΎ Π²ΠΏΠΎΠ»Π½Π΅ понятно сказанной ΠΏΡ€ΠΎΡΡŒΠ±Π΅ ядра), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ тСкст

[    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 Tue Jul 9 22:42:36 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (16777216 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] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    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: debug console=ttySIF0,125200 root=/dev/mmcblk0p2 loglevel=7 rootwait
[    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: 937696K/1046528K available (6565K kernel code, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K 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 8 interrupts to 1 (out of 2) handlers.
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[    0.000000] Console: colour dummy device 80x25
[    0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
[    0.020000] pid_max: default: 32768 minimum: 301
[    0.030000] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes)
[    0.040000] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes)
[    0.140000] rcu: Hierarchical SRCU implementation.
[    0.190000] smp: Bringing up secondary CPUs ...
[    0.190000] smp: Brought up 1 node, 1 CPU
[    0.220000] devtmpfs: initialized
[    0.300000] random: get_random_u32 called from bucket_table_alloc+0x76/0x17a with crng_init=0
[    0.330000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.340000] futex hash table entries: 256 (order: 2, 16384 bytes)
[    0.380000] NET: Registered protocol family 16
[    1.850000] vgaarb: loaded
[    1.870000] SCSI subsystem initialized
[    1.900000] usbcore: registered new interface driver usbfs
[    1.910000] usbcore: registered new interface driver hub
[    1.920000] usbcore: registered new device driver usb
[    1.930000] pps_core: LinuxPPS API ver. 1 registered
[    1.940000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
[    1.950000] PTP clock support registered
[    1.970000] Advanced Linux Sound Architecture Driver Initialized.
[    2.010000] clocksource: Switched to clocksource riscv_clocksource
[    2.600000] NET: Registered protocol family 2
[    2.640000] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes)
[    2.650000] TCP established hash table entries: 8192 (order: 4, 65536 bytes)
[    2.670000] TCP bind hash table entries: 8192 (order: 5, 131072 bytes)
[    2.700000] TCP: Hash tables configured (established 8192 bind 8192)
[    2.720000] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    2.730000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    2.750000] NET: Registered protocol family 1
[    2.770000] Unpacking initramfs...
[   23.980000] Initramfs unpacking failed: junk in compressed archive
[   24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[   25.020000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[   25.030000] io scheduler noop registered
[   25.040000] io scheduler deadline registered
[   25.050000] io scheduler cfq registered (default)
[   25.060000] io scheduler mq-deadline registered
[   25.060000] io scheduler kyber registered
[   25.120000] sifive_gpio 64002000.gpio: SiFive GPIO chip registered 6 GPIOs
[   25.150000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[   28.870000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[   28.940000] sifive-serial 64000000.serial: unable to find controller clock
[   28.950000] sifive-serial: probe of 64000000.serial failed with error -2
[   28.980000] [drm] radeon kernel modesetting enabled.
[   28.990000] [drm] amdgpu kernel modesetting enabled.
[   29.500000] loop: module loaded
[   29.610000] sifive_spi 64001000.spi: Unable to find bus clock
[   29.620000] sifive_spi: probe of 64001000.spi failed with error -2
[   29.640000] libphy: Fixed MDIO Bus: probed
[   29.680000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[   29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   29.700000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[   29.710000] ehci-pci: EHCI PCI platform driver
[   29.720000] ehci-platform: EHCI generic platform driver
[   29.750000] mousedev: PS/2 mouse device common for all mice
[   29.790000] usbcore: registered new interface driver usbhid
[   29.800000] usbhid: USB HID core driver
[   29.820000] usbcore: registered new interface driver snd-usb-audio
[   29.900000] NET: Registered protocol family 10
[   29.960000] Segment Routing with IPv6
[   29.960000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[   30.020000] NET: Registered protocol family 17
[   30.020000] Key type dns_resolver registered
[   30.070000] bootconsole [early0] uses init memory and must be disabled even before the real one is ready
[   30.080000] bootconsole [early0] disabled

ПослС Ρ‡Π΅Π³ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π΅ происходит.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с трСмя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ:

[   23.980000] Initramfs unpacking failed: junk in compressed archive
...
[   28.940000] sifive-serial 64000000.serial: unable to find controller clock
...
[   29.610000] sifive_spi 64001000.spi: Unable to find bus clock

… Π° Ρ‚Π°ΠΊΠΆΠ΅ с ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° Π² консоль.

Π‘ двумя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ с частотами ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ совсСм нСслоТно: Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ 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 = <2>;
reg = <0x64000000 0x1000>;
reg-names = "control";
@@ -107,6 +109,7 @@
interrupt-parent = <&L0>;
interrupts = <1>;
reg = <0x64001000 0x1000>;
+                        clocks = <&tlclk>;
reg-names = "control";
L12: mmc@0 {
compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
voltage-ranges = <3300 3300>;
};
};
-                L11: tlclk {
+                tlclk: tlclk {
#clock-cells = <0>;
clock-frequency = <25000000>;
clock-output-names = "tlclk";

Π”ΠΎΠ±Π°Π²ΠΈΠ² строчку #define pr_debug printk Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ„Π°ΠΉΠ»Π° init/initramfs.c, выводящСго сообщСниС ΠΏΡ€ΠΎ мусор вмСсто initramfs ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ сообщСниС:

[    2.760000] Unpacking initramfs...
[    2.770000] Detected gzip compressed data
[   23.940000] Detected (null) compressed data
[   23.970000] Initramfs unpacking failed: junk in compressed archive

Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, мусор Π½Π΅ вмСсто initramfs, Π° вмСстС.

ОкСй, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠ½ Π½Π°ΡˆΡ‘Π», ΠΌΠΎΠΆΠ΅Ρ‚, ΠΈ этого достаточно. А ΠΊΡƒΠ΄Π° дСлась консоль? Поиск Π΄Π°Ρ‘Ρ‚ ссылку Π½Π° issue Π½Π° Π“ΠΈΡ‚Ρ…Π°Π±Π΅: linux failed to bringup on vc707 board β€” оказываСтся, ΠΎΠ΄ΠΈΠ½ UART это, ΠΏΠΎ мнСнию Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, Π΄Π°ΠΆΠ΅ Π½Π΅ стоит Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΎΠ². Но исправлСниС Π΄Π°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ 11 июля 2018 Π³ΠΎΠ΄Π° β€” Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄. Оказалось, этот ΠΊΠΎΠΌΠΌΠΈΡ‚ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π» Π² Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρƒ мСня собираСтся ядро. Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² этот ΠΏΠ°Ρ‚Ρ‡, я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Линукс! Оказалось, с initramfs ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π°, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ критичная.

Π—Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊΠ°ΠΊ user=root, password=sifive, я смог Π±Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΎΠΌΠ΅Ρ€Π° GPIO Π΅ΡΡ‚ΡŒ base, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всё считаСтся, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ псСвдо-Ρ„Π°ΠΉΠ»Π°) Ρ‡Π΅Ρ€Π΅Π· sysfs Π·Π°ΠΆΠ΅Ρ‡ΡŒ свСтодиод Π½Π° ΠΏΠ»Π°Ρ‚Π΅.

Как ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π·, ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽ тСкстовоС Π²ΠΈΠ΄Π΅ΠΎ запуска Linux. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ консоли с earlyprintk Π½Π° ΡˆΡ‚Π°Ρ‚Π½ΡƒΡŽ ΠΈΠ΄Ρ‘Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ мусор, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ выставлСнной скорости UART. Π§Ρ‚ΠΎ интСрСсно, ΠΏΠ»Π΅Π΅Ρ€ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π» эту Β«ΠΊΠ°ΡˆΡƒΒ».

Π§Π°ΡΡ‚ΡŒ 4: Всё-Ρ‚Π°ΠΊΠΈ запускаСм Linux Π½Π° RocketChip RISC-V

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com