Commit e83d0169 authored by Ian Munsie's avatar Ian Munsie Committed by Michael Ellerman

powerpc/cell: Move spu_handle_mm_fault() out of cell platform

Currently spu_handle_mm_fault() is in the cell platform.

This code is generically useful for other non-cell co-processors on powerpc.

This patch moves this function out of the cell platform into arch/powerpc/mm so
that others may use it.
Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 60666de2
...@@ -608,6 +608,10 @@ config PPC_SUBPAGE_PROT ...@@ -608,6 +608,10 @@ config PPC_SUBPAGE_PROT
to set access permissions (read/write, readonly, or no access) to set access permissions (read/write, readonly, or no access)
on the 4k subpages of each 64k page. on the 4k subpages of each 64k page.
config PPC_COPRO_BASE
bool
default n
config SCHED_SMT config SCHED_SMT
bool "SMT (Hyperthreading) scheduler support" bool "SMT (Hyperthreading) scheduler support"
depends on PPC64 && SMP depends on PPC64 && SMP
......
/*
* Copyright 2014 IBM Corp.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _ASM_POWERPC_COPRO_H
#define _ASM_POWERPC_COPRO_H
int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
unsigned long dsisr, unsigned *flt);
#endif /* _ASM_POWERPC_COPRO_H */
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/reg.h>
#include <asm/copro.h>
#define LS_SIZE (256 * 1024) #define LS_SIZE (256 * 1024)
#define LS_ADDR_MASK (LS_SIZE - 1) #define LS_ADDR_MASK (LS_SIZE - 1)
...@@ -277,9 +279,6 @@ void spu_remove_dev_attr(struct device_attribute *attr); ...@@ -277,9 +279,6 @@ void spu_remove_dev_attr(struct device_attribute *attr);
int spu_add_dev_attr_group(struct attribute_group *attrs); int spu_add_dev_attr_group(struct attribute_group *attrs);
void spu_remove_dev_attr_group(struct attribute_group *attrs); void spu_remove_dev_attr_group(struct attribute_group *attrs);
int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
unsigned long dsisr, unsigned *flt);
/* /*
* Notifier blocks: * Notifier blocks:
* *
......
...@@ -34,3 +34,4 @@ obj-$(CONFIG_TRANSPARENT_HUGEPAGE) += hugepage-hash64.o ...@@ -34,3 +34,4 @@ obj-$(CONFIG_TRANSPARENT_HUGEPAGE) += hugepage-hash64.o
obj-$(CONFIG_PPC_SUBPAGE_PROT) += subpage-prot.o obj-$(CONFIG_PPC_SUBPAGE_PROT) += subpage-prot.o
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o
obj-$(CONFIG_HIGHMEM) += highmem.o obj-$(CONFIG_HIGHMEM) += highmem.o
obj-$(CONFIG_PPC_COPRO_BASE) += copro_fault.o
/* /*
* SPU mm fault handler * CoProcessor (SPU/AFU) mm fault handler
* *
* (C) Copyright IBM Deutschland Entwicklung GmbH 2007 * (C) Copyright IBM Deutschland Entwicklung GmbH 2007
* *
...@@ -23,16 +23,14 @@ ...@@ -23,16 +23,14 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/export.h> #include <linux/export.h>
#include <asm/reg.h>
#include <asm/spu.h>
#include <asm/spu_csa.h>
/* /*
* This ought to be kept in sync with the powerpc specific do_page_fault * This ought to be kept in sync with the powerpc specific do_page_fault
* function. Currently, there are a few corner cases that we haven't had * function. Currently, there are a few corner cases that we haven't had
* to handle fortunately. * to handle fortunately.
*/ */
int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea, int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
unsigned long dsisr, unsigned *flt) unsigned long dsisr, unsigned *flt)
{ {
struct vm_area_struct *vma; struct vm_area_struct *vma;
...@@ -58,12 +56,12 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea, ...@@ -58,12 +56,12 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
goto out_unlock; goto out_unlock;
} }
is_write = dsisr & MFC_DSISR_ACCESS_PUT; is_write = dsisr & DSISR_ISSTORE;
if (is_write) { if (is_write) {
if (!(vma->vm_flags & VM_WRITE)) if (!(vma->vm_flags & VM_WRITE))
goto out_unlock; goto out_unlock;
} else { } else {
if (dsisr & MFC_DSISR_ACCESS_DENIED) if (dsisr & DSISR_PROTFAULT)
goto out_unlock; goto out_unlock;
if (!(vma->vm_flags & (VM_READ | VM_EXEC))) if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
goto out_unlock; goto out_unlock;
...@@ -91,4 +89,4 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea, ...@@ -91,4 +89,4 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(spu_handle_mm_fault); EXPORT_SYMBOL_GPL(copro_handle_mm_fault);
...@@ -86,6 +86,7 @@ config SPU_FS_64K_LS ...@@ -86,6 +86,7 @@ config SPU_FS_64K_LS
config SPU_BASE config SPU_BASE
bool bool
default n default n
select PPC_COPRO_BASE
config CBE_RAS config CBE_RAS
bool "RAS features for bare metal Cell BE" bool "RAS features for bare metal Cell BE"
......
...@@ -20,7 +20,7 @@ spu-manage-$(CONFIG_PPC_CELL_COMMON) += spu_manage.o ...@@ -20,7 +20,7 @@ spu-manage-$(CONFIG_PPC_CELL_COMMON) += spu_manage.o
obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \ obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
spu_notify.o \ spu_notify.o \
spu_syscalls.o spu_fault.o \ spu_syscalls.o \
$(spu-priv1-y) \ $(spu-priv1-y) \
$(spu-manage-y) \ $(spu-manage-y) \
spufs/ spufs/
......
...@@ -138,7 +138,7 @@ int spufs_handle_class1(struct spu_context *ctx) ...@@ -138,7 +138,7 @@ int spufs_handle_class1(struct spu_context *ctx)
if (ctx->state == SPU_STATE_RUNNABLE) if (ctx->state == SPU_STATE_RUNNABLE)
ctx->spu->stats.hash_flt++; ctx->spu->stats.hash_flt++;
/* we must not hold the lock when entering spu_handle_mm_fault */ /* we must not hold the lock when entering copro_handle_mm_fault */
spu_release(ctx); spu_release(ctx);
access = (_PAGE_PRESENT | _PAGE_USER); access = (_PAGE_PRESENT | _PAGE_USER);
...@@ -149,7 +149,7 @@ int spufs_handle_class1(struct spu_context *ctx) ...@@ -149,7 +149,7 @@ int spufs_handle_class1(struct spu_context *ctx)
/* hashing failed, so try the actual fault handler */ /* hashing failed, so try the actual fault handler */
if (ret) if (ret)
ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt); ret = copro_handle_mm_fault(current->mm, ea, dsisr, &flt);
/* /*
* This is nasty: we need the state_mutex for all the bookkeeping even * This is nasty: we need the state_mutex for all the bookkeeping even
......
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