Skip to content

Commit

Permalink
sh: update the TLB replacement counter for entry wiring.
Browse files Browse the repository at this point in the history
Presently the TLB wiring code depends on MMUCR.URB for working out where
to place the wired entry, but fails to take the replacment counter in to
consideration. This fixes up the wiring logic and ensures that wired
entries remain so.

Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Matt Fleming authored and Paul Mundt committed Mar 26, 2010
1 parent 01e7770 commit 4539282
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
2 changes: 2 additions & 0 deletions arch/sh/include/cpu-sh4/cpu/mmu_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
#define MMUCR_URB 0x00FC0000
#define MMUCR_URB_SHIFT 18
#define MMUCR_URB_NENTRIES 64
#define MMUCR_URC 0x0000FC00
#define MMUCR_URC_SHIFT 10

#if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40)
#define MMUCR_SE (1 << 4)
Expand Down
22 changes: 17 additions & 5 deletions arch/sh/mm/tlb-urb.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,9 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)

local_irq_save(flags);

/* Load the entry into the TLB */
__update_tlb(vma, addr, pte);

/* ... and wire it up. */
status = __raw_readl(MMUCR);
urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT;
status &= ~MMUCR_URB;
status &= ~MMUCR_URC;

/*
* Make sure we're not trying to wire the last TLB entry slot.
Expand All @@ -39,7 +35,23 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)

urb = urb % MMUCR_URB_NENTRIES;

/*
* Insert this entry into the highest non-wired TLB slot (via
* the URC field).
*/
status |= (urb << MMUCR_URC_SHIFT);
__raw_writel(status, MMUCR);
ctrl_barrier();

/* Load the entry into the TLB */
__update_tlb(vma, addr, pte);

/* ... and wire it up. */
status = __raw_readl(MMUCR);

status &= ~MMUCR_URB;
status |= (urb << MMUCR_URB_SHIFT);

__raw_writel(status, MMUCR);
ctrl_barrier();

Expand Down

0 comments on commit 4539282

Please sign in to comment.