Skip to content

Commit

Permalink
[POWERPC] spufs: set up correct SLB entries for 64k pages
Browse files Browse the repository at this point in the history
spufs currently knows only 4k pages and 16M hugetlb
pages. Make it use the regular methods for deciding on
the SLB bits.

Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
arnd@arndb.de authored and Paul Mackerras committed Jun 21, 2006
1 parent 0309f02 commit 724bd80
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
11 changes: 8 additions & 3 deletions arch/powerpc/platforms/cell/spu_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
{
struct spu_priv2 __iomem *priv2 = spu->priv2;
struct mm_struct *mm = spu->mm;
u64 esid, vsid;
u64 esid, vsid, llp;

pr_debug("%s\n", __FUNCTION__);

Expand All @@ -91,9 +91,14 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
}

esid = (ea & ESID_MASK) | SLB_ESID_V;
vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | SLB_VSID_USER;
#ifdef CONFIG_HUGETLB_PAGE
if (in_hugepage_area(mm->context, ea))
vsid |= SLB_VSID_L;
llp = mmu_psize_defs[mmu_huge_psize].sllp;
else
#endif
llp = mmu_psize_defs[mmu_virtual_psize].sllp;
vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) |
SLB_VSID_USER | llp;

out_be64(&priv2->slb_index_W, spu->slb_replace);
out_be64(&priv2->slb_vsid_RW, vsid);
Expand Down
14 changes: 8 additions & 6 deletions arch/powerpc/platforms/cell/spufs/switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -718,13 +718,15 @@ static inline void invalidate_slbs(struct spu_state *csa, struct spu *spu)

static inline void get_kernel_slb(u64 ea, u64 slb[2])
{
slb[0] = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
u64 llp;

if (REGION_ID(ea) == KERNEL_REGION_ID)
llp = mmu_psize_defs[mmu_linear_psize].sllp;
else
llp = mmu_psize_defs[mmu_virtual_psize].sllp;
slb[0] = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) |
SLB_VSID_KERNEL | llp;
slb[1] = (ea & ESID_MASK) | SLB_ESID_V;

/* Large pages are used for kernel text/data, but not vmalloc. */
if (cpu_has_feature(CPU_FTR_16M_PAGE)
&& REGION_ID(ea) == KERNEL_REGION_ID)
slb[0] |= SLB_VSID_L;
}

static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe)
Expand Down

0 comments on commit 724bd80

Please sign in to comment.