Deel 4: Eindelijk starten we Linux op RocketChip RISC-V

Deel 4: Eindelijk starten we Linux op RocketChip RISC-V Op de afbeelding stuurt de Linux-kernel je groeten via GPIO.

In deze fase van het verhaal over het porteren van RISC-V RocketChip naar een Chinese Cyclone IV-bord, zullen we Linux opstarten en leren hoe we zelf de IP Core van de geheugencontroller kunnen configureren en een kleine aanpassing in de dts-beschrijving van de hardware maken. Dit artikel is een vervolg op deel drie, maar in tegenstelling tot het behoorlijk uitgebreide vorige deel, zal het vrij kort zijn.

… Aangezien setup_smp alleen wordt aangeroepen als de kernel is geconfigureerd met SMP-ondersteuning, kunnen we proberen om multiprocessorondersteuning uit te schakelen. Het zou vervelend zijn als ik ook in de geheugenmodule ondersteuning voor atomiciteit moet implementeren (ik dacht dat deze cache dat zelf deed), maar in een single-core situatie zou het ons niet moeten hinderen.

Het is toch niet gelukt...

[    0.000000] OF: fdt: Geheugenbereik 0x80000000 - 0x80200000 genegeerd
[    0.000000] Linux versie 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc versie 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 Do Jul 4 18:38:10 MSK 2019
[    0.000000] bootconsole [early0] ingeschakeld
[    0.000000] Initiële ramdisk op: 0x(____ptrval____) (16777216 bytes)
[    0.000000] Zone bereik:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normaal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Start van verplaatsbare zone voor elke knoop
[    0.000000] Vroeg geheugenknooppunt bereik
[    0.000000]   knoop   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem opzetten knoop 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Software IO TLB: gemapt [mem 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] Kon niet vinden "cpu" devicetree-ingang
[    0.000000] Gebouwd 1 zonelisten, mobiliteitsgroepering ingeschakeld. Totale pagina's: 258055
[    0.000000] Kernel-opdrachtregel: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[    0.000000] Dentry cache hash tabel invoer: 131072 (volgorde: 8, 1048576 bytes)
[    0.000000] Inode-cache hash tabel invoer: 65536 (volgorde: 7, 524288 bytes)
[    0.000000] Sorteren __ex_table...
[    0.000000] BUG: Slechte pagina staat in proces swapper  pfn:80bf7
[    0.000000] pagina:ffffffe03f029e08 count:0 mapcount:-65280 mapping:0000000000000000 index:0x1
[    0.000000] vlaggen: 0x0()
[    0.000000] rauw: 0000000000000000 0000000000000100 0000000000000200 0000000000000000
[    0.000000] rauw: 0000000000000001 0000000000000000 00000000ffff00ff
[    0.000000] pagina gedumpt omdat: niet-nul mapcount
[    0.000000] Modules gekoppeld aan:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Niet besmet 4.19.0-sifive-1+ #1
[    0.000000] Oproep 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] Lock debugging uitgeschakeld vanwege kernel besmetting
[    0.000000] BUG: Slechte pagina staat in proces swapper  pfn:80bf9
[    0.000000] pagina:ffffffe03f029e78 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] vlaggen: 0x0()
[    0.000000] rauw: 0000000000000000 ffffffe03f020080 ffffffe03f020080 0000000000000000
[    0.000000] rauw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] pagina gedumpt omdat: niet-nul mapcount
[    0.000000] Modules gekoppeld aan:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Besmet: G    B             4.19.0-sifive-1+ #1
[    0.000000] Oproep 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: Slechte pagina staat in proces swapper  pfn:80bfa
[    0.000000] pagina:ffffffe03f029eb0 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] vlaggen: 0x0()
[    0.000000] rauw: 0000000000000000 ffffffe03f0200b8 ffffffe03f0200b8 0000000000000000
[    0.000000] rauw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] pagina gedumpt omdat: niet-nul mapcount
[    0.000000] Modules gekoppeld aan:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Besmet: G    B             4.19.0-sifive-1+ #1
[    0.000000] Oproep 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: Slechte pagina staat in proces swapper  pfn:80bfb
[    0.000000] pagina:ffffffe03f029ee8 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] vlaggen: 0x0()
[    0.000000] rauw: 0000000000000000 ffffffe03f0200f0 ffffffe03f0200f0 0000000000000000
[    0.000000] rauw: 0000000000000000 0000000000000000 00000000ffff00ff
[    0.000000] pagina gedumpt omdat: niet-nul mapcount
[    0.000000] Modules gekoppeld aan:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Besmet: G    B             4.19.0-sifive-1+ #1
[    0.000000] Oproep 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: Slechte pagina staat in proces swapper  pfn:80bfc
[    0.000000] pagina:ffffffe03f029f20 count:0 mapcount:-65280 mapping:0000000000000000 index:0x0
[    0.000000] vlaggen: 0x0()
[    0.000000] rauw: 0000000000000000 ffffffe03f020028 ffffffe03f020028 0000000000000000
[    0.000000] rauw: 0000000000000000 0000000000000000 00000000ffff00ff
...

Interessant is dat ik na al het debuggen besloot te kijken hoe de "referentie" uitvoer van de kernel eruit zou moeten zien, zei ik make qemu, en ik zag een soortgelijke fout.

Helaas is het volgende niveau (Linux-kernel) lastiger: GDB, verbonden via JTAG met RocketChip, werkt blijkbaar met fysieke adressen ongeacht hoe de MMU is ingesteld, en de kernel had op dat moment al de adresmapping ingesteld, dus simpelweg zeggen display/10i $pc gaat niet werken — we zullen alleen veel zien unimp. Maar als we al de offset hebben vastgesteld (het lijkt erop dat 0x80200000 -> 0xffffffe000000000), dan kunnen we slim zijn:

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)

Breakpoint-plaatsen gebeurt op dezelfde manier:

(gdb) p setup_smp
$1 = {} 0xffffffe000002436 
(gdb) b *0x80202436
Breakpoint 1 op 0x80202436
(gdb) c
Doorgaan.

Programma ontving signaal SIGTRAP, Trace/breakpoint trap.
setup_smp () in /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
58              terwijl ((dn = of_find_node_by_type(dn, "cpu"))) {
(gdb) bt
#0  setup_smp () in /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:58
#1  0xffffffe0000022a2 in setup_arch () in /home/trosinenko/freedom-u-sdk/linux/arch/riscv/kernel/setup.c:253
#2  0x0000000000000000 in ?? ()
Backtrace gestopt: frame heeft de PC niet opgeslagen

Alleen moeten ze handmatig worden verwijderd om verder te gaan — voor GDB is dit een totaal onbegrijpelijke trap. Oh ja, als je toevallig zegt str1 != str2 of n in plaats van si, zal GDB proberen een impliciete breakpoint in te voegen, die om begrijpelijke redenen niet zal worden ingesteld, maar GDB kan je daar niet van weerhouden. Maar haast je niet om het bord opnieuw op te starten — volgens mijn observaties is het voldoende om alleen gdb opnieuw op te starten (houd er rekening mee dat oude breakpoints mogelijk niet verdwijnen).

Eigenlijk moet je terug naar het oorspronkelijke probleem: de plaatsing van debugpunten printk in de functie of_find_node_by_type, waarbij de opstartcode van de processor details laat zien, dat deze enige rommel in plaats van apparaattypen ziet. Bijvoorbeeld, het haalt ineens de regel ‘Seriële poort’, hoewel deze duidelijk niet in de dtb aanwezig is in het veld device_type. Na het zoeken naar deze bytes in de kernelimage, heb ik ze gevonden, gekeken naar de offset en het voor de hand liggende begrepen: de kernelgrootte in de opstartparameters is duidelijk onderschat: er is 8Mb toegewezen, maar het kost meer dan tien. Ik heb 16Mb toegewezen, maar de vreemde dingen hielden niet op. Na wat gokken met het lezen van de FDT vanaf verschillende adressen (de adres wordt normaal gesproken in het register naar de kernel gestuurd a1), heb ik uiteindelijk besloten te tracer, wat er wordt geparsed. Gelukkig, in plaats van met de debugger te rommelen (en we herinneren ons dat er nuances zijn met het vertalen van adressen, die nog steeds op een of andere manier opgelost moeten worden), kan ik gewoon wat aanpassingen in het bestand nu drivers/of/fdt.c aangeven. Het resultaat was: #define pr_debug printkde toevoeging van debug-uitvoer

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 - limiet het aantal regio's in de /memory node * @limit: maximaal aantal invoeren @@ -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 op hardware

Uitvoer op hardware

                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]

