Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
1e7342e7
Commit
1e7342e7
authored
Dec 16, 2011
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'jwb/next' into next
Conflicts: arch/powerpc/platforms/40x/ppc40x_simple.c
parents
78c5c68a
228d5505
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1159 additions
and
14 deletions
+1159
-14
MAINTAINERS
MAINTAINERS
+1
-1
arch/powerpc/boot/Makefile
arch/powerpc/boot/Makefile
+4
-1
arch/powerpc/boot/dcr.h
arch/powerpc/boot/dcr.h
+6
-0
arch/powerpc/boot/div64.S
arch/powerpc/boot/div64.S
+52
-0
arch/powerpc/boot/dts/currituck.dts
arch/powerpc/boot/dts/currituck.dts
+237
-0
arch/powerpc/boot/dts/klondike.dts
arch/powerpc/boot/dts/klondike.dts
+227
-0
arch/powerpc/boot/treeboot-currituck.c
arch/powerpc/boot/treeboot-currituck.c
+119
-0
arch/powerpc/boot/wrapper
arch/powerpc/boot/wrapper
+3
-0
arch/powerpc/configs/40x/klondike_defconfig
arch/powerpc/configs/40x/klondike_defconfig
+55
-0
arch/powerpc/configs/44x/currituck_defconfig
arch/powerpc/configs/44x/currituck_defconfig
+110
-0
arch/powerpc/include/asm/reg.h
arch/powerpc/include/asm/reg.h
+1
-0
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/cputable.c
+27
-0
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_44x.S
+2
-0
arch/powerpc/mm/44x_mmu.c
arch/powerpc/mm/44x_mmu.c
+0
-4
arch/powerpc/platforms/40x/Kconfig
arch/powerpc/platforms/40x/Kconfig
+11
-0
arch/powerpc/platforms/40x/ppc40x_simple.c
arch/powerpc/platforms/40x/ppc40x_simple.c
+1
-0
arch/powerpc/platforms/44x/Kconfig
arch/powerpc/platforms/44x/Kconfig
+14
-0
arch/powerpc/platforms/44x/Makefile
arch/powerpc/platforms/44x/Makefile
+1
-0
arch/powerpc/platforms/44x/currituck.c
arch/powerpc/platforms/44x/currituck.c
+204
-0
arch/powerpc/sysdev/ppc4xx_pci.c
arch/powerpc/sysdev/ppc4xx_pci.c
+77
-8
arch/powerpc/sysdev/ppc4xx_pci.h
arch/powerpc/sysdev/ppc4xx_pci.h
+7
-0
No files found.
MAINTAINERS
View file @
1e7342e7
...
...
@@ -4020,7 +4020,7 @@ M: Josh Boyer <jwboyer@gmail.com>
M: Matt Porter <mporter@kernel.crashing.org>
W: http://www.penguinppc.org/
L: linuxppc-dev@lists.ozlabs.org
T: git git://git.
kernel.org/pub/scm/linux/kernel/git
/jwboyer/powerpc-4xx.git
T: git git://git.
infradead.org/users
/jwboyer/powerpc-4xx.git
S: Maintained
F: arch/powerpc/platforms/40x/
F: arch/powerpc/platforms/44x/
...
...
arch/powerpc/boot/Makefile
View file @
1e7342e7
...
...
@@ -45,6 +45,7 @@ $(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
$(obj)/cuboot-acadia.o
:
BOOTCFLAGS += -mcpu=405
$(obj)/treeboot-walnut.o
:
BOOTCFLAGS += -mcpu=405
$(obj)/treeboot-iss4xx.o
:
BOOTCFLAGS += -mcpu=405
$(obj)/treeboot-currituck.o
:
BOOTCFLAGS += -mcpu=405
$(obj)/virtex405-head.o
:
BOOTAFLAGS += -mcpu=405
...
...
@@ -79,7 +80,8 @@ src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c
cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c
\
virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c
\
cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c
\
gamecube-head.S gamecube.c wii-head.S wii.c treeboot-iss4xx.c
gamecube-head.S gamecube.c wii-head.S wii.c treeboot-iss4xx.c
\
treeboot-currituck.c
src-boot
:=
$
(
src-wlib
)
$
(
src-plat
)
empty.c
src-boot
:=
$(
addprefix
$(obj)
/,
$
(
src-boot
))
...
...
@@ -213,6 +215,7 @@ image-$(CONFIG_WARP) += cuImage.warp
image-$(CONFIG_YOSEMITE)
+=
cuImage.yosemite
image-$(CONFIG_ISS4xx)
+=
treeImage.iss4xx
\
treeImage.iss4xx-mpic
image-$(CONFIG_CURRITUCK)
+=
treeImage.currituck
# Board ports in arch/powerpc/platform/8xx/Kconfig
image-$(CONFIG_MPC86XADS)
+=
cuImage.mpc866ads
...
...
arch/powerpc/boot/dcr.h
View file @
1e7342e7
...
...
@@ -9,6 +9,12 @@
})
#define mtdcr(rn, val) \
asm volatile("mtdcr %0,%1" : : "i"(rn), "r"(val))
#define mfdcrx(rn) \
({ \
unsigned long rval; \
asm volatile("mfdcrx %0,%1" : "=r"(rval) : "r"(rn)); \
rval; \
})
/* 440GP/440GX SDRAM controller DCRs */
#define DCRN_SDRAM0_CFGADDR 0x010
...
...
arch/powerpc/boot/div64.S
View file @
1e7342e7
...
...
@@ -57,3 +57,55 @@ __div64_32:
stw
r8
,
4
(
r3
)
mr
r3
,
r6
#
return
the
remainder
in
r3
blr
/*
*
Extended
precision
shifts
.
*
*
Updated
to
be
valid
for
shift
counts
from
0
to
63
inclusive
.
*
--
Gabriel
*
*
R3
/
R4
has
64
bit
value
*
R5
has
shift
count
*
result
in
R3
/
R4
*
*
ashrdi3
:
arithmetic
right
shift
(
sign
propagation
)
*
lshrdi3
:
logical
right
shift
*
ashldi3
:
left
shift
*/
.
globl
__ashrdi3
__ashrdi3
:
subfic
r6
,
r5
,
32
srw
r4
,
r4
,
r5
#
LSW
=
count
>
31
?
0
:
LSW
>>
count
addi
r7
,
r5
,
32
#
could
be
xori
,
or
addi
with
-
32
slw
r6
,
r3
,
r6
#
t1
=
count
>
31
?
0
:
MSW
<<
(
32
-
count
)
rlwinm
r8
,
r7
,
0
,
32
#
t3
=
(
count
<
32
)
?
32
:
0
sraw
r7
,
r3
,
r7
#
t2
=
MSW
>>
(
count
-
32
)
or
r4
,
r4
,
r6
#
LSW
|=
t1
slw
r7
,
r7
,
r8
#
t2
=
(
count
<
32
)
?
0
:
t2
sraw
r3
,
r3
,
r5
#
MSW
=
MSW
>>
count
or
r4
,
r4
,
r7
#
LSW
|=
t2
blr
.
globl
__ashldi3
__ashldi3
:
subfic
r6
,
r5
,
32
slw
r3
,
r3
,
r5
#
MSW
=
count
>
31
?
0
:
MSW
<<
count
addi
r7
,
r5
,
32
#
could
be
xori
,
or
addi
with
-
32
srw
r6
,
r4
,
r6
#
t1
=
count
>
31
?
0
:
LSW
>>
(
32
-
count
)
slw
r7
,
r4
,
r7
#
t2
=
count
<
32
?
0
:
LSW
<<
(
count
-
32
)
or
r3
,
r3
,
r6
#
MSW
|=
t1
slw
r4
,
r4
,
r5
#
LSW
=
LSW
<<
count
or
r3
,
r3
,
r7
#
MSW
|=
t2
blr
.
globl
__lshrdi3
__lshrdi3
:
subfic
r6
,
r5
,
32
srw
r4
,
r4
,
r5
#
LSW
=
count
>
31
?
0
:
LSW
>>
count
addi
r7
,
r5
,
32
#
could
be
xori
,
or
addi
with
-
32
slw
r6
,
r3
,
r6
#
t1
=
count
>
31
?
0
:
MSW
<<
(
32
-
count
)
srw
r7
,
r3
,
r7
#
t2
=
count
<
32
?
0
:
MSW
>>
(
count
-
32
)
or
r4
,
r4
,
r6
#
LSW
|=
t1
srw
r3
,
r3
,
r5
#
MSW
=
MSW
>>
count
or
r4
,
r4
,
r7
#
LSW
|=
t2
blr
arch/powerpc/boot/dts/currituck.dts
0 → 100644
View file @
1e7342e7
/*
*
Device
Tree
Source
for
IBM
Embedded
PPC
476
Platform
*
*
Copyright
©
2011
Tony
Breeds
IBM
Corporation
*
*
This
file
is
licensed
under
the
terms
of
the
GNU
General
Public
*
License
version
2.
This
program
is
licensed
"as is"
without
*
any
warranty
of
any
kind
,
whether
express
or
implied
.
*/
/
dts
-
v1
/;
/
memreserve
/
0x01f00000
0x00100000
;
//
spin
table
/
{
#
address
-
cells
=
<
2
>;
#
size
-
cells
=
<
2
>;
model
=
"ibm,currituck"
;
compatible
=
"ibm,currituck"
;
dcr
-
parent
=
<&{/
cpus
/
cpu
@
0
}>;
aliases
{
serial0
=
&
UART0
;
};
cpus
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
cpu
@
0
{
device_type
=
"cpu"
;
model
=
"PowerPC,476"
;
reg
=
<
0
>;
clock
-
frequency
=
<
1600000000
>;
//
1.6
GHz
timebase
-
frequency
=
<
100000000
>;
//
100
Mhz
i
-
cache
-
line
-
size
=
<
32
>;
d
-
cache
-
line
-
size
=
<
32
>;
i
-
cache
-
size
=
<
32768
>;
d
-
cache
-
size
=
<
32768
>;
dcr
-
controller
;
dcr
-
access
-
method
=
"native"
;
status
=
"ok"
;
};
cpu
@
1
{
device_type
=
"cpu"
;
model
=
"PowerPC,476"
;
reg
=
<
1
>;
clock
-
frequency
=
<
1600000000
>;
//
1.6
GHz
timebase
-
frequency
=
<
100000000
>;
//
100
Mhz
i
-
cache
-
line
-
size
=
<
32
>;
d
-
cache
-
line
-
size
=
<
32
>;
i
-
cache
-
size
=
<
32768
>;
d
-
cache
-
size
=
<
32768
>;
dcr
-
controller
;
dcr
-
access
-
method
=
"native"
;
status
=
"disabled"
;
enable
-
method
=
"spin-table"
;
cpu
-
release
-
addr
=
<
0x0
0x01f00000
>;
};
};
memory
{
device_type
=
"memory"
;
reg
=
<
0x0
0x0
0x0
0x0
>;
//
filled
in
by
zImage
};
MPIC
:
interrupt
-
controller
{
compatible
=
"chrp,open-pic"
;
interrupt
-
controller
;
dcr
-
reg
=
<
0xffc00000
0x00040000
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
};
plb
{
compatible
=
"ibm,plb6"
;
#
address
-
cells
=
<
2
>;
#
size
-
cells
=
<
2
>;
ranges
;
clock
-
frequency
=
<
200000000
>;
//
200
Mhz
POB0
:
opb
{
compatible
=
"ibm,opb-4xx"
,
"ibm,opb"
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
/*
Wish
there
was
a
nicer
way
of
specifying
a
full
*
32
-
bit
range
*/
ranges
=
<
0x00000000
0x00000200
0x00000000
0x80000000
0x80000000
0x00000200
0x80000000
0x80000000
>;
clock
-
frequency
=
<
100000000
>;
UART0
:
serial
@
10000000
{
device_type
=
"serial"
;
compatible
=
"ns16750"
,
"ns16550"
;
reg
=
<
0x10000000
0x00000008
>;
virtual
-
reg
=
<
0xe1000000
>;
clock
-
frequency
=
<
1851851
>;
//
PCIe
refclk
/
MCGC0_CTL
[
UART
]
current
-
speed
=
<
115200
>;
interrupt
-
parent
=
<&
MPIC
>;
interrupts
=
<
34
2
>;
};
IIC0
:
i2c
@
00000000
{
compatible
=
"ibm,iic-currituck"
,
"ibm,iic"
;
reg
=
<
0x0
0x00000014
>;
interrupt
-
parent
=
<&
MPIC
>;
interrupts
=
<
79
2
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
rtc
@
68
{
compatible
=
"stm,m41t80"
,
"m41st85"
;
reg
=
<
0x68
>;
};
};
};
PCIE0
:
pciex
@
10100000000
{
//
4
xGBIF1
device_type
=
"pci"
;
#
interrupt
-
cells
=
<
1
>;
#
size
-
cells
=
<
2
>;
#
address
-
cells
=
<
3
>;
compatible
=
"ibm,plb-pciex-476fpe"
,
"ibm,plb-pciex"
;
primary
;
port
=
<
0x0
>;
/*
port
number
*/
reg
=
<
0x00000101
0x00000000
0x0
0x10000000
/*
Config
space
access
*/
0x00000100
0x00000000
0x0
0x00001000
>;
/*
UTL
Registers
space
access
*/
dcr
-
reg
=
<
0x80
0x20
>;
//
pci_space
<
pci_addr
>
<
cpu_addr
>
<
size
>
ranges
=
<
0x02000000
0x00000000
0x80000000
0x00000110
0x80000000
0x0
0x80000000
0x01000000
0x0
0x0
0x00000140
0x0
0x0
0x00010000
>;
/*
Inbound
starting
at
0
to
memsize
filled
in
by
zImage
*/
dma
-
ranges
=
<
0x42000000
0x0
0x0
0x0
0x0
0x0
0x0
>;
/*
This
drives
busses
0
to
0xf
*/
bus
-
range
=
<
0x0
0xf
>;
/*
Legacy
interrupts
(
note
the
weird
polarity
,
the
bridge
seems
*
to
invert
PCIe
legacy
interrupts
).
*
We
are
de
-
swizzling
here
because
the
numbers
are
actually
for
*
port
of
the
root
complex
virtual
P2P
bridge
.
But
I
want
*
to
avoid
putting
a
node
for
it
in
the
tree
,
so
the
numbers
*
below
are
basically
de
-
swizzled
numbers
.
*
The
real
slot
is
on
idsel
0
,
so
the
swizzling
is
1
:
1
*/
interrupt
-
map
-
mask
=
<
0x0
0x0
0x0
0x7
>;
interrupt
-
map
=
<
0x0
0x0
0x0
0x1
&
MPIC
46
0x2
/*
int
A
*/
0x0
0x0
0x0
0x2
&
MPIC
47
0x2
/*
int
B
*/
0x0
0x0
0x0
0x3
&
MPIC
48
0x2
/*
int
C
*/
0x0
0x0
0x0
0x4
&
MPIC
49
0x2
/*
int
D
*/>;
};
PCIE1
:
pciex
@
30100000000
{
//
4
xGBIF0
device_type
=
"pci"
;
#
interrupt
-
cells
=
<
1
>;
#
size
-
cells
=
<
2
>;
#
address
-
cells
=
<
3
>;
compatible
=
"ibm,plb-pciex-476fpe"
,
"ibm,plb-pciex"
;
primary
;
port
=
<
0x1
>;
/*
port
number
*/
reg
=
<
0x00000301
0x00000000
0x0
0x10000000
/*
Config
space
access
*/
0x00000300
0x00000000
0x0
0x00001000
>;
/*
UTL
Registers
space
access
*/
dcr
-
reg
=
<
0x60
0x20
>;
ranges
=
<
0x02000000
0x00000000
0x80000000
0x00000310
0x80000000
0x0
0x80000000
0x01000000
0x0
0x0
0x00000340
0x0
0x0
0x00010000
>;
/*
Inbound
starting
at
0
to
memsize
filled
in
by
zImage
*/
dma
-
ranges
=
<
0x42000000
0x0
0x0
0x0
0x0
0x0
0x0
>;
/*
This
drives
busses
0
to
0xf
*/
bus
-
range
=
<
0x0
0xf
>;
/*
Legacy
interrupts
(
note
the
weird
polarity
,
the
bridge
seems
*
to
invert
PCIe
legacy
interrupts
).
*
We
are
de
-
swizzling
here
because
the
numbers
are
actually
for
*
port
of
the
root
complex
virtual
P2P
bridge
.
But
I
want
*
to
avoid
putting
a
node
for
it
in
the
tree
,
so
the
numbers
*
below
are
basically
de
-
swizzled
numbers
.
*
The
real
slot
is
on
idsel
0
,
so
the
swizzling
is
1
:
1
*/
interrupt
-
map
-
mask
=
<
0x0
0x0
0x0
0x7
>;
interrupt
-
map
=
<
0x0
0x0
0x0
0x1
&
MPIC
38
0x2
/*
int
A
*/
0x0
0x0
0x0
0x2
&
MPIC
39
0x2
/*
int
B
*/
0x0
0x0
0x0
0x3
&
MPIC
40
0x2
/*
int
C
*/
0x0
0x0
0x0
0x4
&
MPIC
41
0x2
/*
int
D
*/>;
};
PCIE2
:
pciex
@
38100000000
{
//
2
xGBIF0
device_type
=
"pci"
;
#
interrupt
-
cells
=
<
1
>;
#
size
-
cells
=
<
2
>;
#
address
-
cells
=
<
3
>;
compatible
=
"ibm,plb-pciex-476fpe"
,
"ibm,plb-pciex"
;
primary
;
port
=
<
0x2
>;
/*
port
number
*/
reg
=
<
0x00000381
0x00000000
0x0
0x10000000
/*
Config
space
access
*/
0x00000380
0x00000000
0x0
0x00001000
>;
/*
UTL
Registers
space
access
*/
dcr
-
reg
=
<
0xA0
0x20
>;
ranges
=
<
0x02000000
0x00000000
0x80000000
0x00000390
0x80000000
0x0
0x80000000
0x01000000
0x0
0x0
0x000003C0
0x0
0x0
0x00010000
>;
/*
Inbound
starting
at
0
to
memsize
filled
in
by
zImage
*/
dma
-
ranges
=
<
0x42000000
0x0
0x0
0x0
0x0
0x0
0x0
>;
/*
This
drives
busses
0
to
0xf
*/
bus
-
range
=
<
0x0
0xf
>;
/*
Legacy
interrupts
(
note
the
weird
polarity
,
the
bridge
seems
*
to
invert
PCIe
legacy
interrupts
).
*
We
are
de
-
swizzling
here
because
the
numbers
are
actually
for
*
port
of
the
root
complex
virtual
P2P
bridge
.
But
I
want
*
to
avoid
putting
a
node
for
it
in
the
tree
,
so
the
numbers
*
below
are
basically
de
-
swizzled
numbers
.
*
The
real
slot
is
on
idsel
0
,
so
the
swizzling
is
1
:
1
*/
interrupt
-
map
-
mask
=
<
0x0
0x0
0x0
0x7
>;
interrupt
-
map
=
<
0x0
0x0
0x0
0x1
&
MPIC
54
0x2
/*
int
A
*/
0x0
0x0
0x0
0x2
&
MPIC
55
0x2
/*
int
B
*/
0x0
0x0
0x0
0x3
&
MPIC
56
0x2
/*
int
C
*/
0x0
0x0
0x0
0x4
&
MPIC
57
0x2
/*
int
D
*/>;
};
};
chosen
{
linux
,
stdout
-
path
=
&
UART0
;
};
};
arch/powerpc/boot/dts/klondike.dts
0 → 100644
View file @
1e7342e7
/*
*
Device
Tree
for
Klondike
(
APM8018X
)
board
.
*
*
Copyright
(
c
)
2010
,
Applied
Micro
Circuits
Corporation
*
Author
:
Tanmay
Inamdar
<
tinamdar
@
apm
.
com
>
*
*
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
.
*
*
This
program
is
distributed
in
the
hope
that
it
will
be
useful
,
*
but
WITHOUT
ANY
WARRANTY
;
without
even
the
implied
warranty
of
*
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
*
GNU
General
Public
License
for
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
General
Public
License
*
along
with
this
program
;
if
not
,
write
to
the
Free
Software
*
Foundation
,
Inc
.,
59
Temple
Place
,
Suite
330
,
Boston
,
*
MA
02111
-
1307
USA
*
*/
/
dts
-
v1
/;
/
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
model
=
"apm,klondike"
;
compatible
=
"apm,klondike"
;
dcr
-
parent
=
<&{/
cpus
/
cpu
@
0
}>;
aliases
{
ethernet0
=
&
EMAC0
;
ethernet1
=
&
EMAC1
;
};
cpus
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
cpu
@
0
{
device_type
=
"cpu"
;
model
=
"PowerPC,apm8018x"
;
reg
=
<
0x00000000
>;
clock
-
frequency
=
<
300000000
>;
/*
Filled
in
by
U
-
Boot
*/
timebase
-
frequency
=
<
300000000
>;
/*
Filled
in
by
U
-
Boot
*/
i
-
cache
-
line
-
size
=
<
32
>;
d
-
cache
-
line
-
size
=
<
32
>;
i
-
cache
-
size
=
<
16384
>;
/*
16
kB
*/
d
-
cache
-
size
=
<
16384
>;
/*
16
kB
*/
dcr
-
controller
;
dcr
-
access
-
method
=
"native"
;
};
};
memory
{
device_type
=
"memory"
;
reg
=
<
0x00000000
0x20000000
>;
/*
Filled
in
by
U
-
Boot
*/
};
UIC0
:
interrupt
-
controller
{
compatible
=
"ibm,uic"
;
interrupt
-
controller
;
cell
-
index
=
<
0
>;
dcr
-
reg
=
<
0x0c0
0x010
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
};
UIC1
:
interrupt
-
controller1
{
compatible
=
"ibm,uic"
;
interrupt
-
controller
;
cell
-
index
=
<
1
>;
dcr
-
reg
=
<
0x0d0
0x010
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
interrupts
=
<
0x1e
0x4
0x1f
0x4
>;
/*
cascade
*/
interrupt
-
parent
=
<&
UIC0
>;
};
UIC2
:
interrupt
-
controller2
{
compatible
=
"ibm,uic"
;
interrupt
-
controller
;
cell
-
index
=
<
2
>;
dcr
-
reg
=
<
0x0e0
0x010
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
interrupts
=
<
0x0a
0x4
0x0b
0x4
>;
/*
cascade
*/
interrupt
-
parent
=
<&
UIC0
>;
};
UIC3
:
interrupt
-
controller3
{
compatible
=
"ibm,uic"
;
interrupt
-
controller
;
cell
-
index
=
<
3
>;
dcr
-
reg
=
<
0x0f0
0x010
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
interrupts
=
<
0x10
0x4
0x11
0x4
>;
/*
cascade
*/
interrupt
-
parent
=
<&
UIC0
>;
};
plb
{
compatible
=
"ibm,plb4"
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
ranges
;
clock
-
frequency
=
<
0
>;
/*
Filled
in
by
U
-
Boot
*/
SDRAM0
:
memory
-
controller
{
compatible
=
"ibm,sdram-apm8018x"
;
dcr
-
reg
=
<
0x010
0x002
>;
};
MAL0
:
mcmal
{
compatible
=
"ibm,mcmal2"
;
dcr
-
reg
=
<
0x180
0x062
>;
num
-
tx
-
chans
=
<
2
>;
num
-
rx
-
chans
=
<
16
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
interrupt
-
parent
=
<&
UIC1
>;
interrupts
=
</*
TXEOB
*/
0x6
0x4
/*
RXEOB
*/
0x7
0x4
/*
SERR
*/
0x1
0x4
/*
TXDE
*/
0x2
0x4
/*
RXDE
*/
0x3
0x4
>;
};
POB0
:
opb
{
compatible
=
"ibm,opb"
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
ranges
=
<
0x20000000
0x20000000
0x30000000
0x50000000
0x50000000
0x10000000
0x60000000
0x60000000
0x10000000
0xFE000000
0xFE000000
0x00010000
>;
dcr
-
reg
=
<
0x100
0x020
>;
clock
-
frequency
=
<
300000000
>;
/*
Filled
in
by
U
-
Boot
*/
RGMII0
:
emac
-
rgmii
@
400
a2000
{
compatible
=
"ibm,rgmii"
;
reg
=
<
0x400a2000
0x00000010
>;
has
-
mdio
;
};
TAH0
:
emac
-
tah
@
400
a3000
{
compatible
=
"ibm,tah"
;
reg
=
<
0x400a3000
0x100
>;
};
TAH1
:
emac
-
tah
@
400
a4000
{
compatible
=
"ibm,tah"
;
reg
=
<
0x400a4000
0x100
>;
};
EMAC0
:
ethernet
@
400
a0000
{
compatible
=
"ibm,emac4"
,
"ibm-emac4sync"
;
interrupt
-
parent
=
<&
EMAC0
>;
interrupts
=
<
0x0
>;
#
interrupt
-
cells
=
<
1
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
interrupt
-
map
=
</*
Status
*/
0x0
&
UIC0
0x13
0x4
>;
reg
=
<
0x400a0000
0x00000100
>;
local
-
mac
-
address
=
[
000000000000
];
/*
Filled
in
by
U
-
Boot
*/
mal
-
device
=
<&
MAL0
>;
mal
-
tx
-
channel
=
<
0x0
>;
mal
-
rx
-
channel
=
<
0x0
>;
cell
-
index
=
<
0
>;
max
-
frame
-
size
=
<
9000
>;
rx
-
fifo
-
size
=
<
4096
>;
tx
-
fifo
-
size
=
<
2048
>;
phy
-
mode
=
"rgmii"
;
phy
-
address
=
<
0x2
>;
turbo
=
"no"
;
phy
-
map
=
<
0x00000000
>;
rgmii
-
device
=
<&
RGMII0
>;
rgmii
-
channel
=
<
0
>;
tah
-
device
=
<&
TAH0
>;
tah
-
channel
=
<
0
>;
has
-
inverted
-
stacr
-
oc
;
has
-
new
-
stacr
-
staopc
;
};
EMAC1
:
ethernet
@
400
a1000
{
compatible
=
"ibm,emac4"
,
"ibm-emac4sync"
;
status
=
"disabled"
;
interrupt
-
parent
=
<&
EMAC1
>;
interrupts
=
<
0x0
>;
#
interrupt
-
cells
=
<
1
>;
#
address
-
cells
=
<
0
>;
#
size
-
cells
=
<
0
>;
interrupt
-
map
=
</*
Status
*/
0x0
&
UIC0
0x14
0x4
>;
reg
=
<
0x400a1000
0x00000100
>;
local
-
mac
-
address
=
[
000000000000
];
/*
Filled
in
by
U
-
Boot
*/
mal
-
device
=
<&
MAL0
>;
mal
-
tx
-
channel
=
<
1
>;
mal
-
rx
-
channel
=
<
8
>;
cell
-
index
=
<
1
>;
max
-
frame
-
size
=
<
9000
>;
rx
-
fifo
-
size
=
<
4096
>;
tx
-
fifo
-
size
=
<
2048
>;
phy
-
mode
=
"rgmii"
;
phy
-
address
=
<
0x3
>;
turbo
=
"no"
;
phy
-
map
=
<
0x00000000
>;
rgmii
-
device
=
<&
RGMII0
>;
rgmii
-
channel
=
<
1
>;
tah
-
device
=
<&
TAH1
>;
tah
-
channel
=
<
0
>;
has
-
inverted
-
stacr
-
oc
;
has
-
new
-
stacr
-
staopc
;
mdio
-
device
=
<&
EMAC0
>;
};
};
};
chosen
{
linux
,
stdout
-
path
=
"/plb/opb/serial@50001000"
;
};
};
arch/powerpc/boot/treeboot-currituck.c
0 → 100644
View file @
1e7342e7
/*
* Copyright © 2011 Tony Breeds IBM Corporation
*
* Based on earlier code:
* Copyright (C) Paul Mackerras 1997.
*
* Matt Porter <mporter@kernel.crashing.org>
* Copyright 2002-2005 MontaVista Software Inc.
*
* Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
* Copyright (c) 2003, 2004 Zultys Technologies
*
* Copyright 2007 David Gibson, IBM Corporation.
* Copyright 2010 Ben. Herrenschmidt, IBM Corporation.
* Copyright © 2011 David Kleikamp IBM Corporation
*
* 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 "types.h"
#include "elf.h"
#include "string.h"
#include "stdio.h"
#include "page.h"
#include "ops.h"
#include "reg.h"
#include "io.h"
#include "dcr.h"
#include "4xx.h"
#include "44x.h"
#include "libfdt.h"
BSS_STACK
(
4096
);
#define MAX_RANKS 0x4
#define DDR3_MR0CF 0x80010011U
static
unsigned
long
long
ibm_currituck_memsize
;
static
unsigned
long
long
ibm_currituck_detect_memsize
(
void
)
{
u32
reg
;
unsigned
i
;
unsigned
long
long
memsize
=
0
;
for
(
i
=
0
;
i
<
MAX_RANKS
;
i
++
){
reg
=
mfdcrx
(
DDR3_MR0CF
+
i
);
if
(
!
(
reg
&
1
))
continue
;
reg
&=
0x0000f000
;
reg
>>=
12
;
memsize
+=
(
0x800000ULL
<<
reg
);
}
return
memsize
;
}
static
void
ibm_currituck_fixups
(
void
)
{
void
*
devp
=
finddevice
(
"/"
);
u32
dma_ranges
[
7
];
dt_fixup_memory
(
0x0ULL
,
ibm_currituck_memsize
);
while
((
devp
=
find_node_by_devtype
(
devp
,
"pci"
)))
{
if
(
getprop
(
devp
,
"dma-ranges"
,
dma_ranges
,
sizeof
(
dma_ranges
))
<
0
)
{
printf
(
"%s: Failed to get dma-ranges
\r\n
"
,
__func__
);
continue
;
}
dma_ranges
[
5
]
=
ibm_currituck_memsize
>>
32
;
dma_ranges
[
6
]
=
ibm_currituck_memsize
&
0xffffffffUL
;
setprop
(
devp
,
"dma-ranges"
,
dma_ranges
,
sizeof
(
dma_ranges
));
}
}
#define SPRN_PIR 0x11E
/* Processor Indentification Register */
void
platform_init
(
void
)
{
unsigned
long
end_of_ram
,
avail_ram
;
u32
pir_reg
;
int
node
,
size
;
const
u32
*
timebase
;
ibm_currituck_memsize
=
ibm_currituck_detect_memsize
();
if
(
ibm_currituck_memsize
>>
32
)
end_of_ram
=
~
0UL
;
else
end_of_ram
=
ibm_currituck_memsize
;
avail_ram
=
end_of_ram
-
(
unsigned
long
)
_end
;
simple_alloc_init
(
_end
,
avail_ram
,
128
,
64
);
platform_ops
.
fixups
=
ibm_currituck_fixups
;
platform_ops
.
exit
=
ibm44x_dbcr_reset
;
pir_reg
=
mfspr
(
SPRN_PIR
);
/* Make sure FDT blob is sane */
if
(
fdt_check_header
(
_dtb_start
)
!=
0
)
fatal
(
"Invalid device tree blob
\n
"
);
node
=
fdt_node_offset_by_prop_value
(
_dtb_start
,
-
1
,
"device_type"
,
"cpu"
,
sizeof
(
"cpu"
));
if
(
!
node
)
fatal
(
"Cannot find cpu node
\n
"
);
timebase
=
fdt_getprop
(
_dtb_start
,
node
,
"timebase-frequency"
,
&
size
);
if
(
timebase
&&
(
size
==
4
))
timebase_period_ns
=
1000000000
/
*
timebase
;
fdt_set_boot_cpuid_phys
(
_dtb_start
,
pir_reg
);
fdt_init
(
_dtb_start
);
serial_console_init
();
}
arch/powerpc/boot/wrapper
View file @
1e7342e7
...
...
@@ -244,6 +244,9 @@ gamecube|wii)
link_address
=
'0x600000'
platformo
=
"
$object
/
$platform
-head.o
$object
/
$platform
.o"
;;
treeboot-currituck
)
link_address
=
'0x1000000'
;;
treeboot-iss4xx-mpic
)
platformo
=
"
$object
/treeboot-iss4xx.o"
;;
...
...
arch/powerpc/configs/40x/klondike_defconfig
0 → 100644
View file @
1e7342e7
CONFIG_40x=y
CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_EMBEDDED=y
CONFIG_SLAB=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_WALNUT is not set
CONFIG_APM8018X=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_MATH_EMULATION=y
# CONFIG_MIGRATION is not set
# CONFIG_SUSPEND is not set
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_PROC_DEVICETREE=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=35000
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
CONFIG_SCSI_SAS_ATTRS=y
# CONFIG_INPUT is not set
# CONFIG_SERIO is not set
# CONFIG_VT is not set
# CONFIG_UNIX98_PTYS is not set
# CONFIG_LEGACY_PTYS is not set
# CONFIG_DEVKMEM is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_HWMON is not set
# CONFIG_USB_SUPPORT is not set
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
CONFIG_EXT4_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y
CONFIG_CRAMFS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_UTF8=y
CONFIG_AVERAGE=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_SCHED_DEBUG is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
# CONFIG_FTRACE is not set
arch/powerpc/configs/44x/currituck_defconfig
0 → 100644
View file @
1e7342e7
CONFIG_44x=y
CONFIG_SMP=y
CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_SPARSE_IRQ=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_EXPERT=y
CONFIG_KALLSYMS_ALL=y
CONFIG_PROFILING=y
CONFIG_OPROFILE=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_PPC_47x=y
# CONFIG_EBONY is not set
CONFIG_CURRITUCK=y
CONFIG_HIGHMEM=y
CONFIG_HZ_100=y
CONFIG_MATH_EMULATION=y
CONFIG_IRQ_ALL_CPUS=y
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE=""
# CONFIG_SUSPEND is not set
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not set
# CONFIG_INET_LRO is not set
# CONFIG_IPV6 is not set
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_CONNECTOR=y
CONFIG_MTD=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_JEDECPROBE=y
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_PHYSMAP_OF=y
CONFIG_PROC_DEVICETREE=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=35000
# CONFIG_SCSI_PROC_FS is not set
CONFIG_BLK_DEV_SD=y
# CONFIG_SCSI_LOWLEVEL is not set
CONFIG_ATA=y
# CONFIG_SATA_PMP is not set
CONFIG_SATA_SIL24=y
# CONFIG_ATA_SFF is not set
CONFIG_NETDEVICES=y
CONFIG_E1000E=y
# CONFIG_NETDEV_10000 is not set
# CONFIG_INPUT is not set
# CONFIG_SERIO is not set
# CONFIG_VT is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HW_RANDOM is not set
CONFIG_I2C=y
CONFIG_I2C_IBM_IIC=y
# CONFIG_HWMON is not set
CONFIG_THERMAL=y
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_M41T80=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y
CONFIG_CRAMFS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_NLS_DEFAULT="n"
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEBUG_INFO=y
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y
CONFIG_PPC_EARLY_DEBUG=y
CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0x10000000
CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x200
CONFIG_CRYPTO=y
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_PCBC=y
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_ANSI_CPRNG is not set
# CONFIG_CRYPTO_HW is not set
arch/powerpc/include/asm/reg.h
View file @
1e7342e7
...
...
@@ -951,6 +951,7 @@
#define PVR_403GCX 0x00201400
#define PVR_405GP 0x40110000
#define PVR_476 0x11a52000
#define PVR_476FPE 0x7ff50000
#define PVR_STB03XXX 0x40310000
#define PVR_NP405H 0x41410000
#define PVR_NP405L 0x41610000
...
...
arch/powerpc/kernel/cputable.c
View file @
1e7342e7
...
...
@@ -1505,6 +1505,19 @@ static struct cpu_spec __initdata cpu_specs[] = {
.
machine_check
=
machine_check_4xx
,
.
platform
=
"ppc405"
,
},
{
/* APM8018X */
.
pvr_mask
=
0xffff0000
,
.
pvr_value
=
0x7ff11432
,
.
cpu_name
=
"APM8018X"
,
.
cpu_features
=
CPU_FTRS_40X
,
.
cpu_user_features
=
PPC_FEATURE_32
|
PPC_FEATURE_HAS_MMU
|
PPC_FEATURE_HAS_4xxMAC
,
.
mmu_features
=
MMU_FTR_TYPE_40x
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
32
,
.
machine_check
=
machine_check_4xx
,
.
platform
=
"ppc405"
,
},
{
/* default match */
.
pvr_mask
=
0x00000000
,
.
pvr_value
=
0x00000000
,
...
...
@@ -1830,6 +1843,20 @@ static struct cpu_spec __initdata cpu_specs[] = {
.
machine_check
=
machine_check_47x
,
.
platform
=
"ppc470"
,
},
{
/* 476fpe */
.
pvr_mask
=
0xffff0000
,
.
pvr_value
=
0x7ff50000
,
.
cpu_name
=
"476fpe"
,
.
cpu_features
=
CPU_FTRS_47X
|
CPU_FTR_476_DD2
,
.
cpu_user_features
=
COMMON_USER_BOOKE
|
PPC_FEATURE_HAS_FPU
,
.
mmu_features
=
MMU_FTR_TYPE_47x
|
MMU_FTR_USE_TLBIVAX_BCAST
|
MMU_FTR_LOCK_BCAST_INVAL
,
.
icache_bsize
=
32
,
.
dcache_bsize
=
128
,
.
machine_check
=
machine_check_47x
,
.
platform
=
"ppc470"
,
},
{
/* 476 iss */
.
pvr_mask
=
0xffff0000
,
.
pvr_value
=
0x00050000
,
...
...
arch/powerpc/kernel/head_44x.S
View file @
1e7342e7
...
...
@@ -732,6 +732,8 @@ _GLOBAL(init_cpu_state)
/
*
We
use
the
PVR
to
differenciate
44
x
cores
from
476
*/
mfspr
r3
,
SPRN_PVR
srwi
r3
,
r3
,
16
cmplwi
cr0
,
r3
,
PVR_476FPE
@
h
beq
head_start_47x
cmplwi
cr0
,
r3
,
PVR_476
@
h
beq
head_start_47x
cmplwi
cr0
,
r3
,
PVR_476_ISS
@
h
...
...
arch/powerpc/mm/44x_mmu.c
View file @
1e7342e7
...
...
@@ -78,11 +78,7 @@ static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys)
"tlbwe %1,%3,%5
\n
"
"tlbwe %0,%3,%6
\n
"
:
#ifdef CONFIG_PPC47x
:
"r"
(
PPC47x_TLB2_S_RWX
),
#else
:
"r"
(
PPC44x_TLB_SW
|
PPC44x_TLB_SR
|
PPC44x_TLB_SX
|
PPC44x_TLB_G
),
#endif
"r"
(
phys
),
"r"
(
virt
|
PPC44x_TLB_VALID
|
PPC44x_TLB_256M
),
"r"
(
entry
),
...
...
arch/powerpc/platforms/40x/Kconfig
View file @
1e7342e7
...
...
@@ -196,3 +196,14 @@ config IBM405_ERR51
# bool
# depends on !STB03xxx && PPC4xx_DMA
# default y
#
config APM8018X
bool "APM8018X"
depends on 40x
default n
select PPC40x_SIMPLE
help
This option enables support for the AppliedMicro APM8018X evaluation
board.
arch/powerpc/platforms/40x/ppc40x_simple.c
View file @
1e7342e7
...
...
@@ -55,6 +55,7 @@ static const char *board[] __initdata = {
"amcc,haleakala"
,
"amcc,kilauea"
,
"amcc,makalu"
,
"apm,klondike"
,
"est,hotfoot"
,
"plathome,obs600"
};
...
...
arch/powerpc/platforms/44x/Kconfig
View file @
1e7342e7
...
...
@@ -186,6 +186,16 @@ config ISS4xx
help
This option enables support for the IBM ISS simulation environment
config CURRITUCK
bool "IBM Currituck (476fpe) Support"
depends on PPC_47x
default n
select SWIOTLB
select 476FPE
select PPC4xx_PCI_EXPRESS
help
This option enables support for the IBM Currituck (476fpe) evaluation board
config ICON
bool "Icon"
depends on 44x
...
...
@@ -308,6 +318,10 @@ config 460SX
select IBM_EMAC_ZMII
select IBM_EMAC_TAH
config 476FPE
bool
select PPC_FPU
config APM821xx
bool
select PPC_FPU
...
...
arch/powerpc/platforms/44x/Makefile
View file @
1e7342e7
...
...
@@ -10,3 +10,4 @@ obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o
obj-$(CONFIG_XILINX_ML510)
+=
virtex_ml510.o
obj-$(CONFIG_ISS4xx)
+=
iss4xx.o
obj-$(CONFIG_CANYONLANDS)
+=
canyonlands.o
obj-$(CONFIG_CURRITUCK)
+=
currituck.o
arch/powerpc/platforms/44x/currituck.c
0 → 100644
View file @
1e7342e7
/*
* Currituck board specific routines
*
* Copyright © 2011 Tony Breeds IBM Corporation
*
* Based on earlier code:
* Matt Porter <mporter@kernel.crashing.org>
* Copyright 2002-2005 MontaVista Software Inc.
*
* Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
* Copyright (c) 2003-2005 Zultys Technologies
*
* Rewritten and ported to the merged powerpc tree:
* Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
* Copyright © 2011 David Kliekamp IBM Corporation
*
* 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/init.h>
#include <linux/memblock.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/rtc.h>
#include <asm/machdep.h>
#include <asm/prom.h>
#include <asm/udbg.h>
#include <asm/time.h>
#include <asm/uic.h>
#include <asm/ppc4xx.h>
#include <asm/mpic.h>
#include <asm/mmu.h>
#include <linux/pci.h>
static
__initdata
struct
of_device_id
ppc47x_of_bus
[]
=
{
{
.
compatible
=
"ibm,plb4"
,
},
{
.
compatible
=
"ibm,plb6"
,
},
{
.
compatible
=
"ibm,opb"
,
},
{
.
compatible
=
"ibm,ebc"
,
},
{},
};
/* The EEPROM is missing and the default values are bogus. This forces USB in
* to EHCI mode */
static
void
__devinit
quirk_ppc_currituck_usb_fixup
(
struct
pci_dev
*
dev
)
{
if
(
of_machine_is_compatible
(
"ibm,currituck"
))
{
pci_write_config_dword
(
dev
,
0xe0
,
0x0114231f
);
pci_write_config_dword
(
dev
,
0xe4
,
0x00006c40
);
}
}
DECLARE_PCI_FIXUP_HEADER
(
0x1033
,
0x0035
,
quirk_ppc_currituck_usb_fixup
);
static
int
__init
ppc47x_device_probe
(
void
)
{
of_platform_bus_probe
(
NULL
,
ppc47x_of_bus
,
NULL
);
return
0
;
}
machine_device_initcall
(
ppc47x
,
ppc47x_device_probe
);
/* We can have either UICs or MPICs */
static
void
__init
ppc47x_init_irq
(
void
)
{
struct
device_node
*
np
;
/* Find top level interrupt controller */
for_each_node_with_property
(
np
,
"interrupt-controller"
)
{
if
(
of_get_property
(
np
,
"interrupts"
,
NULL
)
==
NULL
)
break
;
}
if
(
np
==
NULL
)
panic
(
"Can't find top level interrupt controller"
);
/* Check type and do appropriate initialization */
if
(
of_device_is_compatible
(
np
,
"chrp,open-pic"
))
{
/* The MPIC driver will get everything it needs from the
* device-tree, just pass 0 to all arguments
*/
struct
mpic
*
mpic
=
mpic_alloc
(
np
,
0
,
MPIC_PRIMARY
,
0
,
0
,
" MPIC "
);
BUG_ON
(
mpic
==
NULL
);
mpic_init
(
mpic
);
ppc_md
.
get_irq
=
mpic_get_irq
;
}
else
panic
(
"Unrecognized top level interrupt controller"
);
}
#ifdef CONFIG_SMP
static
void
__cpuinit
smp_ppc47x_setup_cpu
(
int
cpu
)
{
mpic_setup_this_cpu
();
}
static
int
__cpuinit
smp_ppc47x_kick_cpu
(
int
cpu
)
{
struct
device_node
*
cpunode
=
of_get_cpu_node
(
cpu
,
NULL
);
const
u64
*
spin_table_addr_prop
;
u32
*
spin_table
;
extern
void
start_secondary_47x
(
void
);
BUG_ON
(
cpunode
==
NULL
);
/* Assume spin table. We could test for the enable-method in
* the device-tree but currently there's little point as it's
* our only supported method
*/
spin_table_addr_prop
=
of_get_property
(
cpunode
,
"cpu-release-addr"
,
NULL
);
if
(
spin_table_addr_prop
==
NULL
)
{
pr_err
(
"CPU%d: Can't start, missing cpu-release-addr !
\n
"
,
cpu
);
return
1
;
}
/* Assume it's mapped as part of the linear mapping. This is a bit
* fishy but will work fine for now
*
* XXX: Is there any reason to assume differently?
*/
spin_table
=
(
u32
*
)
__va
(
*
spin_table_addr_prop
);
pr_debug
(
"CPU%d: Spin table mapped at %p
\n
"
,
cpu
,
spin_table
);
spin_table
[
3
]
=
cpu
;
smp_wmb
();
spin_table
[
1
]
=
__pa
(
start_secondary_47x
);
mb
();
return
0
;
}
static
struct
smp_ops_t
ppc47x_smp_ops
=
{
.
probe
=
smp_mpic_probe
,
.
message_pass
=
smp_mpic_message_pass
,
.
setup_cpu
=
smp_ppc47x_setup_cpu
,
.
kick_cpu
=
smp_ppc47x_kick_cpu
,
.
give_timebase
=
smp_generic_give_timebase
,
.
take_timebase
=
smp_generic_take_timebase
,
};
static
void
__init
ppc47x_smp_init
(
void
)
{
if
(
mmu_has_feature
(
MMU_FTR_TYPE_47x
))
smp_ops
=
&
ppc47x_smp_ops
;
}
#else
/* CONFIG_SMP */
static
void
__init
ppc47x_smp_init
(
void
)
{
}
#endif
/* CONFIG_SMP */
static
void
__init
ppc47x_setup_arch
(
void
)
{
/* No need to check the DMA config as we /know/ our windows are all of
* RAM. Lets hope that doesn't change */
#ifdef CONFIG_SWIOTLB
if
(
memblock_end_of_DRAM
()
>
0xffffffff
)
{
ppc_swiotlb_enable
=
1
;
set_pci_dma_ops
(
&
swiotlb_dma_ops
);
ppc_md
.
pci_dma_dev_setup
=
pci_dma_dev_setup_swiotlb
;
}
#endif
ppc47x_smp_init
();
}
/*
* Called very early, MMU is off, device-tree isn't unflattened
*/
static
int
__init
ppc47x_probe
(
void
)
{
unsigned
long
root
=
of_get_flat_dt_root
();
if
(
!
of_flat_dt_is_compatible
(
root
,
"ibm,currituck"
))
return
0
;
return
1
;
}
/* Use USB controller should have been hardware swizzled but it wasn't :( */
static
void
ppc47x_pci_irq_fixup
(
struct
pci_dev
*
dev
)
{
if
(
dev
->
vendor
==
0x1033
&&
(
dev
->
device
==
0x0035
||
dev
->
device
==
0x00e0
))
{
dev
->
irq
=
irq_create_mapping
(
NULL
,
47
);
pr_info
(
"%s: Mapping irq 47 %d
\n
"
,
__func__
,
dev
->
irq
);
}
}
define_machine
(
ppc47x
)
{
.
name
=
"PowerPC 47x"
,
.
probe
=
ppc47x_probe
,
.
progress
=
udbg_progress
,
.
init_IRQ
=
ppc47x_init_irq
,
.
setup_arch
=
ppc47x_setup_arch
,
.
pci_irq_fixup
=
ppc47x_pci_irq_fixup
,
.
restart
=
ppc4xx_reset_system
,
.
calibrate_decr
=
generic_calibrate_decr
,
};
arch/powerpc/sysdev/ppc4xx_pci.c
View file @
1e7342e7
...
...
@@ -185,9 +185,15 @@ static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose,
out:
dma_offset_set
=
1
;
pci_dram_offset
=
res
->
start
;
hose
->
dma_window_base_cur
=
res
->
start
;
hose
->
dma_window_size
=
resource_size
(
res
);
printk
(
KERN_INFO
"4xx PCI DMA offset set to 0x%08lx
\n
"
,
pci_dram_offset
);
printk
(
KERN_INFO
"4xx PCI DMA window base to 0x%016llx
\n
"
,
(
unsigned
long
long
)
hose
->
dma_window_base_cur
);
printk
(
KERN_INFO
"DMA window size 0x%016llx
\n
"
,
(
unsigned
long
long
)
hose
->
dma_window_size
);
return
0
;
}
...
...
@@ -647,6 +653,7 @@ static unsigned int ppc4xx_pciex_port_count;
struct
ppc4xx_pciex_hwops
{
bool
want_sdr
;
int
(
*
core_init
)(
struct
device_node
*
np
);
int
(
*
port_init_hw
)(
struct
ppc4xx_pciex_port
*
port
);
int
(
*
setup_utl
)(
struct
ppc4xx_pciex_port
*
port
);
...
...
@@ -916,6 +923,7 @@ static int ppc440speB_pciex_init_utl(struct ppc4xx_pciex_port *port)
static
struct
ppc4xx_pciex_hwops
ppc440speA_pcie_hwops
__initdata
=
{
.
want_sdr
=
true
,
.
core_init
=
ppc440spe_pciex_core_init
,
.
port_init_hw
=
ppc440speA_pciex_init_port_hw
,
.
setup_utl
=
ppc440speA_pciex_init_utl
,
...
...
@@ -924,6 +932,7 @@ static struct ppc4xx_pciex_hwops ppc440speA_pcie_hwops __initdata =
static
struct
ppc4xx_pciex_hwops
ppc440speB_pcie_hwops
__initdata
=
{
.
want_sdr
=
true
,
.
core_init
=
ppc440spe_pciex_core_init
,
.
port_init_hw
=
ppc440speB_pciex_init_port_hw
,
.
setup_utl
=
ppc440speB_pciex_init_utl
,
...
...
@@ -1034,6 +1043,7 @@ static int ppc460ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
static
struct
ppc4xx_pciex_hwops
ppc460ex_pcie_hwops
__initdata
=
{
.
want_sdr
=
true
,
.
core_init
=
ppc460ex_pciex_core_init
,
.
port_init_hw
=
ppc460ex_pciex_init_port_hw
,
.
setup_utl
=
ppc460ex_pciex_init_utl
,
...
...
@@ -1181,6 +1191,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
}
static
struct
ppc4xx_pciex_hwops
ppc460sx_pcie_hwops
__initdata
=
{
.
want_sdr
=
true
,
.
core_init
=
ppc460sx_pciex_core_init
,
.
port_init_hw
=
ppc460sx_pciex_init_port_hw
,
.
setup_utl
=
ppc460sx_pciex_init_utl
,
...
...
@@ -1276,6 +1287,7 @@ static int ppc405ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
static
struct
ppc4xx_pciex_hwops
ppc405ex_pcie_hwops
__initdata
=
{
.
want_sdr
=
true
,
.
core_init
=
ppc405ex_pciex_core_init
,
.
port_init_hw
=
ppc405ex_pciex_init_port_hw
,
.
setup_utl
=
ppc405ex_pciex_init_utl
,
...
...
@@ -1284,6 +1296,52 @@ static struct ppc4xx_pciex_hwops ppc405ex_pcie_hwops __initdata =
#endif
/* CONFIG_40x */
#ifdef CONFIG_476FPE
static
int
__init
ppc_476fpe_pciex_core_init
(
struct
device_node
*
np
)
{
return
4
;
}
static
void
__init
ppc_476fpe_pciex_check_link
(
struct
ppc4xx_pciex_port
*
port
)
{
u32
timeout_ms
=
20
;
u32
val
=
0
,
mask
=
(
PECFG_TLDLP_LNKUP
|
PECFG_TLDLP_PRESENT
);
void
__iomem
*
mbase
=
ioremap
(
port
->
cfg_space
.
start
+
0x10000000
,
0x1000
);
printk
(
KERN_INFO
"PCIE%d: Checking link...
\n
"
,
port
->
index
);
if
(
mbase
==
NULL
)
{
printk
(
KERN_WARNING
"PCIE%d: failed to get cfg space
\n
"
,
port
->
index
);
return
;
}
while
(
timeout_ms
--
)
{
val
=
in_le32
(
mbase
+
PECFG_TLDLP
);
if
((
val
&
mask
)
==
mask
)
break
;
msleep
(
10
);
}
if
(
val
&
PECFG_TLDLP_PRESENT
)
{
printk
(
KERN_INFO
"PCIE%d: link is up !
\n
"
,
port
->
index
);
port
->
link
=
1
;
}
else
printk
(
KERN_WARNING
"PCIE%d: Link up failed
\n
"
,
port
->
index
);
iounmap
(
mbase
);
return
;
}
static
struct
ppc4xx_pciex_hwops
ppc_476fpe_pcie_hwops
__initdata
=
{
.
core_init
=
ppc_476fpe_pciex_core_init
,
.
check_link
=
ppc_476fpe_pciex_check_link
,
};
#endif
/* CONFIG_476FPE */
/* Check that the core has been initied and if not, do it */
static
int
__init
ppc4xx_pciex_check_core_init
(
struct
device_node
*
np
)
{
...
...
@@ -1308,6 +1366,10 @@ static int __init ppc4xx_pciex_check_core_init(struct device_node *np)
#ifdef CONFIG_40x
if
(
of_device_is_compatible
(
np
,
"ibm,plb-pciex-405ex"
))
ppc4xx_pciex_hwops
=
&
ppc405ex_pcie_hwops
;
#endif
#ifdef CONFIG_476FPE
if
(
of_device_is_compatible
(
np
,
"ibm,plb-pciex-476fpe"
))
ppc4xx_pciex_hwops
=
&
ppc_476fpe_pcie_hwops
;
#endif
if
(
ppc4xx_pciex_hwops
==
NULL
)
{
printk
(
KERN_WARNING
"PCIE: unknown host type %s
\n
"
,
...
...
@@ -1617,6 +1679,10 @@ static int __init ppc4xx_setup_one_pciex_POM(struct ppc4xx_pciex_port *port,
dcr_write
(
port
->
dcrs
,
DCRO_PEGPL_OMR1MSKL
,
sa
|
DCRO_PEGPL_460SX_OMR1MSKL_UOT
|
DCRO_PEGPL_OMRxMSKL_VAL
);
else
if
(
of_device_is_compatible
(
port
->
node
,
"ibm,plb-pciex-476fpe"
))
dcr_write
(
port
->
dcrs
,
DCRO_PEGPL_OMR1MSKL
,
sa
|
DCRO_PEGPL_476FPE_OMR1MSKL_UOT
|
DCRO_PEGPL_OMRxMSKL_VAL
);
else
dcr_write
(
port
->
dcrs
,
DCRO_PEGPL_OMR1MSKL
,
sa
|
DCRO_PEGPL_OMR1MSKL_UOT
...
...
@@ -1739,9 +1805,10 @@ static void __init ppc4xx_configure_pciex_PIMs(struct ppc4xx_pciex_port *port,
/* Calculate window size */
sa
=
(
0xffffffffffffffffull
<<
ilog2
(
size
));
if
(
res
->
flags
&
IORESOURCE_PREFETCH
)
sa
|=
0x8
;
sa
|=
PCI_BASE_ADDRESS_MEM_PREFETCH
;
if
(
of_device_is_compatible
(
port
->
node
,
"ibm,plb-pciex-460sx"
))
if
(
of_device_is_compatible
(
port
->
node
,
"ibm,plb-pciex-460sx"
)
||
of_device_is_compatible
(
port
->
node
,
"ibm,plb-pciex-476fpe"
))
sa
|=
PCI_BASE_ADDRESS_MEM_TYPE_64
;
out_le32
(
mbase
+
PECFG_BAR0HMPA
,
RES_TO_U32_HIGH
(
sa
));
...
...
@@ -1972,13 +2039,15 @@ static void __init ppc4xx_probe_pciex_bridge(struct device_node *np)
}
port
->
node
=
of_node_get
(
np
);
pval
=
of_get_property
(
np
,
"sdr-base"
,
NULL
);
if
(
pval
==
NULL
)
{
printk
(
KERN_ERR
"PCIE: missing sdr-base for %s
\n
"
,
np
->
full_name
);
return
;
if
(
ppc4xx_pciex_hwops
->
want_sdr
)
{
pval
=
of_get_property
(
np
,
"sdr-base"
,
NULL
);
if
(
pval
==
NULL
)
{
printk
(
KERN_ERR
"PCIE: missing sdr-base for %s
\n
"
,
np
->
full_name
);
return
;
}
port
->
sdr_base
=
*
pval
;
}
port
->
sdr_base
=
*
pval
;
/* Check if device_type property is set to "pci" or "pci-endpoint".
* Resulting from this setup this PCIe port will be configured
...
...
arch/powerpc/sysdev/ppc4xx_pci.h
View file @
1e7342e7
...
...
@@ -476,6 +476,13 @@
#define DCRO_PEGPL_OMR1MSKL_UOT 0x00000002
#define DCRO_PEGPL_OMR3MSKL_IO 0x00000002
/* 476FPE */
#define PCCFG_LCPA 0x270
#define PECFG_TLDLP 0x3F8
#define PECFG_TLDLP_LNKUP 0x00000008
#define PECFG_TLDLP_PRESENT 0x00000010
#define DCRO_PEGPL_476FPE_OMR1MSKL_UOT 0x00000004
/* SDR Bit Mappings */
#define PESDRx_RCSSET_HLDPLB 0x10000000
#define PESDRx_RCSSET_RSTGU 0x01000000
...
...
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