Commit d377732c authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Ralf Baechle

Revert "MIPS: Delete unused function add_temporary_entry."

This reverts commit d7a887a7.

Function add_temporary_entry is needed by bcm47xx to support highmem. We
need to add a temporary entry to check for amount of RAM.
The only change made in this revert was replacing (ENTER|EXIT)_CRITICAL.
Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Patchwork: https://patchwork.linux-mips.org/patch/7395/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 9194b343
...@@ -18,6 +18,16 @@ ...@@ -18,6 +18,16 @@
#include <asm-generic/pgtable-nopmd.h> #include <asm-generic/pgtable-nopmd.h>
/*
* - add_temporary_entry() add a temporary TLB entry. We use TLB entries
* starting at the top and working down. This is for populating the
* TLB before trap_init() puts the TLB miss handler in place. It
* should be used only for entries matching the actual page tables,
* to prevent inconsistencies.
*/
extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
unsigned long entryhi, unsigned long pagemask);
/* /*
* Basically we have the same two-level (which is the logical three level * Basically we have the same two-level (which is the logical three level
* Linux page table layout folded) page tables as the i386. Some day * Linux page table layout folded) page tables as the i386. Some day
......
...@@ -391,6 +391,51 @@ int __init has_transparent_hugepage(void) ...@@ -391,6 +391,51 @@ int __init has_transparent_hugepage(void)
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
/*
* Used for loading TLB entries before trap_init() has started, when we
* don't actually want to add a wired entry which remains throughout the
* lifetime of the system
*/
static int temp_tlb_entry __cpuinitdata;
__init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
unsigned long entryhi, unsigned long pagemask)
{
int ret = 0;
unsigned long flags;
unsigned long wired;
unsigned long old_pagemask;
unsigned long old_ctx;
local_irq_save(flags);
/* Save old context and create impossible VPN2 value */
old_ctx = read_c0_entryhi();
old_pagemask = read_c0_pagemask();
wired = read_c0_wired();
if (--temp_tlb_entry < wired) {
printk(KERN_WARNING
"No TLB space left for add_temporary_entry\n");
ret = -ENOSPC;
goto out;
}
write_c0_index(temp_tlb_entry);
write_c0_pagemask(pagemask);
write_c0_entryhi(entryhi);
write_c0_entrylo0(entrylo0);
write_c0_entrylo1(entrylo1);
mtc0_tlbw_hazard();
tlb_write_indexed();
tlbw_use_hazard();
write_c0_entryhi(old_ctx);
write_c0_pagemask(old_pagemask);
out:
local_irq_restore(flags);
return ret;
}
static int ntlb; static int ntlb;
static int __init set_ntlb(char *str) static int __init set_ntlb(char *str)
{ {
...@@ -431,6 +476,8 @@ static void r4k_tlb_configure(void) ...@@ -431,6 +476,8 @@ static void r4k_tlb_configure(void)
write_c0_pagegrain(pg); write_c0_pagegrain(pg);
} }
temp_tlb_entry = current_cpu_data.tlbsize - 1;
/* From this point on the ARC firmware is dead. */ /* From this point on the ARC firmware is dead. */
local_flush_tlb_all(); local_flush_tlb_all();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment