Në imazh, Linux kernel ju përshëndet përmes GPIO.
Në këtë pjesë të historisë së portimit të RISC-V RocketChip në pllakën kineze me Cyclone IV, ne do të lançojmë Linux dhe do të mësojmë si të konfigurojmë vetë IP Core të kontrolluesit të memories dhe do të editonim pak përshkrimin dts të pajisjes. Ky artikull është vazhdim i , por, ndryshe nga pjesa e mëparshme që ka shkuar një hap më tej, kjo do të jetë mjaft e shkurtër.
… Duke pasur parasysh se setup_smp thirret vetëm nëse bërthama është konfiguruar me mbështetje për SMP, mund të provoni të çaktivizoni shumëbërthamesinë. Do të ishte e pakëndshme nëse do të duhej të implementoja mbështetje për atomik në modulin e memories (më dukej se kjo është diçka që cache menaxhon vetë), por në rastin e një bërthame, kjo nuk duhet të na shqetësojë.
Edhe kësaj here nuk funksionoi…
[ 0.000000] OF: fdt: Duke 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
...Është interesante se pas gjithë këtij debugu, vendosa të shoh se si duhet të duket "ndihma referuese" e bërthamës, tha make qemu, dhe pashë një gabim të ngjashëm.
Fatkeqësisht, niveli tjetër (bërthama Linux) është më i ndërlikuar: GDB, i lidhur përmes JTAG me RocketChip, duket se punon me adresa fizike, pavarësisht se si është e vendosur MMU, ndërsa bërthama në momentin që na intereson tashmë ka konfiguruar kartelën e adresave, kështu që thjesht të themi display/10i $pc nuk do të funksionojë — do të shohim vetëm shumë unimp. Megjithatë, nëse tashmë e kemi zbuluar shtesën (dukshëm që 0x80200000 -> 0xffffffe000000000), atëherë mund të bëjmë një tjetër trik:
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)Brekpoint-et vendosen në mënyrë të ngjashme:
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Duke vazhduar.
Programi mori sinjalin SIGTRAP, Hrëna/trap brekpoint.
setup_smp () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
58 ndërsa ((dn = of_find_node_by_type(dn, "cpu"))) {
(gdb) bt
#0 setup_smp () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1 0xffffffe0000022a2 në setup_arch () në /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2 0x0000000000000000 në ?? ()
Backtrace u ndal: korniza nuk e ruajti PCPor tani duhet t'i hiqni ato manualisht për të shkuar përpara — për GDB kjo është një kurth krejtësisht i paqartë. Ah po, nëse ndonjëherë thoni s ose n në vend të si, gdb do të përpiqet të fusë një brekpoint të paqartë, që për arsye të qarta nuk do të vendoset, por s'mund ta ndalni GDB në këtë rast. Por mos u nxini të ribotoni bordin — sipas vëzhgimeve të mia, mjafton të rinisni vetëm gdb (mbani parasysh që brekpoint-et e vjetra ndoshta nuk do të zhduken).
Praktikisht, do të duhet të merremi me problemin fillestar: vendosja e printk në funksionin of_find_node_by_type, e përdorur nga kodi që kërkon procesorët e ngarkesës, tregon se ai sheh ndonjë papastërti në vend të emrave të tipave të pajisjeve. Për shembull, ajo merr ndonjë rresht "Porta Serial", megjithëse diçka e tillë nuk ka në dtb në fushën e saj. lloji_i_device. Pas kërkimeve për këta bite në imazhin e bërthamës, i gjeta, shikova offset-in dhe kuptova diçka të qartë: madhësia e bërthamës në parametrat e ngarkesës është qartë nënvlerësuar: i është caktuar 8Mb, ndërsa merr më shumë se dhjetë. I kam dedikuar 16Mb, por çuditë nuk u ndalën. Pas disa përpjekjeve me leximin e FDT nga adresat e ndryshme (siç e dimë, adresa dërgohet në bërthamë në regjistër a1), përfundimisht vendosa të gjurmoj se çfarë tani po përpunohet atje. Fatmirësisht, në vend të shëtitjeve me debugger (dhe e mbajmë mend se ka detaje rreth përkthimit të adresave që ende duhet ta zgjidhim ndonjëherë), mund të bëj thjesht dhe në mënyrë të shpejtë në skedarin drivers/of/fdt.c të specifikoni #define pr_debug printk. Në rezultat, arritëm:
shtimi i output-it të debug
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: maksimumi i hyrjeve
@@ -1253,6 +1255,7 @@ bool __init early_init_dt_scan(void *params)
*/
void __init unflatten_device_tree(void)
{
+ printk("INITIAL: %lxn", initial_boot_params);
__unflatten_device_tree(initial_boot_params, NULL, &of_root,
early_init_dt_alloc_memory_arch, false);output në pajisje
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]Dalja në QEMU
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
SiFive RISC-V Core IP
{
#address-cells = ;
#size-cells = ;
compatible = "riscv-virtio";
model = "riscv-virtio,qemu";
chosen {
linux,initrd-start = ;
linux,initrd-end = ;
riscv,kernel-start = ;
riscv,kernel-end = ;
bootargs = "";
stdout-path = ;
}
uart@10000000 {
interrupts = ;
interrupt-parent = ;
clock-frequency = ;
reg = ;
compatible = "ns16550a";
}
test@100000 {
reg = ;
compatible = "sifive,test0";
}
virtio_mmio@10008000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10007000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10006000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10005000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10004000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10003000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10002000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
virtio_mmio@10001000 {
interrupts = ;
interrupt-parent = ;
reg = ;
compatible = "virtio,mmio";
}
cpus {
#address-cells = ;
#size-cells = ;
timebase-frequency = ;
cpu@0 {
device_type = "cpu";
reg = ;
status = "okay";
compatible = "riscv";
riscv,isa = "rv64imafdcsu";
mmu-type = "riscv,sv48";
clock-frequency = ;
interrupt-controller {
#interrupt-cells = ;
interrupt-controller;
compatible = "riscv,cpu-intc";
linux,phandle = ;
phandle = ;
}
}
}
memory@80000000 {
device_type = "memory";
reg = ;
}
soc {
#address-cells = ;
#size-cells = ;
compatible = "simple-bus";
ranges;
pci@30000000 {
interrupt-map-mask = ;
interrupt-map = ;
ranges = ;
reg = ;
dma-coherent;
bus-range = ;
linux,pci-domain = ;
device_type = "pci";
compatible = "pci-host-ecam-generic";
#size-cells = ;
#interrupt-cells = ;
#address-cells = ;
}
interrupt-controller@c000000 {
linux,phandle = ;
phandle = ;
riscv,ndev = ;
riscv,max-priority = ;
reg-names = "control";
reg = ;
interrupts-extended = ;
interrupt-controller;
compatible = "riscv,plic0";
#interrupt-cells = ;
#address-cells = ;
}
clint@2000000 {
interrupts-extended = ;
reg = ;
compatible = "riscv,clint0";
}
}
}
[ 0.000000] HART = 0 DTB = 80e00000
[ 0.000000] search "chosen", depth: 0, uname:
[ 0.000000] search "chosen", depth: 1, uname: chosen
[ 0.000000] Looking for initrd properties...
[ 0.000000] initrd_start=0x88000000 initrd_end=0x88442b86
[ 0.000000] Command line is: earlyprintk
[ 0.000000] dt_root_size_cells = 2
[ 0.000000] dt_root_addr_cells = 2
[ 0.000000] memory scan node memory@80000000, reg size 16,
[ 0.000000] - 80000000 , 40000000
[ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Sat Jul 6 12:14:41 MSK 2019
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] Initial ramdisk at: 0x(____ptrval____) (4467590 bytes)
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] INITIAL: ffffffe000c00000
[ 0.000000] -> unflatten_device_tree()
[ 0.000000] Unflattening device tree:
[ 0.000000] magic: d00dfeed
[ 0.000000] size: 00000d56
[ 0.000000] version: 00000011
[ 0.000000] size is 14192, allocating...
[ 0.000000] unflattening (____ptrval____)...
[ 0.000000] fixed up name for ->
[ 0.000000] fixed up name for chosen -> chosen
[ 0.000000] fixed up name for uart@10000000 -> uart
[ 0.000000] fixed up name for test@100000 -> test
[ 0.000000] fixed up name for virtio_mmio@10008000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10007000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10006000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10005000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10004000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10003000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10002000 -> virtio_mmio
[ 0.000000] fixed up name for virtio_mmio@10001000 -> virtio_mmio
[ 0.000000] fixed up name for cpus -> cpus
[ 0.000000] fixed up name for cpu@0 -> cpu
[ 0.000000] fixed up name for interrupt-controller -> interrupt-controller
[ 0.000000] fixed up name for memory@80000000 -> memory
[ 0.000000] fixed up name for soc -> soc
[ 0.000000] fixed up name for pci@30000000 -> pci
[ 0.000000] fixed up name for interrupt-controller@c000000 -> interrupt-controller
[ 0.000000] fixed up name for clint@2000000 -> clint
[ 0.000000] <- unflatten_device_tree()
[ 0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effec00 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03effeee8 [memory] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff0b0 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff320 [pci] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efff858 [<NULL>] | [cpu]
[ 0.000000] ffffffe03effe888 ffffffe03efffd58 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.000000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.000000] elf_hwcap is 0x112d
[ 0.000000] percpu: Embedded 17 pages/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 258055
[ 0.000000] Kernel command line: earlyprintk
[ 0.000000] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[ 0.000000] Sorting __ex_table...
[ 0.000000] Memory: 949716K/1046528K available (6565K kernel code, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K reserved, 0K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[ 0.000000] plic: mapped 53 interrupts to 2 (out of 2) handlers.
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[ 0.000000] Console: colour dummy device 80x25
[ 0.000000] console [tty0] enabled
[ 0.000000] bootconsole [early0] disabled
[ 0.000000] Calibrating delay loop (skipped), value calculated using timer frequency.. 20.00 BogoMIPS (lpj=100000)
[ 0.000000] pid_max: default: 32768 minimum: 301
[ 0.000000] Mount-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.000000] Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.020000] rcu: Hierarchical SRCU implementation.
[ 0.020000] smp: Bringing up secondary CPUs ...
[ 0.020000] smp: Brought up 1 node, 1 CPU
[ 0.050000] devtmpfs: initialized
[ 0.050000] 0 ffffffe03effc808 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effca78 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effcd98 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd068 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd230 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd4b8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd740 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effd9c8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effdc50 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effded8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe160 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe3e8 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe670 [<NULL>] | [cpu]
[ 0.050000] 0 ffffffe03effe888 [cpu] | [cpu]
[ 0.050000] random: get_random_u32 called from bucket_table_alloc+0x76/0x17a with crng_init=0
[ 0.050000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.050000] futex hash table entries: 256 (order: 2, 16384 bytes)
[ 0.060000] NET: Registered protocol family 16
[ 0.090000] vgaarb: loaded
[ 0.090000] SCSI subsystem initialized
[ 0.090000] usbcore: registered new interface driver usbfs
[ 0.090000] usbcore: registered new interface driver hub
[ 0.090000] usbcore: registered new device driver usb
[ 0.090000] pps_core: LinuxPPS API ver. 1 registered
[ 0.090000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.090000] PTP clock support registered
[ 0.100000] Advanced Linux Sound Architecture Driver Initialized.
[ 0.100000] clocksource: Switched to clocksource riscv_clocksource
[ 0.110000] NET: Registered protocol family 2
[ 0.110000] tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes)
[ 0.110000] TCP established hash table entries: 8192 (order: 4, 65536 bytes)
[ 0.110000] TCP bind hash table entries: 8192 (order: 5, 131072 bytes)
[ 0.110000] TCP: Hash tables configured (established 8192 bind 8192)
[ 0.110000] UDP hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[ 0.110000] NET: Registered protocol family 1
[ 0.120000] Unpacking initramfs...
[ 0.590000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 0.620000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 0.620000] io scheduler noop registered
[ 0.620000] io scheduler deadline registered
[ 0.620000] io scheduler cfq registered (default)
[ 0.620000] io scheduler mq-deadline registered
[ 0.620000] io scheduler kyber registered
[ 0.620000] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[ 0.690000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 0.690000] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 10, base_baud = 230400) is a 16550A
[ 0.720000] console [ttyS0] enabled
[ 0.720000] [drm] radeon kernel modesetting enabled.
[ 0.720000] [drm] amdgpu kernel modesetting enabled.
[ 0.730000] loop: module loaded
[ 0.730000] libphy: Fixed MDIO Bus: probed
[ 0.740000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[ 0.740000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 0.740000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.740000] ehci-pci: EHCI PCI platform driver
[ 0.740000] ehci-platform: EHCI generic platform driver
[ 0.740000] mousedev: PS/2 mouse device common for all mice
[ 0.740000] usbcore: registered new interface driver usbhid
[ 0.740000] usbhid: USB HID core driver
[ 0.740000] usbcore: registered new interface driver snd-usb-audio
[ 0.740000] NET: Registered protocol family 10
[ 0.750000] Segment Routing with IPv6
[ 0.750000] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[ 0.750000] NET: Registered protocol family 17
[ 0.750000] Key type dns_resolver registered
[ 0.760000] ALSA device list:
[ 0.760000] No soundcards found.
[ 0.770000] Freeing unused kernel memory: 208K
[ 0.770000] This architecture does not have kernel memory protection.
[ 0.770000] Run /init as init process(«Tajmactiviteiten» rresht dalin bërthamën, përpara tyre pemën e jep BBL) Nga njëra anë, FDT lexohet me sukses, nga ana tjetër — rezultati është një lloj çorbe në pemën e «objekteve» të parsed.
Gjatë procesit të debugimit, kuptova se BBL nuk mundi të lexonte adresën «dytësore» jo për shkak të një gabimi në konfigurim, por thjesht për shkak se nënnyja rrënjore ishte vendosur. #address-cells = <1>; #size-cells = <1>;.
Duke zgjeruar daljen e debugimit, pashë se treguesit në lloji dhe emri «u përplasen», në mënyrë mjaft të çuditshme: u zeroa byte-i i parë (duke filluar nga zero), diçka si 0xabcdef -> 0xab00ef. Më duhej të përdorja taktikën e njohur: duke ditur adresat ku ndodhej memoria e dëmtuar, ti shkruaja në funksionin printk këto të dhëna. Po ashtu dhe vetë thirrjet printk të shpërndaheshin, ku ishin të pakta. Fatkeqësisht, nuk u bë shumë më e kuptueshme. Atëherë fillova, duke u krahasuar me versionin e disasembler, të vendosja manualisht breakpoint-et dhe të kaloja nëpër seksionin problematik të kodit. Dhe këtu u zbulua një mister i çuditshëm dhe i pakëndshëm: nëse vendos menjëherë një pikë ndalimi diku relativisht larg nga gjendja e njohur e mirë, atëherë, duke u ndaluar aty, do të shoh një memorie të dëmtuar. Por në qoftë se përpiqem të afrohem butësisht nëpër hapa, atëherë gabimi arrin të fshihet! Problemi ka të bëjë me një kontrollues memories të dëmtuar dhe një cache që fsheh gabimin, nëse kërkohet vazhdimisht vlera e nevojshme. Çfarë nëse… objdump Zëvendësojmë memorjen.
Duke u mbështetur në mundësinë për të zgjidhur problemin jo nga ana ime, unë supozova se, ndoshta, thjesht më ka ardhur një modul memorje i dëmtuar. Pastaj kujtova se netbook-u një dekadë i vjetër — është jo vetëm një kompjuter portativ, por edhe një burim i çmuar DDR2 SO-DIMM. Si bonus, mund të vendosësh memorjen e nxjerrë nga plaka, dhe të marrësh një bllokim të menjëhershëm të Memtest (Linux, për të rrjedhur deri në ndërfaqen grafike).
Por është më mirë të mos e përsërisni një eksperiment të tillë, nëse ju rëndësishme informata në diskët e lidhur… ). Nga njëra anë, mund të supozohet se thjesht memoria nuk i përshtatet konkretisht këtij netbook-u. Nga ana tjetër, ai arriti të ngarkohej! U krijua shpresa se thjesht memoria është «e dëmtuar», dhe problemi nuk është në mbështjelljen time.). Nga ana tjetër, mund të supozohet se thjesht memorja nuk i përket konkretisht këtij netbuku. Nga ana tjetër, ai arriti të ngarkohet! U shfaq shpresa se thjesht memoria është 'e dëmtuar', dhe problemi nuk është te ambalazhimi im.
Pra duhet të provoni përkohësisht të nisni me memorien e netbook-ut. Fatkeqësisht, Quartus 18 nuk e përditëson këtë IP Core në mënyrë që të mund të redaktohet. Kështu që, në fund të fundit, ka ardhur koha të mësojmë të krijojmë instanca të reja. Të gjitha rezultuan mjaft të thjeshta: kërkojmë në IP Catalog pikën DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP dhe marrim një modul me të njëjtin interface si më parë. Problemi i vetëm është të vendosim parametrat e duhur të memories.
Merrni parametrat e modulit të memories
Ekziston një mënyrë relativisht e qartë për të konfiguruar modul: të lexoni parametrat nga SPD. Në të vërtetë, nëse një kompjuter i zakonshëm lexon të dhënat SPD dhe konfiguron kontrollorin sipas tyre, atëherë le të lexojmë këto të dhëna në netbook-un ekzistues dhe t'i fusim ato në një tabelë.
Në Ubuntu, kjo bëhet : duhet të instaloni paketën i2c-tools, ngarkoni modulët eeprom dhe i2c-i801 (nuk jam i sigurt, megjithatë, që drejtuesi i dytë do të funksionojë kudo), pas së cilës duhet të nisni decode-dimms:
Ishulli 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: 3Problemi është se disa koha nuk janë të spécifikura, prandaj le të ndjekim rrugën e dytë.
Çfarë shkruhet në modulët:


Në këtë rast, është më interesante mbishkrimi në vetë çipet e memories: K4T1G164QQ-HCF7. Pasi ta vendosim këtë rresht në Google, marrim datasheet-in për disa dhjetëra faqe me të gjitha parametrat e nevojshëm që mund të futen me kujdes në pronësitë e IP Core. Vetëm kushtojini vëmendje njësive të matjes: diku ns, diku — ps, dhe ndonjëherë madje edhe fraksione tCK. Nuk do t'ju mësoj se mbi çfarë duhet të vëreni — unë vetë kam konfiguruar shumë me metodën e provës dhe gabimeve (nuk mund të garantoj se kështu nuk mund të "digjni" memorien ose FPGA-në). Do të theksoj vetëm se: kam pasur shumë vështirësi për ta detyruar kontrollorin të punojë, dhe hapi përfundimtar ishte të kuptoja se duhet të kontrolloja gjerësinë e të gjitha interface-ve me memorjen për t'u përputhur me kodin e gjeneruar në Verilog: sepse kur në MemIfBundle citohet val mem_ba = IO(Output(UInt(2.W))), dhe ka 8 banka (dmth, adresa është 3 bit e gjatë), atëherë gjithçka që kemi — një output që varet në ajër nga kontrollori i memories — është një problem, por jo kritik, prandaj gjithçka sintetizohet, por nuk funksionon.
Ndoshta gjithçka do të funksiononte edhe me modulin e vjetër, nëse do të përditësohej kontrollori, por për momentin nuk kam dëshirë të merrem me potencialet e gabimeve të lundrueshme: kam mjaft të mijat.
Pra, pas zhvendosjes timebase-frequency në DTS nga niveli i një CPU konkret në nivelin e një nyje cpus (nga kërkesa e shprehur qartë nga bërthama), marrim:
Tekst i fshehur
[ 0.000000] OF: fdt: Po anashoi gamat 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 Mar 9 22:42:36 MSK 2019
[ 0.000000] bootconsole [early0] aktivizuar
[ 0.000000] Ramdisk fillestar: 0x(____ptrval____) (16777216 bytes)
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Fillimi i zonës së lëvizshme për çdo nyjë
[ 0.000000] Rangu i hershëm i kujtesës
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Vendosja e kujtesës initmem nyja 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] TLB IO të softuerit: hartuar [mem 0xbb1fc000-0xbf1fc000] (64MB)
[ 0.000000] elf_hwcap është 0x112d
[ 0.000000] percpu: 17 faqe të integruara/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Nënshkruan 1 zonelista, grupimi i lëvizshmërisë në punë. Numri total i faqeve: 258055
[ 0.000000] Komanda e kernelit: 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] Rendit __ex_table...
[ 0.000000] Kujtesë: 937696K\/1046528K e disponueshme (6565K kodi i kernelit, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K rezervuar, 0K cma-rezervuar)
[ 0.000000] SLUB: HWalign=64, Rendit=0-3, MinObjects=0, CPU=1, Nënja=1
[ 0.000000] rcu: Zbatimi hierarkik RCU.
[ 0.000000] rcu: RCU ndodhen ngjarje trace-imi është aktivizuar.
[ 0.000000] rcu: RCU kufizon CPU nga NR_CPUS=8 në nr_cpu_ids=1.
[ 0.000000] rcu: Rregullimi i geometrisë për rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, irqs të parapara: 0
[ 0.000000] plic: hartuar 8 ndërprerje në 1 (nga 2) menaxherë.
[ 0.000000] burimoreko: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] Console: pajisje dummy me ngjyrë 80x25
[ 0.000000] Kalibrimi i ciklit të vonesës (skipas), vlera e llogaritur duke përdorur frekuencën e orës.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max: default: 32768 minimum: 301
[ 0.030000] Mount-cache hash table entries: 2048 (rendit: 2, 16384 bytes)
[ 0.040000] Mountpoint-cache hash table entries: 2048 (rendit: 2, 16384 bytes)
[ 0.140000] rcu: Zbatimi hierarkik SRCU.
[ 0.190000] smp: Duke ngritur CPU të dyta ...
[ 0.190000] smp: Ngritur 1 nyje, 1 CPU
[ 0.220000] devtmpfs: inicializuar
[ 0.300000] random: get_random_u32 thirrur nga bucket_table_alloc+0x76\/0x17a me crng_init=0
[ 0.330000] burimoreko: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.340000] futex hash tabela entries: 256 (rendit: 2, 16384 bytes)
[ 0.380000] NET: Regjistruar familja e protokollit 16
[ 1.850000] vgaarb: e ngarkuar
[ 1.870000] SCSI nënshkrimi i inicializuar
[ 1.900000] usbcore: regjistruar shoferin e ri të ndërfaqes usbfs
[ 1.910000] usbcore: regjistruar shoferin e ri të ndërfaqes hub
[ 1.920000] usbcore: regjistruar shoferin e ri të pajisjes usb
[ 1.930000] pps_core: LinuxPPS API ver. 1 e regjistruar
[ 1.940000] pps_core: Softueri ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 1.950000] PTP mbështetje regjistruar
[ 1.970000] Avancuar Arkitektura e Zërit të Linuxit Driver Inizialisuar.
[ 2.010000] burimoreko: Kalimi në burimoreko riscv_clocksource
[ 2.600000] NET: Regjistruar familja e protokollit 2
[ 2.640000] tcp_listen_portaddr_hash hash tabela entries: 512 (rendit: 1, 8192 bytes)
[ 2.650000] TCP tabelat e hash të krijuara: 8192 (rendit: 4, 65536 bytes)
[ 2.670000] TCP bind tabelat e hash: 8192 (rendit: 5, 131072 bytes)
[ 2.700000] TCP: Tabelat e hash të konfiguruara (krijuar 8192 lidhje 8192)
[ 2.720000] UDP hash tabela entries: 512 (rendit: 2, 16384 bytes)
[ 2.730000] UDP-Lite hash tabela entries: 512 (rendit: 2, 16384 bytes)
[ 2.750000] NET: Regjistruar familja e protokollit 1
[ 2.770000] Ngritja e initramfs...
[ 23.980000] Ngritja e initramfs ka dështuar: mbeturina në arkiv të kompresuar
[ 24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Shtresa e bllokut SCSI shenill (bsg) version 0.4 e ngarkuar (mahi 251)
[ 25.030000] io orar noop regjistruar
[ 25.040000] io orar afat regjistruar
[ 25.050000] io orar cfq regjistruar (default)
[ 25.060000] io orar mq-afat regjistruar
[ 25.060000] io orar kyber regjistruar
[ 25.120000] sifive_gpio 64002000.gpio: Çipi SiFive GPIO i regjistruar 6 GPIO
[ 25.150000] shpchp: Versioni i Shoferit të Standardit të Kontrollit të Hot Plug PCI: 0.4
[ 28.870000] Serial: 8250\/16550 shoferi, 4 porta, ndarje IRQ e çaktivizuar
[ 28.940000] sifive-serial 64000000.serial: nuk mund të gjejë orën e kontrollit
[ 28.950000] sifive-serial: hetimi i 64000000.serial dështoi me gabim -2
[ 28.980000] [drm] radeon zhvillimi i modalitetit të kernelit aktivizuar.
[ 28.990000] [drm] amdgpu zhvillimi i modalitetit të kernelit aktivizuar.
[ 29.500000] loop: moduli i ngarkuar
[ 29.610000] sifive_spi 64001000.spi: Nuk mund të gjendet orari i autobusit
[ 29.620000] sifive_spi: hetimi i 64001000.spi dështoi me gabim -2
[ 29.640000] libphy: Autobusi i MDIO të Fiksuar: hetuar
[ 29.680000] e1000e: Intel(R) PRO\/1000 Shoferi i Rjetit - 3.2.6-k
[ 29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd: Nënpunuesi i Kontraktoreve USB 2.0 'Të Avancuar' (EHCI)
[ 29.710000] ehci-pci: EHCI shoferi i platformës PCI
[ 29.720000] ehci-platform: EHCI shoferi i përgjithshëm i platformës
[ 29.750000] mousedev: Pajisja e mausit PS\/2 e zakonshme për të gjithë miqtë
[ 29.790000] usbcore: regjistruar shoferin e ri të ndërfaqes usbhid
[ 29.800000] usbhid: Shoferi i bërthamës USB HID
[ 29.820000] usbcore: regjistruar shoferin e ri të ndërfaqes snd-usb-audio
[ 29.900000] NET: Regjistruar familja e protokollit 10
[ 29.960000] Segmenti i Rrugës me IPv6
[ 29.960000] sit: IPv6, IPv4 dhe MPLS mbi IPv4 shoferi i tunelimit
[ 30.020000] NET: Regjistruar familja e protokollit 17
[ 30.020000] Çelësi i tipit dns_resolver regjistruar
[ 30.070000] bootconsole [early0] përdor memorie fillestare dhe duhet të çaktivizohet edhe para se ai i vërteti të jetë gati
[ 30.080000] bootconsole [early0] i çaktivizuarPas pas, nuk ndodh asgjë e dukshme.
Tani mund të përpiqemi të përballojmë tre probleme:
[ 23.980000] Dështimi i shfrytëzimit të initramfs: mbetje në arkiv të kompresuar
...
[ 28.940000] sifive-serial 64000000.serial: e pamundur të gjejë orën e kontrollit
...
[ 29.610000] sifive_spi 64001000.spi: E pamundur të gjejë orën e autobusit… si dhe me ndërprerjen e daljes në konsolë.
Të dy problemet me frekuencat janë shumë të lehta për t'u zgjidhur: duhet të shtohen pikat clocks në nënstrukturat e pajisjeve të nevojshme, duke i dhënë emra kuptimplotë etiketave për nyjën 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 {
i përputhshëm = "sifive,uart0";
prind-i ndërprerjeve = <&L0>;
+ orët = <&tlclk>;
ndërprerjet = <2>;
regj = <<0x64000000 0x1000>;
emrat-e-regjistrimeve = "kontroll";
@@ -107,6 +109,7 @@
prind-i ndërprerjeve = <&L0>;
ndërprerjet = <1>;
regj = <0x64001000 0x1000>;
+ orët = <&tlclk>;
emrat-e-regjistrimeve = "kontroll";
L12: mmc@0 {
i përputhshëm = "mmc-spi-slot";
@@ -116,7 +119,7 @@
rrekset-e-volta = <3300 3300>;
};
};
- L11: tlclk {
+ tlclk: tlclk {
#qelizat-e-orës = <0>;
frekuenca-e-orës = <<25000000>;
emrat-e-daljes-e-orës = "tlclk";Duke shtuar linjën #define pr_debug printk në fillim të skedarit init/initramfs.c, duke shfaqur një mesazh për mbetjet në vend të initramfs, marrim një mesazh pak më të detajuar:
[ 2.760000] Dëshifrim i initramfs...
[ 2.770000] E zbuluar të dhëna të kompresuara gzip
[ 23.940000] E zbuluar të dhëna të kompresuara (null)
[ 23.970000] Dështimi i shfrytëzimit të initramfs: mbetje në arkiv të kompresuarPra, në mundësi, mbetjet nuk në vend të janë initramfs, por se bashku.
Ok, diçka ai gjeti, ndoshta kjo është e mjaftueshme. Por ku shkoi konsola? Kërkimi jep një lidhje me një çështje në GitHub: — rezulton, një UART në mendimin e shoferit nuk ia vlen të flasësh. Por daton 11 korrik 2018 — një vit më parë. Resulton se ky komit nuk ka hyrë në pemën, nga e cila unë ndërtoj bërthamën. Duke aplikuar dorazi këtë patch, unë kam marrë një Linux funksional! Duhet të thuhet se problemin me initramfs nuk ishte, në të vërtetë, kritik.
Duke u identifikuar si user=root, password=sifive, unë arrita pa asnjë problem të veçantë (përveç të kuptuarit se numri i GPIO ka një bazë, nga e cila gjithçka llogaritet, dhe që thjesht duhet të lexoni nga skedari përkatës pseudo) përmes sysfs të ndezim LED-in në bord.
Si në rastin e fundit, po bashkëngjisim videon tekstuale të nisjes së Linux. Në momentin e kalimit nga consola me earlyprintk në atë standarde, ndodhen disa përmbajtje të çrregullt, të ngjashme me daljen e gabuar për shkak të shpejtësisë së gabuar të UART. E çuditshme, por lojërat e mediave e përpunuan me sukses këtë "sakate".
Burimi: habr.com
