Bilden visar att Linux-kÀrnan hÀlsar dig via GPIO.
I denna del av berÀttelsen om porteringen av RISC-V RocketChip till det kinesiska kortet med Cyclone IV kommer vi faktiskt att köra Linux, samt lÀra oss att konfigurera IP Core för minneskontrollern och vi kommer att justera dts-beskrivningen av hÄrdvaran nÄgot. Denna artikel Àr en fortsÀttning pÄ , men till skillnad frÄn den ganska omfattande föregÄende, kommer den att vara ganska kort.
⊠Eftersom setup_smp anropas endast om kÀrnan Àr konfigurerad för SMP-stöd, kan man prova att stÀnga av flerkÀrnigheten. Det skulle vara obehagligt om jag dessutom behövde implementera stöd för atomaritet i minnesmodulen (jag trodde att denna cache skulle hantera det sjÀlv), men i ett enskilt kÀrnfallet borde det inte hindra oss.
ĂndĂ„ fungerade det inteâŠ
[ 0.000000] OF: fdt: Ignorerar minnesintervall 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 tor Jul 4 18:38:10 MSK 2019
[ 0.000000] bootconsole [early0] aktiverad
[ 0.000000] Initial ramdisk vid: 0x(____ptrval____) (16777216 byte)
[ 0.000000] ZonomrÄden:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Flyttbar zonstart för varje nod
[ 0.000000] Tidiga minnesnodsintervall
[ 0.000000] nod 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem konfiguration nod 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] mjukvaru IO TLB: mappad [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] Kan inte hitta "cpu" devicetree-post
[ 0.000000] Byggde 1 zonelistor, mobilitetsgruppering pÄ. Totalt sidor: 258055
[ 0.000000] KĂ€rnans kommandorad: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash tabellposter: 131072 (ordning: 8, 1048576 byte)
[ 0.000000] Inode-cache hash tabellposter: 65536 (ordning: 7, 524288 byte)
[ 0.000000] Sorterar __ex_table...
[ 0.000000] BUG: DÄligt sidtillstÄnd i process swapper pfn:80bf7
[ 0.000000] sida:ffffffe03f029e08 rÀkning:0 kartrÀkningsantal:-65280 kartlÀggning:0000000000000000 index:0x1
[ 0.000000] flaggor: 0x0()
[ 0.000000] raw: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[ 0.000000] raw: 0000000000000001 0000000000000000 00000000ffff00ff
[ 0.000000] sidan dumpad eftersom: icke-noll kartrÀkningsantal
[ 0.000000] Kopplade moduler:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Inte smutsad 4.19.0-sifive-1+ #1
[ 0.000000] Anrop 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] Inaktiverar lÄsning debugging pÄ grund av kÀrnsmetning
[ 0.000000] BUG: DÄligt sidtillstÄnd i process swapper pfn:80bf9
[ 0.000000] sida:ffffffe03f029e78 rÀkning:0 kartrÀkningsantal:-65280 kartlÀggning:0000000000000000 index:0x0
[ 0.000000] flaggor: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] sidan dumpad eftersom: icke-noll kartrÀkningsantal
[ 0.000000] Kopplade moduler:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Smutsad: G B 4.19.0-sifive-1+ #1
[ 0.000000] Anrop Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe\/0x430
[ 0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] BUG: DÄligt sidtillstÄnd i process swapper pfn:80bfa
[ 0.000000] sida:ffffffe03f029eb0 rÀkning:0 kartrÀkningsantal:-65280 kartlÀggning:0000000000000000 index:0x0
[ 0.000000] flaggor: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] sidan dumpad eftersom: icke-noll kartrÀkningsantal
[ 0.000000] Kopplade moduler:
[ 0.000000] CPU: 0 PID: 0 Komm: swapper Smutsad: G B 4.19.0-sifive-1+ #1
[ 0.000000] Anrop Trace:
[ 0.000000] [<ffffffe00002cfde>] walk_stackframe+0x0\/0xa0
[ 0.000000] [<ffffffe00002d1da>] show_stack+0x2a\/0x34
[ 0.000000] [<ffffffe00063c898>] chachachllachachachTradeonachachach_inachachipachachachachllachachachTradeonachachachdevachachachypachachachllachachachTradeona+0x20\/0x28
[ 0.000000] [<ffffffe00009499c>] bad_page+0xe4\/0x102
[ 0.000000] [<ffffffe0000949f2>] free_pages_check_bad+0x38\/0x7a
[ 0.000000] [<ffffffe0000955c6>] __free_pages_ok+0x3fe\/0x430
[ 0.000000] [<ffffffe0000960ea>] __free_pages.part.28+0x1a\/0x22
[ 0.000000] [<ffffffe0000056da>] __free_pages_bootmem+0x86\/0x90
[ 0.000000] [<ffffffe000007c46>] free_all_bootmem+0x156\/0x1ba
[ 0.000000] [<ffffffe0000023f8>] mem_init+0x36\/0x44
[ 0.000000] [<ffffffe0000007a0>] start_kernel+0x1aa\/0x328
[ 0.000000] [<ffffffe000000058>] _sinittext+0x58\/0x5c
[ 0.000000] BUG: DÄligt sidtillstÄnd i process swapper pfn:80bfc
[ 0.000000] sida:ffffffe03f029f20 rÀkning:0 kartrÀkningsantal:-65280 kartlÀggning:0000000000000000 index:0x0
[ 0.000000] flaggor: 0x0()
[ 0.000000] raw: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[ 0.000000] raw: 0000000000000000 0000000000000000 00000000ffff00ff
...Intressant nog beslutade jag efter all felsökning att kolla hur "referens"-utdata frÄn kÀrnan ska se ut, sa make qemu, och sÄg ett liknande fel.
TyvĂ€rr, nĂ€sta nivĂ„ (Linux-kĂ€rnan) Ă€r mer komplex: GDB, ansluten via JTAG till RocketChip, arbetar tydligen med fysiska adresser oavsett hur MMU Ă€r konfigurerat, och kĂ€rnan har vid den aktuella tidpunkten redan konfigurerat adressmappningen, sĂ„ att bara sĂ€ga display/10i $pc fungerar inte â vi ser bara mycket unimp. Men om vi redan har funnit förskjutningen (verkar som 0x80200000 -> 0xffffffe000000000), kan vi vara lite kloka:
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)Brekpunkterna sÀtts pÄ ett liknande sÀtt:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
FortsÀtter.
Programmet mottog signalen SIGTRAP, SpÄrning/brekpunktfÀlla.
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 ?? ()
Tillbaka spĂ„rningen stoppades: ramen sparade inte PC:nDet Ă€r bara det att de mĂ„ste tas bort manuellt för att gĂ„ vidare â för GDB Ă€r det en helt oförklarlig fĂ€lla. Ă
h ja, om du av misstag sĂ€ger s eller n istĂ€llet för si, kommer gdb att försöka sĂ€tta in en osynlig brekpunkts, vilket av uppenbara skĂ€l inte gĂ„r, men att förhindra GDB Ă€r redan omöjligt. Men skynda dig inte att starta om enheten â enligt mina observationer Ă€r det tillrĂ€ckligt att bara starta om gdb (notera att gamla brekpunkter kanske inte försvinner).
Faktiskt mÄste vi ta itu med det ursprungliga problemet: placeringen av felsöknings printk i funktionen of_find_node_by_type, som anvÀnds av koden för att söka det bootande processor kittet, visar att den ser nÄgon skrÀp istÀllet för enhetstypnamn. Till exempel hÀmtar den nÄgonstans strÀngen "Serial port", Àven om det uppenbarligen inte finns i dtb-fÀltet enhetstyp. Efter att ha letat efter dessa byte i kÀrnavbilden, hittade jag dem, tittade pÄ förskjutningen och insÄg det uppenbara: storleken pÄ kÀrnan i startparametrarna Àr uppenbarligen undervÀrderad: den tilldelas 8Mb, men den tar mer Àn tio. Jag tilldelade 16Mb, men konstigheterna fortsatte. Efter en del pysslande med att lÀsa FDT frÄn olika adresser (den fasta adressen överförs till kÀrnan i registret a1), bestÀmde jag mig Àntligen för att spÄra vad som parsas. Som tur Àr, istÀllet för att gÄ pÄ debugger (och vi minns att det finns nuancer med översÀttning av adresser som mÄste lösas pÄ nÄgot sÀtt), kan man helt enkelt och hacksvis i filen nu drivers/of/fdt.c . Resultatet blev: ange #define pr_debug printklÀgg till debugutgÄng
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);
Utdata pÄ hÄrdvaranUtrullning pÄ hÄrdvara
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]Utmatning i QEMU
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
SiFive RISC-V Core IP
{
#address-cells = ;
#size-cells = ;
compatible = "riscv-virtio";
model = "riscv-virtio,qemu";
chosen {
linux,initrd-start = ;
linux,initrd-end = ;
riscv,kernel-start = ;
riscv,kernel-end = ;
bootargs = "";
stdout-path = ;
}
uart@10000000 {
interrupts = ;
interrupt-parent = ;
clock-frequency = ;
reg = ;
compatible = "ns16550a";
}
test@100000 {
reg = ;
compatible = "sifive,test0";
}
virtio_mmio@10008000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10007000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10006000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10005000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10004000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10003000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10002000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10001000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
cpus {
#address-cells = ;
#size-cells = ;
timebase-frequency = ;
cpu@0 {
device_type = "cpu";
reg = ;
status = "okay";
compatible = "riscv";
riscv,isa = "rv64imafdcsu";
mmu-type = "riscv,sv48";
clock-frequency = ;
interrupt-controller {
#interrupt-cells = ;
interrupt-controller;
compatible = "riscv,cpu-intc";
linux,phandle = ;
phandle = ;
}
}
}
memory@80000000 {
device_type = "memory";
reg = ;
}
soc {
#address-cells = ;
#size-cells = ;
compatible = "simple-bus";
ranges;
pci@30000000 {
interrupt-map-mask = ;
interrupt-map = ;
ranges = ;
reg = ;
dma-coherent;
bus-range = ;
linux,pci-domain = ;
device_type = "pci";
compatible = "pci-host-ecam-generic";
#size-cells = ;
#interrupt-cells = ;
#address-cells = ;
}
interrupt-controller@c000000 {
linux,phandle = ;
phandle = ;
riscv,ndev = ;
riscv,max-priority = ;
reg-names = "control";
reg = ;
interrupts-extended = ;
interrupt-controller;
compatible = "riscv,plic0";
#interrupt-cells = ;
#address-cells = ;
}
clint@2000000 {
interrupts-extended = ;
reg = ;
compatible = "riscv,clint0";
}
}
}
[ 0.000000] HART = 0 DTB = 80e00000
[ 0.000000] search "chosen", depth: 0, uname:
[ 0.000000] search "chosen", depth: 1, uname: chosen
[ 0.000000] Looking for initrd properties...
[ 0.000000] initrd_start=0x88000000 initrd_end=0x88442b86
[ 0.000000] Command line is: earlyprintk
[ 0.000000] dt_root_size_cells = 2
[ 0.000000] dt_root_addr_cells = 2
[ 0.000000] memory scan node memory@80000000, reg size 16,
[ 0.000000] - 80000000 , 40000000
[ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] Initial ramdisk at: 0x(____ptrval____) (4467590 bytes)
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] INITIAL: ffffffe000c00000
[ 0.000000] -> unflatten_device_tree()
[ 0.000000] Unflattening device tree:
[ 0.000000] magic: d00dfeed
[ 0.000000] size: 00000d56
[ 0.000000] version: 00000011
[ 0.000000] size is 14192, allocating...
[ 0.000000] unflattening (____ptrval____)...
[ 0.000000] fixed up name for ->
[ 0.000000] fixed up name for chosen -> chosen
[ 0.000000] fixed up name for uart@10000000 -> uart
[ 0.000000] fixed up name for test@100000 -> test
[ 0.000000] fixed up name for virtio_mmio@10008000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10007000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10006000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10005000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10004000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10003000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10002000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10001000 -> virtio_mmio
[ 0.000000] fixed up name for cpus -> cpus
[ 0.000000] fixed up name for cpu@0 -> cpu
[ 0.000000] fixed up name for interrupt-controller -> interrupt-controller
[ 0.000000] fixed up name for memory@80000000 -> memory
[ 0.000000] fixed up name for soc -> soc
[ 0.000000] fixed up name for pci@30000000 -> pci
[ 0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[ 0.000000] fixed up name for clint@2000000 -> clint
[ 0.000000] <- unflatten_device_tree()
[ 0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effec00 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effeee8 [memory] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff0b0 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff320 [pci] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff858 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efffd58 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] elf_hwcap is 0x112d
[ 0.000000] percpu: Embedded 17 pages/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 258055
[ 0.000000] Kernel command line: earlyprintk
[ 0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[ 0.000000] Sorting __ex_table...
[ 0.000000] Memory: 949716K/1046528K available (6565K kernel code, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K reserved, 0K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[ 0.000000] plic: mapped 53 interrupts to 2 (out of 2) handlers.
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[ 0.000000] Console: colour dummy device 80x25
[ 0.000000] console [tty0] enabled
[ 0.000000] bootconsole [early0] disabled
[ 0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 20.00 BogoMIPS (lpj=100000)
[ 0.000000] pid_max: default: 32768 minimum: 301
[ 0.000000] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.000000] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.020000] rcu: Hierarchical SRCU implementation.
[ 0.020000] smp: Bringing up secondary CPUs ...
[ 0.020000] smp: Brought up 1 node, 1 CPU
[ 0.050000] devtmpfs: initialized
[ 0.050000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.050000] random: get_random_u32 called from bucket_table_alloc+0x76/0x17a with crng_init=0
[ 0.050000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.050000] futex hash table entries: 256 (order: 2, 16384 bytes)
[ 0.060000] NET: Registered protocol family 16
[ 0.090000] vgaarb: loaded
[ 0.090000] SCSI subsystem initialized
[ 0.090000] usbcore: registered new interface driver usbfs
[ 0.090000] usbcore: registered new interface driver hub
[ 0.090000] usbcore: registered new device driver usb
[ 0.090000] pps_core: LinuxPPS API ver. 1 registered
[ 0.090000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 0.090000] PTP clock support registered
[ 0.100000] Advanced Linux Sound Architecture Driver Initialized.
[ 0.100000] clocksource: Switched to clocksource riscv_clocksource
[ 0.110000] NET: Registered protocol family 2
[ 0.110000] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes)
[ 0.110000] TCP established hash table entries: 8192 (order: 4, 65536 bytes)
[ 0.110000] TCP bind hash table entries: 8192 (order: 5, 131072 bytes)
[ 0.110000] TCP: Hash tables configured (established 8192 bind 8192)
[ 0.110000] UDP hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] NET: Registered protocol family 1
[ 0.120000] Unpacking initramfs...
[ 0.590000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 0.620000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 0.620000] io scheduler noop registered
[ 0.620000] io scheduler deadline registered
[ 0.620000] io scheduler cfq registered (default)
[ 0.620000] io scheduler mq-deadline registered
[ 0.620000] io scheduler kyber registered
[ 0.620000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[ 0.690000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 0.690000] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10, base_baud = 230400) is a 16550A
[ 0.720000] console [ttyS0] enabled
[ 0.720000] [drm] radeon kernel modesetting enabled.
[ 0.720000] [drm] amdgpu kernel modesetting enabled.
[ 0.730000] loop: module loaded
[ 0.730000] libphy: Fixed MDIO Bus: probed
[ 0.740000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[ 0.740000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 0.740000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.740000] ehci-pci: EHCI PCI platform driver
[ 0.740000] ehci-platform: EHCI generic platform driver
[ 0.740000] mousedev: PS/2 mouse device common for all mice
[ 0.740000] usbcore: registered new interface driver usbhid
[ 0.740000] usbhid: USB HID core driver
[ 0.740000] usbcore: registered new interface driver snd-usb-audio
[ 0.740000] NET: Registered protocol family 10
[ 0.750000] Segment Routing with IPv6
[ 0.750000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[ 0.750000] NET: Registered protocol family 17
[ 0.750000] Key type dns_resolver registered
[ 0.760000] ALSA device list:
[ 0.760000] No soundcards found.
[ 0.770000] Freeing unused kernel memory: 208K
[ 0.770000] This architecture does not have kernel memory protection.
[ 0.770000] Run /init as init process("Timestamped" lines are output by the kernel, before them the tree outputs BBL) On one side, FDT is read successfully, on the other side â it results in some nonsense in the parsed "object" tree.
During debugging, I realized that BBL could not read the "double" address not because of 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 typ och name "bumped" into each other in quite a strange way: their first (starting from zero) byte was zeroed out, something like 0xabcdef -> 0xab00ef. I had to use a familiar tactic: knowing the addresses of the corrupted memory, I added to the function printk printing this data. And also distributed the actual calls printk where they were few. Unfortunately, it didn't become much clearer. Then I began, comparing with the disassembled objdump version, to manually set breakpoints and step through the problematic section of code. And here a mysterious and unpleasant discovery was made: if I immediately set a breakpoint somewhere far from the known-good state, then, stopping there, I would see already corrupted memory. But if I try to sneak up on it step by step, the error manages to hide! The matter smells of a broken memory controller and a cache that hides the error if the necessary value is constantly requested. But what if...
Replacing memory
Clinging to the possibility of solving the problem not on my side, I suggested that perhaps I simply received a defective memory stick. I remembered that my ten-year-old netbook â it's not just a portable computer, but also a valuable source of DDR2 SO-DIMM. As a bonus, I can put the memory taken from the board into it and get almost instant hangs of Memtest (Linux, by the way, booted almost to the graphical shell). But it's better not to repeat such an experiment if you value information on 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 is simply "bad," and the issue isn't in my wrapper.
SÄ, vi behöver försöka köra med netbookens minne tillfÀlligt. TyvÀrr kan Quartus 18 inte uppgradera denna IP Core sÄ att den kan redigeras. Det verkar som att det verkligen Àr dags att lÀra sig skapa nya instanser. Det visade sig vara ganska enkelt: vi letar i IP-katalogen efter punkten DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP och fÄr en block med samma grÀnssnitt som tidigare. Det enda problemet Àr att stÀlla in rÀtt minnesinstÀllningar.
Vi fÄr parametrarna för minnesmodulen
Det finns ett relativt uppenbart sÀtt att konfigurera modulen: lÀsa parametrarna frÄn SPD. Verkligen, om en vanlig dator lÀser SPD-data och stÀller in kontrolleraren utifrÄn dem, lÄt oss lÀsa dessa data pÄ den befintliga netbooken och skriva in dem i en tabell.
PÄ Ubuntu görs detta : vi behöver installera paketet i2c-tools, ladda moduler eeprom och i2c-i801 (jag Àr inte sÀker pÄ att den andra drivrutinen passar överallt), varefter vi kör decode-dimms:
Utdata frÄn decode-dimms
# decode-dimms version 6231 (2014-02-20 10:54:34 +0100)
Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/0-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x00)
SPD Revision Invalid
Fundamental Memory type Unknown (0x00)
---=== Manufacturing Information ===---
Manufacturer Undefined
Part Number Undefined
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/4-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x00)
SPD Revision Invalid
Fundamental Memory type Unknown (0x00)
---=== Manufacturing Information ===---
Manufacturer Undefined
Part Number Undefined
Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/6-0050
Guessing DIMM is in bank 1
---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62 OK (0x76)
# of bytes written to SDRAM EEPROM 128
Total number of bytes in EEPROM 256
Fundamental Memory type DDR2 SDRAM
SPD Revision 1.2
---=== Memory Characteristics ===---
Maximum module speed 800 MHz (PC2-6400)
Size 1024 MB
Banks x Rows x Columns x Bits 8 x 13 x 10 x 64
Ranks 2
SDRAM Device Width 16 bits
Module Height 30.0 mm
Module Type SO-DIMM (67.6 mm)
DRAM Package Planar
Voltage Interface Level SSTL 1.8V
Module Configuration Type No Parity
Refresh Rate Reduced (7.8 us) - Self Refresh
Supported Burst Lengths 4, 8
tCL-tRCD-tRP-tRAS 6-6-6-18
Supported CAS Latencies (tCL) 6T, 5T, 4T
Minimum Cycle Time 2.50 ns at CAS 6 (tCK min)
3.00 ns at CAS 5
3.75 ns at CAS 4
Maximum Access Time 0.40 ns at CAS 6 (tAC)
0.45 ns at CAS 5
0.50 ns at CAS 4
Maximum Cycle Time (tCK max) 8.00 ns
---=== Timing Parameters ===---
Address/Command Setup Time Before Clock (tIS) 0.17 ns
Address/Command Hold Time After Clock (tIH) 0.25 ns
Data Input Setup Time Before Strobe (tDS) 0.05 ns
Data Input Hold Time After Strobe (tDH) 0.12 ns
Minimum Row Precharge Delay (tRP) 15.00 ns
Minimum Row Active to Row Active Delay (tRRD) 10.00 ns
Minimum RAS# to CAS# Delay (tRCD) 15.00 ns
Minimum RAS# Pulse Width (tRAS) 45.00 ns
Write Recovery Time (tWR) 15.00 ns
Minimum Write to Read CMD Delay (tWTR) 7.50 ns
Minimum Read to Pre-charge CMD Delay (tRTP) 7.50 ns
Minimum Active to Auto-refresh Delay (tRC) 60.00 ns
Minimum Recovery Delay (tRFC) 127.50 ns
Maximum DQS to DQ Skew (tDQSQ) 0.20 ns
Maximum Read Data Hold Skew (tQHS) 0.30 ns
---=== Manufacturing Information ===---
Manufacturer Samsung
Manufacturing Location Code 0x02
Part Number M4 70T2864QZ3-CF7
Revision Code 0x3351
Manufacturing Date 2009-W34
Assembly Serial Number 0x79C64E9A
Number of SDRAM DIMMs detected and decoded: 3Problemet Àr att vissa timings inte anges hÀr, sÄ vi gÄr den andra vÀgen.
Vad stÄr det pÄ modulerna:


I det hĂ€r fallet Ă€r det mer intressant att titta pĂ„ inskriptionen pĂ„ sjĂ€lva minneschipen: K4T1G164QQ-HCF7. Genom att slĂ„ in denna rad i Google fĂ„r vi ett databla pĂ„ flera tiotals sidor med alla nödvĂ€ndiga parametrar som vi kan föra över till IP Core:s egenskaper. Men var uppmĂ€rksam pĂ„ enhetsmĂ„tten: pĂ„ vissa stĂ€llen ns, pĂ„ andra â ps, och ibland till och med brĂ„kdelar tCK. Jag kommer inte att lĂ€ra er vad ni ska vara uppmĂ€rksamma pĂ„ â jag har sjĂ€lv stĂ€llt in mycket genom trial and error (jag kan inte garantera att detta inte kan "skada" minnet eller FPGA:n). Jag vill bara pĂ„peka följande: jag kunde mycket lĂ€nge inte fĂ„ kontrolleraren att fungera, och sista steget var att inse att jag behövde kontrollera bredden av alla grĂ€nssnitt till minnet för att matcha den genererade koden i Verilog: för nĂ€r i MemIfBundle Ă€r angivet val mem_ba = IO(Output(UInt(2.W))), och det finns 8 bankar (det vill sĂ€ga adressbredden Ă€r 3 bitar), sĂ„ allt vi har Ă€r en hĂ€ngande output frĂ„n minneskontrolleraren â ett problem, men inte kritiskt, sĂ„ allt syntetiseras, men fungerar inte.
Kanske skulle allt ha fungerat med den gamla modulen om vi uppdaterade kontrolleraren, men för tillfÀllet har jag ingen lust att kÀmpa med potentiella flytande buggar: jag har tillrÀckligt med mina egna.
SÄ, efter att ha flyttat timebase-frequency till DTS frÄn nivÄn för en specifik CPU till nivÄn för en nod cpus (pÄ ett fullt förstÄeligt sÀtt sagt av kÀrnan), fÄr vi:
Dolt innehÄll
[ 0.000000] OF: fdt: Ignorerar minnesomrÄde 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Tue Jul 9 22:42:36 MSK 2019
[ 0.000000] bootconsole [early0] aktiverad
[ 0.000000] Initial ramdisk vid: 0x(____ptrval____) (16777216 bytes)
[ 0.000000] Zoner omfÄng:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Flyttbar zonstart för varje nod
[ 0.000000] Tidiga minnesnoders omfÄng
[ 0.000000] nod 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup nod 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] programvara IO TLB: mappad [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap Àr 0x112d
[ 0.000000] percpu: InbÀddade 17 sidor/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Byggd 1 zonelistor, mobilitetsgruppering aktiverad. Totalt sidor: 258055
[ 0.000000] Kernel kommandorad: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentry cache hash-tabellens poster: 131072 (ordning: 8, 1048576 bytes)
[ 0.000000] Inode-cache hash-tabellens poster: 65536 (ordning: 7, 524288 bytes)
[ 0.000000] Sortering __ex_table...
[ 0.000000] Minne: 937696K/1046528K tillgÀngligt (6565K kernelkod, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K reserverat, 0K cma-reserverat)
[ 0.000000] SLUB: HWalign=64, Ordning=0-3, MinObjects=0, CPUs=1, Noder=1
[ 0.000000] rcu: Hierarkisk RCU-implementering.
[ 0.000000] rcu: RCU-hÀndelsespÄrning Àr aktiverat.
[ 0.000000] rcu: RCU begrÀnsar CPU:er frÄn NR_CPUS=8 till nr_cpu_ids=1.
[ 0.000000] rcu: Justering av geometri för rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, förallokerade irqs: 0
[ 0.000000] plic: mappade 8 avbrott till 1 (av 2) hanterare.
[ 0.000000] klockkÀlla: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Konsole: fÀrgad dummy-enhet 80x25
[ 0.000000] Kalibrerar fördröjningsloop (skippad), vÀrde berÀknat med hjÀlp av timerfrekvens.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: standard: 32768 minimum: 301
[ 0.030000] Mount-cache hash-tabellens poster: 2048 (ordning: 2, 16384 bytes)
[ 0.040000] Mountpoint-cache hash-tabellens poster: 2048 (ordning: 2, 16384 bytes)
[ 0.140000] rcu: Hierarkisk SRCU-implementation.
[ 0.190000] smp: Initiering av sekundÀra CPU:er ...
[ 0.190000] smp: Initierade 1 nod, 1 CPU
[ 0.220000] devtmpfs: initialiserad
[ 0.300000] slump: get_random_u32 anropad frÄn bucket_table_alloc+0x76/0x17a med crng_init=0
[ 0.330000] klockkÀlla: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex hash-tabellens poster: 256 (ordning: 2, 16384 bytes)
[ 0.380000] NET: Registrerad protokollfamilj 16
[ 1.850000] vgaarb: laddad
[ 1.870000] SCSI-understöd initierat
[ 1.900000] usbcore: registrerade ny grÀnssnittdrivrutin usbfs
[ 1.910000] usbcore: registrerade ny grÀnssnittdrivrutin hub
[ 1.920000] usbcore: registrerade ny enhetsdrivrutin usb
[ 1.930000] pps_core: LinuxPPS API ver. 1 registrerad
[ 1.940000] pps_core: Programvaru ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 1.950000] PTP klockstöd registrerat
[ 1.970000] Avancerad Linux-ljudarkitekturdrivrutin initierad.
[ 2.010000] klockkÀlla: VÀxlat till klockkÀlla riscv_clocksource
[ 2.600000] NET: Registrerad protokollfamilj 2
[ 2.640000] tcp_listen_portaddr_hash hash-tabellens poster: 512 (ordning: 1, 8192 bytes)
[ 2.650000] TCP etablerade hash-tabellens poster: 8192 (ordning: 4, 65536 bytes)
[ 2.670000] TCP bind hash-tabellens poster: 8192 (ordning: 5, 131072 bytes)
[ 2.700000] TCP: Hash-tabeller konfigurerade (etablerade 8192 bind 8192)
[ 2.720000] UDP hash-tabellens poster: 512 (ordning: 2, 16384 bytes)
[ 2.730000] UDP-Lite hash-tabellens poster: 512 (ordning: 2, 16384 bytes)
[ 2.750000] NET: Registrerad protokollfamilj 1
[ 2.770000] Packar upp initramfs...
[ 23.980000] Initramfs uppackning misslyckades: skrÀp i den komprimerade arkivet
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Blocklager SCSI generic (bsg) drivrutinsversion 0.4 laddad (huvud 251)
[ 25.030000] io-schemalÀggare noop registrerad
[ 25.040000] io-schemalÀggare deadline registrerad
[ 25.050000] io-schemalÀggare cfq registrerad (standard)
[ 25.060000] io-schemalÀggare mq-deadline registrerad
[ 25.060000] io-schemalÀggare kyber registrerad
[ 25.120000] sifive_gpio 64002000.gpio: SiFive GPIO-chip registrerad 6 GPIOs
[ 25.150000] shpchp: Standard Hot Plug PCI-kontrollerdrivrutin version: 0.4
[ 28.870000] Serial: 8250/16550 drivrutin, 4 portar, IRQ-delning inaktiverad
[ 28.940000] sifive-serial 64000000.serial: kunde inte hitta kontrollerklockan
[ 28.950000] sifive-serial: prov av 64000000.serial misslyckades med fel -2
[ 28.980000] [drm] radeon kernel modesetting aktiverat.
[ 28.990000] [drm] amdgpu kernel modesetting aktiverat.
[ 29.500000] loop: modul laddad
[ 29.610000] sifive_spi 64001000.spi: Kunde inte hitta bussklockan
[ 29.620000] sifive_spi: prov av 64001000.spi misslyckades med fel -2
[ 29.640000] libphy: Fast MDIO Buss: provad
[ 29.680000] e1000e: Intel(R) PRO/1000 NĂ€tverksdrivrutin - 3.2.6-k
[ 29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: USB 2.0 'FörbÀttrad' VÀrdkontroller (EHCI) Drivrutin
[ 29.710000] ehci-pci: EHCI PCI plattformdrivrutin
[ 29.720000] ehci-platform: EHCI generell plattformdrivrutin
[ 29.750000] mousedev: PS/2-musenhet gemensam för alla möss
[ 29.790000] usbcore: registrerade ny grÀnssnittdrivrutin usbhid
[ 29.800000] usbhid: USB HID kÀrndrivare
[ 29.820000] usbcore: registrerade ny grÀnssnittdrivrutin snd-usb-audio
[ 29.900000] NET: Registrerad protokollfamilj 10
[ 29.960000] Segment Routing med IPv6
[ 29.960000] sit: IPv6, IPv4 och MPLS över IPv4 tunneldrivare
[ 30.020000] NET: Registrerad protokollfamilj 17
[ 30.020000] Nyckeltyp dns_resolver registrerad
[ 30.070000] bootconsole [early0] anvÀnder initminnet och mÄste inaktiveras Àven innan den verkliga Àr redo
[ 30.080000] bootconsole [early0] inaktiveratEfter det hÀnder ingenting synligt.
Nu kan vi försöka lösa tre problem:
[ 23.980000] Initramfs uppackning misslyckades: skrÀp i den komprimerade arkivet
...
[ 28.940000] sifive-serial 64000000.serial: kunde inte hitta kontrollerklocka
...
[ 29.610000] sifive_spi 64001000.spi: Kunde inte hitta bussklockan⊠samt med att ingen konsolutmatning upphörde.
Att lösa tvÄ problem med frekvenser Àr inte sÄ svÄrt: man behöver lÀgga till punkter clocks i undertrÀden hos de nödvÀndiga enheterna, för enkelhets skull ge ett tydligt namn pÄ etiketten för noden tlclk:
diff --git a/arch/riscv/dts/zeowaa-1gb.dts b/arch/riscv/dts/zeowaa-1gb.dts
index 4b2cebc..1347e76 100644
--- a/arch/riscv/dts/zeowaa-1gb.dts
+++ b/arch/riscv/dts/zeowaa-1gb.dts
@@ -96,6 +97,7 @@
L8: serial@64000000 {
compatible = "sifive,uart0";
interrupt-parent = <&L0>;
+ clocks = <&tlclk>;
interrupts = <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";Genom att lÀgga till raden #define pr_debug printk i början av filen init/initramfs.c, ger meddelandet om skrÀp istÀllet för initramfs ett nÄgot mer detaljerat meddelande:
[ 2.760000] Unpacking initramfs...
[ 2.770000] Detekterade gzip komprimerade data
[ 23.940000] Detekterade (null) komprimerade data
[ 23.970000] Initramfs uppackning misslyckades: skrÀp i den komprimerade arkivetDet vill sÀga, skrÀpet kanske inte Àr istÀllet för initramfs, utan tillsammans.
Okej, han hittade nĂ„gonting, kanske Ă€r det tillrĂ€ckligt. Men var tog konsolen vĂ€gen? Söker ger en lĂ€nk till en frĂ„ga pĂ„ GitHub: â det visar sig att en UART, enligt drivrutinen, knappt Ă€r vĂ€rt att nĂ€mna. Men daterad den 11 juli 2018 â för ett Ă„r sedan. Det visade sig att den hĂ€r commit Ă€ndĂ„ inte kom in i trĂ€det frĂ„n vilket jag kompilera kĂ€rnan. Genom att manuellt tillĂ€mpa denna patch fick jag en fungerande Linux! Det visade sig att problemet med initramfs verkligen inte var kritiskt.
Genom att logga in som user=root, password=sifive, kunde jag utan nÄgra större problem (förutom att förstÄ att GPIO-nummer har en bas, frÄn vilken allt rÀknas, och som helt enkelt mÄste lÀsas frÄn den motsvarande pseudo-filen) genom sysfs tÀnda LED-lampan pÄ kortet.
Som tidigare bifogar jag en textvideo för starten av Linux. Vid övergÄngen av konsolen frÄn earlyprintk till standard kommer det nÄgot skrÀp som liknar utdata vid felaktigt instÀlld UART-hastighet. Intressant nog hanterade spelaren denna "gröt" utan problem.
KĂ€lla: habr.com
