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
e81ab60e
Commit
e81ab60e
authored
Aug 19, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
fca35777
53124cd3
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
322 additions
and
338 deletions
+322
-338
arch/sparc64/kernel/cpu.c
arch/sparc64/kernel/cpu.c
+10
-9
arch/sparc64/kernel/devices.c
arch/sparc64/kernel/devices.c
+98
-54
arch/sparc64/kernel/ebus.c
arch/sparc64/kernel/ebus.c
+1
-0
arch/sparc64/kernel/head.S
arch/sparc64/kernel/head.S
+10
-56
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/irq.c
+32
-10
arch/sparc64/kernel/pci_sabre.c
arch/sparc64/kernel/pci_sabre.c
+3
-1
arch/sparc64/kernel/process.c
arch/sparc64/kernel/process.c
+3
-2
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+21
-24
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+61
-44
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sparc64_ksyms.c
+5
-4
arch/sparc64/kernel/time.c
arch/sparc64/kernel/time.c
+7
-23
arch/sparc64/kernel/trampoline.S
arch/sparc64/kernel/trampoline.S
+4
-12
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/traps.c
+15
-16
arch/sparc64/mm/init.c
arch/sparc64/mm/init.c
+4
-0
arch/sparc64/solaris/misc.c
arch/sparc64/solaris/misc.c
+1
-2
drivers/serial/sunsab.c
drivers/serial/sunsab.c
+1
-0
include/asm-generic/cpumask_up.h
include/asm-generic/cpumask_up.h
+5
-5
include/asm-sparc64/cpudata.h
include/asm-sparc64/cpudata.h
+30
-0
include/asm-sparc64/delay.h
include/asm-sparc64/delay.h
+2
-5
include/asm-sparc64/irq.h
include/asm-sparc64/irq.h
+0
-7
include/asm-sparc64/oplib.h
include/asm-sparc64/oplib.h
+4
-0
include/asm-sparc64/pgalloc.h
include/asm-sparc64/pgalloc.h
+2
-1
include/asm-sparc64/processor.h
include/asm-sparc64/processor.h
+0
-1
include/asm-sparc64/smp.h
include/asm-sparc64/smp.h
+3
-58
include/asm-sparc64/timer.h
include/asm-sparc64/timer.h
+0
-4
No files found.
arch/sparc64/kernel/cpu.c
View file @
e81ab60e
...
...
@@ -12,6 +12,9 @@
#include <asm/asi.h>
#include <asm/system.h>
#include <asm/fpumacro.h>
#include <asm/cpudata.h>
DEFINE_PER_CPU
(
cpuinfo_sparc
,
__cpu_data
)
=
{
0
};
struct
cpu_iu_info
{
short
manuf
;
...
...
@@ -52,18 +55,16 @@ struct cpu_iu_info linux_sparc_chips[] = {
#define NSPARCCHIPS (sizeof(linux_sparc_chips)/sizeof(struct cpu_iu_info))
char
*
sparc_cpu_type
[
NR_CPUS
]
=
{
"cpu-oops"
,
}
;
char
*
sparc_fpu_type
[
NR_CPUS
]
=
{
"fpu-oops"
,
}
;
char
*
sparc_cpu_type
=
"cpu-oops"
;
char
*
sparc_fpu_type
=
"fpu-oops"
;
unsigned
int
fsr_storage
;
void
__init
cpu_probe
(
void
)
{
unsigned
long
ver
,
fpu_vers
,
manuf
,
impl
,
fprs
;
int
i
,
cpuid
;
int
i
;
cpuid
=
hard_smp_processor_id
();
fprs
=
fprs_read
();
fprs_write
(
FPRS_FEF
);
__asm__
__volatile__
(
"rdpr %%ver, %0; stx %%fsr, [%1]"
...
...
@@ -80,7 +81,7 @@ void __init cpu_probe(void)
for
(
i
=
0
;
i
<
NSPARCCHIPS
;
i
++
)
{
if
(
linux_sparc_chips
[
i
].
manuf
==
manuf
)
{
if
(
linux_sparc_chips
[
i
].
impl
==
impl
)
{
sparc_cpu_type
[
cpuid
]
=
sparc_cpu_type
=
linux_sparc_chips
[
i
].
cpu_name
;
break
;
}
...
...
@@ -99,14 +100,14 @@ void __init cpu_probe(void)
printk
(
"DEBUG: manuf[%lx] impl[%lx]
\n
"
,
manuf
,
impl
);
}
sparc_cpu_type
[
cpuid
]
=
"Unknown CPU"
;
sparc_cpu_type
=
"Unknown CPU"
;
}
for
(
i
=
0
;
i
<
NSPARCFPU
;
i
++
)
{
if
(
linux_sparc_fpu
[
i
].
manuf
==
manuf
&&
linux_sparc_fpu
[
i
].
impl
==
impl
)
{
if
(
linux_sparc_fpu
[
i
].
fpu_vers
==
fpu_vers
)
{
sparc_fpu_type
[
cpuid
]
=
sparc_fpu_type
=
linux_sparc_fpu
[
i
].
fp_name
;
break
;
}
...
...
@@ -116,6 +117,6 @@ void __init cpu_probe(void)
if
(
i
==
NSPARCFPU
)
{
printk
(
"DEBUG: manuf[%lx] impl[%lx] fsr.vers[%lx]
\n
"
,
manuf
,
impl
,
fpu_vers
);
sparc_fpu_type
[
cpuid
]
=
"Unknown FPU"
;
sparc_fpu_type
=
"Unknown FPU"
;
}
}
arch/sparc64/kernel/devices.c
View file @
e81ab60e
...
...
@@ -11,6 +11,7 @@
#include <linux/ioport.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <linux/errno.h>
#include <asm/page.h>
#include <asm/oplib.h>
...
...
@@ -18,79 +19,122 @@
#include <asm/smp.h>
#include <asm/spitfire.h>
#include <asm/timer.h>
#include <asm/cpudata.h>
/* Used to synchronize acceses to NatSemi SUPER I/O chip configure
* operations in asm/ns87303.h
*/
spinlock_t
ns87303_lock
=
SPIN_LOCK_UNLOCKED
;
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
]
__initdata
=
{
{
0
}
};
unsigned
prom_cpu_nodes
[
NR_CPUS
];
int
linux_num_cpus
=
0
;
extern
void
cpu_probe
(
void
);
extern
void
central_probe
(
void
);
void
__init
device_scan
(
void
)
static
char
*
cpu_mid_prop
(
void
)
{
if
(
tlb_type
==
spitfire
)
return
"upa-portid"
;
return
"portid"
;
}
static
int
check_cpu_node
(
int
nd
,
int
*
cur_inst
,
int
(
*
compare
)(
int
,
int
,
void
*
),
void
*
compare_arg
,
int
*
prom_node
,
int
*
mid
)
{
char
node_str
[
128
];
int
nd
,
prom_node_cpu
,
thismid
;
int
cpu_nds
[
64
];
/* One node for each cpu */
int
cpu_ctr
=
0
;
/* FIX ME FAST... -DaveM */
ioport_resource
.
end
=
0xffffffffffffffffUL
;
prom_getstring
(
nd
,
"device_type"
,
node_str
,
sizeof
(
node_str
));
if
(
strcmp
(
node_str
,
"cpu"
))
return
-
ENODEV
;
prom_getstring
(
prom_root_node
,
"device_type"
,
node_str
,
sizeof
(
node_str
));
if
(
!
compare
(
nd
,
*
cur_inst
,
compare_arg
))
{
if
(
prom_node
)
*
prom_node
=
nd
;
if
(
mid
)
*
mid
=
prom_getintdefault
(
nd
,
cpu_mid_prop
(),
0
);
return
0
;
}
prom_printf
(
"Booting Linux...
\n
"
);
if
(
strcmp
(
node_str
,
"cpu"
)
==
0
)
{
cpu_nds
[
0
]
=
prom_root_node
;
linux_cpus
[
0
].
prom_node
=
prom_root_node
;
linux_cpus
[
0
].
mid
=
0
;
cpu_ctr
++
;
}
else
{
int
scan
;
scan
=
prom_getchild
(
prom_root_node
);
/* prom_printf("root child is %08x\n", (unsigned) scan); */
nd
=
0
;
while
((
scan
=
prom_getsibling
(
scan
))
!=
0
)
{
prom_getstring
(
scan
,
"device_type"
,
node_str
,
sizeof
(
node_str
));
if
(
strcmp
(
node_str
,
"cpu"
)
==
0
)
{
cpu_nds
[
cpu_ctr
]
=
scan
;
linux_cpus
[
cpu_ctr
].
prom_node
=
scan
;
thismid
=
0
;
if
(
tlb_type
==
spitfire
)
{
prom_getproperty
(
scan
,
"upa-portid"
,
(
char
*
)
&
thismid
,
sizeof
(
thismid
));
}
else
if
(
tlb_type
==
cheetah
||
tlb_type
==
cheetah_plus
)
{
prom_getproperty
(
scan
,
"portid"
,
(
char
*
)
&
thismid
,
sizeof
(
thismid
));
}
linux_cpus
[
cpu_ctr
].
mid
=
thismid
;
printk
(
"Found CPU %d (node=%08x,mid=%d)
\n
"
,
cpu_ctr
,
(
unsigned
)
scan
,
thismid
);
cpu_ctr
++
;
}
};
if
(
cpu_ctr
==
0
)
{
prom_printf
(
"No CPU nodes found, cannot continue.
\n
"
);
prom_halt
();
}
printk
(
"Found %d CPU prom device tree node(s).
\n
"
,
cpu_ctr
);
(
*
cur_inst
)
++
;
return
-
ENODEV
;
}
static
int
__cpu_find_by
(
int
(
*
compare
)(
int
,
int
,
void
*
),
void
*
compare_arg
,
int
*
prom_node
,
int
*
mid
)
{
int
nd
,
cur_inst
,
err
;
nd
=
prom_root_node
;
cur_inst
=
0
;
err
=
check_cpu_node
(
nd
,
&
cur_inst
,
compare
,
compare_arg
,
prom_node
,
mid
);
if
(
err
==
0
)
return
0
;
nd
=
prom_getchild
(
nd
);
while
((
nd
=
prom_getsibling
(
nd
))
!=
0
)
{
err
=
check_cpu_node
(
nd
,
&
cur_inst
,
compare
,
compare_arg
,
prom_node
,
mid
);
if
(
err
==
0
)
return
0
;
}
prom_node_cpu
=
cpu_nds
[
0
];
linux_num_cpus
=
cpu_ctr
;
prom_cpu_nodes
[
0
]
=
prom_node_cpu
;
return
-
ENODEV
;
}
static
int
cpu_instance_compare
(
int
nd
,
int
instance
,
void
*
_arg
)
{
int
desired_instance
=
(
int
)
(
long
)
_arg
;
if
(
instance
==
desired_instance
)
return
0
;
return
-
ENODEV
;
}
int
cpu_find_by_instance
(
int
instance
,
int
*
prom_node
,
int
*
mid
)
{
return
__cpu_find_by
(
cpu_instance_compare
,
(
void
*
)(
long
)
instance
,
prom_node
,
mid
);
}
static
int
cpu_mid_compare
(
int
nd
,
int
instance
,
void
*
_arg
)
{
int
desired_mid
=
(
int
)
(
long
)
_arg
;
int
this_mid
;
this_mid
=
prom_getintdefault
(
nd
,
cpu_mid_prop
(),
0
);
if
(
this_mid
==
desired_mid
)
return
0
;
return
-
ENODEV
;
}
int
cpu_find_by_mid
(
int
mid
,
int
*
prom_node
)
{
return
__cpu_find_by
(
cpu_mid_compare
,
(
void
*
)(
long
)
mid
,
prom_node
,
NULL
);
}
void
__init
device_scan
(
void
)
{
/* FIX ME FAST... -DaveM */
ioport_resource
.
end
=
0xffffffffffffffffUL
;
prom_printf
(
"Booting Linux...
\n
"
);
#ifndef CONFIG_SMP
{
up_clock_tick
=
prom_getintdefault
(
prom_node_cpu
,
"clock-frequency"
,
0
);
int
err
,
cpu_node
;
err
=
cpu_find_by_instance
(
0
,
&
cpu_node
,
NULL
);
if
(
err
)
{
prom_printf
(
"No cpu nodes, cannot continue
\n
"
);
prom_halt
();
}
cpu_data
(
0
).
clock_tick
=
prom_getintdefault
(
cpu_node
,
"clock-frequency"
,
0
);
}
#endif
...
...
arch/sparc64/kernel/ebus.c
View file @
e81ab60e
...
...
@@ -13,6 +13,7 @@
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <asm/system.h>
#include <asm/page.h>
...
...
arch/sparc64/kernel/head.S
View file @
e81ab60e
...
...
@@ -628,70 +628,21 @@ spitfire_vpte_base:
#undef KERN_HIGHBITS
#undef KERN_LOWBITS
/
*
Setup
Interrupt
globals
*/
wrpr
%
o1
,
(
PSTATE_IG
|
PSTATE_IE
),
%
pstate
#ifndef CONFIG_SMP
sethi
%
hi
(
__up_workvec
),
%
g5
or
%
g5
,
%
lo
(
__up_workvec
),
%
g6
#else
/
*
By
definition
of
where
we
are
,
this
is
boot_cpu
.
*/
brz
,
pt
%
i0
,
not_starfire
sethi
%
hi
(
0x1fff4000
),
%
g1
or
%
g1
,
%
lo
(
0x1fff4000
),
%
g1
sllx
%
g1
,
12
,
%
g1
or
%
g1
,
0xd0
,
%
g1
lduwa
[%
g1
]
ASI_PHYS_BYPASS_EC_E
,
%
g1
b
,
pt
%
xcc
,
set_worklist
nop
not_starfire
:
BRANCH_IF_JALAPENO
(
g1
,
g5
,
is_jalapeno
)
BRANCH_IF_ANY_CHEETAH
(
g1
,
g5
,
is_cheetah
)
ba
,
pt
%
xcc
,
not_cheetah
nop
is_jalapeno
:
ldxa
[%
g0
]
ASI_JBUS_CONFIG
,
%
g1
srlx
%
g1
,
17
,
%
g1
ba
,
pt
%
xcc
,
set_worklist
and
%
g1
,
0x1f
,
%
g1
!
5
bit
JBUS
ID
is_cheetah
:
ldxa
[%
g0
]
ASI_SAFARI_CONFIG
,
%
g1
srlx
%
g1
,
17
,
%
g1
ba
,
pt
%
xcc
,
set_worklist
and
%
g1
,
0x3ff
,
%
g1
!
10
bit
Safari
Agent
ID
not_cheetah
:
ldxa
[%
g0
]
ASI_UPA_CONFIG
,
%
g1
srlx
%
g1
,
17
,
%
g1
and
%
g1
,
0x1f
,
%
g1
/
*
In
theory
this
is
:
&(
cpu_data
[
boot_cpu_id
]
.
irq_worklists
[
0
])
*/
set_worklist
:
sethi
%
hi
(
cpu_data
),
%
g5
or
%
g5
,
%
lo
(
cpu_data
),
%
g5
sllx
%
g1
,
7
,
%
g1
add
%
g5
,
%
g1
,
%
g5
add
%
g5
,
64
,
%
g6
#endif
/
*
Kill
PROM
timer
*/
sethi
%
hi
(
0x80000000
),
%
g1
sllx
%
g1
,
32
,
%
g1
wr
%
g1
,
0
,
%
tick_cmpr
sethi
%
hi
(
0x80000000
),
%
o2
sllx
%
o2
,
32
,
%
o2
wr
%
o2
,
0
,
%
tick_cmpr
BRANCH_IF_ANY_CHEETAH
(
g1
,
g5
,1
f
)
BRANCH_IF_ANY_CHEETAH
(
o2
,
o3
,1
f
)
ba
,
pt
%
xcc
,
2
f
nop
/
*
Disable
STICK_INT
interrupts
.
*/
1
:
sethi
%
hi
(
0x80000000
),
%
g1
sllx
%
g1
,
32
,
%
g1
wr
%
g1
,
%
asr25
sethi
%
hi
(
0x80000000
),
%
o2
sllx
%
o2
,
32
,
%
o2
wr
%
o2
,
%
asr25
/
*
Ok
,
we
're done setting up all the state our trap mechanims needs,
*
now
get
back
into
normal
globals
and
let
the
PROM
know
what
is
up
.
...
...
@@ -700,6 +651,9 @@ set_worklist:
wrpr
%
g0
,
%
g0
,
%
wstate
wrpr
%
o1
,
PSTATE_IE
,
%
pstate
call
init_irqwork_curcpu
nop
sethi
%
hi
(
sparc64_ttable_tl0
),
%
g5
call
prom_set_trap_table
mov
%
g5
,
%
o0
...
...
arch/sparc64/kernel/irq.c
View file @
e81ab60e
...
...
@@ -36,6 +36,7 @@
#include <asm/starfire.h>
#include <asm/uaccess.h>
#include <asm/cache.h>
#include <asm/cpudata.h>
#ifdef CONFIG_SMP
static
void
distribute_irqs
(
void
);
...
...
@@ -56,12 +57,18 @@ static void distribute_irqs(void);
struct
ino_bucket
ivector_table
[
NUM_IVECS
]
__attribute__
((
aligned
(
SMP_CACHE_BYTES
)));
#ifndef CONFIG_SMP
unsigned
int
__up_workvec
[
16
]
__attribute__
((
aligned
(
SMP_CACHE_BYTES
)));
#define irq_work(__cpu, __pil) &(__up_workvec[(void)(__cpu), (__pil)])
#else
#define irq_work(__cpu, __pil) &(cpu_data[(__cpu)].irq_worklists[(__pil)])
#endif
/* This has to be in the main kernel image, it cannot be
* turned into per-cpu data. The reason is that the main
* kernel image is locked into the TLB and this structure
* is accessed from the vectored interrupt trap handler. If
* access to this structure takes a TLB miss it could cause
* the 5-level sparc v9 trap stack to overflow.
*/
struct
irq_work_struct
{
unsigned
int
irq_worklists
[
16
];
};
struct
irq_work_struct
__irq_work
[
NR_CPUS
];
#define irq_work(__cpu, __pil) &(__irq_work[(__cpu)].irq_worklists[(__pil)])
#ifdef CONFIG_PCI
/* This is a table of physical addresses used to deal with IBF_DMA_SYNC.
...
...
@@ -706,7 +713,7 @@ static inline void redirect_intr(int cpu, struct ino_bucket *bp)
goto
out
;
/* Voo-doo programming. */
if
(
cpu_data
[
buddy
]
.
idle_volume
<
FORWARD_VOLUME
)
if
(
cpu_data
(
buddy
)
.
idle_volume
<
FORWARD_VOLUME
)
goto
out
;
/* This just so happens to be correct on Cheetah
...
...
@@ -1083,15 +1090,30 @@ void enable_prom_timer(void)
prom_timers
->
count0
=
0
;
}
void
init_irqwork_curcpu
(
void
)
{
register
struct
irq_work_struct
*
workp
asm
(
"o2"
);
unsigned
long
tmp
;
memset
(
__irq_work
+
smp_processor_id
(),
0
,
sizeof
(
*
workp
));
/* Set interrupt globals. */
workp
=
&
__irq_work
[
smp_processor_id
()];
__asm__
__volatile__
(
"rdpr %%pstate, %0
\n\t
"
"wrpr %0, %1, %%pstate
\n\t
"
"mov %2, %%g6
\n\t
"
"wrpr %0, 0x0, %%pstate
\n\t
"
:
"=&r"
(
tmp
)
:
"i"
(
PSTATE_IG
|
PSTATE_IE
),
"r"
(
workp
));
}
/* Only invoked on boot processor. */
void
__init
init_IRQ
(
void
)
{
map_prom_timers
();
kill_prom_timer
();
memset
(
&
ivector_table
[
0
],
0
,
sizeof
(
ivector_table
));
#ifndef CONFIG_SMP
memset
(
&
__up_workvec
[
0
],
0
,
sizeof
(
__up_workvec
));
#endif
/* We need to clear any IRQ's pending in the soft interrupt
* registers, a spurious one could be left around from the
...
...
arch/sparc64/kernel/pci_sabre.c
View file @
e81ab60e
...
...
@@ -18,6 +18,7 @@
#include <asm/iommu.h>
#include <asm/irq.h>
#include <asm/smp.h>
#include <asm/oplib.h>
#include "pci_impl.h"
#include "iommu_common.h"
...
...
@@ -1518,11 +1519,12 @@ void __init sabre_init(int pnode, char *model_name)
!
strcmp
(
compat
,
"pci108e,a001"
))
{
hummingbird_p
=
1
;
}
else
{
int
cpu_node
=
linux_cpus
[
0
].
prom_node
;
int
cpu_node
;
/* Of course, Sun has to encode things a thousand
* different ways, inconsistently.
*/
cpu_find_by_instance
(
0
,
&
cpu_node
,
NULL
);
if
(
prom_getproperty
(
cpu_node
,
"name"
,
compat
,
sizeof
(
compat
))
>
0
&&
!
strcmp
(
compat
,
"SUNW,UltraSPARC-IIe"
))
...
...
arch/sparc64/kernel/process.c
View file @
e81ab60e
...
...
@@ -41,6 +41,7 @@
#include <asm/elf.h>
#include <asm/fpumacro.h>
#include <asm/head.h>
#include <asm/cpudata.h>
/* #define VERBOSE_SHOWREGS */
...
...
@@ -84,8 +85,8 @@ int cpu_idle(void)
/*
* the idle loop on a UltraMultiPenguin...
*/
#define idle_me_harder() (cpu_data
[smp_processor_id()]
.idle_volume += 1)
#define unidle_me() (cpu_data
[smp_processor_id()]
.idle_volume = 0)
#define idle_me_harder() (cpu_data
(smp_processor_id())
.idle_volume += 1)
#define unidle_me() (cpu_data
(smp_processor_id())
.idle_volume = 0)
int
cpu_idle
(
void
)
{
set_thread_flag
(
TIF_POLLING_NRFLAG
);
...
...
arch/sparc64/kernel/setup.c
View file @
e81ab60e
...
...
@@ -586,21 +586,15 @@ asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on)
/* BUFFER is PAGE_SIZE bytes long. */
extern
char
*
sparc_cpu_type
[]
;
extern
char
*
sparc_fpu_type
[]
;
extern
char
*
sparc_cpu_type
;
extern
char
*
sparc_fpu_type
;
extern
void
smp_info
(
struct
seq_file
*
);
extern
void
smp_bogo
(
struct
seq_file
*
);
extern
void
mmu_info
(
struct
seq_file
*
);
#ifndef CONFIG_SMP
unsigned
long
up_clock_tick
;
#endif
static
int
show_cpuinfo
(
struct
seq_file
*
m
,
void
*
__unused
)
{
int
cpuid
=
smp_processor_id
();
seq_printf
(
m
,
"cpu
\t\t
: %s
\n
"
"fpu
\t\t
: %s
\n
"
...
...
@@ -614,18 +608,18 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
"Cpu0ClkTck
\t
: %016lx
\n
"
#endif
,
sparc_cpu_type
[
cpuid
]
,
sparc_fpu_type
[
cpuid
]
,
sparc_cpu_type
,
sparc_fpu_type
,
prom_rev
,
prom_prev
>>
16
,
(
prom_prev
>>
8
)
&
0xff
,
prom_prev
&
0xff
,
(
long
)
linux_num_cpus
,
(
long
)
num_possible_cpus
()
,
(
long
)
num_online_cpus
()
#ifndef CONFIG_SMP
,
loops_per_jiffy
/
(
500000
/
HZ
),
(
loops_per_jiffy
/
(
5000
/
HZ
))
%
100
,
up_
clock_tick
,
cpu_data
(
0
).
udelay_val
/
(
500000
/
HZ
),
(
cpu_data
(
0
).
udelay_val
/
(
5000
/
HZ
))
%
100
,
cpu_data
(
0
).
clock_tick
#endif
);
#ifdef CONFIG_SMP
...
...
@@ -680,21 +674,24 @@ void sun_do_break(void)
int
serial_console
;
int
stop_a_enabled
=
1
;
static
struct
cpu
*
sparc64_cpus
;
static
int
__init
topology_init
(
void
)
{
int
i
;
int
i
,
err
;
sparc64_cpus
=
kmalloc
(
NR_CPUS
*
sizeof
(
struct
cpu
),
GFP_KERNEL
);
if
(
!
sparc64_cpus
)
return
-
ENOMEM
;
memset
(
sparc64_cpus
,
0
,
NR_CPUS
*
sizeof
(
struct
cpu
));
err
=
-
ENOMEM
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
cpu_possible
(
i
))
register_cpu
(
&
sparc64_cpus
[
i
],
i
,
NULL
);
if
(
cpu_possible
(
i
))
{
struct
cpu
*
p
=
kmalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
if
(
p
)
{
memset
(
p
,
0
,
sizeof
(
*
p
));
register_cpu
(
p
,
i
,
NULL
);
err
=
0
;
}
}
}
return
0
;
return
err
;
}
subsys_initcall
(
topology_init
);
arch/sparc64/kernel/smp.c
View file @
e81ab60e
...
...
@@ -25,6 +25,7 @@
#include <asm/atomic.h>
#include <asm/tlbflush.h>
#include <asm/mmu_context.h>
#include <asm/cpudata.h>
#include <asm/irq.h>
#include <asm/page.h>
...
...
@@ -41,8 +42,6 @@
extern
int
linux_num_cpus
;
extern
void
calibrate_delay
(
void
);
cpuinfo_sparc
cpu_data
[
NR_CPUS
];
/* Please don't make this stuff initdata!!! --DaveM */
static
unsigned
char
boot_cpu_id
;
...
...
@@ -73,35 +72,29 @@ void smp_bogo(struct seq_file *m)
seq_printf
(
m
,
"Cpu%dBogo
\t
: %lu.%02lu
\n
"
"Cpu%dClkTck
\t
: %016lx
\n
"
,
i
,
cpu_data
[
i
]
.
udelay_val
/
(
500000
/
HZ
),
(
cpu_data
[
i
]
.
udelay_val
/
(
5000
/
HZ
))
%
100
,
i
,
cpu_data
[
i
]
.
clock_tick
);
i
,
cpu_data
(
i
)
.
udelay_val
/
(
500000
/
HZ
),
(
cpu_data
(
i
)
.
udelay_val
/
(
5000
/
HZ
))
%
100
,
i
,
cpu_data
(
i
)
.
clock_tick
);
}
void
__init
smp_store_cpu_info
(
int
id
)
{
int
i
,
no
;
int
cpu_node
;
/* multiplier and counter set by
smp_setup_percpu_timer() */
cpu_data
[
id
].
udelay_val
=
loops_per_jiffy
;
for
(
no
=
0
;
no
<
linux_num_cpus
;
no
++
)
if
(
linux_cpus
[
no
].
mid
==
id
)
break
;
cpu_data
(
id
).
udelay_val
=
loops_per_jiffy
;
cpu_data
[
id
].
clock_tick
=
prom_getintdefault
(
linux_cpus
[
no
].
prom_node
,
cpu_find_by_mid
(
id
,
&
cpu_node
);
cpu_data
(
id
).
clock_tick
=
prom_getintdefault
(
cpu_node
,
"clock-frequency"
,
0
);
cpu_data
[
id
].
pgcache_size
=
0
;
cpu_data
[
id
].
pte_cache
[
0
]
=
NULL
;
cpu_data
[
id
].
pte_cache
[
1
]
=
NULL
;
cpu_data
[
id
].
pgdcache_size
=
0
;
cpu_data
[
id
].
pgd_cache
=
NULL
;
cpu_data
[
id
].
idle_volume
=
1
;
for
(
i
=
0
;
i
<
16
;
i
++
)
cpu_data
[
id
].
irq_worklists
[
i
]
=
0
;
cpu_data
(
id
).
pgcache_size
=
0
;
cpu_data
(
id
).
pte_cache
[
0
]
=
NULL
;
cpu_data
(
id
).
pte_cache
[
1
]
=
NULL
;
cpu_data
(
id
).
pgdcache_size
=
0
;
cpu_data
(
id
).
pgd_cache
=
NULL
;
cpu_data
(
id
).
idle_volume
=
1
;
}
static
void
smp_setup_percpu_timer
(
void
);
...
...
@@ -109,7 +102,6 @@ static void smp_setup_percpu_timer(void);
static
volatile
unsigned
long
callin_flag
=
0
;
extern
void
inherit_locked_prom_mappings
(
int
save_p
);
extern
void
cpu_probe
(
void
);
void
__init
smp_callin
(
void
)
{
...
...
@@ -129,8 +121,6 @@ void __init smp_callin(void)
__flush_cache_all
();
__flush_tlb_all
();
cpu_probe
();
smp_setup_percpu_timer
();
local_irq_enable
();
...
...
@@ -300,8 +290,6 @@ static void smp_synchronize_one_tick(int cpu)
spin_unlock_irqrestore
(
&
itc_sync_lock
,
flags
);
}
extern
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
];
extern
unsigned
long
sparc64_cpu_startup
;
/* The OBP cpu startup callback truncates the 3rd arg cookie to
...
...
@@ -317,7 +305,7 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
unsigned
long
cookie
=
(
unsigned
long
)(
&
cpu_new_thread
);
struct
task_struct
*
p
;
int
timeout
,
no
,
ret
;
int
timeout
,
ret
,
cpu_node
;
kernel_thread
(
NULL
,
NULL
,
CLONE_IDLETASK
);
...
...
@@ -328,19 +316,18 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
unhash_process
(
p
);
callin_flag
=
0
;
for
(
no
=
0
;
no
<
linux_num_cpus
;
no
++
)
if
(
linux_cpus
[
no
].
mid
==
cpu
)
break
;
cpu_new_thread
=
p
->
thread_info
;
cpu_set
(
cpu
,
cpu_callout_map
);
prom_startcpu
(
linux_cpus
[
no
].
prom_node
,
entry
,
cookie
);
cpu_find_by_mid
(
cpu
,
&
cpu_node
);
prom_startcpu
(
cpu_node
,
entry
,
cookie
);
for
(
timeout
=
0
;
timeout
<
5000000
;
timeout
++
)
{
if
(
callin_flag
)
break
;
udelay
(
100
);
}
if
(
callin_flag
)
{
prom_cpu_nodes
[
cpu
]
=
linux_cpus
[
no
].
prom_node
;
ret
=
0
;
}
else
{
printk
(
"Processor %d is stuck.
\n
"
,
cpu
);
...
...
@@ -1048,8 +1035,8 @@ void smp_promstop_others(void)
extern
void
sparc64_do_profile
(
struct
pt_regs
*
regs
);
#define prof_multiplier(__cpu) cpu_data
[(__cpu)]
.multiplier
#define prof_counter(__cpu) cpu_data
[(__cpu)]
.counter
#define prof_multiplier(__cpu) cpu_data
(__cpu)
.multiplier
#define prof_counter(__cpu) cpu_data
(__cpu)
.counter
void
smp_percpu_timer_interrupt
(
struct
pt_regs
*
regs
)
{
...
...
@@ -1141,7 +1128,6 @@ void __init smp_tick_init(void)
}
cpu_set
(
boot_cpu_id
,
cpu_online_map
);
prom_cpu_nodes
[
boot_cpu_id
]
=
linux_cpus
[
0
].
prom_node
;
prof_counter
(
boot_cpu_id
)
=
prof_multiplier
(
boot_cpu_id
)
=
1
;
}
...
...
@@ -1155,6 +1141,7 @@ static void __init smp_tune_scheduling(void)
unsigned
long
orig_flush_base
,
flush_base
,
flags
,
*
p
;
unsigned
int
ecache_size
,
order
;
cycles_t
tick1
,
tick2
,
raw
;
int
cpu_node
;
/* Approximate heuristic for SMP scheduling. It is an
* estimation of the time it takes to flush the L2 cache
...
...
@@ -1172,7 +1159,8 @@ static void __init smp_tune_scheduling(void)
goto
report
;
}
ecache_size
=
prom_getintdefault
(
linux_cpus
[
0
].
prom_node
,
cpu_find_by_instance
(
0
,
&
cpu_node
,
NULL
);
ecache_size
=
prom_getintdefault
(
cpu_node
,
"ecache-size"
,
(
512
*
1024
));
if
(
ecache_size
>
(
4
*
1024
*
1024
))
ecache_size
=
(
4
*
1024
*
1024
);
...
...
@@ -1254,22 +1242,27 @@ int setup_profiling_timer(unsigned int multiplier)
void
__init
smp_prepare_cpus
(
unsigned
int
max_cpus
)
{
int
i
;
int
i
nstance
,
mid
;
for
(
i
=
0
;
i
<
linux_num_cpus
;
i
++
)
{
if
(
linux_cpus
[
i
].
mid
<
max_cpus
)
{
cpu_set
(
linux_cpus
[
i
].
mid
,
phys_cpu_present_map
);
instance
=
0
;
while
(
!
cpu_find_by_instance
(
instance
,
NULL
,
&
mid
))
{
if
(
mid
<
max_cpus
)
{
cpu_set
(
mid
,
phys_cpu_present_map
);
atomic_inc
(
&
sparc64_num_cpus_possible
);
}
instance
++
;
}
if
(
atomic_read
(
&
sparc64_num_cpus_possible
)
>
max_cpus
)
{
for
(
i
=
linux_num_cpus
-
1
;
i
>=
0
;
i
--
)
{
if
(
linux_cpus
[
i
].
mid
!=
boot_cpu_id
)
{
cpu_clear
(
linux_cpus
[
i
].
mid
,
phys_cpu_present_map
);
instance
=
0
;
while
(
!
cpu_find_by_instance
(
instance
,
NULL
,
&
mid
))
{
if
(
mid
!=
boot_cpu_id
)
{
cpu_clear
(
mid
,
phys_cpu_present_map
);
atomic_dec
(
&
sparc64_num_cpus_possible
);
if
(
atomic_read
(
&
sparc64_num_cpus_possible
)
<=
max_cpus
)
break
;
}
instance
++
;
}
}
...
...
@@ -1306,7 +1299,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
cpu_online
(
i
))
bogosum
+=
cpu_data
[
i
]
.
udelay_val
;
bogosum
+=
cpu_data
(
i
)
.
udelay_val
;
}
printk
(
"Total of %ld processors activated "
"(%lu.%02lu BogoMIPS).
\n
"
,
...
...
@@ -1319,3 +1312,27 @@ void __init smp_cpus_done(unsigned int max_cpus)
*/
smp_tune_scheduling
();
}
/* This needn't do anything as we do not sleep the cpu
* inside of the idler task, so an interrupt is not needed
* to get a clean fast response.
*
* XXX Reverify this assumption... -DaveM
*
* Addendum: We do want it to do something for the signal
* delivery case, we detect that by just seeing
* if we are trying to send this to an idler or not.
*/
void
smp_send_reschedule
(
int
cpu
)
{
if
(
cpu_data
(
cpu
).
idle_volume
==
0
)
smp_receive_signal
(
cpu
);
}
/* This is a nop because we capture all other cpus
* anyways when making the PROM active.
*/
void
smp_send_stop
(
void
)
{
}
arch/sparc64/kernel/sparc64_ksyms.c
View file @
e81ab60e
...
...
@@ -21,6 +21,7 @@
#include <linux/fs_struct.h>
#include <linux/mm.h>
#include <linux/socket.h>
#include <linux/percpu.h>
#include <net/compat.h>
#include <asm/oplib.h>
...
...
@@ -55,6 +56,7 @@
#include <asm/a.out.h>
#include <asm/ns87303.h>
#include <asm/timer.h>
#include <asm/cpudata.h>
struct
poll
{
int
fd
;
...
...
@@ -124,6 +126,9 @@ extern void xor_vis_4(unsigned long, unsigned long *, unsigned long *,
extern
void
xor_vis_5
(
unsigned
long
,
unsigned
long
*
,
unsigned
long
*
,
unsigned
long
*
,
unsigned
long
*
,
unsigned
long
*
);
/* Per-CPU information table */
EXPORT_PER_CPU_SYMBOL
(
__cpu_data
);
/* used by various drivers */
#ifdef CONFIG_SMP
#ifndef CONFIG_DEBUG_SPINLOCK
...
...
@@ -142,9 +147,6 @@ extern void mcount(void);
EXPORT_SYMBOL_NOVERS
(
mcount
);
#endif
/* Per-CPU information table */
EXPORT_SYMBOL
(
cpu_data
);
/* CPU online map and active count. */
EXPORT_SYMBOL
(
cpu_online_map
);
EXPORT_SYMBOL
(
phys_cpu_present_map
);
...
...
@@ -320,7 +322,6 @@ EXPORT_SYMBOL(sys_getegid);
EXPORT_SYMBOL
(
sys_getgid
);
EXPORT_SYMBOL
(
svr4_getcontext
);
EXPORT_SYMBOL
(
svr4_setcontext
);
EXPORT_SYMBOL
(
prom_cpu_nodes
);
EXPORT_SYMBOL
(
sys_ioctl
);
EXPORT_SYMBOL
(
compat_sys_ioctl
);
EXPORT_SYMBOL
(
sparc32_open
);
...
...
arch/sparc64/kernel/time.c
View file @
e81ab60e
...
...
@@ -42,6 +42,7 @@
#include <asm/starfire.h>
#include <asm/smp.h>
#include <asm/sections.h>
#include <asm/cpudata.h>
spinlock_t
mostek_lock
=
SPIN_LOCK_UNLOCKED
;
spinlock_t
rtc_lock
=
SPIN_LOCK_UNLOCKED
;
...
...
@@ -956,7 +957,7 @@ static unsigned long sparc64_init_timers(irqreturn_t (*cfunc)(int, void *, struc
clock
=
prom_getint
(
node
,
"stick-frequency"
);
}
else
{
tick_ops
=
&
tick_operations
;
node
=
linux_cpus
[
0
].
prom_node
;
cpu_find_by_instance
(
0
,
&
node
,
NULL
)
;
clock
=
prom_getint
(
node
,
"clock-frequency"
);
}
}
else
{
...
...
@@ -1012,11 +1013,7 @@ unsigned long sparc64_get_clock_tick(unsigned int cpu)
if
(
ft
->
clock_tick_ref
)
return
ft
->
clock_tick_ref
;
#ifdef CONFIG_SMP
return
cpu_data
[
cpu
].
clock_tick
;
#else
return
up_clock_tick
;
#endif
return
cpu_data
(
cpu
).
clock_tick
;
}
#ifdef CONFIG_CPU_FREQ
...
...
@@ -1028,35 +1025,22 @@ static int sparc64_cpufreq_notifier(struct notifier_block *nb, unsigned long val
unsigned
int
cpu
=
freq
->
cpu
;
struct
freq_table
*
ft
=
&
per_cpu
(
sparc64_freq_table
,
cpu
);
#ifdef CONFIG_SMP
if
(
!
ft
->
ref_freq
)
{
ft
->
ref_freq
=
freq
->
old
;
ft
->
udelay_val_ref
=
cpu_data
[
cpu
]
.
udelay_val
;
ft
->
clock_tick_ref
=
cpu_data
[
cpu
]
.
clock_tick
;
ft
->
udelay_val_ref
=
cpu_data
(
cpu
)
.
udelay_val
;
ft
->
clock_tick_ref
=
cpu_data
(
cpu
)
.
clock_tick
;
}
if
((
val
==
CPUFREQ_PRECHANGE
&&
freq
->
old
<
freq
->
new
)
||
(
val
==
CPUFREQ_POSTCHANGE
&&
freq
->
old
>
freq
->
new
))
{
cpu_data
[
cpu
]
.
udelay_val
=
cpu_data
(
cpu
)
.
udelay_val
=
cpufreq_scale
(
ft
->
udelay_val_ref
,
ft
->
ref_freq
,
freq
->
new
);
cpu_data
[
cpu
]
.
clock_tick
=
cpu_data
(
cpu
)
.
clock_tick
=
cpufreq_scale
(
ft
->
clock_tick_ref
,
ft
->
ref_freq
,
freq
->
new
);
}
#else
/* In the non-SMP case, kernel/cpufreq.c takes care of adjusting
* loops_per_jiffy.
*/
if
(
!
ft
->
ref_freq
)
{
ft
->
ref_freq
=
freq
->
old
;
ft
->
clock_tick_ref
=
up_clock_tick
;
}
if
((
val
==
CPUFREQ_PRECHANGE
&&
freq
->
old
<
freq
->
new
)
||
(
val
==
CPUFREQ_POSTCHANGE
&&
freq
->
old
>
freq
->
new
))
up_clock_tick
=
cpufreq_scale
(
ft
->
clock_tick_ref
,
ft
->
ref_freq
,
freq
->
new
);
#endif
return
0
;
}
...
...
arch/sparc64/kernel/trampoline.S
View file @
e81ab60e
...
...
@@ -246,20 +246,12 @@ startup_continue:
wrpr
%
o1
,
0x0
,
%
pstate
ldx
[%
g6
+
TI_TASK
],
%
g4
/
*
Setup
interrupt
globals
,
we
are
always
SMP
.
*/
wrpr
%
o1
,
PSTATE_IG
,
%
pstate
/
*
Get
our
UPA
MID
.
*/
ldub
[%
o2
+
TI_CPU
],
%
g1
sethi
%
hi
(
cpu_data
),
%
g5
or
%
g5
,
%
lo
(
cpu_data
),
%
g5
wrpr
%
g0
,
0
,
%
wstate
/
*
In
theory
this
is
:
&(
cpu_data
[
this_upamid
]
.
irq_worklists
[
0
])
*/
sllx
%
g1
,
7
,
%
g1
add
%
g5
,
%
g1
,
%
g1
add
%
g1
,
64
,
%
g6
call
init_irqwork_curcpu
nop
wrpr
%
g0
,
0
,
%
wstate
rdpr
%
pstate
,
%
o1
or
%
o1
,
PSTATE_IE
,
%
o1
wrpr
%
o1
,
0
,
%
pstate
...
...
arch/sparc64/kernel/traps.c
View file @
e81ab60e
...
...
@@ -613,8 +613,7 @@ extern unsigned int cheetah_deferred_trap_vector[], cheetah_deferred_trap_vector
void
__init
cheetah_ecache_flush_init
(
void
)
{
unsigned
long
largest_size
,
smallest_linesize
,
order
,
ver
;
char
type
[
16
];
int
node
,
i
;
int
node
,
i
,
instance
;
/* Scan all cpu device tree nodes, note two values:
* 1) largest E-cache size
...
...
@@ -622,21 +621,21 @@ void __init cheetah_ecache_flush_init(void)
*/
largest_size
=
0UL
;
smallest_linesize
=
~
0UL
;
node
=
prom_getchild
(
prom_root_node
);
while
((
node
=
prom_getsibling
(
node
))
!=
0
)
{
prom_getstring
(
node
,
"device_type"
,
type
,
sizeof
(
type
));
if
(
!
strcmp
(
type
,
"cpu"
))
{
unsigned
long
val
;
val
=
prom_getintdefault
(
node
,
"ecache-size"
,
(
2
*
1024
*
1024
));
if
(
val
>
largest_size
)
largest_size
=
val
;
val
=
prom_getintdefault
(
node
,
"ecache-line-size"
,
64
);
if
(
val
<
smallest_linesize
)
smallest_linesize
=
val
;
}
instance
=
0
;
while
(
!
cpu_find_by_instance
(
instance
,
&
node
,
NULL
))
{
unsigned
long
val
;
val
=
prom_getintdefault
(
node
,
"ecache-size"
,
(
2
*
1024
*
1024
));
if
(
val
>
largest_size
)
largest_size
=
val
;
val
=
prom_getintdefault
(
node
,
"ecache-line-size"
,
64
);
if
(
val
<
smallest_linesize
)
smallest_linesize
=
val
;
instance
++
;
}
if
(
largest_size
==
0UL
||
smallest_linesize
==
~
0UL
)
{
prom_printf
(
"cheetah_ecache_flush_init: Cannot probe cpu E-cache "
"parameters.
\n
"
);
...
...
arch/sparc64/mm/init.c
View file @
e81ab60e
...
...
@@ -1706,6 +1706,10 @@ void __init mem_init(void)
unsigned
long
addr
,
last
;
int
i
;
#ifndef CONFIG_SMP
cpu_data
(
0
).
udelay_val
=
loops_per_jiffy
;
#endif
i
=
last_valid_pfn
>>
((
22
-
PAGE_SHIFT
)
+
6
);
i
+=
1
;
sparc64_valid_addr_bitmap
=
(
unsigned
long
*
)
...
...
arch/sparc64/solaris/misc.c
View file @
e81ab60e
...
...
@@ -349,8 +349,7 @@ asmlinkage int solaris_sysconf(int id)
case
SOLARIS_CONFIG_XOPEN_VER
:
return
3
;
case
SOLARIS_CONFIG_CLK_TCK
:
case
SOLARIS_CONFIG_PROF_TCK
:
return
prom_getintdefault
(
prom_cpu_nodes
[
smp_processor_id
()],
"clock-frequency"
,
167000000
);
return
sparc64_get_clock_tick
(
smp_processor_id
());
#ifdef CONFIG_SMP
case
SOLARIS_CONFIG_NPROC_CONF
:
return
NR_CPUS
;
case
SOLARIS_CONFIG_NPROC_ONLN
:
return
num_online_cpus
();
...
...
drivers/serial/sunsab.c
View file @
e81ab60e
...
...
@@ -32,6 +32,7 @@
#include <linux/console.h>
#include <linux/spinlock.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <asm/io.h>
...
...
include/asm-generic/cpumask_up.h
View file @
e81ab60e
...
...
@@ -3,10 +3,10 @@
#define cpus_coerce(map) (map)
#define cpu_set(cpu, map) do { cpus_coerce(map) = 1UL; } while (0)
#define cpu_clear(cpu, map) do { cpus_coerce(map) = 0UL; } while (0)
#define cpu_isset(cpu, map) (cpus_coerce(map) != 0UL)
#define cpu_test_and_set(cpu, map)
test_and_set_bit(0, (map).mask
)
#define cpu_set(cpu, map) do {
(void)(cpu);
cpus_coerce(map) = 1UL; } while (0)
#define cpu_clear(cpu, map) do {
(void)(cpu);
cpus_coerce(map) = 0UL; } while (0)
#define cpu_isset(cpu, map) (
(void)(cpu),
cpus_coerce(map) != 0UL)
#define cpu_test_and_set(cpu, map)
((void)(cpu), test_and_set_bit(0, (map).mask)
)
#define cpus_and(dst, src1, src2) \
do { \
...
...
@@ -46,7 +46,7 @@
cpus_coerce(__tmp__) = map; \
__tmp__; \
})
#define cpumask_of_cpu(cpu)
cpus_promote(1
)
#define cpumask_of_cpu(cpu)
((void)(cpu), cpus_promote(1)
)
#define any_online_cpu(map) (cpus_coerce(map) ? 0 : 1)
/*
...
...
include/asm-sparc64/cpudata.h
0 → 100644
View file @
e81ab60e
/* cpudata.h: Per-cpu parameters.
*
* Copyright (C) 2003 David S. Miller (davem@redhat.com)
*/
#ifndef _SPARC64_CPUDATA_H
#define _SPARC64_CPUDATA_H
#include <linux/percpu.h>
typedef
struct
{
/* Dcache line 1 */
unsigned
int
__pad0
;
/* bh_count moved to irq_stat for consistency. KAO */
unsigned
int
multiplier
;
unsigned
int
counter
;
unsigned
int
idle_volume
;
unsigned
long
clock_tick
;
/* %tick's per second */
unsigned
long
udelay_val
;
/* Dcache line 2 */
unsigned
int
pgcache_size
;
unsigned
int
pgdcache_size
;
unsigned
long
*
pte_cache
[
2
];
unsigned
long
*
pgd_cache
;
}
cpuinfo_sparc
;
DECLARE_PER_CPU
(
cpuinfo_sparc
,
__cpu_data
);
#define cpu_data(__cpu) per_cpu(__cpu_data, (__cpu))
#endif
/* _SPARC64_CPUDATA_H */
include/asm-sparc64/delay.h
View file @
e81ab60e
...
...
@@ -9,6 +9,7 @@
#include <linux/config.h>
#include <linux/param.h>
#include <asm/cpudata.h>
#ifndef __ASSEMBLY__
...
...
@@ -58,11 +59,7 @@ extern __inline__ void __ndelay(unsigned long usecs, unsigned long lps)
__delay
(
usecs
*
HZ
);
}
#ifdef CONFIG_SMP
#define __udelay_val cpu_data[smp_processor_id()].udelay_val
#else
#define __udelay_val loops_per_jiffy
#endif
#define __udelay_val cpu_data(smp_processor_id()).udelay_val
#define udelay(usecs) __udelay((usecs),__udelay_val)
#define ndelay(usecs) __ndelay((usecs),__udelay_val)
...
...
include/asm-sparc64/irq.h
View file @
e81ab60e
...
...
@@ -121,13 +121,6 @@ extern void disable_irq(unsigned int);
extern
void
enable_irq
(
unsigned
int
);
extern
unsigned
int
build_irq
(
int
pil
,
int
inofixup
,
unsigned
long
iclr
,
unsigned
long
imap
);
extern
unsigned
int
sbus_build_irq
(
void
*
sbus
,
unsigned
int
ino
);
extern
unsigned
int
psycho_build_irq
(
void
*
psycho
,
int
imap_off
,
int
ino
,
int
need_dma_sync
);
#ifdef CONFIG_SMP
extern
void
set_cpu_int
(
int
,
int
);
extern
void
clear_cpu_int
(
int
,
int
);
extern
void
set_irq_udt
(
int
);
#endif
extern
int
request_fast_irq
(
unsigned
int
irq
,
irqreturn_t
(
*
handler
)(
int
,
void
*
,
struct
pt_regs
*
),
...
...
include/asm-sparc64/oplib.h
View file @
e81ab60e
...
...
@@ -327,6 +327,10 @@ extern int prom_setprop(int node, char *prop_name, char *prop_value,
extern
int
prom_pathtoinode
(
char
*
path
);
extern
int
prom_inst2pkg
(
int
);
/* CPU probing helpers. */
int
cpu_find_by_instance
(
int
instance
,
int
*
prom_node
,
int
*
mid
);
int
cpu_find_by_mid
(
int
mid
,
int
*
prom_node
);
/* Client interface level routines. */
extern
void
prom_set_trap_table
(
unsigned
long
tba
);
...
...
include/asm-sparc64/pgalloc.h
View file @
e81ab60e
...
...
@@ -10,11 +10,12 @@
#include <asm/page.h>
#include <asm/spitfire.h>
#include <asm/pgtable.h>
#include <asm/cpudata.h>
/* Page table allocation/freeing. */
#ifdef CONFIG_SMP
/* Sliiiicck */
#define pgt_quicklists cpu_data
[smp_processor_id()]
#define pgt_quicklists cpu_data
(smp_processor_id())
#else
extern
struct
pgtable_cache_struct
{
unsigned
long
*
pgd_cache
;
...
...
include/asm-sparc64/processor.h
View file @
e81ab60e
...
...
@@ -20,7 +20,6 @@
#include <asm/ptrace.h>
#include <asm/segment.h>
#include <asm/page.h>
#include <asm/delay.h>
/* Bus types */
#define EISA_bus 0
...
...
include/asm-sparc64/smp.h
View file @
e81ab60e
...
...
@@ -17,49 +17,12 @@
#include <linux/cpumask.h>
#include <linux/cache.h>
/* PROM provided per-processor information we need
* to start them all up.
*/
struct
prom_cpuinfo
{
int
prom_node
;
int
mid
;
};
extern
int
linux_num_cpus
;
/* number of CPUs probed */
extern
struct
prom_cpuinfo
linux_cpus
[
NR_CPUS
];
extern
unsigned
int
prom_cpu_nodes
[
NR_CPUS
];
#endif
/* !(__ASSEMBLY__) */
#ifdef CONFIG_SMP
#ifndef __ASSEMBLY__
/* Per processor Sparc parameters we need. */
/* Keep this a multiple of 64-bytes for cache reasons. */
typedef
struct
{
/* Dcache line 1 */
unsigned
int
__pad0
;
/* bh_count moved to irq_stat for consistency. KAO */
unsigned
int
multiplier
;
unsigned
int
counter
;
unsigned
int
idle_volume
;
unsigned
long
clock_tick
;
/* %tick's per second */
unsigned
long
udelay_val
;
/* Dcache line 2 */
unsigned
int
pgcache_size
;
unsigned
int
pgdcache_size
;
unsigned
long
*
pte_cache
[
2
];
unsigned
long
*
pgd_cache
;
/* Dcache lines 3 and 4 */
unsigned
int
irq_worklists
[
16
];
}
____cacheline_aligned
cpuinfo_sparc
;
extern
cpuinfo_sparc
cpu_data
[
NR_CPUS
];
/*
* Private routines/data
*/
...
...
@@ -110,29 +73,11 @@ static __inline__ int hard_smp_processor_id(void)
#define smp_processor_id() (current_thread_info()->cpu)
/* This needn't do anything as we do not sleep the cpu
* inside of the idler task, so an interrupt is not needed
* to get a clean fast response.
*
* XXX Reverify this assumption... -DaveM
*
* Addendum: We do want it to do something for the signal
* delivery case, we detect that by just seeing
* if we are trying to send this to an idler or not.
*/
static
__inline__
void
smp_send_reschedule
(
int
cpu
)
{
extern
void
smp_receive_signal
(
int
);
if
(
cpu_data
[
cpu
].
idle_volume
==
0
)
smp_receive_signal
(
cpu
);
}
#endif
/* !(__ASSEMBLY__) */
/* This is a nop as well because we capture all other cpus
* anyways when making the PROM active.
*/
static
__inline__
void
smp_send_stop
(
void
)
{
}
#else
#
endif
/* !(__ASSEMBLY__) */
#
define num_possible_cpus() (1)
#endif
/* !(CONFIG_SMP) */
...
...
include/asm-sparc64/timer.h
View file @
e81ab60e
...
...
@@ -69,10 +69,6 @@ struct pt_regs;
extern
void
timer_tick_interrupt
(
struct
pt_regs
*
);
#endif
#ifndef CONFIG_SMP
extern
unsigned
long
up_clock_tick
;
#endif
extern
unsigned
long
sparc64_get_clock_tick
(
unsigned
int
cpu
);
#endif
/* _SPARC64_TIMER_H */
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