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
8354cc74
Commit
8354cc74
authored
Feb 06, 2004
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ppc32: Cleanup PowerMac SMP support
Add a fix fox machines that don't have HW timebase sync facility
parent
43a0d76a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
39 deletions
+44
-39
arch/ppc/platforms/pmac_smp.c
arch/ppc/platforms/pmac_smp.c
+44
-39
No files found.
arch/ppc/platforms/pmac_smp.c
View file @
8354cc74
...
...
@@ -119,8 +119,7 @@ static unsigned int core99_tb_gpio;
/* Sync flag for HW tb sync */
static
volatile
int
sec_tb_reset
=
0
;
static
void
__init
core99_init_caches
(
int
cpu
)
static
void
__init
core99_init_caches
(
int
cpu
)
{
if
(
!
(
cur_cpu_spec
[
0
]
->
cpu_features
&
CPU_FTR_L2CR
))
return
;
...
...
@@ -188,8 +187,7 @@ static inline void psurge_clr_ipi(int cpu)
*/
static
unsigned
long
psurge_smp_message
[
NR_CPUS
];
void
__pmac
psurge_smp_message_recv
(
struct
pt_regs
*
regs
)
void
__pmac
psurge_smp_message_recv
(
struct
pt_regs
*
regs
)
{
int
cpu
=
smp_processor_id
();
int
msg
;
...
...
@@ -206,15 +204,14 @@ psurge_smp_message_recv(struct pt_regs *regs)
smp_message_recv
(
msg
,
regs
);
}
irqreturn_t
__pmac
psurge_primary_intr
(
int
irq
,
void
*
d
,
struct
pt_regs
*
regs
)
irqreturn_t
__pmac
psurge_primary_intr
(
int
irq
,
void
*
d
,
struct
pt_regs
*
regs
)
{
psurge_smp_message_recv
(
regs
);
return
IRQ_HANDLED
;
}
static
void
__pmac
smp_psurge_message_pass
(
int
target
,
int
msg
,
unsigned
long
data
,
int
wait
)
static
void
__pmac
smp_psurge_message_pass
(
int
target
,
int
msg
,
unsigned
long
data
,
int
wait
)
{
int
i
;
...
...
@@ -410,8 +407,7 @@ static void __init psurge_dual_sync_tb(int cpu_nr)
smp_tb_synchronized
=
1
;
}
static
void
__init
smp_psurge_setup_cpu
(
int
cpu_nr
)
static
void
__init
smp_psurge_setup_cpu
(
int
cpu_nr
)
{
if
(
cpu_nr
==
0
)
{
...
...
@@ -435,41 +431,54 @@ smp_psurge_setup_cpu(int cpu_nr)
psurge_dual_sync_tb
(
cpu_nr
);
}
void
__init
smp_psurge_take_timebase
(
void
)
void
__init
smp_psurge_take_timebase
(
void
)
{
/* Dummy implementation */
}
void
__init
smp_psurge_give_timebase
(
void
)
void
__init
smp_psurge_give_timebase
(
void
)
{
/* Dummy implementation */
}
static
int
__init
smp_core99_probe
(
void
)
static
int
__init
smp_core99_probe
(
void
)
{
#ifdef CONFIG_6xx
extern
int
powersave_nap
;
struct
device_node
*
cpus
;
int
i
,
ncpus
=
1
;
#endif
struct
device_node
*
cpus
,
*
firstcpu
;
int
i
,
ncpus
=
0
,
boot_cpu
=
-
1
;
u32
*
tbprop
;
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"smp_core99_probe"
,
0x345
);
cpus
=
find_type_devices
(
"cpu"
);
if
(
cpus
==
NULL
)
return
0
;
tbprop
=
(
u32
*
)
get_property
(
cpus
,
"timebase-enable"
,
NULL
);
if
(
tbprop
)
core99_tb_gpio
=
*
tbprop
;
else
core99_tb_gpio
=
KL_GPIO_TB_ENABLE
;
cpus
=
firstcpu
=
find_type_devices
(
"cpu"
);
while
(
cpus
!=
NULL
)
{
u32
*
regprop
=
(
u32
*
)
get_property
(
cpus
,
"reg"
,
NULL
);
char
*
stateprop
=
(
char
*
)
get_property
(
cpus
,
"state"
,
NULL
);
if
(
regprop
!=
NULL
&&
stateprop
!=
NULL
&&
!
strncmp
(
stateprop
,
"running"
,
7
))
boot_cpu
=
*
regprop
;
++
ncpus
;
cpus
=
cpus
->
next
;
}
if
(
boot_cpu
==
-
1
)
printk
(
KERN_WARNING
"Couldn't detect boot CPU !
\n
"
);
if
(
boot_cpu
!=
0
)
printk
(
KERN_WARNING
"Boot CPU is %d, unsupported setup !
\n
"
,
boot_cpu
);
while
((
cpus
=
cpus
->
next
)
!=
NULL
)
++
ncpu
s
;
if
(
machine_is_compatible
(
"MacRISC4"
))
{
extern
struct
smp_ops_t
core99_smp_op
s
;
printk
(
"smp_core99_probe: found %d cpus
\n
"
,
ncpus
);
core99_smp_ops
.
take_timebase
=
smp_generic_take_timebase
;
core99_smp_ops
.
give_timebase
=
smp_generic_give_timebase
;
}
else
{
if
(
firstcpu
!=
NULL
)
tbprop
=
(
u32
*
)
get_property
(
firstcpu
,
"timebase-enable"
,
NULL
);
if
(
tbprop
)
core99_tb_gpio
=
*
tbprop
;
else
core99_tb_gpio
=
KL_GPIO_TB_ENABLE
;
}
if
(
ncpus
>
1
)
{
openpic_request_IPIs
();
...
...
@@ -484,8 +493,7 @@ smp_core99_probe(void)
return
ncpus
;
}
static
void
__init
smp_core99_kick_cpu
(
int
nr
)
static
void
__init
smp_core99_kick_cpu
(
int
nr
)
{
unsigned
long
save_vector
,
new_vector
;
unsigned
long
flags
;
...
...
@@ -539,10 +547,9 @@ smp_core99_kick_cpu(int nr)
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"smp_core99_kick_cpu done"
,
0x347
);
}
static
void
__init
smp_core99_setup_cpu
(
int
cpu_nr
)
static
void
__init
smp_core99_setup_cpu
(
int
cpu_nr
)
{
/* Setup
some registers
*/
/* Setup
L2/L3
*/
if
(
cpu_nr
!=
0
)
core99_init_caches
(
cpu_nr
);
...
...
@@ -554,8 +561,7 @@ smp_core99_setup_cpu(int cpu_nr)
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"core99_setup_cpu 0 done"
,
0x349
);
}
void
__init
smp_core99_take_timebase
(
void
)
void
__init
smp_core99_take_timebase
(
void
)
{
/* Secondary processor "takes" the timebase by freezing
* it, resetting its local TB and telling CPU 0 to go on
...
...
@@ -572,8 +578,7 @@ smp_core99_take_timebase(void)
sec_tb_reset
=
1
;
}
void
__init
smp_core99_give_timebase
(
void
)
void
__init
smp_core99_give_timebase
(
void
)
{
unsigned
int
t
;
...
...
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