91 lines
2.6 KiB
C++
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);
|
|
}
|