Hi L4-hackers,
I'm a newbie of L4 micro-kernel. The Fiasco/L4/L4Linux is really a good design for system architecture in the future. I'm trying to porting the L4 system to my target then evaluate. On my target, there is an DMA controller, which moves data to flash. Originally, Native-Linux uses dma_alloc_coherent() to allocate a DMA-dedicated memory. CPU copies data to that DMA-dedicated memory, then DMA controller moves data from DMA-dedicated memory to flash.
In L4Linux, I guess there should be some settings of DMA in I/O server configuration files. I'm searching for an example of configuring DMA-related settings.
I use the snapshot “l4re-snapshot-2016082114”. In my current configuration, "DEVICE1" is the DMA controller, "DEVICE2" is the flash, and "DMAMEM" is the DMA-dedicated memory. However, it generates some DMA-related error in boot messages. Such as:
IO | no 'iommu' capability found use CPU-phys for DMA IO | warning: inconsistent fixed resource @ device: /System Bus/ error: failed to get physical address for 2000000.
And so on.
The first thing I want to do is to make the boot message correct and I have the following questions: 1. Is the "DMAMEM" device needed to be configured? If needed, how to specify this to be a DMA memory? 2. Will dma_alloc_coherent() use the "DMAMEM" or other memory? Can I use dma_alloc_coherent() as Native-Linux? 3. I've also found a flag "Property.flags = Io.Hw_device_DF_dma_supported;". I'm not sure its usage. I just add this flag to DEVICE1(DMA controller) and DEVICE2(flash), is it correct? 4. Is my l4linux-io.devs and l4linux-io.io correct or need other modification for DMA? 5. I’ve found “IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6)” in the boot message. What the “DMADOM” means?
Any suggestion is very appreciated. Thanks.
BRs, Jesse
Here is my configurations: ---------------------------------------- l4linux-io.cfg:
local L4 = require("L4"); loader = L4.default_loader; local lxname = "vmlinuz"; vbus_l4linux = loader:new_channel(); loader:start( { caps = { sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0); icu = L4.Env.icu; l4linux = vbus_l4linux:svr(); }, log = {"IO", "magenta"}, }, "rom/io -vvv rom/l4linux-io.devs rom/l4linux-io.io"); -- Start Linux loader:start( { caps = { vbus = vbus_l4linux; }, l4re_dbg = L4.Dbg.Warn, log = L4.Env.log:m("rws"), }, "rom/vmlinuz mem=64M console=ttyLv0 l4x_dtb=rom/simple.dtb l4x_rd=rom/ramdisk-" .. L4.Info.arch() .. ".rd root=1:0 ramdisk_size=3072"); ---------------------------------------- l4linux-io.devs:
local Res = Io.Res local Hw = Io.Hw Io.hw_add_devices(function() DEVICE1 = Hw.Device(function() Property.hid = "device1"; compatible = {"arm,device1"}; Resource.regs = Res.mmio(0x14000000, 0x15ffffff); Property.flags = Io.Hw_device_DF_dma_supported; end); DEVICE2 = Hw.Device(function() Property.hid = "device2"; compatible = {"arm,device2"}; Resource.regs = Res.mmio(0x1F000000, 0x1F3fffff); Resource.irq = Res.irq(66); Property.flags = Io.Hw_device_DF_dma_supported; end); DMAMEM = Hw.Device(function() Property.hid = "dmamem"; compatible = {"arm,dmamem"}; Resource.mmio = Io.Mmio_data_space(0x10000, 0); end); end) ---------------------------------------- l4linux-io.io:
local hw = Io.system_bus()
Io.add_vbus("l4linux", Io.Vi.System_bus { DEVICE1 = wrap(hw:match("arm,device1")); DEVICE2 = wrap(hw:match("arm,device2")); DMAMEM = wrap(hw:match("arm,dmamem")); }) ---------------------------------------- boot messages:
L4 Bootstrapper Build: #164 拻 12堎 9 11:39:51 CST 2016, 4.8.4 Scanning up to 128 MB RAM, starting at offset 32MB Memory size is 128MB (20000000 - 27ffffff) RAM: 0000000020000000 - 0000000027ffffff: 131072kB Total RAM: 128MB Scanning fiasco Scanning sigma0 Scanning moe Moving up to 13 modules behind 21100000 moving module 02 { 219d5000-21a064ab } -> { 21ac6000-21af74ab } [201900] moving module 01 { 219c3000-219d434b } -> { 21ab4000-21ac534b } [70476] moving module 00 { 2193d000-219c29db } -> { 21a2e000-21ab39db } [547292] moving module 12 { 21935000-2193cd5d } -> { 21a26000-21a2dd5d } [32094] moving module 11 { 21635000-21934fff } -> { 21726000-21a25fff } [3145728] moving module 10 { 2121b000-21634487 } -> { 2130c000-21725487 } [4297864] moving module 09 { 2121a000-2121a0fa } -> { 2130b000-2130b0fa } [251] moving module 08 { 21219000-2121939b } -> { 2130a000-2130a39b } [924] moving module 07 { 2109e000-212188db } -> { 2118f000-213098db } [1550556] moving module 06 { 21084000-2109d583 } -> { 21175000-2118e583 } [103812] moving module 05 { 2102a000-210836b7 } -> { 2111b000-211746b7 } [366264] moving module 04 { 21010000-21029473 } -> { 21101000-2111a473 } [103540] moving module 03 { 2100f000-2100f325 } -> { 21100000-21100325 } [806] Loading fiasco Loading sigma0 Loading moe find kernel info page... found kernel info page (via ELF) at 20002000 Regions of list 'regions' [ 20000000, 200001c7] { 1c8} Root mbi_rt [ 20001000, 20001aff] { b00} Kern fiasco [ 20002000, 20092fff] { 91000} Kern fiasco [ 200c0000, 200c9f43] { 9f44} Sigma0 sigma0 [ 200d0000, 200d6177] { 6178} Sigma0 sigma0 [ 20140000, 20168c27] { 28c28} Root moe [ 20170000, 2017b58b] { b58c} Root moe [ 21000000, 2100e5e3] { e5e4} Boot bootstrap [ 21100000, 21a2dfff] { 92e000} Root Module found kernel options (via ELF) at 20003000 API Version: (87) experimental Sigma0 config ip:200c0100 sp:00000000 Roottask config ip:2014020c sp:00000000 Starting kernel fiasco at 200012b8 Realview System ID: Rev=0 HBI=000 Build=0 Arch=0 FPGA=00 Invalid System ID for this kernel config Expected (00000000 & cfffff00) == 0190f500 Stopping. Hello from Startup::stage2 Number of IRQs available at this GIC: 160 FPU: Initialize FPU0: Subarch: 2, Part: 30, Rev: 5, Var: 7, Impl: 41 ARM generic timer: freq=6000000 interval=6000 cnt=18158508199882336289 SERIAL ESC: allocated IRQ 98 for serial uart Not using serial hack in slow timer handler. Welcome to L4/Fiasco.OC! L4/Fiasco.OC microkernel on arm Rev: r72 compiled with gcc 4.8.4 for Realview [] Build: #16 Tue Nov 29 12:16:44 CST 2016
Calibrating timer loop... done. MDB: use page size: 20 MDB: use page size: 12 SIGMA0: Hello! KIP @ 20002000 allocated 4KB for maintenance structures SIGMA0: Dump of all resource maps RAM:------------------------ [4:20000000;20000fff] [0:20093000;200bffff] [0:200ca000;200cffff] [0:200d7000;2013ffff] [4:20140000;20168fff] [0:20169000;2016ffff] [4:20170000;2017bfff] [0:2017c000;210fffff] [4:21100000;21a2dfff] [0:21a2e000;26ffffff] IOMEM:---------------------- [0:0;1fffffff] [0:28000000;ffffffff] MOE: Hello world MOE: found 104420 KByte free memory MOE: found RAM from 20000000 to 27000000 MOE: allocated 112 KByte for the page array @0x20093000 MOE: virtual user address space [0-bfffffff] MOE: rom name space cap -> [C:103000] BOOTFS: [21100000-21100326] [C:105000] l4linux-io.cfg BOOTFS: [21101000-2111a474] [C:107000] l4re BOOTFS: [2111b000-211746b8] [C:109000] ned BOOTFS: [21175000-2118e584] [C:10b000] hello BOOTFS: [2118f000-213098dc] [C:10d000] io BOOTFS: [2130a000-2130a39c] [C:10f000] l4linux-io.devs BOOTFS: [2130b000-2130b0fb] [C:111000] l4linux-io.io BOOTFS: [2130c000-21725488] [C:113000] vmlinuz BOOTFS: [21726000-21a26000] [C:115000] ramdisk-arm.rd BOOTFS: [21a26000-21a2dd5e] [C:117000] simple.dtb MOE: cmdline: moe rom/l4linux-io.cfg MOE: Starting: rom/ned rom/l4linux-io.cfg MOE: loading 'rom/ned' Ned says: Hi World! Ned: loading file: 'rom/l4linux-io.cfg' IO | Io service IO | Verboseness level: 4 IO | unused physical memory space: IO | [00000000000000-0000001fffffff] IO | [00000028000000-000000ffffffff] IO | no 'iommu' capability found use CPU-phys for DMA IO | Loading: config 'rom/l4linux-io.devs' IO | warning: inconsistent fixed resource @ device: /System Bus/ IO | : hid=device1 IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6) IO | warning: inconsistent fixed resource @ device: /System Bus/ IO | : hid=device2 IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6) IO | Loading: config 'rom/l4linux-io.io' IO | Real Hardware ----------------------------------- IO | System Bus: hid= IO | Resources: ==== start ==== IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6) IO | Resources: ===== end ===== IO | DEVICE1: hid=device1 IO | Clients: ===== start ==== IO | DEVICE1: [N2Vi9Proxy_devE] IO | Clients: ===== end ==== IO | Resources: ==== start ==== IO | IOMEM [00000014000000-00000015ffffff 2000000] non-pref (32bit) (align=1ffffff flags=2) IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6) IO | Resources: ===== end ===== IO | DEVICE2: hid=device2 IO | Clients: ===== start ==== IO | DEVICE2: [N2Vi9Proxy_devE] IO | Clients: ===== end ==== IO | Resources: ==== start ==== IO | IOMEM [0000001f000000-0000001f3fffff 400000] non-pref (32bit) (align=3fffff flags=2) IO | IRQ [00000000000042-00000000000042 1] none (32bit) (align=0 flags=1) IO | DMADOM [00000000000000-00000000000000 1] non-pref (32bit) (align=0 flags=6) IO | Resources: ===== end ===== IO | DMAMEM: hid=dmamem IO | Clients: ===== start ==== IO | DMAMEM: [N2Vi9Proxy_devE] IO | Clients: ===== end ==== IO | Resources: ==== start ==== IO | IOMEM [00000020124000-00000020133fff 10000] non-pref (32bit) (align=ffff flags=2) IO | Resources: ===== end ===== IO | warning: could not register control interface at cap 'platform_ctl' IO | Ready. Waiting for request. PH 0 offs=00008000 flags=rwx PH-type=0x1 virt=02000000 evirt=0248c17c phys=02000000 ephys=0248c17c f_sz=004023d5 memsz=0048c17c PH 1 offs=003b7404 flags=r-x PH-type=0x4 virt=023af404 evirt=023af428 phys=023af404 ephys=023af428 f_sz=00000024 memsz=00000024 PH 2 offs=00000000 flags=rwx PH-type=0x6474e551 virt=00000000 evirt=00000000 phys=00000000 ephys=00000000 f_sz=00000000 memsz=00000000 Starting binary at 0x2000330, argc=7 argv=0xafff4f8c *argv=0xb1007ff4 argv0=rom/vmlinuz External resolver is at 0xa80007c4 ======> L4Linux starting... <======== Linux version 4.7.0-l4 (jesse@tplabpcu07640) (gcc version 4.8.4 (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1) ) #119 Thu Dec 8 18:05:42 CST 2016 Binary name: rom/vmlinuz This is an AEABI build. Linux kernel command line (6 args): mem=64M console=ttyLv0 l4x_dtb=rom/simple.dtb l4x_rd=rom/ramdisk-arm.rd root=1:0 ramdisk_size=3072 CPU mapping (l:p)[1]: 0:0 Image: 02000000 - 02600000 [6144 KiB]. Areas: Text: 02000000 - 023af428 [3773kB] RO-Data: 022c7000 - 02397000 [832kB] Data: 023d8000 - 023fda80 [150kB] Init: 023b0000 - 023d8000 [160kB] BSS: 024023d5 - 0248c17c [551kB] Device scan: Device: L4ICU Device: DMAMEM MEM: 20124000 - 20133fff Device: DEVICE1 MEM: 14000000 - 15ffffff DMAD: 00000000 - 00000000 Device: DEVICE2 MEM: 1f000000 - 1f3fffff IRQ: 00000042 - 00000042 DMAD: 00000000 - 00000000 Device scan done. l4lx_thread_create: Created thread 41d (cpu0) (u:b3000e00, v:b3000c00, sp:023d9fa4) main thread will be 41d L4x: section-with-init(-data): Virt: 0x2000000 to 0x248cfff [4660 KiB] section-with-init(-data): Phys: 0x2017c000 to 0x20608fff, [4660 KiB] L4x: section-with-init-text: Virt: 0x2000000 to 0x248cfff [4660 KiB] error: failed to get physical address for 2000000. L4x: Main thread running, waiting... L4x: Memory size: 64MB L4x: Setting superpages for main memory L4x: Adjusted memory start: 02000000 L4x: Main memory: Virt: 0x2600000 to 0x65fffff [65536 KiB] Main memory: Phys: 0x21c00000 to 0x25bfffff, [65536 KiB] l4x: vmalloc area: 06600000 - 0e600000 L4x: text: Virt: 0x2000000 to 0x248cfff [4660 KiB] error: failed to get physical address for 2000000. Loading: rom/ramdisk-arm.rd INITRD: Size of RAMdisk is 3072KiB RAMdisk from 00002000 to 00302000 [3072KiB] l4lx_thread_create: Created thread 422 (timer0) (u:b3000a00, v:00000000, sp:02423fa0) IO | new iomem region: p=1f000000 v=400000 s=400000 (bmb=0x34470) Booting Linux on physical CPU 0x0 Linux version 4.7.0-l4 (jesse@tplabpcu07640) (gcc version 4.8.4 (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1) ) #119 Thu Dec 8 18:05:42 CST 2016 DTB: virt=02600100 phys=21c00100 CPU: Fiasco [410fc075] revision 5 (ARMv7), cr=00400000 CPU: div instructions available: patching division code CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine model: L4Linux (DT) Memory policy: Data cache writealloc CPU: All CPU(s) started in SVC mode. INITRD: 00002000 - 00302000 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 17717 Kernel command line: mem=64M console=ttyLv0 l4x_dtb=rom/simple.dtb l4x_rd=rom/ramdisk-arm.rd root=1:0 ramdisk_size=3072 PID hash table entries: 512 (order: -1, 2048 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 64632K/71684K available (2941K kernel code, 150K rwdata, 832K rodata, 160K init, 551K bss, 7052K reserved, 0K cma-reserved) Virtual kernel memory layout: vector : 0xbffff000 - 0xc0000000 ( 4 kB) fixmap : 0xffc00000 - 0xfff00000 (3072 kB) vmalloc : 0x06600000 - 0x0e600000 ( 128 MB) lowmem : 0x00000000 - 0x06600000 ( 102 MB) modules : 0x01010000 - 0x02000000 ( 15 MB) .text : 0x02000000 - 0x023af428 (3774 kB) .init : 0x023b0000 - 0x023d8000 ( 160 kB) .data : 0x023d8000 - 0x023fda80 ( 151 kB) .bss : 0x024023d5 - 0x0248c17c ( 552 kB) NR_IRQS:282 clocksource: l4kipclk: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns l4timer: Using IRQ210 sched_clock: 64 bits at 1000kHz, resolution 1000ns, wraps every 2199023255500ns __l4x_ioremap: Mapping physaddr 1f000000 [0x400000 Bytes, 1f000000+400000] to 00400000+000000 clocksource_probe: no matching clocksources found Console: colour dummy device 80x30 console [ttyLv0] enabled Calibrating delay loop... 1594.16 BogoMIPS (lpj=7970816) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) CPU: Testing write buffer coherency: ok Setting up static identity map for 0x2000000 - 0x2000000 VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5 clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations Failed to create "l4x" debugfs directory: 1 clocksource: Switched to clocksource l4kipclk NET: Registered protocol family 2 TCP established hash table entries: 1024 (order: 0, 4096 bytes) TCP bind hash table entries: 1024 (order: 0, 4096 bytes) TCP: Hash tables configured (established 1024 bind 1024) UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (junk in compressed archive); looks like an initrd INITRD: Freeing memory. l4x: Checks passed. NetWinder Floating Point Emulator V0.97 (double precision) futex hash table entries: 256 (order: -1, 3072 bytes) workingset: timestamp_bits=29 max_order=14 bucket_order=0 squashfs: version 4.0 (2009/01/31) Phillip Lougher jffs2: version 2.2. ? 2001-2006 Red Hat, Inc. io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) L4 serial driver serial-ttyLv.0: ttyLv0 at MMIO 0x1 (irq = 211, base_baud = 230400) is a L4-vcon l4ser_shm: L4 shared mem serial driver l4cdds: No name given, not starting. brd: module loaded l4bdds: No name given, not starting. mousedev: PS/2 mouse device common for all mice IO | new iomem region: p=14000000 v=2000000 s=2000000 (bmb=0x344f8) __l4x_ioremap: Mapping physaddr 14000000 [0x2000000 Bytes, 14000000+2000000] to 0e600000+000000 Creating 1 MTD partitions on "NOR_FLASH": 0x000000f00000-0x000001000000 : "DATA" NET: Registered protocol family 17 L4IRQ: set irq type of 211 to 1 RAMDISK: ext2 filesystem found at block 0 RAMDISK: Loading 3072KiB [1 disk] into ram disk... done. EXT4-fs (ram0): couldn't mount as ext3 due to feature incompatibilities EXT4-fs (ram0): mounting ext2 file system using the ext4 subsystem EXT4-fs (ram0): mounted filesystem without journal. Opts: (null) VFS: Mounted root (ext2 filesystem) readonly on device 1:0. Freeing unused kernel memory: 160K (023b0000 - 023d8000) This architecture does not have kernel memory protection.
Please press Enter to activate this console.