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
nexedi
linux
Commits
3cd7613e
Commit
3cd7613e
authored
Dec 20, 2006
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'cell-merge' of master.kernel.org:/pub/scm/linux/kernel/git/arnd/cell-2.6
parents
825020c3
4bc19626
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
371 additions
and
87 deletions
+371
-87
arch/powerpc/configs/cell_defconfig
arch/powerpc/configs/cell_defconfig
+314
-44
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/of_platform.c
+1
-0
arch/powerpc/platforms/cell/io-workarounds.c
arch/powerpc/platforms/cell/io-workarounds.c
+1
-1
arch/powerpc/platforms/cell/spu_priv1_mmio.c
arch/powerpc/platforms/cell/spu_priv1_mmio.c
+53
-42
include/asm-powerpc/spu.h
include/asm-powerpc/spu.h
+2
-0
No files found.
arch/powerpc/configs/cell_defconfig
View file @
3cd7613e
This diff is collapsed.
Click to expand it.
arch/powerpc/kernel/of_platform.c
View file @
3cd7613e
...
...
@@ -50,6 +50,7 @@ static struct of_device_id of_default_bus_ids[] = {
{
.
type
=
"plb5"
,
},
{
.
type
=
"plb4"
,
},
{
.
type
=
"opb"
,
},
{
.
type
=
"ebc"
,
},
{},
};
...
...
arch/powerpc/platforms/cell/io-workarounds.c
View file @
3cd7613e
...
...
@@ -37,7 +37,7 @@
*/
#define SPIDER_DISABLE_PREFETCH
#define MAX_SPIDERS
2
#define MAX_SPIDERS
3
static
struct
spider_pci_bus
{
void
__iomem
*
regs
;
...
...
arch/powerpc/platforms/cell/spu_priv1_mmio.c
View file @
3cd7613e
...
...
@@ -37,8 +37,9 @@
#include "interrupt.h"
#include "spu_priv1_mmio.h"
static
DEFINE_MUTEX
(
add_spumem_mutex
);
struct
spu_pdata
{
int
nid
;
struct
device_node
*
devnode
;
struct
spu_priv1
__iomem
*
priv1
;
};
...
...
@@ -56,20 +57,9 @@ struct device_node *spu_devnode(struct spu *spu)
EXPORT_SYMBOL_GPL
(
spu_devnode
);
static
int
__init
find_spu_node_id
(
struct
device_node
*
spe
)
{
const
unsigned
int
*
id
;
struct
device_node
*
cpu
;
cpu
=
spe
->
parent
->
parent
;
id
=
get_property
(
cpu
,
"node-id"
,
NULL
);
return
id
?
*
id
:
0
;
}
static
int
__init
cell_spuprop_present
(
struct
spu
*
spu
,
struct
device_node
*
spe
,
const
char
*
prop
)
{
static
DEFINE_MUTEX
(
add_spumem_mutex
);
const
struct
address_prop
{
unsigned
long
address
;
unsigned
int
len
;
...
...
@@ -87,7 +77,7 @@ static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
start_pfn
=
p
->
address
>>
PAGE_SHIFT
;
nr_pages
=
((
unsigned
long
)
p
->
len
+
PAGE_SIZE
-
1
)
>>
PAGE_SHIFT
;
pgdata
=
NODE_DATA
(
spu
_get_pdata
(
spu
)
->
nid
);
pgdata
=
NODE_DATA
(
spu
->
node
);
zone
=
pgdata
->
node_zones
;
/* XXX rethink locking here */
...
...
@@ -140,6 +130,7 @@ static int __init spu_map_interrupts_old(struct spu *spu,
{
unsigned
int
isrc
;
const
u32
*
tmp
;
int
nid
;
/* Get the interrupt source unit from the device-tree */
tmp
=
get_property
(
np
,
"isrc"
,
NULL
);
...
...
@@ -147,8 +138,15 @@ static int __init spu_map_interrupts_old(struct spu *spu,
return
-
ENODEV
;
isrc
=
tmp
[
0
];
tmp
=
get_property
(
np
->
parent
->
parent
,
"node-id"
,
NULL
);
if
(
!
tmp
)
{
printk
(
KERN_WARNING
"%s: can't find node-id
\n
"
,
__FUNCTION__
);
nid
=
spu
->
node
;
}
else
nid
=
tmp
[
0
];
/* Add the node number */
isrc
|=
spu
->
node
<<
IIC_IRQ_NODE_SHIFT
;
isrc
|=
nid
<<
IIC_IRQ_NODE_SHIFT
;
/* Now map interrupts of all 3 classes */
spu
->
irqs
[
0
]
=
irq_create_mapping
(
NULL
,
IIC_IRQ_CLASS_0
|
isrc
);
...
...
@@ -237,70 +235,88 @@ static int __init spu_map_interrupts(struct spu *spu, struct device_node *np)
return
ret
;
}
static
int
spu_map_resource
(
struct
device_node
*
node
,
int
nr
,
void
__iomem
**
virt
,
unsigned
long
*
phys
)
static
int
spu_map_resource
(
struct
spu
*
spu
,
int
nr
,
void
__iomem
**
virt
,
unsigned
long
*
phys
)
{
struct
device_node
*
np
=
spu_get_pdata
(
spu
)
->
devnode
;
unsigned
long
start_pfn
,
nr_pages
;
struct
pglist_data
*
pgdata
;
struct
zone
*
zone
;
struct
resource
resource
=
{
};
unsigned
long
len
;
int
ret
;
ret
=
of_address_to_resource
(
n
ode
,
nr
,
&
resource
);
ret
=
of_address_to_resource
(
n
p
,
nr
,
&
resource
);
if
(
ret
)
goto
out
;
if
(
phys
)
*
phys
=
resource
.
start
;
*
virt
=
ioremap
(
resource
.
start
,
resource
.
end
-
resource
.
start
);
len
=
resource
.
end
-
resource
.
start
+
1
;
*
virt
=
ioremap
(
resource
.
start
,
len
);
if
(
!*
virt
)
ret
=
-
EINVAL
;
start_pfn
=
resource
.
start
>>
PAGE_SHIFT
;
nr_pages
=
(
len
+
PAGE_SIZE
-
1
)
>>
PAGE_SHIFT
;
pgdata
=
NODE_DATA
(
spu
->
node
);
zone
=
pgdata
->
node_zones
;
/* XXX rethink locking here */
mutex_lock
(
&
add_spumem_mutex
);
ret
=
__add_pages
(
zone
,
start_pfn
,
nr_pages
);
mutex_unlock
(
&
add_spumem_mutex
);
out:
return
ret
;
}
static
int
__init
spu_map_device
(
struct
spu
*
spu
,
struct
device_node
*
node
)
static
int
__init
spu_map_device
(
struct
spu
*
spu
)
{
struct
device_node
*
np
=
spu_get_pdata
(
spu
)
->
devnode
;
int
ret
=
-
ENODEV
;
spu
->
name
=
get_property
(
node
,
"name"
,
NULL
);
spu
->
name
=
get_property
(
np
,
"name"
,
NULL
);
if
(
!
spu
->
name
)
goto
out
;
ret
=
spu_map_resource
(
node
,
0
,
(
void
__iomem
**
)
&
spu
->
local_store
,
&
spu
->
local_store_phys
);
ret
=
spu_map_resource
(
spu
,
0
,
(
void
__iomem
**
)
&
spu
->
local_store
,
&
spu
->
local_store_phys
);
if
(
ret
)
{
pr_debug
(
"spu_new: failed to map %s resource 0
\n
"
,
n
ode
->
full_name
);
n
p
->
full_name
);
goto
out
;
}
ret
=
spu_map_resource
(
node
,
1
,
(
void
__iomem
**
)
&
spu
->
problem
,
&
spu
->
problem_phys
);
ret
=
spu_map_resource
(
spu
,
1
,
(
void
__iomem
**
)
&
spu
->
problem
,
&
spu
->
problem_phys
);
if
(
ret
)
{
pr_debug
(
"spu_new: failed to map %s resource 1
\n
"
,
n
ode
->
full_name
);
n
p
->
full_name
);
goto
out_unmap
;
}
ret
=
spu_map_resource
(
node
,
2
,
(
void
__iomem
**
)
&
spu
->
priv2
,
NULL
);
ret
=
spu_map_resource
(
spu
,
2
,
(
void
__iomem
**
)
&
spu
->
priv2
,
NULL
);
if
(
ret
)
{
pr_debug
(
"spu_new: failed to map %s resource 2
\n
"
,
n
ode
->
full_name
);
n
p
->
full_name
);
goto
out_unmap
;
}
if
(
!
firmware_has_feature
(
FW_FEATURE_LPAR
))
ret
=
spu_map_resource
(
node
,
3
,
(
void
__iomem
**
)
&
spu_get_pdata
(
spu
)
->
priv1
,
NULL
);
ret
=
spu_map_resource
(
spu
,
3
,
(
void
__iomem
**
)
&
spu_get_pdata
(
spu
)
->
priv1
,
NULL
);
if
(
ret
)
{
pr_debug
(
"spu_new: failed to map %s resource 3
\n
"
,
n
ode
->
full_name
);
n
p
->
full_name
);
goto
out_unmap
;
}
pr_debug
(
"spu_new: %s maps:
\n
"
,
n
ode
->
full_name
);
pr_debug
(
"spu_new: %s maps:
\n
"
,
n
p
->
full_name
);
pr_debug
(
" local store : 0x%016lx -> 0x%p
\n
"
,
spu
->
local_store_phys
,
spu
->
local_store
);
pr_debug
(
" problem state : 0x%016lx -> 0x%p
\n
"
,
spu
->
problem_phys
,
spu
->
problem
);
pr_debug
(
" priv2 : 0x%p
\n
"
,
spu
->
priv2
);
pr_debug
(
" priv1 : 0x%p
\n
"
,
spu_get_pdata
(
spu
)
->
priv1
);
spu_get_pdata
(
spu
)
->
priv1
);
return
0
;
...
...
@@ -340,8 +356,9 @@ static int __init of_create_spu(struct spu *spu, void *data)
ret
=
-
ENOMEM
;
goto
out
;
}
spu_get_pdata
(
spu
)
->
devnode
=
of_node_get
(
spe
);
spu
->
node
=
find_spu_node_
id
(
spe
);
spu
->
node
=
of_node_to_n
id
(
spe
);
if
(
spu
->
node
>=
MAX_NUMNODES
)
{
printk
(
KERN_WARNING
"SPE %s on node %d ignored,"
" node number too big
\n
"
,
spe
->
full_name
,
spu
->
node
);
...
...
@@ -350,11 +367,7 @@ static int __init of_create_spu(struct spu *spu, void *data)
goto
out_free
;
}
spu_get_pdata
(
spu
)
->
nid
=
of_node_to_nid
(
spe
);
if
(
spu_get_pdata
(
spu
)
->
nid
==
-
1
)
spu_get_pdata
(
spu
)
->
nid
=
0
;
ret
=
spu_map_device
(
spu
,
spe
);
ret
=
spu_map_device
(
spu
);
/* try old method */
if
(
ret
)
ret
=
spu_map_device_old
(
spu
,
spe
);
...
...
@@ -367,8 +380,6 @@ static int __init of_create_spu(struct spu *spu, void *data)
if
(
ret
)
goto
out_unmap
;
spu_get_pdata
(
spu
)
->
devnode
=
of_node_get
(
spe
);
pr_debug
(
KERN_DEBUG
"Using SPE %s %p %p %p %p %d
\n
"
,
spu
->
name
,
spu
->
local_store
,
spu
->
problem
,
spu_get_pdata
(
spu
)
->
priv1
,
spu
->
priv2
,
spu
->
number
);
...
...
include/asm-powerpc/spu.h
View file @
3cd7613e
...
...
@@ -161,6 +161,7 @@ struct spu_syscall_block {
extern
long
spu_sys_callback
(
struct
spu_syscall_block
*
s
);
/* syscalls implemented in spufs */
struct
file
;
extern
struct
spufs_calls
{
asmlinkage
long
(
*
create_thread
)(
const
char
__user
*
name
,
unsigned
int
flags
,
mode_t
mode
);
...
...
@@ -232,6 +233,7 @@ void spu_remove_sysdev_attr_group(struct attribute_group *attrs);
* to object-id spufs file from user space and the notifer
* function can assume that spu->ctx is valid.
*/
struct
notifier_block
;
int
spu_switch_event_register
(
struct
notifier_block
*
n
);
int
spu_switch_event_unregister
(
struct
notifier_block
*
n
);
...
...
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