genode/repos/base-hw/src/bootstrap/spec/rpi/platform.cc

91 lines
2.6 KiB
C++

/*
* \brief Platform implementations specific for base-hw and Raspberry Pi
* \author Norman Feske
* \author Stefan Kalkowski
* \date 2013-04-05
*/
/*
* Copyright (C) 2013-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#include <hw/assert.h>
#include <platform.h>
/**
* Leave out the first page (being 0x0) from bootstraps RAM allocator,
* some code does not feel happy with addresses being zero
*/
Bootstrap::Platform::Board::Board()
: early_ram_regions(Memory_region { RAM_0_BASE + 0x1000,
RAM_0_SIZE - 0x1000 }),
late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }),
core_mmio(Memory_region { PL011_0_MMIO_BASE,
PL011_0_MMIO_SIZE },
Memory_region { SYSTEM_TIMER_MMIO_BASE,
SYSTEM_TIMER_MMIO_SIZE },
Memory_region { IRQ_CONTROLLER_BASE,
IRQ_CONTROLLER_SIZE },
Memory_region { USB_DWC_OTG_BASE,
USB_DWC_OTG_SIZE }) {}
void Bootstrap::Platform::enable_mmu()
{
struct Sctlr : Cpu::Sctlr
{
struct W : Bitfield<3,1> { }; /* enable write buffer */
struct Dt : Bitfield<16,1> { }; /* global data TCM enable */
struct It : Bitfield<18,1> { }; /* global instruction TCM enable */
struct U : Bitfield<22,1> { }; /* enable unaligned data access */
struct Xp : Bitfield<23,1> { }; /* disable subpage AP bits */
};
Cpu::Sctlr::init();
Cpu::Sctlr::access_t sctlr = Cpu::Sctlr::read();
Sctlr::W::set(sctlr, 1);
Sctlr::Dt::set(sctlr, 1);
Sctlr::It::set(sctlr, 1);
Sctlr::U::set(sctlr, 1);
Sctlr::Xp::set(sctlr, 1);
Cpu::Sctlr::write(sctlr);
Cpu::Cpsr::init();
struct Ctr : Cpu::Ctr {
struct P : Bitfield<23, 1> { }; /* page mapping restriction on */
};
/* check for mapping restrictions */
assert(!Ctr::P::get(Cpu::Ctr::read()));
/* invalidate TLB */
Cpu::Tlbiall::write(0);
/* address space ID to zero */
Cpu::Cidr::write(0);
/* do not use domains, but permission bits in table */
Cpu::Dacr::write(Cpu::Dacr::D0::bits(1));
Cpu::Ttbcr::write(0);
Genode::addr_t table = (Genode::addr_t)core_pd->table_base;
Cpu::Ttbr::access_t ttbr0 = Cpu::Ttbr::Ba::masked(table);
Cpu::Ttbr::Rgn::set(ttbr0, Cpu::Ttbr::CACHEABLE);
Cpu::Ttbr::C::set(ttbr0, 1);
Cpu::Ttbr0::write(ttbr0);
sctlr = Cpu::Sctlr::read();
Cpu::Sctlr::C::set(sctlr, 1);
Cpu::Sctlr::I::set(sctlr, 1);
Cpu::Sctlr::M::set(sctlr, 1);
Cpu::Sctlr::write(sctlr);
/* invalidate branch predictor */
Cpu::Bpiall::write(0);
}