Uitvoer in 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 versie 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc versie 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Zat Jul 6 12:14:41 MSK 2019
[    0.000000] bootconsole [early0] ingeschakeld
[    0.000000] Initiële ramdisk bij: 0x(____ptrval____) (4467590 bytes)
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normaal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Beweegbare zone start voor elke node
[    0.000000] Vroeg geheugen node bereik
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] INITIEEL: ffffffe000c00000
[    0.000000]  -> unflatten_device_tree()
[    0.000000] Unflattening device tree:
[    0.000000] magic: d00dfeed
[    0.000000] size: 00000d56
[    0.000000] versie: 00000011
[    0.000000]   grootte is 14192, toewijzing...
[    0.000000]   unflattening (____ptrval____)...
[    0.000000] fixed up name for  ->
[    0.000000] fixed up name for chosen -> gekozen
[    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 -> geheugen
[    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: gemapt [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] Geheugen: 949716K/1046528K beschikbaar (6565K kernelcode, 342K rwdata, 2564K rodata, 208K init, 832K bss, 96812K gereserveerd, 0K cma-gereserveerd)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Hiërarchische RCU-implementatie.
[    0.000000] rcu:     RCU-evenement-tracering is ingeschakeld.
[    0.000000] rcu:     RCU beperkt CPU's van NR_CPUS=8 tot nr_cpu_ids=1.
[    0.000000] rcu: Geometrie aanpassen voor rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 0, nr_irqs: 0, vooringestelde irqs: 0
[    0.000000] plic: in totaal 53 onderbrekingen toegewezen aan 2 handlers (van de 2).
[    0.000000] klokbron: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
[    0.000000] Console: kleur dummy-device 80x25
[    0.000000] console [tty0] ingeschakeld
[    0.000000] bootconsole [early0] uitgeschakeld
[    0.000000] Calibreren van vertraginglus (overgeslagen), waarde berekend met timerfrequentie.. 20.00 BogoMIPS (lpj=100000)
[    0.000000] pid_max: standaard: 32768 minimum: 301
[    0.000000] Mount-cache hash tabel gemiddeld: 2048 (order: 2, 16384 bytes)
[    0.000000] Mountpoint-cache hash tabel gemiddeld: 2048 (order: 2, 16384 bytes)
[    0.020000] rcu: Hiërarchische SRCU-implementatie.
[    0.020000] smp: Brengt secundaire CPU's op...
[    0.020000] smp: 1 node, 1 CPU opgestart
[    0.050000] devtmpfs: geïnitialiseerd
[    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 werd opgeroepen vanuit bucket_table_alloc+0x76/0x17a met crng_init=0
[    0.050000] klokbron: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.050000] futex hash tabelentries: 256 (order: 2, 16384 bytes)
[    0.060000] NET: Geregistreerd protocolfamilie 16
[    0.090000] vgaarb: geladen
[    0.090000] SCSI-systeem geconfigureerd
[    0.090000] usbcore: geregistreerd nieuwe interface driver usbfs
[    0.090000] usbcore: geregistreerd nieuwe interface driver hub
[    0.090000] usbcore: geregistreerd nieuwe apparaatsdriver usb
[    0.090000] pps_core: LinuxPPS API ver. 1 geregistreerd
[    0.090000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti 
[    0.090000] PTP-uur steunt registratie
[    0.100000] Geavanceerde Linux-geluidarchitectuurdriver geconfigureerd.
[    0.100000] klokbron: Overgeschakeld naar klokbron riscv_clocksource
[    0.110000] NET: Geregistreerd protocolfamilie 2
[    0.110000] tcp_listen_portaddr_hash hash tabelentries: 512 (order: 1, 8192 bytes)
[    0.110000] TCP-verbonden hash tabelentries: 8192 (order: 4, 65536 bytes)
[    0.110000] TCP-bind hash tabelentries: 8192 (order: 5, 131072 bytes)
[    0.110000] TCP: Hash-tabellen geconfigureerd (verbonden 8192 bind 8192)
[    0.110000] UDP-hash tabelentries: 512 (order: 2, 16384 bytes)
[    0.110000] UDP-Lite hash tabelentries: 512 (order: 2, 16384 bytes)
[    0.110000] NET: Geregistreerd protocolfamilie 1
[    0.120000] Unpacking initramfs...
[    0.590000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[    0.620000] Blocklaag SCSI generiek (bsg) driver versie 0.4 geladen (major 251)
[    0.620000] io-scheduler noop geregistreerd
[    0.620000] io-scheduler deadline geregistreerd
[    0.620000] io-scheduler cfq geregistreerd (standaard)
[    0.620000] io-scheduler mq-deadline geregistreerd
[    0.620000] io-scheduler kyber geregistreerd
[    0.620000] shpchp: Standaard Hot Plug PCI Controller Driver versie: 0.4
[    0.690000] Serie: 8250/16550-driver, 4 poorten, IRQ-deling uitgeschakeld
[    0.690000] 10000000.uart: ttyS0 op MMIO 0x10000000 (irq = 10, base_baud = 230400) is een 16550A
[    0.720000] console [ttyS0] ingeschakeld
[    0.720000] [drm] radeon kernel modesetting ingeschakeld.
[    0.720000] [drm] amdgpu kernel modesetting ingeschakeld.
[    0.730000] loop: module geladen
[    0.730000] libphy: Vast MDIO-bus: geprobeerd
[    0.740000] e1000e: Intel(R) PRO/1000 Netwerk Driver - 3.2.6-k
[    0.740000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    0.740000] ehci_hcd: USB 2.0 'Verbeterde' Host Controller (EHCI) Driver
[    0.740000] ehci-pci: EHCI PCI platformdriver
[    0.740000] ehci-platform: EHCI-generieke platformdriver
[    0.740000] mousedev: PS/2 muisapparaat gemeenschappelijk voor alle muizen
[    0.740000] usbcore: geregistreerd nieuwe interface driver usbhid
[    0.740000] usbhid: USB HID kern driver
[    0.740000] usbcore: geregistreerd nieuwe interface driver snd-usb-audio
[    0.740000] NET: Geregistreerd protocolfamilie 10
[    0.750000] Segment-routing met IPv6
[    0.750000] sit: IPv6, IPv4 en MPLS over IPv4 tunnelingsdriver
[    0.750000] NET: Geregistreerd protocolfamilie 17
[    0.750000] Sleuteltype dns_resolver geregistreerd
[    0.760000] ALSA-apparaatlijst:
[    0.760000]   Geen geluidskaarten gevonden.
[    0.770000] Vrijgeven ongebruikte kernelgeheugen: 208K
[    0.770000] Deze architectuur heeft geen kernelgeheugenbescherming.
[    0.770000] Run /init als init-proces

(Het "Timestamp" gedeelte wordt door de kernel weergegeven, voor hen wordt de boom weergegeven door BBL) Enerzijds wordt FDT succesvol gelezen, anderzijds krijg je een soort onzin in de geparsed "object" boom.

Tijdens het debuggen realiseerde ik me dat BBL het "dubbele" adres niet kon lezen, niet omdat er een fout in de configuratie was, maar gewoon omdat de root-knoop was ingesteld. #address-cells = <1>; #size-cells = <1>;.

Door de debug-output uit te breiden, zag ik dat de aanwijzers naar type en naam "verstoord" waren, en op een vrij vreemde manier: de eerste (begonnen met nul) byte was null of iets van 0xabcdef -> 0xab00ef. Ik moest gebruik maken van een bekende tactiek: wetende op welke adressen het beschadigde geheugen zich bevindt, schrijf ik in de functie printk deze gegevens af te drukken. En zelf de oproepen printk verdeeld, waar ze weinig waren. Helaas werd het niet veel duidelijker. Toen begon ik, terwijl ik de gedisassembleerde objdump versie controleerde, handmatig breakpoints te plaatsen en stap voor stap het probleemgebied van de code door te nemen. En hier ontdekte ik iets mysterieus en onaangenaams: als ik meteen een breakpoint ergens ver van de bekende goede toestand zette, zag ik, zodra ik erop stopte, al beschadigd geheugen. Maar als ik probeerde stilletjes stap voor stap naar het te komen, verstopte de fout zich! Het ruikt naar een defecte geheugencontroller en een cache die de fout verbergt als je constant de benodigde waarde opvraagt. En wat als...

We vervangen het geheugen.

Vastklampend aan de mogelijkheid om het probleem niet aan mijn kant op te lossen, suggereerde ik dat ik misschien gewoon een defecte geheugenmodule had. Toen herinnerde ik me dat de netbook van tien jaar oud niet alleen een draagbare computer is, maar ook een waardevolle bron van DDR2 SO-DIMM. Als bonus kun je het geheugen dat uit het bord is gehaald erin stoppen, en je krijgt bijna onmiddellijk een vastloper van Memtest (Linux, trouwens, opstartte bijna tot de grafische interface). Maar herhaal zo'n experiment beter niet als je waardevolle informatie op de gemonteerde schijven hebt...). Enerzijds kan je aannemen dat het geheugen simpelweg niet paste bij deze specifieke netbook. Aan de andere kant kon hij opstarten! Er kwam hoop dat het geheugen gewoon "defect" was, en het probleem niet in mijn verpakking zat.

Dat betekent dat we tijdelijk moeten proberen om met de netbookgeheugen op te starten. Helaas kan Quartus 18 deze IP Core niet upgraden zodat deze bewerkbaar wordt. Dus, het is toch tijd om te leren nieuwe instanties te creëren. Het bleek vrij eenvoudig te zijn: we zoeken in de IP Catalog naar de optie DDR2 SDRAM Controller with ALTMEMPHY Intel FPGA IP en krijgen een blok met dezelfde interface als vroeger. Het enige probleem is het instellen van de juiste geheugenspecifcaties.

We krijgen de parameters van het geheugenmodule.

Er is een relatief voor de hand liggende manier om het geheugenmodule in te stellen: lees de parameters uit SPD. Inderdaad, als een gewone computer de SPD-gegevens uitleest en de controller daarop afstemt, laten we dezelfde gegevens dan uitlezen op de beschikbare netbook en invoeren in een tabel.

Op Ubuntu gebeurt dit vrij eenvoudig: we moeten het pakket i2c-toolsinstalleren, de modules eeprom en i2c-i801 (ik weet niet zeker of de tweede driver overal werkt), daarna voeren we decode-dimms:

uit. De uitvoer van decode-dimms.

# decode-dimms version 6231 (2014-02-20 10:54:34 +0100)

Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/0-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x00)
SPD Revision                                    Invalid
Fundamental Memory type                         Unknown (0x00)

---=== Manufacturing Information ===---
Manufacturer                                    Undefined
Part Number                                     Undefined

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/4-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x00)
SPD Revision                                    Invalid
Fundamental Memory type                         Unknown (0x00)

---=== Manufacturing Information ===---
Manufacturer                                    Undefined
Part Number                                     Undefined

Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/6-0050
Guessing DIMM is in                             bank 1

---=== SPD EEPROM Information ===---
EEPROM Checksum of bytes 0-62                   OK (0x76)
# of bytes written to SDRAM EEPROM              128
Total number of bytes in EEPROM                 256
Fundamental Memory type                         DDR2 SDRAM
SPD Revision                                    1.2

---=== Memory Characteristics ===---
Maximum module speed                            800 MHz (PC2-6400)
Size                                            1024 MB
Banks x Rows x Columns x Bits                   8 x 13 x 10 x 64
Ranks                                           2
SDRAM Device Width                              16 bits
Module Height                                   30.0 mm
Module Type                                     SO-DIMM (67.6 mm)
DRAM Package                                    Planar
Voltage Interface Level                         SSTL 1.8V
Module Configuration Type                       No Parity
Refresh Rate                                    Reduced (7.8 us) - Self Refresh
Supported Burst Lengths                         4, 8
tCL-tRCD-tRP-tRAS                               6-6-6-18
Supported CAS Latencies (tCL)                   6T, 5T, 4T
Minimum Cycle Time                              2.50 ns at CAS 6 (tCK min)
                                                3.00 ns at CAS 5
                                                3.75 ns at CAS 4
Maximum Access Time                             0.40 ns at CAS 6 (tAC)
                                                0.45 ns at CAS 5
                                                0.50 ns at CAS 4
Maximum Cycle Time (tCK max)                    8.00 ns

---=== Timing Parameters ===---
Address/Command Setup Time Before Clock (tIS)   0.17 ns
Address/Command Hold Time After Clock (tIH)     0.25 ns
Data Input Setup Time Before Strobe (tDS)       0.05 ns
Data Input Hold Time After Strobe (tDH)         0.12 ns
Minimum Row Precharge Delay (tRP)               15.00 ns
Minimum Row Active to Row Active Delay (tRRD)   10.00 ns
Minimum RAS# to CAS# Delay (tRCD)               15.00 ns
Minimum RAS# Pulse Width (tRAS)                 45.00 ns
Write Recovery Time (tWR)                       15.00 ns
Minimum Write to Read CMD Delay (tWTR)          7.50 ns
Minimum Read to Pre-charge CMD Delay (tRTP)     7.50 ns
Minimum Active to Auto-refresh Delay (tRC)      60.00 ns
Minimum Recovery Delay (tRFC)                   127.50 ns
Maximum DQS to DQ Skew (tDQSQ)                  0.20 ns
Maximum Read Data Hold Skew (tQHS)              0.30 ns

---=== Manufacturing Information ===---
Manufacturer                                    Samsung
Manufacturing Location Code                     0x02
Part Number                                     M4 70T2864QZ3-CF7
Revision Code                                   0x3351
Manufacturing Date                              2009-W34
Assembly Serial Number                          0x79C64E9A

Number of SDRAM DIMMs detected and decoded: 3

Het probleem is dat sommige timinginstellingen hier niet zijn opgegeven, dus we gaan de tweede weg.

Wat staat er op de modules:

Deel 4: Eindelijk starten we Linux op RocketChip RISC-VDeel 4: Eindelijk starten we Linux op RocketChip RISC-V

In dit geval is de tekst op de geheugenchips interessanter: K4T1G164QQ-HCF7. Door deze regel in Google in te voeren, krijgen we een datasheet van meerdere tientallen pagina's met alle benodigde parameters die we nauwkeurig in de eigenschappen van de IP Core kunnen invoeren. Let alleen op de eenheden: soms ns, soms — ps, en af en toe zelfs fracties van tCK. Ik zal je niet leren waar je op moet letten - ik heb zelf veel ingesteld door trial-and-error (ik kan echter niet garanderen dat je het geheugen of de FPGA niet kunt "verbranden"). Ik wil alleen op het volgende wijzen: ik kon de controller heel lang niet aan de praat krijgen, en de laatste stap was het besef dat ik de breedte van alle geheuginterfaces moest controleren op overeenstemming met de gegenereerde Verilog-code: want als in MemIfBundle opgegeven val mem_ba = IO(Output(UInt(2.W))), en er zijn 8 banken (dat wil zeggen, een adresbreedte van 3 bits), dan hebben we slechts één zwevende output van de geheugencontroller — dat is een probleem, maar niet kritiek, dus alles synthetiseert, maar werkt niet.

Misschien had alles ook met de oude module kunnen draaien als we de controller hadden bijgewerkt, maar voorlopig heb ik geen zin om uit te zoeken wat er mogelijk schuilgaat: ik heb al genoeg aan mijn hoofd.

Dus, na de verplaatsing van timebase-frequency van het niveau van de specifieke CPU naar het niveau van de knoop. cpus (op een begrijpelijke manier verzochte kern), krijgen we:

Verborgen tekst

[    0.000000] OF: fdt: Negeer het geheugengebied 0x80000000 - 0x80200000
[    0.000000] Linux versie 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc versie 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP di 9 jul 22:42:36 MSK 2019
[    0.000000] bootconsole [early0] ingeschakeld
[    0.000000] Initiële ramdisk op: 0x(____ptrval____) (16777216 bytes)
[    0.000000] Zonebereiken:
[    0.000000]   DMA32    [geheugen 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normaal   [geheugen 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Start van verplaatsbare zone voor elke node
[    0.000000] Vroeg geheugen node bereiken
[    0.000000]   node   0: [geheugen 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem configuratie node 0 [geheugen 0x0000000080200000-0x00000000bfffffff]
[    0.000000] software IO TLB: gemapt [geheugen 0xbb1fc000-0xbf1fc000] (64MB)
[    0.000000] elf_hwcap is 0x112d
[    0.000000] percpu: Ingebedde 17 pagina's/cpu @(____ptrval____) s29400 r8192 d32040 u69632
[    0.000000] Gebouwd 1 zonelijsten, mobiliteitsgroepering in werking.  Totaal pagina's: 258055
[    0.000000] Kernel opdrachtregel: debug console=ttySIF0,125200 root=\/dev\/mmcblk0p2 loglevel=7 rootwait
[    0.000000] Dentry cache hash tabel invoer: 131072 (volgorde: 8, 1048576 bytes)
[    0.000000] Inode-cache hash tabel invoer: 65536 (volgorde: 7, 524288 bytes)
[    0.000000] Sorteren __ex_table...
[    0.000000] Geheugen: 937696K/1046528K beschikbaar (6565K kernel code, 343K rwdata, 2564K rodata, 208K init, 832K bss, 108832K gereserveerd, 0K cma-gereserveerd)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjecten=0, CPU's=1, Nodes=1
[    0.000000] rcu: Hiërarchische RCU implementatie.
[    0.000000] rcu:     RCU evenement tracing is ingeschakeld.
[    0.000000] rcu:     RCU beperkt CPU's van NR_CPUS=8 naar nr_cpu_ids=1.
[    0.000000] rcu: Geometrie voor rcu_fanout_leaf=16, nr_cpu_ids=1 aanpassen
[    0.000000] NR_IRQS: 0, nr_irqs: 0, vooraf toegewezen irqs: 0
[    0.000000] plic: gemapt 8 interrupts naar 1 (van de 2) handlers.
[    0.000000] klokbron: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[    0.000000] Console: kleur dummy apparaat 80x25
[    0.000000] Kalibreren vertraging lus (overgeslagen), waarde berekend met timerfrequentie.. 2.00 BogoMIPS (lpj=10000)
[    0.020000] pid_max: standaard: 32768 minimum: 301
[    0.030000] Mount-cache hash tabel invoer: 2048 (volgorde: 2, 16384 bytes)
[    0.040000] Mountpunt-cache hash tabel invoer: 2048 (volgorde: 2, 16384 bytes)
[    0.140000] rcu: Hiërarchische SRCU implementatie.
[    0.190000] smp: Brengt secundaire CPU's op...
[    0.190000] smp: Opgestart 1 node, 1 CPU
[    0.220000] devtmpfs: geïnitieerd
[    0.300000] willekeurig: get_random_u32 aangeroepen vanuit bucket_table_alloc+0x76/0x17a met crng_init=0
[    0.330000] klokbron: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.340000] futex hash tabel invoer: 256 (volgorde: 2, 16384 bytes)
[    0.380000] NET: Geregistreerde protocol familie 16
[    1.850000] vgaarb: geladen
[    1.870000] SCSI subsysteem geïnitialiseerd
[    1.900000] usbcore: geregistreerd nieuwe interface driver usbfs
[    1.910000] usbcore: geregistreerd nieuwe interface driver hub
[    1.920000] usbcore: geregistreerd nieuwe apparaatsdriver usb
[    1.930000] pps_core: LinuxPPS API ver. 1 geregistreerd
[    1.940000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti 
[    1.950000] PTP klokondersteuning geregistreerd
[    1.970000] Geavanceerde Linux Geluidsarchitectuur Driver Geïnitieerd.
[    2.010000] klokbron: Overgeschakeld naar klokbron riscv_clocksource
[    2.600000] NET: Geregistreerde protocol familie 2
[    2.640000] tcp_listen_portaddr_hash hash tabel invoer: 512 (volgorde: 1, 8192 bytes)
[    2.650000] TCP vastgestelde hash tabel invoer: 8192 (volgorde: 4, 65536 bytes)
[    2.670000] TCP bind hash tabel invoer: 8192 (volgorde: 5, 131072 bytes)
[    2.700000] TCP: Hash tabellen geconfigureerd (vastgesteld 8192 bind 8192)
[    2.720000] UDP hash tabel invoer: 512 (volgorde: 2, 16384 bytes)
[    2.730000] UDP-Lite hash tabel invoer: 512 (volgorde: 2, 16384 bytes)
[    2.750000] NET: Geregistreerde protocol familie 1
[    2.770000] Uitpakken initramfs...
[   23.980000] Initramfs uitpakken mislukt: rommel in gecomprimeerd archief
[   24.030000] workingset: timestamp_bits=62 max_order=18 bucket_order=0
[   25.020000] Block laag SCSI algemeen (bsg) stuurprogramma versie 0.4 geladen (major 251)
[   25.030000] io scheduler noop geregistreerd
[   25.040000] io scheduler deadline geregistreerd
[   25.050000] io scheduler cfq geregistreerd (standaard)
[   25.060000] io scheduler mq-deadline geregistreerd
[   25.060000] io scheduler kyber geregistreerd
[   25.120000] sifive_gpio 64002000.gpio: SiFive GPIO chip geregistreerd 6 GPIO's
[   25.150000] shpchp: Standaard Hot Plug PCI Controller Driver versie: 0.4
[   28.870000] Serie: 8250/16550 driver, 4 poorten, IRQ delen uitgeschakeld
[   28.940000] sifive-serial 64000000.serial: controller klok niet gevonden
[   28.950000] sifive-serial: probe van 64000000.serial mislukt met fout -2
[   28.980000] [drm] radeon kernel modesetting ingeschakeld.
[   28.990000] [drm] amdgpu kernel modesetting ingeschakeld.
[   29.500000] loop: module geladen
[   29.610000] sifive_spi 64001000.spi: Kan bus klok niet vinden
[   29.620000] sifive_spi: probe van 64001000.spi mislukt met fout -2
[   29.640000] libphy: Vast MDIO Bus: geprobeerd
[   29.680000] e1000e: Intel(R) PRO/1000 Netwerkdriver - 3.2.6-k
[   29.690000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   29.700000] ehci_hcd: USB 2.0 'Verbeterde' Host Controller (EHCI) Driver
[   29.710000] ehci-pci: EHCI PCI platform driver
[   29.720000] ehci-platform: EHCI algemene platformdriver
[   29.750000] mousedev: PS/2 muisapparaat gemeenschappelijk voor alle muizen
[   29.790000] usbcore: geregistreerd nieuwe interface driver usbhid
[   29.800000] usbhid: USB HID kerndriver
[   29.820000] usbcore: geregistreerd nieuwe interface driver snd-usb-audio
[   29.900000] NET: Geregistreerde protocol familie 10
[   29.960000] Segmentroutering met IPv6
[   29.960000] sit: IPv6, IPv4 en MPLS via IPv4 tunneling driver
[   30.020000] NET: Geregistreerde protocol familie 17
[   30.020000] Sleuteltype dns_resolver geregistreerd
[   30.070000] bootconsole [early0] gebruikt initgeheugen en moet worden uitgeschakeld zelfs voordat de echte klaar is
[   30.080000] bootconsole [early0] uitgeschakeld

Daarna gebeurt er niets zichtbaar.

Nu kunnen we proberen drie problemen aan te pakken:

[   23.980000] Initramfs uitpakken mislukt: rommel in gecomprimeerd archief
...
[   28.940000] sifive-serial 64000000.serial: controller klok niet gevonden
...
[   29.610000] sifive_spi 64001000.spi: kan bus klok niet vinden

… evenals met het stoppen van de uitvoer naar de console.

Met twee frequentieproblemen is het helemaal niet moeilijk: je moet de punten toevoegen clocks aan de subtrees van de vereiste apparaten, met de bedoeling om een begrijpelijke naam voor de knooplabel tlclk:

diff --git a/arch/riscv/dts/zeowaa-1gb.dts b/arch/riscv/dts/zeowaa-1gb.dts
index 4b2cebc..1347e76 100644
--- a/arch/riscv/dts/zeowaa-1gb.dts
+++ b/arch/riscv/dts/zeowaa-1gb.dts
@@ -96,6 +97,7 @@
                 L8: serial@64000000 {
                         compatible = "sifive,uart0";
                         interrupt-parent = <&L0>;
+                        clocks = <&tlclk>;
                         interrupts = <>;
                         reg = <0x64000000 0x1000>;
                         reg-names = "control";
@@ -107,6 +109,7 @@
                         interrupt-parent = <&L0>;
                         interrupts = <>;
                         reg = <0x64001000 0x1000>;
+                        clocks = <&tlclk>;
                         reg-names = "control";
                         L12: mmc@0 {
                                 compatible = "mmc-spi-slot";
@@ -116,7 +119,7 @@
                                 voltage-ranges = <>;
                         };
                 };
-                L11: tlclk {
+                tlclk: tlclk {
                         #clock-cells = <>;
                         clock-frequency = <>;
                         clock-output-names = "tlclk";

Door de regel toe te voegen #define pr_debug printk aan het begin van het bestand init/initramfs.c, krijgen we een iets gedetailleerdere melding die zegt over rommel in plaats van initramfs:

[    2.760000] Initramfs uitpakken...
[    2.770000] Gdetecteerde gzip-gecomprimeerde gegevens
[   23.940000] Gdetecteerde (null) gecomprimeerde gegevens
[   23.970000] Initramfs uitpakken mislukt: rommel in gecomprimeerd archief

Dat wil zeggen, het is mogelijk dat de rommel niet in plaats van initramfs is, maar samen.

Oké, hij heeft iets gevonden, misschien is dat genoeg. Maar waar is de console gebleven? Zoekresultaten geven een link naar een probleem op GitHub: linux mislukte om op te starten op vc707 bord — het blijkt dat één UART volgens de driver zelfs niet de moeite waard is om over te praten. Maar , maar deze is nog niet goedgekeurd. Om terug te keren naar de vorige stabiele versie (OpenSSL 1.1.0h) kun je de volgende commando's uitvoeren: gedateerd op 11 juli 2018 — een jaar geleden. Het bleek dat deze commit nooit in de boom is gekomen waaruit ik de kernel bouw. Door deze patch handmatig toe te passen, kreeg ik werkend Linux! Het bleek dat het probleem met initramfs echt niet kritisch was.

Door in te loggen als user=root, password=sifive, kon ik zonder al te veel problemen (behalve het begrijpen dat het GPIO-nummer een basis heeft van waar alles wordt geteld, en dat je deze gewoon moet lezen uit het overeenkomstige pseudo-bestand) door sysfs de LED op het bord aansteken.

Zoals de vorige keer, voeg ik de tekstvideo van het opstarten van Linux bij. Op het moment dat de console overschakelt van earlyprintk naar de normale modus verschijnt er wat ruis, vergelijkbaar met de output bij een verkeerd ingestelde UART-snelheid. Wat interessant is, is dat de speler deze 'pap' succesvol heeft verwerkt.

Deel 4: Eindelijk starten we Linux op RocketChip RISC-V

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster