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
8b3c848c
Commit
8b3c848c
authored
Jul 17, 2006
by
Raymond Burns
Committed by
David S. Miller
Jul 21, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SPARC]: Get sun4d SMP building again.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
198c167c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
121 additions
and
78 deletions
+121
-78
arch/sparc/kernel/smp.c
arch/sparc/kernel/smp.c
+89
-7
arch/sparc/kernel/sun4d_smp.c
arch/sparc/kernel/sun4d_smp.c
+32
-71
No files found.
arch/sparc/kernel/smp.c
View file @
8b3c848c
...
@@ -87,6 +87,7 @@ void __cpuinit smp_store_cpu_info(int id)
...
@@ -87,6 +87,7 @@ void __cpuinit smp_store_cpu_info(int id)
void
__init
smp_cpus_done
(
unsigned
int
max_cpus
)
void
__init
smp_cpus_done
(
unsigned
int
max_cpus
)
{
{
extern
void
smp4m_smp_done
(
void
);
extern
void
smp4m_smp_done
(
void
);
extern
void
smp4d_smp_done
(
void
);
unsigned
long
bogosum
=
0
;
unsigned
long
bogosum
=
0
;
int
cpu
,
num
;
int
cpu
,
num
;
...
@@ -100,8 +101,34 @@ void __init smp_cpus_done(unsigned int max_cpus)
...
@@ -100,8 +101,34 @@ void __init smp_cpus_done(unsigned int max_cpus)
num
,
bogosum
/
(
500000
/
HZ
),
num
,
bogosum
/
(
500000
/
HZ
),
(
bogosum
/
(
5000
/
HZ
))
%
100
);
(
bogosum
/
(
5000
/
HZ
))
%
100
);
BUG_ON
(
sparc_cpu_model
!=
sun4m
);
switch
(
sparc_cpu_model
)
{
smp4m_smp_done
();
case
sun4
:
printk
(
"SUN4
\n
"
);
BUG
();
break
;
case
sun4c
:
printk
(
"SUN4C
\n
"
);
BUG
();
break
;
case
sun4m
:
smp4m_smp_done
();
break
;
case
sun4d
:
smp4d_smp_done
();
break
;
case
sun4e
:
printk
(
"SUN4E
\n
"
);
BUG
();
break
;
case
sun4u
:
printk
(
"SUN4U
\n
"
);
BUG
();
break
;
default:
printk
(
"UNKNOWN!
\n
"
);
BUG
();
break
;
};
}
}
void
cpu_panic
(
void
)
void
cpu_panic
(
void
)
...
@@ -267,9 +294,9 @@ int setup_profiling_timer(unsigned int multiplier)
...
@@ -267,9 +294,9 @@ int setup_profiling_timer(unsigned int multiplier)
void
__init
smp_prepare_cpus
(
unsigned
int
max_cpus
)
void
__init
smp_prepare_cpus
(
unsigned
int
max_cpus
)
{
{
extern
void
smp4m_boot_cpus
(
void
);
extern
void
smp4m_boot_cpus
(
void
);
extern
void
smp4d_boot_cpus
(
void
);
int
i
,
cpuid
,
extra
;
int
i
,
cpuid
,
extra
;
BUG_ON
(
sparc_cpu_model
!=
sun4m
);
printk
(
"Entering SMP Mode...
\n
"
);
printk
(
"Entering SMP Mode...
\n
"
);
extra
=
0
;
extra
=
0
;
...
@@ -283,7 +310,34 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
...
@@ -283,7 +310,34 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
smp_store_cpu_info
(
boot_cpu_id
);
smp_store_cpu_info
(
boot_cpu_id
);
smp4m_boot_cpus
();
switch
(
sparc_cpu_model
)
{
case
sun4
:
printk
(
"SUN4
\n
"
);
BUG
();
break
;
case
sun4c
:
printk
(
"SUN4C
\n
"
);
BUG
();
break
;
case
sun4m
:
smp4m_boot_cpus
();
break
;
case
sun4d
:
smp4d_boot_cpus
();
break
;
case
sun4e
:
printk
(
"SUN4E
\n
"
);
BUG
();
break
;
case
sun4u
:
printk
(
"SUN4U
\n
"
);
BUG
();
break
;
default:
printk
(
"UNKNOWN!
\n
"
);
BUG
();
break
;
};
}
}
/* Set this up early so that things like the scheduler can init
/* Set this up early so that things like the scheduler can init
...
@@ -323,9 +377,37 @@ void __init smp_prepare_boot_cpu(void)
...
@@ -323,9 +377,37 @@ void __init smp_prepare_boot_cpu(void)
int
__cpuinit
__cpu_up
(
unsigned
int
cpu
)
int
__cpuinit
__cpu_up
(
unsigned
int
cpu
)
{
{
extern
int
smp4m_boot_one_cpu
(
int
);
extern
int
smp4m_boot_one_cpu
(
int
);
int
ret
;
extern
int
smp4d_boot_one_cpu
(
int
);
int
ret
=
0
;
ret
=
smp4m_boot_one_cpu
(
cpu
);
switch
(
sparc_cpu_model
)
{
case
sun4
:
printk
(
"SUN4
\n
"
);
BUG
();
break
;
case
sun4c
:
printk
(
"SUN4C
\n
"
);
BUG
();
break
;
case
sun4m
:
ret
=
smp4m_boot_one_cpu
(
cpu
);
break
;
case
sun4d
:
ret
=
smp4d_boot_one_cpu
(
cpu
);
break
;
case
sun4e
:
printk
(
"SUN4E
\n
"
);
BUG
();
break
;
case
sun4u
:
printk
(
"SUN4U
\n
"
);
BUG
();
break
;
default:
printk
(
"UNKNOWN!
\n
"
);
BUG
();
break
;
};
if
(
!
ret
)
{
if
(
!
ret
)
{
cpu_set
(
cpu
,
smp_commenced_mask
);
cpu_set
(
cpu
,
smp_commenced_mask
);
...
...
arch/sparc/kernel/sun4d_smp.c
View file @
8b3c848c
...
@@ -43,15 +43,10 @@ extern ctxd_t *srmmu_ctx_table_phys;
...
@@ -43,15 +43,10 @@ extern ctxd_t *srmmu_ctx_table_phys;
extern
void
calibrate_delay
(
void
);
extern
void
calibrate_delay
(
void
);
extern
volatile
int
smp_processors_ready
;
extern
volatile
int
smp_processors_ready
;
extern
int
smp_num_cpus
;
static
int
smp_highest_cpu
;
static
int
smp_highest_cpu
;
extern
volatile
unsigned
long
cpu_callin_map
[
NR_CPUS
];
extern
volatile
unsigned
long
cpu_callin_map
[
NR_CPUS
];
extern
cpuinfo_sparc
cpu_data
[
NR_CPUS
];
extern
cpuinfo_sparc
cpu_data
[
NR_CPUS
];
extern
unsigned
char
boot_cpu_id
;
extern
unsigned
char
boot_cpu_id
;
extern
int
smp_activated
;
extern
volatile
int
__cpu_number_map
[
NR_CPUS
];
extern
volatile
int
__cpu_logical_map
[
NR_CPUS
];
extern
volatile
unsigned
long
ipi_count
;
extern
volatile
int
smp_process_available
;
extern
volatile
int
smp_process_available
;
extern
cpumask_t
smp_commenced_mask
;
extern
cpumask_t
smp_commenced_mask
;
...
@@ -144,6 +139,8 @@ void __init smp4d_callin(void)
...
@@ -144,6 +139,8 @@ void __init smp4d_callin(void)
spin_lock_irqsave
(
&
sun4d_imsk_lock
,
flags
);
spin_lock_irqsave
(
&
sun4d_imsk_lock
,
flags
);
cc_set_imsk
(
cc_get_imsk
()
&
~
0x4000
);
/* Allow PIL 14 as well */
cc_set_imsk
(
cc_get_imsk
()
&
~
0x4000
);
/* Allow PIL 14 as well */
spin_unlock_irqrestore
(
&
sun4d_imsk_lock
,
flags
);
spin_unlock_irqrestore
(
&
sun4d_imsk_lock
,
flags
);
cpu_set
(
cpuid
,
cpu_online_map
);
}
}
extern
void
init_IRQ
(
void
);
extern
void
init_IRQ
(
void
);
...
@@ -160,51 +157,24 @@ extern unsigned long trapbase_cpu3[];
...
@@ -160,51 +157,24 @@ extern unsigned long trapbase_cpu3[];
void
__init
smp4d_boot_cpus
(
void
)
void
__init
smp4d_boot_cpus
(
void
)
{
{
int
cpucount
=
0
;
int
i
,
mid
;
printk
(
"Entering SMP Mode...
\n
"
);
if
(
boot_cpu_id
)
if
(
boot_cpu_id
)
current_set
[
0
]
=
NULL
;
current_set
[
0
]
=
NULL
;
local_irq_enable
();
cpus_clear
(
cpu_present_map
);
/* XXX This whole thing has to go. See sparc64. */
for
(
i
=
0
;
!
cpu_find_by_instance
(
i
,
NULL
,
&
mid
);
i
++
)
cpu_set
(
mid
,
cpu_present_map
);
SMP_PRINTK
((
"cpu_present_map %08lx
\n
"
,
cpus_addr
(
cpu_present_map
)[
0
]));
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
__cpu_number_map
[
i
]
=
-
1
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
__cpu_logical_map
[
i
]
=
-
1
;
__cpu_number_map
[
boot_cpu_id
]
=
0
;
__cpu_logical_map
[
0
]
=
boot_cpu_id
;
current_thread_info
()
->
cpu
=
boot_cpu_id
;
smp_store_cpu_info
(
boot_cpu_id
);
smp_setup_percpu_timer
();
smp_setup_percpu_timer
();
local_flush_cache_all
();
local_flush_cache_all
();
if
(
cpu_find_by_instance
(
1
,
NULL
,
NULL
))
}
return
;
/* Not an MP box. */
SMP_PRINTK
((
"Iterating over CPUs
\n
"
));
int
smp4d_boot_one_cpu
(
int
i
)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
{
if
(
i
==
boot_cpu_id
)
continue
;
if
(
cpu_isset
(
i
,
cpu_present_map
))
{
extern
unsigned
long
sun4d_cpu_startup
;
extern
unsigned
long
sun4d_cpu_startup
;
unsigned
long
*
entry
=
&
sun4d_cpu_startup
;
unsigned
long
*
entry
=
&
sun4d_cpu_startup
;
struct
task_struct
*
p
;
struct
task_struct
*
p
;
int
timeout
;
int
timeout
;
int
no
;
int
cpu_node
;
cpu_find_by_instance
(
i
,
&
cpu_node
,
NULL
);
/* Cook up an idler for this guy. */
/* Cook up an idler for this guy. */
p
=
fork_idle
(
i
);
p
=
fork_idle
(
i
);
cpucount
++
;
current_set
[
i
]
=
task_thread_info
(
p
);
current_set
[
i
]
=
task_thread_info
(
p
);
for
(
no
=
0
;
!
cpu_find_by_instance
(
no
,
NULL
,
&
mid
)
&&
mid
!=
i
;
no
++
)
;
/*
/*
* Initialize the contexts table
* Initialize the contexts table
...
@@ -216,9 +186,9 @@ void __init smp4d_boot_cpus(void)
...
@@ -216,9 +186,9 @@ void __init smp4d_boot_cpus(void)
smp_penguin_ctable
.
reg_size
=
0
;
smp_penguin_ctable
.
reg_size
=
0
;
/* whirrr, whirrr, whirrrrrrrrr... */
/* whirrr, whirrr, whirrrrrrrrr... */
SMP_PRINTK
((
"Starting CPU %d at %p
task %d node %08x
\n
"
,
i
,
entry
,
cpucount
,
cpu_data
(
no
).
prom_node
));
SMP_PRINTK
((
"Starting CPU %d at %p
\n
"
,
i
,
entry
));
local_flush_cache_all
();
local_flush_cache_all
();
prom_startcpu
(
cpu_
data
(
no
).
prom_
node
,
prom_startcpu
(
cpu_node
,
&
smp_penguin_ctable
,
0
,
(
char
*
)
entry
);
&
smp_penguin_ctable
,
0
,
(
char
*
)
entry
);
SMP_PRINTK
((
"prom_startcpu returned :)
\n
"
));
SMP_PRINTK
((
"prom_startcpu returned :)
\n
"
));
...
@@ -230,39 +200,30 @@ void __init smp4d_boot_cpus(void)
...
@@ -230,39 +200,30 @@ void __init smp4d_boot_cpus(void)
udelay
(
200
);
udelay
(
200
);
}
}
if
(
cpu_callin_map
[
i
])
{
if
(
!
(
cpu_callin_map
[
i
]))
{
/* Another "Red Snapper". */
printk
(
"Processor %d is stuck.
\n
"
,
i
);
__cpu_number_map
[
i
]
=
cpucount
;
return
-
ENODEV
;
__cpu_logical_map
[
cpucount
]
=
i
;
}
else
{
cpucount
--
;
printk
(
"Processor %d is stuck.
\n
"
,
i
);
}
}
if
(
!
(
cpu_callin_map
[
i
]))
{
cpu_clear
(
i
,
cpu_present_map
);
__cpu_number_map
[
i
]
=
-
1
;
}
}
}
local_flush_cache_all
();
local_flush_cache_all
();
if
(
cpucount
==
0
)
{
return
0
;
printk
(
"Error: only one Processor found.
\n
"
);
}
cpu_present_map
=
cpumask_of_cpu
(
hard_smp4d_processor_id
());
}
else
{
void
__init
smp4d_smp_done
(
void
)
unsigned
long
bogosum
=
0
;
{
int
i
,
first
;
for_each_present_cpu
(
i
)
{
int
*
prev
;
bogosum
+=
cpu_data
(
i
).
udelay_val
;
smp_highest_cpu
=
i
;
/* setup cpu list for irq rotation */
first
=
0
;
prev
=
&
first
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
if
(
cpu_online
(
i
))
{
*
prev
=
i
;
prev
=
&
cpu_data
(
i
).
next
;
}
}
SMP_PRINTK
((
"Total of %d Processors activated (%lu.%02lu BogoMIPS).
\n
"
,
cpucount
+
1
,
bogosum
/
(
500000
/
HZ
),
(
bogosum
/
(
5000
/
HZ
))
%
100
));
*
prev
=
first
;
printk
(
"Total of %d Processors activated (%lu.%02lu BogoMIPS).
\n
"
,
local_flush_cache_all
();
cpucount
+
1
,
bogosum
/
(
500000
/
HZ
),
(
bogosum
/
(
5000
/
HZ
))
%
100
);
smp_activated
=
1
;
smp_num_cpus
=
cpucount
+
1
;
}
/* Free unneeded trap tables */
/* Free unneeded trap tables */
ClearPageReserved
(
virt_to_page
(
trapbase_cpu1
));
ClearPageReserved
(
virt_to_page
(
trapbase_cpu1
));
...
@@ -334,7 +295,7 @@ void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2,
...
@@ -334,7 +295,7 @@ void smp4d_cross_call(smpfunc_t func, unsigned long arg1, unsigned long arg2,
register
int
i
;
register
int
i
;
mask
=
cpumask_of_cpu
(
hard_smp4d_processor_id
());
mask
=
cpumask_of_cpu
(
hard_smp4d_processor_id
());
cpus_andnot
(
mask
,
cpu_
present
_map
,
mask
);
cpus_andnot
(
mask
,
cpu_
online
_map
,
mask
);
for
(
i
=
0
;
i
<=
high
;
i
++
)
{
for
(
i
=
0
;
i
<=
high
;
i
++
)
{
if
(
cpu_isset
(
i
,
mask
))
{
if
(
cpu_isset
(
i
,
mask
))
{
ccall_info
.
processors_in
[
i
]
=
0
;
ccall_info
.
processors_in
[
i
]
=
0
;
...
...
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