Hi Genodians,

I am trying to get a Genode image using the Fiasco.OC-kernel running
on an RPi 3. I created an arm_v8a build directory and accordingly set
the KERNEL and BOARD variable. I also compiled a u-boot image from the
upstream repository.

When I attempt to boot the image from the u-boot prompt, I receive the
output below with no further reaction. I am still on Genode 19.05
because of a few modifications so I unless there is no other solution,
I would like to avoid upgrading to a newer version.

I also tried to run a few L4Re images provided here [0] with the same
result, so the problem might not even be specific to Genode.

Does anyone else have experiences with running on an RPi 3? Is there
anything I am missing here?
Hi,

today I was able to check this configuration and in my setup and it is
working ok for me. My setup is somewhat similar to one I described in my
article on genodians.org with loading image over tftp although I think I
did not describe in datail configuration for 64bit version.

I think one important piece is content of config.txt. Mine is:

  kernel=u-boot.bin
  enable_uart=1

  arm_64bit=1

  enable_jtag_gpio=1


Based on modification times of files on sd card I prepared it about year
ago (November 2019) and if I correctly remember I used current at that
time versions of rpi firmware and u-boot.


Below is the complete output I received from running run/log with
KERNEL=foc and BOARD=rpi3 on release 20.08

I hope this will help you.

Best regards,
Tomasz

Hi Tomasz,

I actually used your guide to setup Genode on a Raspberry so before I continue, I wanted to thank you for this article.

Anyway, I don't understand what I am doing wrong here. I followed your guide step-by-step with the exception of booting the image from the sd-card. My config looks very similar to yours (see below). However, I always receive garbage output. I think it must be a UART-issue of some sort. I investigated the Fiasco.OC-kernel code and found out that when the rpi3 configuration is used, it tries to compile a driver for the 16550 instead of the PL011, which is actually used in the RPi3 (unless I am misunderstanding something, I should add that most of this stuff is kind of new to me). Unfortunately, this did not fix the problem either but still, I added the changed files below for clarification.

Could you share me your image to see whether I can get it to boot on my Pi as well?

Best regards,
Simon

config.txt:
enable_uart=1
arm_64bit=1
init_uart_baud=115200
kernel=u-boot.bin

I modified the file src/kern/arm/bsp/bcm283x/Modules to compile the driver for the PL011 instead:

SUBSYSTEMS              += LIBUART
PREPROCESS_PARTS        += libuart generic_tickless_idle arm_single_ipi_irq
PREPROCESS_PARTS        += $(if $(CONFIG_ARM_V7PLUS),arm_generic_timer)
# PREPROCESS_PARTS        += $(if $(CONFIG_PF_BCM283X_RPI3),16550)
PREPROCESS_PARTS        += $(if $(CONFIG_PF_BCM283X_RPIZW),16550)
INTERFACES_KERNEL       += $(if $(CONFIG_ARM_V7PLUS),generic_timer)
INTERFACES_KERNEL       += arm_control irq_handler
RAM_PHYS_BASE           := 0

#ifeq ($(CONFIG_PF_BCM283X_RPI3),y)
#  uart_IMPL              = uart uart-16550
#  kernel_uart_IMPL      += kernel_uart-libuart
#  OBJECTS_LIBUART       += uart_16550.o
ifeq ($(CONFIG_PF_BCM283X_RPIZW),y)
  uart_IMPL              = uart uart-16550
  kernel_uart_IMPL      += kernel_uart-libuart
  OBJECTS_LIBUART       += uart_16550.o
else
  uart_IMPL             += uart-arm-bcm283x
  kernel_uart_IMPL      += kernel_uart-arm-bcm283x
  OBJECTS_LIBUART       += uart_pl011.o
endif
arm_control_IMPL      += arm_control-arm-bcm283x
config_IMPL           += config-arm-bcm283x
mem_layout_IMPL       += mem_layout-arm-bcm283x
pic_IMPL              += pic-arm-bcm283x
timer_IMPL            += timer-arm-bcm283x
timer_IMPL            += $(if $(CONFIG_ARM_V7PLUS),timer-arm-generic)
timer_tick_IMPL       += $(if $(CONFIG_ARM_V7PLUS),timer_tick-arm-bcm283x,timer_tick-single-vector)
reset_IMPL            += reset-arm-bcm283x
clock_IMPL            += clock-generic
ipi_IMPL              += ipi-arm-bcm283x
platform_control_IMPL += platform_control-arm-bcm283x
irq_handler_IMPL       = irq_handler-arm-bcm283x

I also needed to modify src/kern/arm/bsp/bcm283x/uart-arm-bcm283x.cpp so it is included by the compiler:

IMPLEMENTATION [pf_bcm283x && !(pf_bcm283x_rpizw)]:

#include "koptions.h"
#include "uart_pl011.h"

IMPLEMENT Address Uart::base() const
{ return Koptions::o()->uart.base_address; }

IMPLEMENT int Uart::irq() const
{ return Koptions::o()->uart.irqno; }

IMPLEMENT L4::Uart *Uart::uart()
{
  //static L4::Uart_pl011 uart(Koptions::o()->uart.base_baud);
  static L4::Uart_pl011 uart(115200);
  return &uart;
}