On Tuesday, 23 May 2023 16:03:28 CEST Philipp Eppelt wrote:
> 
> The path you are on sounds correct. A reason for a missing DMA domain 
> resource on the vbus is (usually) the lack of a DMA capable device on 
> said vbus.
> 
> https://github.com/kernkonzept/manifest/wiki/NVMeWithLinux#vbus-configuration-file
>
> shows a vbus configuration file that places all PCI/storage devices on 
> the vbus. I presume your MIPS board lacks PCI, so you have to write the 
> entries for System_bus and the Vbus yourself.

Yes, it involves a system-on-chip (SoC) without the usual PC architecture 
technologies like PCI.

> The helpful sections in another tutorial are:
> https://github.com/kernkonzept/manifest/wiki/HwPassThrough#ios-config-file
> https://github.com/kernkonzept/manifest/wiki/HwPassThrough#vbus-configuration-file

This is pretty similar to, but clearer than, the previous L4Re documentation 
about Io:

https://l4re.org/doc/io.html

> I found your mercurial instance for the l4re topic but didn't find any 
> io & vbus configuration. Can you point me to your config files?
> And/Or send along the Io output with maximum verbosity (-vvvvvvv)?

Thank you for going to the trouble of locating my repositories!

Currently, there is no single location of the files for this effort, but I aim 
to tidy this up somewhat. To explain briefly, there is the set of patches to 
get the software working on these MIPS-based boards (which is thankfully 
diminishing over time), and then there is a framework called Landfall which 
contains example programs. You can see the .io file for the specific example 
program here:

https://hg.boddie.org.uk/Landfall/file/7aa21a758551/conf/landfall-examples/
mips-ci20-hdmi-i2c.io

Since it is short, here is the essential part:

----
local hw = Io.system_bus()

local bus = Io.Vi.System_bus
{
  CPM = wrap(hw:match("jz4780-cpm"));
  GPIO = wrap(hw:match("jz4780-gpio"));
  LCD = wrap(hw:match("jz4780-lcd"));
  HDMI = wrap(hw:match("jz4780-hdmi"));
}

Io.add_vbus("vbus", bus)
----

Meanwhile, the underlying board-level file is actually defined in a patch 
against L4Re, and it isn't currently in a public repository, but it just looks 
like this:

----
local Res = Io.Res
local Hw = Io.Hw

Io.hw_add_devices(function()

  CPM = Hw.Device(function()
    Property.hid = "jz4780-cpm";
    -- compatible = {"mips,jz4780-cpm"};
    Resource.regs = Res.mmio(0x10000000, 0x10000fff);
    -- Property.exclk_freq = 48000000; -- 48 MHz
    -- Property.rtclk_freq = 32768; -- 32.768 kHz
  end);

  DMA = Hw.Device(function()
    Property.hid = "jz4780-dma";
    Resource.regs = Res.mmio(0x13420000, 0x1342103f);
    Resource.irq = Res.irq({59, 56}, Io.Resource.Irq_type_level_high);
  end);

  ...

end)
----

Note that the DMA device in the above is actually the DMA controller 
peripheral which is used to perform DMA involving the different SoC 
peripherals.

What I have tried to do in the .io file for the specific program is the 
following before the final statement adding the new bus as a vbus:

----
for resource in hw:resources() do
  print("resource name=" .. resource:id());
  if resource:id() == 1145130308 then
    bus:add_resource(resource)
  end
end
----

Here, I can confirm that there are two resources with the appropriate 
designation (1145130308, or 0x44414d44, or "DMAD"), and the trace from Io 
shows that the resource is copied to the vbus:

IO      | vbus: [N12_GLOBAL__N_112Virtual_sbusE]
IO      |   Resources: ==== start ====
IO      |   DMADOM  [00000000000000-00000000000000 1] (align=0 flags=6)
IO      |   Resources: ===== end =====
IO      |   L4ICU: [N2Vi6Sw_icuE]
IO      |     Resources: ==== start ====
IO      |     Resources: ===== end =====
IO      |   HDMI: [N2Vi9Proxy_devE]
IO      |     Resources: ==== start ====
IO      |     IOMEM   [00000010180000-0000001019ffff 20000] 32-bit non-pref 
(align=1ffff flags=300002)
IO      |     IRQ     [00000000000003-00000000000004 2] level high (align=1 
flags=300001)
IO      |     Resources: ===== end =====

But the DMA domain is still not found when assigning the space. I did wonder 
whether I might need to create a device to hold the DMA domain resource, but 
my attempt to implement this failed:

for resource in hw:resources() do
  print("resource name=" .. resource:id())
  if resource:id() == 1145130308 then
    device = Io.Vi.System_bus()
    device:add_resource(resource)
    bus:add_child(device)
  end
end

Here, Io crashes...

IO      | L4Re[rm]: unhandled read page fault at 0x31 pc=0x102aba0
IO      | L4Re: rom/io: Unhandled exception: PC=0x102aba0 PFA=0x30 LdrFlgs=0x0

...which is the following line in Dma_domain::add_to_group:

  if (!_v_domain && !g->_set)

I imagine that I am making this harder than it should be, though.

Paul



_______________________________________________
l4-hackers mailing list
l4-hackers@os.inf.tu-dresden.de
https://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers

Reply via email to