Enable L4Linux network access on Raspberry Pi-b.
Adam Lackorzynski
adam at os.inf.tu-dresden.de
Mon Jun 24 00:36:04 CEST 2019
Hi,
On Fri Jun 21, 2019 at 17:39:11 +0000, Lei Zhou wrote:
> Did some research into L4Re memory management and IO server.
>
> For my original question 1: on native device tree file adapting to L4linux:
> 1> Since Sigma0 got one-2-one mapping statically from Fiasco microkernel, I think I still can directly use those reg_address declaration for each device nodes within native rpi3's bcm2710-rpi-3-b.dts.
Yes, that's identity mapped but that has nothing really to do with
sigma0, that's io job.
> I will only make following simple changes comparing to simple.dts from l4re in case they are necessary for L4Linux to use.
> >>model = "L4Linux (DT)";
> >>compatible = "L4Linux";
> <</* compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
> <<model = "Raspberry Pi 3 Model B";*/
>
> /*------------------ copied from l4re..simple.dts ------------------*/
> intc: l4icu {
> compatible = "l4,icu";
> interrupt-controller;
> /* type can be 'gic' or 'single' currently */
> l4icu-type = "gic";
> #interrupt-cells = <3>;
> /*
> l4icu-type = "single";
> #interrupt-cells = <1>;
> */
> };
> /*------------------------------------------------------------------*/
ok.
> 2> For my original question 3: in terms of io config for IO server. Still don't have clear idea how to do it.
> Should I only need create a vBUS and grant access for L4linux to network NIC devices?
> Specifically I copied Raspberry PI3 NIC part of device tree node here for reference as below
You need to put those device on the vbus that the Linux needs access to,
in this case that would be the MMIO and IRQs for the USB controller as
the NIC is a USB NIC on the rpi.
> -----------------------------------------------------------------------------------------------------------------
> usb at 7e980000 {
> compatible = "brcm,bcm2708-usb";
> reg = <0x7e980000 0x10000 0x7e006000 0x1000>;
> interrupts = <0x2 0x0 0x1 0x9>;
> #address-cells = <0x1>;
> #size-cells = <0x0>;
> clocks = <0x18>;
> clock-names = "otg";
> phys = <0x19>;
> phy-names = "usb2-phy";
> power-domains = <0x14 0x6>;
> phandle = <0x6d>;
>
> usb1 at 1 {
> compatible = "usb424,9514";
> reg = <0x1>;
> #address-cells = <0x1>;
> #size-cells = <0x0>;
>
> usbether at 1 {
> compatible = "usb424,ec00";
> reg = <0x1>;
> phandle = <0x6e>;
> };
> };
> };
> --------------------------------------------------------------------------------------------------------------------------------
> Is this sufficient to do IO config as following rpi_devices.io?
> Within rpi_devices.io, I defined a named vBUS as l4lx. How does L4linux client know this "l4lx" vBUS is for me? Should I need configure it within L4linux somewhere?
No, this is configured in the ned script.
Please look at l4/conf/examples/l4lx-gfx.cfg and
l4/conf/examples/l4lx-x86.io for an example how those vbus names in the
io config are linked to the 'vbus' cap of L4Linux.
Might be that the USB controller needs access to some more MMIO/IRQs,
you'll see this when running it I guess.
Adam
> ----------------------------------------------------------------------------------------------------------------------------
> local Res = Io.Res
> local Hw = Io.Hw
> local hw = Io.system_bus()
>
> -- create a virtual bus for client with its name as 'l4lx'
> -- Give it access to NIC device
> -- 'l4lx is name of vbus
> Io.add_vbus("l4lx", Io.Vi.System_bus
> {
> -- add device which matches the compatibility ID (CID)
> -- usb_net_smsc9514 for rpi-3b
> -- 'usb424,ec00'
> -- NIC = wrap(hw:match("usb424,ec00"));
> NIC = wrap(hw.NIC);
> })
>
> Io.hw_add_devices(function()
>
> -- create a new named NIC device
> NIC = Hw.Device(function()
> Property.hid = "smsc9514";
> compatible = {"usb424,ec00"};
> -- Resource.regs = Res.mmio(0x4e000000, 0x4e000fff);
> -- Resource.irq = Res.irq(41);
> end);
>
> end)
> --------------------------------------------------------------------------------------------------------~
>
> Much Appreciated!
> Lei Zhou
>
> ________________________________________
> From: Lei Zhou
> Sent: Thursday, June 20, 2019 6:43 PM
> To: Adam Lackorzynski; l4-hackers at os.inf.tu-dresden.de
> Subject: Enable L4Linux network access on Raspberry Pi-b.
>
> Hi Adam & Hackers,
>
> Has anybody enabled network access for L4linux Raspberry pi3? I read through all the history on related topics and understand the process to get it working. I summarized the steps as below and major problem for me is how to convert device tree for L4linux and compose corresponding rpi_deices.io configuration. Please see my specific question inlined in those steps. Thanks in advance for your feedback.
>
> 1. configure and Compile l4linux to support flattened device tree support. Also enables
> CONFIG_USB_LAN78XX=y &&
> CONFIG_USB_USBNET=y
> CONFIG_USB_NET_SMSC95XX=y
> CONFIG_L4_SERVER = y
> CONFIG_USE_OF = y
> 2. Adapt https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/boot/dts/bcm2710-rpi-3-b.dts into ./l4linux/arch/l4/boot/dts/simple.dts
> [Lei's question]: I understand why bcm2710-rpi-3-b.dts cannot be used directly because some of the reg_address physical address doesn't apply and might fail to be mapped. How can I pick network access specific device nodes and its dependancies(power or clock etc) and how to change those illegal reg_address?
>
> 3. Create an rpi3_devices.io for L4Re with the devices and their resources and assign the desired devices to a vbus.
> [Lei's question]: Should I define all device nodes one-2-one mapping from step 2's device tree?
>
> 4. Update your ned script and modules.list
>
> -- vim:set ft=lua:
>
> local L4 = require("L4");
>
> loader = L4.default_loader;
>
> -- Start io
> vbus_l4linux = loader:new_channel();
> --vbus_input = loader:new_channel();
> --vbus_fbdrv = loader:new_channel();
>
> loader:start(
> {
> caps = {
> sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0);
> icu = L4.Env.icu;
> -- input = vbus_input:svr();
> l4linux = vbus_l4linux:svr();
> -- fbdrv = vbus_fbdrv:svr();
> },
> log = {"IO", "y"},
> l4re_dbg = L4.Dbg.Warn,
> }, "rom/io -vvv rom/rpi_devices.io");
>
> -- Start L4linux
> loader:start(
> {
> caps = {
> -- fb = mag_svc:create(L4.Proto.Goos, "g=640x480");
> vbus = vbus_l4linux;
> },
> log = L4.Env.log:m("rws"),
> l4re_dbg = L4.Dbg.Warn,
> },
> "rom/vmlinuz mem=64M console=ttyLv0 l4x_rd=rom/ramdisk- l4x_dtb=rom/rpi3b-simple.dtb"
> .. L4.Info.arch() .. ".rd " ..
> "root=1:0 ramdisk_size=4000 init=/bin/sh earlyprintk=1 ");
>
> 5. Build final bootstrap_l4linux.uimage for Raspberry.
>
> Thanks very much!
> Lei Zhou
More information about the l4-hackers
mailing list