Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
3c3f42d6
Commit
3c3f42d6
authored
Oct 10, 2005
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
powerpc: Start merging 64-bit support into powermac files
Signed-off-by:
Paul Mackerras
<
paulus@samba.org
>
parent
e574d238
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
128 additions
and
143 deletions
+128
-143
arch/powerpc/platforms/powermac/pci.c
arch/powerpc/platforms/powermac/pci.c
+85
-109
arch/powerpc/platforms/powermac/pic.c
arch/powerpc/platforms/powermac/pic.c
+21
-11
arch/powerpc/platforms/powermac/pmac.h
arch/powerpc/platforms/powermac/pmac.h
+21
-4
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/powermac/setup.c
+1
-19
No files found.
arch/powerpc/platforms/powermac/pci.c
View file @
3c3f42d6
/*
/*
* Support for PCI bridges found on Power Macintoshes.
* Support for PCI bridges found on Power Macintoshes.
* At present the "bandit" and "chaos" bridges are supported.
* Fortunately you access configuration space in the same
* way with either bridge.
*
*
* Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org)
* Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org)
* Copyright (C) 1997 Paul Mackerras (paulus@samba.org)
* Copyright (C) 1997 Paul Mackerras (paulus@samba.org)
...
@@ -26,6 +23,10 @@
...
@@ -26,6 +23,10 @@
#include <asm/pci-bridge.h>
#include <asm/pci-bridge.h>
#include <asm/machdep.h>
#include <asm/machdep.h>
#include <asm/pmac_feature.h>
#include <asm/pmac_feature.h>
#ifdef CONFIG_PPC64
#include <asm/iommu.h>
#include <asm/ppc-pci.h>
#endif
#undef DEBUG
#undef DEBUG
...
@@ -160,9 +161,13 @@ static unsigned long macrisc_cfg_access(struct pci_controller* hose,
...
@@ -160,9 +161,13 @@ static unsigned long macrisc_cfg_access(struct pci_controller* hose,
static
int
macrisc_read_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
static
int
macrisc_read_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
offset
,
int
len
,
u32
*
val
)
int
offset
,
int
len
,
u32
*
val
)
{
{
struct
pci_controller
*
hose
=
bus
->
sysdata
;
struct
pci_controller
*
hose
;
unsigned
long
addr
;
unsigned
long
addr
;
hose
=
pci_bus_to_host
(
bus
);
if
(
hose
==
NULL
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
addr
=
macrisc_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
addr
=
macrisc_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
if
(
!
addr
)
if
(
!
addr
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_DEVICE_NOT_FOUND
;
...
@@ -187,9 +192,13 @@ static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn,
...
@@ -187,9 +192,13 @@ static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn,
static
int
macrisc_write_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
static
int
macrisc_write_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
offset
,
int
len
,
u32
val
)
int
offset
,
int
len
,
u32
val
)
{
{
struct
pci_controller
*
hose
=
bus
->
sysdata
;
struct
pci_controller
*
hose
;
unsigned
long
addr
;
unsigned
long
addr
;
hose
=
pci_bus_to_host
(
bus
);
if
(
hose
==
NULL
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
addr
=
macrisc_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
addr
=
macrisc_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
if
(
!
addr
)
if
(
!
addr
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_DEVICE_NOT_FOUND
;
...
@@ -221,7 +230,7 @@ static struct pci_ops macrisc_pci_ops =
...
@@ -221,7 +230,7 @@ static struct pci_ops macrisc_pci_ops =
};
};
/*
/*
* Verif
i
y that a specific (bus, dev_fn) exists on chaos
* Verify that a specific (bus, dev_fn) exists on chaos
*/
*/
static
int
static
int
chaos_validate_dev
(
struct
pci_bus
*
bus
,
int
devfn
,
int
offset
)
chaos_validate_dev
(
struct
pci_bus
*
bus
,
int
devfn
,
int
offset
)
...
@@ -274,7 +283,6 @@ static struct pci_ops chaos_pci_ops =
...
@@ -274,7 +283,6 @@ static struct pci_ops chaos_pci_ops =
};
};
#ifdef CONFIG_POWER4
#ifdef CONFIG_POWER4
/*
/*
* These versions of U3 HyperTransport config space access ops do not
* These versions of U3 HyperTransport config space access ops do not
* implement self-view of the HT host yet
* implement self-view of the HT host yet
...
@@ -342,11 +350,11 @@ static unsigned long u3_ht_cfg_access(struct pci_controller* hose,
...
@@ -342,11 +350,11 @@ static unsigned long u3_ht_cfg_access(struct pci_controller* hose,
static
int
u3_ht_read_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
static
int
u3_ht_read_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
offset
,
int
len
,
u32
*
val
)
int
offset
,
int
len
,
u32
*
val
)
{
{
struct
pci_controller
*
hose
=
bus
->
sysdata
;
struct
pci_controller
*
hose
;
unsigned
long
addr
;
unsigned
long
addr
;
struct
device_node
*
np
=
pci_busdev_to_OF_node
(
bus
,
devfn
);
hose
=
pci_bus_to_host
(
bus
);
if
(
np
==
NULL
)
if
(
hose
==
NULL
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_DEVICE_NOT_FOUND
;
addr
=
u3_ht_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
addr
=
u3_ht_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
...
@@ -357,19 +365,19 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
...
@@ -357,19 +365,19 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
case
0
:
case
0
:
break
;
break
;
case
1
:
case
1
:
switch
(
len
)
{
switch
(
len
)
{
case
1
:
case
1
:
*
val
=
0xff
;
break
;
*
val
=
0xff
;
break
;
case
2
:
case
2
:
*
val
=
0xffff
;
break
;
*
val
=
0xffff
;
break
;
default:
default:
*
val
=
0xfffffffful
;
break
;
*
val
=
0xfffffffful
;
break
;
}
}
return
PCIBIOS_SUCCESSFUL
;
return
PCIBIOS_SUCCESSFUL
;
default:
default:
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_DEVICE_NOT_FOUND
;
}
}
/*
/*
* Note: the caller has already checked that offset is
* Note: the caller has already checked that offset is
* suitably aligned and that len is 1, 2 or 4.
* suitably aligned and that len is 1, 2 or 4.
...
@@ -391,11 +399,11 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
...
@@ -391,11 +399,11 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
static
int
u3_ht_write_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
static
int
u3_ht_write_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
offset
,
int
len
,
u32
val
)
int
offset
,
int
len
,
u32
val
)
{
{
struct
pci_controller
*
hose
=
bus
->
sysdata
;
struct
pci_controller
*
hose
;
unsigned
long
addr
;
unsigned
long
addr
;
struct
device_node
*
np
=
pci_busdev_to_OF_node
(
bus
,
devfn
);
hose
=
pci_bus_to_host
(
bus
);
if
(
np
==
NULL
)
if
(
hose
==
NULL
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
return
PCIBIOS_DEVICE_NOT_FOUND
;
addr
=
u3_ht_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
addr
=
u3_ht_cfg_access
(
hose
,
bus
->
number
,
devfn
,
offset
);
...
@@ -437,15 +445,13 @@ static struct pci_ops u3_ht_pci_ops =
...
@@ -437,15 +445,13 @@ static struct pci_ops u3_ht_pci_ops =
u3_ht_read_config
,
u3_ht_read_config
,
u3_ht_write_config
u3_ht_write_config
};
};
#endif
/* CONFIG_POWER4 */
#endif
/* CONFIG_POWER4 */
/*
/*
* For a bandit bridge, turn on cache coherency if necessary.
* For a bandit bridge, turn on cache coherency if necessary.
* N.B. we could clean this up using the hose ops directly.
* N.B. we could clean this up using the hose ops directly.
*/
*/
static
void
__init
static
void
__init
init_bandit
(
struct
pci_controller
*
bp
)
init_bandit
(
struct
pci_controller
*
bp
)
{
{
unsigned
int
vendev
,
magic
;
unsigned
int
vendev
,
magic
;
int
rev
;
int
rev
;
...
@@ -485,8 +491,7 @@ init_bandit(struct pci_controller *bp)
...
@@ -485,8 +491,7 @@ init_bandit(struct pci_controller *bp)
/*
/*
* Tweak the PCI-PCI bridge chip on the blue & white G3s.
* Tweak the PCI-PCI bridge chip on the blue & white G3s.
*/
*/
static
void
__init
static
void
__init
init_p2pbridge
(
void
)
init_p2pbridge
(
void
)
{
{
struct
device_node
*
p2pbridge
;
struct
device_node
*
p2pbridge
;
struct
pci_controller
*
hose
;
struct
pci_controller
*
hose
;
...
@@ -526,8 +531,7 @@ init_p2pbridge(void)
...
@@ -526,8 +531,7 @@ init_p2pbridge(void)
* EHCI part of it so it behaves like a pair of OHCI's. This fixup
* EHCI part of it so it behaves like a pair of OHCI's. This fixup
* code re-enables it ;)
* code re-enables it ;)
*/
*/
static
void
__init
static
void
__init
fixup_nec_usb2
(
void
)
fixup_nec_usb2
(
void
)
{
{
struct
device_node
*
nec
;
struct
device_node
*
nec
;
...
@@ -567,77 +571,6 @@ fixup_nec_usb2(void)
...
@@ -567,77 +571,6 @@ fixup_nec_usb2(void)
}
}
}
}
void
__init
pmac_find_bridges
(
void
)
{
struct
device_node
*
np
,
*
root
;
struct
device_node
*
ht
=
NULL
;
root
=
of_find_node_by_path
(
"/"
);
if
(
root
==
NULL
)
{
printk
(
KERN_CRIT
"pmac_find_bridges: can't find root of device tree
\n
"
);
return
;
}
for
(
np
=
NULL
;
(
np
=
of_get_next_child
(
root
,
np
))
!=
NULL
;)
{
if
(
np
->
name
==
NULL
)
continue
;
if
(
strcmp
(
np
->
name
,
"bandit"
)
==
0
||
strcmp
(
np
->
name
,
"chaos"
)
==
0
||
strcmp
(
np
->
name
,
"pci"
)
==
0
)
{
if
(
add_bridge
(
np
)
==
0
)
of_node_get
(
np
);
}
if
(
strcmp
(
np
->
name
,
"ht"
)
==
0
)
{
of_node_get
(
np
);
ht
=
np
;
}
}
of_node_put
(
root
);
/* Probe HT last as it relies on the agp resources to be already
* setup
*/
if
(
ht
&&
add_bridge
(
ht
)
!=
0
)
of_node_put
(
ht
);
init_p2pbridge
();
fixup_nec_usb2
();
/* We are still having some issues with the Xserve G4, enabling
* some offset between bus number and domains for now when we
* assign all busses should help for now
*/
if
(
pci_assign_all_busses
)
pcibios_assign_bus_offset
=
0x10
;
#ifdef CONFIG_POWER4
/* There is something wrong with DMA on U3/HT. I haven't figured out
* the details yet, but if I set the cache line size to 128 bytes like
* it should, I'm getting memory corruption caused by devices like
* sungem (even without the MWI bit set, but maybe sungem doesn't
* care). Right now, it appears that setting up a 64 bytes line size
* works properly, 64 bytes beeing the max transfer size of HT, I
* suppose this is related the way HT/PCI are hooked together. I still
* need to dive into more specs though to be really sure of what's
* going on. --BenH.
*
* Ok, apparently, it's just that HT can't do more than 64 bytes
* transactions. MWI seem to be meaningless there as well, it may
* be worth nop'ing out pci_set_mwi too though I haven't done that
* yet.
*
* Note that it's a bit different for whatever is in the AGP slot.
* For now, I don't care, but this can become a real issue, we
* should probably hook pci_set_mwi anyway to make sure it sets
* the real cache line size in there.
*/
if
(
machine_is_compatible
(
"MacRISC4"
))
pci_cache_line_size
=
16
;
/* 64 bytes */
pmac_check_ht_link
();
#endif
/* CONFIG_POWER4 */
}
#define GRACKLE_CFA(b, d, o) (0x80 | ((b) << 8) | ((d) << 16) \
#define GRACKLE_CFA(b, d, o) (0x80 | ((b) << 8) | ((d) << 16) \
| (((o) & ~3) << 24))
| (((o) & ~3) << 24))
...
@@ -703,7 +636,6 @@ setup_chaos(struct pci_controller* hose, struct reg_property* addr)
...
@@ -703,7 +636,6 @@ setup_chaos(struct pci_controller* hose, struct reg_property* addr)
}
}
#ifdef CONFIG_POWER4
#ifdef CONFIG_POWER4
static
void
__init
setup_u3_agp
(
struct
pci_controller
*
hose
)
static
void
__init
setup_u3_agp
(
struct
pci_controller
*
hose
)
{
{
/* On G5, we move AGP up to high bus number so we don't need
/* On G5, we move AGP up to high bus number so we don't need
...
@@ -715,7 +647,7 @@ static void __init setup_u3_agp(struct pci_controller* hose)
...
@@ -715,7 +647,7 @@ static void __init setup_u3_agp(struct pci_controller* hose)
* the reg address cell, we shall fix that by killing struct
* the reg address cell, we shall fix that by killing struct
* reg_property and using some accessor functions instead
* reg_property and using some accessor functions instead
*/
*/
hose
->
first_busno
=
0xf0
;
hose
->
first_busno
=
0xf0
;
hose
->
last_busno
=
0xff
;
hose
->
last_busno
=
0xff
;
has_uninorth
=
1
;
has_uninorth
=
1
;
hose
->
ops
=
&
macrisc_pci_ops
;
hose
->
ops
=
&
macrisc_pci_ops
;
...
@@ -748,7 +680,7 @@ static void __init setup_u3_ht(struct pci_controller* hose)
...
@@ -748,7 +680,7 @@ static void __init setup_u3_ht(struct pci_controller* hose)
*/
*/
hose
->
io_base_phys
=
0xf4000000
;
hose
->
io_base_phys
=
0xf4000000
;
hose
->
io_base_virt
=
ioremap
(
hose
->
io_base_phys
,
0x00400000
);
hose
->
io_base_virt
=
ioremap
(
hose
->
io_base_phys
,
0x00400000
);
isa_io_base
=
(
unsigned
long
)
hose
->
io_base_virt
;
isa_io_base
=
pci_io_base
=
(
unsigned
long
)
hose
->
io_base_virt
;
hose
->
io_resource
.
name
=
np
->
full_name
;
hose
->
io_resource
.
name
=
np
->
full_name
;
hose
->
io_resource
.
start
=
0
;
hose
->
io_resource
.
start
=
0
;
hose
->
io_resource
.
end
=
0x003fffff
;
hose
->
io_resource
.
end
=
0x003fffff
;
...
@@ -794,13 +726,13 @@ static void __init setup_u3_ht(struct pci_controller* hose)
...
@@ -794,13 +726,13 @@ static void __init setup_u3_ht(struct pci_controller* hose)
}
}
/* No, it's not the case, we need a hole */
/* No, it's not the case, we need a hole */
if
(
cur
==
2
)
{
if
(
cur
==
2
)
{
/* not enough resources
to make
a hole, we drop part of the range */
/* not enough resources
for
a hole, we drop part of the range */
printk
(
KERN_WARNING
"Running out of resources for /ht host !
\n
"
);
printk
(
KERN_WARNING
"Running out of resources for /ht host !
\n
"
);
hose
->
mem_resources
[
cur
].
end
=
res
->
start
-
1
;
hose
->
mem_resources
[
cur
].
end
=
res
->
start
-
1
;
continue
;
continue
;
}
}
cur
++
;
cur
++
;
DBG
(
"U3/HT: hole, %d end at %08lx, %d start at %08lx
\n
"
,
DBG
(
"U3/HT: hole, %d end at %08lx, %d start at %08lx
\n
"
,
cur
-
1
,
res
->
start
-
1
,
cur
,
res
->
end
+
1
);
cur
-
1
,
res
->
start
-
1
,
cur
,
res
->
end
+
1
);
hose
->
mem_resources
[
cur
].
name
=
np
->
full_name
;
hose
->
mem_resources
[
cur
].
name
=
np
->
full_name
;
hose
->
mem_resources
[
cur
].
flags
=
IORESOURCE_MEM
;
hose
->
mem_resources
[
cur
].
flags
=
IORESOURCE_MEM
;
...
@@ -981,7 +913,7 @@ static int __init add_bridge(struct device_node *dev)
...
@@ -981,7 +913,7 @@ static int __init add_bridge(struct device_node *dev)
if
(
device_is_compatible
(
dev
,
"uni-north"
))
{
if
(
device_is_compatible
(
dev
,
"uni-north"
))
{
primary
=
setup_uninorth
(
hose
,
addr
);
primary
=
setup_uninorth
(
hose
,
addr
);
disp_name
=
"UniNorth"
;
disp_name
=
"UniNorth"
;
}
else
if
(
strcmp
(
dev
->
name
,
"pci"
)
==
0
)
{
}
else
if
(
strcmp
(
dev
->
name
,
"pci"
)
==
0
)
{
/* XXX assume this is a mpc106 (grackle) */
/* XXX assume this is a mpc106 (grackle) */
setup_grackle
(
hose
);
setup_grackle
(
hose
);
disp_name
=
"Grackle (MPC106)"
;
disp_name
=
"Grackle (MPC106)"
;
...
@@ -993,7 +925,7 @@ static int __init add_bridge(struct device_node *dev)
...
@@ -993,7 +925,7 @@ static int __init add_bridge(struct device_node *dev)
disp_name
=
"Chaos"
;
disp_name
=
"Chaos"
;
primary
=
0
;
primary
=
0
;
}
}
printk
(
KERN_INFO
"Found %s PCI host bridge at 0x%08x. Firmware bus number: %d->%d
\n
"
,
printk
(
KERN_INFO
"Found %s PCI host bridge at 0x%08
l
x. Firmware bus number: %d->%d
\n
"
,
disp_name
,
addr
->
address
,
hose
->
first_busno
,
hose
->
last_busno
);
disp_name
,
addr
->
address
,
hose
->
first_busno
,
hose
->
last_busno
);
DBG
(
" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p
\n
"
,
DBG
(
" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p
\n
"
,
hose
,
hose
->
cfg_addr
,
hose
->
cfg_data
);
hose
,
hose
->
cfg_addr
,
hose
->
cfg_data
);
...
@@ -1036,6 +968,50 @@ pmac_pcibios_fixup(void)
...
@@ -1036,6 +968,50 @@ pmac_pcibios_fixup(void)
pcibios_fixup_OF_interrupts
();
pcibios_fixup_OF_interrupts
();
}
}
void
__init
pmac_find_bridges
(
void
)
{
struct
device_node
*
np
,
*
root
;
struct
device_node
*
ht
=
NULL
;
root
=
of_find_node_by_path
(
"/"
);
if
(
root
==
NULL
)
{
printk
(
KERN_CRIT
"pmac_find_bridges: can't find root of device tree
\n
"
);
return
;
}
for
(
np
=
NULL
;
(
np
=
of_get_next_child
(
root
,
np
))
!=
NULL
;)
{
if
(
np
->
name
==
NULL
)
continue
;
if
(
strcmp
(
np
->
name
,
"bandit"
)
==
0
||
strcmp
(
np
->
name
,
"chaos"
)
==
0
||
strcmp
(
np
->
name
,
"pci"
)
==
0
)
{
if
(
add_bridge
(
np
)
==
0
)
of_node_get
(
np
);
}
if
(
strcmp
(
np
->
name
,
"ht"
)
==
0
)
{
of_node_get
(
np
);
ht
=
np
;
}
}
of_node_put
(
root
);
/* Probe HT last as it relies on the agp resources to be already
* setup
*/
if
(
ht
&&
add_bridge
(
ht
)
!=
0
)
of_node_put
(
ht
);
init_p2pbridge
();
fixup_nec_usb2
();
/* We are still having some issues with the Xserve G4, enabling
* some offset between bus number and domains for now when we
* assign all busses should help for now
*/
if
(
pci_assign_all_busses
)
pcibios_assign_bus_offset
=
0x10
;
}
int
int
pmac_pci_enable_device_hook
(
struct
pci_dev
*
dev
,
int
initial
)
pmac_pci_enable_device_hook
(
struct
pci_dev
*
dev
,
int
initial
)
{
{
...
...
arch/powerpc/platforms/powermac/pic.c
View file @
3c3f42d6
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
#include <linux/sysdev.h>
#include <linux/sysdev.h>
#include <linux/adb.h>
#include <linux/adb.h>
#include <linux/pmu.h>
#include <linux/pmu.h>
#include <linux/module.h>
#include <asm/sections.h>
#include <asm/sections.h>
#include <asm/io.h>
#include <asm/io.h>
...
@@ -32,12 +33,11 @@
...
@@ -32,12 +33,11 @@
#include <asm/prom.h>
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#include <asm/pci-bridge.h>
#include <asm/time.h>
#include <asm/time.h>
#include <asm/open_pic.h>
#include <asm/xmon.h>
#include <asm/xmon.h>
#include <asm/pmac_feature.h>
#include <asm/pmac_feature.h>
#include <asm/mpic.h>
#include <asm/mpic.h>
#include "pmac
_pic
.h"
#include "pmac.h"
/*
/*
* XXX this should be in xmon.h, but putting it there means xmon.h
* XXX this should be in xmon.h, but putting it there means xmon.h
...
@@ -46,6 +46,7 @@
...
@@ -46,6 +46,7 @@
*/
*/
extern
irqreturn_t
xmon_irq
(
int
,
void
*
,
struct
pt_regs
*
);
extern
irqreturn_t
xmon_irq
(
int
,
void
*
,
struct
pt_regs
*
);
#ifdef CONFIG_PPC32
struct
pmac_irq_hw
{
struct
pmac_irq_hw
{
unsigned
int
event
;
unsigned
int
event
;
unsigned
int
enable
;
unsigned
int
enable
;
...
@@ -71,6 +72,9 @@ static u32 level_mask[4];
...
@@ -71,6 +72,9 @@ static u32 level_mask[4];
static
DEFINE_SPINLOCK
(
pmac_pic_lock
);
static
DEFINE_SPINLOCK
(
pmac_pic_lock
);
/* XXX here for now, should move to arch/powerpc/kernel/irq.c */
int
ppc_do_canonicalize_irqs
;
EXPORT_SYMBOL
(
ppc_do_canonicalize_irqs
);
#define GATWICK_IRQ_POOL_SIZE 10
#define GATWICK_IRQ_POOL_SIZE 10
static
struct
interrupt_info
gatwick_int_pool
[
GATWICK_IRQ_POOL_SIZE
];
static
struct
interrupt_info
gatwick_int_pool
[
GATWICK_IRQ_POOL_SIZE
];
...
@@ -377,11 +381,6 @@ static int __init enable_second_ohare(void)
...
@@ -377,11 +381,6 @@ static int __init enable_second_ohare(void)
return
irqctrler
->
intrs
[
0
].
line
;
return
irqctrler
->
intrs
[
0
].
line
;
}
}
static
int
pmac_u3_cascade
(
struct
pt_regs
*
regs
,
void
*
data
)
{
return
mpic_get_one_irq
((
struct
mpic
*
)
data
,
regs
);
}
#ifdef CONFIG_XMON
#ifdef CONFIG_XMON
static
struct
irqaction
xmon_action
=
{
static
struct
irqaction
xmon_action
=
{
.
handler
=
xmon_irq
,
.
handler
=
xmon_irq
,
...
@@ -397,15 +396,23 @@ static struct irqaction gatwick_cascade_action = {
...
@@ -397,15 +396,23 @@ static struct irqaction gatwick_cascade_action = {
.
mask
=
CPU_MASK_NONE
,
.
mask
=
CPU_MASK_NONE
,
.
name
=
"cascade"
,
.
name
=
"cascade"
,
};
};
#endif
/* CONFIG_PPC32 */
static
int
pmac_u3_cascade
(
struct
pt_regs
*
regs
,
void
*
data
)
{
return
mpic_get_one_irq
((
struct
mpic
*
)
data
,
regs
);
}
void
__init
pmac_pic_init
(
void
)
void
__init
pmac_pic_init
(
void
)
{
{
int
i
;
struct
device_node
*
irqctrler
=
NULL
;
struct
device_node
*
irqctrler
=
NULL
;
struct
device_node
*
irqctrler2
=
NULL
;
struct
device_node
*
irqctrler2
=
NULL
;
struct
device_node
*
np
;
struct
device_node
*
np
;
#ifdef CONFIG_PPC32
int
i
;
unsigned
long
addr
;
unsigned
long
addr
;
int
irq_cascade
=
-
1
;
int
irq_cascade
=
-
1
;
#endif
struct
mpic
*
mpic1
,
*
mpic2
;
struct
mpic
*
mpic1
,
*
mpic2
;
/* We first try to detect Apple's new Core99 chipset, since mac-io
/* We first try to detect Apple's new Core99 chipset, since mac-io
...
@@ -455,7 +462,7 @@ void __init pmac_pic_init(void)
...
@@ -455,7 +462,7 @@ void __init pmac_pic_init(void)
mpic_setup_cascade
(
irqctrler2
->
intrs
[
0
].
line
,
mpic_setup_cascade
(
irqctrler2
->
intrs
[
0
].
line
,
pmac_u3_cascade
,
mpic2
);
pmac_u3_cascade
,
mpic2
);
}
}
#if
def CONFIG_XMON
#if
defined(CONFIG_XMON) && defined(CONFIG_PPC32)
{
{
struct
device_node
*
pswitch
;
struct
device_node
*
pswitch
;
int
nmi_irq
;
int
nmi_irq
;
...
@@ -463,7 +470,7 @@ void __init pmac_pic_init(void)
...
@@ -463,7 +470,7 @@ void __init pmac_pic_init(void)
pswitch
=
find_devices
(
"programmer-switch"
);
pswitch
=
find_devices
(
"programmer-switch"
);
if
(
pswitch
&&
pswitch
->
n_intrs
)
{
if
(
pswitch
&&
pswitch
->
n_intrs
)
{
nmi_irq
=
pswitch
->
intrs
[
0
].
line
;
nmi_irq
=
pswitch
->
intrs
[
0
].
line
;
openpic_init_nmi_irq
(
nmi_irq
);
mpic_irq_set_priority
(
nmi_irq
,
9
);
setup_irq
(
nmi_irq
,
&
xmon_action
);
setup_irq
(
nmi_irq
,
&
xmon_action
);
}
}
}
}
...
@@ -472,6 +479,7 @@ void __init pmac_pic_init(void)
...
@@ -472,6 +479,7 @@ void __init pmac_pic_init(void)
}
}
irqctrler
=
NULL
;
irqctrler
=
NULL
;
#ifdef CONFIG_PPC32
/* Get the level/edge settings, assume if it's not
/* Get the level/edge settings, assume if it's not
* a Grand Central nor an OHare, then it's an Heathrow
* a Grand Central nor an OHare, then it's an Heathrow
* (or Paddington).
* (or Paddington).
...
@@ -570,6 +578,7 @@ void __init pmac_pic_init(void)
...
@@ -570,6 +578,7 @@ void __init pmac_pic_init(void)
#ifdef CONFIG_XMON
#ifdef CONFIG_XMON
setup_irq
(
20
,
&
xmon_action
);
setup_irq
(
20
,
&
xmon_action
);
#endif
/* CONFIG_XMON */
#endif
/* CONFIG_XMON */
#endif
/* CONFIG_PPC32 */
}
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
...
@@ -659,9 +668,10 @@ static struct sysdev_driver driver_pmacpic = {
...
@@ -659,9 +668,10 @@ static struct sysdev_driver driver_pmacpic = {
static
int
__init
init_pmacpic_sysfs
(
void
)
static
int
__init
init_pmacpic_sysfs
(
void
)
{
{
#ifdef CONFIG_PPC32
if
(
max_irqs
==
0
)
if
(
max_irqs
==
0
)
return
-
ENODEV
;
return
-
ENODEV
;
#endif
printk
(
KERN_DEBUG
"Registering pmac pic with sysfs...
\n
"
);
printk
(
KERN_DEBUG
"Registering pmac pic with sysfs...
\n
"
);
sysdev_class_register
(
&
pmacpic_sysclass
);
sysdev_class_register
(
&
pmacpic_sysclass
);
sysdev_register
(
&
device_pmacpic
);
sysdev_register
(
&
device_pmacpic
);
...
...
arch/powerpc/platforms/powermac/pmac.h
View file @
3c3f42d6
...
@@ -3,19 +3,31 @@
...
@@ -3,19 +3,31 @@
#include <linux/pci.h>
#include <linux/pci.h>
#include <linux/ide.h>
#include <linux/ide.h>
#include <linux/irq.h>
/*
/*
* Declaration for the various functions exported by the
* Declaration for the various functions exported by the
* pmac_* files. Mostly for use by pmac_setup
* pmac_* files. Mostly for use by pmac_setup
*/
*/
extern
void
pmac_get_boot_time
(
struct
rtc_time
*
tm
);
extern
long
pmac_time_init
(
void
);
extern
void
pmac_get_rtc_time
(
struct
rtc_time
*
tm
);
extern
unsigned
long
pmac_get_rtc_time
(
void
);
extern
int
pmac_set_rtc_time
(
struct
rtc_time
*
tm
);
extern
int
pmac_set_rtc_time
(
unsigned
long
nowtime
);
extern
void
pmac_read_rtc_time
(
void
);
extern
void
pmac_read_rtc_time
(
void
);
extern
void
pmac_calibrate_decr
(
void
);
extern
void
pmac_calibrate_decr
(
void
);
extern
void
pmac_pcibios_fixup
(
void
);
extern
void
pmac_pcibios_fixup
(
void
);
extern
void
pmac_find_bridges
(
void
);
extern
unsigned
long
pmac_ide_get_base
(
int
index
);
extern
void
pmac_ide_init_hwif_ports
(
hw_regs_t
*
hw
,
unsigned
long
data_port
,
unsigned
long
ctrl_port
,
int
*
irq
);
extern
void
pmac_nvram_update
(
void
);
extern
unsigned
char
pmac_nvram_read_byte
(
int
addr
);
extern
void
pmac_nvram_write_byte
(
int
addr
,
unsigned
char
val
);
extern
int
pmac_pci_enable_device_hook
(
struct
pci_dev
*
dev
,
int
initial
);
extern
void
pmac_pcibios_after_init
(
void
);
extern
int
of_show_percpuinfo
(
struct
seq_file
*
m
,
int
i
);
extern
void
pmac_pci_init
(
void
);
extern
void
pmac_pci_init
(
void
);
extern
void
pmac_setup_pci_dma
(
void
);
extern
void
pmac_setup_pci_dma
(
void
);
extern
void
pmac_check_ht_link
(
void
);
extern
void
pmac_check_ht_link
(
void
);
...
@@ -28,4 +40,9 @@ extern void pmac_ide_init_hwif_ports(hw_regs_t *hw,
...
@@ -28,4 +40,9 @@ extern void pmac_ide_init_hwif_ports(hw_regs_t *hw,
extern
void
pmac_nvram_init
(
void
);
extern
void
pmac_nvram_init
(
void
);
extern
struct
hw_interrupt_type
pmac_pic
;
void
pmac_pic_init
(
void
);
int
pmac_get_irq
(
struct
pt_regs
*
regs
);
#endif
/* __PMAC_H__ */
#endif
/* __PMAC_H__ */
arch/powerpc/platforms/powermac/setup.c
View file @
3c3f42d6
...
@@ -73,28 +73,10 @@
...
@@ -73,28 +73,10 @@
#include <asm/of_device.h>
#include <asm/of_device.h>
#include <asm/mmu_context.h>
#include <asm/mmu_context.h>
#include "pmac
_pic
.h"
#include "pmac.h"
#undef SHOW_GATWICK_IRQS
#undef SHOW_GATWICK_IRQS
extern
long
pmac_time_init
(
void
);
extern
unsigned
long
pmac_get_rtc_time
(
void
);
extern
int
pmac_set_rtc_time
(
unsigned
long
nowtime
);
extern
void
pmac_read_rtc_time
(
void
);
extern
void
pmac_calibrate_decr
(
void
);
extern
void
pmac_pcibios_fixup
(
void
);
extern
void
pmac_find_bridges
(
void
);
extern
unsigned
long
pmac_ide_get_base
(
int
index
);
extern
void
pmac_ide_init_hwif_ports
(
hw_regs_t
*
hw
,
unsigned
long
data_port
,
unsigned
long
ctrl_port
,
int
*
irq
);
extern
void
pmac_nvram_update
(
void
);
extern
unsigned
char
pmac_nvram_read_byte
(
int
addr
);
extern
void
pmac_nvram_write_byte
(
int
addr
,
unsigned
char
val
);
extern
int
pmac_pci_enable_device_hook
(
struct
pci_dev
*
dev
,
int
initial
);
extern
void
pmac_pcibios_after_init
(
void
);
extern
int
of_show_percpuinfo
(
struct
seq_file
*
m
,
int
i
);
unsigned
char
drive_info
;
unsigned
char
drive_info
;
int
ppc_override_l2cr
=
0
;
int
ppc_override_l2cr
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment