1*458db832SDavid du Colombier /* 2*458db832SDavid du Colombier * on return from this function we will be running in virtual mode. 3*458db832SDavid du Colombier * We set up the Block Address Translation (BAT) registers thus: 4*458db832SDavid du Colombier * 1) first 3 BATs are 256M blocks, starting from KZERO->0 5*458db832SDavid du Colombier * 2) remaining BAT maps last 256M directly 6*458db832SDavid du Colombier */ 7*458db832SDavid du Colombier TEXT mmuinit0(SB), $0 8*458db832SDavid du Colombier /* reset all the tlbs */ 9*458db832SDavid du Colombier MOVW $64, R3 10*458db832SDavid du Colombier MOVW R3, CTR 11*458db832SDavid du Colombier MOVW $0, R4 12*458db832SDavid du Colombier tlbloop: 13*458db832SDavid du Colombier TLBIE R4 14*458db832SDavid du Colombier SYNC 15*458db832SDavid du Colombier ADD $BIT(19), R4 16*458db832SDavid du Colombier BDNZ tlbloop 17*458db832SDavid du Colombier TLBSYNC 18*458db832SDavid du Colombier 19*458db832SDavid du Colombier /* BATs 0 and 1 cover memory from 0x00000000 to 0x20000000 */ 20*458db832SDavid du Colombier 21*458db832SDavid du Colombier /* KZERO -> 0, IBAT and DBAT, 256 MB */ 22*458db832SDavid du Colombier MOVW $(KZERO|(0x7ff<<2)|2), R3 23*458db832SDavid du Colombier MOVW $(PTEVALID|PTEWRITE), R4 /* PTEVALID => Cache coherency on */ 24*458db832SDavid du Colombier MOVW R3, SPR(IBATU(0)) 25*458db832SDavid du Colombier MOVW R4, SPR(IBATL(0)) 26*458db832SDavid du Colombier MOVW R3, SPR(DBATU(0)) 27*458db832SDavid du Colombier MOVW R4, SPR(DBATL(0)) 28*458db832SDavid du Colombier 29*458db832SDavid du Colombier /* KZERO+256M -> 256M, IBAT and DBAT, 256 MB */ 30*458db832SDavid du Colombier ADD $(1<<28), R3 31*458db832SDavid du Colombier ADD $(1<<28), R4 32*458db832SDavid du Colombier MOVW R3, SPR(IBATU(1)) 33*458db832SDavid du Colombier MOVW R4, SPR(IBATL(1)) 34*458db832SDavid du Colombier MOVW R3, SPR(DBATU(1)) 35*458db832SDavid du Colombier MOVW R4, SPR(DBATL(1)) 36*458db832SDavid du Colombier 37*458db832SDavid du Colombier /* FPGABASE -> FPGABASE, DBAT, 16 MB */ 38*458db832SDavid du Colombier MOVW $(FPGABASE|(0x7f<<2)|2), R3 39*458db832SDavid du Colombier MOVW $(FPGABASE|PTEWRITE|PTEUNCACHED), R4 /* FPGA memory, don't cache */ 40*458db832SDavid du Colombier MOVW R3, SPR(DBATU(2)) 41*458db832SDavid du Colombier MOVW R4, SPR(DBATL(2)) 42*458db832SDavid du Colombier 43*458db832SDavid du Colombier /* IBAT 2 unused */ 44*458db832SDavid du Colombier MOVW R0, SPR(IBATU(2)) 45*458db832SDavid du Colombier MOVW R0, SPR(IBATL(2)) 46*458db832SDavid du Colombier 47*458db832SDavid du Colombier /* direct map last block, uncached, (not guarded, doesn't work for BAT), DBAT only */ 48*458db832SDavid du Colombier MOVW $(INTMEM|(0x7ff<<2)|2), R3 49*458db832SDavid du Colombier MOVW $(INTMEM|PTEWRITE|PTEUNCACHED), R4 /* Don't set PTEVALID here */ 50*458db832SDavid du Colombier MOVW R3, SPR(DBATU(3)) 51*458db832SDavid du Colombier MOVW R4, SPR(DBATL(3)) 52*458db832SDavid du Colombier 53*458db832SDavid du Colombier /* IBAT 3 unused */ 54*458db832SDavid du Colombier MOVW R0, SPR(IBATU(3)) 55*458db832SDavid du Colombier MOVW R0, SPR(IBATL(3)) 56*458db832SDavid du Colombier 57*458db832SDavid du Colombier /* enable MMU */ 58*458db832SDavid du Colombier MOVW LR, R3 59*458db832SDavid du Colombier OR $KZERO, R3 60*458db832SDavid du Colombier MOVW R3, SPR(SRR0) /* Stored PC for RFI instruction */ 61*458db832SDavid du Colombier MOVW MSR, R4 62*458db832SDavid du Colombier OR $(MSR_IR|MSR_DR|MSR_RI|MSR_FP), R4 63*458db832SDavid du Colombier MOVW R4, SPR(SRR1) 64*458db832SDavid du Colombier RFI /* resume in kernel mode in caller */ 65*458db832SDavid du Colombier 66*458db832SDavid du Colombier RETURN 67