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
2fa182f2
Commit
2fa182f2
authored
Jun 19, 2002
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Sparc64: Update for CPU hotplugging changes.
parent
e170a233
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
221 additions
and
251 deletions
+221
-251
arch/sparc64/kernel/cpu.c
arch/sparc64/kernel/cpu.c
+28
-28
arch/sparc64/kernel/devices.c
arch/sparc64/kernel/devices.c
+2
-2
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/irq.c
+43
-64
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+1
-1
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+105
-80
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sparc64_ksyms.c
+3
-8
arch/sparc64/kernel/starfire.c
arch/sparc64/kernel/starfire.c
+13
-37
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/traps.c
+3
-11
arch/sparc64/solaris/misc.c
arch/sparc64/solaris/misc.c
+2
-3
include/asm-sparc64/hardirq.h
include/asm-sparc64/hardirq.h
+5
-2
include/asm-sparc64/smp.h
include/asm-sparc64/smp.h
+16
-15
No files found.
arch/sparc64/kernel/cpu.c
View file @
2fa182f2
...
@@ -26,9 +26,6 @@ struct cpu_fp_info {
...
@@ -26,9 +26,6 @@ struct cpu_fp_info {
char
*
fp_name
;
char
*
fp_name
;
};
};
/* In order to get the fpu type correct, you need to take the IDPROM's
* machine type value into consideration too. I will fix this.
*/
struct
cpu_fp_info
linux_sparc_fpu
[]
=
{
struct
cpu_fp_info
linux_sparc_fpu
[]
=
{
{
0x17
,
0x10
,
0
,
"UltraSparc I integrated FPU"
},
{
0x17
,
0x10
,
0
,
"UltraSparc I integrated FPU"
},
{
0x22
,
0x10
,
0
,
"UltraSparc II integrated FPU"
},
{
0x22
,
0x10
,
0
,
"UltraSparc II integrated FPU"
},
...
@@ -51,13 +48,8 @@ struct cpu_iu_info linux_sparc_chips[] = {
...
@@ -51,13 +48,8 @@ struct cpu_iu_info linux_sparc_chips[] = {
#define NSPARCCHIPS (sizeof(linux_sparc_chips)/sizeof(struct cpu_iu_info))
#define NSPARCCHIPS (sizeof(linux_sparc_chips)/sizeof(struct cpu_iu_info))
#ifdef CONFIG_SMP
char
*
sparc_cpu_type
[
NR_CPUS
]
=
{
"cpu-oops"
,
};
char
*
sparc_cpu_type
[
64
]
=
{
"cpu-oops"
,
"cpu-oops1"
,
"cpu-oops2"
,
"cpu-oops3"
};
char
*
sparc_fpu_type
[
NR_CPUS
]
=
{
"fpu-oops"
,
};
char
*
sparc_fpu_type
[
64
]
=
{
"fpu-oops"
,
"fpu-oops1"
,
"fpu-oops2"
,
"fpu-oops3"
};
#else
char
*
sparc_cpu_type
[
64
]
=
{
"cpu-oops"
,
};
char
*
sparc_fpu_type
[
64
]
=
{
"fpu-oops"
,
};
#endif
unsigned
int
fsr_storage
;
unsigned
int
fsr_storage
;
...
@@ -72,39 +64,47 @@ void __init cpu_probe(void)
...
@@ -72,39 +64,47 @@ void __init cpu_probe(void)
fprs
=
fprs_read
();
fprs
=
fprs_read
();
fprs_write
(
FPRS_FEF
);
fprs_write
(
FPRS_FEF
);
__asm__
__volatile__
(
"rdpr %%ver, %0; stx %%fsr, [%1]"
:
"=&r"
(
ver
)
:
"r"
(
&
fpu_vers
));
__asm__
__volatile__
(
"rdpr %%ver, %0; stx %%fsr, [%1]"
:
"=&r"
(
ver
)
:
"r"
(
&
fpu_vers
));
fprs_write
(
fprs
);
fprs_write
(
fprs
);
manuf
=
((
ver
>>
48
)
&
0xffff
);
manuf
=
((
ver
>>
48
)
&
0xffff
);
impl
=
((
ver
>>
32
)
&
0xffff
);
impl
=
((
ver
>>
32
)
&
0xffff
);
fpu_vers
=
((
fpu_vers
>>
17
)
&
0x7
);
fpu_vers
=
((
fpu_vers
>>
17
)
&
0x7
);
for
(
i
=
0
;
i
<
NSPARCCHIPS
;
i
++
)
{
for
(
i
=
0
;
i
<
NSPARCCHIPS
;
i
++
)
{
if
(
linux_sparc_chips
[
i
].
manuf
==
manuf
)
if
(
linux_sparc_chips
[
i
].
manuf
==
manuf
)
{
if
(
linux_sparc_chips
[
i
].
impl
==
impl
)
{
if
(
linux_sparc_chips
[
i
].
impl
==
impl
)
{
sparc_cpu_type
[
cpuid
]
=
linux_sparc_chips
[
i
].
cpu_name
;
sparc_cpu_type
[
cpuid
]
=
linux_sparc_chips
[
i
].
cpu_name
;
break
;
break
;
}
}
}
}
}
if
(
i
==
NSPARCCHIPS
)
{
if
(
i
==
NSPARCCHIPS
)
{
printk
(
"DEBUG: manuf = 0x%x impl = 0x%x
\n
"
,
manuf
,
printk
(
"DEBUG: manuf = 0x%x impl = 0x%x
\n
"
,
impl
);
manuf
,
impl
);
sparc_cpu_type
[
cpuid
]
=
"Unknown CPU"
;
sparc_cpu_type
[
cpuid
]
=
"Unknown CPU"
;
}
}
for
(
i
=
0
;
i
<
NSPARCFPU
;
i
++
)
{
for
(
i
=
0
;
i
<
NSPARCFPU
;
i
++
)
{
if
(
linux_sparc_fpu
[
i
].
manuf
==
manuf
&&
linux_sparc_fpu
[
i
].
impl
==
impl
)
if
(
linux_sparc_fpu
[
i
].
manuf
==
manuf
&&
if
(
linux_sparc_fpu
[
i
].
fpu_vers
==
fpu_vers
)
{
linux_sparc_fpu
[
i
].
impl
==
impl
)
{
sparc_fpu_type
[
cpuid
]
=
linux_sparc_fpu
[
i
].
fp_name
;
if
(
linux_sparc_fpu
[
i
].
fpu_vers
==
fpu_vers
)
{
sparc_fpu_type
[
cpuid
]
=
linux_sparc_fpu
[
i
].
fp_name
;
break
;
break
;
}
}
}
}
}
if
(
i
==
NSPARCFPU
)
{
if
(
i
==
NSPARCFPU
)
{
printk
(
"DEBUG: manuf = 0x%x impl = 0x%x fsr.vers = 0x%x
\n
"
,
manuf
,
impl
,
printk
(
"DEBUG: manuf = 0x%x impl = 0x%x fsr.vers = 0x%x
\n
"
,
(
unsigned
)
fpu_vers
);
manuf
,
impl
,
(
unsigned
int
)
fpu_vers
);
sparc_fpu_type
[
cpuid
]
=
"Unknown FPU"
;
sparc_fpu_type
[
cpuid
]
=
"Unknown FPU"
;
}
}
}
}
arch/sparc64/kernel/devices.c
View file @
2fa182f2
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
#include <asm/smp.h>
#include <asm/smp.h>
#include <asm/spitfire.h>
#include <asm/spitfire.h>
struct
prom_cpuinfo
linux_cpus
[
64
]
__initdata
=
{
{
0
}
};
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
]
__initdata
=
{
{
0
}
};
unsigned
prom_cpu_nodes
[
64
];
unsigned
prom_cpu_nodes
[
NR_CPUS
];
int
linux_num_cpus
=
0
;
int
linux_num_cpus
=
0
;
extern
void
cpu_probe
(
void
);
extern
void
cpu_probe
(
void
);
...
...
arch/sparc64/kernel/irq.c
View file @
2fa182f2
...
@@ -122,9 +122,12 @@ int show_interrupts(struct seq_file *p, void *v)
...
@@ -122,9 +122,12 @@ int show_interrupts(struct seq_file *p, void *v)
#ifndef CONFIG_SMP
#ifndef CONFIG_SMP
seq_printf
(
p
,
"%10u "
,
kstat_irqs
(
i
));
seq_printf
(
p
,
"%10u "
,
kstat_irqs
(
i
));
#else
#else
for
(
j
=
0
;
j
<
smp_num_cpus
;
j
++
)
for
(
j
=
0
;
j
<
NR_CPUS
;
j
++
)
{
if
(
!
cpu_online
(
j
))
continue
;
seq_printf
(
p
,
"%10u "
,
seq_printf
(
p
,
"%10u "
,
kstat
.
irqs
[
cpu_logical_map
(
j
)][
i
]);
kstat
.
irqs
[
j
][
i
]);
}
#endif
#endif
seq_printf
(
p
,
" %s:%lx"
,
action
->
name
,
seq_printf
(
p
,
" %s:%lx"
,
action
->
name
,
get_ino_in_irqaction
(
action
));
get_ino_in_irqaction
(
action
));
...
@@ -574,12 +577,18 @@ static void show(char * str)
...
@@ -574,12 +577,18 @@ static void show(char * str)
printk
(
"
\n
%s, CPU %d:
\n
"
,
str
,
cpu
);
printk
(
"
\n
%s, CPU %d:
\n
"
,
str
,
cpu
);
printk
(
"irq: %d [ "
,
irqs_running
());
printk
(
"irq: %d [ "
,
irqs_running
());
for
(
i
=
0
;
i
<
smp_num_cpus
;
i
++
)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
!
cpu_online
(
i
))
continue
;
printk
(
"%u "
,
__brlock_array
[
i
][
BR_GLOBALIRQ_LOCK
]);
printk
(
"%u "
,
__brlock_array
[
i
][
BR_GLOBALIRQ_LOCK
]);
}
printk
(
"]
\n
bh: %d [ "
,
printk
(
"]
\n
bh: %d [ "
,
(
spin_is_locked
(
&
global_bh_lock
)
?
1
:
0
));
(
spin_is_locked
(
&
global_bh_lock
)
?
1
:
0
));
for
(
i
=
0
;
i
<
smp_num_cpus
;
i
++
)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
!
cpu_online
(
i
))
continue
;
printk
(
"%u "
,
local_bh_count
(
i
));
printk
(
"%u "
,
local_bh_count
(
i
));
}
printk
(
"]
\n
"
);
printk
(
"]
\n
"
);
}
}
...
@@ -743,8 +752,9 @@ static inline void redirect_intr(int cpu, struct ino_bucket *bp)
...
@@ -743,8 +752,9 @@ static inline void redirect_intr(int cpu, struct ino_bucket *bp)
unsigned
long
cpu_mask
=
get_smpaff_in_irqaction
(
ap
);
unsigned
long
cpu_mask
=
get_smpaff_in_irqaction
(
ap
);
unsigned
int
buddy
,
ticks
;
unsigned
int
buddy
,
ticks
;
cpu_mask
&=
cpu_online_map
;
if
(
cpu_mask
==
0
)
if
(
cpu_mask
==
0
)
cpu_mask
=
~
0UL
;
cpu_mask
=
cpu_online_map
;
if
(
this_is_starfire
!=
0
||
if
(
this_is_starfire
!=
0
||
bp
->
pil
>=
10
||
current
->
pid
==
0
)
bp
->
pil
>=
10
||
current
->
pid
==
0
)
...
@@ -753,28 +763,23 @@ static inline void redirect_intr(int cpu, struct ino_bucket *bp)
...
@@ -753,28 +763,23 @@ static inline void redirect_intr(int cpu, struct ino_bucket *bp)
/* 'cpu' is the MID (ie. UPAID), calculate the MID
/* 'cpu' is the MID (ie. UPAID), calculate the MID
* of our buddy.
* of our buddy.
*/
*/
buddy
=
cpu_number_map
(
cpu
)
+
1
;
buddy
=
cpu
+
1
;
if
(
buddy
>=
NR_CPUS
||
if
(
buddy
>=
NR_CPUS
)
cpu_logical_map
(
buddy
)
==
-
1
)
buddy
=
0
;
buddy
=
0
;
ticks
=
0
;
ticks
=
0
;
while
((
cpu_mask
&
(
1UL
<<
buddy
))
==
0
)
{
while
((
cpu_mask
&
(
1UL
<<
buddy
))
==
0
)
{
buddy
++
;
if
(
++
buddy
>=
NR_CPUS
)
if
(
buddy
>=
NR_CPUS
||
buddy
=
0
;
cpu_logical_map
(
buddy
)
==
-
1
)
buddy
=
cpu_logical_map
(
0
);
if
(
++
ticks
>
NR_CPUS
)
{
if
(
++
ticks
>
NR_CPUS
)
{
put_smpaff_in_irqaction
(
ap
,
0
);
put_smpaff_in_irqaction
(
ap
,
0
);
goto
out
;
goto
out
;
}
}
}
}
if
(
buddy
==
cpu
_number_map
(
cpu
)
)
if
(
buddy
==
cpu
)
goto
out
;
goto
out
;
buddy
=
cpu_logical_map
(
buddy
);
/* Voo-doo programming. */
/* Voo-doo programming. */
if
(
cpu_data
[
buddy
].
idle_volume
<
FORWARD_VOLUME
)
if
(
cpu_data
[
buddy
].
idle_volume
<
FORWARD_VOLUME
)
goto
out
;
goto
out
;
...
@@ -1140,22 +1145,28 @@ static int retarget_one_irq(struct irqaction *p, int goal_cpu)
...
@@ -1140,22 +1145,28 @@ static int retarget_one_irq(struct irqaction *p, int goal_cpu)
unsigned
long
imap
=
bucket
->
imap
;
unsigned
long
imap
=
bucket
->
imap
;
unsigned
int
tid
;
unsigned
int
tid
;
while
(
!
cpu_online
(
goal_cpu
))
{
if
(
++
goal_cpu
>=
NR_CPUS
)
goal_cpu
=
0
;
}
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
)
{
tid
=
__cpu_logical_map
[
goal_cpu
]
<<
26
;
tid
=
goal_cpu
<<
26
;
tid
&=
IMAP_AID_SAFARI
;
tid
&=
IMAP_AID_SAFARI
;
}
else
if
(
this_is_starfire
==
0
)
{
}
else
if
(
this_is_starfire
==
0
)
{
tid
=
__cpu_logical_map
[
goal_cpu
]
<<
26
;
tid
=
goal_cpu
<<
26
;
tid
&=
IMAP_TID_UPA
;
tid
&=
IMAP_TID_UPA
;
}
else
{
}
else
{
tid
=
(
starfire_translate
(
imap
,
__cpu_logical_map
[
goal_cpu
]
)
<<
26
);
tid
=
(
starfire_translate
(
imap
,
goal_cpu
)
<<
26
);
tid
&=
IMAP_TID_UPA
;
tid
&=
IMAP_TID_UPA
;
}
}
upa_writel
(
tid
|
IMAP_VALID
,
imap
);
upa_writel
(
tid
|
IMAP_VALID
,
imap
);
goal_cpu
++
;
while
(
!
cpu_online
(
goal_cpu
))
{
if
(
goal_cpu
>=
NR_CPUS
||
if
(
++
goal_cpu
>=
NR_CPUS
)
__cpu_logical_map
[
goal_cpu
]
==
-
1
)
goal_cpu
=
0
;
goal_cpu
=
0
;
}
return
goal_cpu
;
return
goal_cpu
;
}
}
...
@@ -1326,38 +1337,6 @@ static unsigned int parse_hex_value (const char *buffer,
...
@@ -1326,38 +1337,6 @@ static unsigned int parse_hex_value (const char *buffer,
return
0
;
return
0
;
}
}
static
unsigned
long
hw_to_logical
(
unsigned
long
mask
)
{
unsigned
long
new_mask
=
0UL
;
int
i
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
mask
&
(
1UL
<<
i
))
{
int
logical
=
cpu_number_map
(
i
);
new_mask
|=
(
1UL
<<
logical
);
}
}
return
new_mask
;
}
static
unsigned
long
logical_to_hw
(
unsigned
long
mask
)
{
unsigned
long
new_mask
=
0UL
;
int
i
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
mask
&
(
1UL
<<
i
))
{
int
hw
=
cpu_logical_map
(
i
);
new_mask
|=
(
1UL
<<
hw
);
}
}
return
new_mask
;
}
static
int
irq_affinity_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
static
int
irq_affinity_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
int
count
,
int
*
eof
,
void
*
data
)
{
{
...
@@ -1365,8 +1344,6 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
...
@@ -1365,8 +1344,6 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
struct
irqaction
*
ap
=
bp
->
irq_info
;
struct
irqaction
*
ap
=
bp
->
irq_info
;
unsigned
long
mask
=
get_smpaff_in_irqaction
(
ap
);
unsigned
long
mask
=
get_smpaff_in_irqaction
(
ap
);
mask
=
logical_to_hw
(
mask
);
if
(
count
<
HEX_DIGITS
+
1
)
if
(
count
<
HEX_DIGITS
+
1
)
return
-
EINVAL
;
return
-
EINVAL
;
return
sprintf
(
page
,
"%016lx
\n
"
,
mask
==
0
?
~
0UL
:
mask
);
return
sprintf
(
page
,
"%016lx
\n
"
,
mask
==
0
?
~
0UL
:
mask
);
...
@@ -1375,14 +1352,11 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
...
@@ -1375,14 +1352,11 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
static
inline
void
set_intr_affinity
(
int
irq
,
unsigned
long
hw_aff
)
static
inline
void
set_intr_affinity
(
int
irq
,
unsigned
long
hw_aff
)
{
{
struct
ino_bucket
*
bp
=
ivector_table
+
irq
;
struct
ino_bucket
*
bp
=
ivector_table
+
irq
;
unsigned
long
aff
=
hw_to_logical
(
hw_aff
);
/*
/* Users specify affinity in terms of hw cpu ids.
* Users specify affinity in terms of cpu ids, which is what
* As soon as we do this, handler_irq() might see and take action.
* is displayed via /proc/cpuinfo. As soon as we do this,
* handler_irq() might see and take action.
*/
*/
put_smpaff_in_irqaction
((
struct
irqaction
*
)
bp
->
irq_info
,
aff
);
put_smpaff_in_irqaction
((
struct
irqaction
*
)
bp
->
irq_info
,
hw_
aff
);
/* Migration is simply done by the next cpu to service this
/* Migration is simply done by the next cpu to service this
* interrupt.
* interrupt.
...
@@ -1393,7 +1367,7 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
...
@@ -1393,7 +1367,7 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
unsigned
long
count
,
void
*
data
)
unsigned
long
count
,
void
*
data
)
{
{
int
irq
=
(
long
)
data
,
full_count
=
count
,
err
;
int
irq
=
(
long
)
data
,
full_count
=
count
,
err
;
unsigned
long
new_value
;
unsigned
long
new_value
,
i
;
err
=
parse_hex_value
(
buffer
,
count
,
&
new_value
);
err
=
parse_hex_value
(
buffer
,
count
,
&
new_value
);
...
@@ -1402,7 +1376,12 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
...
@@ -1402,7 +1376,12 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
* way to make the system unusable accidentally :-) At least
* way to make the system unusable accidentally :-) At least
* one online CPU still has to be targeted.
* one online CPU still has to be targeted.
*/
*/
new_value
&=
cpu_online_map
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
((
new_value
&
(
1UL
<<
i
))
!=
0
&&
!
cpu_online
(
i
))
new_value
&=
~
(
1UL
<<
i
);
}
if
(
!
new_value
)
if
(
!
new_value
)
return
-
EINVAL
;
return
-
EINVAL
;
...
...
arch/sparc64/kernel/setup.c
View file @
2fa182f2
...
@@ -649,7 +649,7 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
...
@@ -649,7 +649,7 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
(
prom_prev
>>
8
)
&
0xff
,
(
prom_prev
>>
8
)
&
0xff
,
prom_prev
&
0xff
,
prom_prev
&
0xff
,
linux_num_cpus
,
linux_num_cpus
,
smp_num_cpus
num_online_cpus
()
#ifndef CONFIG_SMP
#ifndef CONFIG_SMP
,
loops_per_jiffy
/
(
500000
/
HZ
),
,
loops_per_jiffy
/
(
500000
/
HZ
),
(
loops_per_jiffy
/
(
5000
/
HZ
))
%
100
,
(
loops_per_jiffy
/
(
5000
/
HZ
))
%
100
,
...
...
arch/sparc64/kernel/smp.c
View file @
2fa182f2
This diff is collapsed.
Click to expand it.
arch/sparc64/kernel/sparc64_ksyms.c
View file @
2fa182f2
...
@@ -59,7 +59,6 @@ struct poll {
...
@@ -59,7 +59,6 @@ struct poll {
short
revents
;
short
revents
;
};
};
extern
unsigned
prom_cpu_nodes
[
64
];
extern
void
die_if_kernel
(
char
*
str
,
struct
pt_regs
*
regs
);
extern
void
die_if_kernel
(
char
*
str
,
struct
pt_regs
*
regs
);
extern
pid_t
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
);
extern
pid_t
kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
unsigned
long
flags
);
void
_sigpause_common
(
unsigned
int
set
,
struct
pt_regs
*
);
void
_sigpause_common
(
unsigned
int
set
,
struct
pt_regs
*
);
...
@@ -103,7 +102,6 @@ extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
...
@@ -103,7 +102,6 @@ extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
extern
spinlock_t
kernel_flag
;
extern
spinlock_t
kernel_flag
;
extern
int
smp_num_cpus
;
#ifdef CONFIG_DEBUG_SPINLOCK
#ifdef CONFIG_DEBUG_SPINLOCK
extern
void
_do_spin_lock
(
spinlock_t
*
lock
,
char
*
str
);
extern
void
_do_spin_lock
(
spinlock_t
*
lock
,
char
*
str
);
extern
void
_do_spin_unlock
(
spinlock_t
*
lock
);
extern
void
_do_spin_unlock
(
spinlock_t
*
lock
);
...
@@ -149,12 +147,9 @@ EXPORT_SYMBOL_NOVERS(mcount);
...
@@ -149,12 +147,9 @@ EXPORT_SYMBOL_NOVERS(mcount);
/* Per-CPU information table */
/* Per-CPU information table */
EXPORT_SYMBOL
(
cpu_data
);
EXPORT_SYMBOL
(
cpu_data
);
/* Misc SMP information */
/* CPU online map and active count. */
#ifdef CONFIG_SMP
EXPORT_SYMBOL
(
cpu_online_map
);
EXPORT_SYMBOL
(
smp_num_cpus
);
EXPORT_SYMBOL
(
sparc64_num_cpus_online
);
#endif
EXPORT_SYMBOL
(
__cpu_number_map
);
EXPORT_SYMBOL
(
__cpu_logical_map
);
/* Spinlock debugging library, optional. */
/* Spinlock debugging library, optional. */
#ifdef CONFIG_DEBUG_SPINLOCK
#ifdef CONFIG_DEBUG_SPINLOCK
...
...
arch/sparc64/kernel/starfire.c
View file @
2fa182f2
...
@@ -24,37 +24,13 @@ int this_is_starfire = 0;
...
@@ -24,37 +24,13 @@ int this_is_starfire = 0;
void
check_if_starfire
(
void
)
void
check_if_starfire
(
void
)
{
{
int
ssnode
=
prom_finddevice
(
"/ssp-serial"
);
int
ssnode
=
prom_finddevice
(
"/ssp-serial"
);
if
(
ssnode
!=
0
&&
ssnode
!=
-
1
)
if
(
ssnode
!=
0
&&
ssnode
!=
-
1
)
this_is_starfire
=
1
;
this_is_starfire
=
1
;
}
}
void
starfire_cpu_setup
(
void
)
void
starfire_cpu_setup
(
void
)
{
{
if
(
this_is_starfire
)
{
/* Currently, nothing to do. */
/*
* We do this in starfire_translate and xcall_deliver. When we fix our cpu
* arrays to support > 64 processors we can use the real upaid instead
* of the logical cpuid in __cpu_number_map etc, then we can get rid of
* the translations everywhere. - Anton
*/
#if 0
int i;
/*
* Now must fixup cpu MIDs. OBP gave us a logical
* linear cpuid number, not the real upaid.
*/
for(i = 0; i < linux_num_cpus; i++) {
unsigned int mid = linux_cpus[i].mid;
mid = (((mid & 0x3c) << 1) |
((mid & 0x40) >> 4) |
(mid & 0x3));
linux_cpus[i].mid = mid;
}
#endif
}
}
}
int
starfire_hard_smp_processor_id
(
void
)
int
starfire_hard_smp_processor_id
(
void
)
...
@@ -84,7 +60,7 @@ void *starfire_hookup(int upaid)
...
@@ -84,7 +60,7 @@ void *starfire_hookup(int upaid)
unsigned
long
treg_base
,
hwmid
,
i
;
unsigned
long
treg_base
,
hwmid
,
i
;
p
=
kmalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
p
=
kmalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
if
(
!
p
)
{
if
(
!
p
)
{
prom_printf
(
"starfire_hookup: No memory, this is insane.
\n
"
);
prom_printf
(
"starfire_hookup: No memory, this is insane.
\n
"
);
prom_halt
();
prom_halt
();
}
}
...
@@ -95,7 +71,7 @@ void *starfire_hookup(int upaid)
...
@@ -95,7 +71,7 @@ void *starfire_hookup(int upaid)
p
->
hwmid
=
hwmid
;
p
->
hwmid
=
hwmid
;
treg_base
+=
(
hwmid
<<
33UL
);
treg_base
+=
(
hwmid
<<
33UL
);
treg_base
+=
0x200UL
;
treg_base
+=
0x200UL
;
for
(
i
=
0
;
i
<
32
;
i
++
)
{
for
(
i
=
0
;
i
<
32
;
i
++
)
{
p
->
imap_slots
[
i
]
=
0UL
;
p
->
imap_slots
[
i
]
=
0UL
;
p
->
tregs
[
i
]
=
treg_base
+
(
i
*
0x10UL
);
p
->
tregs
[
i
]
=
treg_base
+
(
i
*
0x10UL
);
/* Lets play it safe and not overwrite existing mappings */
/* Lets play it safe and not overwrite existing mappings */
...
@@ -117,20 +93,20 @@ unsigned int starfire_translate(unsigned long imap,
...
@@ -117,20 +93,20 @@ unsigned int starfire_translate(unsigned long imap,
unsigned
int
i
;
unsigned
int
i
;
bus_hwmid
=
(((
unsigned
long
)
imap
)
>>
33
)
&
0x7f
;
bus_hwmid
=
(((
unsigned
long
)
imap
)
>>
33
)
&
0x7f
;
for
(
p
=
sflist
;
p
!=
NULL
;
p
=
p
->
next
)
for
(
p
=
sflist
;
p
!=
NULL
;
p
=
p
->
next
)
if
(
p
->
hwmid
==
bus_hwmid
)
if
(
p
->
hwmid
==
bus_hwmid
)
break
;
break
;
if
(
p
==
NULL
)
{
if
(
p
==
NULL
)
{
prom_printf
(
"XFIRE: Cannot find irqinfo for imap %016lx
\n
"
,
prom_printf
(
"XFIRE: Cannot find irqinfo for imap %016lx
\n
"
,
((
unsigned
long
)
imap
));
((
unsigned
long
)
imap
));
prom_halt
();
prom_halt
();
}
}
for
(
i
=
0
;
i
<
32
;
i
++
)
{
for
(
i
=
0
;
i
<
32
;
i
++
)
{
if
(
p
->
imap_slots
[
i
]
==
imap
||
if
(
p
->
imap_slots
[
i
]
==
imap
||
p
->
imap_slots
[
i
]
==
0UL
)
p
->
imap_slots
[
i
]
==
0UL
)
break
;
break
;
}
}
if
(
i
==
32
)
{
if
(
i
==
32
)
{
printk
(
"starfire_translate: Are you kidding me?
\n
"
);
printk
(
"starfire_translate: Are you kidding me?
\n
"
);
panic
(
"Lucy in the sky...."
);
panic
(
"Lucy in the sky...."
);
}
}
...
@@ -138,8 +114,8 @@ unsigned int starfire_translate(unsigned long imap,
...
@@ -138,8 +114,8 @@ unsigned int starfire_translate(unsigned long imap,
/* map to real upaid */
/* map to real upaid */
upaid
=
(((
upaid
&
0x3c
)
<<
1
)
|
upaid
=
(((
upaid
&
0x3c
)
<<
1
)
|
((
upaid
&
0x40
)
>>
4
)
|
((
upaid
&
0x40
)
>>
4
)
|
(
upaid
&
0x3
));
(
upaid
&
0x3
));
upa_writel
(
upaid
,
p
->
tregs
[
i
]);
upa_writel
(
upaid
,
p
->
tregs
[
i
]);
...
...
arch/sparc64/kernel/traps.c
View file @
2fa182f2
...
@@ -402,7 +402,7 @@ void __init cheetah_ecache_flush_init(void)
...
@@ -402,7 +402,7 @@ void __init cheetah_ecache_flush_init(void)
{
{
unsigned
long
largest_size
,
smallest_linesize
,
order
;
unsigned
long
largest_size
,
smallest_linesize
,
order
;
char
type
[
16
];
char
type
[
16
];
int
node
,
highest_cpu
,
i
;
int
node
,
i
;
/* Scan all cpu device tree nodes, note two values:
/* Scan all cpu device tree nodes, note two values:
* 1) largest E-cache size
* 1) largest E-cache size
...
@@ -458,15 +458,7 @@ void __init cheetah_ecache_flush_init(void)
...
@@ -458,15 +458,7 @@ void __init cheetah_ecache_flush_init(void)
}
}
/* Now allocate error trap reporting scoreboard. */
/* Now allocate error trap reporting scoreboard. */
highest_cpu
=
0
;
node
=
NR_CPUS
*
(
2
*
sizeof
(
struct
cheetah_err_info
));
#ifdef CONFIG_SMP
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
((
1UL
<<
i
)
&
cpu_present_map
)
highest_cpu
=
i
;
}
#endif
highest_cpu
++
;
node
=
highest_cpu
*
(
2
*
sizeof
(
struct
cheetah_err_info
));
for
(
order
=
0
;
order
<
MAX_ORDER
;
order
++
)
{
for
(
order
=
0
;
order
<
MAX_ORDER
;
order
++
)
{
if
((
PAGE_SIZE
<<
order
)
>=
node
)
if
((
PAGE_SIZE
<<
order
)
>=
node
)
break
;
break
;
...
@@ -483,7 +475,7 @@ void __init cheetah_ecache_flush_init(void)
...
@@ -483,7 +475,7 @@ void __init cheetah_ecache_flush_init(void)
/* Mark all AFSRs as invalid so that the trap handler will
/* Mark all AFSRs as invalid so that the trap handler will
* log new new information there.
* log new new information there.
*/
*/
for
(
i
=
0
;
i
<
2
*
highest_cpu
;
i
++
)
for
(
i
=
0
;
i
<
2
*
NR_CPUS
;
i
++
)
cheetah_error_log
[
i
].
afsr
=
CHAFSR_INVALID
;
cheetah_error_log
[
i
].
afsr
=
CHAFSR_INVALID
;
/* Now patch trap tables. */
/* Now patch trap tables. */
...
...
arch/sparc64/solaris/misc.c
View file @
2fa182f2
...
@@ -21,6 +21,7 @@
...
@@ -21,6 +21,7 @@
#include <asm/string.h>
#include <asm/string.h>
#include <asm/oplib.h>
#include <asm/oplib.h>
#include <asm/idprom.h>
#include <asm/idprom.h>
#include <asm/smp.h>
#include "conv.h"
#include "conv.h"
...
@@ -336,8 +337,6 @@ asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count)
...
@@ -336,8 +337,6 @@ asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count)
#define SOLARIS_CONFIG_PHYS_PAGES 26
#define SOLARIS_CONFIG_PHYS_PAGES 26
#define SOLARIS_CONFIG_AVPHYS_PAGES 27
#define SOLARIS_CONFIG_AVPHYS_PAGES 27
extern
unsigned
prom_cpu_nodes
[
NR_CPUS
];
asmlinkage
int
solaris_sysconf
(
int
id
)
asmlinkage
int
solaris_sysconf
(
int
id
)
{
{
switch
(
id
)
{
switch
(
id
)
{
...
@@ -353,7 +352,7 @@ asmlinkage int solaris_sysconf(int id)
...
@@ -353,7 +352,7 @@ asmlinkage int solaris_sysconf(int id)
"clock-frequency"
,
167000000
);
"clock-frequency"
,
167000000
);
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
case
SOLARIS_CONFIG_NPROC_CONF
:
return
NR_CPUS
;
case
SOLARIS_CONFIG_NPROC_CONF
:
return
NR_CPUS
;
case
SOLARIS_CONFIG_NPROC_ONLN
:
return
smp_num_cpus
;
case
SOLARIS_CONFIG_NPROC_ONLN
:
return
num_online_cpus
()
;
#else
#else
case
SOLARIS_CONFIG_NPROC_CONF
:
return
1
;
case
SOLARIS_CONFIG_NPROC_CONF
:
return
1
;
case
SOLARIS_CONFIG_NPROC_ONLN
:
return
1
;
case
SOLARIS_CONFIG_NPROC_ONLN
:
return
1
;
...
...
include/asm-sparc64/hardirq.h
View file @
2fa182f2
...
@@ -64,9 +64,12 @@ static __inline__ int irqs_running(void)
...
@@ -64,9 +64,12 @@ static __inline__ int irqs_running(void)
{
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
smp_num_cpus
;
i
++
)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
local_irq_count
(
cpu_logical_map
(
i
)))
if
(
!
cpu_online
(
i
))
continue
;
if
(
local_irq_count
(
i
))
return
1
;
return
1
;
}
return
0
;
return
0
;
}
}
...
...
include/asm-sparc64/smp.h
View file @
2fa182f2
...
@@ -24,7 +24,8 @@ struct prom_cpuinfo {
...
@@ -24,7 +24,8 @@ struct prom_cpuinfo {
};
};
extern
int
linux_num_cpus
;
/* number of CPUs probed */
extern
int
linux_num_cpus
;
/* number of CPUs probed */
extern
struct
prom_cpuinfo
linux_cpus
[
64
];
extern
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
];
extern
unsigned
int
prom_cpu_nodes
[
NR_CPUS
];
#endif
/* !(__ASSEMBLY__) */
#endif
/* !(__ASSEMBLY__) */
...
@@ -60,9 +61,21 @@ extern cpuinfo_sparc cpu_data[NR_CPUS];
...
@@ -60,9 +61,21 @@ extern cpuinfo_sparc cpu_data[NR_CPUS];
* Private routines/data
* Private routines/data
*/
*/
#include <asm/bitops.h>
#include <asm/atomic.h>
extern
unsigned
char
boot_cpu_id
;
extern
unsigned
char
boot_cpu_id
;
extern
unsigned
long
cpu_present_map
;
extern
unsigned
long
cpu_online_map
;
#define cpu_online_map cpu_present_map
#define cpu_online(cpu) (cpu_online_map & (1UL << (cpu)))
extern
atomic_t
sparc64_num_cpus_online
;
#define num_online_cpus() (atomic_read(&sparc64_num_cpus_online))
static
inline
int
any_online_cpu
(
unsigned
long
mask
)
{
if
((
mask
&=
cpu_online_map
)
!=
0UL
)
return
__ffs
(
mask
);
return
-
1
;
}
/*
/*
* General functions that each host system must provide.
* General functions that each host system must provide.
...
@@ -72,18 +85,6 @@ extern void smp_callin(void);
...
@@ -72,18 +85,6 @@ extern void smp_callin(void);
extern
void
smp_boot_cpus
(
void
);
extern
void
smp_boot_cpus
(
void
);
extern
void
smp_store_cpu_info
(
int
id
);
extern
void
smp_store_cpu_info
(
int
id
);
extern
__volatile__
int
__cpu_number_map
[
NR_CPUS
];
extern
__volatile__
int
__cpu_logical_map
[
NR_CPUS
];
extern
__inline__
int
cpu_logical_map
(
int
cpu
)
{
return
__cpu_logical_map
[
cpu
];
}
extern
__inline__
int
cpu_number_map
(
int
cpu
)
{
return
__cpu_number_map
[
cpu
];
}
extern
__inline__
int
hard_smp_processor_id
(
void
)
extern
__inline__
int
hard_smp_processor_id
(
void
)
{
{
if
(
tlb_type
==
cheetah
)
{
if
(
tlb_type
==
cheetah
)
{
...
...
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