Skip to content

Commit

Permalink
sh: Fix up the SH-3 build for recent TLB changes.
Browse files Browse the repository at this point in the history
While the MMUCR.URB and ITLB/UTLB differentiation works fine for all SH-4
and later TLBs, these features are absent on SH-3. This splits out
local_flush_tlb_all() in to SH-4 and PTEAEX copies while restoring the
old SH-3 one, subsequently fixing up the build.

This will probably want some further reordering and tidying in the
future, but that's out of scope at present.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Apr 2, 2010
1 parent 5dd6ef5 commit be97d75
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 28 deletions.
28 changes: 28 additions & 0 deletions arch/sh/mm/tlb-pteaex.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,31 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
__raw_writel(asid, MMU_ITLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT);
back_to_cached();
}

void local_flush_tlb_all(void)
{
unsigned long flags, status;
int i;

/*
* Flush all the TLB.
*/
local_irq_save(flags);
jump_to_uncached();

status = __raw_readl(MMUCR);
status = ((status & MMUCR_URB) >> MMUCR_URB_SHIFT);

if (status == 0)
status = MMUCR_URB_NENTRIES;

for (i = 0; i < status; i++)
__raw_writel(0x0, MMU_UTLB_ADDRESS_ARRAY | (i << 8));

for (i = 0; i < 4; i++)
__raw_writel(0x0, MMU_ITLB_ADDRESS_ARRAY | (i << 8));

back_to_cached();
ctrl_barrier();
local_irq_restore(flags);
}
19 changes: 19 additions & 0 deletions arch/sh/mm/tlb-sh3.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,22 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
for (i = 0; i < ways; i++)
__raw_writel(data, addr + (i << 8));
}

void local_flush_tlb_all(void)
{
unsigned long flags, status;

/*
* Flush all the TLB.
*
* Write to the MMU control register's bit:
* TF-bit for SH-3, TI-bit for SH-4.
* It's same position, bit #2.
*/
local_irq_save(flags);
status = __raw_readl(MMUCR);
status |= 0x04;
__raw_writel(status, MMUCR);
ctrl_barrier();
local_irq_restore(flags);
}
28 changes: 28 additions & 0 deletions arch/sh/mm/tlb-sh4.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,31 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
__raw_writel(data, addr);
back_to_cached();
}

void local_flush_tlb_all(void)
{
unsigned long flags, status;
int i;

/*
* Flush all the TLB.
*/
local_irq_save(flags);
jump_to_uncached();

status = __raw_readl(MMUCR);
status = ((status & MMUCR_URB) >> MMUCR_URB_SHIFT);

if (status == 0)
status = MMUCR_URB_NENTRIES;

for (i = 0; i < status; i++)
__raw_writel(0x0, MMU_UTLB_ADDRESS_ARRAY | (i << 8));

for (i = 0; i < 4; i++)
__raw_writel(0x0, MMU_ITLB_ADDRESS_ARRAY | (i << 8));

back_to_cached();
ctrl_barrier();
local_irq_restore(flags);
}
28 changes: 0 additions & 28 deletions arch/sh/mm/tlbflush_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,31 +119,3 @@ void local_flush_tlb_mm(struct mm_struct *mm)
local_irq_restore(flags);
}
}

void local_flush_tlb_all(void)
{
unsigned long flags, status;
int i;

/*
* Flush all the TLB.
*/
local_irq_save(flags);
jump_to_uncached();

status = __raw_readl(MMUCR);
status = ((status & MMUCR_URB) >> MMUCR_URB_SHIFT);

if (status == 0)
status = MMUCR_URB_NENTRIES;

for (i = 0; i < status; i++)
__raw_writel(0x0, MMU_UTLB_ADDRESS_ARRAY | (i << 8));

for (i = 0; i < 4; i++)
__raw_writel(0x0, MMU_ITLB_ADDRESS_ARRAY | (i << 8));

back_to_cached();
ctrl_barrier();
local_irq_restore(flags);
}

0 comments on commit be97d75

Please sign in to comment.