Hello, All!
This post is about how to eliminate memory restriction 256MB in
realview-pbxa9 platform (ARM Cortex A9 processor). The problem is
that L4 bootstrap doesn't scan all RAM memory presented on this
board. In QEMU source code for this platform (see hw/realview.c in
QEMU source directory, function: realview_init) we can find that it
can be 3 memory intervals in pbx a9:
1) base=0x00, size=min(sz, 256MB)
This is "SDRAM1"
2) base=0x20000000, size=sz-512MB (appears when sz>512)
This is called "core tile ram"
3) base=0x70000000, size=512
This is "SDRAM2",
where sz is a total board memory, in QEMU specified via -m option.
If that memory map is true (I have no pbx-a9 board operator's
manual), we can make a simple patch to L4 bootstrap (file
<genode>/base-foc/contrib/l4/pkg/bootstrap/server/src/platform/rv.cc),
that extends a basic 256MB memory to 256MB+512MB by overloading
setup_memory_map virtual function.
namespace {
class Platform_arm_rv : public Platform_single_region_ram
{
bool probe() { return true; }
//fix a memory limit 256MB in realview-pbxa9.platform. Adds
another memory chip of 512MB.
//WARNING: this fix works only if 512MB memory chip (or more)
is present!
//In case of QEMU you must run it with -m 512 or higher.
void setup_memory_map(l4util_mb_info_t *,
Region_list *ram, Region_list *)
{
ram->add(Region::n(0x0, 0x10000000, ".ram",
Region::Ram)); //SDRAM as it defined in realview.c (QUEMU
sources)
ram->add(Region::n(0x70000000, 0x90000000, ".ram",
Region::Ram)); //the second 512MB SDRAM
//TODO: add more RAM regions if you need it according to the
the platform map.
}
void init()
{
static L4::Uart_pl011 _uart(36,36);
_uart.startup(0x10009000);
set_stdio_uart(&_uart);
}
};
}
REGISTER_PLATFORM(Platform_arm_rv);
This is an example patch, it would be more correct (if total RAM
size is less then 512) to find total memory size first, then add the
memory regions, regarding a total memory size.
I hope it will be usefull.
Best regards, and happy cristmas&new year.
Evgeny Fedotov.
Samsung Research Center,
Moscow.