// SPDX-License-Identifier: GPL-2.0-or-later /* * Modifications by Matt Porter (mporter@mvista.com) to support * PPC44x Book E processors. * * This file contains the routines for initializing the MMU * on the 4xx series of chips. * -- paulus * * Derived from arch/ppc/mm/init.c: * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) * * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) * and Cort Dougan (PReP) (cort@cs.nmt.edu) * Copyright (C) 1996 Paul Mackerras * * Derived from "arch/i386/mm/init.c" * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
*/
/* Used by the 44x TLB replacement exception handler. * Just needed it declared someplace.
*/ unsignedint tlb_44x_index; /* = 0 */ unsignedint tlb_44x_hwater = PPC44x_TLB_SIZE - 1 - PPC44x_EARLY_TLBS; int icache_44x_need_flush;
unsignedlong tlb_47x_boltmap[1024/8];
staticvoid __init ppc44x_update_tlb_hwater(void)
{ /* The TLB miss handlers hard codes the watermark in a cmpli * instruction to improve performances rather than loading it * from the global variable. Thus, we patch the instructions * in the 2 TLB miss handlers when updating the value
*/
modify_instruction_site(&patch__tlb_44x_hwater_D, 0xffff, tlb_44x_hwater);
modify_instruction_site(&patch__tlb_44x_hwater_I, 0xffff, tlb_44x_hwater);
}
/* * "Pins" a 256MB TLB entry in AS0 for kernel lowmem for 44x type MMU
*/ staticvoid __init ppc44x_pin_tlb(unsignedint virt, unsignedint phys)
{ unsignedint entry = tlb_44x_hwater--;
/* * "Pins" a 256MB TLB entry in AS0 for kernel lowmem for 47x type MMU
*/ staticvoid __init ppc47x_pin_tlb(unsignedint virt, unsignedint phys)
{ unsignedint rA; int bolted;
/* Base rA is HW way select, way 0, bolted bit set */
rA = 0x88000000;
/* Look for a bolted entry slot */
bolted = ppc47x_find_free_bolted();
BUG_ON(bolted < 0);
/* Insert bolted slot number */
rA |= bolted << 24;
pr_debug("256M TLB entry for 0x%08x->0x%08x in bolt slot %d\n",
virt, phys, bolted);
/* Pin in enough TLBs to cover any lowmem not covered by the
* initial 256M mapping established in head_44x.S */ for (addr = memstart + PPC_PIN_SIZE; addr < lowmem_end_addr;
addr += PPC_PIN_SIZE) { if (mmu_has_feature(MMU_FTR_TYPE_47x))
ppc47x_pin_tlb(addr + PAGE_OFFSET, addr); else
ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
} if (mmu_has_feature(MMU_FTR_TYPE_47x)) {
ppc47x_update_boltmap();
#ifdef DEBUG
{ int i;
printk(KERN_DEBUG "bolted entries: "); for (i = 0; i < 255; i++) { if (test_bit(i, tlb_47x_boltmap))
printk("%d ", i);
}
printk("\n");
} #endif/* DEBUG */
} return total_lowmem;
}
#ifndef CONFIG_NONSTATIC_KERNEL /* We don't currently support the first MEMBLOCK not mapping 0 * physical on those processors
*/
BUG_ON(first_memblock_base != 0); #endif
/* 44x has a 256M TLB entry pinned at boot */
size = (min_t(u64, first_memblock_size, PPC_PIN_SIZE));
memblock_set_current_limit(first_memblock_base + size);
}
/* Pin in enough TLBs to cover any lowmem not covered by the * initial 256M mapping established in head_44x.S * * WARNING: This is called with only the first 256M of the * linear mapping in the TLB and we can't take faults yet * so beware of what this code uses. It runs off a temporary * stack. current (r2) isn't initialized, smp_processor_id() * will not work, current thread info isn't accessible, ...
*/ for (addr = memstart + PPC_PIN_SIZE; addr < lowmem_end_addr;
addr += PPC_PIN_SIZE) { if (mmu_has_feature(MMU_FTR_TYPE_47x))
ppc47x_pin_tlb(addr + PAGE_OFFSET, addr); else
ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
}
} #endif/* CONFIG_SMP */
Messung V0.5
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.