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
a62e6848
Commit
a62e6848
authored
Jan 10, 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
ab396e91
3b212db9
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
896 additions
and
436 deletions
+896
-436
arch/powerpc/Kconfig
arch/powerpc/Kconfig
+10
-1
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/Makefile
+1
-1
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pci_64.c
+1
-1
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/ppc_ksyms.c
+0
-1
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/rtas_pci.c
+1
-1
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/setup_32.c
+0
-2
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/setup_64.c
+0
-2
arch/powerpc/kernel/sys_ppc32.c
arch/powerpc/kernel/sys_ppc32.c
+0
-24
arch/powerpc/kernel/systbl.S
arch/powerpc/kernel/systbl.S
+3
-3
arch/powerpc/mm/pgtable_64.c
arch/powerpc/mm/pgtable_64.c
+1
-1
arch/powerpc/platforms/maple/setup.c
arch/powerpc/platforms/maple/setup.c
+0
-3
arch/powerpc/platforms/pseries/Makefile
arch/powerpc/platforms/pseries/Makefile
+1
-1
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/eeh.c
+132
-357
arch/powerpc/platforms/pseries/eeh_cache.c
arch/powerpc/platforms/pseries/eeh_cache.c
+316
-0
arch/powerpc/platforms/pseries/eeh_driver.c
arch/powerpc/platforms/pseries/eeh_driver.c
+376
-0
arch/powerpc/platforms/pseries/eeh_event.c
arch/powerpc/platforms/pseries/eeh_event.c
+12
-27
drivers/ide/pci/via82cxxx.c
drivers/ide/pci/via82cxxx.c
+1
-1
include/asm-powerpc/eeh.h
include/asm-powerpc/eeh.h
+5
-3
include/asm-powerpc/eeh_event.h
include/asm-powerpc/eeh_event.h
+5
-2
include/asm-powerpc/pci-bridge.h
include/asm-powerpc/pci-bridge.h
+5
-4
include/asm-powerpc/ppc-pci.h
include/asm-powerpc/ppc-pci.h
+22
-1
include/asm-powerpc/serial.h
include/asm-powerpc/serial.h
+4
-0
No files found.
arch/powerpc/Kconfig
View file @
a62e6848
...
...
@@ -275,6 +275,7 @@ config PPC_PSERIES
select PPC_I8259
select PPC_RTAS
select RTAS_ERROR_LOGGING
select PPC_UDBG_16550
default y
config PPC_CHRP
...
...
@@ -284,6 +285,7 @@ config PPC_CHRP
select PPC_INDIRECT_PCI
select PPC_RTAS
select PPC_MPC106
select PPC_UDBG_16550
default y
config PPC_PMAC
...
...
@@ -306,6 +308,7 @@ config PPC_PREP
depends on PPC_MULTIPLATFORM && PPC32 && BROKEN
select PPC_I8259
select PPC_INDIRECT_PCI
select PPC_UDBG_16550
default y
config PPC_MAPLE
...
...
@@ -314,6 +317,7 @@ config PPC_MAPLE
select U3_DART
select MPIC_BROKEN_U3
select GENERIC_TBSYNC
select PPC_UDBG_16550
default n
help
This option enables support for the Maple 970FX Evaluation Board.
...
...
@@ -324,6 +328,7 @@ config PPC_CELL
depends on PPC_MULTIPLATFORM && PPC64
select PPC_RTAS
select MMIO_NVRAM
select PPC_UDBG_16550
config PPC_OF
def_bool y
...
...
@@ -370,6 +375,10 @@ config MPIC_BROKEN_U3
depends on PPC_MAPLE
default y
config PPC_UDBG_16550
bool
default n
config CELL_IIC
depends on PPC_CELL
bool
...
...
@@ -403,7 +412,7 @@ config PPC_MPC106
config GENERIC_TBSYNC
bool
default y if
CONFIG_PPC32 && CONFIG_
SMP
default y if
PPC32 &&
SMP
default n
source "drivers/cpufreq/Kconfig"
...
...
arch/powerpc/kernel/Makefile
View file @
a62e6848
...
...
@@ -54,7 +54,7 @@ obj-$(CONFIG_BOOTX_TEXT) += btext.o
obj-$(CONFIG_6xx)
+=
idle_6xx.o
obj-$(CONFIG_SMP)
+=
smp.o
obj-$(CONFIG_KPROBES)
+=
kprobes.o
obj-$(CONFIG_
SERIAL_82
50)
+=
legacy_serial.o udbg_16550.o
obj-$(CONFIG_
PPC_UDBG_165
50)
+=
legacy_serial.o udbg_16550.o
module-$(CONFIG_PPC64)
+=
module_64.o
obj-$(CONFIG_MODULES)
+=
$
(
module-y
)
...
...
arch/powerpc/kernel/pci_64.c
View file @
a62e6848
...
...
@@ -381,7 +381,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
dev
->
subsystem_vendor
=
get_int_prop
(
node
,
"subsystem-vendor-id"
,
0
);
dev
->
subsystem_device
=
get_int_prop
(
node
,
"subsystem-id"
,
0
);
dev
->
cfg_size
=
256
;
/*pci_cfg_space_size(dev);*/
dev
->
cfg_size
=
pci_cfg_space_size
(
dev
);
sprintf
(
pci_name
(
dev
),
"%04x:%02x:%02x.%d"
,
pci_domain_nr
(
bus
),
dev
->
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
));
...
...
arch/powerpc/kernel/ppc_ksyms.c
View file @
a62e6848
...
...
@@ -244,7 +244,6 @@ EXPORT_SYMBOL(set_context);
extern
long
mol_trampoline
;
EXPORT_SYMBOL
(
mol_trampoline
);
/* For MOL */
EXPORT_SYMBOL
(
flush_hash_pages
);
/* For MOL */
EXPORT_SYMBOL_GPL
(
__handle_mm_fault
);
/* For MOL */
#ifdef CONFIG_SMP
extern
int
mmu_hash_lock
;
EXPORT_SYMBOL
(
mmu_hash_lock
);
/* For MOL */
...
...
arch/powerpc/kernel/rtas_pci.c
View file @
a62e6848
...
...
@@ -72,7 +72,7 @@ static int of_device_available(struct device_node * dn)
return
0
;
}
static
int
rtas_read_config
(
struct
pci_dn
*
pdn
,
int
where
,
int
size
,
u32
*
val
)
int
rtas_read_config
(
struct
pci_dn
*
pdn
,
int
where
,
int
size
,
u32
*
val
)
{
int
returnval
=
-
1
;
unsigned
long
buid
,
addr
;
...
...
arch/powerpc/kernel/setup_32.c
View file @
a62e6848
...
...
@@ -299,9 +299,7 @@ void __init setup_arch(char **cmdline_p)
if
(
ppc_md
.
init_early
)
ppc_md
.
init_early
();
#ifdef CONFIG_SERIAL_8250
find_legacy_serial_ports
();
#endif
finish_device_tree
();
smp_setup_cpu_maps
();
...
...
arch/powerpc/kernel/setup_64.c
View file @
a62e6848
...
...
@@ -472,9 +472,7 @@ void __init setup_system(void)
* hash table management for us, thus ioremap works. We do that early
* so that further code can be debugged
*/
#ifdef CONFIG_SERIAL_8250
find_legacy_serial_ports
();
#endif
/*
* "Finish" the device-tree, that is do the actual parsing of
...
...
arch/powerpc/kernel/sys_ppc32.c
View file @
a62e6848
...
...
@@ -552,30 +552,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(u32 pid, struct compat_timespec
return
ret
;
}
asmlinkage
int
compat_sys_pciconfig_read
(
u32
bus
,
u32
dfn
,
u32
off
,
u32
len
,
u32
ubuf
)
{
return
sys_pciconfig_read
((
unsigned
long
)
bus
,
(
unsigned
long
)
dfn
,
(
unsigned
long
)
off
,
(
unsigned
long
)
len
,
compat_ptr
(
ubuf
));
}
asmlinkage
int
compat_sys_pciconfig_write
(
u32
bus
,
u32
dfn
,
u32
off
,
u32
len
,
u32
ubuf
)
{
return
sys_pciconfig_write
((
unsigned
long
)
bus
,
(
unsigned
long
)
dfn
,
(
unsigned
long
)
off
,
(
unsigned
long
)
len
,
compat_ptr
(
ubuf
));
}
asmlinkage
int
compat_sys_pciconfig_iobase
(
u32
which
,
u32
in_bus
,
u32
in_devfn
)
{
return
sys_pciconfig_iobase
(
which
,
in_bus
,
in_devfn
);
}
/* Note: it is necessary to treat mode as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
...
...
arch/powerpc/kernel/systbl.S
View file @
a62e6848
...
...
@@ -239,9 +239,9 @@ SYS32ONLY(ftruncate64)
SYSX
(
sys_ni_syscall
,
sys_stat64
,
sys_stat64
)
SYSX
(
sys_ni_syscall
,
sys_lstat64
,
sys_lstat64
)
SYSX
(
sys_ni_syscall
,
sys_fstat64
,
sys_fstat64
)
COMPAT_SYS
(
pciconfig_read
)
COMPAT_SYS
(
pciconfig_write
)
COMPAT_SYS
(
pciconfig_iobase
)
SYSCALL
(
pciconfig_read
)
SYSCALL
(
pciconfig_write
)
SYSCALL
(
pciconfig_iobase
)
SYSCALL
(
ni_syscall
)
SYSCALL
(
getdents64
)
SYSCALL
(
pivot_root
)
...
...
arch/powerpc/mm/pgtable_64.c
View file @
a62e6848
...
...
@@ -174,7 +174,7 @@ void __iomem * __ioremap(unsigned long addr, unsigned long size,
pa
=
addr
&
PAGE_MASK
;
size
=
PAGE_ALIGN
(
addr
+
size
)
-
pa
;
if
(
size
==
0
)
if
(
(
size
==
0
)
||
(
pa
==
0
)
)
return
NULL
;
if
(
mem_init_done
)
{
...
...
arch/powerpc/platforms/maple/setup.c
View file @
a62e6848
...
...
@@ -71,9 +71,6 @@
#define DBG(fmt...)
#endif
extern
void
generic_find_legacy_serial_ports
(
u64
*
physport
,
unsigned
int
*
default_speed
);
static
void
maple_restart
(
char
*
cmd
)
{
unsigned
int
maple_nvram_base
;
...
...
arch/powerpc/platforms/pseries/Makefile
View file @
a62e6848
...
...
@@ -4,7 +4,7 @@ obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_IBMVIO)
+=
vio.o
obj-$(CONFIG_XICS)
+=
xics.o
obj-$(CONFIG_SCANLOG)
+=
scanlog.o
obj-$(CONFIG_EEH)
+=
eeh.o eeh_event.o
obj-$(CONFIG_EEH)
+=
eeh.o eeh_
cache.o eeh_driver.o eeh_
event.o
obj-$(CONFIG_HVC_CONSOLE)
+=
hvconsole.o
obj-$(CONFIG_HVCS)
+=
hvcserver.o
arch/powerpc/platforms/pseries/eeh.c
View file @
a62e6848
This diff is collapsed.
Click to expand it.
arch/powerpc/platforms/pseries/eeh_cache.c
0 → 100644
View file @
a62e6848
/*
* eeh_cache.c
* PCI address cache; allows the lookup of PCI devices based on I/O address
*
* Copyright (C) 2004 Linas Vepstas <linas@austin.ibm.com> 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.
*
* 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
*/
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/rbtree.h>
#include <linux/spinlock.h>
#include <asm/atomic.h>
#include <asm/pci-bridge.h>
#include <asm/ppc-pci.h>
#undef DEBUG
/**
* The pci address cache subsystem. This subsystem places
* PCI device address resources into a red-black tree, sorted
* according to the address range, so that given only an i/o
* address, the corresponding PCI device can be **quickly**
* found. It is safe to perform an address lookup in an interrupt
* context; this ability is an important feature.
*
* Currently, the only customer of this code is the EEH subsystem;
* thus, this code has been somewhat tailored to suit EEH better.
* In particular, the cache does *not* hold the addresses of devices
* for which EEH is not enabled.
*
* (Implementation Note: The RB tree seems to be better/faster
* than any hash algo I could think of for this problem, even
* with the penalty of slow pointer chases for d-cache misses).
*/
struct
pci_io_addr_range
{
struct
rb_node
rb_node
;
unsigned
long
addr_lo
;
unsigned
long
addr_hi
;
struct
pci_dev
*
pcidev
;
unsigned
int
flags
;
};
static
struct
pci_io_addr_cache
{
struct
rb_root
rb_root
;
spinlock_t
piar_lock
;
}
pci_io_addr_cache_root
;
static
inline
struct
pci_dev
*
__pci_get_device_by_addr
(
unsigned
long
addr
)
{
struct
rb_node
*
n
=
pci_io_addr_cache_root
.
rb_root
.
rb_node
;
while
(
n
)
{
struct
pci_io_addr_range
*
piar
;
piar
=
rb_entry
(
n
,
struct
pci_io_addr_range
,
rb_node
);
if
(
addr
<
piar
->
addr_lo
)
{
n
=
n
->
rb_left
;
}
else
{
if
(
addr
>
piar
->
addr_hi
)
{
n
=
n
->
rb_right
;
}
else
{
pci_dev_get
(
piar
->
pcidev
);
return
piar
->
pcidev
;
}
}
}
return
NULL
;
}
/**
* pci_get_device_by_addr - Get device, given only address
* @addr: mmio (PIO) phys address or i/o port number
*
* Given an mmio phys address, or a port number, find a pci device
* that implements this address. Be sure to pci_dev_put the device
* when finished. I/O port numbers are assumed to be offset
* from zero (that is, they do *not* have pci_io_addr added in).
* It is safe to call this function within an interrupt.
*/
struct
pci_dev
*
pci_get_device_by_addr
(
unsigned
long
addr
)
{
struct
pci_dev
*
dev
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
dev
=
__pci_get_device_by_addr
(
addr
);
spin_unlock_irqrestore
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
return
dev
;
}
#ifdef DEBUG
/*
* Handy-dandy debug print routine, does nothing more
* than print out the contents of our addr cache.
*/
static
void
pci_addr_cache_print
(
struct
pci_io_addr_cache
*
cache
)
{
struct
rb_node
*
n
;
int
cnt
=
0
;
n
=
rb_first
(
&
cache
->
rb_root
);
while
(
n
)
{
struct
pci_io_addr_range
*
piar
;
piar
=
rb_entry
(
n
,
struct
pci_io_addr_range
,
rb_node
);
printk
(
KERN_DEBUG
"PCI: %s addr range %d [%lx-%lx]: %s
\n
"
,
(
piar
->
flags
&
IORESOURCE_IO
)
?
"i/o"
:
"mem"
,
cnt
,
piar
->
addr_lo
,
piar
->
addr_hi
,
pci_name
(
piar
->
pcidev
));
cnt
++
;
n
=
rb_next
(
n
);
}
}
#endif
/* Insert address range into the rb tree. */
static
struct
pci_io_addr_range
*
pci_addr_cache_insert
(
struct
pci_dev
*
dev
,
unsigned
long
alo
,
unsigned
long
ahi
,
unsigned
int
flags
)
{
struct
rb_node
**
p
=
&
pci_io_addr_cache_root
.
rb_root
.
rb_node
;
struct
rb_node
*
parent
=
NULL
;
struct
pci_io_addr_range
*
piar
;
/* Walk tree, find a place to insert into tree */
while
(
*
p
)
{
parent
=
*
p
;
piar
=
rb_entry
(
parent
,
struct
pci_io_addr_range
,
rb_node
);
if
(
ahi
<
piar
->
addr_lo
)
{
p
=
&
parent
->
rb_left
;
}
else
if
(
alo
>
piar
->
addr_hi
)
{
p
=
&
parent
->
rb_right
;
}
else
{
if
(
dev
!=
piar
->
pcidev
||
alo
!=
piar
->
addr_lo
||
ahi
!=
piar
->
addr_hi
)
{
printk
(
KERN_WARNING
"PIAR: overlapping address range
\n
"
);
}
return
piar
;
}
}
piar
=
(
struct
pci_io_addr_range
*
)
kmalloc
(
sizeof
(
struct
pci_io_addr_range
),
GFP_ATOMIC
);
if
(
!
piar
)
return
NULL
;
piar
->
addr_lo
=
alo
;
piar
->
addr_hi
=
ahi
;
piar
->
pcidev
=
dev
;
piar
->
flags
=
flags
;
#ifdef DEBUG
printk
(
KERN_DEBUG
"PIAR: insert range=[%lx:%lx] dev=%s
\n
"
,
alo
,
ahi
,
pci_name
(
dev
));
#endif
rb_link_node
(
&
piar
->
rb_node
,
parent
,
p
);
rb_insert_color
(
&
piar
->
rb_node
,
&
pci_io_addr_cache_root
.
rb_root
);
return
piar
;
}
static
void
__pci_addr_cache_insert_device
(
struct
pci_dev
*
dev
)
{
struct
device_node
*
dn
;
struct
pci_dn
*
pdn
;
int
i
;
int
inserted
=
0
;
dn
=
pci_device_to_OF_node
(
dev
);
if
(
!
dn
)
{
printk
(
KERN_WARNING
"PCI: no pci dn found for dev=%s
\n
"
,
pci_name
(
dev
));
return
;
}
/* Skip any devices for which EEH is not enabled. */
pdn
=
PCI_DN
(
dn
);
if
(
!
(
pdn
->
eeh_mode
&
EEH_MODE_SUPPORTED
)
||
pdn
->
eeh_mode
&
EEH_MODE_NOCHECK
)
{
#ifdef DEBUG
printk
(
KERN_INFO
"PCI: skip building address cache for=%s - %s
\n
"
,
pci_name
(
dev
),
pdn
->
node
->
full_name
);
#endif
return
;
}
/* The cache holds a reference to the device... */
pci_dev_get
(
dev
);
/* Walk resources on this device, poke them into the tree */
for
(
i
=
0
;
i
<
DEVICE_COUNT_RESOURCE
;
i
++
)
{
unsigned
long
start
=
pci_resource_start
(
dev
,
i
);
unsigned
long
end
=
pci_resource_end
(
dev
,
i
);
unsigned
int
flags
=
pci_resource_flags
(
dev
,
i
);
/* We are interested only bus addresses, not dma or other stuff */
if
(
0
==
(
flags
&
(
IORESOURCE_IO
|
IORESOURCE_MEM
)))
continue
;
if
(
start
==
0
||
~
start
==
0
||
end
==
0
||
~
end
==
0
)
continue
;
pci_addr_cache_insert
(
dev
,
start
,
end
,
flags
);
inserted
=
1
;
}
/* If there was nothing to add, the cache has no reference... */
if
(
!
inserted
)
pci_dev_put
(
dev
);
}
/**
* pci_addr_cache_insert_device - Add a device to the address cache
* @dev: PCI device whose I/O addresses we are interested in.
*
* In order to support the fast lookup of devices based on addresses,
* we maintain a cache of devices that can be quickly searched.
* This routine adds a device to that cache.
*/
void
pci_addr_cache_insert_device
(
struct
pci_dev
*
dev
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
__pci_addr_cache_insert_device
(
dev
);
spin_unlock_irqrestore
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
}
static
inline
void
__pci_addr_cache_remove_device
(
struct
pci_dev
*
dev
)
{
struct
rb_node
*
n
;
int
removed
=
0
;
restart:
n
=
rb_first
(
&
pci_io_addr_cache_root
.
rb_root
);
while
(
n
)
{
struct
pci_io_addr_range
*
piar
;
piar
=
rb_entry
(
n
,
struct
pci_io_addr_range
,
rb_node
);
if
(
piar
->
pcidev
==
dev
)
{
rb_erase
(
n
,
&
pci_io_addr_cache_root
.
rb_root
);
removed
=
1
;
kfree
(
piar
);
goto
restart
;
}
n
=
rb_next
(
n
);
}
/* The cache no longer holds its reference to this device... */
if
(
removed
)
pci_dev_put
(
dev
);
}
/**
* pci_addr_cache_remove_device - remove pci device from addr cache
* @dev: device to remove
*
* Remove a device from the addr-cache tree.
* This is potentially expensive, since it will walk
* the tree multiple times (once per resource).
* But so what; device removal doesn't need to be that fast.
*/
void
pci_addr_cache_remove_device
(
struct
pci_dev
*
dev
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
__pci_addr_cache_remove_device
(
dev
);
spin_unlock_irqrestore
(
&
pci_io_addr_cache_root
.
piar_lock
,
flags
);
}
/**
* pci_addr_cache_build - Build a cache of I/O addresses
*
* Build a cache of pci i/o addresses. This cache will be used to
* find the pci device that corresponds to a given address.
* This routine scans all pci busses to build the cache.
* Must be run late in boot process, after the pci controllers
* have been scaned for devices (after all device resources are known).
*/
void
__init
pci_addr_cache_build
(
void
)
{
struct
device_node
*
dn
;
struct
pci_dev
*
dev
=
NULL
;
spin_lock_init
(
&
pci_io_addr_cache_root
.
piar_lock
);
while
((
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
))
!=
NULL
)
{
/* Ignore PCI bridges */
if
((
dev
->
class
>>
16
)
==
PCI_BASE_CLASS_BRIDGE
)
continue
;
pci_addr_cache_insert_device
(
dev
);
dn
=
pci_device_to_OF_node
(
dev
);
pci_dev_get
(
dev
);
/* matching put is in eeh_remove_device() */
PCI_DN
(
dn
)
->
pcidev
=
dev
;
}
#ifdef DEBUG
/* Verify tree built up above, echo back the list of addrs. */
pci_addr_cache_print
(
&
pci_io_addr_cache_root
);
#endif
}
arch/powerpc/platforms/pseries/eeh_driver.c
0 → 100644
View file @
a62e6848
This diff is collapsed.
Click to expand it.
arch/powerpc/platforms/pseries/eeh_event.c
View file @
a62e6848
...
...
@@ -21,6 +21,7 @@
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/eeh_event.h>
#include <asm/ppc-pci.h>
/** Overview:
* EEH error states may be detected within exception handlers;
...
...
@@ -36,31 +37,6 @@ LIST_HEAD(eeh_eventlist);
static
void
eeh_thread_launcher
(
void
*
);
DECLARE_WORK
(
eeh_event_wq
,
eeh_thread_launcher
,
NULL
);
/**
* eeh_panic - call panic() for an eeh event that cannot be handled.
* The philosophy of this routine is that it is better to panic and
* halt the OS than it is to risk possible data corruption by
* oblivious device drivers that don't know better.
*
* @dev pci device that had an eeh event
* @reset_state current reset state of the device slot
*/
static
void
eeh_panic
(
struct
pci_dev
*
dev
,
int
reset_state
)
{
/*
* Since the panic_on_oops sysctl is used to halt the system
* in light of potential corruption, we can use it here.
*/
if
(
panic_on_oops
)
{
panic
(
"EEH: MMIO failure (%d) on device:%s
\n
"
,
reset_state
,
pci_name
(
dev
));
}
else
{
printk
(
KERN_INFO
"EEH: Ignored MMIO failure (%d) on device:%s
\n
"
,
reset_state
,
pci_name
(
dev
));
}
}
/**
* eeh_event_handler - dispatch EEH events. The detection of a frozen
* slot can occur inside an interrupt, where it can be hard to do
...
...
@@ -82,10 +58,16 @@ static int eeh_event_handler(void * dummy)
spin_lock_irqsave
(
&
eeh_eventlist_lock
,
flags
);
event
=
NULL
;
/* Unqueue the event, get ready to process. */
if
(
!
list_empty
(
&
eeh_eventlist
))
{
event
=
list_entry
(
eeh_eventlist
.
next
,
struct
eeh_event
,
list
);
list_del
(
&
event
->
list
);
}
if
(
event
)
eeh_mark_slot
(
event
->
dn
,
EEH_MODE_RECOVERING
);
spin_unlock_irqrestore
(
&
eeh_eventlist_lock
,
flags
);
if
(
event
==
NULL
)
break
;
...
...
@@ -93,8 +75,11 @@ static int eeh_event_handler(void * dummy)
printk
(
KERN_INFO
"EEH: Detected PCI bus error on device %s
\n
"
,
pci_name
(
event
->
dev
));
eeh_panic
(
event
->
dev
,
event
->
state
);
handle_eeh_events
(
event
);
eeh_clear_slot
(
event
->
dn
,
EEH_MODE_RECOVERING
);
pci_dev_put
(
event
->
dev
);
kfree
(
event
);
}
...
...
@@ -122,7 +107,7 @@ static void eeh_thread_launcher(void *dummy)
*/
int
eeh_send_failure_event
(
struct
device_node
*
dn
,
struct
pci_dev
*
dev
,
int
state
,
enum
pci_channel_state
state
,
int
time_unavail
)
{
unsigned
long
flags
;
...
...
drivers/ide/pci/via82cxxx.c
View file @
a62e6848
...
...
@@ -439,7 +439,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
hwif
->
speedproc
=
&
via_set_drive
;
#if defined(CONFIG_PPC_
MULTIPLATFORM
) && defined(CONFIG_PPC32)
#if defined(CONFIG_PPC_
CHRP
) && defined(CONFIG_PPC32)
if
(
_machine
==
_MACH_chrp
&&
_chrp_type
==
_CHRP_Pegasos
)
{
hwif
->
irq
=
hwif
->
channel
?
15
:
14
;
}
...
...
include/asm-powerpc/eeh.h
View file @
a62e6848
...
...
@@ -34,9 +34,11 @@ struct device_node;
extern
int
eeh_subsystem_enabled
;
/* Values for eeh_mode bits in device_node */
#define EEH_MODE_SUPPORTED (1<<0)
#define EEH_MODE_NOCHECK (1<<1)
#define EEH_MODE_ISOLATED (1<<2)
#define EEH_MODE_SUPPORTED (1<<0)
#define EEH_MODE_NOCHECK (1<<1)
#define EEH_MODE_ISOLATED (1<<2)
#define EEH_MODE_RECOVERING (1<<3)
#define EEH_MODE_IRQ_DISABLED (1<<4)
/* Max number of EEH freezes allowed before we consider the device
* to be permanently disabled. */
...
...
include/asm-powerpc/eeh_event.h
View file @
a62e6848
...
...
@@ -30,7 +30,7 @@ struct eeh_event {
struct
list_head
list
;
struct
device_node
*
dn
;
/* struct device node */
struct
pci_dev
*
dev
;
/* affected device */
int
state
;
enum
pci_channel_state
state
;
/* PCI bus state for the affected device */
int
time_unavail
;
/* milliseconds until device might be available */
};
...
...
@@ -47,8 +47,11 @@ struct eeh_event {
*/
int
eeh_send_failure_event
(
struct
device_node
*
dn
,
struct
pci_dev
*
dev
,
int
reset_
state
,
enum
pci_channel_state
state
,
int
time_unavail
);
/* Main recovery function */
void
handle_eeh_events
(
struct
eeh_event
*
);
#endif
/* __KERNEL__ */
#endif
/* ASM_PPC64_EEH_EVENT_H */
include/asm-powerpc/pci-bridge.h
View file @
a62e6848
...
...
@@ -61,16 +61,17 @@ struct pci_controller;
struct
iommu_table
;
struct
pci_dn
{
int
busno
;
/* for pci devices */
int
bussubno
;
/* for pci devices */
int
devfn
;
/* for pci devices */
int
busno
;
/* pci bus number */
int
bussubno
;
/* pci subordinate bus number */
int
devfn
;
/* pci device and function number */
int
class_code
;
/* pci device class */
#ifdef CONFIG_PPC_PSERIES
int
eeh_mode
;
/* See eeh.h for possible EEH_MODEs */
int
eeh_config_addr
;
int
eeh_pe_config_addr
;
/* new-style partition endpoint address */
int
eeh_check_count
;
/* # times driver ignored error */
int
eeh_freeze_count
;
/* # times this device froze up. */
int
eeh_is_bridge
;
/* device is pci-to-pci bridge */
#endif
int
pci_ext_config_space
;
/* for pci devices */
struct
pci_controller
*
phb
;
/* for pci devices */
...
...
include/asm-powerpc/ppc-pci.h
View file @
a62e6848
...
...
@@ -52,6 +52,21 @@ extern unsigned long pci_probe_only;
/* ---- EEH internal-use-only related routines ---- */
#ifdef CONFIG_EEH
void
pci_addr_cache_insert_device
(
struct
pci_dev
*
dev
);
void
pci_addr_cache_remove_device
(
struct
pci_dev
*
dev
);
void
pci_addr_cache_build
(
void
);
struct
pci_dev
*
pci_get_device_by_addr
(
unsigned
long
addr
);
/**
* eeh_slot_error_detail -- record and EEH error condition to the log
* @severity: 1 if temporary, 2 if permanent failure.
*
* Obtains the the EEH error details from the RTAS subsystem,
* and then logs these details with the RTAS error log system.
*/
void
eeh_slot_error_detail
(
struct
pci_dn
*
pdn
,
int
severity
);
/**
* rtas_set_slot_reset -- unfreeze a frozen slot
*
...
...
@@ -59,8 +74,10 @@ extern unsigned long pci_probe_only;
* does this by asserting the PCI #RST line for 1/8th of
* a second; this routine will sleep while the adapter is
* being reset.
*
* Returns a non-zero value if the reset failed.
*/
void
rtas_set_slot_reset
(
struct
pci_dn
*
);
int
rtas_set_slot_reset
(
struct
pci_dn
*
);
/**
* eeh_restore_bars - Restore device configuration info.
...
...
@@ -84,6 +101,7 @@ void eeh_restore_bars(struct pci_dn *);
void
rtas_configure_bridge
(
struct
pci_dn
*
);
int
rtas_write_config
(
struct
pci_dn
*
,
int
where
,
int
size
,
u32
val
);
int
rtas_read_config
(
struct
pci_dn
*
,
int
where
,
int
size
,
u32
*
val
);
/**
* mark and clear slots: find "partition endpoint" PE and set or
...
...
@@ -92,6 +110,9 @@ int rtas_write_config(struct pci_dn *, int where, int size, u32 val);
void
eeh_mark_slot
(
struct
device_node
*
dn
,
int
mode_flag
);
void
eeh_clear_slot
(
struct
device_node
*
dn
,
int
mode_flag
);
/* Find the associated "Partiationable Endpoint" PE */
struct
device_node
*
find_device_pe
(
struct
device_node
*
dn
);
#endif
#endif
/* __KERNEL__ */
...
...
include/asm-powerpc/serial.h
View file @
a62e6848
...
...
@@ -15,6 +15,10 @@
/* Default baud base if not found in device-tree */
#define BASE_BAUD ( 1843200 / 16 )
#ifdef CONFIG_PPC_UDBG_16550
extern
void
find_legacy_serial_ports
(
void
);
#else
#define find_legacy_serial_ports() do { } while (0)
#endif
#endif
/* _PPC64_SERIAL_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment