MIPS: MT: Remove SMTC support
Nobody is maintaining SMTC anymore and there also seems to be no userbase. Which is a pity - the SMTC technology primarily developed by Kevin D. Kissell <kevink@paralogos.com> is an ingenious demonstration for the MT ASE's power and elegance. Based on Markos Chandras <Markos.Chandras@imgtec.com> patch https://patchwork.linux-mips.org/patch/6719/ which while very similar did no longer apply cleanly when I tried to merge it plus some additional post-SMTC cleanup - SMTC was a feature as tricky to remove as it was to merge once upon a time. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
此提交包含在:
@@ -25,28 +25,6 @@
|
||||
|
||||
extern void build_tlb_refill_handler(void);
|
||||
|
||||
/* Atomicity and interruptability */
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
|
||||
#include <asm/smtc.h>
|
||||
#include <asm/mipsmtregs.h>
|
||||
|
||||
#define ENTER_CRITICAL(flags) \
|
||||
{ \
|
||||
unsigned int mvpflags; \
|
||||
local_irq_save(flags);\
|
||||
mvpflags = dvpe()
|
||||
#define EXIT_CRITICAL(flags) \
|
||||
evpe(mvpflags); \
|
||||
local_irq_restore(flags); \
|
||||
}
|
||||
#else
|
||||
|
||||
#define ENTER_CRITICAL(flags) local_irq_save(flags)
|
||||
#define EXIT_CRITICAL(flags) local_irq_restore(flags)
|
||||
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
|
||||
/*
|
||||
* LOONGSON2/3 has a 4 entry itlb which is a subset of dtlb,
|
||||
* unfortunately, itlb is not totally transparent to software.
|
||||
@@ -75,7 +53,7 @@ void local_flush_tlb_all(void)
|
||||
unsigned long old_ctx;
|
||||
int entry, ftlbhighset;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
/* Save old context and create impossible VPN2 value */
|
||||
old_ctx = read_c0_entryhi();
|
||||
write_c0_entrylo0(0);
|
||||
@@ -112,7 +90,7 @@ void local_flush_tlb_all(void)
|
||||
tlbw_use_hazard();
|
||||
write_c0_entryhi(old_ctx);
|
||||
flush_itlb();
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL(local_flush_tlb_all);
|
||||
|
||||
@@ -142,7 +120,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
|
||||
if (cpu_context(cpu, mm) != 0) {
|
||||
unsigned long size, flags;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
start = round_down(start, PAGE_SIZE << 1);
|
||||
end = round_up(end, PAGE_SIZE << 1);
|
||||
size = (end - start) >> (PAGE_SHIFT + 1);
|
||||
@@ -176,7 +154,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
|
||||
drop_mmu_context(mm, cpu);
|
||||
}
|
||||
flush_itlb();
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +162,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
unsigned long size, flags;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
|
||||
size = (size + 1) >> 1;
|
||||
if (size <= (current_cpu_data.tlbsizeftlbsets ?
|
||||
@@ -220,7 +198,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||
local_flush_tlb_all();
|
||||
}
|
||||
flush_itlb();
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
|
||||
@@ -233,7 +211,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
|
||||
|
||||
newpid = cpu_asid(cpu, vma->vm_mm);
|
||||
page &= (PAGE_MASK << 1);
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
oldpid = read_c0_entryhi();
|
||||
write_c0_entryhi(page | newpid);
|
||||
mtc0_tlbw_hazard();
|
||||
@@ -253,7 +231,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
|
||||
finish:
|
||||
write_c0_entryhi(oldpid);
|
||||
flush_itlb_vm(vma);
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,7 +244,7 @@ void local_flush_tlb_one(unsigned long page)
|
||||
unsigned long flags;
|
||||
int oldpid, idx;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
oldpid = read_c0_entryhi();
|
||||
page &= (PAGE_MASK << 1);
|
||||
write_c0_entryhi(page);
|
||||
@@ -285,7 +263,7 @@ void local_flush_tlb_one(unsigned long page)
|
||||
}
|
||||
write_c0_entryhi(oldpid);
|
||||
flush_itlb();
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -308,7 +286,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
if (current->active_mm != vma->vm_mm)
|
||||
return;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
|
||||
pid = read_c0_entryhi() & ASID_MASK;
|
||||
address &= (PAGE_MASK << 1);
|
||||
@@ -358,7 +336,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
}
|
||||
tlbw_use_hazard();
|
||||
flush_itlb_vm(vma);
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
@@ -369,7 +347,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
unsigned long old_pagemask;
|
||||
unsigned long old_ctx;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
/* Save old context and create impossible VPN2 value */
|
||||
old_ctx = read_c0_entryhi();
|
||||
old_pagemask = read_c0_pagemask();
|
||||
@@ -389,7 +367,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
tlbw_use_hazard(); /* What is the hazard here? */
|
||||
write_c0_pagemask(old_pagemask);
|
||||
local_flush_tlb_all();
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
@@ -399,13 +377,13 @@ int __init has_transparent_hugepage(void)
|
||||
unsigned int mask;
|
||||
unsigned long flags;
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
local_irq_save(flags);
|
||||
write_c0_pagemask(PM_HUGE_MASK);
|
||||
back_to_back_c0_hazard();
|
||||
mask = read_c0_pagemask();
|
||||
write_c0_pagemask(PM_DEFAULT_MASK);
|
||||
|
||||
EXIT_CRITICAL(flags);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return mask == PM_HUGE_MASK;
|
||||
}
|
||||
|
新增問題並參考
封鎖使用者