Sur l'image, le noyau Linux vous salue via GPIO.
Dans cette partie de l'histoire du portage de RISC-V RocketChip sur la carte chinoise avec Cyclone IV, nous allons finalement lancer Linux, et apprendre Ă configurer nous-mĂȘmes le cĆur IP du contrĂŽleur de mĂ©moire et lĂ©gĂšrement modifier la description d'Ă©quipement DTS. Cet article est une suite de , mais, contrairement Ă l'Ă©pisode prĂ©cĂ©dent plutĂŽt dĂ©veloppĂ©, il sera assez court.
... Ătant donnĂ© que setup_smp est appelĂ© uniquement si le noyau est configurĂ© avec le support SMP, nous pouvons essayer de dĂ©sactiver la multiprocession. Ce serait dĂ©sagrĂ©able si je devais aussi implĂ©menter le support d'atomicitĂ© dans le module de mĂ©moire (je pensais que le cache s'occupait de cela de lui-mĂȘme), mais dans le cas d'un cĆur unique, cela ne devrait pas nous poser de problĂšme.
Ăa n'a toujours pas marchĂ©...
[ 0.000000] OF: fdt: Ignorer la plage de mémoire 0x80000000 - 0x80200000
[ 0.000000] Version de Linux 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Jeu 4 Jul 18:38:10 MSK 2019
[ 0.000000] Console de démarrage [early0] activée
[ 0.000000] Ramdisk initial Ă : 0x(____ptrval____) (16777216 octets)
[ 0.000000] Plages de zones :
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] DĂ©but de la zone mobile pour chaque nĆud
[ 0.000000] Plages de nĆuds de mĂ©moire prĂ©coce
[ 0.000000] nĆud 0 : [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Configuration de la mĂ©moire initiale du nĆud 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] TLB IO logiciel : mappé [mem 0xbb1fc000-0xbf1fc000] (64Mo)
[ 0.000000] Impossible de trouver l'entrée "cpu" dans l'arbre des dispositifs
[ 0.000000] 1 lot de zones construit, groupement mobile activé. Total des pages : 258055
[ 0.000000] Ligne de commande du noyau : debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Entrées de la table de hachage du cache Dentry : 131072 (ordre : 8, 1048576 octets)
[ 0.000000] Entrées de la table de hachage du cache Inode : 65536 (ordre : 7, 524288 octets)
[ 0.000000] Tri de __ex_table...
[ 0.000000] BUG : Mauvais état de page dans le processus swapper pfn:80bf7
[ 0.000000] page:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[ 0.000000] flags: 0x0()
[ 0.000000] brut: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[ 0.000000] brut: 0000000000000001 0000000000000000 00000000ffff00ff
[ 0.000000] page dumpée à cause : mapcount non nul
[ 0.000000] Modules liés :
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Non taché 4.19.0-sifive-1+ #1
[ 0.000000] Trace de l'appel :
[ 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] Désactivation du débogage de verrouillage en raison de la contamination du noyau
[ 0.000000] BUG : Mauvais état de page dans le processus swapper pfn:80bf9
[ 0.000000] page:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] brut: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[ 0.000000] brut: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] page dumpée à cause : mapcount non nul
[ 0.000000] Modules liés :
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Contaminé: G B 4.19.0-sifive-1+ #1
[ 0.000000] Trace de l'appel :
[ 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 : Mauvais état de page dans le processus swapper pfn:80bfa
[ 0.000000] page:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] brut: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[ 0.000000] brut: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] page dumpée à cause : mapcount non nul
[ 0.000000] Modules liés :
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Contaminé: G B 4.19.0-sifive-1+ #1
[ 0.000000] Trace de l'appel :
[ 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 : Mauvais état de page dans le processus swapper pfn:80bfb
[ 0.000000] page:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] brut: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[ 0.000000] brut: 0000000000000000 0000000000000000 00000000ffff00ff
[ 0.000000] page dumpée à cause : mapcount non nul
[ 0.000000] Modules liés :
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Contaminé: G B 4.19.0-sifive-1+ #1
[ 0.000000] Trace de l'appel :
[ 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 : Mauvais état de page dans le processus swapper pfn:80bfc
[ 0.000000] page:ffffffe03f029f20 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[ 0.000000] flags: 0x0()
[ 0.000000] brut: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[ 0.000000] brut: 0000000000000000 0000000000000000 00000000ffff00ff
...Il est intéressant de noter qu'aprÚs tout le débogage, j'ai décidé de voir à quoi devrait ressembler la sortie « référence » du noyau, a-t-il dit make qemu, et j'ai vu une erreur similaire.
Malheureusement, le niveau suivant (noyau Linux) est plus complexe : GDB, connectĂ© via JTAG Ă RocketChip, semble fonctionner avec des adresses physiques indĂ©pendamment de la configuration de la MMU, et le noyau Ă ce moment-lĂ a dĂ©jĂ configurĂ© la mappage des adresses, donc il suffit de dire display/10i $pc ne suffira pas â nous ne verrons que beaucoup unimp. Cependant, si nous avons dĂ©jĂ dĂ©terminĂ© le dĂ©calage (il semble que 0x80200000 -> 0xffffffe000000000), nous pouvons faire un tour de passe-passe :
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)Les points d'arrĂȘt sont rĂ©glĂ©s de la mĂȘme maniĂšre :
(gdb) p setup_smp
$1 = {} 0xffffffe000002436
(gdb) b *0x80202436
Breakpoint 1 at 0x80202436
(gdb) c
Continuing.
Le programme a reçu le signal SIGTRAP, piÚge de trace/pause.
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 ?? ()
La trace est arrĂȘtĂ©e : le cadre n'a pas enregistrĂ© le PCCependant, ils doivent ĂȘtre retirĂ©s manuellement pour aller plus loin â pour GDB, c'est un piĂšge complĂštement incomprĂ©hensible. Oh oui, si vous dites accidentellement s ou n au lieu de si, gdb essaiera d'insĂ©rer un point d'arrĂȘt implicite, qui pour des raisons Ă©videntes ne sera pas mis en place, mais il n'est pas possible d'avertir GDB. Mais ne vous prĂ©cipitez pas pour redĂ©marrer la carte â d'aprĂšs mes observations, il suffit de redĂ©marrer uniquement gdb (notez que les anciens points de rupture ne disparaĂźtront peut-ĂȘtre pas).
Il faut donc se pencher sur le problĂšme initial : le placement des printk dans la fonction of_find_node_by_type, utilisĂ©e par le code de recherche du cĆur de dĂ©marrage, montre qu'il voit des donnĂ©es corrompues au lieu des noms des types de pĂ©riphĂ©riques. Par exemple, elle rĂ©cupĂšre la ligne « Port sĂ©rie » alors qu'elle n'existe clairement pas dans le dtb dans le champ type_de_dispositif. En recherchant ces octets dans l'image du noyau, je les ai trouvĂ©s, j'ai regardĂ© le dĂ©calage, et j'ai compris ce qui Ă©tait Ă©vident : la taille du noyau dans les paramĂštres de dĂ©marrage est clairement sous-estimĂ©e : il est allouĂ© 8 Mo, alors qu'il en utilise plus de dix. J'ai allouĂ© 16 Mo, mais les anomalies ont persistĂ©. AprĂšs avoir essayĂ© de lire le FDT depuis diffĂ©rentes adresses (comme on sait, l'adresse est transmise au noyau dans le registre a1), j'ai enfin dĂ©cidĂ© de tracer ce qui est maintenant en cours de parsing. Heureusement, au lieu de trifouiller avec le dĂ©bogueur (et nous savons qu'il y a des nuances avec la translation d'adresses qu'il faut encore rĂ©soudre), je peux simplement et rapidement dans le fichier drivers/of/fdt.c indiquer #define pr_debug printk. Au final, cela a donnĂ© :
ajout de sorties de débogage
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 - limiter le nombre de rĂ©gions dans le nĆud /mĂ©moire
* @limit : maximum d'entrées
@@ -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);Sortie sur le matériel
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]Sortie dans 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(«Les lignes avec un timestamp» sont affichées par le noyau, avec un arbre affiché par BBL devant elles) D'une part, le FDT est lu avec succÚs, d'autre part, on a une sorte de non-sens dans l'arbre «objet» analysé.
Au cours du dĂ©bogage, j'ai compris que BBL ne pouvait pas lire l'adresse «double» non pas Ă cause d'une erreur dans la configuration, mais simplement parce que le nĆud racine avait Ă©tĂ© paramĂ©trĂ©. #address-cells = <1>; #size-cells = <1>;.
En Ă©largissant la sortie de dĂ©bogage, j'ai vu que les pointeurs sur type et nom avaient «buggé», et ce de maniĂšre assez Ă©trange : leur premier octet (commençant par zĂ©ro) a Ă©tĂ© annulĂ©, quelque chose comme 0xabcdef -> 0xab00ef. J'ai dĂ» utiliser une tactique familiĂšre : connaissant les adresses oĂč se trouve la mĂ©moire endommagĂ©e, j'ai ajoutĂ© Ă la fonction printk l'impression de ces donnĂ©es. Et aussi, j'ai dispersĂ© les appels printk oĂč il y en avait peu. Malheureusement, cela n'est pas devenu beaucoup plus clair. Alors j'ai commencĂ©, en me rĂ©fĂ©rant Ă la version dĂ©sassemblĂ©e, Ă placer manuellement des points d'arrĂȘt et Ă passer le morceau de code problĂ©matique Ă©tape par Ă©tape. Et lĂ , une chose mystĂ©rieuse et dĂ©sagrĂ©able s'est rĂ©vĂ©lĂ©e : si je plaçais immĂ©diatement un point d'arrĂȘt quelque part loin de l'Ă©tat connu-des-bons, en m'arrĂȘtant lĂ , je verrais dĂ©jĂ la mĂ©moire endommagĂ©e. Mais si j'essayais de m'approcher furtivement Ă©tape par Ă©tape, l'erreur avait le temps de se cacher ! Cela sent la mĂ©moire vive dĂ©fectueuse et le cache cachant l'erreur, si l'on demande constamment la valeur dĂ©sirĂ©e. Et si⊠objdump Remplacer la mĂ©moire
S'accrochant Ă la possibilitĂ© de rĂ©soudre le problĂšme de mon cĂŽtĂ©, j'ai supposĂ© que peut-ĂȘtre j'avais tout simplement une barre de mĂ©moire dĂ©fectueuse. Je me suis alors rappelĂ© que le netbook vieux de dix ans n'est pas seulement un ordinateur portable, mais aussi une prĂ©cieuse source de DDR2 SO-DIMM. En prime, on peut y insĂ©rer la mĂ©moire retirĂ©e de la carte et obtenir un plantage presque instantanĂ© de Memtest (Linux, d'ailleurs, a presque rĂ©ussi Ă dĂ©marrer jusqu'Ă l'interface graphique.
Mais mieux vaut ne pas répéter une telle expérience si vos informations sur les disques montés vous sont chÚres⊠). D'une part, on pourrait supposer que la mémoire ne convenait tout simplement pas à ce netbook spécifique. D'autre part, il a pu démarrer ! J'ai eu l'espoir que la mémoire était simplement «défectueuse» et que le problÚme n'était pas dans mon enveloppe.). D'un cÎté, on peut supposer que la mémoire n'était tout simplement pas compatible avec ce netbook. D'un autre cÎté, il a réussi à démarrer ! On espÚre donc que c'est simplement la mémoire qui est « défectueuse », et que le problÚme ne vient pas de mon enveloppe.
Il faut donc essayer de dĂ©marrer temporairement avec la mĂ©moire d'un netbook. Malheureusement, Quartus 18 ne permet pas de mettre Ă jour cet IP Core pour qu'il soit modifiable. Il est donc temps d'apprendre Ă crĂ©er de nouvelles instances. Cela s'est avĂ©rĂ© assez simple : nous cherchons dans le catalogue IP l'Ă©lĂ©ment DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP et obtenons un bloc avec la mĂȘme interface qu'auparavant. Le seul problĂšme est de dĂ©finir les bons paramĂštres de la mĂ©moire.
Nous obtenons les paramÚtres du module de mémoire.
Il existe un moyen relativement évident de configurer le module : lire les paramÚtres à partir de SPD. En effet, si un ordinateur ordinaire lit les données SPD et configure le contrÎleur en conséquence, alors lisons ces données sur le netbook disponible et saisissons-les dans un tableau.
Sur Ubuntu, cela se fait Il suffit d'installer le paquet i2c-tools.Ensuite, chargez les modules eeprom et i2c-i801 (je ne suis pas certain, cependant, que le deuxiĂšme pilote convienne partout), puis lancez decode-dimms.:
Sortie de 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: 3Le problÚme est que certains timings ne sont pas indiqués ici, donc nous allons prendre une deuxiÚme voie.
Que dit l'étiquette sur les modules :


Dans ce cas, l'inscription sur les puces mĂ©moire est plus intĂ©ressante : K4T1G164QQ-HCF7. En entrant cette ligne dans Google, nous obtenons une fiche technique de plusieurs dizaines de pages avec tous les paramĂštres nĂ©cessaires, que nous pouvons soigneusement saisir dans les propriĂ©tĂ©s de l'IP Core. Faites juste attention aux unitĂ©s de mesure : parfois, cela sera ns,parfois, cela sera â pset parfois mĂȘme des fractions de tCK.Je ne vais pas vous apprendre Ă quoi il faut faire attention, j'ai beaucoup configurĂ© par essai et erreur (je ne peux cependant pas garantir que de cette maniĂšre, il n'est pas possible de "brĂ»ler" la mĂ©moire ou le FPGA). Je souhaite seulement attirer votre attention sur le fait que j'ai longtemps eu des problĂšmes Ă faire fonctionner le contrĂŽleur, et ma derniĂšre Ă©tape a Ă©tĂ© de rĂ©aliser qu'il fallait vĂ©rifier la largeur de toutes les interfaces de mĂ©moire par rapport au code gĂ©nĂ©rĂ© en Verilog : car lorsque dans MemIfBundle soit dĂ©signĂ© val mem_ba = IO(Output(UInt(2.W))), et qu'il y a 8 banques (c'est-Ă -dire une adresse de largeur 3 bits), alors tout ce que nous avons â une sortie flottante du contrĂŽleur de mĂ©moire â est un problĂšme, mais pas critique, donc tout se synthĂ©tise, mais ne fonctionne pas.
Il se peut que tout fonctionne avec l'ancien module, si le contrÎleur est mis à jour, mais pour l'instant, je n'ai pas envie de m'attaquer aux bugs flottants potentiels : j'ai déjà suffisamment de mes propres problÚmes.
Ainsi, aprĂšs avoir dĂ©placĂ© timebase-frequency dans le DTS du niveau d'un CPU spĂ©cifique au niveau du nĆud. cpus (sur une demande formulĂ©e de maniĂšre tout Ă fait claire par le cĆur), nous obtenons :
Texte caché
[ 0.000000] OF: fdt: Ignorer la plage mémoire 0x80000000 - 0x80200000
[ 0.000000] Version de Linux 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Mar Jul 9 22:42:36 MSK 2019
[ 0.000000] booter console [early0] activé
[ 0.000000] Initial ramdisk Ă : 0x(____ptrval____) (16777216 octets)
[ 0.000000] Plages de zone :
[ 0.000000] DMA32 [mémoire 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mémoire 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] DĂ©but de la zone mobile pour chaque nĆud
[ 0.000000] Ranges de nĆud mĂ©moire prĂ©coces
[ 0.000000] nĆud 0: [mĂ©moire 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Configuration de mĂ©moire initiale nĆud 0 [mĂ©moire 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] TLB logiciel IO : mappé [mémoire 0xbb1fc000-0xbf1fc000] (64Mo)
[ 0.000000] elf_hwcap est 0x112d
[ 0.000000] percpu: 17 pages intégrées/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[ 0.000000] Construit 1 zonelists, regroupement de mobilité activé. Total des pages : 258055
[ 0.000000] Commande du noyau : debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[ 0.000000] Dentries cache entrée de table de hachage : 131072 (ordre : 8, 1048576 octets)
[ 0.000000] Inode-cache entrée de table de hachage : 65536 (ordre : 7, 524288 octets)
[ 0.000000] Tri de __ex_table...
[ 0.000000] Mémoire : 937696K/1046528K disponible (6565K code noyau, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K réservé, 0K cma-réservé)
[ 0.000000] SLUB : HWalign=64, Ordre=0-3, MinObjects=0, CPUs=1, NĆuds=1
[ 0.000000] rcu: Mise en Ćuvre RCU hiĂ©rarchique.
[ 0.000000] rcu: Le traçage d'événements RCU est activé.
[ 0.000000] rcu: RCU restreignant les CPUs de NR_CPUS=8 Ă nr_cpu_ids=1.
[ 0.000000] rcu: Ajustement de la géométrie pour rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS: 0, nr_irqs: 0, irqs préallocés : 0
[ 0.000000] plic: mappé 8 interruptions à 1 (sur 2) gestionnaires.
[ 0.000000] source d'horloge : riscv_clocksource : masque : 0xffffffffffffffff max_cycles : 0x1d854df40, max_idle_ns : 3526361616960 ns
[ 0.000000] Console : appareil couleur fictif 80x25
[ 0.000000] Calibration de la boucle de retard (sauté), valeur calculée en utilisant la fréquence du minuteur.. 2.00 BogoMIPS (lpj=10000)
[ 0.020000] pid_max : défaut : 32768 minimum : 301
[ 0.030000] Entrées de table de hachage du cache de montage : 2048 (ordre : 2, 16384 octets)
[ 0.040000] Entrées de table de hachage du cache de point de montage : 2048 (ordre : 2, 16384 octets)
[ 0.140000] rcu: Mise en Ćuvre SRCU hiĂ©rarchique.
[ 0.190000] smp : Activation des CPUs secondaires ...
[ 0.190000] smp : 1 nĆud, 1 CPU activĂ©
[ 0.220000] devtmpfs : initialisé
[ 0.300000] aléatoire : get_random_u32 appelé depuis bucket_table_alloc+0x76/0x17a avec crng_init=0
[ 0.330000] source d'horloge : jiffies : masque : 0xffffffff max_cycles : 0xffffffff, max_idle_ns : 19112604462750000 ns
[ 0.340000] entrées de table de hachage futex : 256 (ordre : 2, 16384 octets)
[ 0.380000] NET : Famille de protocoles 16 enregistrée
[ 1.850000] vgaarb : chargé
[ 1.870000] SystÚme de fichiers SCSI initialisé
[ 1.900000] usbcore : nouvel interface de pilote usbfs enregistrée
[ 1.910000] usbcore : nouvel interface de pilote hub enregistrée
[ 1.920000] usbcore : nouveau pilote d'appareil usb enregistré
[ 1.930000] pps_core : API LinuxPPS ver. 1 enregistrée
[ 1.940000] pps_core : Version logicielle 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
[ 1.950000] Prise en charge de l'horloge PTP enregistrée
[ 1.970000] Architecture Son Avancé de Linux - Pilote Initialisé.
[ 2.010000] source d'horloge : Passé à la source d'horloge riscv_clocksource
[ 2.600000] NET : Famille de protocoles 2 enregistrée
[ 2.640000] tcp_listen_portaddr_hash entrées de table de hachage : 512 (ordre : 1, 8192 octets)
[ 2.650000] TCP établies entrées de table de hachage : 8192 (ordre : 4, 65536 octets)
[ 2.670000] TCP bind entrées de table de hachage : 8192 (ordre : 5, 131072 octets)
[ 2.700000] TCP : Tables de hachage configurées (établi 8192 bind 8192)
[ 2.720000] UDP entrées de table de hachage : 512 (ordre : 2, 16384 octets)
[ 2.730000] UDP-Lite entrées de table de hachage : 512 (ordre : 2, 16384 octets)
[ 2.750000] NET : Famille de protocoles 1 enregistrée
[ 2.770000] Décompression de initramfs...
[ 23.980000] Ăchec de la dĂ©compression de initramfs : des dĂ©chets dans l'archive compressĂ©e
[ 24.030000] workingset : timestamp_bits=62 max_order=18 bucket_order=0
[ 25.020000] Pilote SCSI générique de couche bloc (bsg) version 0.4 chargée (majeur 251)
[ 25.030000] planificateur d'entrée/sortie noop enregistré
[ 25.040000] planificateur d'entrée/sortie deadline enregistré
[ 25.050000] planificateur d'entrée/sortie cfq enregistré (défaut)
[ 25.060000] planificateur d'entrée/sortie mq-deadline enregistré
[ 25.060000] planificateur d'entrée/sortie kyber enregistré
[ 25.120000] sifive_gpio 64002000.gpio : Puce GPIO SiFive enregistrée 6 GPIOs
[ 25.150000] shpchp : Pilote standard Hot Plug PCI version : 0.4
[ 28.870000] Série : pilote 8250/16550, 4 ports, partage d'IRQ désactivé
[ 28.940000] sifive-serial 64000000.serial : impossible de trouver l'horloge du contrĂŽleur
[ 28.950000] sifive-serial : échec de la sonde de 64000000.serial avec erreur -2
[ 28.980000] [drm] mode de noyau radeon activé.
[ 28.990000] [drm] mode de noyau amdgpu activé.
[ 29.500000] loop : module chargé
[ 29.610000] sifive_spi 64001000.spi : Impossible de trouver l'horloge du bus
[ 29.620000] sifive_spi : échec de la sonde de 64001000.spi avec erreur -2
[ 29.640000] libphy : Bus MDIO fixe : sondé
[ 29.680000] e1000e : Pilote de réseau Intel(R) PRO/1000 - 3.2.6-k
[ 29.690000] e1000e : Copyright(c) 1999 - 2015 Intel Corporation.
[ 29.700000] ehci_hcd : ContrÎleur hÎte 2.0 'Amélioré' USB (EHCI)
[ 29.710000] ehci-pci : pilote de plateforme EHCI PCI
[ 29.720000] ehci-platform : pilote de plateforme EHCI générique
[ 29.750000] mousedev : périphérique souris PS/2 commun à toutes les souris
[ 29.790000] usbcore : nouvel interface de pilote usbhid enregistrée
[ 29.800000] usbhid : pilote de base USB HID
[ 29.820000] usbcore : nouvel interface de pilote snd-usb-audio enregistrée
[ 29.900000] NET : Famille de protocoles 10 enregistrée
[ 29.960000] Routage de segments avec IPv6
[ 29.960000] sit : Tunnel IPv6, IPv4 et MPLS sur IPv4
[ 30.020000] NET : Famille de protocoles 17 enregistrée
[ 30.020000] Type de clé dns_resolver enregistré
[ 30.070000] console de dĂ©marrage [early0] utilise la mĂ©moire init et doit ĂȘtre dĂ©sactivĂ©e mĂȘme avant que la vraie ne soit prĂȘte
[ 30.080000] console de démarrage [early0] désactivéAprÚs cela, rien de visible ne se produit.
Vous pouvez maintenant essayer de résoudre trois problÚmes :
[ 23.980000] L'extraction de l'initramfs a échoué : des déchets dans l'archive compressée
...
[ 28.940000] sifive-serial 64000000.serial : impossible de trouver l'horloge du contrĂŽleur
...
[ 29.610000] sifive_spi 64001000.spi : Impossible de trouver l'horloge du bus⊠ainsi qu'avec l'arrĂȘt de l'affichage sur la console.
Il n'est pas trĂšs difficile de rĂ©soudre deux problĂšmes de frĂ©quence : il suffit d'ajouter des entrĂ©es clocks dans les sous-arbres des pĂ©riphĂ©riques requis, en donnant un nom explicite Ă l'Ă©tiquette pour le nĆud 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 = ;
+ clocks = ;
interrupts = ;
reg = ;
reg-names = "control";
@@ -107,6 +109,7 @@
interrupt-parent = ;
interrupts = ;
reg = ;
+ clocks = ;
reg-names = "control";
L12: mmc@0 {
compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
voltage-ranges = ;
};
};
- L11: tlclk {
+ tlclk: tlclk {
#clock-cells = ;
clock-frequency = ;
clock-output-names = "tlclk";En ajoutant la ligne #define pr_debug printk au début du fichier init/initramfs.c, le message concernant les déchets au lieu de l'initramfs devient un peu plus détaillé :
[ 2.760000] Décompression de l'initramfs...
[ 2.770000] Données compressées gzip détectées
[ 23.940000] Données compressées (null) détectées
[ 23.970000] L'extraction de l'initramfs a échoué : des déchets dans l'archive compresséeC'est-à -dire qu'il est possible que les déchets ne soient pas au lieu de l'initramfs, mais ensemble.
D'accord, il a trouvĂ© quelque chose, peut-ĂȘtre que cela suffit. Mais oĂč est la console ? Une recherche renvoie un lien vers un problĂšme sur GitHub : â il s'avĂšre qu'un UART, selon le driver, ne mĂ©rite mĂȘme pas d'en parler. Mais datĂ© du 11 juillet 2018 â il y a un an. Il s'est avĂ©rĂ© que ce commit n'a jamais Ă©tĂ© intĂ©grĂ© dans l'arbre Ă partir duquel mon noyau est compilĂ©. En appliquant manuellement ce patch, j'ai obtenu un Linux fonctionnel ! Il s'est avĂ©rĂ© que le problĂšme avec l'initramfs n'Ă©tait effectivement pas critique.
En me connectant en tant que user=root, password=sifive, j'ai pu sans trop de difficultés (excepté pour comprendre que le numéro GPIO a une base à partir de laquelle tout est calculé, et qu'il faut simplement le lire à partir du fichier pseudo correspondant) à travers sysfs allumer la LED sur la carte.
Comme la derniÚre fois, je joins la vidéo textuelle du démarrage de Linux. Lors du passage de la console earlyprintk à la console principale, il y a quelque chose qui ressemble à des déchets, semblable à une sortie lorsque la vitesse UART est mal réglée. Ce qui est intéressant, c'est que le lecteur a réussi à gérer ce « bazar ».
Source : habr.com
