Add to MMU init: bypass cache in MMIO page
[pdp11-memory-test] / pdp11_mmu.c
// (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
// See License.txt file for copyright and license details.
#include <stdint.h>
#include "pdp11_register.h"
void
init_mmu(void)
{
/*
* First populate the relocation registers, all zero since we want an
* identity mapping, except the highest page that we remap to the physical MMIO
* range.
*/
SET(KISAR0,PAR_PAF,0000000);
SET(KISAR1,PAR_PAF,0000000);
SET(KISAR2,PAR_PAF,0000000);
SET(KISAR3,PAR_PAF,0000000);
SET(KISAR4,PAR_PAF,0000000);
SET(KISAR5,PAR_PAF,0000000);
SET(KISAR6,PAR_PAF,0000000);
SET(KISAR7,PAR_PAF,0177600);
/*
* Now populate the page descriptor registers. See EK-KDJ1B-UG page 1-19
* for details of each field.
*/
uint16_t data = 0;
SET(data,PDR_BYPASCACHE,0);
SET(data,PDR_PAGELEN,0177);
SET(data,PDR_PAGEWRITEN,0);
SET(data,PDR_EXPANDDIR,0);
SET(data,PDR_ACCESSCTRL,03);
KISDR0 = data;
KISDR1 = data;
KISDR2 = data;
KISDR3 = data;
KISDR4 = data;
KISDR5 = data;
KISDR6 = data;
SET(data,PDR_BYPASCACHE,1);
KISDR7 = data;
/*
* Enable the MMU with a 22-bit mapping.
*/
SET(MMR3,MMR3_KRNSPLTID,0);
SET(MMR3,MMR3_EN_22BIT,1);
SET(MMR0,MMR0_EN_MMU,1);
}