Commit 47e4d851 authored by Martin Schwidefsky's avatar Martin Schwidefsky

s390/mm: merge local / non-local IDTE helper

Merge the __p[m|u]xdp_idte and __p[m|u]dp_idte_local functions into a
single __p[m|u]dp_idte function with an additional parameter.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 34eeaf37
...@@ -1235,53 +1235,33 @@ static inline void __pmdp_csp(pmd_t *pmdp) ...@@ -1235,53 +1235,33 @@ static inline void __pmdp_csp(pmd_t *pmdp)
pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID); pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
} }
static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp) #define IDTE_GLOBAL 0
{ #define IDTE_LOCAL 1
unsigned long sto;
sto = (unsigned long) pmdp - pmd_index(address) * sizeof(pmd_t);
asm volatile(
" .insn rrf,0xb98e0000,%2,%3,0,0"
: "=m" (*pmdp)
: "m" (*pmdp), "a" (sto), "a" ((address & HPAGE_MASK))
: "cc" );
}
static inline void __pudp_idte(unsigned long address, pud_t *pudp)
{
unsigned long r3o;
r3o = (unsigned long) pudp - pud_index(address) * sizeof(pud_t);
r3o |= _ASCE_TYPE_REGION3;
asm volatile(
" .insn rrf,0xb98e0000,%2,%3,0,0"
: "=m" (*pudp)
: "m" (*pudp), "a" (r3o), "a" ((address & PUD_MASK))
: "cc");
}
static inline void __pmdp_idte_local(unsigned long address, pmd_t *pmdp) static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp, int local)
{ {
unsigned long sto; unsigned long sto;
sto = (unsigned long) pmdp - pmd_index(address) * sizeof(pmd_t); sto = (unsigned long) pmdp - pmd_index(address) * sizeof(pmd_t);
asm volatile( asm volatile(
" .insn rrf,0xb98e0000,%2,%3,0,1" " .insn rrf,0xb98e0000,%[r1],%[r2],0,%[m4]"
: "=m" (*pmdp) : "+m" (*pmdp)
: "m" (*pmdp), "a" (sto), "a" ((address & HPAGE_MASK)) : [r1] "a" (sto), [r2] "a" ((address & HPAGE_MASK)),
[m4] "i" (local)
: "cc" ); : "cc" );
} }
static inline void __pudp_idte_local(unsigned long address, pud_t *pudp) static inline void __pudp_idte(unsigned long address, pud_t *pudp, int local)
{ {
unsigned long r3o; unsigned long r3o;
r3o = (unsigned long) pudp - pud_index(address) * sizeof(pud_t); r3o = (unsigned long) pudp - pud_index(address) * sizeof(pud_t);
r3o |= _ASCE_TYPE_REGION3; r3o |= _ASCE_TYPE_REGION3;
asm volatile( asm volatile(
" .insn rrf,0xb98e0000,%2,%3,0,1" " .insn rrf,0xb98e0000,%[r1],%[r2],0,%[m4]"
: "=m" (*pudp) : "+m" (*pudp)
: "m" (*pudp), "a" (r3o), "a" ((address & PUD_MASK)) : [r1] "a" (r3o), [r2] "a" ((address & PUD_MASK)),
[m4] "i" (local)
: "cc"); : "cc");
} }
......
...@@ -301,9 +301,9 @@ static inline pmd_t pmdp_flush_direct(struct mm_struct *mm, ...@@ -301,9 +301,9 @@ static inline pmd_t pmdp_flush_direct(struct mm_struct *mm,
atomic_inc(&mm->context.flush_count); atomic_inc(&mm->context.flush_count);
if (MACHINE_HAS_TLB_LC && if (MACHINE_HAS_TLB_LC &&
cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
__pmdp_idte_local(addr, pmdp); __pmdp_idte(addr, pmdp, IDTE_LOCAL);
else else
__pmdp_idte(addr, pmdp); __pmdp_idte(addr, pmdp, IDTE_GLOBAL);
atomic_dec(&mm->context.flush_count); atomic_dec(&mm->context.flush_count);
return old; return old;
} }
...@@ -322,7 +322,7 @@ static inline pmd_t pmdp_flush_lazy(struct mm_struct *mm, ...@@ -322,7 +322,7 @@ static inline pmd_t pmdp_flush_lazy(struct mm_struct *mm,
pmd_val(*pmdp) |= _SEGMENT_ENTRY_INVALID; pmd_val(*pmdp) |= _SEGMENT_ENTRY_INVALID;
mm->context.flush_mm = 1; mm->context.flush_mm = 1;
} else if (MACHINE_HAS_IDTE) } else if (MACHINE_HAS_IDTE)
__pmdp_idte(addr, pmdp); __pmdp_idte(addr, pmdp, IDTE_GLOBAL);
else else
__pmdp_csp(pmdp); __pmdp_csp(pmdp);
atomic_dec(&mm->context.flush_count); atomic_dec(&mm->context.flush_count);
...@@ -374,9 +374,9 @@ static inline pud_t pudp_flush_direct(struct mm_struct *mm, ...@@ -374,9 +374,9 @@ static inline pud_t pudp_flush_direct(struct mm_struct *mm,
atomic_inc(&mm->context.flush_count); atomic_inc(&mm->context.flush_count);
if (MACHINE_HAS_TLB_LC && if (MACHINE_HAS_TLB_LC &&
cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
__pudp_idte_local(addr, pudp); __pudp_idte(addr, pudp, IDTE_LOCAL);
else else
__pudp_idte(addr, pudp); __pudp_idte(addr, pudp, IDTE_GLOBAL);
atomic_dec(&mm->context.flush_count); atomic_dec(&mm->context.flush_count);
return old; return old;
} }
......
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