Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
f57e8430
Commit
f57e8430
authored
Mar 12, 2007
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'cell-merge' of
git://git.kernel.org/pub/scm/linux/kernel/git/arnd/cell-2.6
into merge
parents
be521466
c886c2bf
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
258 additions
and
132 deletions
+258
-132
arch/powerpc/configs/cell_defconfig
arch/powerpc/configs/cell_defconfig
+130
-21
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/hash_utils_64.c
+6
-0
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/hugetlbpage.c
+4
-0
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/cell/spu_base.c
+69
-12
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/file.c
+14
-10
arch/powerpc/platforms/cell/spufs/run.c
arch/powerpc/platforms/cell/spufs/run.c
+2
-2
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/sched.c
+4
-16
arch/powerpc/platforms/cell/spufs/spufs.h
arch/powerpc/platforms/cell/spufs/spufs.h
+2
-4
arch/powerpc/platforms/cell/spufs/switch.c
arch/powerpc/platforms/cell/spufs/switch.c
+3
-59
arch/powerpc/platforms/ps3/mm.c
arch/powerpc/platforms/ps3/mm.c
+1
-1
arch/powerpc/platforms/ps3/system-bus.c
arch/powerpc/platforms/ps3/system-bus.c
+1
-1
drivers/ps3/ps3av.c
drivers/ps3/ps3av.c
+8
-1
drivers/ps3/sys-manager.c
drivers/ps3/sys-manager.c
+6
-0
drivers/ps3/vuart.c
drivers/ps3/vuart.c
+1
-1
include/asm-powerpc/spu.h
include/asm-powerpc/spu.h
+7
-0
include/asm-powerpc/spu_csa.h
include/asm-powerpc/spu_csa.h
+0
-4
No files found.
arch/powerpc/configs/cell_defconfig
View file @
f57e8430
This diff is collapsed.
Click to expand it.
arch/powerpc/mm/hash_utils_64.c
View file @
f57e8430
...
@@ -685,6 +685,9 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
...
@@ -685,6 +685,9 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
"non-cacheable mapping
\n
"
);
"non-cacheable mapping
\n
"
);
psize
=
mmu_vmalloc_psize
=
MMU_PAGE_4K
;
psize
=
mmu_vmalloc_psize
=
MMU_PAGE_4K
;
}
}
#ifdef CONFIG_SPE_BASE
spu_flush_all_slbs
(
mm
);
#endif
}
}
if
(
user_region
)
{
if
(
user_region
)
{
if
(
psize
!=
get_paca
()
->
context
.
user_psize
)
{
if
(
psize
!=
get_paca
()
->
context
.
user_psize
)
{
...
@@ -759,6 +762,9 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
...
@@ -759,6 +762,9 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
mmu_psize_defs
[
MMU_PAGE_4K
].
sllp
;
mmu_psize_defs
[
MMU_PAGE_4K
].
sllp
;
get_paca
()
->
context
=
mm
->
context
;
get_paca
()
->
context
=
mm
->
context
;
slb_flush_and_rebolt
();
slb_flush_and_rebolt
();
#ifdef CONFIG_SPE_BASE
spu_flush_all_slbs
(
mm
);
#endif
}
}
}
}
if
(
mm
->
context
.
user_psize
==
MMU_PAGE_64K
)
if
(
mm
->
context
.
user_psize
==
MMU_PAGE_64K
)
...
...
arch/powerpc/mm/hugetlbpage.c
View file @
f57e8430
...
@@ -24,6 +24,7 @@
...
@@ -24,6 +24,7 @@
#include <asm/machdep.h>
#include <asm/machdep.h>
#include <asm/cputable.h>
#include <asm/cputable.h>
#include <asm/tlb.h>
#include <asm/tlb.h>
#include <asm/spu.h>
#include <linux/sysctl.h>
#include <linux/sysctl.h>
...
@@ -513,6 +514,9 @@ int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff)
...
@@ -513,6 +514,9 @@ int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff)
if
((
addr
+
len
)
>
0x100000000UL
)
if
((
addr
+
len
)
>
0x100000000UL
)
err
=
open_high_hpage_areas
(
current
->
mm
,
err
=
open_high_hpage_areas
(
current
->
mm
,
HTLB_AREA_MASK
(
addr
,
len
));
HTLB_AREA_MASK
(
addr
,
len
));
#ifdef CONFIG_SPE_BASE
spu_flush_all_slbs
(
current
->
mm
);
#endif
if
(
err
)
{
if
(
err
)
{
printk
(
KERN_DEBUG
"prepare_hugepage_range(%lx, %lx)"
printk
(
KERN_DEBUG
"prepare_hugepage_range(%lx, %lx)"
" failed (lowmask: 0x%04hx, highmask: 0x%04hx)
\n
"
,
" failed (lowmask: 0x%04hx, highmask: 0x%04hx)
\n
"
,
...
...
arch/powerpc/platforms/cell/spu_base.c
View file @
f57e8430
...
@@ -38,8 +38,61 @@
...
@@ -38,8 +38,61 @@
const
struct
spu_management_ops
*
spu_management_ops
;
const
struct
spu_management_ops
*
spu_management_ops
;
const
struct
spu_priv1_ops
*
spu_priv1_ops
;
const
struct
spu_priv1_ops
*
spu_priv1_ops
;
static
struct
list_head
spu_list
[
MAX_NUMNODES
];
static
LIST_HEAD
(
spu_full_list
);
static
DEFINE_MUTEX
(
spu_mutex
);
static
spinlock_t
spu_list_lock
=
SPIN_LOCK_UNLOCKED
;
EXPORT_SYMBOL_GPL
(
spu_priv1_ops
);
EXPORT_SYMBOL_GPL
(
spu_priv1_ops
);
void
spu_invalidate_slbs
(
struct
spu
*
spu
)
{
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
if
(
spu_mfc_sr1_get
(
spu
)
&
MFC_STATE1_RELOCATE_MASK
)
out_be64
(
&
priv2
->
slb_invalidate_all_W
,
0UL
);
}
EXPORT_SYMBOL_GPL
(
spu_invalidate_slbs
);
/* This is called by the MM core when a segment size is changed, to
* request a flush of all the SPEs using a given mm
*/
void
spu_flush_all_slbs
(
struct
mm_struct
*
mm
)
{
struct
spu
*
spu
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
spu_list_lock
,
flags
);
list_for_each_entry
(
spu
,
&
spu_full_list
,
full_list
)
{
if
(
spu
->
mm
==
mm
)
spu_invalidate_slbs
(
spu
);
}
spin_unlock_irqrestore
(
&
spu_list_lock
,
flags
);
}
/* The hack below stinks... try to do something better one of
* these days... Does it even work properly with NR_CPUS == 1 ?
*/
static
inline
void
mm_needs_global_tlbie
(
struct
mm_struct
*
mm
)
{
int
nr
=
(
NR_CPUS
>
1
)
?
NR_CPUS
:
NR_CPUS
+
1
;
/* Global TLBIE broadcast required with SPEs. */
__cpus_setall
(
&
mm
->
cpu_vm_mask
,
nr
);
}
void
spu_associate_mm
(
struct
spu
*
spu
,
struct
mm_struct
*
mm
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
spu_list_lock
,
flags
);
spu
->
mm
=
mm
;
spin_unlock_irqrestore
(
&
spu_list_lock
,
flags
);
if
(
mm
)
mm_needs_global_tlbie
(
mm
);
}
EXPORT_SYMBOL_GPL
(
spu_associate_mm
);
static
int
__spu_trap_invalid_dma
(
struct
spu
*
spu
)
static
int
__spu_trap_invalid_dma
(
struct
spu
*
spu
)
{
{
pr_debug
(
"%s
\n
"
,
__FUNCTION__
);
pr_debug
(
"%s
\n
"
,
__FUNCTION__
);
...
@@ -74,6 +127,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
...
@@ -74,6 +127,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
struct
mm_struct
*
mm
=
spu
->
mm
;
struct
mm_struct
*
mm
=
spu
->
mm
;
u64
esid
,
vsid
,
llp
;
u64
esid
,
vsid
,
llp
;
int
psize
;
pr_debug
(
"%s
\n
"
,
__FUNCTION__
);
pr_debug
(
"%s
\n
"
,
__FUNCTION__
);
...
@@ -90,22 +144,25 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
...
@@ -90,22 +144,25 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
case
USER_REGION_ID
:
case
USER_REGION_ID
:
#ifdef CONFIG_HUGETLB_PAGE
#ifdef CONFIG_HUGETLB_PAGE
if
(
in_hugepage_area
(
mm
->
context
,
ea
))
if
(
in_hugepage_area
(
mm
->
context
,
ea
))
llp
=
mmu_psize_defs
[
mmu_huge_psize
].
sllp
;
psize
=
mmu_huge_psize
;
else
else
#endif
#endif
llp
=
mmu_psize_defs
[
mmu_virtual_psize
].
sllp
;
psize
=
mm
->
context
.
user_psize
;
vsid
=
(
get_vsid
(
mm
->
context
.
id
,
ea
)
<<
SLB_VSID_SHIFT
)
|
vsid
=
(
get_vsid
(
mm
->
context
.
id
,
ea
)
<<
SLB_VSID_SHIFT
)
|
SLB_VSID_USER
|
llp
;
SLB_VSID_USER
;
break
;
break
;
case
VMALLOC_REGION_ID
:
case
VMALLOC_REGION_ID
:
llp
=
mmu_psize_defs
[
mmu_virtual_psize
].
sllp
;
if
(
ea
<
VMALLOC_END
)
psize
=
mmu_vmalloc_psize
;
else
psize
=
mmu_io_psize
;
vsid
=
(
get_kernel_vsid
(
ea
)
<<
SLB_VSID_SHIFT
)
|
vsid
=
(
get_kernel_vsid
(
ea
)
<<
SLB_VSID_SHIFT
)
|
SLB_VSID_KERNEL
|
llp
;
SLB_VSID_KERNEL
;
break
;
break
;
case
KERNEL_REGION_ID
:
case
KERNEL_REGION_ID
:
llp
=
mmu_psize_defs
[
mmu_linear_psize
].
sllp
;
psize
=
mmu_linear_psize
;
vsid
=
(
get_kernel_vsid
(
ea
)
<<
SLB_VSID_SHIFT
)
|
vsid
=
(
get_kernel_vsid
(
ea
)
<<
SLB_VSID_SHIFT
)
|
SLB_VSID_KERNEL
|
llp
;
SLB_VSID_KERNEL
;
break
;
break
;
default:
default:
/* Future: support kernel segments so that drivers
/* Future: support kernel segments so that drivers
...
@@ -114,9 +171,10 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
...
@@ -114,9 +171,10 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
pr_debug
(
"invalid region access at %016lx
\n
"
,
ea
);
pr_debug
(
"invalid region access at %016lx
\n
"
,
ea
);
return
1
;
return
1
;
}
}
llp
=
mmu_psize_defs
[
psize
].
sllp
;
out_be64
(
&
priv2
->
slb_index_W
,
spu
->
slb_replace
);
out_be64
(
&
priv2
->
slb_index_W
,
spu
->
slb_replace
);
out_be64
(
&
priv2
->
slb_vsid_RW
,
vsid
);
out_be64
(
&
priv2
->
slb_vsid_RW
,
vsid
|
llp
);
out_be64
(
&
priv2
->
slb_esid_RW
,
esid
);
out_be64
(
&
priv2
->
slb_esid_RW
,
esid
);
spu
->
slb_replace
++
;
spu
->
slb_replace
++
;
...
@@ -330,10 +388,6 @@ static void spu_free_irqs(struct spu *spu)
...
@@ -330,10 +388,6 @@ static void spu_free_irqs(struct spu *spu)
free_irq
(
spu
->
irqs
[
2
],
spu
);
free_irq
(
spu
->
irqs
[
2
],
spu
);
}
}
static
struct
list_head
spu_list
[
MAX_NUMNODES
];
static
LIST_HEAD
(
spu_full_list
);
static
DEFINE_MUTEX
(
spu_mutex
);
static
void
spu_init_channels
(
struct
spu
*
spu
)
static
void
spu_init_channels
(
struct
spu
*
spu
)
{
{
static
const
struct
{
static
const
struct
{
...
@@ -593,6 +647,7 @@ static int __init create_spu(void *data)
...
@@ -593,6 +647,7 @@ static int __init create_spu(void *data)
struct
spu
*
spu
;
struct
spu
*
spu
;
int
ret
;
int
ret
;
static
int
number
;
static
int
number
;
unsigned
long
flags
;
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
spu
=
kzalloc
(
sizeof
(
*
spu
),
GFP_KERNEL
);
spu
=
kzalloc
(
sizeof
(
*
spu
),
GFP_KERNEL
);
...
@@ -620,8 +675,10 @@ static int __init create_spu(void *data)
...
@@ -620,8 +675,10 @@ static int __init create_spu(void *data)
goto
out_free_irqs
;
goto
out_free_irqs
;
mutex_lock
(
&
spu_mutex
);
mutex_lock
(
&
spu_mutex
);
spin_lock_irqsave
(
&
spu_list_lock
,
flags
);
list_add
(
&
spu
->
list
,
&
spu_list
[
spu
->
node
]);
list_add
(
&
spu
->
list
,
&
spu_list
[
spu
->
node
]);
list_add
(
&
spu
->
full_list
,
&
spu_full_list
);
list_add
(
&
spu
->
full_list
,
&
spu_full_list
);
spin_unlock_irqrestore
(
&
spu_list_lock
,
flags
);
mutex_unlock
(
&
spu_mutex
);
mutex_unlock
(
&
spu_mutex
);
goto
out
;
goto
out
;
...
...
arch/powerpc/platforms/cell/spufs/file.c
View file @
f57e8430
...
@@ -63,8 +63,8 @@ static ssize_t
...
@@ -63,8 +63,8 @@ static ssize_t
spufs_mem_read
(
struct
file
*
file
,
char
__user
*
buffer
,
spufs_mem_read
(
struct
file
*
file
,
char
__user
*
buffer
,
size_t
size
,
loff_t
*
pos
)
size_t
size
,
loff_t
*
pos
)
{
{
int
ret
;
struct
spu_context
*
ctx
=
file
->
private_data
;
struct
spu_context
*
ctx
=
file
->
private_data
;
ssize_t
ret
;
spu_acquire
(
ctx
);
spu_acquire
(
ctx
);
ret
=
__spufs_mem_read
(
ctx
,
buffer
,
size
,
pos
);
ret
=
__spufs_mem_read
(
ctx
,
buffer
,
size
,
pos
);
...
@@ -74,25 +74,29 @@ spufs_mem_read(struct file *file, char __user *buffer,
...
@@ -74,25 +74,29 @@ spufs_mem_read(struct file *file, char __user *buffer,
static
ssize_t
static
ssize_t
spufs_mem_write
(
struct
file
*
file
,
const
char
__user
*
buffer
,
spufs_mem_write
(
struct
file
*
file
,
const
char
__user
*
buffer
,
size_t
size
,
loff_t
*
pos
)
size_t
size
,
loff_t
*
p
p
os
)
{
{
struct
spu_context
*
ctx
=
file
->
private_data
;
struct
spu_context
*
ctx
=
file
->
private_data
;
char
*
local_store
;
char
*
local_store
;
loff_t
pos
=
*
ppos
;
int
ret
;
int
ret
;
size
=
min_t
(
ssize_t
,
LS_SIZE
-
*
pos
,
size
);
if
(
pos
<
0
)
if
(
size
<=
0
)
return
-
EINVAL
;
if
(
pos
>
LS_SIZE
)
return
-
EFBIG
;
return
-
EFBIG
;
*
pos
+=
size
;
if
(
size
>
LS_SIZE
-
pos
)
size
=
LS_SIZE
-
pos
;
spu_acquire
(
ctx
);
spu_acquire
(
ctx
);
local_store
=
ctx
->
ops
->
get_ls
(
ctx
);
local_store
=
ctx
->
ops
->
get_ls
(
ctx
);
ret
=
copy_from_user
(
local_store
+
*
pos
-
size
,
ret
=
copy_from_user
(
local_store
+
pos
,
buffer
,
size
);
buffer
,
size
)
?
-
EFAULT
:
size
;
spu_release
(
ctx
);
spu_release
(
ctx
);
return
ret
;
if
(
ret
)
return
-
EFAULT
;
*
ppos
=
pos
+
size
;
return
size
;
}
}
static
unsigned
long
spufs_mem_mmap_nopfn
(
struct
vm_area_struct
*
vma
,
static
unsigned
long
spufs_mem_mmap_nopfn
(
struct
vm_area_struct
*
vma
,
...
...
arch/powerpc/platforms/cell/spufs/run.c
View file @
f57e8430
...
@@ -143,7 +143,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
...
@@ -143,7 +143,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
int
ret
;
int
ret
;
unsigned
long
runcntl
=
SPU_RUNCNTL_RUNNABLE
;
unsigned
long
runcntl
=
SPU_RUNCNTL_RUNNABLE
;
ret
=
spu_acquire_runnable
(
ctx
,
SPU_ACTIVATE_NOWAKE
);
ret
=
spu_acquire_runnable
(
ctx
,
0
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
...
@@ -155,7 +155,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
...
@@ -155,7 +155,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
spu_release
(
ctx
);
spu_release
(
ctx
);
ret
=
spu_setup_isolated
(
ctx
);
ret
=
spu_setup_isolated
(
ctx
);
if
(
!
ret
)
if
(
!
ret
)
ret
=
spu_acquire_runnable
(
ctx
,
SPU_ACTIVATE_NOWAKE
);
ret
=
spu_acquire_runnable
(
ctx
,
0
);
}
}
/* if userspace has set the runcntrl register (eg, to issue an
/* if userspace has set the runcntrl register (eg, to issue an
...
...
arch/powerpc/platforms/cell/spufs/sched.c
View file @
f57e8430
...
@@ -127,14 +127,6 @@ static void spu_remove_from_active_list(struct spu *spu)
...
@@ -127,14 +127,6 @@ static void spu_remove_from_active_list(struct spu *spu)
mutex_unlock
(
&
spu_prio
->
active_mutex
[
node
]);
mutex_unlock
(
&
spu_prio
->
active_mutex
[
node
]);
}
}
static
inline
void
mm_needs_global_tlbie
(
struct
mm_struct
*
mm
)
{
int
nr
=
(
NR_CPUS
>
1
)
?
NR_CPUS
:
NR_CPUS
+
1
;
/* Global TLBIE broadcast required with SPEs. */
__cpus_setall
(
&
mm
->
cpu_vm_mask
,
nr
);
}
static
BLOCKING_NOTIFIER_HEAD
(
spu_switch_notifier
);
static
BLOCKING_NOTIFIER_HEAD
(
spu_switch_notifier
);
static
void
spu_switch_notify
(
struct
spu
*
spu
,
struct
spu_context
*
ctx
)
static
void
spu_switch_notify
(
struct
spu
*
spu
,
struct
spu_context
*
ctx
)
...
@@ -167,8 +159,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
...
@@ -167,8 +159,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
ctx
->
spu
=
spu
;
ctx
->
spu
=
spu
;
ctx
->
ops
=
&
spu_hw_ops
;
ctx
->
ops
=
&
spu_hw_ops
;
spu
->
pid
=
current
->
pid
;
spu
->
pid
=
current
->
pid
;
spu
->
mm
=
ctx
->
owner
;
spu_associate_mm
(
spu
,
ctx
->
owner
);
mm_needs_global_tlbie
(
spu
->
mm
);
spu
->
ibox_callback
=
spufs_ibox_callback
;
spu
->
ibox_callback
=
spufs_ibox_callback
;
spu
->
wbox_callback
=
spufs_wbox_callback
;
spu
->
wbox_callback
=
spufs_wbox_callback
;
spu
->
stop_callback
=
spufs_stop_callback
;
spu
->
stop_callback
=
spufs_stop_callback
;
...
@@ -205,7 +196,7 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
...
@@ -205,7 +196,7 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
spu
->
stop_callback
=
NULL
;
spu
->
stop_callback
=
NULL
;
spu
->
mfc_callback
=
NULL
;
spu
->
mfc_callback
=
NULL
;
spu
->
dma_callback
=
NULL
;
spu
->
dma_callback
=
NULL
;
spu
->
mm
=
NULL
;
spu
_associate_mm
(
spu
,
NULL
)
;
spu
->
pid
=
0
;
spu
->
pid
=
0
;
ctx
->
ops
=
&
spu_backing_ops
;
ctx
->
ops
=
&
spu_backing_ops
;
ctx
->
spu
=
NULL
;
ctx
->
spu
=
NULL
;
...
@@ -263,7 +254,6 @@ static void spu_prio_wait(struct spu_context *ctx)
...
@@ -263,7 +254,6 @@ static void spu_prio_wait(struct spu_context *ctx)
{
{
DEFINE_WAIT
(
wait
);
DEFINE_WAIT
(
wait
);
set_bit
(
SPU_SCHED_WAKE
,
&
ctx
->
sched_flags
);
prepare_to_wait_exclusive
(
&
ctx
->
stop_wq
,
&
wait
,
TASK_INTERRUPTIBLE
);
prepare_to_wait_exclusive
(
&
ctx
->
stop_wq
,
&
wait
,
TASK_INTERRUPTIBLE
);
if
(
!
signal_pending
(
current
))
{
if
(
!
signal_pending
(
current
))
{
mutex_unlock
(
&
ctx
->
state_mutex
);
mutex_unlock
(
&
ctx
->
state_mutex
);
...
@@ -272,7 +262,6 @@ static void spu_prio_wait(struct spu_context *ctx)
...
@@ -272,7 +262,6 @@ static void spu_prio_wait(struct spu_context *ctx)
}
}
__set_current_state
(
TASK_RUNNING
);
__set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
&
ctx
->
stop_wq
,
&
wait
);
remove_wait_queue
(
&
ctx
->
stop_wq
,
&
wait
);
clear_bit
(
SPU_SCHED_WAKE
,
&
ctx
->
sched_flags
);
}
}
/**
/**
...
@@ -292,7 +281,7 @@ static void spu_reschedule(struct spu *spu)
...
@@ -292,7 +281,7 @@ static void spu_reschedule(struct spu *spu)
best
=
sched_find_first_bit
(
spu_prio
->
bitmap
);
best
=
sched_find_first_bit
(
spu_prio
->
bitmap
);
if
(
best
<
MAX_PRIO
)
{
if
(
best
<
MAX_PRIO
)
{
struct
spu_context
*
ctx
=
spu_grab_context
(
best
);
struct
spu_context
*
ctx
=
spu_grab_context
(
best
);
if
(
ctx
&&
test_bit
(
SPU_SCHED_WAKE
,
&
ctx
->
sched_flags
)
)
if
(
ctx
)
wake_up
(
&
ctx
->
stop_wq
);
wake_up
(
&
ctx
->
stop_wq
);
}
}
spin_unlock
(
&
spu_prio
->
runq_lock
);
spin_unlock
(
&
spu_prio
->
runq_lock
);
...
@@ -414,8 +403,7 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
...
@@ -414,8 +403,7 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
}
}
spu_add_to_rq
(
ctx
);
spu_add_to_rq
(
ctx
);
if
(
!
(
flags
&
SPU_ACTIVATE_NOWAKE
))
spu_prio_wait
(
ctx
);
spu_prio_wait
(
ctx
);
spu_del_from_rq
(
ctx
);
spu_del_from_rq
(
ctx
);
}
while
(
!
signal_pending
(
current
));
}
while
(
!
signal_pending
(
current
));
...
...
arch/powerpc/platforms/cell/spufs/spufs.h
View file @
f57e8430
...
@@ -41,7 +41,7 @@ struct spu_gang;
...
@@ -41,7 +41,7 @@ struct spu_gang;
/* ctx->sched_flags */
/* ctx->sched_flags */
enum
{
enum
{
SPU_SCHED_WAKE
=
0
,
SPU_SCHED_WAKE
=
0
,
/* currently unused */
};
};
struct
spu_context
{
struct
spu_context
{
...
@@ -191,9 +191,7 @@ void spu_forget(struct spu_context *ctx);
...
@@ -191,9 +191,7 @@ void spu_forget(struct spu_context *ctx);
int
spu_acquire_runnable
(
struct
spu_context
*
ctx
,
unsigned
long
flags
);
int
spu_acquire_runnable
(
struct
spu_context
*
ctx
,
unsigned
long
flags
);
void
spu_acquire_saved
(
struct
spu_context
*
ctx
);
void
spu_acquire_saved
(
struct
spu_context
*
ctx
);
int
spu_acquire_exclusive
(
struct
spu_context
*
ctx
);
int
spu_acquire_exclusive
(
struct
spu_context
*
ctx
);
enum
{
SPU_ACTIVATE_NOWAKE
=
1
,
};
int
spu_activate
(
struct
spu_context
*
ctx
,
unsigned
long
flags
);
int
spu_activate
(
struct
spu_context
*
ctx
,
unsigned
long
flags
);
void
spu_deactivate
(
struct
spu_context
*
ctx
);
void
spu_deactivate
(
struct
spu_context
*
ctx
);
void
spu_yield
(
struct
spu_context
*
ctx
);
void
spu_yield
(
struct
spu_context
*
ctx
);
...
...
arch/powerpc/platforms/cell/spufs/switch.c
View file @
f57e8430
...
@@ -468,26 +468,6 @@ static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu)
...
@@ -468,26 +468,6 @@ static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu)
MFC_CNTL_PURGE_DMA_COMPLETE
);
MFC_CNTL_PURGE_DMA_COMPLETE
);
}
}
static
inline
void
save_mfc_slbs
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
{
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
int
i
;
/* Save, Step 29:
* If MFC_SR1[R]='1', save SLBs in CSA.
*/
if
(
spu_mfc_sr1_get
(
spu
)
&
MFC_STATE1_RELOCATE_MASK
)
{
csa
->
priv2
.
slb_index_W
=
in_be64
(
&
priv2
->
slb_index_W
);
for
(
i
=
0
;
i
<
8
;
i
++
)
{
out_be64
(
&
priv2
->
slb_index_W
,
i
);
eieio
();
csa
->
slb_esid_RW
[
i
]
=
in_be64
(
&
priv2
->
slb_esid_RW
);
csa
->
slb_vsid_RW
[
i
]
=
in_be64
(
&
priv2
->
slb_vsid_RW
);
eieio
();
}
}
}
static
inline
void
setup_mfc_sr1
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
static
inline
void
setup_mfc_sr1
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
{
{
/* Save, Step 30:
/* Save, Step 30:
...
@@ -708,20 +688,6 @@ static inline void resume_mfc_queue(struct spu_state *csa, struct spu *spu)
...
@@ -708,20 +688,6 @@ static inline void resume_mfc_queue(struct spu_state *csa, struct spu *spu)
out_be64
(
&
priv2
->
mfc_control_RW
,
MFC_CNTL_RESUME_DMA_QUEUE
);
out_be64
(
&
priv2
->
mfc_control_RW
,
MFC_CNTL_RESUME_DMA_QUEUE
);
}
}
static
inline
void
invalidate_slbs
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
{
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
/* Save, Step 45:
* Restore, Step 19:
* If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All.
*/
if
(
spu_mfc_sr1_get
(
spu
)
&
MFC_STATE1_RELOCATE_MASK
)
{
out_be64
(
&
priv2
->
slb_invalidate_all_W
,
0UL
);
eieio
();
}
}
static
inline
void
get_kernel_slb
(
u64
ea
,
u64
slb
[
2
])
static
inline
void
get_kernel_slb
(
u64
ea
,
u64
slb
[
2
])
{
{
u64
llp
;
u64
llp
;
...
@@ -765,7 +731,7 @@ static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu)
...
@@ -765,7 +731,7 @@ static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu)
* MFC_SR1[R]=1 (in other words, assume that
* MFC_SR1[R]=1 (in other words, assume that
* translation is desired by OS environment).
* translation is desired by OS environment).
*/
*/
invalidate_slbs
(
csa
,
spu
);
spu_invalidate_slbs
(
spu
);
get_kernel_slb
((
unsigned
long
)
&
spu_save_code
[
0
],
code_slb
);
get_kernel_slb
((
unsigned
long
)
&
spu_save_code
[
0
],
code_slb
);
get_kernel_slb
((
unsigned
long
)
csa
->
lscsa
,
lscsa_slb
);
get_kernel_slb
((
unsigned
long
)
csa
->
lscsa
,
lscsa_slb
);
load_mfc_slb
(
spu
,
code_slb
,
0
);
load_mfc_slb
(
spu
,
code_slb
,
0
);
...
@@ -1718,27 +1684,6 @@ static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu)
...
@@ -1718,27 +1684,6 @@ static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu)
}
}
}
}
static
inline
void
restore_mfc_slbs
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
{
struct
spu_priv2
__iomem
*
priv2
=
spu
->
priv2
;
int
i
;
/* Restore, Step 68:
* If MFC_SR1[R]='1', restore SLBs from CSA.
*/
if
(
csa
->
priv1
.
mfc_sr1_RW
&
MFC_STATE1_RELOCATE_MASK
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
out_be64
(
&
priv2
->
slb_index_W
,
i
);
eieio
();
out_be64
(
&
priv2
->
slb_esid_RW
,
csa
->
slb_esid_RW
[
i
]);
out_be64
(
&
priv2
->
slb_vsid_RW
,
csa
->
slb_vsid_RW
[
i
]);
eieio
();
}
out_be64
(
&
priv2
->
slb_index_W
,
csa
->
priv2
.
slb_index_W
);
eieio
();
}
}
static
inline
void
restore_mfc_sr1
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
static
inline
void
restore_mfc_sr1
(
struct
spu_state
*
csa
,
struct
spu
*
spu
)
{
{
/* Restore, Step 69:
/* Restore, Step 69:
...
@@ -1875,7 +1820,6 @@ static void save_csa(struct spu_state *prev, struct spu *spu)
...
@@ -1875,7 +1820,6 @@ static void save_csa(struct spu_state *prev, struct spu *spu)
set_mfc_tclass_id
(
prev
,
spu
);
/* Step 26. */
set_mfc_tclass_id
(
prev
,
spu
);
/* Step 26. */
purge_mfc_queue
(
prev
,
spu
);
/* Step 27. */
purge_mfc_queue
(
prev
,
spu
);
/* Step 27. */
wait_purge_complete
(
prev
,
spu
);
/* Step 28. */
wait_purge_complete
(
prev
,
spu
);
/* Step 28. */
save_mfc_slbs
(
prev
,
spu
);
/* Step 29. */
setup_mfc_sr1
(
prev
,
spu
);
/* Step 30. */
setup_mfc_sr1
(
prev
,
spu
);
/* Step 30. */
save_spu_npc
(
prev
,
spu
);
/* Step 31. */
save_spu_npc
(
prev
,
spu
);
/* Step 31. */
save_spu_privcntl
(
prev
,
spu
);
/* Step 32. */
save_spu_privcntl
(
prev
,
spu
);
/* Step 32. */
...
@@ -1987,7 +1931,7 @@ static void harvest(struct spu_state *prev, struct spu *spu)
...
@@ -1987,7 +1931,7 @@ static void harvest(struct spu_state *prev, struct spu *spu)
reset_spu_privcntl
(
prev
,
spu
);
/* Step 16. */
reset_spu_privcntl
(
prev
,
spu
);
/* Step 16. */
reset_spu_lslr
(
prev
,
spu
);
/* Step 17. */
reset_spu_lslr
(
prev
,
spu
);
/* Step 17. */
setup_mfc_sr1
(
prev
,
spu
);
/* Step 18. */
setup_mfc_sr1
(
prev
,
spu
);
/* Step 18. */
invalidate_slbs
(
prev
,
spu
);
/* Step 19. */
spu_invalidate_slbs
(
spu
);
/* Step 19. */
reset_ch_part1
(
prev
,
spu
);
/* Step 20. */
reset_ch_part1
(
prev
,
spu
);
/* Step 20. */
reset_ch_part2
(
prev
,
spu
);
/* Step 21. */
reset_ch_part2
(
prev
,
spu
);
/* Step 21. */
enable_interrupts
(
prev
,
spu
);
/* Step 22. */
enable_interrupts
(
prev
,
spu
);
/* Step 22. */
...
@@ -2055,7 +1999,7 @@ static void restore_csa(struct spu_state *next, struct spu *spu)
...
@@ -2055,7 +1999,7 @@ static void restore_csa(struct spu_state *next, struct spu *spu)
restore_spu_mb
(
next
,
spu
);
/* Step 65. */
restore_spu_mb
(
next
,
spu
);
/* Step 65. */
check_ppu_mb_stat
(
next
,
spu
);
/* Step 66. */
check_ppu_mb_stat
(
next
,
spu
);
/* Step 66. */
check_ppuint_mb_stat
(
next
,
spu
);
/* Step 67. */
check_ppuint_mb_stat
(
next
,
spu
);
/* Step 67. */
restore_mfc_slbs
(
next
,
spu
);
/*
Step 68. */
spu_invalidate_slbs
(
spu
);
/* Modified
Step 68. */
restore_mfc_sr1
(
next
,
spu
);
/* Step 69. */
restore_mfc_sr1
(
next
,
spu
);
/* Step 69. */
restore_other_spu_access
(
next
,
spu
);
/* Step 70. */
restore_other_spu_access
(
next
,
spu
);
/* Step 70. */
restore_spu_runcntl
(
next
,
spu
);
/* Step 71. */
restore_spu_runcntl
(
next
,
spu
);
/* Step 71. */
...
...
arch/powerpc/platforms/ps3/mm.c
View file @
f57e8430
...
@@ -294,7 +294,7 @@ static int __init ps3_mm_add_memory(void)
...
@@ -294,7 +294,7 @@ static int __init ps3_mm_add_memory(void)
unsigned
long
nr_pages
;
unsigned
long
nr_pages
;
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
return
0
;
return
-
ENODEV
;
BUG_ON
(
!
mem_init_done
);
BUG_ON
(
!
mem_init_done
);
...
...
arch/powerpc/platforms/ps3/system-bus.c
View file @
f57e8430
...
@@ -172,7 +172,7 @@ int __init ps3_system_bus_init(void)
...
@@ -172,7 +172,7 @@ int __init ps3_system_bus_init(void)
int
result
;
int
result
;
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
return
0
;
return
-
ENODEV
;
result
=
bus_register
(
&
ps3_system_bus_type
);
result
=
bus_register
(
&
ps3_system_bus_type
);
BUG_ON
(
result
);
BUG_ON
(
result
);
...
...
drivers/ps3/ps3av.c
View file @
f57e8430
...
@@ -24,6 +24,8 @@
...
@@ -24,6 +24,8 @@
#include <linux/reboot.h>
#include <linux/reboot.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/ioctl.h>
#include <linux/ioctl.h>
#include <asm/firmware.h>
#include <asm/lv1call.h>
#include <asm/lv1call.h>
#include <asm/ps3av.h>
#include <asm/ps3av.h>
#include <asm/ps3.h>
#include <asm/ps3.h>
...
@@ -947,7 +949,12 @@ static struct ps3_vuart_port_driver ps3av_driver = {
...
@@ -947,7 +949,12 @@ static struct ps3_vuart_port_driver ps3av_driver = {
static
int
ps3av_module_init
(
void
)
static
int
ps3av_module_init
(
void
)
{
{
int
error
=
ps3_vuart_port_driver_register
(
&
ps3av_driver
);
int
error
;
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
return
-
ENODEV
;
error
=
ps3_vuart_port_driver_register
(
&
ps3av_driver
);
if
(
error
)
{
if
(
error
)
{
printk
(
KERN_ERR
printk
(
KERN_ERR
"%s: ps3_vuart_port_driver_register failed %d
\n
"
,
"%s: ps3_vuart_port_driver_register failed %d
\n
"
,
...
...
drivers/ps3/sys-manager.c
View file @
f57e8430
...
@@ -22,7 +22,10 @@
...
@@ -22,7 +22,10 @@
#include <linux/module.h>
#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/workqueue.h>
#include <linux/reboot.h>
#include <linux/reboot.h>
#include <asm/firmware.h>
#include <asm/ps3.h>
#include <asm/ps3.h>
#include "vuart.h"
#include "vuart.h"
MODULE_AUTHOR
(
"Sony Corporation"
);
MODULE_AUTHOR
(
"Sony Corporation"
);
...
@@ -598,6 +601,9 @@ static struct ps3_vuart_port_driver ps3_sys_manager = {
...
@@ -598,6 +601,9 @@ static struct ps3_vuart_port_driver ps3_sys_manager = {
static
int
__init
ps3_sys_manager_init
(
void
)
static
int
__init
ps3_sys_manager_init
(
void
)
{
{
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
return
-
ENODEV
;
return
ps3_vuart_port_driver_register
(
&
ps3_sys_manager
);
return
ps3_vuart_port_driver_register
(
&
ps3_sys_manager
);
}
}
...
...
drivers/ps3/vuart.c
View file @
f57e8430
...
@@ -1031,7 +1031,7 @@ int __init ps3_vuart_bus_init(void)
...
@@ -1031,7 +1031,7 @@ int __init ps3_vuart_bus_init(void)
pr_debug
(
"%s:%d:
\n
"
,
__func__
,
__LINE__
);
pr_debug
(
"%s:%d:
\n
"
,
__func__
,
__LINE__
);
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
if
(
!
firmware_has_feature
(
FW_FEATURE_PS3_LV1
))
return
0
;
return
-
ENODEV
;
init_MUTEX
(
&
vuart_bus_priv
.
probe_mutex
);
init_MUTEX
(
&
vuart_bus_priv
.
probe_mutex
);
result
=
bus_register
(
&
ps3_vuart_bus
);
result
=
bus_register
(
&
ps3_vuart_bus
);
...
...
include/asm-powerpc/spu.h
View file @
f57e8430
...
@@ -165,6 +165,13 @@ int spu_irq_class_0_bottom(struct spu *spu);
...
@@ -165,6 +165,13 @@ int spu_irq_class_0_bottom(struct spu *spu);
int
spu_irq_class_1_bottom
(
struct
spu
*
spu
);
int
spu_irq_class_1_bottom
(
struct
spu
*
spu
);
void
spu_irq_setaffinity
(
struct
spu
*
spu
,
int
cpu
);
void
spu_irq_setaffinity
(
struct
spu
*
spu
,
int
cpu
);
extern
void
spu_invalidate_slbs
(
struct
spu
*
spu
);
extern
void
spu_associate_mm
(
struct
spu
*
spu
,
struct
mm_struct
*
mm
);
/* Calls from the memory management to the SPU */
struct
mm_struct
;
extern
void
spu_flush_all_slbs
(
struct
mm_struct
*
mm
);
/* system callbacks from the SPU */
/* system callbacks from the SPU */
struct
spu_syscall_block
{
struct
spu_syscall_block
{
u64
nr_ret
;
u64
nr_ret
;
...
...
include/asm-powerpc/spu_csa.h
View file @
f57e8430
...
@@ -221,8 +221,6 @@ struct spu_priv2_collapsed {
...
@@ -221,8 +221,6 @@ struct spu_priv2_collapsed {
* @spu_chnlcnt_RW: Array of saved channel counts.
* @spu_chnlcnt_RW: Array of saved channel counts.
* @spu_chnldata_RW: Array of saved channel data.
* @spu_chnldata_RW: Array of saved channel data.
* @suspend_time: Time stamp when decrementer disabled.
* @suspend_time: Time stamp when decrementer disabled.
* @slb_esid_RW: Array of saved SLB esid entries.
* @slb_vsid_RW: Array of saved SLB vsid entries.
*
*
* Structure representing the whole of the SPU
* Structure representing the whole of the SPU
* context save area (CSA). This struct contains
* context save area (CSA). This struct contains
...
@@ -245,8 +243,6 @@ struct spu_state {
...
@@ -245,8 +243,6 @@ struct spu_state {
u32
spu_mailbox_data
[
4
];
u32
spu_mailbox_data
[
4
];
u32
pu_mailbox_data
[
1
];
u32
pu_mailbox_data
[
1
];
unsigned
long
suspend_time
;
unsigned
long
suspend_time
;
u64
slb_esid_RW
[
8
];
u64
slb_vsid_RW
[
8
];
spinlock_t
register_lock
;
spinlock_t
register_lock
;
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment