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
87530db5
Commit
87530db5
authored
Jan 13, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
parents
a148058c
d5f07900
Changes
80
Hide whitespace changes
Inline
Side-by-side
Showing
80 changed files
with
3452 additions
and
937 deletions
+3452
-937
arch/powerpc/Makefile
arch/powerpc/Makefile
+2
-5
arch/powerpc/boot/Makefile
arch/powerpc/boot/Makefile
+34
-15
arch/powerpc/boot/crt0.S
arch/powerpc/boot/crt0.S
+13
-8
arch/powerpc/boot/hack-coff.c
arch/powerpc/boot/hack-coff.c
+84
-0
arch/powerpc/boot/main.c
arch/powerpc/boot/main.c
+22
-24
arch/powerpc/boot/prom.c
arch/powerpc/boot/prom.c
+102
-436
arch/powerpc/boot/prom.h
arch/powerpc/boot/prom.h
+26
-10
arch/powerpc/boot/rs6000.h
arch/powerpc/boot/rs6000.h
+243
-0
arch/powerpc/boot/stdio.c
arch/powerpc/boot/stdio.c
+325
-0
arch/powerpc/boot/stdio.h
arch/powerpc/boot/stdio.h
+0
-6
arch/powerpc/boot/string.S
arch/powerpc/boot/string.S
+17
-3
arch/powerpc/boot/zImage.coff.lds
arch/powerpc/boot/zImage.coff.lds
+46
-0
arch/powerpc/configs/mpc834x_sys_defconfig
arch/powerpc/configs/mpc834x_sys_defconfig
+911
-0
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/asm-offsets.c
+1
-1
arch/powerpc/kernel/cpu_setup_power4.S
arch/powerpc/kernel/cpu_setup_power4.S
+2
-2
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/cputable.c
+154
-70
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/entry_32.S
+1
-1
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/entry_64.S
+7
-8
arch/powerpc/kernel/fpu.S
arch/powerpc/kernel/fpu.S
+5
-5
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/head_64.S
+60
-52
arch/powerpc/kernel/idle_power4.S
arch/powerpc/kernel/idle_power4.S
+4
-4
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/irq.c
+4
-8
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/lparcfg.c
+5
-8
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/misc_32.S
+2
-2
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/misc_64.S
+5
-5
arch/powerpc/kernel/paca.c
arch/powerpc/kernel/paca.c
+24
-12
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/ppc_ksyms.c
+1
-2
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/prom.c
+101
-8
arch/powerpc/kernel/prom_parse.c
arch/powerpc/kernel/prom_parse.c
+2
-1
arch/powerpc/kernel/rtas.c
arch/powerpc/kernel/rtas.c
+95
-1
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup-common.c
+6
-3
arch/powerpc/kernel/time.c
arch/powerpc/kernel/time.c
+1
-1
arch/powerpc/lib/locks.c
arch/powerpc/lib/locks.c
+2
-6
arch/powerpc/oprofile/common.c
arch/powerpc/oprofile/common.c
+4
-4
arch/powerpc/platforms/83xx/Kconfig
arch/powerpc/platforms/83xx/Kconfig
+1
-0
arch/powerpc/platforms/83xx/mpc834x_sys.c
arch/powerpc/platforms/83xx/mpc834x_sys.c
+243
-0
arch/powerpc/platforms/83xx/mpc834x_sys.h
arch/powerpc/platforms/83xx/mpc834x_sys.h
+23
-0
arch/powerpc/platforms/83xx/mpc83xx.h
arch/powerpc/platforms/83xx/mpc83xx.h
+14
-0
arch/powerpc/platforms/83xx/pci.c
arch/powerpc/platforms/83xx/pci.c
+99
-0
arch/powerpc/platforms/chrp/pci.c
arch/powerpc/platforms/chrp/pci.c
+17
-10
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/chrp/setup.c
+4
-3
arch/powerpc/platforms/chrp/time.c
arch/powerpc/platforms/chrp/time.c
+5
-2
arch/powerpc/platforms/iseries/irq.c
arch/powerpc/platforms/iseries/irq.c
+2
-4
arch/powerpc/platforms/iseries/misc.S
arch/powerpc/platforms/iseries/misc.S
+2
-1
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/iseries/setup.c
+4
-4
arch/powerpc/platforms/iseries/smp.c
arch/powerpc/platforms/iseries/smp.c
+1
-1
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/lpar.c
+2
-2
arch/powerpc/platforms/pseries/reconfig.c
arch/powerpc/platforms/pseries/reconfig.c
+100
-0
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/setup.c
+9
-11
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/Makefile
+1
-0
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/fsl_soc.c
+317
-0
arch/powerpc/sysdev/fsl_soc.h
arch/powerpc/sysdev/fsl_soc.h
+8
-0
arch/ppc/kernel/head_8xx.S
arch/ppc/kernel/head_8xx.S
+77
-0
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/ppc_ksyms.c
+0
-1
arch/ppc/platforms/83xx/mpc834x_sys.c
arch/ppc/platforms/83xx/mpc834x_sys.c
+4
-6
arch/ppc/platforms/85xx/mpc8540_ads.c
arch/ppc/platforms/85xx/mpc8540_ads.c
+6
-8
arch/ppc/platforms/85xx/mpc8560_ads.c
arch/ppc/platforms/85xx/mpc8560_ads.c
+4
-7
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
+8
-8
arch/ppc/platforms/85xx/sbc8560.c
arch/ppc/platforms/85xx/sbc8560.c
+4
-6
arch/ppc/platforms/85xx/stx_gp3.c
arch/ppc/platforms/85xx/stx_gp3.c
+4
-6
arch/ppc/platforms/85xx/tqm85xx.c
arch/ppc/platforms/85xx/tqm85xx.c
+6
-10
arch/ppc/syslib/mpc83xx_devices.c
arch/ppc/syslib/mpc83xx_devices.c
+8
-2
arch/ppc/syslib/mpc85xx_devices.c
arch/ppc/syslib/mpc85xx_devices.c
+8
-2
drivers/macintosh/macio-adb.c
drivers/macintosh/macio-adb.c
+8
-5
fs/proc/proc_devtree.c
fs/proc/proc_devtree.c
+24
-0
include/asm-powerpc/atomic.h
include/asm-powerpc/atomic.h
+23
-23
include/asm-powerpc/bitops.h
include/asm-powerpc/bitops.h
+3
-3
include/asm-powerpc/cputable.h
include/asm-powerpc/cputable.h
+9
-5
include/asm-powerpc/elf.h
include/asm-powerpc/elf.h
+7
-9
include/asm-powerpc/futex.h
include/asm-powerpc/futex.h
+1
-1
include/asm-powerpc/hvcall.h
include/asm-powerpc/hvcall.h
+5
-0
include/asm-powerpc/lppaca.h
include/asm-powerpc/lppaca.h
+5
-1
include/asm-powerpc/paca.h
include/asm-powerpc/paca.h
+1
-13
include/asm-powerpc/ppc_asm.h
include/asm-powerpc/ppc_asm.h
+40
-36
include/asm-powerpc/prom.h
include/asm-powerpc/prom.h
+8
-0
include/asm-powerpc/spinlock.h
include/asm-powerpc/spinlock.h
+11
-10
include/asm-powerpc/synch.h
include/asm-powerpc/synch.h
+4
-19
include/asm-powerpc/system.h
include/asm-powerpc/system.h
+4
-4
include/asm-powerpc/time.h
include/asm-powerpc/time.h
+2
-3
include/linux/proc_fs.h
include/linux/proc_fs.h
+5
-0
No files found.
arch/powerpc/Makefile
View file @
87530db5
...
...
@@ -139,17 +139,14 @@ drivers-$(CONFIG_CPM2) += arch/ppc/8260_io/
drivers-$(CONFIG_OPROFILE)
+=
arch
/powerpc/oprofile/
defaultimage-$(CONFIG_PPC32)
:=
zImage
# Default to zImage, override when needed
defaultimage-y
:=
zImage
defaultimage-$(CONFIG_PPC_ISERIES)
:=
vmlinux
defaultimage-$(CONFIG_PPC_PSERIES)
:=
zImage
KBUILD_IMAGE
:=
$
(
defaultimage-y
)
all
:
$(KBUILD_IMAGE)
CPPFLAGS_vmlinux.lds
:=
-Upowerpc
# All the instructions talk about "make bzImage".
bzImage
:
zImage
BOOT_TARGETS
=
zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage
.PHONY
:
$(BOOT_TARGETS)
...
...
arch/powerpc/boot/Makefile
View file @
87530db5
...
...
@@ -25,8 +25,8 @@ HOSTCC := gcc
BOOTCFLAGS
:=
$(HOSTCFLAGS)
-fno-builtin
-nostdinc
-isystem
\
$(
shell
$(CROSS32CC)
-print-file-name
=
include
)
-fPIC
BOOTAFLAGS
:=
-D__ASSEMBLY__
$(BOOTCFLAGS)
-traditional
-nostdinc
BOOTLFLAGS
:=
-T
$(srctree)
/
$(src)
/zImage.lds
OBJCOPYFLAGS
:=
contents,alloc,load,readonly,data
OBJCOPY_COFF_ARGS
:=
-O
aixcoff-rs6000
--set-start
0x500000
zlib
:=
infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c
zlibheader
:=
infblock.h infcodes.h inffast.h inftrees.h infutil.h
...
...
@@ -35,7 +35,7 @@ zliblinuxheader := zlib.h zconf.h zutil.h
$(addprefix $(obj)/,$(zlib) main.o)
:
$(addprefix $(obj)/
,
$(zliblinuxheader)) $(addprefix $(obj)/
,
$(zlibheader))
#$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h)
src-boot
:=
string.S prom.c main.c div64.S crt0
.S
src-boot
:=
crt0.S string.S prom.c stdio.c main.c div64
.S
src-boot
+=
$(zlib)
src-boot
:=
$(
addprefix
$(obj)
/,
$
(
src-boot
))
obj-boot
:=
$(
addsuffix
.o,
$(
basename
$
(
src-boot
)))
...
...
@@ -70,7 +70,7 @@ quiet_cmd_bootas = BOOTAS $@
cmd_bootas
=
$(CROSS32CC)
-Wp
,-MD,
$(depfile)
$(BOOTAFLAGS)
-c
-o
$@
$<
quiet_cmd_bootld
=
BOOTLD
$@
cmd_bootld
=
$(CROSS32LD)
$(BOOTLFLAGS
)
-o
$@
$(2)
cmd_bootld
=
$(CROSS32LD)
-T
$(srctree)
/
$(src)
/
$(3
)
-o
$@
$(2)
$(patsubst %.c,%.o, $(filter %.c, $(src-boot)))
:
%.o: %.c
$(
call
if_changed_dep,bootcc
)
...
...
@@ -87,12 +87,14 @@ obj-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.o, $(section)))
src-sec
=
$(
foreach
section,
$(1)
,
$(
patsubst
%,
$(obj)
/kernel-%.c,
$(section)
))
gz-sec
=
$(
foreach
section,
$(1)
,
$(
patsubst
%,
$(obj)
/kernel-%.gz,
$(section)
))
hostprogs-y
:=
addnote addRamDisk
targets
+=
zImage.vmode zImage.initrd.vmode zImage zImage.initrd
\
$(
patsubst
$(obj)
/%,%,
$(
call
obj-sec,
$(required)
$(initrd)
))
\
$(
patsubst
$(obj)
/%,%,
$(
call
src-sec,
$(required)
$(initrd)
))
\
$(
patsubst
$(obj)
/%,%,
$(
call
gz-sec,
$(required)
$(initrd)
))
\
vmlinux.initrd
hostprogs-y
:=
addnote addRamDisk hack-coff
targets
+=
zImage.vmode zImage.initrd.vmode zImage zImage.initrd
\
zImage.coff zImage.initrd.coff
\
$(
patsubst
$(obj)
/%,%,
$(
call
obj-sec,
$(required)
$(initrd)
))
\
$(
patsubst
$(obj)
/%,%,
$(
call
src-sec,
$(required)
$(initrd)
))
\
$(
patsubst
$(obj)
/%,%,
$(
call
gz-sec,
$(required)
$(initrd)
))
\
vmlinux.initrd
extra-y
:=
initrd.o
quiet_cmd_ramdisk
=
RAMDISK
$@
...
...
@@ -114,6 +116,10 @@ quiet_cmd_addsection = ADDSEC $@
quiet_cmd_addnote
=
ADDNOTE
$@
cmd_addnote
=
$(obj)
/addnote
$@
quiet_cmd_gencoff
=
COFF
$@
cmd_gencoff
=
$(OBJCOPY)
$(OBJCOPY_COFF_ARGS)
$@
&&
\
$(obj)
/hack-coff
$@
$(call gz-sec, $(required))
:
$(obj)/kernel-%.gz: %
$(
call
if_changed,gzip
)
...
...
@@ -127,22 +133,35 @@ $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c
$(
call
if_changed_dep,bootcc
)
$(
call
cmd,addsection
)
$(obj)/zImage.vmode
:
obj-boot += $(call obj-sec
,
$(required))
$(obj)/zImage.vmode
$(obj)/zImage.coff
:
obj-boot += $(call obj-sec
,
$(required))
$(obj)/zImage.vmode
:
$(call obj-sec
,
$(required)) $(obj-boot) $(srctree)/$(src)/zImage.lds
$(
call
cmd,bootld,
$
(
obj-boot
))
$(
call
cmd,bootld,
$
(
obj-boot
)
,zImage.lds
)
$(obj)/zImage.initrd.vmode
:
obj-boot += $(call obj-sec
,
$(required) $(initrd))
$(obj)/zImage.initrd.vmode
$(obj)/zImage.initrd.coff
:
obj-boot += $(call obj-sec
,
$(required) $(initrd))
$(obj)/zImage.initrd.vmode
:
$(call obj-sec
,
$(required) $(initrd)) $(obj-boot) $(srctree)/$(src)/zImage.lds
$(
call
cmd,bootld,
$
(
obj-boot
))
$(
call
cmd,bootld,
$
(
obj-boot
)
,zImage.lds
)
# For 32-bit powermacs, build the COFF images as well as the ELF images.
coffimage-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32)
:=
$(obj)
/zImage.coff
coffrdimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32)
:=
$(obj)
/zImage.initrd.coff
$(obj)/zImage
:
$(obj)/zImage.vmode $(obj)/addnote
$(obj)/zImage
:
$(obj)/zImage.vmode $(obj)/addnote
$(coffimage-y-y)
@
cp
-f
$<
$@
$(
call
if_changed,addnote
)
$(obj)/zImage.initrd
:
$(obj)/zImage.initrd.vmode $(obj)/addnote
$(obj)/zImage.initrd
:
$(obj)/zImage.initrd.vmode $(obj)/addnote
$(coffrdimg-y-y)
@
cp
-f
$<
$@
$(
call
if_changed,addnote
)
$(obj)/zImage.coff
:
$(call obj-sec
,
$(required)) $(obj-boot) $(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
$(
call
cmd,bootld,
$
(
obj-boot
)
,zImage.coff.lds
)
$(
call
cmd,gencoff
)
$(obj)/zImage.initrd.coff
:
$(call obj-sec
,
$(required) $(initrd)) $(obj-boot)
\
$(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
$(
call
cmd,bootld,
$
(
obj-boot
)
,zImage.coff.lds
)
$(
call
cmd,gencoff
)
#-----------------------------------------------------------
# build u-boot images
#-----------------------------------------------------------
...
...
arch/powerpc/boot/crt0.S
View file @
87530db5
...
...
@@ -12,17 +12,23 @@
#include "ppc_asm.h"
.
text
/
*
a
procedure
descriptor
used
when
booting
this
as
a
COFF
file
*/
_zimage_start_opd
:
.
long
_zimage_start
,
0
,
0
,
0
.
globl
_zimage_start
_zimage_start
:
/
*
Work
out
the
offset
between
the
address
we
were
linked
at
and
the
address
where
we
're running. */
bl
1
f
1
:
mflr
r0
1
:
mflr
r0
lis
r9
,
1
b
@
ha
addi
r9
,
r9
,
1
b
@
l
subf
.
r0
,
r9
,
r0
beq
3
f
beq
3
f
/*
if
running
at
same
address
as
linked
*/
/
*
The
.
got2
section
contains
a
list
of
addresses
,
so
add
the
address
offset
onto
each
entry
.
*/
lis
r9
,
__got2_start
@
ha
addi
r9
,
r9
,
__got2_start
@
l
lis
r8
,
__got2_end
@
ha
...
...
@@ -32,15 +38,14 @@ _zimage_start:
srwi
.
r8
,
r8
,
2
mtctr
r8
add
r9
,
r0
,
r9
2
:
lwz
r8
,
0
(
r9
)
2
:
lwz
r8
,
0
(
r9
)
add
r8
,
r8
,
r0
stw
r8
,
0
(
r9
)
addi
r9
,
r9
,
4
bdnz
2
b
3
:
lis
r9
,
_start
@
h
/
*
Do
a
cache
flush
for
our
text
,
in
case
OF
didn
't */
3
:
lis
r9
,
_start
@
h
add
r9
,
r0
,
r9
lis
r8
,
_etext
@
ha
addi
r8
,
r8
,
_etext
@
l
...
...
arch/powerpc/boot/hack-coff.c
0 → 100644
View file @
87530db5
/*
* hack-coff.c - hack the header of an xcoff file to fill in
* a few fields needed by the Open Firmware xcoff loader on
* Power Macs but not initialized by objcopy.
*
* Copyright (C) Paul Mackerras 1997.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "rs6000.h"
#define AOUT_MAGIC 0x010b
#define get_16be(x) ((((unsigned char *)(x))[0] << 8) \
+ ((unsigned char *)(x))[1])
#define put_16be(x, v) (((unsigned char *)(x))[0] = (v) >> 8, \
((unsigned char *)(x))[1] = (v) & 0xff)
#define get_32be(x) ((((unsigned char *)(x))[0] << 24) \
+ (((unsigned char *)(x))[1] << 16) \
+ (((unsigned char *)(x))[2] << 8) \
+ ((unsigned char *)(x))[3])
int
main
(
int
ac
,
char
**
av
)
{
int
fd
;
int
i
,
nsect
;
int
aoutsz
;
struct
external_filehdr
fhdr
;
AOUTHDR
aout
;
struct
external_scnhdr
shdr
;
if
(
ac
!=
2
)
{
fprintf
(
stderr
,
"Usage: hack-coff coff-file
\n
"
);
exit
(
1
);
}
if
((
fd
=
open
(
av
[
1
],
2
))
==
-
1
)
{
perror
(
av
[
2
]);
exit
(
1
);
}
if
(
read
(
fd
,
&
fhdr
,
sizeof
(
fhdr
))
!=
sizeof
(
fhdr
))
goto
readerr
;
i
=
get_16be
(
fhdr
.
f_magic
);
if
(
i
!=
U802TOCMAGIC
&&
i
!=
U802WRMAGIC
&&
i
!=
U802ROMAGIC
)
{
fprintf
(
stderr
,
"%s: not an xcoff file
\n
"
,
av
[
1
]);
exit
(
1
);
}
aoutsz
=
get_16be
(
fhdr
.
f_opthdr
);
if
(
read
(
fd
,
&
aout
,
aoutsz
)
!=
aoutsz
)
goto
readerr
;
nsect
=
get_16be
(
fhdr
.
f_nscns
);
for
(
i
=
0
;
i
<
nsect
;
++
i
)
{
if
(
read
(
fd
,
&
shdr
,
sizeof
(
shdr
))
!=
sizeof
(
shdr
))
goto
readerr
;
if
(
strcmp
(
shdr
.
s_name
,
".text"
)
==
0
)
{
put_16be
(
aout
.
o_snentry
,
i
+
1
);
put_16be
(
aout
.
o_sntext
,
i
+
1
);
}
else
if
(
strcmp
(
shdr
.
s_name
,
".data"
)
==
0
)
{
put_16be
(
aout
.
o_sndata
,
i
+
1
);
}
else
if
(
strcmp
(
shdr
.
s_name
,
".bss"
)
==
0
)
{
put_16be
(
aout
.
o_snbss
,
i
+
1
);
}
}
put_16be
(
aout
.
magic
,
AOUT_MAGIC
);
if
(
lseek
(
fd
,
(
long
)
sizeof
(
struct
external_filehdr
),
0
)
==
-
1
||
write
(
fd
,
&
aout
,
aoutsz
)
!=
aoutsz
)
{
fprintf
(
stderr
,
"%s: write error
\n
"
,
av
[
1
]);
exit
(
1
);
}
close
(
fd
);
exit
(
0
);
readerr:
fprintf
(
stderr
,
"%s: read error or file too short
\n
"
,
av
[
1
]);
exit
(
1
);
}
arch/powerpc/boot/main.c
View file @
87530db5
...
...
@@ -21,8 +21,8 @@ extern void flush_cache(void *, unsigned long);
/* Value picked to match that used by yaboot */
#define PROG_START 0x01400000
#define RAM_END (512<<20)
//
Fixme: use OF */
#define PROG_START 0x01400000
/* only used on 64-bit systems */
#define RAM_END (512<<20)
/*
Fixme: use OF */
#define ONE_MB 0x100000
extern
char
_start
[];
...
...
@@ -160,6 +160,17 @@ static int is_elf64(void *hdr)
elfoffset
=
(
unsigned
long
)
elf64ph
->
p_offset
;
vmlinux
.
size
=
(
unsigned
long
)
elf64ph
->
p_filesz
+
elfoffset
;
vmlinux
.
memsize
=
(
unsigned
long
)
elf64ph
->
p_memsz
+
elfoffset
;
#if defined(PROG_START)
/*
* Maintain a "magic" minimum address. This keeps some older
* firmware platforms running.
*/
if
(
claim_base
<
PROG_START
)
claim_base
=
PROG_START
;
#endif
return
1
;
}
...
...
@@ -206,12 +217,18 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
exit
();
if
(
getprop
(
chosen_handle
,
"stdout"
,
&
stdout
,
sizeof
(
stdout
))
!=
4
)
exit
();
stderr
=
stdout
;
if
(
getprop
(
chosen_handle
,
"stdin"
,
&
stdin
,
sizeof
(
stdin
))
!=
4
)
exit
();
printf
(
"
\n\r
zImage starting: loaded at 0x%p (sp: 0x%p)
\n\r
"
,
_start
,
sp
);
/*
* The first available claim_base must be above the end of the
* the loaded kernel wrapper file (_start to _end includes the
* initrd image if it is present) and rounded up to a nice
* 1 MB boundary for good measure.
*/
claim_base
=
_ALIGN_UP
((
unsigned
long
)
_end
,
ONE_MB
);
vmlinuz
.
addr
=
(
unsigned
long
)
_vmlinux_start
;
vmlinuz
.
size
=
(
unsigned
long
)(
_vmlinux_end
-
_vmlinux_start
);
...
...
@@ -228,25 +245,6 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
exit
();
}
/*
* The first available claim_base must be above the end of the
* the loaded kernel wrapper file (_start to _end includes the
* initrd image if it is present) and rounded up to a nice
* 1 MB boundary for good measure.
*/
claim_base
=
_ALIGN_UP
((
unsigned
long
)
_end
,
ONE_MB
);
#if defined(PROG_START)
/*
* Maintain a "magic" minimum address. This keeps some older
* firmware platforms running.
*/
if
(
claim_base
<
PROG_START
)
claim_base
=
PROG_START
;
#endif
/* We need to claim the memsize plus the file offset since gzip
* will expand the header (file offset), then the kernel, then
* possible rubbish we don't care about. But the kernel bss must
...
...
arch/powerpc/boot/prom.c
View file @
87530db5
...
...
@@ -13,487 +13,153 @@
#include "prom.h"
int
(
*
prom
)(
void
*
);
phandle
chosen_handle
;
ihandle
stdout
;
void
*
chosen_handle
;
void
*
stdin
;
void
*
stdout
;
void
*
stderr
;
int
write
(
void
*
handle
,
void
*
ptr
,
int
nb
)
{
struct
prom_args
{
char
*
service
;
int
nargs
;
int
nret
;
void
*
ihandle
;
void
*
addr
;
int
len
;
int
actual
;
}
args
;
args
.
service
=
"write"
;
args
.
nargs
=
3
;
args
.
nret
=
1
;
args
.
ihandle
=
handle
;
args
.
addr
=
ptr
;
args
.
len
=
nb
;
args
.
actual
=
-
1
;
(
*
prom
)(
&
args
);
return
args
.
actual
;
}
int
read
(
void
*
handle
,
void
*
ptr
,
int
nb
)
int
call_prom
(
const
char
*
service
,
int
nargs
,
int
nret
,
...)
{
int
i
;
struct
prom_args
{
char
*
service
;
c
onst
c
har
*
service
;
int
nargs
;
int
nret
;
void
*
ihandle
;
void
*
addr
;
int
len
;
int
actual
;
}
args
;
args
.
service
=
"read"
;
args
.
nargs
=
3
;
args
.
nret
=
1
;
args
.
ihandle
=
handle
;
args
.
addr
=
ptr
;
args
.
len
=
nb
;
args
.
actual
=
-
1
;
(
*
prom
)(
&
args
);
return
args
.
actual
;
}
void
exit
()
{
struct
prom_args
{
char
*
service
;
}
args
;
for
(;;)
{
args
.
service
=
"exit"
;
(
*
prom
)(
&
args
);
}
}
void
pause
(
void
)
{
struct
prom_args
{
char
*
service
;
unsigned
int
args
[
12
];
}
args
;
va_list
list
;
args
.
service
=
"enter"
;
(
*
prom
)(
&
args
)
;
}
args
.
service
=
service
;
args
.
nargs
=
nargs
;
args
.
nret
=
nret
;
void
*
finddevice
(
const
char
*
name
)
{
struct
prom_args
{
char
*
service
;
int
nargs
;
int
nret
;
const
char
*
devspec
;
void
*
phandle
;
}
args
;
va_start
(
list
,
nret
);
for
(
i
=
0
;
i
<
nargs
;
i
++
)
args
.
args
[
i
]
=
va_arg
(
list
,
unsigned
int
);
va_end
(
list
);
args
.
service
=
"finddevice"
;
args
.
nargs
=
1
;
args
.
nret
=
1
;
args
.
devspec
=
name
;
args
.
phandle
=
(
void
*
)
-
1
;
(
*
prom
)(
&
args
);
return
args
.
phandle
;
}
for
(
i
=
0
;
i
<
nret
;
i
++
)
args
.
args
[
nargs
+
i
]
=
0
;
void
*
claim
(
unsigned
long
virt
,
unsigned
long
size
,
unsigned
long
align
)
{
struct
prom_args
{
char
*
service
;
int
nargs
;
int
nret
;
unsigned
int
virt
;
unsigned
int
size
;
unsigned
int
align
;
void
*
ret
;
}
args
;
if
(
prom
(
&
args
)
<
0
)
return
-
1
;
args
.
service
=
"claim"
;
args
.
nargs
=
3
;
args
.
nret
=
1
;
args
.
virt
=
virt
;
args
.
size
=
size
;
args
.
align
=
align
;
(
*
prom
)(
&
args
);
return
args
.
ret
;
return
(
nret
>
0
)
?
args
.
args
[
nargs
]
:
0
;
}
int
getprop
(
void
*
phandle
,
const
char
*
name
,
void
*
buf
,
int
buflen
)
int
call_prom_ret
(
const
char
*
service
,
int
nargs
,
int
nret
,
unsigned
int
*
rets
,
...
)
{
int
i
;
struct
prom_args
{
char
*
service
;
c
onst
c
har
*
service
;
int
nargs
;
int
nret
;
void
*
phandle
;
const
char
*
name
;
void
*
buf
;
int
buflen
;
int
size
;
unsigned
int
args
[
12
];
}
args
;
va_list
list
;
args
.
service
=
"getprop"
;
args
.
nargs
=
4
;
args
.
nret
=
1
;
args
.
phandle
=
phandle
;
args
.
name
=
name
;
args
.
buf
=
buf
;
args
.
buflen
=
buflen
;
args
.
size
=
-
1
;
(
*
prom
)(
&
args
);
return
args
.
size
;
}
args
.
service
=
service
;
args
.
nargs
=
nargs
;
args
.
nret
=
nret
;
int
putc
(
int
c
,
void
*
f
)
{
char
ch
=
c
;
va_start
(
list
,
rets
);
for
(
i
=
0
;
i
<
nargs
;
i
++
)
args
.
args
[
i
]
=
va_arg
(
list
,
unsigned
int
);
va_end
(
list
)
;
if
(
c
==
'\n'
)
putc
(
'\r'
,
f
);
return
write
(
f
,
&
ch
,
1
)
==
1
?
c
:
-
1
;
}
for
(
i
=
0
;
i
<
nret
;
i
++
)
args
.
args
[
nargs
+
i
]
=
0
;
int
putchar
(
int
c
)
{
return
putc
(
c
,
stdout
);
}
if
(
prom
(
&
args
)
<
0
)
return
-
1
;
int
fputs
(
char
*
str
,
void
*
f
)
{
int
n
=
strlen
(
str
);
if
(
rets
!=
(
void
*
)
0
)
for
(
i
=
1
;
i
<
nret
;
++
i
)
rets
[
i
-
1
]
=
args
.
args
[
nargs
+
i
];
return
write
(
f
,
str
,
n
)
==
n
?
0
:
-
1
;
return
(
nret
>
0
)
?
args
.
args
[
nargs
]
:
0
;
}
size_t
strnlen
(
const
char
*
s
,
size_t
count
)
int
write
(
void
*
handle
,
void
*
ptr
,
int
nb
)
{
const
char
*
sc
;
for
(
sc
=
s
;
count
--
&&
*
sc
!=
'\0'
;
++
sc
)
/* nothing */
;
return
sc
-
s
;
return
call_prom
(
"write"
,
3
,
1
,
handle
,
ptr
,
nb
);
}
extern
unsigned
int
__div64_32
(
unsigned
long
long
*
dividend
,
unsigned
int
divisor
);
/* The unnecessary pointer compare is there
*
to check for type safety (n must be 64bit)
/*
* Older OF's require that when claiming a specific range of addresses,
* we claim the physical space in the /memory node and the virtual
* space in the chosen mmu node, and then do a map operation to
*
map virtual to physical.
*/
# define do_div(n,base) ({ \
unsigned int __base = (base); \
unsigned int __rem; \
(void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \
if (((n) >> 32) == 0) { \
__rem = (unsigned int)(n) % __base; \
(n) = (unsigned int)(n) / __base; \
} else \
__rem = __div64_32(&(n), __base); \
__rem; \
})
static
int
need_map
=
-
1
;
static
ihandle
chosen_mmu
;
static
phandle
memory
;
static
int
skip_atoi
(
const
char
**
s
)
/* returns true if s2 is a prefix of s1 */
static
int
string_match
(
const
char
*
s1
,
const
char
*
s2
)
{
int
i
,
c
;
for
(
i
=
0
;
'0'
<=
(
c
=
**
s
)
&&
c
<=
'9'
;
++*
s
)
i
=
i
*
10
+
c
-
'0'
;
return
i
;
for
(;
*
s2
;
++
s2
)
if
(
*
s1
++
!=
*
s2
)
return
0
;
return
1
;
}
#define ZEROPAD 1
/* pad with zero */
#define SIGN 2
/* unsigned/signed long */
#define PLUS 4
/* show plus */
#define SPACE 8
/* space if plus */
#define LEFT 16
/* left justified */
#define SPECIAL 32
/* 0x */
#define LARGE 64
/* use 'ABCDEF' instead of 'abcdef' */
static
char
*
number
(
char
*
str
,
unsigned
long
long
num
,
int
base
,
int
size
,
int
precision
,
int
type
)
static
int
check_of_version
(
void
)
{
char
c
,
sign
,
tmp
[
66
];
const
char
*
digits
=
"0123456789abcdefghijklmnopqrstuvwxyz"
;
int
i
;
phandle
oprom
,
chosen
;
char
version
[
64
];
if
(
type
&
LARGE
)
digits
=
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
if
(
type
&
LEFT
)
type
&=
~
ZEROPAD
;
if
(
base
<
2
||
base
>
36
)
oprom
=
finddevice
(
"/openprom"
);
if
(
oprom
==
(
phandle
)
-
1
)
return
0
;
c
=
(
type
&
ZEROPAD
)
?
'0'
:
' '
;
sign
=
0
;
if
(
type
&
SIGN
)
{
if
((
signed
long
long
)
num
<
0
)
{
sign
=
'-'
;
num
=
-
(
signed
long
long
)
num
;
size
--
;
}
else
if
(
type
&
PLUS
)
{
sign
=
'+'
;
size
--
;
}
else
if
(
type
&
SPACE
)
{
sign
=
' '
;
size
--
;
if
(
getprop
(
oprom
,
"model"
,
version
,
sizeof
(
version
))
<=
0
)
return
0
;
version
[
sizeof
(
version
)
-
1
]
=
0
;
printf
(
"OF version = '%s'
\r\n
"
,
version
);
if
(
!
string_match
(
version
,
"Open Firmware, 1."
)
&&
!
string_match
(
version
,
"FirmWorks,3."
))
return
0
;
chosen
=
finddevice
(
"/chosen"
);
if
(
chosen
==
(
phandle
)
-
1
)
{
chosen
=
finddevice
(
"/chosen@0"
)
;
if
(
chosen
==
(
phandle
)
-
1
)
{
printf
(
"no chosen
\n
"
)
;
return
0
;
}
}
if
(
type
&
SPECIAL
)
{
if
(
base
==
16
)
size
-=
2
;
else
if
(
base
==
8
)
size
--
;
}
i
=
0
;
if
(
num
==
0
)
tmp
[
i
++
]
=
'0'
;
else
while
(
num
!=
0
)
{
tmp
[
i
++
]
=
digits
[
do_div
(
num
,
base
)];
if
(
getprop
(
chosen
,
"mmu"
,
&
chosen_mmu
,
sizeof
(
chosen_mmu
))
<=
0
)
{
printf
(
"no mmu
\n
"
);
return
0
;
}
if
(
i
>
precision
)
precision
=
i
;
size
-=
precision
;
if
(
!
(
type
&
(
ZEROPAD
+
LEFT
)))
while
(
size
-->
0
)
*
str
++
=
' '
;
if
(
sign
)
*
str
++
=
sign
;
if
(
type
&
SPECIAL
)
{
if
(
base
==
8
)
*
str
++
=
'0'
;
else
if
(
base
==
16
)
{
*
str
++
=
'0'
;
*
str
++
=
digits
[
33
];
memory
=
(
ihandle
)
call_prom
(
"open"
,
1
,
1
,
"/memory"
);
if
(
memory
==
(
ihandle
)
-
1
)
{
memory
=
(
ihandle
)
call_prom
(
"open"
,
1
,
1
,
"/memory@0"
);
if
(
memory
==
(
ihandle
)
-
1
)
{
printf
(
"no memory node
\n
"
);
return
0
;
}
}
if
(
!
(
type
&
LEFT
))
while
(
size
--
>
0
)
*
str
++
=
c
;
while
(
i
<
precision
--
)
*
str
++
=
'0'
;
while
(
i
--
>
0
)
*
str
++
=
tmp
[
i
];
while
(
size
--
>
0
)
*
str
++
=
' '
;
return
str
;
printf
(
"old OF detected
\r\n
"
);
return
1
;
}
int
vsprintf
(
char
*
buf
,
const
char
*
fmt
,
va_list
args
)
void
*
claim
(
unsigned
long
virt
,
unsigned
long
size
,
unsigned
long
align
)
{
int
len
;
unsigned
long
long
num
;
int
i
,
base
;
char
*
str
;
const
char
*
s
;
int
flags
;
/* flags to number() */
int
field_width
;
/* width of output field */
int
precision
;
/* min. # of digits for integers; max
number of chars for from string */
int
qualifier
;
/* 'h', 'l', or 'L' for integer fields */
/* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */
int
ret
;
unsigned
int
result
;
if
(
need_map
<
0
)
need_map
=
check_of_version
();
if
(
align
||
!
need_map
)
return
(
void
*
)
call_prom
(
"claim"
,
3
,
1
,
virt
,
size
,
align
);
for
(
str
=
buf
;
*
fmt
;
++
fmt
)
{
if
(
*
fmt
!=
'%'
)
{
*
str
++
=
*
fmt
;
continue
;
}
/* process flags */
flags
=
0
;
repeat:
++
fmt
;
/* this also skips first '%' */
switch
(
*
fmt
)
{
case
'-'
:
flags
|=
LEFT
;
goto
repeat
;
case
'+'
:
flags
|=
PLUS
;
goto
repeat
;
case
' '
:
flags
|=
SPACE
;
goto
repeat
;
case
'#'
:
flags
|=
SPECIAL
;
goto
repeat
;
case
'0'
:
flags
|=
ZEROPAD
;
goto
repeat
;
}
/* get field width */
field_width
=
-
1
;
if
(
'0'
<=
*
fmt
&&
*
fmt
<=
'9'
)
field_width
=
skip_atoi
(
&
fmt
);
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
/* it's the next argument */
field_width
=
va_arg
(
args
,
int
);
if
(
field_width
<
0
)
{
field_width
=
-
field_width
;
flags
|=
LEFT
;
}
}
/* get the precision */
precision
=
-
1
;
if
(
*
fmt
==
'.'
)
{
++
fmt
;
if
(
'0'
<=
*
fmt
&&
*
fmt
<=
'9'
)
precision
=
skip_atoi
(
&
fmt
);
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
/* it's the next argument */
precision
=
va_arg
(
args
,
int
);
}
if
(
precision
<
0
)
precision
=
0
;
}
/* get the conversion qualifier */
qualifier
=
-
1
;
if
(
*
fmt
==
'h'
||
*
fmt
==
'l'
||
*
fmt
==
'L'
||
*
fmt
==
'Z'
)
{
qualifier
=
*
fmt
;
++
fmt
;
}
/* default base */
base
=
10
;
switch
(
*
fmt
)
{
case
'c'
:
if
(
!
(
flags
&
LEFT
))
while
(
--
field_width
>
0
)
*
str
++
=
' '
;
*
str
++
=
(
unsigned
char
)
va_arg
(
args
,
int
);
while
(
--
field_width
>
0
)
*
str
++
=
' '
;
continue
;
case
's'
:
s
=
va_arg
(
args
,
char
*
);
if
(
!
s
)
s
=
"<NULL>"
;
len
=
strnlen
(
s
,
precision
);
if
(
!
(
flags
&
LEFT
))
while
(
len
<
field_width
--
)
*
str
++
=
' '
;
for
(
i
=
0
;
i
<
len
;
++
i
)
*
str
++
=
*
s
++
;
while
(
len
<
field_width
--
)
*
str
++
=
' '
;
continue
;
case
'p'
:
if
(
field_width
==
-
1
)
{
field_width
=
2
*
sizeof
(
void
*
);
flags
|=
ZEROPAD
;
}
str
=
number
(
str
,
(
unsigned
long
)
va_arg
(
args
,
void
*
),
16
,
field_width
,
precision
,
flags
);
continue
;
case
'n'
:
if
(
qualifier
==
'l'
)
{
long
*
ip
=
va_arg
(
args
,
long
*
);
*
ip
=
(
str
-
buf
);
}
else
if
(
qualifier
==
'Z'
)
{
size_t
*
ip
=
va_arg
(
args
,
size_t
*
);
*
ip
=
(
str
-
buf
);
}
else
{
int
*
ip
=
va_arg
(
args
,
int
*
);
*
ip
=
(
str
-
buf
);
}
continue
;
case
'%'
:
*
str
++
=
'%'
;
continue
;
/* integer number formats - set up the flags and "break" */
case
'o'
:
base
=
8
;
break
;
case
'X'
:
flags
|=
LARGE
;
case
'x'
:
base
=
16
;
break
;
case
'd'
:
case
'i'
:
flags
|=
SIGN
;
case
'u'
:
break
;
default:
*
str
++
=
'%'
;
if
(
*
fmt
)
*
str
++
=
*
fmt
;
else
--
fmt
;
continue
;
}
if
(
qualifier
==
'l'
)
{
num
=
va_arg
(
args
,
unsigned
long
);
if
(
flags
&
SIGN
)
num
=
(
signed
long
)
num
;
}
else
if
(
qualifier
==
'Z'
)
{
num
=
va_arg
(
args
,
size_t
);
}
else
if
(
qualifier
==
'h'
)
{
num
=
(
unsigned
short
)
va_arg
(
args
,
int
);
if
(
flags
&
SIGN
)
num
=
(
signed
short
)
num
;
}
else
{
num
=
va_arg
(
args
,
unsigned
int
);
if
(
flags
&
SIGN
)
num
=
(
signed
int
)
num
;
}
str
=
number
(
str
,
num
,
base
,
field_width
,
precision
,
flags
);
}
*
str
=
'\0'
;
return
str
-
buf
;
}
int
sprintf
(
char
*
buf
,
const
char
*
fmt
,
...)
{
va_list
args
;
int
i
;
va_start
(
args
,
fmt
);
i
=
vsprintf
(
buf
,
fmt
,
args
);
va_end
(
args
);
return
i
;
}
static
char
sprint_buf
[
1024
];
int
printf
(
const
char
*
fmt
,
...)
{
va_list
args
;
int
n
;
va_start
(
args
,
fmt
);
n
=
vsprintf
(
sprint_buf
,
fmt
,
args
);
va_end
(
args
);
write
(
stdout
,
sprint_buf
,
n
);
return
n
;
ret
=
call_prom_ret
(
"call-method"
,
5
,
2
,
&
result
,
"claim"
,
memory
,
align
,
size
,
virt
);
if
(
ret
!=
0
||
result
==
-
1
)
return
(
void
*
)
-
1
;
ret
=
call_prom_ret
(
"call-method"
,
5
,
2
,
&
result
,
"claim"
,
chosen_mmu
,
align
,
size
,
virt
);
/* 0x12 == coherent + read/write */
ret
=
call_prom
(
"call-method"
,
6
,
1
,
"map"
,
chosen_mmu
,
0x12
,
size
,
virt
,
virt
);
return
(
void
*
)
virt
;
}
arch/powerpc/boot/prom.h
View file @
87530db5
#ifndef _PPC_BOOT_PROM_H_
#define _PPC_BOOT_PROM_H_
typedef
void
*
phandle
;
typedef
void
*
ihandle
;
extern
int
(
*
prom
)
(
void
*
);
extern
void
*
chosen_handle
;
extern
phandle
chosen_handle
;
extern
ihandle
stdout
;
extern
void
*
stdin
;
extern
void
*
stdout
;
extern
void
*
stderr
;
int
call_prom
(
const
char
*
service
,
int
nargs
,
int
nret
,
...)
;
int
call_prom_ret
(
const
char
*
service
,
int
nargs
,
int
nret
,
unsigned
int
*
rets
,
...)
;
extern
int
write
(
void
*
handle
,
void
*
ptr
,
int
nb
);
extern
int
read
(
void
*
handle
,
void
*
ptr
,
int
nb
);
extern
void
exit
(
void
);
extern
void
pause
(
void
);
extern
void
*
finddevice
(
const
char
*
);
extern
void
*
claim
(
unsigned
long
virt
,
unsigned
long
size
,
unsigned
long
align
);
extern
int
getprop
(
void
*
phandle
,
const
char
*
name
,
void
*
buf
,
int
buflen
);
extern
void
*
claim
(
unsigned
long
virt
,
unsigned
long
size
,
unsigned
long
aln
);
static
inline
void
exit
(
void
)
{
call_prom
(
"exit"
,
0
,
0
);
}
static
inline
phandle
finddevice
(
const
char
*
name
)
{
return
(
phandle
)
call_prom
(
"finddevice"
,
1
,
1
,
name
);
}
static
inline
int
getprop
(
void
*
phandle
,
const
char
*
name
,
void
*
buf
,
int
buflen
)
{
return
call_prom
(
"getprop"
,
4
,
1
,
phandle
,
name
,
buf
,
buflen
);
}
#endif
/* _PPC_BOOT_PROM_H_ */
arch/powerpc/boot/rs6000.h
0 → 100644
View file @
87530db5
/* IBM RS/6000 "XCOFF" file definitions for BFD.
Copyright (C) 1990, 1991 Free Software Foundation, Inc.
FIXME: Can someone provide a transliteration of this name into ASCII?
Using the following chars caused a compiler warning on HIUX (so I replaced
them with octal escapes), and isn't useful without an understanding of what
character set it is.
Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM
and John Gilmore of Cygnus Support. */
/********************** FILE HEADER **********************/
struct
external_filehdr
{
char
f_magic
[
2
];
/* magic number */
char
f_nscns
[
2
];
/* number of sections */
char
f_timdat
[
4
];
/* time & date stamp */
char
f_symptr
[
4
];
/* file pointer to symtab */
char
f_nsyms
[
4
];
/* number of symtab entries */
char
f_opthdr
[
2
];
/* sizeof(optional hdr) */
char
f_flags
[
2
];
/* flags */
};
/* IBM RS/6000 */
#define U802WRMAGIC 0730
/* writeable text segments **chh** */
#define U802ROMAGIC 0735
/* readonly sharable text segments */
#define U802TOCMAGIC 0737
/* readonly text segments and TOC */
#define BADMAG(x) \
((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
(x).f_magic != U802TOCMAGIC)
#define FILHDR struct external_filehdr
#define FILHSZ 20
/********************** AOUT "OPTIONAL HEADER" **********************/
typedef
struct
{
unsigned
char
magic
[
2
];
/* type of file */
unsigned
char
vstamp
[
2
];
/* version stamp */
unsigned
char
tsize
[
4
];
/* text size in bytes, padded to FW bdry */
unsigned
char
dsize
[
4
];
/* initialized data " " */
unsigned
char
bsize
[
4
];
/* uninitialized data " " */
unsigned
char
entry
[
4
];
/* entry pt. */
unsigned
char
text_start
[
4
];
/* base of text used for this file */
unsigned
char
data_start
[
4
];
/* base of data used for this file */
unsigned
char
o_toc
[
4
];
/* address of TOC */
unsigned
char
o_snentry
[
2
];
/* section number of entry point */
unsigned
char
o_sntext
[
2
];
/* section number of .text section */
unsigned
char
o_sndata
[
2
];
/* section number of .data section */
unsigned
char
o_sntoc
[
2
];
/* section number of TOC */
unsigned
char
o_snloader
[
2
];
/* section number of .loader section */
unsigned
char
o_snbss
[
2
];
/* section number of .bss section */
unsigned
char
o_algntext
[
2
];
/* .text alignment */
unsigned
char
o_algndata
[
2
];
/* .data alignment */
unsigned
char
o_modtype
[
2
];
/* module type (??) */
unsigned
char
o_cputype
[
2
];
/* cpu type */
unsigned
char
o_maxstack
[
4
];
/* max stack size (??) */
unsigned
char
o_maxdata
[
4
];
/* max data size (??) */
unsigned
char
o_resv2
[
12
];
/* reserved */
}
AOUTHDR
;
#define AOUTSZ 72
#define SMALL_AOUTSZ (28)
#define AOUTHDRSZ 72
#define RS6K_AOUTHDR_OMAGIC 0x0107
/* old: text & data writeable */
#define RS6K_AOUTHDR_NMAGIC 0x0108
/* new: text r/o, data r/w */
#define RS6K_AOUTHDR_ZMAGIC 0x010B
/* paged: text r/o, both page-aligned */
/********************** SECTION HEADER **********************/
struct
external_scnhdr
{
char
s_name
[
8
];
/* section name */
char
s_paddr
[
4
];
/* physical address, aliased s_nlib */
char
s_vaddr
[
4
];
/* virtual address */
char
s_size
[
4
];
/* section size */
char
s_scnptr
[
4
];
/* file ptr to raw data for section */
char
s_relptr
[
4
];
/* file ptr to relocation */
char
s_lnnoptr
[
4
];
/* file ptr to line numbers */
char
s_nreloc
[
2
];
/* number of relocation entries */
char
s_nlnno
[
2
];
/* number of line number entries*/
char
s_flags
[
4
];
/* flags */
};
/*
* names of "special" sections
*/
#define _TEXT ".text"
#define _DATA ".data"
#define _BSS ".bss"
#define _PAD ".pad"
#define _LOADER ".loader"
#define SCNHDR struct external_scnhdr
#define SCNHSZ 40
/* XCOFF uses a special .loader section with type STYP_LOADER. */
#define STYP_LOADER 0x1000
/* XCOFF uses a special .debug section with type STYP_DEBUG. */
#define STYP_DEBUG 0x2000
/* XCOFF handles line number or relocation overflow by creating
another section header with STYP_OVRFLO set. */
#define STYP_OVRFLO 0x8000
/********************** LINE NUMBERS **********************/
/* 1 line number entry for every "breakpointable" source line in a section.
* Line numbers are grouped on a per function basis; first entry in a function
* grouping will have l_lnno = 0 and in place of physical address will be the
* symbol table index of the function name.
*/
struct
external_lineno
{
union
{
char
l_symndx
[
4
];
/* function name symbol index, iff l_lnno == 0*/
char
l_paddr
[
4
];
/* (physical) address of line number */
}
l_addr
;
char
l_lnno
[
2
];
/* line number */
};
#define LINENO struct external_lineno
#define LINESZ 6
/********************** SYMBOLS **********************/
#define E_SYMNMLEN 8
/* # characters in a symbol name */
#define E_FILNMLEN 14
/* # characters in a file name */
#define E_DIMNUM 4
/* # array dimensions in auxiliary entry */
struct
external_syment
{
union
{
char
e_name
[
E_SYMNMLEN
];
struct
{
char
e_zeroes
[
4
];
char
e_offset
[
4
];
}
e
;
}
e
;
char
e_value
[
4
];
char
e_scnum
[
2
];
char
e_type
[
2
];
char
e_sclass
[
1
];
char
e_numaux
[
1
];
};
#define N_BTMASK (017)
#define N_TMASK (060)
#define N_BTSHFT (4)
#define N_TSHIFT (2)
union
external_auxent
{
struct
{
char
x_tagndx
[
4
];
/* str, un, or enum tag indx */
union
{
struct
{
char
x_lnno
[
2
];
/* declaration line number */
char
x_size
[
2
];
/* str/union/array size */
}
x_lnsz
;
char
x_fsize
[
4
];
/* size of function */
}
x_misc
;
union
{
struct
{
/* if ISFCN, tag, or .bb */
char
x_lnnoptr
[
4
];
/* ptr to fcn line # */
char
x_endndx
[
4
];
/* entry ndx past block end */
}
x_fcn
;
struct
{
/* if ISARY, up to 4 dimen. */
char
x_dimen
[
E_DIMNUM
][
2
];
}
x_ary
;
}
x_fcnary
;
char
x_tvndx
[
2
];
/* tv index */
}
x_sym
;
union
{
char
x_fname
[
E_FILNMLEN
];
struct
{
char
x_zeroes
[
4
];
char
x_offset
[
4
];
}
x_n
;
}
x_file
;
struct
{
char
x_scnlen
[
4
];
/* section length */
char
x_nreloc
[
2
];
/* # relocation entries */
char
x_nlinno
[
2
];
/* # line numbers */
}
x_scn
;
struct
{
char
x_tvfill
[
4
];
/* tv fill value */
char
x_tvlen
[
2
];
/* length of .tv */
char
x_tvran
[
2
][
2
];
/* tv range */
}
x_tv
;
/* info about .tv section (in auxent of symbol .tv)) */
struct
{
unsigned
char
x_scnlen
[
4
];
unsigned
char
x_parmhash
[
4
];
unsigned
char
x_snhash
[
2
];
unsigned
char
x_smtyp
[
1
];
unsigned
char
x_smclas
[
1
];
unsigned
char
x_stab
[
4
];
unsigned
char
x_snstab
[
2
];
}
x_csect
;
};
#define SYMENT struct external_syment
#define SYMESZ 18
#define AUXENT union external_auxent
#define AUXESZ 18
#define DBXMASK 0x80
/* for dbx storage mask */
#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
/********************** RELOCATION DIRECTIVES **********************/
struct
external_reloc
{
char
r_vaddr
[
4
];
char
r_symndx
[
4
];
char
r_size
[
1
];
char
r_type
[
1
];
};
#define RELOC struct external_reloc
#define RELSZ 10
#define DEFAULT_DATA_SECTION_ALIGNMENT 4
#define DEFAULT_BSS_SECTION_ALIGNMENT 4
#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
/* For new sections we havn't heard of before */
#define DEFAULT_SECTION_ALIGNMENT 4
arch/powerpc/boot/stdio.c
0 → 100644
View file @
87530db5
/*
* Copyright (C) Paul Mackerras 1997.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <stdarg.h>
#include <stddef.h>
#include "string.h"
#include "stdio.h"
#include "prom.h"
size_t
strnlen
(
const
char
*
s
,
size_t
count
)
{
const
char
*
sc
;
for
(
sc
=
s
;
count
--
&&
*
sc
!=
'\0'
;
++
sc
)
/* nothing */
;
return
sc
-
s
;
}
extern
unsigned
int
__div64_32
(
unsigned
long
long
*
dividend
,
unsigned
int
divisor
);
/* The unnecessary pointer compare is there
* to check for type safety (n must be 64bit)
*/
# define do_div(n,base) ({ \
unsigned int __base = (base); \
unsigned int __rem; \
(void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \
if (((n) >> 32) == 0) { \
__rem = (unsigned int)(n) % __base; \
(n) = (unsigned int)(n) / __base; \
} else \
__rem = __div64_32(&(n), __base); \
__rem; \
})
static
int
skip_atoi
(
const
char
**
s
)
{
int
i
,
c
;
for
(
i
=
0
;
'0'
<=
(
c
=
**
s
)
&&
c
<=
'9'
;
++*
s
)
i
=
i
*
10
+
c
-
'0'
;
return
i
;
}
#define ZEROPAD 1
/* pad with zero */
#define SIGN 2
/* unsigned/signed long */
#define PLUS 4
/* show plus */
#define SPACE 8
/* space if plus */
#define LEFT 16
/* left justified */
#define SPECIAL 32
/* 0x */
#define LARGE 64
/* use 'ABCDEF' instead of 'abcdef' */
static
char
*
number
(
char
*
str
,
unsigned
long
long
num
,
int
base
,
int
size
,
int
precision
,
int
type
)
{
char
c
,
sign
,
tmp
[
66
];
const
char
*
digits
=
"0123456789abcdefghijklmnopqrstuvwxyz"
;
int
i
;
if
(
type
&
LARGE
)
digits
=
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
if
(
type
&
LEFT
)
type
&=
~
ZEROPAD
;
if
(
base
<
2
||
base
>
36
)
return
0
;
c
=
(
type
&
ZEROPAD
)
?
'0'
:
' '
;
sign
=
0
;
if
(
type
&
SIGN
)
{
if
((
signed
long
long
)
num
<
0
)
{
sign
=
'-'
;
num
=
-
(
signed
long
long
)
num
;
size
--
;
}
else
if
(
type
&
PLUS
)
{
sign
=
'+'
;
size
--
;
}
else
if
(
type
&
SPACE
)
{
sign
=
' '
;
size
--
;
}
}
if
(
type
&
SPECIAL
)
{
if
(
base
==
16
)
size
-=
2
;
else
if
(
base
==
8
)
size
--
;
}
i
=
0
;
if
(
num
==
0
)
tmp
[
i
++
]
=
'0'
;
else
while
(
num
!=
0
)
{
tmp
[
i
++
]
=
digits
[
do_div
(
num
,
base
)];
}
if
(
i
>
precision
)
precision
=
i
;
size
-=
precision
;
if
(
!
(
type
&
(
ZEROPAD
+
LEFT
)))
while
(
size
-->
0
)
*
str
++
=
' '
;
if
(
sign
)
*
str
++
=
sign
;
if
(
type
&
SPECIAL
)
{
if
(
base
==
8
)
*
str
++
=
'0'
;
else
if
(
base
==
16
)
{
*
str
++
=
'0'
;
*
str
++
=
digits
[
33
];
}
}
if
(
!
(
type
&
LEFT
))
while
(
size
--
>
0
)
*
str
++
=
c
;
while
(
i
<
precision
--
)
*
str
++
=
'0'
;
while
(
i
--
>
0
)
*
str
++
=
tmp
[
i
];
while
(
size
--
>
0
)
*
str
++
=
' '
;
return
str
;
}
int
vsprintf
(
char
*
buf
,
const
char
*
fmt
,
va_list
args
)
{
int
len
;
unsigned
long
long
num
;
int
i
,
base
;
char
*
str
;
const
char
*
s
;
int
flags
;
/* flags to number() */
int
field_width
;
/* width of output field */
int
precision
;
/* min. # of digits for integers; max
number of chars for from string */
int
qualifier
;
/* 'h', 'l', or 'L' for integer fields */
/* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */
for
(
str
=
buf
;
*
fmt
;
++
fmt
)
{
if
(
*
fmt
!=
'%'
)
{
*
str
++
=
*
fmt
;
continue
;
}
/* process flags */
flags
=
0
;
repeat:
++
fmt
;
/* this also skips first '%' */
switch
(
*
fmt
)
{
case
'-'
:
flags
|=
LEFT
;
goto
repeat
;
case
'+'
:
flags
|=
PLUS
;
goto
repeat
;
case
' '
:
flags
|=
SPACE
;
goto
repeat
;
case
'#'
:
flags
|=
SPECIAL
;
goto
repeat
;
case
'0'
:
flags
|=
ZEROPAD
;
goto
repeat
;
}
/* get field width */
field_width
=
-
1
;
if
(
'0'
<=
*
fmt
&&
*
fmt
<=
'9'
)
field_width
=
skip_atoi
(
&
fmt
);
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
/* it's the next argument */
field_width
=
va_arg
(
args
,
int
);
if
(
field_width
<
0
)
{
field_width
=
-
field_width
;
flags
|=
LEFT
;
}
}
/* get the precision */
precision
=
-
1
;
if
(
*
fmt
==
'.'
)
{
++
fmt
;
if
(
'0'
<=
*
fmt
&&
*
fmt
<=
'9'
)
precision
=
skip_atoi
(
&
fmt
);
else
if
(
*
fmt
==
'*'
)
{
++
fmt
;
/* it's the next argument */
precision
=
va_arg
(
args
,
int
);
}
if
(
precision
<
0
)
precision
=
0
;
}
/* get the conversion qualifier */
qualifier
=
-
1
;
if
(
*
fmt
==
'h'
||
*
fmt
==
'l'
||
*
fmt
==
'L'
||
*
fmt
==
'Z'
)
{
qualifier
=
*
fmt
;
++
fmt
;
}
/* default base */
base
=
10
;
switch
(
*
fmt
)
{
case
'c'
:
if
(
!
(
flags
&
LEFT
))
while
(
--
field_width
>
0
)
*
str
++
=
' '
;
*
str
++
=
(
unsigned
char
)
va_arg
(
args
,
int
);
while
(
--
field_width
>
0
)
*
str
++
=
' '
;
continue
;
case
's'
:
s
=
va_arg
(
args
,
char
*
);
if
(
!
s
)
s
=
"<NULL>"
;
len
=
strnlen
(
s
,
precision
);
if
(
!
(
flags
&
LEFT
))
while
(
len
<
field_width
--
)
*
str
++
=
' '
;
for
(
i
=
0
;
i
<
len
;
++
i
)
*
str
++
=
*
s
++
;
while
(
len
<
field_width
--
)
*
str
++
=
' '
;
continue
;
case
'p'
:
if
(
field_width
==
-
1
)
{
field_width
=
2
*
sizeof
(
void
*
);
flags
|=
ZEROPAD
;
}
str
=
number
(
str
,
(
unsigned
long
)
va_arg
(
args
,
void
*
),
16
,
field_width
,
precision
,
flags
);
continue
;
case
'n'
:
if
(
qualifier
==
'l'
)
{
long
*
ip
=
va_arg
(
args
,
long
*
);
*
ip
=
(
str
-
buf
);
}
else
if
(
qualifier
==
'Z'
)
{
size_t
*
ip
=
va_arg
(
args
,
size_t
*
);
*
ip
=
(
str
-
buf
);
}
else
{
int
*
ip
=
va_arg
(
args
,
int
*
);
*
ip
=
(
str
-
buf
);
}
continue
;
case
'%'
:
*
str
++
=
'%'
;
continue
;
/* integer number formats - set up the flags and "break" */
case
'o'
:
base
=
8
;
break
;
case
'X'
:
flags
|=
LARGE
;
case
'x'
:
base
=
16
;
break
;
case
'd'
:
case
'i'
:
flags
|=
SIGN
;
case
'u'
:
break
;
default:
*
str
++
=
'%'
;
if
(
*
fmt
)
*
str
++
=
*
fmt
;
else
--
fmt
;
continue
;
}
if
(
qualifier
==
'l'
)
{
num
=
va_arg
(
args
,
unsigned
long
);
if
(
flags
&
SIGN
)
num
=
(
signed
long
)
num
;
}
else
if
(
qualifier
==
'Z'
)
{
num
=
va_arg
(
args
,
size_t
);
}
else
if
(
qualifier
==
'h'
)
{
num
=
(
unsigned
short
)
va_arg
(
args
,
int
);
if
(
flags
&
SIGN
)
num
=
(
signed
short
)
num
;
}
else
{
num
=
va_arg
(
args
,
unsigned
int
);
if
(
flags
&
SIGN
)
num
=
(
signed
int
)
num
;
}
str
=
number
(
str
,
num
,
base
,
field_width
,
precision
,
flags
);
}
*
str
=
'\0'
;
return
str
-
buf
;
}
int
sprintf
(
char
*
buf
,
const
char
*
fmt
,
...)
{
va_list
args
;
int
i
;
va_start
(
args
,
fmt
);
i
=
vsprintf
(
buf
,
fmt
,
args
);
va_end
(
args
);
return
i
;
}
static
char
sprint_buf
[
1024
];
int
printf
(
const
char
*
fmt
,
...)
{
va_list
args
;
int
n
;
va_start
(
args
,
fmt
);
n
=
vsprintf
(
sprint_buf
,
fmt
,
args
);
va_end
(
args
);
write
(
stdout
,
sprint_buf
,
n
);
return
n
;
}
arch/powerpc/boot/stdio.h
View file @
87530db5
...
...
@@ -7,10 +7,4 @@ extern int sprintf(char *buf, const char *fmt, ...);
extern
int
vsprintf
(
char
*
buf
,
const
char
*
fmt
,
va_list
args
);
extern
int
putc
(
int
c
,
void
*
f
);
extern
int
putchar
(
int
c
);
extern
int
getchar
(
void
);
extern
int
fputs
(
char
*
str
,
void
*
f
);
#endif
/* _PPC_BOOT_STDIO_H_ */
arch/powerpc/boot/string.S
View file @
87530db5
...
...
@@ -107,10 +107,12 @@ memcpy:
rlwinm
.
r7
,
r5
,
32
-
3
,
3
,
31
/*
r7
=
r5
>>
3
*/
addi
r6
,
r3
,-
4
addi
r4
,
r4
,-
4
beq
2
f
/*
if
less
than
8
bytes
to
do
*/
beq
3
f
/*
if
less
than
8
bytes
to
do
*/
andi
.
r0
,
r6
,
3
/*
get
dest
word
aligned
*/
mtctr
r7
bne
5
f
andi
.
r0
,
r4
,
3
/*
check
src
word
aligned
too
*/
bne
3
f
1
:
lwz
r7
,
4
(
r4
)
lwzu
r8
,
8
(
r4
)
stw
r7
,
4
(
r6
)
...
...
@@ -132,6 +134,11 @@ memcpy:
bdnz
4
b
blr
5
:
subfic
r0
,
r0
,
4
cmpw
cr1
,
r0
,
r5
add
r7
,
r0
,
r4
andi
.
r7
,
r7
,
3
/*
will
source
be
word
-
aligned
too
?
*/
ble
cr1
,
3
b
bne
3
b
/*
do
byte
-
by
-
byte
if
not
*/
mtctr
r0
6
:
lbz
r7
,
4
(
r4
)
addi
r4
,
r4
,
1
...
...
@@ -149,10 +156,12 @@ backwards_memcpy:
rlwinm
.
r7
,
r5
,
32
-
3
,
3
,
31
/*
r7
=
r5
>>
3
*/
add
r6
,
r3
,
r5
add
r4
,
r4
,
r5
beq
2
f
beq
3
f
andi
.
r0
,
r6
,
3
mtctr
r7
bne
5
f
andi
.
r0
,
r4
,
3
bne
3
f
1
:
lwz
r7
,-
4
(
r4
)
lwzu
r8
,-
8
(
r4
)
stw
r7
,-
4
(
r6
)
...
...
@@ -171,7 +180,12 @@ backwards_memcpy:
stbu
r0
,-
1
(
r6
)
bdnz
4
b
blr
5
:
mtctr
r0
5
:
cmpw
cr1
,
r0
,
r5
subf
r7
,
r0
,
r4
andi
.
r7
,
r7
,
3
ble
cr1
,
3
b
bne
3
b
mtctr
r0
6
:
lbzu
r7
,-
1
(
r4
)
stbu
r7
,-
1
(
r6
)
bdnz
6
b
...
...
arch/powerpc/boot/zImage.coff.lds
0 → 100644
View file @
87530db5
OUTPUT_ARCH(powerpc:common)
ENTRY(_start)
SECTIONS
{
. = (5*1024*1024);
_start = .;
.text :
{
*(.text)
*(.fixup)
}
_etext = .;
. = ALIGN(4096);
.data :
{
*(.rodata*)
*(.data*)
*(.sdata*)
__got2_start = .;
*(.got2)
__got2_end = .;
_vmlinux_start = .;
*(.kernel:vmlinux.strip)
_vmlinux_end = .;
_initrd_start = .;
*(.kernel:initrd)
_initrd_end = .;
}
. = ALIGN(4096);
_edata = .;
__bss_start = .;
.bss :
{
*(.sbss)
*(.bss)
}
_end = . ;
/DISCARD/ :
{
*(.comment)
}
}
arch/powerpc/configs/mpc834x_sys_defconfig
0 → 100644
View file @
87530db5
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.15-g461d4edf-dirty
# Fri Jan 13 11:01:47 2006
#
# CONFIG_PPC64 is not set
CONFIG_PPC32=y
CONFIG_PPC_MERGE=y
CONFIG_MMU=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_PPC=y
CONFIG_EARLY_PRINTK=y
CONFIG_GENERIC_NVRAM=y
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_PPC_OF=y
CONFIG_PPC_UDBG_16550=y
# CONFIG_GENERIC_TBSYNC is not set
CONFIG_DEFAULT_UIMAGE=y
#
# Processor support
#
# CONFIG_CLASSIC32 is not set
# CONFIG_PPC_52xx is not set
# CONFIG_PPC_82xx is not set
CONFIG_PPC_83xx=y
# CONFIG_40x is not set
# CONFIG_44x is not set
# CONFIG_8xx is not set
# CONFIG_E200 is not set
# CONFIG_E500 is not set
CONFIG_6xx=y
CONFIG_83xx=y
CONFIG_PPC_FPU=y
CONFIG_PPC_STD_MMU=y
CONFIG_PPC_STD_MMU_32=y
# CONFIG_SMP is not set
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_EMBEDDED=y
# CONFIG_KALLSYMS is not set
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
# CONFIG_EPOLL is not set
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
CONFIG_SLAB=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# CONFIG_SLOB is not set
#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_KMOD is not set
#
# Block layer
#
# CONFIG_LBD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_DEFAULT_AS=y
# CONFIG_DEFAULT_DEADLINE is not set
# CONFIG_DEFAULT_CFQ is not set
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="anticipatory"
CONFIG_PPC_GEN550=y
# CONFIG_WANT_EARLY_SERIAL is not set
#
# Platform support
#
CONFIG_MPC834x_SYS=y
CONFIG_MPC834x=y
#
# Kernel options
#
# CONFIG_HIGHMEM is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
CONFIG_ARCH_FLATMEM_ENABLE=y
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_PROC_DEVICETREE=y
# CONFIG_CMDLINE_BOOL is not set
# CONFIG_PM is not set
# CONFIG_SOFTWARE_SUSPEND is not set
CONFIG_SECCOMP=y
CONFIG_ISA_DMA_API=y
#
# Bus options
#
CONFIG_GENERIC_ISA_DMA=y
# CONFIG_PPC_I8259 is not set
CONFIG_PPC_INDIRECT_PCI=y
CONFIG_FSL_SOC=y
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_LEGACY_PROC is not set
#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# PCI Hotplug Support
#
# CONFIG_HOTPLUG_PCI is not set
#
# Advanced setup
#
# CONFIG_ADVANCED_OPTIONS is not set
#
# Default settings for advanced configuration options are used
#
CONFIG_HIGHMEM_START=0xfe000000
CONFIG_LOWMEM_SIZE=0x30000000
CONFIG_KERNEL_START=0xc0000000
CONFIG_TASK_SIZE=0x80000000
CONFIG_BOOT_LOAD=0x00800000
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set
# CONFIG_NETFILTER is not set
#
# DCCP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP is not set
#
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Plug and Play support
#
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=32768
CONFIG_BLK_DEV_INITRD=y
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
#
# ATA/ATAPI/MFM/RLL support
#
# CONFIG_IDE is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set
#
# I2O device support
#
# CONFIG_I2O is not set
#
# Macintosh device drivers
#
# CONFIG_WINDFARM is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
#
# PHY device support
#
CONFIG_PHYLIB=y
#
# MII PHY device drivers
#
CONFIG_MARVELL_PHY=y
# CONFIG_DAVICOM_PHY is not set
# CONFIG_QSEMI_PHY is not set
# CONFIG_LXT_PHY is not set
# CONFIG_CICADA_PHY is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
# CONFIG_NET_VENDOR_3COM is not set
#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_B44 is not set
# CONFIG_FORCEDETH is not set
# CONFIG_DGRS is not set
# CONFIG_EEPRO100 is not set
CONFIG_E100=y
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SKGE is not set
# CONFIG_SKY2 is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
# CONFIG_TIGON3 is not set
# CONFIG_BNX2 is not set
CONFIG_GIANFAR=y
# CONFIG_GFAR_NAPI is not set
#
# Ethernet (10000 Mbit)
#
# CONFIG_CHELSIO_T1 is not set
# CONFIG_IXGB is not set
# CONFIG_S2IO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Telephony Support
#
# CONFIG_PHONE is not set
#
# Input device support
#
CONFIG_INPUT=y
#
# Userland interfaces
#
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#
# CONFIG_SERIO is not set
# CONFIG_GAMEPORT is not set
#
# Character devices
#
# CONFIG_VT is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set
#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set
#
# Watchdog Cards
#
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
#
# Watchdog Device Drivers
#
# CONFIG_SOFT_WATCHDOG is not set
CONFIG_83xx_WDT=y
#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set
# CONFIG_NVRAM is not set
CONFIG_GEN_RTC=y
# CONFIG_GEN_RTC_X is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_AGP is not set
# CONFIG_DRM is not set
# CONFIG_RAW_DRIVER is not set
#
# TPM devices
#
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
#
# I2C support
#
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
#
# I2C Algorithms
#
# CONFIG_I2C_ALGOBIT is not set
# CONFIG_I2C_ALGOPCF is not set
# CONFIG_I2C_ALGOPCA is not set
#
# I2C Hardware Bus support
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_I801 is not set
# CONFIG_I2C_I810 is not set
# CONFIG_I2C_PIIX4 is not set
CONFIG_I2C_MPC=y
# CONFIG_I2C_NFORCE2 is not set
# CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_PROSAVAGE is not set
# CONFIG_I2C_SAVAGE4 is not set
# CONFIG_SCx200_ACB is not set
# CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set
# CONFIG_I2C_STUB is not set
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set
# CONFIG_I2C_VOODOO3 is not set
# CONFIG_I2C_PCA_ISA is not set
#
# Miscellaneous I2C Chip support
#
# CONFIG_SENSORS_DS1337 is not set
# CONFIG_SENSORS_DS1374 is not set
# CONFIG_SENSORS_EEPROM is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_M41T00 is not set
# CONFIG_SENSORS_MAX6875 is not set
# CONFIG_RTC_X1205_I2C is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set
#
# Hardware Monitoring support
#
CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1031 is not set
# CONFIG_SENSORS_ADM9240 is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_FSCHER is not set
# CONFIG_SENSORS_FSCPOS is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM87 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_LM92 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT8231 is not set
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83792D is not set
# CONFIG_SENSORS_W83L785TS is not set
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_HWMON_DEBUG_CHIP is not set
#
# Misc devices
#
#
# Multimedia Capabilities Port drivers
#
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set
#
# Graphics support
#
# CONFIG_FB is not set
#
# Sound
#
# CONFIG_SOUND is not set
#
# USB support
#
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
# CONFIG_USB is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#
#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
#
# SN Devices
#
#
# File systems
#
CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
# CONFIG_EXT3_FS_POSIX_ACL is not set
# CONFIG_EXT3_FS_SECURITY is not set
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set
#
# DOS/FAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
#
# Network File Systems
#
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
# CONFIG_NFS_DIRECTIO is not set
# CONFIG_NFSD is not set
CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set
#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
# CONFIG_OSF_PARTITION is not set
# CONFIG_AMIGA_PARTITION is not set
# CONFIG_ATARI_PARTITION is not set
# CONFIG_MAC_PARTITION is not set
# CONFIG_MSDOS_PARTITION is not set
# CONFIG_LDM_PARTITION is not set
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_EFI_PARTITION is not set
#
# Native Language Support
#
# CONFIG_NLS is not set
#
# Library routines
#
# CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set
CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set
#
# Instrumentation Support
#
# CONFIG_PROFILING is not set
#
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not set
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_KERNEL is not set
CONFIG_LOG_BUF_SHIFT=14
# CONFIG_BOOTX_TEXT is not set
# CONFIG_SERIAL_TEXT_DEBUG is not set
# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
# CONFIG_PPC_EARLY_DEBUG_G5 is not set
# CONFIG_PPC_EARLY_DEBUG_RTAS is not set
# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
#
# Cryptographic options
#
CONFIG_CRYPTO=y
# CONFIG_CRYPTO_HMAC is not set
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set
#
# Hardware crypto devices
#
#
# SEC2.x Options
#
CONFIG_MPC8349E_SEC2x=y
#
# SEC2.x Test Options
#
CONFIG_MPC8349E_SEC2xTEST=y
arch/powerpc/kernel/asm-offsets.c
View file @
87530db5
...
...
@@ -135,7 +135,7 @@ int main(void)
DEFINE
(
PACA_EXMC
,
offsetof
(
struct
paca_struct
,
exmc
));
DEFINE
(
PACA_EXSLB
,
offsetof
(
struct
paca_struct
,
exslb
));
DEFINE
(
PACAEMERGSP
,
offsetof
(
struct
paca_struct
,
emergency_sp
));
DEFINE
(
PACALPPACA
,
offsetof
(
struct
paca_struct
,
lppaca
));
DEFINE
(
PACALPPACA
PTR
,
offsetof
(
struct
paca_struct
,
lppaca_ptr
));
DEFINE
(
PACAHWCPUID
,
offsetof
(
struct
paca_struct
,
hw_cpu_id
));
DEFINE
(
LPPACASRR0
,
offsetof
(
struct
lppaca
,
saved_srr0
));
...
...
arch/powerpc/kernel/cpu_setup_power4.S
View file @
87530db5
...
...
@@ -130,7 +130,7 @@ _GLOBAL(__save_cpu_setup)
mfcr
r7
/
*
Get
storage
ptr
*/
LOAD
ADDR
(
r5
,
cpu_state_storage
)
LOAD
_REG_IMMEDIATE
(
r5
,
cpu_state_storage
)
/
*
We
only
deal
with
970
for
now
*/
mfspr
r0
,
SPRN_PVR
...
...
@@ -164,7 +164,7 @@ _GLOBAL(__restore_cpu_setup)
/
*
Get
storage
ptr
(
FIXME
when
using
anton
reloc
as
we
*
are
running
with
translation
disabled
here
*/
LOAD
ADDR
(
r5
,
cpu_state_storage
)
LOAD
_REG_IMMEDIATE
(
r5
,
cpu_state_storage
)
/
*
We
only
deal
with
970
for
now
*/
mfspr
r0
,
SPRN_PVR
...
...
arch/powerpc/kernel/cputable.c
View file @
87530db5
...
...
@@ -55,7 +55,8 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5)
#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS)
#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
PPC_FEATURE_BOOKE)
/* We only set the spe features if the kernel was compiled with
* spe support
...
...
@@ -79,7 +80,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/power3"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"power3"
,
},
{
/* Power3+ */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -92,7 +94,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/power3"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"power3"
,
},
{
/* Northstar */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -105,7 +108,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/rs64"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"rs64"
,
},
{
/* Pulsar */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -118,7 +122,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/rs64"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"rs64"
,
},
{
/* I-star */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -131,7 +136,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/rs64"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"rs64"
,
},
{
/* S-star */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -144,7 +150,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power3
,
.
oprofile_cpu_type
=
"ppc64/rs64"
,
.
oprofile_type
=
RS64
,
.
oprofile_type
=
PPC_OPROFILE_RS64
,
.
platform
=
"rs64"
,
},
{
/* Power4 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -157,7 +164,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power4
,
.
oprofile_cpu_type
=
"ppc64/power4"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"power4"
,
},
{
/* Power4+ */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -170,7 +178,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_power4
,
.
oprofile_cpu_type
=
"ppc64/power4"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"power4"
,
},
{
/* PPC970 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -184,7 +193,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_ppc970
,
.
oprofile_cpu_type
=
"ppc64/970"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"ppc970"
,
},
#endif
/* CONFIG_PPC64 */
#if defined(CONFIG_PPC64) || defined(CONFIG_POWER4)
...
...
@@ -204,7 +214,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
8
,
.
cpu_setup
=
__setup_cpu_ppc970
,
.
oprofile_cpu_type
=
"ppc64/970"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"ppc970"
,
},
#endif
/* defined(CONFIG_PPC64) || defined(CONFIG_POWER4) */
#ifdef CONFIG_PPC64
...
...
@@ -219,7 +230,8 @@ struct cpu_spec cpu_specs[] = {
.
dcache_bsize
=
128
,
.
cpu_setup
=
__setup_cpu_ppc970
,
.
oprofile_cpu_type
=
"ppc64/970"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"ppc970"
,
},
{
/* Power5 GR */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -232,7 +244,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_power4
,
.
oprofile_cpu_type
=
"ppc64/power5"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"power5"
,
},
{
/* Power5 GS */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -245,7 +258,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_power4
,
.
oprofile_cpu_type
=
"ppc64/power5+"
,
.
oprofile_type
=
POWER4
,
.
oprofile_type
=
PPC_OPROFILE_POWER4
,
.
platform
=
"power5+"
,
},
{
/* Cell Broadband Engine */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -257,6 +271,7 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
128
,
.
dcache_bsize
=
128
,
.
cpu_setup
=
__setup_cpu_be
,
.
platform
=
"ppc-cell-be"
,
},
{
/* default match */
.
pvr_mask
=
0x00000000
,
...
...
@@ -268,6 +283,7 @@ struct cpu_spec cpu_specs[] = {
.
dcache_bsize
=
128
,
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_power4
,
.
platform
=
"power4"
,
}
#endif
/* CONFIG_PPC64 */
#ifdef CONFIG_PPC32
...
...
@@ -281,6 +297,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_UNIFIED_CACHE
|
PPC_FEATURE_NO_TB
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc601"
,
},
{
/* 603 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -290,7 +307,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* 603e */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -300,7 +318,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* 603ev */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -310,7 +329,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* 604 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -321,7 +341,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
2
,
.
cpu_setup
=
__setup_cpu_604
.
cpu_setup
=
__setup_cpu_604
,
.
platform
=
"ppc604"
,
},
{
/* 604e */
.
pvr_mask
=
0xfffff000
,
...
...
@@ -332,7 +353,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_604
.
cpu_setup
=
__setup_cpu_604
,
.
platform
=
"ppc604"
,
},
{
/* 604r */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -343,7 +365,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_604
.
cpu_setup
=
__setup_cpu_604
,
.
platform
=
"ppc604"
,
},
{
/* 604ev */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -354,7 +377,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_604
.
cpu_setup
=
__setup_cpu_604
,
.
platform
=
"ppc604"
,
},
{
/* 740/750 (0x4202, don't support TAU ?) */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -365,7 +389,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750
.
cpu_setup
=
__setup_cpu_750
,
.
platform
=
"ppc750"
,
},
{
/* 750CX (80100 and 8010x?) */
.
pvr_mask
=
0xfffffff0
,
...
...
@@ -376,7 +401,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750cx
.
cpu_setup
=
__setup_cpu_750cx
,
.
platform
=
"ppc750"
,
},
{
/* 750CX (82201 and 82202) */
.
pvr_mask
=
0xfffffff0
,
...
...
@@ -387,7 +413,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750cx
.
cpu_setup
=
__setup_cpu_750cx
,
.
platform
=
"ppc750"
,
},
{
/* 750CXe (82214) */
.
pvr_mask
=
0xfffffff0
,
...
...
@@ -398,7 +425,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750cx
.
cpu_setup
=
__setup_cpu_750cx
,
.
platform
=
"ppc750"
,
},
{
/* 750CXe "Gekko" (83214) */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -409,7 +437,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750cx
.
cpu_setup
=
__setup_cpu_750cx
,
.
platform
=
"ppc750"
,
},
{
/* 745/755 */
.
pvr_mask
=
0xfffff000
,
...
...
@@ -420,7 +449,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750
.
cpu_setup
=
__setup_cpu_750
,
.
platform
=
"ppc750"
,
},
{
/* 750FX rev 1.x */
.
pvr_mask
=
0xffffff00
,
...
...
@@ -431,7 +461,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750
.
cpu_setup
=
__setup_cpu_750
,
.
platform
=
"ppc750"
,
},
{
/* 750FX rev 2.0 must disable HID0[DPM] */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -442,7 +473,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750
.
cpu_setup
=
__setup_cpu_750
,
.
platform
=
"ppc750"
,
},
{
/* 750FX (All revs except 2.0) */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -453,7 +485,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750fx
.
cpu_setup
=
__setup_cpu_750fx
,
.
platform
=
"ppc750"
,
},
{
/* 750GX */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -464,7 +497,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750fx
.
cpu_setup
=
__setup_cpu_750fx
,
.
platform
=
"ppc750"
,
},
{
/* 740/750 (L2CR bit need fixup for 740) */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -475,7 +509,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_750
.
cpu_setup
=
__setup_cpu_750
,
.
platform
=
"ppc750"
,
},
{
/* 7400 rev 1.1 ? (no TAU) */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -486,7 +521,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_7400
.
cpu_setup
=
__setup_cpu_7400
,
.
platform
=
"ppc7400"
,
},
{
/* 7400 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -497,7 +533,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_7400
.
cpu_setup
=
__setup_cpu_7400
,
.
platform
=
"ppc7400"
,
},
{
/* 7410 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -508,7 +545,8 @@ struct cpu_spec cpu_specs[] = {
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
cpu_setup
=
__setup_cpu_7410
.
cpu_setup
=
__setup_cpu_7410
,
.
platform
=
"ppc7400"
,
},
{
/* 7450 2.0 - no doze/nap */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -521,7 +559,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7450 2.1 */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -534,7 +573,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7450 2.3 and newer */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -547,7 +587,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7455 rev 1.x */
.
pvr_mask
=
0xffffff00
,
...
...
@@ -560,7 +601,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7455 rev 2.0 */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -573,7 +615,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7455 others */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -586,7 +629,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7447/7457 Rev 1.0 */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -599,7 +643,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7447/7457 Rev 1.1 */
.
pvr_mask
=
0xffffffff
,
...
...
@@ -612,7 +657,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7447/7457 Rev 1.2 and later */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -625,7 +671,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7447A */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -638,7 +685,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 7448 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -651,7 +699,8 @@ struct cpu_spec cpu_specs[] = {
.
num_pmcs
=
6
,
.
cpu_setup
=
__setup_cpu_745x
,
.
oprofile_cpu_type
=
"ppc/7450"
,
.
oprofile_type
=
G4
,
.
oprofile_type
=
PPC_OPROFILE_G4
,
.
platform
=
"ppc7450"
,
},
{
/* 82xx (8240, 8245, 8260 are all 603e cores) */
.
pvr_mask
=
0x7fff0000
,
...
...
@@ -661,7 +710,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* All G2_LE (603e core, plus some) have the same pvr */
.
pvr_mask
=
0x7fff0000
,
...
...
@@ -671,7 +721,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* e300 (a 603e core, plus some) on 83xx */
.
pvr_mask
=
0x7fff0000
,
...
...
@@ -681,7 +732,8 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
cpu_setup
=
__setup_cpu_603
.
cpu_setup
=
__setup_cpu_603
,
.
platform
=
"ppc603"
,
},
{
/* default match, we assume split I/D cache & TB (non-601)... */
.
pvr_mask
=
0x00000000
,
...
...
@@ -691,6 +743,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
COMMON_USER
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc603"
,
},
#endif
/* CLASSIC_PPC */
#ifdef CONFIG_8xx
...
...
@@ -704,6 +757,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
icache_bsize
=
16
,
.
dcache_bsize
=
16
,
.
platform
=
"ppc823"
,
},
#endif
/* CONFIG_8xx */
#ifdef CONFIG_40x
...
...
@@ -715,6 +769,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
icache_bsize
=
16
,
.
dcache_bsize
=
16
,
.
platform
=
"ppc403"
,
},
{
/* 403GCX */
.
pvr_mask
=
0xffffff00
,
...
...
@@ -725,6 +780,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_NO_TB
,
.
icache_bsize
=
16
,
.
dcache_bsize
=
16
,
.
platform
=
"ppc403"
,
},
{
/* 403G ?? */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -734,6 +790,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
icache_bsize
=
16
,
.
dcache_bsize
=
16
,
.
platform
=
"ppc403"
,
},
{
/* 405GP */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -744,6 +801,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* STB 03xxx */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -754,6 +812,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* STB 04xxx */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -764,6 +823,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* NP405L */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -774,6 +834,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* NP4GS3 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -784,6 +845,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* NP405H */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -794,6 +856,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* 405GPr */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -804,6 +867,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* STBx25xx */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -814,6 +878,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* 405LP */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -823,6 +888,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* Xilinx Virtex-II Pro */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -833,6 +899,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
{
/* 405EP */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -843,6 +910,7 @@ struct cpu_spec cpu_specs[] = {
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc405"
,
},
#endif
/* CONFIG_40x */
...
...
@@ -852,81 +920,90 @@ struct cpu_spec cpu_specs[] = {
.
pvr_value
=
0x40000850
,
.
cpu_name
=
"440EP Rev. A"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
COMMON_USER
,
/* 440EP has an FPU */
.
cpu_user_features
=
COMMON_USER
_BOOKE
|
PPC_FEATURE_HAS_FPU
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x400008d3
,
.
cpu_name
=
"440EP Rev. B"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
COMMON_USER
,
/* 440EP has an FPU */
.
cpu_user_features
=
COMMON_USER
_BOOKE
|
PPC_FEATURE_HAS_FPU
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440GP Rev. B */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x40000440
,
.
cpu_name
=
"440GP Rev. B"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440gp"
,
},
{
/* 440GP Rev. C */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x40000481
,
.
cpu_name
=
"440GP Rev. C"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440gp"
,
},
{
/* 440GX Rev. A */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x50000850
,
.
cpu_name
=
"440GX Rev. A"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440GX Rev. B */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x50000851
,
.
cpu_name
=
"440GX Rev. B"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440GX Rev. C */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x50000892
,
.
cpu_name
=
"440GX Rev. C"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440GX Rev. F */
.
pvr_mask
=
0xf0000fff
,
.
pvr_value
=
0x50000894
,
.
cpu_name
=
"440GX Rev. F"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440SP Rev. A */
.
pvr_mask
=
0xff000fff
,
.
pvr_value
=
0x53000891
,
.
cpu_name
=
"440SP Rev. A"
,
.
cpu_features
=
CPU_FTRS_44X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
{
/* 440SPe Rev. A */
.
pvr_mask
=
0xff000fff
,
...
...
@@ -934,9 +1011,10 @@ struct cpu_spec cpu_specs[] = {
.
cpu_name
=
"440SPe Rev. A"
,
.
cpu_features
=
CPU_FTR_SPLIT_ID_CACHE
|
CPU_FTR_USE_TB
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
,
.
cpu_user_features
=
COMMON_USER_BOOKE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc440"
,
},
#endif
/* CONFIG_44x */
#ifdef CONFIG_FSL_BOOKE
...
...
@@ -946,10 +1024,11 @@ struct cpu_spec cpu_specs[] = {
.
cpu_name
=
"e200z5"
,
/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
.
cpu_features
=
CPU_FTRS_E200
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_
MMU
|
PPC_FEATURE_HAS_
EFP_SINGLE
|
.
cpu_user_features
=
COMMON_USER_BOOKE
|
PPC_FEATURE_HAS_EFP_SINGLE
|
PPC_FEATURE_UNIFIED_CACHE
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc5554"
,
},
{
/* e200z6 */
.
pvr_mask
=
0xfff00000
,
...
...
@@ -957,11 +1036,12 @@ struct cpu_spec cpu_specs[] = {
.
cpu_name
=
"e200z6"
,
/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
.
cpu_features
=
CPU_FTRS_E200
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_
HAS_MMU
|
PPC_FEATURE_
SPE_COMP
|
.
cpu_user_features
=
COMMON_USER_BOOKE
|
PPC_FEATURE_SPE_COMP
|
PPC_FEATURE_HAS_EFP_SINGLE
|
PPC_FEATURE_UNIFIED_CACHE
,
.
dcache_bsize
=
32
,
.
platform
=
"ppc5554"
,
},
{
/* e500 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -969,14 +1049,15 @@ struct cpu_spec cpu_specs[] = {
.
cpu_name
=
"e500"
,
/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
.
cpu_features
=
CPU_FTRS_E500
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_
HAS_MMU
|
PPC_FEATURE_
SPE_COMP
|
.
cpu_user_features
=
COMMON_USER_BOOKE
|
PPC_FEATURE_SPE_COMP
|
PPC_FEATURE_HAS_EFP_SINGLE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
oprofile_cpu_type
=
"ppc/e500"
,
.
oprofile_type
=
BOOKE
,
.
oprofile_type
=
PPC_OPROFILE_BOOKE
,
.
platform
=
"ppc8540"
,
},
{
/* e500v2 */
.
pvr_mask
=
0xffff0000
,
...
...
@@ -984,14 +1065,16 @@ struct cpu_spec cpu_specs[] = {
.
cpu_name
=
"e500v2"
,
/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
.
cpu_features
=
CPU_FTRS_E500_2
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_SPE_COMP
|
PPC_FEATURE_HAS_EFP_SINGLE
|
PPC_FEATURE_HAS_EFP_DOUBLE
,
.
cpu_user_features
=
COMMON_USER_BOOKE
|
PPC_FEATURE_SPE_COMP
|
PPC_FEATURE_HAS_EFP_SINGLE
|
PPC_FEATURE_HAS_EFP_DOUBLE
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
num_pmcs
=
4
,
.
oprofile_cpu_type
=
"ppc/e500"
,
.
oprofile_type
=
BOOKE
,
.
oprofile_type
=
PPC_OPROFILE_BOOKE
,
.
platform
=
"ppc8548"
,
},
#endif
#if !CLASSIC_PPC
...
...
@@ -1003,6 +1086,7 @@ struct cpu_spec cpu_specs[] = {
.
cpu_user_features
=
PPC_FEATURE_32
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
platform
=
"powerpc"
,
}
#endif
/* !CLASSIC_PPC */
#endif
/* CONFIG_PPC32 */
...
...
arch/powerpc/kernel/entry_32.S
View file @
87530db5
...
...
@@ -988,7 +988,7 @@ _GLOBAL(enter_rtas)
stwu
r1
,-
INT_FRAME_SIZE
(
r1
)
mflr
r0
stw
r0
,
INT_FRAME_SIZE
+
4
(
r1
)
LOADADDR
(
r4
,
rtas
)
LOAD
_REG_
ADDR
(
r4
,
rtas
)
lis
r6
,
1
f
@
ha
/*
physical
return
address
for
rtas
*/
addi
r6
,
r6
,
1
f
@
l
tophys
(
r6
,
r6
)
...
...
arch/powerpc/kernel/entry_64.S
View file @
87530db5
...
...
@@ -511,7 +511,8 @@ restore:
cmpdi
0
,
r5
,
0
beq
4
f
/
*
Check
for
pending
interrupts
(
iSeries
)
*/
ld
r3
,
PACALPPACA
+
LPPACAANYINT
(
r13
)
ld
r3
,
PACALPPACAPTR
(
r13
)
ld
r3
,
LPPACAANYINT
(
r3
)
cmpdi
r3
,
0
beq
+
4
f
/*
skip
do_IRQ
if
no
interrupts
*/
...
...
@@ -689,9 +690,8 @@ _GLOBAL(enter_rtas)
std
r6
,
PACASAVEDMSR
(
r13
)
/
*
Setup
our
real
return
addr
*/
SET_REG_TO_LABEL
(
r4
,.
rtas_return_loc
)
SET_REG_TO_CONST
(
r9
,
PAGE_OFFSET
)
sub
r4
,
r4
,
r9
LOAD_REG_ADDR
(
r4
,.
rtas_return_loc
)
clrldi
r4
,
r4
,
2
/*
convert
to
realmode
address
*/
mtlr
r4
li
r0
,
0
...
...
@@ -706,7 +706,7 @@ _GLOBAL(enter_rtas)
sync
/*
disable
interrupts
so
SRR0
/
1
*/
mtmsrd
r0
/*
don
't get trashed */
SET_REG_TO_LABEL
(
r4
,
rtas
)
LOAD_REG_ADDR
(
r4
,
rtas
)
ld
r5
,
RTASENTRY
(
r4
)
/*
get
the
rtas
->
entry
value
*/
ld
r4
,
RTASBASE
(
r4
)
/*
get
the
rtas
->
base
value
*/
...
...
@@ -718,8 +718,7 @@ _GLOBAL(enter_rtas)
_STATIC
(
rtas_return_loc
)
/
*
relocation
is
off
at
this
point
*/
mfspr
r4
,
SPRN_SPRG3
/*
Get
PACA
*/
SET_REG_TO_CONST
(
r5
,
PAGE_OFFSET
)
sub
r4
,
r4
,
r5
/*
RELOC
the
PACA
base
pointer
*/
clrldi
r4
,
r4
,
2
/*
convert
to
realmode
address
*/
mfmsr
r6
li
r0
,
MSR_RI
...
...
@@ -728,7 +727,7 @@ _STATIC(rtas_return_loc)
mtmsrd
r6
ld
r1
,
PACAR1
(
r4
)
/*
Restore
our
SP
*/
LOAD
ADDR
(
r3
,.
rtas_restore_regs
)
LOAD
_REG_IMMEDIATE
(
r3
,.
rtas_restore_regs
)
ld
r4
,
PACASAVEDMSR
(
r4
)
/*
Restore
our
MSR
*/
mtspr
SPRN_SRR0
,
r3
...
...
arch/powerpc/kernel/fpu.S
View file @
87530db5
...
...
@@ -39,9 +39,9 @@ _GLOBAL(load_up_fpu)
*
to
another
.
Instead
we
call
giveup_fpu
in
switch_to
.
*/
#ifndef CONFIG_SMP
LOADBASE
(
r3
,
last_task_used_math
)
LOAD
_REG_ADDR
BASE
(
r3
,
last_task_used_math
)
toreal
(
r3
)
PPC_LL
r4
,
OFF
(
last_task_used_math
)(
r3
)
PPC_LL
r4
,
ADDR
OFF
(
last_task_used_math
)(
r3
)
PPC_LCMPI
0
,
r4
,
0
beq
1
f
toreal
(
r4
)
...
...
@@ -77,7 +77,7 @@ _GLOBAL(load_up_fpu)
#ifndef CONFIG_SMP
subi
r4
,
r5
,
THREAD
fromreal
(
r4
)
PPC_STL
r4
,
OFF
(
last_task_used_math
)(
r3
)
PPC_STL
r4
,
ADDR
OFF
(
last_task_used_math
)(
r3
)
#endif /* CONFIG_SMP */
/
*
restore
registers
and
return
*/
/
*
we
haven
't used ctr or xer or lr */
...
...
@@ -113,8 +113,8 @@ _GLOBAL(giveup_fpu)
1
:
#ifndef CONFIG_SMP
li
r5
,
0
LOADBASE
(
r4
,
last_task_used_math
)
PPC_STL
r5
,
OFF
(
last_task_used_math
)(
r4
)
LOAD
_REG_ADDR
BASE
(
r4
,
last_task_used_math
)
PPC_STL
r5
,
ADDR
OFF
(
last_task_used_math
)(
r4
)
#endif /* CONFIG_SMP */
blr
...
...
arch/powerpc/kernel/head_64.S
View file @
87530db5
...
...
@@ -154,12 +154,12 @@ _GLOBAL(__secondary_hold)
bne
100
b
#ifdef CONFIG_HMT
LOADADDR
(
r4
,
.
hmt_init
)
SET_REG_IMMEDIATE
(
r4
,
.
hmt_init
)
mtctr
r4
bctr
#else
#ifdef CONFIG_SMP
LOAD
ADDR
(
r4
,
.
pSeries_secondary_smp_init
)
LOAD
_REG_IMMEDIATE
(
r4
,
.
pSeries_secondary_smp_init
)
mtctr
r4
mr
r3
,
r24
bctr
...
...
@@ -205,9 +205,10 @@ exception_marker:
#define EX_LR 72
/*
*
We
're short on space and time in the exception prolog, so we can'
t
use
*
the
normal
LOADADDR
macro
.
Normally
we
just
need
the
low
halfword
of
the
*
address
,
but
for
Kdump
we
need
the
whole
low
word
.
*
We
're short on space and time in the exception prolog, so we can'
t
*
use
the
normal
SET_REG_IMMEDIATE
macro
.
Normally
we
just
need
the
*
low
halfword
of
the
address
,
but
for
Kdump
we
need
the
whole
low
*
word
.
*/
#ifdef CONFIG_CRASH_DUMP
#define LOAD_HANDLER(reg, label) \
...
...
@@ -254,8 +255,9 @@ exception_marker:
#define EXCEPTION_PROLOG_ISERIES_2 \
mfmsr
r10
; \
ld
r11
,
PACALPPACA
+
LPPACASRR0
(
r13
)
; \
ld
r12
,
PACALPPACA
+
LPPACASRR1
(
r13
)
; \
ld
r12
,
PACALPPACAPTR
(
r13
)
; \
ld
r11
,
LPPACASRR0
(
r12
)
; \
ld
r12
,
LPPACASRR1
(
r12
)
; \
ori
r10
,
r10
,
MSR_RI
; \
mtmsrd
r10
,
1
...
...
@@ -634,7 +636,8 @@ data_access_slb_iSeries:
std
r12
,
PACA_EXSLB
+
EX_R12
(
r13
)
mfspr
r10
,
SPRN_SPRG1
std
r10
,
PACA_EXSLB
+
EX_R13
(
r13
)
ld
r12
,
PACALPPACA
+
LPPACASRR1
(
r13
)
;
ld
r12
,
PACALPPACAPTR
(
r13
)
ld
r12
,
LPPACASRR1
(
r12
)
b
.
slb_miss_realmode
STD_EXCEPTION_ISERIES
(0
x400
,
instruction_access
,
PACA_EXGEN
)
...
...
@@ -644,7 +647,8 @@ instruction_access_slb_iSeries:
mtspr
SPRN_SPRG1
,
r13
/*
save
r13
*/
mfspr
r13
,
SPRN_SPRG3
/*
get
paca
address
into
r13
*/
std
r3
,
PACA_EXSLB
+
EX_R3
(
r13
)
ld
r3
,
PACALPPACA
+
LPPACASRR0
(
r13
)
/*
get
SRR0
value
*/
ld
r3
,
PACALPPACAPTR
(
r13
)
ld
r3
,
LPPACASRR0
(
r3
)
/*
get
SRR0
value
*/
std
r9
,
PACA_EXSLB
+
EX_R9
(
r13
)
mfcr
r9
#ifdef __DISABLED__
...
...
@@ -656,7 +660,8 @@ instruction_access_slb_iSeries:
std
r12
,
PACA_EXSLB
+
EX_R12
(
r13
)
mfspr
r10
,
SPRN_SPRG1
std
r10
,
PACA_EXSLB
+
EX_R13
(
r13
)
ld
r12
,
PACALPPACA
+
LPPACASRR1
(
r13
)
;
ld
r12
,
PACALPPACAPTR
(
r13
)
ld
r12
,
LPPACASRR1
(
r12
)
b
.
slb_miss_realmode
#ifdef __DISABLED__
...
...
@@ -713,7 +718,7 @@ system_reset_iSeries:
lbz
r23
,
PACAPROCSTART
(
r13
)
/*
Test
if
this
processor
*
should
start
*/
sync
LOAD
ADDR
(
r3
,
current_set
)
LOAD
_REG_IMMEDIATE
(
r3
,
current_set
)
sldi
r28
,
r24
,
3
/*
get
current_set
[
cpu
#]
*/
ldx
r3
,
r3
,
r28
addi
r1
,
r3
,
THREAD_SIZE
...
...
@@ -745,17 +750,19 @@ iSeries_secondary_smp_loop:
.
globl
decrementer_iSeries_masked
decrementer_iSeries_masked
:
li
r11
,
1
stb
r11
,
PACALPPACA
+
LPPACADECRINT
(
r13
)
LOADBASE
(
r12
,
tb_ticks_per_jiffy
)
lwz
r12
,
OFF
(
tb_ticks_per_jiffy
)(
r12
)
ld
r12
,
PACALPPACAPTR
(
r13
)
stb
r11
,
LPPACADECRINT
(
r12
)
LOAD_REG_ADDRBASE
(
r12
,
tb_ticks_per_jiffy
)
lwz
r12
,
ADDROFF
(
tb_ticks_per_jiffy
)(
r12
)
mtspr
SPRN_DEC
,
r12
/
*
fall
through
*/
.
globl
hardware_interrupt_iSeries_masked
hardware_interrupt_iSeries_masked
:
mtcrf
0x80
,
r9
/*
Restore
regs
*/
ld
r11
,
PACALPPACA
+
LPPACASRR0
(
r13
)
ld
r12
,
PACALPPACA
+
LPPACASRR1
(
r13
)
ld
r12
,
PACALPPACAPTR
(
r13
)
ld
r11
,
LPPACASRR0
(
r12
)
ld
r12
,
LPPACASRR1
(
r12
)
mtspr
SPRN_SRR0
,
r11
mtspr
SPRN_SRR1
,
r12
ld
r9
,
PACA_EXGEN
+
EX_R9
(
r13
)
...
...
@@ -994,7 +1001,8 @@ _GLOBAL(slb_miss_realmode)
ld
r3
,
PACA_EXSLB
+
EX_R3
(
r13
)
lwz
r9
,
PACA_EXSLB
+
EX_CCR
(
r13
)
/*
get
saved
CR
*/
#ifdef CONFIG_PPC_ISERIES
ld
r11
,
PACALPPACA
+
LPPACASRR0
(
r13
)
/*
get
SRR0
value
*/
ld
r11
,
PACALPPACAPTR
(
r13
)
ld
r11
,
LPPACASRR0
(
r11
)
/*
get
SRR0
value
*/
#endif /* CONFIG_PPC_ISERIES */
mtlr
r10
...
...
@@ -1412,7 +1420,7 @@ _GLOBAL(pSeries_secondary_smp_init)
*
physical
cpu
id
in
r24
,
we
need
to
search
the
pacas
to
find
*
which
logical
id
maps
to
our
physical
one
.
*/
LOAD
ADDR
(
r13
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
LOAD
_REG_IMMEDIATE
(
r13
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
li
r5
,
0
/*
logical
cpu
id
*/
1
:
lhz
r6
,
PACAHWCPUID
(
r13
)
/*
Load
HW
procid
from
paca
*/
cmpw
r6
,
r24
/*
Compare
to
our
id
*/
...
...
@@ -1446,8 +1454,8 @@ _GLOBAL(pSeries_secondary_smp_init)
#ifdef CONFIG_PPC_ISERIES
_STATIC
(
__start_initialization_iSeries
)
/
*
Clear
out
the
BSS
*/
LOAD
ADDR
(
r11
,
__bss_stop
)
LOAD
ADDR
(
r8
,
__bss_start
)
LOAD
_REG_IMMEDIATE
(
r11
,
__bss_stop
)
LOAD
_REG_IMMEDIATE
(
r8
,
__bss_start
)
sub
r11
,
r11
,
r8
/*
bss
size
*/
addi
r11
,
r11
,
7
/*
round
up
to
an
even
double
word
*/
rldicl
.
r11
,
r11
,
61
,
3
/*
shift
right
by
3
*/
...
...
@@ -1458,17 +1466,17 @@ _STATIC(__start_initialization_iSeries)
3
:
stdu
r0
,
8
(
r8
)
bdnz
3
b
4
:
LOAD
ADDR
(
r1
,
init_thread_union
)
LOAD
_REG_IMMEDIATE
(
r1
,
init_thread_union
)
addi
r1
,
r1
,
THREAD_SIZE
li
r0
,
0
stdu
r0
,-
STACK_FRAME_OVERHEAD
(
r1
)
LOAD
ADDR
(
r3
,
cpu_specs
)
LOAD
ADDR
(
r4
,
cur_cpu_spec
)
LOAD
_REG_IMMEDIATE
(
r3
,
cpu_specs
)
LOAD
_REG_IMMEDIATE
(
r4
,
cur_cpu_spec
)
li
r5
,
0
bl
.
identify_cpu
LOAD
ADDR
(
r2
,
__toc_start
)
LOAD
_REG_IMMEDIATE
(
r2
,
__toc_start
)
addi
r2
,
r2
,
0x4000
addi
r2
,
r2
,
0x4000
...
...
@@ -1528,7 +1536,7 @@ _GLOBAL(__start_initialization_multiplatform)
li
r24
,
0
/
*
Switch
off
MMU
if
not
already
*/
LOAD
ADDR
(
r4
,
.
__after_prom_start
-
KERNELBASE
)
LOAD
_REG_IMMEDIATE
(
r4
,
.
__after_prom_start
-
KERNELBASE
)
add
r4
,
r4
,
r30
bl
.
__mmu_off
b
.
__after_prom_start
...
...
@@ -1548,7 +1556,7 @@ _STATIC(__boot_from_prom)
/
*
put
a
relocation
offset
into
r3
*/
bl
.
reloc_offset
LOAD
ADDR
(
r2
,
__toc_start
)
LOAD
_REG_IMMEDIATE
(
r2
,
__toc_start
)
addi
r2
,
r2
,
0x4000
addi
r2
,
r2
,
0x4000
...
...
@@ -1588,9 +1596,9 @@ _STATIC(__after_prom_start)
*/
bl
.
reloc_offset
mr
r26
,
r3
SET_REG_TO_CONST
(
r27
,
KERNELBASE
)
LOAD_REG_IMMEDIATE
(
r27
,
KERNELBASE
)
LOAD
ADDR
(
r3
,
PHYSICAL_START
)
/*
target
addr
*/
LOAD
_REG_IMMEDIATE
(
r3
,
PHYSICAL_START
)
/*
target
addr
*/
//
XXX
FIXME
:
Use
phys
returned
by
OF
(
r30
)
add
r4
,
r27
,
r26
/*
source
addr
*/
...
...
@@ -1598,7 +1606,7 @@ _STATIC(__after_prom_start)
/
*
i
.
e
.
where
we
are
running
*/
/
*
the
source
addr
*/
LOAD
ADDR
(
r5
,
copy_to_here
)
/*
#
bytes
of
memory
to
copy
*/
LOAD
_REG_IMMEDIATE
(
r5
,
copy_to_here
)
/*
#
bytes
of
memory
to
copy
*/
sub
r5
,
r5
,
r27
li
r6
,
0x100
/*
Start
offset
,
the
first
0x100
*/
...
...
@@ -1608,11 +1616,11 @@ _STATIC(__after_prom_start)
/
*
this
includes
the
code
being
*/
/
*
executed
here
.
*/
LOAD
ADDR
(
r0
,
4
f
)
/*
Jump
to
the
copy
of
this
code
*/
LOAD
_REG_IMMEDIATE
(
r0
,
4
f
)
/*
Jump
to
the
copy
of
this
code
*/
mtctr
r0
/*
that
we
just
made
/
relocated
*/
bctr
4
:
LOAD
ADDR
(
r5
,
klimit
)
4
:
LOAD
_REG_IMMEDIATE
(
r5
,
klimit
)
add
r5
,
r5
,
r26
ld
r5
,
0
(
r5
)
/*
get
the
value
of
klimit
*/
sub
r5
,
r5
,
r27
...
...
@@ -1694,7 +1702,7 @@ _GLOBAL(pmac_secondary_start)
mtmsrd
r3
/*
RI
on
*/
/
*
Set
up
a
paca
value
for
this
processor
.
*/
LOAD
ADDR
(
r4
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
LOAD
_REG_IMMEDIATE
(
r4
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
mulli
r13
,
r24
,
PACA_SIZE
/*
Calculate
vaddr
of
right
paca
*/
add
r13
,
r13
,
r4
/*
for
this
processor
.
*/
mtspr
SPRN_SPRG3
,
r13
/*
Save
vaddr
of
paca
in
SPRG3
*/
...
...
@@ -1731,7 +1739,7 @@ _GLOBAL(__secondary_start)
bl
.
early_setup_secondary
/
*
Initialize
the
kernel
stack
.
Just
a
repeat
for
iSeries
.
*/
LOAD
ADDR
(
r3
,
current_set
)
LOAD
_REG_ADDR
(
r3
,
current_set
)
sldi
r28
,
r24
,
3
/*
get
current_set
[
cpu
#]
*/
ldx
r1
,
r3
,
r28
addi
r1
,
r1
,
THREAD_SIZE
-
STACK_FRAME_OVERHEAD
...
...
@@ -1742,8 +1750,8 @@ _GLOBAL(__secondary_start)
mtlr
r7
/
*
enable
MMU
and
jump
to
start_secondary
*/
LOAD
ADDR
(
r3
,
.
start_secondary_prolog
)
SET_REG_TO_CONST
(
r4
,
MSR_KERNEL
)
LOAD
_REG_ADDR
(
r3
,
.
start_secondary_prolog
)
LOAD_REG_IMMEDIATE
(
r4
,
MSR_KERNEL
)
#ifdef DO_SOFT_DISABLE
ori
r4
,
r4
,
MSR_EE
#endif
...
...
@@ -1792,8 +1800,8 @@ _STATIC(start_here_multiplatform)
*
be
detached
from
the
kernel
completely
.
Besides
,
we
need
*
to
clear
it
now
for
kexec
-
style
entry
.
*/
LOAD
ADDR
(
r11
,
__bss_stop
)
LOAD
ADDR
(
r8
,
__bss_start
)
LOAD
_REG_IMMEDIATE
(
r11
,
__bss_stop
)
LOAD
_REG_IMMEDIATE
(
r8
,
__bss_start
)
sub
r11
,
r11
,
r8
/*
bss
size
*/
addi
r11
,
r11
,
7
/*
round
up
to
an
even
double
word
*/
rldicl
.
r11
,
r11
,
61
,
3
/*
shift
right
by
3
*/
...
...
@@ -1831,7 +1839,7 @@ _STATIC(start_here_multiplatform)
/
*
up
the
htab
.
This
is
done
because
we
have
relocated
the
*/
/
*
kernel
but
are
still
running
in
real
mode
.
*/
LOAD
ADDR
(
r3
,
init_thread_union
)
LOAD
_REG_IMMEDIATE
(
r3
,
init_thread_union
)
add
r3
,
r3
,
r26
/
*
set
up
a
stack
pointer
(
physical
address
)
*/
...
...
@@ -1840,14 +1848,14 @@ _STATIC(start_here_multiplatform)
stdu
r0
,-
STACK_FRAME_OVERHEAD
(
r1
)
/
*
set
up
the
TOC
(
physical
address
)
*/
LOAD
ADDR
(
r2
,
__toc_start
)
LOAD
_REG_IMMEDIATE
(
r2
,
__toc_start
)
addi
r2
,
r2
,
0x4000
addi
r2
,
r2
,
0x4000
add
r2
,
r2
,
r26
LOAD
ADDR
(
r3
,
cpu_specs
)
LOAD
_REG_IMMEDIATE
(
r3
,
cpu_specs
)
add
r3
,
r3
,
r26
LOAD
ADDR
(
r4
,
cur_cpu_spec
)
LOAD
_REG_IMMEDIATE
(
r4
,
cur_cpu_spec
)
add
r4
,
r4
,
r26
mr
r5
,
r26
bl
.
identify_cpu
...
...
@@ -1863,11 +1871,11 @@ _STATIC(start_here_multiplatform)
*
nowhere
it
can
be
initialized
differently
before
we
reach
this
*
code
*/
LOAD
ADDR
(
r27
,
boot_cpuid
)
LOAD
_REG_IMMEDIATE
(
r27
,
boot_cpuid
)
add
r27
,
r27
,
r26
lwz
r27
,
0
(
r27
)
LOAD
ADDR
(
r24
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
LOAD
_REG_IMMEDIATE
(
r24
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
mulli
r13
,
r27
,
PACA_SIZE
/*
Calculate
vaddr
of
right
paca
*/
add
r13
,
r13
,
r24
/*
for
this
processor
.
*/
add
r13
,
r13
,
r26
/*
convert
to
physical
addr
*/
...
...
@@ -1880,8 +1888,8 @@ _STATIC(start_here_multiplatform)
mr
r3
,
r31
bl
.
early_setup
LOAD
ADDR
(
r3
,
.
start_here_common
)
SET_REG_TO_CONST
(
r4
,
MSR_KERNEL
)
LOAD
_REG_IMMEDIATE
(
r3
,
.
start_here_common
)
LOAD_REG_IMMEDIATE
(
r4
,
MSR_KERNEL
)
mtspr
SPRN_SRR0
,
r3
mtspr
SPRN_SRR1
,
r4
rfid
...
...
@@ -1895,7 +1903,7 @@ _STATIC(start_here_common)
/
*
The
following
code
sets
up
the
SP
and
TOC
now
that
we
are
*/
/
*
running
with
translation
enabled
.
*/
LOAD
ADDR
(
r3
,
init_thread_union
)
LOAD
_REG_IMMEDIATE
(
r3
,
init_thread_union
)
/
*
set
up
the
stack
*/
addi
r1
,
r3
,
THREAD_SIZE
...
...
@@ -1908,16 +1916,16 @@ _STATIC(start_here_common)
li
r3
,
0
bl
.
do_cpu_ftr_fixups
LOAD
ADDR
(
r26
,
boot_cpuid
)
LOAD
_REG_IMMEDIATE
(
r26
,
boot_cpuid
)
lwz
r26
,
0
(
r26
)
LOAD
ADDR
(
r24
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
LOAD
_REG_IMMEDIATE
(
r24
,
paca
)
/*
Get
base
vaddr
of
paca
array
*/
mulli
r13
,
r26
,
PACA_SIZE
/*
Calculate
vaddr
of
right
paca
*/
add
r13
,
r13
,
r24
/*
for
this
processor
.
*/
mtspr
SPRN_SPRG3
,
r13
/
*
ptr
to
current
*/
LOAD
ADDR
(
r4
,
init_task
)
LOAD
_REG_IMMEDIATE
(
r4
,
init_task
)
std
r4
,
PACACURRENT
(
r13
)
/
*
Load
the
TOC
*/
...
...
@@ -1940,7 +1948,7 @@ _STATIC(start_here_common)
_GLOBAL
(
hmt_init
)
#ifdef CONFIG_HMT
LOAD
ADDR
(
r5
,
hmt_thread_data
)
LOAD
_REG_IMMEDIATE
(
r5
,
hmt_thread_data
)
mfspr
r7
,
SPRN_PVR
srwi
r7
,
r7
,
16
cmpwi
r7
,
0x34
/*
Pulsar
*/
...
...
@@ -1961,7 +1969,7 @@ _GLOBAL(hmt_init)
b
101
f
__hmt_secondary_hold
:
LOAD
ADDR
(
r5
,
hmt_thread_data
)
LOAD
_REG_IMMEDIATE
(
r5
,
hmt_thread_data
)
clrldi
r5
,
r5
,
4
li
r7
,
0
mfspr
r6
,
SPRN_PIR
...
...
@@ -1989,7 +1997,7 @@ __hmt_secondary_hold:
#ifdef CONFIG_HMT
_GLOBAL
(
hmt_start_secondary
)
LOAD
ADDR
(
r4
,
__hmt_secondary_hold
)
LOAD
_REG_IMMEDIATE
(
r4
,
__hmt_secondary_hold
)
clrldi
r4
,
r4
,
4
mtspr
SPRN_NIADORM
,
r4
mfspr
r4
,
SPRN_MSRDORM
...
...
arch/powerpc/kernel/idle_power4.S
View file @
87530db5
...
...
@@ -38,14 +38,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
/
*
We
must
dynamically
check
for
the
NAP
feature
as
it
*
can
be
cleared
by
CPU
init
after
the
fixups
are
done
*/
LOADBASE
(
r3
,
cur_cpu_spec
)
ld
r4
,
OFF
(
cur_cpu_spec
)(
r3
)
LOAD
_REG_ADDR
BASE
(
r3
,
cur_cpu_spec
)
ld
r4
,
ADDR
OFF
(
cur_cpu_spec
)(
r3
)
ld
r4
,
CPU_SPEC_FEATURES
(
r4
)
andi
.
r0
,
r4
,
CPU_FTR_CAN_NAP
beqlr
/
*
Now
check
if
user
or
arch
enabled
NAP
mode
*/
LOADBASE
(
r3
,
powersave_nap
)
lwz
r4
,
OFF
(
powersave_nap
)(
r3
)
LOAD
_REG_ADDR
BASE
(
r3
,
powersave_nap
)
lwz
r4
,
ADDR
OFF
(
powersave_nap
)(
r3
)
cmpwi
0
,
r4
,
0
beqlr
...
...
arch/powerpc/kernel/irq.c
View file @
87530db5
...
...
@@ -238,14 +238,10 @@ void do_IRQ(struct pt_regs *regs)
irq_exit
();
#ifdef CONFIG_PPC_ISERIES
{
struct
paca_struct
*
lpaca
=
get_paca
();
if
(
lpaca
->
lppaca
.
int_dword
.
fields
.
decr_int
)
{
lpaca
->
lppaca
.
int_dword
.
fields
.
decr_int
=
0
;
/* Signal a fake decrementer interrupt */
timer_interrupt
(
regs
);
}
if
(
get_lppaca
()
->
int_dword
.
fields
.
decr_int
)
{
get_lppaca
()
->
int_dword
.
fields
.
decr_int
=
0
;
/* Signal a fake decrementer interrupt */
timer_interrupt
(
regs
);
}
#endif
}
...
...
arch/powerpc/kernel/lparcfg.c
View file @
87530db5
...
...
@@ -55,15 +55,13 @@ static unsigned long get_purr(void)
{
unsigned
long
sum_purr
=
0
;
int
cpu
;
struct
paca_struct
*
lpaca
;
for_each_cpu
(
cpu
)
{
lpaca
=
paca
+
cpu
;
sum_purr
+=
lpaca
->
lppaca
.
emulated_time_base
;
sum_purr
+=
lppaca
[
cpu
].
emulated_time_base
;
#ifdef PURR_DEBUG
printk
(
KERN_INFO
"get_purr for cpu (%d) has value (%ld)
\n
"
,
cpu
,
lp
aca
->
lppaca
.
emulated_time_base
);
cpu
,
lp
paca
[
cpu
]
.
emulated_time_base
);
#endif
}
return
sum_purr
;
...
...
@@ -79,12 +77,11 @@ static int lparcfg_data(struct seq_file *m, void *v)
unsigned
long
pool_id
,
lp_index
;
int
shared
,
entitled_capacity
,
max_entitled_capacity
;
int
processors
,
max_processors
;
struct
paca_struct
*
lpaca
=
get_paca
();
unsigned
long
purr
=
get_purr
();
seq_printf
(
m
,
"%s %s
\n
"
,
MODULE_NAME
,
MODULE_VERS
);
shared
=
(
int
)(
lpaca
->
lppaca_ptr
->
shared_proc
);
shared
=
(
int
)(
get_lppaca
()
->
shared_proc
);
seq_printf
(
m
,
"serial_number=%c%c%c%c%c%c%c
\n
"
,
e2a
(
xItExtVpdPanel
.
mfgID
[
2
]),
e2a
(
xItExtVpdPanel
.
mfgID
[
3
]),
...
...
@@ -402,7 +399,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
(
h_resource
>>
0
*
8
)
&
0xffff
);
/* pool related entries are apropriate for shared configs */
if
(
paca
[
0
].
lppaca
.
shared_proc
)
{
if
(
lppaca
[
0
]
.
shared_proc
)
{
h_pic
(
&
pool_idle_time
,
&
pool_procs
);
...
...
@@ -451,7 +448,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
seq_printf
(
m
,
"partition_potential_processors=%d
\n
"
,
partition_potential_processors
);
seq_printf
(
m
,
"shared_processor_mode=%d
\n
"
,
paca
[
0
].
lppaca
.
shared_proc
);
seq_printf
(
m
,
"shared_processor_mode=%d
\n
"
,
lppaca
[
0
]
.
shared_proc
);
return
0
;
}
...
...
arch/powerpc/kernel/misc_32.S
View file @
87530db5
...
...
@@ -68,7 +68,7 @@ _GLOBAL(reloc_offset)
mflr
r0
bl
1
f
1
:
mflr
r3
LOAD
ADDR
(
r4
,1
b
)
LOAD
_REG_IMMEDIATE
(
r4
,1
b
)
subf
r3
,
r4
,
r3
mtlr
r0
blr
...
...
@@ -80,7 +80,7 @@ _GLOBAL(add_reloc_offset)
mflr
r0
bl
1
f
1
:
mflr
r5
LOAD
ADDR
(
r4
,1
b
)
LOAD
_REG_IMMEDIATE
(
r4
,1
b
)
subf
r5
,
r4
,
r5
add
r3
,
r3
,
r5
mtlr
r0
...
...
arch/powerpc/kernel/misc_64.S
View file @
87530db5
...
...
@@ -39,7 +39,7 @@ _GLOBAL(reloc_offset)
mflr
r0
bl
1
f
1
:
mflr
r3
LOAD
ADDR
(
r4
,1
b
)
LOAD
_REG_IMMEDIATE
(
r4
,1
b
)
subf
r3
,
r4
,
r3
mtlr
r0
blr
...
...
@@ -51,7 +51,7 @@ _GLOBAL(add_reloc_offset)
mflr
r0
bl
1
f
1
:
mflr
r5
LOAD
ADDR
(
r4
,1
b
)
LOAD
_REG_IMMEDIATE
(
r4
,1
b
)
subf
r5
,
r4
,
r5
add
r3
,
r3
,
r5
mtlr
r0
...
...
@@ -498,15 +498,15 @@ _GLOBAL(identify_cpu)
*/
_GLOBAL
(
do_cpu_ftr_fixups
)
/
*
Get
CPU
0
features
*/
LOAD
ADDR
(
r6
,
cur_cpu_spec
)
LOAD
_REG_IMMEDIATE
(
r6
,
cur_cpu_spec
)
sub
r6
,
r6
,
r3
ld
r4
,
0
(
r6
)
sub
r4
,
r4
,
r3
ld
r4
,
CPU_SPEC_FEATURES
(
r4
)
/
*
Get
the
fixup
table
*/
LOAD
ADDR
(
r6
,
__start___ftr_fixup
)
LOAD
_REG_IMMEDIATE
(
r6
,
__start___ftr_fixup
)
sub
r6
,
r6
,
r3
LOAD
ADDR
(
r7
,
__stop___ftr_fixup
)
LOAD
_REG_IMMEDIATE
(
r7
,
__stop___ftr_fixup
)
sub
r7
,
r7
,
r3
/
*
Do
the
fixup
*/
1
:
cmpld
r6
,
r7
...
...
arch/powerpc/kernel/paca.c
View file @
87530db5
...
...
@@ -25,6 +25,28 @@
* field correctly */
extern
unsigned
long
__toc_start
;
/*
* iSeries structure which the hypervisor knows about - this structure
* should not cross a page boundary. The vpa_init/register_vpa call
* is now known to fail if the lppaca structure crosses a page
* boundary. The lppaca is also used on POWER5 pSeries boxes. The
* lppaca is 640 bytes long, and cannot readily change since the
* hypervisor knows its layout, so a 1kB alignment will suffice to
* ensure that it doesn't cross a page boundary.
*/
struct
lppaca
lppaca
[]
=
{
[
0
...
(
NR_CPUS
-
1
)]
=
{
.
desc
=
0xd397d781
,
/* "LpPa" */
.
size
=
sizeof
(
struct
lppaca
),
.
dyn_proc_status
=
2
,
.
decr_val
=
0x00ff0000
,
.
fpregs_in_use
=
1
,
.
end_of_quantum
=
0xfffffffffffffffful
,
.
slb_count
=
64
,
.
vmxregs_in_use
=
0
,
},
};
/* The Paca is an array with one entry per processor. Each contains an
* lppaca, which contains the information shared between the
* hypervisor and Linux.
...
...
@@ -35,27 +57,17 @@ extern unsigned long __toc_start;
* processor (not thread).
*/
#define PACA_INIT_COMMON(number, start, asrr, asrv) \
.lppaca_ptr = &lppaca[number], \
.lock_token = 0x8000, \
.paca_index = (number),
/* Paca Index */
\
.kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \
.stab_real = (asrr),
/* Real pointer to segment table */
\
.stab_addr = (asrv),
/* Virt pointer to segment table */
\
.cpu_start = (start),
/* Processor start */
\
.hw_cpu_id = 0xffff, \
.lppaca = { \
.desc = 0xd397d781,
/* "LpPa" */
\
.size = sizeof(struct lppaca), \
.dyn_proc_status = 2, \
.decr_val = 0x00ff0000, \
.fpregs_in_use = 1, \
.end_of_quantum = 0xfffffffffffffffful, \
.slb_count = 64, \
.vmxregs_in_use = 0, \
}, \
.hw_cpu_id = 0xffff,
#ifdef CONFIG_PPC_ISERIES
#define PACA_INIT_ISERIES(number) \
.lppaca_ptr = &paca[number].lppaca, \
.reg_save_ptr = &iseries_reg_save[number],
#define PACA_INIT(number) \
...
...
arch/powerpc/kernel/ppc_ksyms.c
View file @
87530db5
...
...
@@ -230,8 +230,7 @@ EXPORT_SYMBOL(__down_interruptible);
EXPORT_SYMBOL
(
cpm_install_handler
);
EXPORT_SYMBOL
(
cpm_free_handler
);
#endif
/* CONFIG_8xx */
#if defined(CONFIG_8xx) || defined(CONFIG_40x) || defined(CONFIG_85xx) ||\
defined(CONFIG_83xx)
#if defined(CONFIG_8xx) || defined(CONFIG_40x)
EXPORT_SYMBOL
(
__res
);
#endif
...
...
arch/powerpc/kernel/prom.c
View file @
87530db5
...
...
@@ -1627,6 +1627,11 @@ static void of_node_release(struct kref *kref)
kfree
(
prop
->
value
);
kfree
(
prop
);
prop
=
next
;
if
(
!
prop
)
{
prop
=
node
->
deadprops
;
node
->
deadprops
=
NULL
;
}
}
kfree
(
node
->
intrs
);
kfree
(
node
->
full_name
);
...
...
@@ -1774,22 +1779,32 @@ static int __init prom_reconfig_setup(void)
__initcall
(
prom_reconfig_setup
);
#endif
/*
* Find a property with a given name for a given node
* and return the value.
*/
unsigned
char
*
get_property
(
struct
device_node
*
np
,
const
char
*
name
,
int
*
lenp
)
struct
property
*
of_find_property
(
struct
device_node
*
np
,
const
char
*
name
,
int
*
lenp
)
{
struct
property
*
pp
;
read_lock
(
&
devtree_lock
);
for
(
pp
=
np
->
properties
;
pp
!=
0
;
pp
=
pp
->
next
)
if
(
strcmp
(
pp
->
name
,
name
)
==
0
)
{
if
(
lenp
!=
0
)
*
lenp
=
pp
->
length
;
return
pp
->
value
;
break
;
}
return
NULL
;
read_unlock
(
&
devtree_lock
);
return
pp
;
}
/*
* Find a property with a given name for a given node
* and return the value.
*/
unsigned
char
*
get_property
(
struct
device_node
*
np
,
const
char
*
name
,
int
*
lenp
)
{
struct
property
*
pp
=
of_find_property
(
np
,
name
,
lenp
);
return
pp
?
pp
->
value
:
NULL
;
}
EXPORT_SYMBOL
(
get_property
);
...
...
@@ -1823,4 +1838,82 @@ int prom_add_property(struct device_node* np, struct property* prop)
return
0
;
}
/*
* Remove a property from a node. Note that we don't actually
* remove it, since we have given out who-knows-how-many pointers
* to the data using get-property. Instead we just move the property
* to the "dead properties" list, so it won't be found any more.
*/
int
prom_remove_property
(
struct
device_node
*
np
,
struct
property
*
prop
)
{
struct
property
**
next
;
int
found
=
0
;
write_lock
(
&
devtree_lock
);
next
=
&
np
->
properties
;
while
(
*
next
)
{
if
(
*
next
==
prop
)
{
/* found the node */
*
next
=
prop
->
next
;
prop
->
next
=
np
->
deadprops
;
np
->
deadprops
=
prop
;
found
=
1
;
break
;
}
next
=
&
(
*
next
)
->
next
;
}
write_unlock
(
&
devtree_lock
);
if
(
!
found
)
return
-
ENODEV
;
#ifdef CONFIG_PROC_DEVICETREE
/* try to remove the proc node as well */
if
(
np
->
pde
)
proc_device_tree_remove_prop
(
np
->
pde
,
prop
);
#endif
/* CONFIG_PROC_DEVICETREE */
return
0
;
}
/*
* Update a property in a node. Note that we don't actually
* remove it, since we have given out who-knows-how-many pointers
* to the data using get-property. Instead we just move the property
* to the "dead properties" list, and add the new property to the
* property list
*/
int
prom_update_property
(
struct
device_node
*
np
,
struct
property
*
newprop
,
struct
property
*
oldprop
)
{
struct
property
**
next
;
int
found
=
0
;
write_lock
(
&
devtree_lock
);
next
=
&
np
->
properties
;
while
(
*
next
)
{
if
(
*
next
==
oldprop
)
{
/* found the node */
newprop
->
next
=
oldprop
->
next
;
*
next
=
newprop
;
oldprop
->
next
=
np
->
deadprops
;
np
->
deadprops
=
oldprop
;
found
=
1
;
break
;
}
next
=
&
(
*
next
)
->
next
;
}
write_unlock
(
&
devtree_lock
);
if
(
!
found
)
return
-
ENODEV
;
#ifdef CONFIG_PROC_DEVICETREE
/* try to add to proc as well if it was initialized */
if
(
np
->
pde
)
proc_device_tree_update_prop
(
np
->
pde
,
newprop
,
oldprop
);
#endif
/* CONFIG_PROC_DEVICETREE */
return
0
;
}
arch/powerpc/kernel/prom_parse.c
View file @
87530db5
...
...
@@ -113,7 +113,8 @@ static unsigned int of_bus_default_get_flags(u32 *addr)
static
int
of_bus_pci_match
(
struct
device_node
*
np
)
{
return
!
strcmp
(
np
->
type
,
"pci"
);
/* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
return
!
strcmp
(
np
->
type
,
"pci"
)
||
!
strcmp
(
np
->
type
,
"vci"
);
}
static
void
of_bus_pci_count_cells
(
struct
device_node
*
np
,
...
...
arch/powerpc/kernel/rtas.c
View file @
87530db5
...
...
@@ -36,6 +36,11 @@ struct rtas_t rtas = {
.
lock
=
SPIN_LOCK_UNLOCKED
};
struct
rtas_suspend_me_data
{
long
waiting
;
struct
rtas_args
*
args
;
};
EXPORT_SYMBOL
(
rtas
);
DEFINE_SPINLOCK
(
rtas_data_buf_lock
);
...
...
@@ -556,6 +561,80 @@ void rtas_os_term(char *str)
}
while
(
status
==
RTAS_BUSY
);
}
static
int
ibm_suspend_me_token
=
RTAS_UNKNOWN_SERVICE
;
#ifdef CONFIG_PPC_PSERIES
static
void
rtas_percpu_suspend_me
(
void
*
info
)
{
long
rc
;
long
flags
;
struct
rtas_suspend_me_data
*
data
=
(
struct
rtas_suspend_me_data
*
)
info
;
/*
* We use "waiting" to indicate our state. As long
* as it is >0, we are still trying to all join up.
* If it goes to 0, we have successfully joined up and
* one thread got H_Continue. If any error happens,
* we set it to <0.
*/
local_irq_save
(
flags
);
do
{
rc
=
plpar_hcall_norets
(
H_JOIN
);
smp_rmb
();
}
while
(
rc
==
H_Success
&&
data
->
waiting
>
0
);
if
(
rc
==
H_Success
)
goto
out
;
if
(
rc
==
H_Continue
)
{
data
->
waiting
=
0
;
rtas_call
(
ibm_suspend_me_token
,
0
,
1
,
data
->
args
->
args
);
}
else
{
data
->
waiting
=
-
EBUSY
;
printk
(
KERN_ERR
"Error on H_Join hypervisor call
\n
"
);
}
out:
/* before we restore interrupts, make sure we don't
* generate a spurious soft lockup errors
*/
touch_softlockup_watchdog
();
local_irq_restore
(
flags
);
return
;
}
static
int
rtas_ibm_suspend_me
(
struct
rtas_args
*
args
)
{
int
i
;
struct
rtas_suspend_me_data
data
;
data
.
waiting
=
1
;
data
.
args
=
args
;
/* Call function on all CPUs. One of us will make the
* rtas call
*/
if
(
on_each_cpu
(
rtas_percpu_suspend_me
,
&
data
,
1
,
0
))
data
.
waiting
=
-
EINVAL
;
if
(
data
.
waiting
!=
0
)
printk
(
KERN_ERR
"Error doing global join
\n
"
);
/* Prod each CPU. This won't hurt, and will wake
* anyone we successfully put to sleep with H_Join
*/
for_each_cpu
(
i
)
plpar_hcall_norets
(
H_PROD
,
i
);
return
data
.
waiting
;
}
#else
/* CONFIG_PPC_PSERIES */
static
int
rtas_ibm_suspend_me
(
struct
rtas_args
*
args
)
{
return
-
ENOSYS
;
}
#endif
asmlinkage
int
ppc_rtas
(
struct
rtas_args
__user
*
uargs
)
{
...
...
@@ -563,6 +642,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
unsigned
long
flags
;
char
*
buff_copy
,
*
errbuf
=
NULL
;
int
nargs
;
int
rc
;
if
(
!
capable
(
CAP_SYS_ADMIN
))
return
-
EPERM
;
...
...
@@ -581,6 +661,17 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
nargs
*
sizeof
(
rtas_arg_t
))
!=
0
)
return
-
EFAULT
;
if
(
args
.
token
==
RTAS_UNKNOWN_SERVICE
)
return
-
EINVAL
;
/* Need to handle ibm,suspend_me call specially */
if
(
args
.
token
==
ibm_suspend_me_token
)
{
rc
=
rtas_ibm_suspend_me
(
&
args
);
if
(
rc
)
return
rc
;
goto
copy_return
;
}
buff_copy
=
get_errorlog_buffer
();
spin_lock_irqsave
(
&
rtas
.
lock
,
flags
);
...
...
@@ -604,6 +695,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
kfree
(
buff_copy
);
}
copy_return:
/* Copy out args. */
if
(
copy_to_user
(
uargs
->
args
+
nargs
,
args
.
args
+
nargs
,
...
...
@@ -675,8 +767,10 @@ void __init rtas_initialize(void)
* the stop-self token if any
*/
#ifdef CONFIG_PPC64
if
(
_machine
==
PLATFORM_PSERIES_LPAR
)
if
(
_machine
==
PLATFORM_PSERIES_LPAR
)
{
rtas_region
=
min
(
lmb
.
rmo_size
,
RTAS_INSTANTIATE_MAX
);
ibm_suspend_me_token
=
rtas_token
(
"ibm,suspend-me"
);
}
#endif
rtas_rmo_buf
=
lmb_alloc_base
(
RTAS_RMOBUF_MAX
,
PAGE_SIZE
,
rtas_region
);
...
...
arch/powerpc/kernel/setup-common.c
View file @
87530db5
...
...
@@ -100,7 +100,8 @@ void machine_shutdown(void)
void
machine_restart
(
char
*
cmd
)
{
machine_shutdown
();
ppc_md
.
restart
(
cmd
);
if
(
ppc_md
.
restart
)
ppc_md
.
restart
(
cmd
);
#ifdef CONFIG_SMP
smp_send_stop
();
#endif
...
...
@@ -112,7 +113,8 @@ void machine_restart(char *cmd)
void
machine_power_off
(
void
)
{
machine_shutdown
();
ppc_md
.
power_off
();
if
(
ppc_md
.
power_off
)
ppc_md
.
power_off
();
#ifdef CONFIG_SMP
smp_send_stop
();
#endif
...
...
@@ -129,7 +131,8 @@ EXPORT_SYMBOL_GPL(pm_power_off);
void
machine_halt
(
void
)
{
machine_shutdown
();
ppc_md
.
halt
();
if
(
ppc_md
.
halt
)
ppc_md
.
halt
();
#ifdef CONFIG_SMP
smp_send_stop
();
#endif
...
...
arch/powerpc/kernel/time.c
View file @
87530db5
...
...
@@ -431,7 +431,7 @@ void timer_interrupt(struct pt_regs * regs)
profile_tick
(
CPU_PROFILING
,
regs
);
#ifdef CONFIG_PPC_ISERIES
get_
paca
()
->
lppaca
.
int_dword
.
fields
.
decr_int
=
0
;
get_
lppaca
()
->
int_dword
.
fields
.
decr_int
=
0
;
#endif
while
((
ticks
=
tb_ticks_since
(
per_cpu
(
last_jiffy
,
cpu
)))
...
...
arch/powerpc/lib/locks.c
View file @
87530db5
...
...
@@ -28,15 +28,13 @@
void
__spin_yield
(
raw_spinlock_t
*
lock
)
{
unsigned
int
lock_value
,
holder_cpu
,
yield_count
;
struct
paca_struct
*
holder_paca
;
lock_value
=
lock
->
slock
;
if
(
lock_value
==
0
)
return
;
holder_cpu
=
lock_value
&
0xffff
;
BUG_ON
(
holder_cpu
>=
NR_CPUS
);
holder_paca
=
&
paca
[
holder_cpu
];
yield_count
=
holder_paca
->
lppaca
.
yield_count
;
yield_count
=
lppaca
[
holder_cpu
].
yield_count
;
if
((
yield_count
&
1
)
==
0
)
return
;
/* virtual cpu is currently running */
rmb
();
...
...
@@ -60,15 +58,13 @@ void __rw_yield(raw_rwlock_t *rw)
{
int
lock_value
;
unsigned
int
holder_cpu
,
yield_count
;
struct
paca_struct
*
holder_paca
;
lock_value
=
rw
->
lock
;
if
(
lock_value
>=
0
)
return
;
/* no write lock at present */
holder_cpu
=
lock_value
&
0xffff
;
BUG_ON
(
holder_cpu
>=
NR_CPUS
);
holder_paca
=
&
paca
[
holder_cpu
];
yield_count
=
holder_paca
->
lppaca
.
yield_count
;
yield_count
=
lppaca
[
holder_cpu
].
yield_count
;
if
((
yield_count
&
1
)
==
0
)
return
;
/* virtual cpu is currently running */
rmb
();
...
...
arch/powerpc/oprofile/common.c
View file @
87530db5
...
...
@@ -140,19 +140,19 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
switch
(
cur_cpu_spec
->
oprofile_type
)
{
#ifdef CONFIG_PPC64
case
RS64
:
case
PPC_OPROFILE_
RS64
:
model
=
&
op_model_rs64
;
break
;
case
POWER4
:
case
P
PC_OPROFILE_P
OWER4
:
model
=
&
op_model_power4
;
break
;
#else
case
G4
:
case
PPC_OPROFILE_
G4
:
model
=
&
op_model_7450
;
break
;
#endif
#ifdef CONFIG_FSL_BOOKE
case
BOOKE
:
case
PPC_OPROFILE_
BOOKE
:
model
=
&
op_model_fsl_booke
;
break
;
#endif
...
...
arch/powerpc/platforms/83xx/Kconfig
View file @
87530db5
...
...
@@ -7,6 +7,7 @@ choice
config MPC834x_SYS
bool "Freescale MPC834x SYS"
select DEFAULT_UIMAGE
help
This option enables support for the MPC 834x SYS evaluation board.
...
...
arch/powerpc/platforms/83xx/mpc834x_sys.c
0 → 100644
View file @
87530db5
/*
* arch/powerpc/platforms/83xx/mpc834x_sys.c
*
* MPC834x SYS board specific routines
*
* Maintainer: Kumar Gala <galak@kernel.crashing.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/reboot.h>
#include <linux/pci.h>
#include <linux/kdev_t.h>
#include <linux/major.h>
#include <linux/console.h>
#include <linux/delay.h>
#include <linux/seq_file.h>
#include <linux/root_dev.h>
#include <linux/module.h>
#include <linux/fsl_devices.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/atomic.h>
#include <asm/time.h>
#include <asm/io.h>
#include <asm/machdep.h>
#include <asm/ipic.h>
#include <asm/bootinfo.h>
#include <asm/pci-bridge.h>
#include <asm/mpc83xx.h>
#include <asm/irq.h>
#include <mm/mmu_decl.h>
#include <asm/prom.h>
#include <asm/udbg.h>
#include <sysdev/fsl_soc.h>
#include "mpc83xx.h"
#ifndef CONFIG_PCI
unsigned
long
isa_io_base
=
0
;
unsigned
long
isa_mem_base
=
0
;
#endif
#ifdef CONFIG_PCI
extern
int
mpc83xx_pci2_busno
;
static
int
mpc83xx_map_irq
(
struct
pci_dev
*
dev
,
unsigned
char
idsel
,
unsigned
char
pin
)
{
static
char
pci_irq_table
[][
4
]
=
/*
* PCI IDSEL/INTPIN->INTLINE
* A B C D
*/
{
{
PIRQA
,
PIRQB
,
PIRQC
,
PIRQD
},
/* idsel 0x11 */
{
PIRQC
,
PIRQD
,
PIRQA
,
PIRQB
},
/* idsel 0x12 */
{
PIRQD
,
PIRQA
,
PIRQB
,
PIRQC
},
/* idsel 0x13 */
{
0
,
0
,
0
,
0
},
{
PIRQA
,
PIRQB
,
PIRQC
,
PIRQD
},
/* idsel 0x15 */
{
PIRQD
,
PIRQA
,
PIRQB
,
PIRQC
},
/* idsel 0x16 */
{
PIRQC
,
PIRQD
,
PIRQA
,
PIRQB
},
/* idsel 0x17 */
{
PIRQB
,
PIRQC
,
PIRQD
,
PIRQA
},
/* idsel 0x18 */
{
0
,
0
,
0
,
0
},
/* idsel 0x19 */
{
0
,
0
,
0
,
0
},
/* idsel 0x20 */
};
const
long
min_idsel
=
0x11
,
max_idsel
=
0x20
,
irqs_per_slot
=
4
;
return
PCI_IRQ_TABLE_LOOKUP
;
}
static
int
mpc83xx_exclude_device
(
u_char
bus
,
u_char
devfn
)
{
if
(
bus
==
0
&&
PCI_SLOT
(
devfn
)
==
0
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
if
(
mpc83xx_pci2_busno
)
if
(
bus
==
(
mpc83xx_pci2_busno
)
&&
PCI_SLOT
(
devfn
)
==
0
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_SUCCESSFUL
;
}
#endif
/* CONFIG_PCI */
/* ************************************************************************
*
* Setup the architecture
*
*/
static
void
__init
mpc834x_sys_setup_arch
(
void
)
{
struct
device_node
*
np
;
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"mpc834x_sys_setup_arch()"
,
0
);
np
=
of_find_node_by_type
(
NULL
,
"cpu"
);
if
(
np
!=
0
)
{
unsigned
int
*
fp
=
(
int
*
)
get_property
(
np
,
"clock-frequency"
,
NULL
);
if
(
fp
!=
0
)
loops_per_jiffy
=
*
fp
/
HZ
;
else
loops_per_jiffy
=
50000000
/
HZ
;
of_node_put
(
np
);
}
#ifdef CONFIG_PCI
for
(
np
=
NULL
;
(
np
=
of_find_node_by_type
(
np
,
"pci"
))
!=
NULL
;)
add_bridge
(
np
);
ppc_md
.
pci_swizzle
=
common_swizzle
;
ppc_md
.
pci_map_irq
=
mpc83xx_map_irq
;
ppc_md
.
pci_exclude_device
=
mpc83xx_exclude_device
;
#endif
#ifdef CONFIG_ROOT_NFS
ROOT_DEV
=
Root_NFS
;
#else
ROOT_DEV
=
Root_HDA1
;
#endif
}
void
__init
mpc834x_sys_init_IRQ
(
void
)
{
u8
senses
[
8
]
=
{
0
,
/* EXT 0 */
IRQ_SENSE_LEVEL
,
/* EXT 1 */
IRQ_SENSE_LEVEL
,
/* EXT 2 */
0
,
/* EXT 3 */
#ifdef CONFIG_PCI
IRQ_SENSE_LEVEL
,
/* EXT 4 */
IRQ_SENSE_LEVEL
,
/* EXT 5 */
IRQ_SENSE_LEVEL
,
/* EXT 6 */
IRQ_SENSE_LEVEL
,
/* EXT 7 */
#else
0
,
/* EXT 4 */
0
,
/* EXT 5 */
0
,
/* EXT 6 */
0
,
/* EXT 7 */
#endif
};
ipic_init
(
get_immrbase
()
+
0x00700
,
0
,
0
,
senses
,
8
);
/* Initialize the default interrupt mapping priorities,
* in case the boot rom changed something on us.
*/
ipic_set_default_priority
();
}
#if defined(CONFIG_I2C_MPC) && defined(CONFIG_SENSORS_DS1374)
extern
ulong
ds1374_get_rtc_time
(
void
);
extern
int
ds1374_set_rtc_time
(
ulong
);
static
int
__init
mpc834x_rtc_hookup
(
void
)
{
struct
timespec
tv
;
ppc_md
.
get_rtc_time
=
ds1374_get_rtc_time
;
ppc_md
.
set_rtc_time
=
ds1374_set_rtc_time
;
tv
.
tv_nsec
=
0
;
tv
.
tv_sec
=
(
ppc_md
.
get_rtc_time
)();
do_settimeofday
(
&
tv
);
return
0
;
}
late_initcall
(
mpc834x_rtc_hookup
);
#endif
static
void
mpc83xx_restart
(
char
*
cmd
)
{
#define RST_OFFSET 0x00000900
#define RST_PROT_REG 0x00000018
#define RST_CTRL_REG 0x0000001c
__be32
__iomem
*
reg
;
// map reset register space
reg
=
ioremap
(
get_immrbase
()
+
0x900
,
0xff
);
local_irq_disable
();
/* enable software reset "RSTE" */
out_be32
(
reg
+
(
RST_PROT_REG
>>
2
),
0x52535445
);
/* set software hard reset */
out_be32
(
reg
+
(
RST_CTRL_REG
>>
2
),
0x52535445
);
for
(;;);
}
static
long
__init
mpc83xx_time_init
(
void
)
{
#define SPCR_OFFSET 0x00000110
#define SPCR_TBEN 0x00400000
__be32
__iomem
*
spcr
=
ioremap
(
get_immrbase
()
+
SPCR_OFFSET
,
4
);
__be32
tmp
;
tmp
=
in_be32
(
spcr
);
out_be32
(
spcr
,
tmp
|
SPCR_TBEN
);
iounmap
(
spcr
);
return
0
;
}
void
__init
platform_init
(
void
)
{
/* setup the PowerPC module struct */
ppc_md
.
setup_arch
=
mpc834x_sys_setup_arch
;
ppc_md
.
init_IRQ
=
mpc834x_sys_init_IRQ
;
ppc_md
.
get_irq
=
ipic_get_irq
;
ppc_md
.
restart
=
mpc83xx_restart
;
ppc_md
.
time_init
=
mpc83xx_time_init
;
ppc_md
.
set_rtc_time
=
NULL
;
ppc_md
.
get_rtc_time
=
NULL
;
ppc_md
.
calibrate_decr
=
generic_calibrate_decr
;
ppc_md
.
progress
=
udbg_progress
;
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"mpc834x_sys_init(): exit"
,
0
);
return
;
}
arch/powerpc/platforms/83xx/mpc834x_sys.h
0 → 100644
View file @
87530db5
/*
* arch/powerppc/platforms/83xx/mpc834x_sys.h
*
* MPC834X SYS common board definitions
*
* Maintainer: Kumar Gala <galak@kernel.crashing.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __MACH_MPC83XX_SYS_H__
#define __MACH_MPC83XX_SYS_H__
#define PIRQA MPC83xx_IRQ_EXT4
#define PIRQB MPC83xx_IRQ_EXT5
#define PIRQC MPC83xx_IRQ_EXT6
#define PIRQD MPC83xx_IRQ_EXT7
#endif
/* __MACH_MPC83XX_SYS_H__ */
arch/powerpc/platforms/83xx/mpc83xx.h
0 → 100644
View file @
87530db5
#ifndef __MPC83XX_H__
#define __MPC83XX_H__
#include <linux/init.h>
#include <linux/device.h>
/*
* Declaration for the various functions exported by the
* mpc83xx_* files. Mostly for use by mpc83xx_setup
*/
extern
int
add_bridge
(
struct
device_node
*
dev
);
#endif
/* __MPC83XX_H__ */
arch/powerpc/platforms/83xx/pci.c
0 → 100644
View file @
87530db5
/*
* FSL SoC setup code
*
* Maintained by Kumar Gala (see MAINTAINERS for contact information)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/module.h>
#include <asm/system.h>
#include <asm/atomic.h>
#include <asm/io.h>
#include <asm/pci-bridge.h>
#include <asm/prom.h>
#include <sysdev/fsl_soc.h>
#undef DEBUG
#ifdef DEBUG
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif
int
mpc83xx_pci2_busno
;
#ifdef CONFIG_PCI
int
__init
add_bridge
(
struct
device_node
*
dev
)
{
int
len
;
struct
pci_controller
*
hose
;
struct
resource
rsrc
;
int
*
bus_range
;
int
primary
=
1
,
has_address
=
0
;
phys_addr_t
immr
=
get_immrbase
();
DBG
(
"Adding PCI host bridge %s
\n
"
,
dev
->
full_name
);
/* Fetch host bridge registers address */
has_address
=
(
of_address_to_resource
(
dev
,
0
,
&
rsrc
)
==
0
);
/* Get bus range if any */
bus_range
=
(
int
*
)
get_property
(
dev
,
"bus-range"
,
&
len
);
if
(
bus_range
==
NULL
||
len
<
2
*
sizeof
(
int
))
{
printk
(
KERN_WARNING
"Can't get bus-range for %s, assume"
" bus 0
\n
"
,
dev
->
full_name
);
}
hose
=
pcibios_alloc_controller
();
if
(
!
hose
)
return
-
ENOMEM
;
hose
->
arch_data
=
dev
;
hose
->
set_cfg_type
=
1
;
hose
->
first_busno
=
bus_range
?
bus_range
[
0
]
:
0
;
hose
->
last_busno
=
bus_range
?
bus_range
[
1
]
:
0xff
;
/* MPC83xx supports up to two host controllers one at 0x8500 from immrbar
* the other at 0x8600, we consider the 0x8500 the primary controller
*/
/* PCI 1 */
if
((
rsrc
.
start
&
0xfffff
)
==
0x8500
)
{
setup_indirect_pci
(
hose
,
immr
+
0x8300
,
immr
+
0x8304
);
}
/* PCI 2*/
if
((
rsrc
.
start
&
0xfffff
)
==
0x8600
)
{
setup_indirect_pci
(
hose
,
immr
+
0x8380
,
immr
+
0x8384
);
primary
=
0
;
hose
->
bus_offset
=
hose
->
first_busno
;
mpc83xx_pci2_busno
=
hose
->
first_busno
;
}
printk
(
KERN_INFO
"Found MPC83xx PCI host bridge at 0x%08lx. "
"Firmware bus number: %d->%d
\n
"
,
rsrc
.
start
,
hose
->
first_busno
,
hose
->
last_busno
);
DBG
(
" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p
\n
"
,
hose
,
hose
->
cfg_addr
,
hose
->
cfg_data
);
/* Interpret the "ranges" property */
/* This also maps the I/O region and sets isa_io/mem_base */
pci_process_bridge_OF_ranges
(
hose
,
dev
,
primary
);
return
0
;
}
#endif
arch/powerpc/platforms/chrp/pci.c
View file @
87530db5
...
...
@@ -135,12 +135,13 @@ int __init
hydra_init
(
void
)
{
struct
device_node
*
np
;
struct
resource
r
;
np
=
find_devices
(
"mac-io"
);
if
(
np
==
NULL
||
np
->
n_addrs
==
0
)
if
(
np
==
NULL
||
of_address_to_resource
(
np
,
0
,
&
r
)
)
return
0
;
Hydra
=
ioremap
(
np
->
addrs
[
0
].
address
,
np
->
addrs
[
0
].
size
);
printk
(
"Hydra Mac I/O at %lx
\n
"
,
np
->
addrs
[
0
].
address
);
Hydra
=
ioremap
(
r
.
start
,
r
.
end
-
r
.
start
);
printk
(
"Hydra Mac I/O at %lx
\n
"
,
r
.
start
);
printk
(
"Hydra Feature_Control was %x"
,
in_le32
(
&
Hydra
->
Feature_Control
));
out_le32
(
&
Hydra
->
Feature_Control
,
(
HYDRA_FC_SCC_CELL_EN
|
...
...
@@ -177,18 +178,24 @@ setup_python(struct pci_controller *hose, struct device_node *dev)
{
u32
__iomem
*
reg
;
u32
val
;
unsigned
long
addr
=
dev
->
addrs
[
0
].
address
;
struct
resource
r
;
setup_indirect_pci
(
hose
,
addr
+
0xf8000
,
addr
+
0xf8010
);
if
(
of_address_to_resource
(
dev
,
0
,
&
r
))
{
printk
(
KERN_ERR
"No address for Python PCI controller
\n
"
);
return
;
}
/* Clear the magic go-slow bit */
reg
=
ioremap
(
dev
->
addrs
[
0
].
address
+
0xf6000
,
0x40
);
reg
=
ioremap
(
r
.
start
+
0xf6000
,
0x40
);
BUG_ON
(
!
reg
);
val
=
in_be32
(
&
reg
[
12
]);
if
(
val
&
PRG_CL_RESET_VALID
)
{
out_be32
(
&
reg
[
12
],
val
&
~
PRG_CL_RESET_VALID
);
in_be32
(
&
reg
[
12
]);
}
iounmap
(
reg
);
setup_indirect_pci
(
hose
,
r
.
start
+
0xf8000
,
r
.
start
+
0xf8010
);
}
/* Marvell Discovery II based Pegasos 2 */
...
...
@@ -218,7 +225,7 @@ chrp_find_bridges(void)
char
*
model
,
*
machine
;
int
is_longtrail
=
0
,
is_mot
=
0
,
is_pegasos
=
0
;
struct
device_node
*
root
=
find_path_device
(
"/"
);
struct
resource
r
;
/*
* The PCI host bridge nodes on some machines don't have
* properties to adequately identify them, so we have to
...
...
@@ -238,7 +245,7 @@ chrp_find_bridges(void)
continue
;
++
index
;
/* The GG2 bridge on the LongTrail doesn't have an address */
if
(
dev
->
n_addrs
<
1
&&
!
is_longtrail
)
{
if
(
of_address_to_resource
(
dev
,
0
,
&
r
)
&&
!
is_longtrail
)
{
printk
(
KERN_WARNING
"Can't use %s: no address
\n
"
,
dev
->
full_name
);
continue
;
...
...
@@ -255,8 +262,8 @@ chrp_find_bridges(void)
printk
(
KERN_INFO
"PCI buses %d..%d"
,
bus_range
[
0
],
bus_range
[
1
]);
printk
(
" controlled by %s"
,
dev
->
type
);
if
(
dev
->
n_addrs
>
0
)
printk
(
" at %lx"
,
dev
->
addrs
[
0
].
address
);
if
(
!
is_longtrail
)
printk
(
" at %lx"
,
r
.
start
);
printk
(
"
\n
"
);
hose
=
pcibios_alloc_controller
();
...
...
arch/powerpc/platforms/chrp/setup.c
View file @
87530db5
...
...
@@ -352,9 +352,10 @@ static void __init chrp_find_openpic(void)
opaddr
=
opprop
[
na
-
1
];
/* assume 32-bit */
oplen
/=
na
*
sizeof
(
unsigned
int
);
}
else
{
if
(
np
->
n_addrs
==
0
)
struct
resource
r
;
if
(
of_address_to_resource
(
np
,
0
,
&
r
))
return
;
opaddr
=
np
->
addrs
[
0
].
address
;
opaddr
=
r
.
start
;
oplen
=
0
;
}
...
...
@@ -377,7 +378,7 @@ static void __init chrp_find_openpic(void)
*/
if
(
oplen
<
len
)
{
printk
(
KERN_ERR
"Insufficient addresses for distributed"
" OpenPIC (%d < %d)
\n
"
,
np
->
n_addrs
,
len
);
" OpenPIC (%d < %d)
\n
"
,
oplen
,
len
);
len
=
oplen
;
}
...
...
arch/powerpc/platforms/chrp/time.c
View file @
87530db5
...
...
@@ -21,6 +21,7 @@
#include <linux/mc146818rtc.h>
#include <linux/init.h>
#include <linux/bcd.h>
#include <linux/ioport.h>
#include <asm/io.h>
#include <asm/nvram.h>
...
...
@@ -37,14 +38,16 @@ static int nvram_data = NVRAM_DATA;
long
__init
chrp_time_init
(
void
)
{
struct
device_node
*
rtcs
;
struct
resource
r
;
int
base
;
rtcs
=
find_compatible_devices
(
"rtc"
,
"pnpPNP,b00"
);
if
(
rtcs
==
NULL
)
rtcs
=
find_compatible_devices
(
"rtc"
,
"ds1385-rtc"
);
if
(
rtcs
==
NULL
||
rtcs
->
addrs
==
NULL
)
if
(
rtcs
==
NULL
||
of_address_to_resource
(
rtcs
,
0
,
&
r
)
)
return
0
;
base
=
rtcs
->
addrs
[
0
].
address
;
base
=
r
.
start
;
nvram_as1
=
0
;
nvram_as0
=
base
;
nvram_data
=
base
+
1
;
...
...
arch/powerpc/platforms/iseries/irq.c
View file @
87530db5
...
...
@@ -334,14 +334,12 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus,
*/
int
iSeries_get_irq
(
struct
pt_regs
*
regs
)
{
struct
paca_struct
*
lpaca
;
/* -2 means ignore this interrupt */
int
irq
=
-
2
;
lpaca
=
get_paca
();
#ifdef CONFIG_SMP
if
(
lpaca
->
lppaca
.
int_dword
.
fields
.
ipi_cnt
)
{
lpaca
->
lppaca
.
int_dword
.
fields
.
ipi_cnt
=
0
;
if
(
get_lppaca
()
->
int_dword
.
fields
.
ipi_cnt
)
{
get_lppaca
()
->
int_dword
.
fields
.
ipi_cnt
=
0
;
iSeries_smp_message_recv
(
regs
);
}
#endif
/* CONFIG_SMP */
...
...
arch/powerpc/platforms/iseries/misc.S
View file @
87530db5
...
...
@@ -44,7 +44,8 @@ _GLOBAL(local_irq_restore)
/
*
Check
pending
interrupts
*/
/
*
A
decrementer
,
IPI
or
PMC
interrupt
may
have
occurred
*
while
we
were
in
the
hypervisor
(
which
enables
)
*/
ld
r4
,
PACALPPACA
+
LPPACAANYINT
(
r13
)
ld
r4
,
PACALPPACAPTR
(
r13
)
ld
r4
,
LPPACAANYINT
(
r4
)
cmpdi
r4
,
0
beqlr
...
...
arch/powerpc/platforms/iseries/setup.c
View file @
87530db5
...
...
@@ -538,7 +538,7 @@ static unsigned long __init build_iSeries_Memory_Map(void)
*/
static
void
__init
iSeries_setup_arch
(
void
)
{
if
(
get_
paca
()
->
lppaca
.
shared_proc
)
{
if
(
get_
lppaca
()
->
shared_proc
)
{
ppc_md
.
idle_loop
=
iseries_shared_idle
;
printk
(
KERN_INFO
"Using shared processor idle loop
\n
"
);
}
else
{
...
...
@@ -647,7 +647,7 @@ static void yield_shared_processor(void)
* The decrementer stops during the yield. Force a fake decrementer
* here and let the timer_interrupt code sort out the actual time.
*/
get_
paca
()
->
lppaca
.
int_dword
.
fields
.
decr_int
=
1
;
get_
lppaca
()
->
int_dword
.
fields
.
decr_int
=
1
;
process_iSeries_events
();
}
...
...
@@ -883,7 +883,7 @@ void dt_cpus(struct iseries_flat_dt *dt)
pft_size
[
1
]
=
__ilog2
(
HvCallHpt_getHptPages
()
*
HW_PAGE_SIZE
);
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
paca
[
i
].
lppaca
.
dyn_proc_status
>=
2
)
if
(
lppaca
[
i
]
.
dyn_proc_status
>=
2
)
continue
;
snprintf
(
p
,
32
-
(
p
-
buf
),
"@%d"
,
i
);
...
...
@@ -891,7 +891,7 @@ void dt_cpus(struct iseries_flat_dt *dt)
dt_prop_str
(
dt
,
"device_type"
,
"cpu"
);
index
=
paca
[
i
].
lppaca
.
dyn_hv_phys_proc_index
;
index
=
lppaca
[
i
]
.
dyn_hv_phys_proc_index
;
d
=
&
xIoHriProcessorVpd
[
index
];
dt_prop_u32
(
dt
,
"i-cache-size"
,
d
->
xInstCacheSize
*
1024
);
...
...
arch/powerpc/platforms/iseries/smp.c
View file @
87530db5
...
...
@@ -91,7 +91,7 @@ static void smp_iSeries_kick_cpu(int nr)
BUG_ON
((
nr
<
0
)
||
(
nr
>=
NR_CPUS
));
/* Verify that our partition has a processor nr */
if
(
paca
[
nr
].
lppaca
.
dyn_proc_status
>=
2
)
if
(
lppaca
[
nr
]
.
dyn_proc_status
>=
2
)
return
;
/* The processor is currently spinning, waiting
...
...
arch/powerpc/platforms/pseries/lpar.c
View file @
87530db5
...
...
@@ -254,11 +254,11 @@ void __init find_udbg_vterm(void)
void
vpa_init
(
int
cpu
)
{
int
hwcpu
=
get_hard_smp_processor_id
(
cpu
);
unsigned
long
vpa
=
__pa
(
&
paca
[
cpu
].
lppaca
);
unsigned
long
vpa
=
__pa
(
&
lppaca
[
cpu
]
);
long
ret
;
if
(
cpu_has_feature
(
CPU_FTR_ALTIVEC
))
paca
[
cpu
].
lppaca
.
vmxregs_in_use
=
1
;
lppaca
[
cpu
]
.
vmxregs_in_use
=
1
;
ret
=
register_vpa
(
hwcpu
,
vpa
);
...
...
arch/powerpc/platforms/pseries/reconfig.c
View file @
87530db5
...
...
@@ -350,6 +350,100 @@ static int do_remove_node(char *buf)
return
rv
;
}
static
char
*
parse_node
(
char
*
buf
,
size_t
bufsize
,
struct
device_node
**
npp
)
{
char
*
handle_str
;
phandle
handle
;
*
npp
=
NULL
;
handle_str
=
buf
;
buf
=
strchr
(
buf
,
' '
);
if
(
!
buf
)
return
NULL
;
*
buf
=
'\0'
;
buf
++
;
handle
=
simple_strtoul
(
handle_str
,
NULL
,
10
);
*
npp
=
of_find_node_by_phandle
(
handle
);
return
buf
;
}
static
int
do_add_property
(
char
*
buf
,
size_t
bufsize
)
{
struct
property
*
prop
=
NULL
;
struct
device_node
*
np
;
unsigned
char
*
value
;
char
*
name
,
*
end
;
int
length
;
end
=
buf
+
bufsize
;
buf
=
parse_node
(
buf
,
bufsize
,
&
np
);
if
(
!
np
)
return
-
ENODEV
;
if
(
parse_next_property
(
buf
,
end
,
&
name
,
&
length
,
&
value
)
==
NULL
)
return
-
EINVAL
;
prop
=
new_property
(
name
,
length
,
value
,
NULL
);
if
(
!
prop
)
return
-
ENOMEM
;
prom_add_property
(
np
,
prop
);
return
0
;
}
static
int
do_remove_property
(
char
*
buf
,
size_t
bufsize
)
{
struct
device_node
*
np
;
char
*
tmp
;
struct
property
*
prop
;
buf
=
parse_node
(
buf
,
bufsize
,
&
np
);
if
(
!
np
)
return
-
ENODEV
;
tmp
=
strchr
(
buf
,
' '
);
if
(
tmp
)
*
tmp
=
'\0'
;
if
(
strlen
(
buf
)
==
0
)
return
-
EINVAL
;
prop
=
of_find_property
(
np
,
buf
,
NULL
);
return
prom_remove_property
(
np
,
prop
);
}
static
int
do_update_property
(
char
*
buf
,
size_t
bufsize
)
{
struct
device_node
*
np
;
unsigned
char
*
value
;
char
*
name
,
*
end
;
int
length
;
struct
property
*
newprop
,
*
oldprop
;
buf
=
parse_node
(
buf
,
bufsize
,
&
np
);
end
=
buf
+
bufsize
;
if
(
!
np
)
return
-
ENODEV
;
if
(
parse_next_property
(
buf
,
end
,
&
name
,
&
length
,
&
value
)
==
NULL
)
return
-
EINVAL
;
newprop
=
new_property
(
name
,
length
,
value
,
NULL
);
if
(
!
newprop
)
return
-
ENOMEM
;
oldprop
=
of_find_property
(
np
,
name
,
NULL
);
if
(
!
oldprop
)
return
-
ENODEV
;
return
prom_update_property
(
np
,
newprop
,
oldprop
);
}
/**
* ofdt_write - perform operations on the Open Firmware device tree
*
...
...
@@ -392,6 +486,12 @@ static ssize_t ofdt_write(struct file *file, const char __user *buf, size_t coun
rv
=
do_add_node
(
tmp
,
count
-
(
tmp
-
kbuf
));
else
if
(
!
strcmp
(
kbuf
,
"remove_node"
))
rv
=
do_remove_node
(
tmp
);
else
if
(
!
strcmp
(
kbuf
,
"add_property"
))
rv
=
do_add_property
(
tmp
,
count
-
(
tmp
-
kbuf
));
else
if
(
!
strcmp
(
kbuf
,
"remove_property"
))
rv
=
do_remove_property
(
tmp
,
count
-
(
tmp
-
kbuf
));
else
if
(
!
strcmp
(
kbuf
,
"update_property"
))
rv
=
do_update_property
(
tmp
,
count
-
(
tmp
-
kbuf
));
else
rv
=
-
EINVAL
;
out:
...
...
arch/powerpc/platforms/pseries/setup.c
View file @
87530db5
...
...
@@ -190,7 +190,7 @@ static void pseries_lpar_enable_pmcs(void)
/* instruct hypervisor to maintain PMCs */
if
(
firmware_has_feature
(
FW_FEATURE_SPLPAR
))
get_
paca
()
->
lppaca
.
pmcregs_in_use
=
1
;
get_
lppaca
()
->
pmcregs_in_use
=
1
;
}
static
void
__init
pSeries_setup_arch
(
void
)
...
...
@@ -234,7 +234,7 @@ static void __init pSeries_setup_arch(void)
/* Choose an idle loop */
if
(
firmware_has_feature
(
FW_FEATURE_SPLPAR
))
{
vpa_init
(
boot_cpuid
);
if
(
get_
paca
()
->
lppaca
.
shared_proc
)
{
if
(
get_
lppaca
()
->
shared_proc
)
{
printk
(
KERN_INFO
"Using shared processor idle loop
\n
"
);
ppc_md
.
idle_loop
=
pseries_shared_idle
;
}
else
{
...
...
@@ -444,10 +444,10 @@ DECLARE_PER_CPU(unsigned long, smt_snooze_delay);
static
inline
void
dedicated_idle_sleep
(
unsigned
int
cpu
)
{
struct
paca_struct
*
ppaca
=
&
paca
[
cpu
^
1
];
struct
lppaca
*
plppaca
=
&
lp
paca
[
cpu
^
1
];
/* Only sleep if the other thread is not idle */
if
(
!
(
p
paca
->
lppaca
.
idle
))
{
if
(
!
(
p
lppaca
->
idle
))
{
local_irq_disable
();
/*
...
...
@@ -480,7 +480,6 @@ static inline void dedicated_idle_sleep(unsigned int cpu)
static
void
pseries_dedicated_idle
(
void
)
{
struct
paca_struct
*
lpaca
=
get_paca
();
unsigned
int
cpu
=
smp_processor_id
();
unsigned
long
start_snooze
;
unsigned
long
*
smt_snooze_delay
=
&
__get_cpu_var
(
smt_snooze_delay
);
...
...
@@ -491,7 +490,7 @@ static void pseries_dedicated_idle(void)
* Indicate to the HV that we are idle. Now would be
* a good time to find other work to dispatch.
*/
lpaca
->
lppaca
.
idle
=
1
;
get_lppaca
()
->
idle
=
1
;
if
(
!
need_resched
())
{
start_snooze
=
get_tb
()
+
...
...
@@ -518,7 +517,7 @@ static void pseries_dedicated_idle(void)
HMT_medium
();
}
lpaca
->
lppaca
.
idle
=
0
;
get_lppaca
()
->
idle
=
0
;
ppc64_runlatch_on
();
preempt_enable_no_resched
();
...
...
@@ -532,7 +531,6 @@ static void pseries_dedicated_idle(void)
static
void
pseries_shared_idle
(
void
)
{
struct
paca_struct
*
lpaca
=
get_paca
();
unsigned
int
cpu
=
smp_processor_id
();
while
(
1
)
{
...
...
@@ -540,7 +538,7 @@ static void pseries_shared_idle(void)
* Indicate to the HV that we are idle. Now would be
* a good time to find other work to dispatch.
*/
lpaca
->
lppaca
.
idle
=
1
;
get_lppaca
()
->
idle
=
1
;
while
(
!
need_resched
()
&&
!
cpu_is_offline
(
cpu
))
{
local_irq_disable
();
...
...
@@ -564,7 +562,7 @@ static void pseries_shared_idle(void)
HMT_medium
();
}
lpaca
->
lppaca
.
idle
=
0
;
get_lppaca
()
->
idle
=
0
;
ppc64_runlatch_on
();
preempt_enable_no_resched
();
...
...
@@ -588,7 +586,7 @@ static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
{
/* Don't risk a hypervisor call if we're crashing */
if
(
!
crash_shutdown
)
{
unsigned
long
vpa
=
__pa
(
&
get_paca
()
->
lppaca
);
unsigned
long
vpa
=
__pa
(
get_lppaca
()
);
if
(
unregister_vpa
(
hard_smp_processor_id
(),
vpa
))
{
printk
(
"VPA deregistration of cpu %u (hw_cpu_id %d) "
...
...
arch/powerpc/sysdev/Makefile
View file @
87530db5
...
...
@@ -7,3 +7,4 @@ obj-$(CONFIG_40x) += dcr.o
obj-$(CONFIG_U3_DART)
+=
dart_iommu.o
obj-$(CONFIG_MMIO_NVRAM)
+=
mmio_nvram.o
obj-$(CONFIG_PPC_83xx)
+=
ipic.o
obj-$(CONFIG_FSL_SOC)
+=
fsl_soc.o
arch/powerpc/sysdev/fsl_soc.c
0 → 100644
View file @
87530db5
/*
* FSL SoC setup code
*
* Maintained by Kumar Gala (see MAINTAINERS for contact information)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/major.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/fsl_devices.h>
#include <asm/system.h>
#include <asm/atomic.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/prom.h>
#include <sysdev/fsl_soc.h>
#include <mm/mmu_decl.h>
static
phys_addr_t
immrbase
=
-
1
;
phys_addr_t
get_immrbase
(
void
)
{
struct
device_node
*
soc
;
if
(
immrbase
!=
-
1
)
return
immrbase
;
soc
=
of_find_node_by_type
(
NULL
,
"soc"
);
if
(
soc
!=
0
)
{
unsigned
int
size
;
void
*
prop
=
get_property
(
soc
,
"reg"
,
&
size
);
immrbase
=
of_translate_address
(
soc
,
prop
);
of_node_put
(
soc
);
};
return
immrbase
;
}
EXPORT_SYMBOL
(
get_immrbase
);
static
const
char
*
gfar_tx_intr
=
"tx"
;
static
const
char
*
gfar_rx_intr
=
"rx"
;
static
const
char
*
gfar_err_intr
=
"error"
;
static
int
__init
gfar_of_init
(
void
)
{
struct
device_node
*
np
;
unsigned
int
i
;
struct
platform_device
*
mdio_dev
,
*
gfar_dev
;
struct
resource
res
;
int
ret
;
for
(
np
=
NULL
,
i
=
0
;
(
np
=
of_find_compatible_node
(
np
,
"mdio"
,
"gianfar"
))
!=
NULL
;
i
++
)
{
int
k
;
struct
device_node
*
child
=
NULL
;
struct
gianfar_mdio_data
mdio_data
;
memset
(
&
res
,
0
,
sizeof
(
res
));
memset
(
&
mdio_data
,
0
,
sizeof
(
mdio_data
));
ret
=
of_address_to_resource
(
np
,
0
,
&
res
);
if
(
ret
)
goto
mdio_err
;
mdio_dev
=
platform_device_register_simple
(
"fsl-gianfar_mdio"
,
res
.
start
,
&
res
,
1
);
if
(
IS_ERR
(
mdio_dev
))
{
ret
=
PTR_ERR
(
mdio_dev
);
goto
mdio_err
;
}
for
(
k
=
0
;
k
<
32
;
k
++
)
mdio_data
.
irq
[
k
]
=
-
1
;
while
((
child
=
of_get_next_child
(
np
,
child
))
!=
NULL
)
{
if
(
child
->
n_intrs
)
{
u32
*
id
=
(
u32
*
)
get_property
(
child
,
"reg"
,
NULL
);
mdio_data
.
irq
[
*
id
]
=
child
->
intrs
[
0
].
line
;
}
}
ret
=
platform_device_add_data
(
mdio_dev
,
&
mdio_data
,
sizeof
(
struct
gianfar_mdio_data
));
if
(
ret
)
goto
mdio_unreg
;
}
for
(
np
=
NULL
,
i
=
0
;
(
np
=
of_find_compatible_node
(
np
,
"network"
,
"gianfar"
))
!=
NULL
;
i
++
)
{
struct
resource
r
[
4
];
struct
device_node
*
phy
,
*
mdio
;
struct
gianfar_platform_data
gfar_data
;
unsigned
int
*
id
;
char
*
model
;
void
*
mac_addr
;
phandle
*
ph
;
memset
(
r
,
0
,
sizeof
(
r
));
memset
(
&
gfar_data
,
0
,
sizeof
(
gfar_data
));
ret
=
of_address_to_resource
(
np
,
0
,
&
r
[
0
]);
if
(
ret
)
goto
gfar_err
;
r
[
1
].
start
=
np
->
intrs
[
0
].
line
;
r
[
1
].
end
=
np
->
intrs
[
0
].
line
;
r
[
1
].
flags
=
IORESOURCE_IRQ
;
model
=
get_property
(
np
,
"model"
,
NULL
);
/* If we aren't the FEC we have multiple interrupts */
if
(
model
&&
strcasecmp
(
model
,
"FEC"
))
{
r
[
1
].
name
=
gfar_tx_intr
;
r
[
2
].
name
=
gfar_rx_intr
;
r
[
2
].
start
=
np
->
intrs
[
1
].
line
;
r
[
2
].
end
=
np
->
intrs
[
1
].
line
;
r
[
2
].
flags
=
IORESOURCE_IRQ
;
r
[
3
].
name
=
gfar_err_intr
;
r
[
3
].
start
=
np
->
intrs
[
2
].
line
;
r
[
3
].
end
=
np
->
intrs
[
2
].
line
;
r
[
3
].
flags
=
IORESOURCE_IRQ
;
}
gfar_dev
=
platform_device_register_simple
(
"fsl-gianfar"
,
i
,
&
r
[
0
],
np
->
n_intrs
+
1
);
if
(
IS_ERR
(
gfar_dev
))
{
ret
=
PTR_ERR
(
gfar_dev
);
goto
gfar_err
;
}
mac_addr
=
get_property
(
np
,
"address"
,
NULL
);
memcpy
(
gfar_data
.
mac_addr
,
mac_addr
,
6
);
if
(
model
&&
!
strcasecmp
(
model
,
"TSEC"
))
gfar_data
.
device_flags
=
FSL_GIANFAR_DEV_HAS_GIGABIT
|
FSL_GIANFAR_DEV_HAS_COALESCE
|
FSL_GIANFAR_DEV_HAS_RMON
|
FSL_GIANFAR_DEV_HAS_MULTI_INTR
;
if
(
model
&&
!
strcasecmp
(
model
,
"eTSEC"
))
gfar_data
.
device_flags
=
FSL_GIANFAR_DEV_HAS_GIGABIT
|
FSL_GIANFAR_DEV_HAS_COALESCE
|
FSL_GIANFAR_DEV_HAS_RMON
|
FSL_GIANFAR_DEV_HAS_MULTI_INTR
|
FSL_GIANFAR_DEV_HAS_CSUM
|
FSL_GIANFAR_DEV_HAS_VLAN
|
FSL_GIANFAR_DEV_HAS_EXTENDED_HASH
;
ph
=
(
phandle
*
)
get_property
(
np
,
"phy-handle"
,
NULL
);
phy
=
of_find_node_by_phandle
(
*
ph
);
if
(
phy
==
NULL
)
{
ret
=
-
ENODEV
;
goto
gfar_unreg
;
}
mdio
=
of_get_parent
(
phy
);
id
=
(
u32
*
)
get_property
(
phy
,
"reg"
,
NULL
);
ret
=
of_address_to_resource
(
mdio
,
0
,
&
res
);
if
(
ret
)
{
of_node_put
(
phy
);
of_node_put
(
mdio
);
goto
gfar_unreg
;
}
gfar_data
.
phy_id
=
*
id
;
gfar_data
.
bus_id
=
res
.
start
;
of_node_put
(
phy
);
of_node_put
(
mdio
);
ret
=
platform_device_add_data
(
gfar_dev
,
&
gfar_data
,
sizeof
(
struct
gianfar_platform_data
));
if
(
ret
)
goto
gfar_unreg
;
}
return
0
;
mdio_unreg:
platform_device_unregister
(
mdio_dev
);
mdio_err:
return
ret
;
gfar_unreg:
platform_device_unregister
(
gfar_dev
);
gfar_err:
return
ret
;
}
arch_initcall
(
gfar_of_init
);
static
int
__init
fsl_i2c_of_init
(
void
)
{
struct
device_node
*
np
;
unsigned
int
i
;
struct
platform_device
*
i2c_dev
;
int
ret
;
for
(
np
=
NULL
,
i
=
0
;
(
np
=
of_find_compatible_node
(
np
,
"i2c"
,
"fsl-i2c"
))
!=
NULL
;
i
++
)
{
struct
resource
r
[
2
];
struct
fsl_i2c_platform_data
i2c_data
;
unsigned
char
*
flags
=
NULL
;
memset
(
&
r
,
0
,
sizeof
(
r
));
memset
(
&
i2c_data
,
0
,
sizeof
(
i2c_data
));
ret
=
of_address_to_resource
(
np
,
0
,
&
r
[
0
]);
if
(
ret
)
goto
i2c_err
;
r
[
1
].
start
=
np
->
intrs
[
0
].
line
;
r
[
1
].
end
=
np
->
intrs
[
0
].
line
;
r
[
1
].
flags
=
IORESOURCE_IRQ
;
i2c_dev
=
platform_device_register_simple
(
"fsl-i2c"
,
i
,
r
,
2
);
if
(
IS_ERR
(
i2c_dev
))
{
ret
=
PTR_ERR
(
i2c_dev
);
goto
i2c_err
;
}
i2c_data
.
device_flags
=
0
;
flags
=
get_property
(
np
,
"dfsrr"
,
NULL
);
if
(
flags
)
i2c_data
.
device_flags
|=
FSL_I2C_DEV_SEPARATE_DFSRR
;
flags
=
get_property
(
np
,
"fsl5200-clocking"
,
NULL
);
if
(
flags
)
i2c_data
.
device_flags
|=
FSL_I2C_DEV_CLOCK_5200
;
ret
=
platform_device_add_data
(
i2c_dev
,
&
i2c_data
,
sizeof
(
struct
fsl_i2c_platform_data
));
if
(
ret
)
goto
i2c_unreg
;
}
return
0
;
i2c_unreg:
platform_device_unregister
(
i2c_dev
);
i2c_err:
return
ret
;
}
arch_initcall
(
fsl_i2c_of_init
);
#ifdef CONFIG_PPC_83xx
static
int
__init
mpc83xx_wdt_init
(
void
)
{
struct
resource
r
;
struct
device_node
*
soc
,
*
np
;
struct
platform_device
*
dev
;
unsigned
int
*
freq
;
int
ret
;
np
=
of_find_compatible_node
(
NULL
,
"watchdog"
,
"mpc83xx_wdt"
);
if
(
!
np
)
{
ret
=
-
ENODEV
;
goto
mpc83xx_wdt_nodev
;
}
soc
=
of_find_node_by_type
(
NULL
,
"soc"
);
if
(
!
soc
)
{
ret
=
-
ENODEV
;
goto
mpc83xx_wdt_nosoc
;
}
freq
=
(
unsigned
int
*
)
get_property
(
soc
,
"bus-frequency"
,
NULL
);
if
(
!
freq
)
{
ret
=
-
ENODEV
;
goto
mpc83xx_wdt_err
;
}
memset
(
&
r
,
0
,
sizeof
(
r
));
ret
=
of_address_to_resource
(
np
,
0
,
&
r
);
if
(
ret
)
goto
mpc83xx_wdt_err
;
dev
=
platform_device_register_simple
(
"mpc83xx_wdt"
,
0
,
&
r
,
1
);
if
(
IS_ERR
(
dev
))
{
ret
=
PTR_ERR
(
dev
);
goto
mpc83xx_wdt_err
;
}
ret
=
platform_device_add_data
(
dev
,
freq
,
sizeof
(
int
));
if
(
ret
)
goto
mpc83xx_wdt_unreg
;
of_node_put
(
soc
);
of_node_put
(
np
);
return
0
;
mpc83xx_wdt_unreg:
platform_device_unregister
(
dev
);
mpc83xx_wdt_err:
of_node_put
(
soc
);
mpc83xx_wdt_nosoc:
of_node_put
(
np
);
mpc83xx_wdt_nodev:
return
ret
;
}
arch_initcall
(
mpc83xx_wdt_init
);
#endif
arch/powerpc/sysdev/fsl_soc.h
0 → 100644
View file @
87530db5
#ifndef __PPC_FSL_SOC_H
#define __PPC_FSL_SOC_H
#ifdef __KERNEL__
extern
phys_addr_t
get_immrbase
(
void
);
#endif
#endif
arch/ppc/kernel/head_8xx.S
View file @
87530db5
...
...
@@ -375,6 +375,8 @@ DataStoreTLBMiss:
lis
r11
,
swapper_pg_dir
@
h
ori
r11
,
r11
,
swapper_pg_dir
@
l
rlwimi
r10
,
r11
,
0
,
2
,
19
stw
r12
,
16
(
r0
)
b
LoadLargeDTLB
3
:
lwz
r11
,
0
(
r10
)
/*
Get
the
level
1
entry
*/
rlwinm
.
r10
,
r11
,
0
,
0
,
19
/*
Extract
page
descriptor
page
address
*/
...
...
@@ -430,6 +432,81 @@ DataStoreTLBMiss:
InstructionTLBError
:
b
InstructionAccess
LoadLargeDTLB
:
li
r12
,
0
lwz
r11
,
0
(
r10
)
/*
Get
the
level
1
entry
*/
rlwinm
.
r10
,
r11
,
0
,
0
,
19
/*
Extract
page
descriptor
page
address
*/
beq
3
f
/*
If
zero
,
don
't try to find a pte */
/
*
We
have
a
pte
table
,
so
load
fetch
the
pte
from
the
table
.
*/
ori
r11
,
r11
,
1
/*
Set
valid
bit
in
physical
L2
page
*/
DO_8xx_CPU6
(0
x3b80
,
r3
)
mtspr
SPRN_MD_TWC
,
r11
/*
Load
pte
table
base
address
*/
mfspr
r10
,
SPRN_MD_TWC
/*
....
and
get
the
pte
address
*/
lwz
r10
,
0
(
r10
)
/*
Get
the
pte
*/
/
*
Insert
the
Guarded
flag
into
the
TWC
from
the
Linux
PTE
.
*
It
is
bit
27
of
both
the
Linux
PTE
and
the
TWC
(
at
least
*
I
got
that
right
:
-)
.
It
will
be
better
when
we
can
put
*
this
into
the
Linux
pgd
/
pmd
and
load
it
in
the
operation
*
above
.
*/
rlwimi
r11
,
r10
,
0
,
27
,
27
rlwimi
r12
,
r10
,
0
,
0
,
9
/*
extract
phys
.
addr
*/
mfspr
r3
,
SPRN_MD_EPN
rlwinm
r3
,
r3
,
0
,
0
,
9
/*
extract
virtual
address
*/
tophys
(
r3
,
r3
)
cmpw
r3
,
r12
/*
only
use
8
M
page
if
it
is
a
direct
kernel
mapping
*/
bne
1
f
ori
r11
,
r11
,
MD_PS8MEG
li
r12
,
1
b
2
f
1
:
li
r12
,
0
/*
can
't use 8MB TLB, so zero r12. */
2
:
DO_8xx_CPU6
(0
x3b80
,
r3
)
mtspr
SPRN_MD_TWC
,
r11
/
*
The
Linux
PTE
won
't go exactly into the MMU TLB.
*
Software
indicator
bits
21
,
22
and
28
must
be
clear
.
*
Software
indicator
bits
24
,
25
,
26
,
and
27
must
be
*
set
.
All
other
Linux
PTE
bits
control
the
behavior
*
of
the
MMU
.
*/
3
:
li
r11
,
0x00f0
rlwimi
r10
,
r11
,
0
,
24
,
28
/*
Set
24
-
27
,
clear
28
*/
cmpwi
r12
,
1
bne
4
f
ori
r10
,
r10
,
0x8
mfspr
r12
,
SPRN_MD_EPN
lis
r3
,
0xff80
/*
10
-
19
must
be
clear
for
8
MB
TLB
*/
ori
r3
,
r3
,
0x0fff
and
r12
,
r3
,
r12
DO_8xx_CPU6
(0
x3780
,
r3
)
mtspr
SPRN_MD_EPN
,
r12
lis
r3
,
0xff80
/*
10
-
19
must
be
clear
for
8
MB
TLB
*/
ori
r3
,
r3
,
0x0fff
and
r10
,
r3
,
r10
4
:
DO_8xx_CPU6
(0
x3d80
,
r3
)
mtspr
SPRN_MD_RPN
,
r10
/*
Update
TLB
entry
*/
mfspr
r10
,
SPRN_M_TW
/*
Restore
registers
*/
lwz
r11
,
0
(
r0
)
mtcr
r11
lwz
r11
,
4
(
r0
)
lwz
r12
,
16
(
r0
)
#ifdef CONFIG_8xx_CPU6
lwz
r3
,
8
(
r0
)
#endif
rfi
/*
This
is
the
data
TLB
error
on
the
MPC8xx
.
This
could
be
due
to
*
many
reasons
,
including
a
dirty
update
to
a
pte
.
We
can
catch
that
*
one
here
,
but
anything
else
is
an
error
.
First
,
we
track
down
the
...
...
arch/ppc/kernel/ppc_ksyms.c
View file @
87530db5
...
...
@@ -270,7 +270,6 @@ EXPORT_SYMBOL(__delay);
EXPORT_SYMBOL
(
timer_interrupt
);
EXPORT_SYMBOL
(
irq_desc
);
EXPORT_SYMBOL
(
tb_ticks_per_jiffy
);
EXPORT_SYMBOL
(
get_wchan
);
EXPORT_SYMBOL
(
console_drivers
);
#ifdef CONFIG_XMON
EXPORT_SYMBOL
(
xmon
);
...
...
arch/ppc/platforms/83xx/mpc834x_sys.c
View file @
87530db5
...
...
@@ -51,9 +51,6 @@
#include <syslib/ppc83xx_setup.h>
static
const
char
*
GFAR_PHY_0
=
"phy0:0"
;
static
const
char
*
GFAR_PHY_1
=
"phy0:1"
;
#ifndef CONFIG_PCI
unsigned
long
isa_io_base
=
0
;
unsigned
long
isa_mem_base
=
0
;
...
...
@@ -129,20 +126,21 @@ mpc834x_sys_setup_arch(void)
mdata
->
irq
[
1
]
=
MPC83xx_IRQ_EXT2
;
mdata
->
irq
[
2
]
=
-
1
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC83xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
0
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC83xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/mpc8540_ads.c
View file @
87530db5
...
...
@@ -52,10 +52,6 @@
#include <syslib/ppc85xx_setup.h>
static
const
char
*
GFAR_PHY_0
=
"phy0:0"
;
static
const
char
*
GFAR_PHY_1
=
"phy0:1"
;
static
const
char
*
GFAR_PHY_3
=
"phy0:3"
;
/* ************************************************************************
*
* Setup the architecture
...
...
@@ -102,27 +98,29 @@ mpc8540ads_setup_arch(void)
mdata
->
irq
[
2
]
=
-
1
;
mdata
->
irq
[
3
]
=
MPC85xx_IRQ_EXT5
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
0
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_FEC
);
if
(
pdata
)
{
pdata
->
board_flags
=
0
;
pdata
->
bus_id
=
GFAR_PHY_3
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
3
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet2addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/mpc8560_ads.c
View file @
87530db5
...
...
@@ -56,10 +56,6 @@
#include <syslib/ppc85xx_setup.h>
static
const
char
*
GFAR_PHY_0
=
"phy0:0"
;
static
const
char
*
GFAR_PHY_1
=
"phy0:1"
;
static
const
char
*
GFAR_PHY_3
=
"phy0:3"
;
/* ************************************************************************
*
* Setup the architecture
...
...
@@ -99,20 +95,21 @@ mpc8560ads_setup_arch(void)
mdata
->
irq
[
2
]
=
-
1
;
mdata
->
irq
[
3
]
=
MPC85xx_IRQ_EXT5
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
0
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
View file @
87530db5
...
...
@@ -395,9 +395,6 @@ mpc85xx_cds_pcibios_fixup(void)
TODC_ALLOC
();
static
const
char
*
GFAR_PHY_0
=
"phy0:0"
;
static
const
char
*
GFAR_PHY_1
=
"phy0:1"
;
/* ************************************************************************
*
* Setup the architecture
...
...
@@ -461,34 +458,37 @@ mpc85xx_cds_setup_arch(void)
mdata
->
irq
[
2
]
=
-
1
;
mdata
->
irq
[
3
]
=
-
1
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
0
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_eTSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
0
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_eTSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/sbc8560.c
View file @
87530db5
...
...
@@ -91,9 +91,6 @@ sbc8560_early_serial_map(void)
}
#endif
static
const
char
*
GFAR_PHY_25
=
"phy0:25"
;
static
const
char
*
GFAR_PHY_26
=
"phy0:26"
;
/* ************************************************************************
*
* Setup the architecture
...
...
@@ -136,20 +133,21 @@ sbc8560_setup_arch(void)
mdata
->
irq
[
25
]
=
MPC85xx_IRQ_EXT6
;
mdata
->
irq
[
26
]
=
MPC85xx_IRQ_EXT7
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_25
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
25
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_26
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
26
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/stx_gp3.c
View file @
87530db5
...
...
@@ -93,9 +93,6 @@ static u8 gp3_openpic_initsenses[] __initdata = {
0x0
,
/* External 11: */
};
static
const
char
*
GFAR_PHY_2
=
"phy0:2"
;
static
const
char
*
GFAR_PHY_4
=
"phy0:4"
;
/*
* Setup the architecture
*/
...
...
@@ -130,20 +127,21 @@ gp3_setup_arch(void)
mdata
->
irq
[
2
]
=
MPC85xx_IRQ_EXT5
;
mdata
->
irq
[
4
]
=
MPC85xx_IRQ_EXT5
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
/* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */
pdata
->
bus_id
=
GFAR_PHY_2
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
2
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
/* pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR; */
pdata
->
bus_id
=
GFAR_PHY_4
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
4
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
arch/ppc/platforms/85xx/tqm85xx.c
View file @
87530db5
...
...
@@ -91,12 +91,6 @@ static u_char tqm85xx_openpic_initsenses[] __initdata = {
0x0
,
/* External 11: */
};
static
const
char
*
GFAR_PHY_0
=
"phy0:2"
;
static
const
char
*
GFAR_PHY_1
=
"phy0:1"
;
#ifdef CONFIG_MPC8540
static
const
char
*
GFAR_PHY_3
=
"phy0:3"
;
#endif
/* ************************************************************************
*
* Setup the architecture
...
...
@@ -149,20 +143,21 @@ tqm85xx_setup_arch(void)
mdata
->
irq
[
2
]
=
-
1
;
mdata
->
irq
[
3
]
=
MPC85xx_IRQ_EXT8
;
mdata
->
irq
[
31
]
=
-
1
;
mdata
->
paddr
+=
binfo
->
bi_immr_base
;
/* setup the board related information for the enet controllers */
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC1
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_0
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
2
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enetaddr
,
6
);
}
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_TSEC2
);
if
(
pdata
)
{
pdata
->
board_flags
=
FSL_GIANFAR_BRD_HAS_PHY_INTR
;
pdata
->
bus_id
=
GFAR_PHY_1
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
1
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet1addr
,
6
);
}
...
...
@@ -170,7 +165,8 @@ tqm85xx_setup_arch(void)
pdata
=
(
struct
gianfar_platform_data
*
)
ppc_sys_get_pdata
(
MPC85xx_FEC
);
if
(
pdata
)
{
pdata
->
board_flags
=
0
;
pdata
->
bus_id
=
GFAR_PHY_3
;
pdata
->
bus_id
=
0
;
pdata
->
phy_id
=
3
;
memcpy
(
pdata
->
mac_addr
,
binfo
->
bi_enet2addr
,
6
);
}
#endif
...
...
arch/ppc/syslib/mpc83xx_devices.c
View file @
87530db5
...
...
@@ -28,7 +28,6 @@
*/
struct
gianfar_mdio_data
mpc83xx_mdio_pdata
=
{
.
paddr
=
0x24520
,
};
static
struct
gianfar_platform_data
mpc83xx_tsec1_pdata
=
{
...
...
@@ -226,7 +225,14 @@ struct platform_device ppc_sys_platform_devices[] = {
.
name
=
"fsl-gianfar_mdio"
,
.
id
=
0
,
.
dev
.
platform_data
=
&
mpc83xx_mdio_pdata
,
.
num_resources
=
0
,
.
num_resources
=
1
,
.
resource
=
(
struct
resource
[])
{
{
.
start
=
0x24520
,
.
end
=
0x2453f
,
.
flags
=
IORESOURCE_MEM
,
},
},
},
};
...
...
arch/ppc/syslib/mpc85xx_devices.c
View file @
87530db5
...
...
@@ -26,7 +26,6 @@
* what CCSRBAR is, will get fixed up by mach_mpc85xx_fixup
*/
struct
gianfar_mdio_data
mpc85xx_mdio_pdata
=
{
.
paddr
=
MPC85xx_MIIM_OFFSET
,
};
static
struct
gianfar_platform_data
mpc85xx_tsec1_pdata
=
{
...
...
@@ -720,7 +719,14 @@ struct platform_device ppc_sys_platform_devices[] = {
.
name
=
"fsl-gianfar_mdio"
,
.
id
=
0
,
.
dev
.
platform_data
=
&
mpc85xx_mdio_pdata
,
.
num_resources
=
0
,
.
num_resources
=
1
,
.
resource
=
(
struct
resource
[])
{
{
.
start
=
0x24520
,
.
end
=
0x2453f
,
.
flags
=
IORESOURCE_MEM
,
},
},
},
};
...
...
drivers/macintosh/macio-adb.c
View file @
87530db5
...
...
@@ -17,6 +17,7 @@
#include <asm/irq.h>
#include <asm/system.h>
#include <linux/init.h>
#include <linux/ioport.h>
struct
preg
{
unsigned
char
r
;
...
...
@@ -88,24 +89,26 @@ int macio_probe(void)
int
macio_init
(
void
)
{
struct
device_node
*
adbs
;
struct
resource
r
;
adbs
=
find_compatible_devices
(
"adb"
,
"chrp,adb0"
);
if
(
adbs
==
0
)
return
-
ENXIO
;
#if 0
{ int i;
{ int i
= 0
;
printk("macio_adb_init: node = %p, addrs =", adbs->node);
for (i = 0; i < adbs->n_addrs; ++i
)
printk(" %x(%x)",
adbs->addrs[i].address, adbs->addrs[i].size
);
while(!of_address_to_resource(adbs, i, &r)
)
printk(" %x(%x)",
r.start, r.end - r.start
);
printk(", intrs =");
for (i = 0; i < adbs->n_intrs; ++i)
printk(" %x", adbs->intrs[i].line);
printk("\n"); }
#endif
adb
=
ioremap
(
adbs
->
addrs
->
address
,
sizeof
(
struct
adb_regs
));
if
(
of_address_to_resource
(
adbs
,
0
,
&
r
))
return
-
ENXIO
;
adb
=
ioremap
(
r
.
start
,
sizeof
(
struct
adb_regs
));
out_8
(
&
adb
->
ctrl
.
r
,
0
);
out_8
(
&
adb
->
intr
.
r
,
0
);
...
...
fs/proc/proc_devtree.c
View file @
87530db5
...
...
@@ -81,6 +81,30 @@ void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop
__proc_device_tree_add_prop
(
pde
,
prop
);
}
void
proc_device_tree_remove_prop
(
struct
proc_dir_entry
*
pde
,
struct
property
*
prop
)
{
remove_proc_entry
(
prop
->
name
,
pde
);
}
void
proc_device_tree_update_prop
(
struct
proc_dir_entry
*
pde
,
struct
property
*
newprop
,
struct
property
*
oldprop
)
{
struct
proc_dir_entry
*
ent
;
for
(
ent
=
pde
->
subdir
;
ent
!=
NULL
;
ent
=
ent
->
next
)
if
(
ent
->
data
==
oldprop
)
break
;
if
(
ent
==
NULL
)
{
printk
(
KERN_WARNING
"device-tree: property
\"
%s
\"
"
" does not exist
\n
"
,
oldprop
->
name
);
}
else
{
ent
->
data
=
newprop
;
ent
->
size
=
newprop
->
length
;
}
}
/*
* Process a node, adding entries for its children and its properties.
*/
...
...
include/asm-powerpc/atomic.h
View file @
87530db5
...
...
@@ -36,7 +36,7 @@ static __inline__ int atomic_add_return(int a, atomic_t *v)
int
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%2 # atomic_add_return
\n
\
add %0,%1,%0
\n
"
PPC405_ERR77
(
0
,
%
2
)
...
...
@@ -72,7 +72,7 @@ static __inline__ int atomic_sub_return(int a, atomic_t *v)
int
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%2 # atomic_sub_return
\n
\
subf %0,%1,%0
\n
"
PPC405_ERR77
(
0
,
%
2
)
...
...
@@ -106,7 +106,7 @@ static __inline__ int atomic_inc_return(atomic_t *v)
int
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%1 # atomic_inc_return
\n
\
addic %0,%0,1
\n
"
PPC405_ERR77
(
0
,
%
1
)
...
...
@@ -150,7 +150,7 @@ static __inline__ int atomic_dec_return(atomic_t *v)
int
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%1 # atomic_dec_return
\n
\
addic %0,%0,-1
\n
"
PPC405_ERR77
(
0
,
%
1
)
...
...
@@ -176,19 +176,19 @@ static __inline__ int atomic_dec_return(atomic_t *v)
* Atomically adds @a to @v, so long as it was not @u.
* Returns non-zero if @v was not @u, and zero otherwise.
*/
#define atomic_add_unless(v, a, u)
\
({
\
int c, old;
\
c = atomic_read(v);
\
for (;;) {
\
if (unlikely(c == (u)))
\
break;
\
old = atomic_cmpxchg((v), c, c + (a));
\
if (likely(old == c))
\
break;
\
c = old;
\
}
\
c != (u);
\
#define atomic_add_unless(v, a, u) \
({ \
int c, old;
\
c = atomic_read(v);
\
for (;;) {
\
if (unlikely(c == (u)))
\
break;
\
old = atomic_cmpxchg((v), c, c + (a));
\
if (likely(old == c))
\
break;
\
c = old;
\
}
\
c != (u);
\
})
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
...
...
@@ -204,7 +204,7 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)
int
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%1 # atomic_dec_if_positive
\n
\
addic. %0,%0,-1
\n
\
blt- 2f
\n
"
...
...
@@ -253,7 +253,7 @@ static __inline__ long atomic64_add_return(long a, atomic64_t *v)
long
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%2 # atomic64_add_return
\n
\
add %0,%1,%0
\n
\
stdcx. %0,0,%2
\n
\
...
...
@@ -287,7 +287,7 @@ static __inline__ long atomic64_sub_return(long a, atomic64_t *v)
long
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%2 # atomic64_sub_return
\n
\
subf %0,%1,%0
\n
\
stdcx. %0,0,%2
\n
\
...
...
@@ -319,7 +319,7 @@ static __inline__ long atomic64_inc_return(atomic64_t *v)
long
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%1 # atomic64_inc_return
\n
\
addic %0,%0,1
\n
\
stdcx. %0,0,%1
\n
\
...
...
@@ -361,7 +361,7 @@ static __inline__ long atomic64_dec_return(atomic64_t *v)
long
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%1 # atomic64_dec_return
\n
\
addic %0,%0,-1
\n
\
stdcx. %0,0,%1
\n
\
...
...
@@ -386,7 +386,7 @@ static __inline__ long atomic64_dec_if_positive(atomic64_t *v)
long
t
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%1 # atomic64_dec_if_positive
\n
\
addic. %0,%0,-1
\n
\
blt- 2f
\n
\
...
...
include/asm-powerpc/bitops.h
View file @
87530db5
...
...
@@ -112,7 +112,7 @@ static __inline__ int test_and_set_bit(unsigned long nr,
unsigned
long
*
p
=
((
unsigned
long
*
)
addr
)
+
BITOP_WORD
(
nr
);
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1:"
PPC_LLARX
"%0,0,%3 # test_and_set_bit
\n
"
"or %1,%0,%2
\n
"
PPC405_ERR77
(
0
,
%
3
)
...
...
@@ -134,7 +134,7 @@ static __inline__ int test_and_clear_bit(unsigned long nr,
unsigned
long
*
p
=
((
unsigned
long
*
)
addr
)
+
BITOP_WORD
(
nr
);
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1:"
PPC_LLARX
"%0,0,%3 # test_and_clear_bit
\n
"
"andc %1,%0,%2
\n
"
PPC405_ERR77
(
0
,
%
3
)
...
...
@@ -156,7 +156,7 @@ static __inline__ int test_and_change_bit(unsigned long nr,
unsigned
long
*
p
=
((
unsigned
long
*
)
addr
)
+
BITOP_WORD
(
nr
);
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1:"
PPC_LLARX
"%0,0,%3 # test_and_change_bit
\n
"
"xor %1,%0,%2
\n
"
PPC405_ERR77
(
0
,
%
3
)
...
...
include/asm-powerpc/cputable.h
View file @
87530db5
...
...
@@ -19,6 +19,7 @@
#define PPC_FEATURE_POWER5 0x00040000
#define PPC_FEATURE_POWER5_PLUS 0x00020000
#define PPC_FEATURE_CELL 0x00010000
#define PPC_FEATURE_BOOKE 0x00008000
#ifdef __KERNEL__
#ifndef __ASSEMBLY__
...
...
@@ -31,11 +32,11 @@ struct cpu_spec;
typedef
void
(
*
cpu_setup_t
)(
unsigned
long
offset
,
struct
cpu_spec
*
spec
);
enum
powerpc_oprofile_type
{
INVALID
=
0
,
RS64
=
1
,
POWER4
=
2
,
G4
=
3
,
BOOKE
=
4
,
PPC_OPROFILE_
INVALID
=
0
,
PPC_OPROFILE_
RS64
=
1
,
P
PC_OPROFILE_P
OWER4
=
2
,
PPC_OPROFILE_
G4
=
3
,
PPC_OPROFILE_
BOOKE
=
4
,
};
struct
cpu_spec
{
...
...
@@ -64,6 +65,9 @@ struct cpu_spec {
/* Processor specific oprofile operations */
enum
powerpc_oprofile_type
oprofile_type
;
/* Name of processor class, for the ELF AT_PLATFORM entry */
char
*
platform
;
};
extern
struct
cpu_spec
*
cur_cpu_spec
;
...
...
include/asm-powerpc/elf.h
View file @
87530db5
...
...
@@ -221,20 +221,18 @@ extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *);
instruction set this cpu supports. This could be done in userspace,
but it's not easy, and we've already done it here. */
# define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
#ifdef __powerpc64__
# define ELF_PLAT_INIT(_r, load_addr) do { \
_r->gpr[2] = load_addr; \
} while (0)
#endif
/* __powerpc64__ */
/* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in
intent than poking at uname or /proc/cpuinfo.
intent than poking at uname or /proc/cpuinfo.
*/
For the moment, we have only optimizations for the Intel generations,
but that could change... */
#define ELF_PLATFORM (cur_cpu_spec->platform)
#define ELF_PLATFORM (NULL)
#ifdef __powerpc64__
# define ELF_PLAT_INIT(_r, load_addr) do { \
_r->gpr[2] = load_addr; \
} while (0)
#endif
/* __powerpc64__ */
#ifdef __KERNEL__
...
...
include/asm-powerpc/futex.h
View file @
87530db5
...
...
@@ -11,7 +11,7 @@
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
__asm__ __volatile ( \
SYNC_ON_SMP \
LW
SYNC_ON_SMP \
"1: lwarx %0,0,%2\n" \
insn \
PPC405_ERR77(0, %2) \
...
...
include/asm-powerpc/hvcall.h
View file @
87530db5
...
...
@@ -6,7 +6,10 @@
#define H_Success 0
#define H_Busy 1
/* Hardware busy -- retry later */
#define H_Closed 2
/* Resource closed */
#define H_Constrained 4
/* Resource request constrained to max allowed */
#define H_InProgress 14
/* Kind of like busy */
#define H_Continue 18
/* Returned from H_Join on success */
#define H_LongBusyStartRange 9900
/* Start of long busy range */
#define H_LongBusyOrder1msec 9900
/* Long busy, hint that 1msec is a good time to retry */
#define H_LongBusyOrder10msec 9901
/* Long busy, hint that 10msec is a good time to retry */
...
...
@@ -114,6 +117,8 @@
#define H_REGISTER_VTERM 0x154
#define H_FREE_VTERM 0x158
#define H_POLL_PENDING 0x1D8
#define H_JOIN 0x298
#define H_ENABLE_CRQ 0x2B0
#ifndef __ASSEMBLY__
...
...
include/asm-powerpc/lppaca.h
View file @
87530db5
...
...
@@ -29,7 +29,9 @@
//----------------------------------------------------------------------------
#include <asm/types.h>
struct
lppaca
{
/* The Hypervisor barfs if the lppaca crosses a page boundary. A 1k
* alignment is sufficient to prevent this */
struct
__attribute__
((
__aligned__
(
0x400
)))
lppaca
{
//=============================================================================
// CACHE_LINE_1 0x0000 - 0x007F Contains read-only data
// NOTE: The xDynXyz fields are fields that will be dynamically changed by
...
...
@@ -129,5 +131,7 @@ struct lppaca {
u8
pmc_save_area
[
256
];
// PMC interrupt Area x00-xFF
};
extern
struct
lppaca
lppaca
[];
#endif
/* __KERNEL__ */
#endif
/* _ASM_POWERPC_LPPACA_H */
include/asm-powerpc/paca.h
View file @
87530db5
...
...
@@ -23,6 +23,7 @@
register
struct
paca_struct
*
local_paca
asm
(
"r13"
);
#define get_paca() local_paca
#define get_lppaca() (get_paca()->lppaca_ptr)
struct
task_struct
;
...
...
@@ -95,19 +96,6 @@ struct paca_struct {
u64
saved_r1
;
/* r1 save for RTAS calls */
u64
saved_msr
;
/* MSR saved here by enter_rtas */
u8
proc_enabled
;
/* irq soft-enable flag */
/*
* iSeries structure which the hypervisor knows about -
* this structure should not cross a page boundary.
* The vpa_init/register_vpa call is now known to fail if the
* lppaca structure crosses a page boundary.
* The lppaca is also used on POWER5 pSeries boxes.
* The lppaca is 640 bytes long, and cannot readily change
* since the hypervisor knows its layout, so a 1kB
* alignment will suffice to ensure that it doesn't
* cross a page boundary.
*/
struct
lppaca
lppaca
__attribute__
((
__aligned__
(
0x400
)));
};
extern
struct
paca_struct
paca
[];
...
...
include/asm-powerpc/ppc_asm.h
View file @
87530db5
...
...
@@ -156,52 +156,56 @@ GLUE(.,name):
#endif
/*
* LOADADDR( rn, name )
* loads the address of 'name' into 'rn'
* LOAD_REG_IMMEDIATE(rn, expr)
* Loads the value of the constant expression 'expr' into register 'rn'
* using immediate instructions only. Use this when it's important not
* to reference other data (i.e. on ppc64 when the TOC pointer is not
* valid).
*
* LOADBASE( rn, name )
* loads the address (possibly without the low 16 bits) of 'name' into 'rn'
* suitable for base+disp addressing
* LOAD_REG_ADDR(rn, name)
* Loads the address of label 'name' into register 'rn'. Use this when
* you don't particularly need immediate instructions only, but you need
* the whole address in one register (e.g. it's a structure address and
* you want to access various offsets within it). On ppc32 this is
* identical to LOAD_REG_IMMEDIATE.
*
* LOAD_REG_ADDRBASE(rn, name)
* ADDROFF(name)
* LOAD_REG_ADDRBASE loads part of the address of label 'name' into
* register 'rn'. ADDROFF(name) returns the remainder of the address as
* a constant expression. ADDROFF(name) is a signed expression < 16 bits
* in size, so is suitable for use directly as an offset in load and store
* instructions. Use this when loading/storing a single word or less as:
* LOAD_REG_ADDRBASE(rX, name)
* ld rY,ADDROFF(name)(rX)
*/
#ifdef __powerpc64__
#define LOADADDR(rn,name) \
lis rn,name##@highest; \
ori rn,rn,name##@higher; \
rldicr rn,rn,32,31; \
oris rn,rn,name##@h; \
ori rn,rn,name##@l
#define LOADBASE(rn,name) \
ld rn,name@got(r2)
#define OFF(name) 0
#define SET_REG_TO_CONST(reg, value) \
lis reg,(((value)>>48)&0xFFFF); \
ori reg,reg,(((value)>>32)&0xFFFF); \
rldicr reg,reg,32,31; \
oris reg,reg,(((value)>>16)&0xFFFF); \
ori reg,reg,((value)&0xFFFF);
#define SET_REG_TO_LABEL(reg, label) \
lis reg,(label)@highest; \
ori reg,reg,(label)@higher; \
rldicr reg,reg,32,31; \
oris reg,reg,(label)@h; \
ori reg,reg,(label)@l;
#define LOAD_REG_IMMEDIATE(reg,expr) \
lis (reg),(expr)@highest; \
ori (reg),(reg),(expr)@higher; \
rldicr (reg),(reg),32,31; \
oris (reg),(reg),(expr)@h; \
ori (reg),(reg),(expr)@l;
#define LOAD_REG_ADDR(reg,name) \
ld (reg),name@got(r2)
#define LOAD_REG_ADDRBASE(reg,name) LOAD_REG_ADDR(reg,name)
#define ADDROFF(name) 0
/* offsets for stack frame layout */
#define LRSAVE 16
#else
/* 32-bit */
#define LOADADDR(rn,name) \
lis rn,name@ha; \
addi rn,rn,name@l
#define LOADBASE(rn,name) \
lis rn,name@ha
#define LOAD_REG_IMMEDIATE(reg,expr) \
lis (reg),(expr)@ha; \
addi (reg),(reg),(expr)@l;
#define LOAD_REG_ADDR(reg,name) LOAD_REG_IMMEDIATE(reg, name)
#define OFF(name) name@l
#define LOAD_REG_ADDRBASE(reg, name) lis (reg),name@ha
#define ADDROFF(name) name@l
/* offsets for stack frame layout */
#define LRSAVE 4
...
...
include/asm-powerpc/prom.h
View file @
87530db5
...
...
@@ -87,6 +87,7 @@ struct device_node {
char
*
full_name
;
struct
property
*
properties
;
struct
property
*
deadprops
;
/* removed properties */
struct
device_node
*
parent
;
struct
device_node
*
child
;
struct
device_node
*
sibling
;
...
...
@@ -135,6 +136,9 @@ extern struct device_node *of_find_all_nodes(struct device_node *prev);
extern
struct
device_node
*
of_get_parent
(
const
struct
device_node
*
node
);
extern
struct
device_node
*
of_get_next_child
(
const
struct
device_node
*
node
,
struct
device_node
*
prev
);
extern
struct
property
*
of_find_property
(
struct
device_node
*
np
,
const
char
*
name
,
int
*
lenp
);
extern
struct
device_node
*
of_node_get
(
struct
device_node
*
node
);
extern
void
of_node_put
(
struct
device_node
*
node
);
...
...
@@ -164,6 +168,10 @@ extern int prom_n_size_cells(struct device_node* np);
extern
int
prom_n_intr_cells
(
struct
device_node
*
np
);
extern
void
prom_get_irq_senses
(
unsigned
char
*
senses
,
int
off
,
int
max
);
extern
int
prom_add_property
(
struct
device_node
*
np
,
struct
property
*
prop
);
extern
int
prom_remove_property
(
struct
device_node
*
np
,
struct
property
*
prop
);
extern
int
prom_update_property
(
struct
device_node
*
np
,
struct
property
*
newprop
,
struct
property
*
oldprop
);
#ifdef CONFIG_PPC32
/*
...
...
include/asm-powerpc/spinlock.h
View file @
87530db5
...
...
@@ -46,7 +46,7 @@ static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock)
token
=
LOCK_TOKEN
;
__asm__
__volatile__
(
"1: lwarx %0,0,%2
# __spin_trylock
\n
\
"1: lwarx %0,0,%2
\n
\
cmpwi 0,%0,0
\n
\
bne- 2f
\n
\
stwcx. %1,0,%2
\n
\
...
...
@@ -80,7 +80,7 @@ static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock)
#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
/* We only yield to the hypervisor if we are in shared processor mode */
#define SHARED_PROCESSOR (get_
paca()->lppaca.
shared_proc)
#define SHARED_PROCESSOR (get_
lppaca()->
shared_proc)
extern
void
__spin_yield
(
raw_spinlock_t
*
lock
);
extern
void
__rw_yield
(
raw_rwlock_t
*
lock
);
#else
/* SPLPAR || ISERIES */
...
...
@@ -124,8 +124,8 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long
static
__inline__
void
__raw_spin_unlock
(
raw_spinlock_t
*
lock
)
{
__asm__
__volatile__
(
SYNC_ON_SMP
" # __raw_spin_unlock
"
:
:
:
"memory"
);
__asm__
__volatile__
(
"# __raw_spin_unlock
\n\t
"
LWSYNC_ON_SMP
:
:
:
"memory"
);
lock
->
slock
=
0
;
}
...
...
@@ -167,7 +167,7 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw)
long
tmp
;
__asm__
__volatile__
(
"1: lwarx %0,0,%1
# read_trylock
\n
"
"1: lwarx %0,0,%1
\n
"
__DO_SIGN_EXTEND
" addic. %0,%0,1
\n
\
ble- 2f
\n
"
...
...
@@ -192,7 +192,7 @@ static __inline__ long __write_trylock(raw_rwlock_t *rw)
token
=
WRLOCK_TOKEN
;
__asm__
__volatile__
(
"1: lwarx %0,0,%2
# write_trylock
\n
\
"1: lwarx %0,0,%2
\n
\
cmpwi 0,%0,0
\n
\
bne- 2f
\n
"
PPC405_ERR77
(
0
,
%
1
)
...
...
@@ -249,8 +249,9 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
long
tmp
;
__asm__
__volatile__
(
"eieio # read_unlock
\n
\
1: lwarx %0,0,%1
\n
\
"# read_unlock
\n\t
"
LWSYNC_ON_SMP
"1: lwarx %0,0,%1
\n
\
addic %0,%0,-1
\n
"
PPC405_ERR77
(
0
,
%
1
)
" stwcx. %0,0,%1
\n
\
...
...
@@ -262,8 +263,8 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
static
__inline__
void
__raw_write_unlock
(
raw_rwlock_t
*
rw
)
{
__asm__
__volatile__
(
SYNC_ON_SMP
" # write_unlock
"
:
:
:
"memory"
);
__asm__
__volatile__
(
"# write_unlock
\n\t
"
LWSYNC_ON_SMP
:
:
:
"memory"
);
rw
->
lock
=
0
;
}
...
...
include/asm-powerpc/synch.h
View file @
87530db5
...
...
@@ -2,6 +2,8 @@
#define _ASM_POWERPC_SYNCH_H
#ifdef __KERNEL__
#include <linux/stringify.h>
#ifdef __powerpc64__
#define __SUBARCH_HAS_LWSYNC
#endif
...
...
@@ -12,20 +14,12 @@
# define LWSYNC sync
#endif
/*
* Arguably the bitops and *xchg operations don't imply any memory barrier
* or SMP ordering, but in fact a lot of drivers expect them to imply
* both, since they do on x86 cpus.
*/
#ifdef CONFIG_SMP
#define EIEIO_ON_SMP "eieio\n"
#define ISYNC_ON_SMP "\n\tisync"
#define SYNC_ON_SMP __stringify(LWSYNC) "\n"
#define
LW
SYNC_ON_SMP __stringify(LWSYNC) "\n"
#else
#define EIEIO_ON_SMP
#define ISYNC_ON_SMP
#define SYNC_ON_SMP
#define
LW
SYNC_ON_SMP
#endif
static
inline
void
eieio
(
void
)
...
...
@@ -38,14 +32,5 @@ static inline void isync(void)
__asm__
__volatile__
(
"isync"
:
:
:
"memory"
);
}
#ifdef CONFIG_SMP
#define eieio_on_smp() eieio()
#define isync_on_smp() isync()
#else
#define eieio_on_smp() __asm__ __volatile__("": : :"memory")
#define isync_on_smp() __asm__ __volatile__("": : :"memory")
#endif
#endif
/* __KERNEL__ */
#endif
/* _ASM_POWERPC_SYNCH_H */
include/asm-powerpc/system.h
View file @
87530db5
...
...
@@ -212,7 +212,7 @@ __xchg_u32(volatile void *p, unsigned long val)
unsigned
long
prev
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%2
\n
"
PPC405_ERR77
(
0
,
%
2
)
" stwcx. %3,0,%2
\n
\
...
...
@@ -232,7 +232,7 @@ __xchg_u64(volatile void *p, unsigned long val)
unsigned
long
prev
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%2
\n
"
PPC405_ERR77
(
0
,
%
2
)
" stdcx. %3,0,%2
\n
\
...
...
@@ -287,7 +287,7 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned long old, unsigned long new)
unsigned
int
prev
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: lwarx %0,0,%2 # __cmpxchg_u32
\n
\
cmpw 0,%0,%3
\n
\
bne- 2f
\n
"
...
...
@@ -311,7 +311,7 @@ __cmpxchg_u64(volatile unsigned long *p, unsigned long old, unsigned long new)
unsigned
long
prev
;
__asm__
__volatile__
(
EIEIO
_ON_SMP
LWSYNC
_ON_SMP
"1: ldarx %0,0,%2 # __cmpxchg_u64
\n
\
cmpd 0,%0,%3
\n
\
bne- 2f
\n
\
...
...
include/asm-powerpc/time.h
View file @
87530db5
...
...
@@ -175,11 +175,10 @@ static inline void set_dec(int val)
set_dec_cpu6
(
val
);
#else
#ifdef CONFIG_PPC_ISERIES
struct
paca_struct
*
lpaca
=
get_paca
();
int
cur_dec
;
if
(
lpaca
->
lppaca
.
shared_proc
)
{
lpaca
->
lppaca
.
virtual_decr
=
val
;
if
(
get_lppaca
()
->
shared_proc
)
{
get_lppaca
()
->
virtual_decr
=
val
;
cur_dec
=
get_dec
();
if
(
cur_dec
>
val
)
HvCall_setVirtualDecr
();
...
...
include/linux/proc_fs.h
View file @
87530db5
...
...
@@ -146,6 +146,11 @@ struct property;
extern
void
proc_device_tree_init
(
void
);
extern
void
proc_device_tree_add_node
(
struct
device_node
*
,
struct
proc_dir_entry
*
);
extern
void
proc_device_tree_add_prop
(
struct
proc_dir_entry
*
pde
,
struct
property
*
prop
);
extern
void
proc_device_tree_remove_prop
(
struct
proc_dir_entry
*
pde
,
struct
property
*
prop
);
extern
void
proc_device_tree_update_prop
(
struct
proc_dir_entry
*
pde
,
struct
property
*
newprop
,
struct
property
*
oldprop
);
#endif
/* CONFIG_PROC_DEVICETREE */
extern
struct
proc_dir_entry
*
proc_symlink
(
const
char
*
,
...
...
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