Blame view
include/asm-powerpc/eeh.h
5.75 KB
172ca9261
|
1 |
/* |
1da177e4c
|
2 3 4 5 6 7 8 |
* eeh.h * Copyright (C) 2001 Dave Engebretsen & Todd Inglett 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. |
172ca9261
|
9 |
* |
1da177e4c
|
10 11 12 13 |
* 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. |
172ca9261
|
14 |
* |
1da177e4c
|
15 16 17 18 19 20 21 |
* 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 */ #ifndef _PPC64_EEH_H #define _PPC64_EEH_H |
88ced0314
|
22 |
#ifdef __KERNEL__ |
1da177e4c
|
23 |
|
1da177e4c
|
24 25 26 27 28 |
#include <linux/init.h> #include <linux/list.h> #include <linux/string.h> struct pci_dev; |
827c1a6c1
|
29 |
struct pci_bus; |
1da177e4c
|
30 |
struct device_node; |
1da177e4c
|
31 32 |
#ifdef CONFIG_EEH |
1e28a7ddd
|
33 |
extern int eeh_subsystem_enabled; |
1da177e4c
|
34 |
/* Values for eeh_mode bits in device_node */ |
77bd74156
|
35 36 37 38 39 |
#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) |
1da177e4c
|
40 |
|
172ca9261
|
41 42 43 |
/* Max number of EEH freezes allowed before we consider the device * to be permanently disabled. */ #define EEH_MAX_ALLOWED_FREEZES 5 |
1da177e4c
|
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
void __init eeh_init(void); unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val); int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev); void __init pci_addr_cache_build(void); /** * eeh_add_device_early * eeh_add_device_late * * Perform eeh initialization for devices added after boot. * Call eeh_add_device_early before doing any i/o to the * device (including config space i/o). Call eeh_add_device_late * to finish the eeh setup for this device. */ |
e2a296eea
|
59 |
void eeh_add_device_tree_early(struct device_node *); |
827c1a6c1
|
60 |
void eeh_add_device_tree_late(struct pci_bus *); |
1da177e4c
|
61 62 |
/** |
e2a296eea
|
63 64 65 66 67 68 69 70 71 |
* eeh_remove_device_recursive - undo EEH for device & children. * @dev: pci device to be removed * * As above, this removes the device; it also removes child * pci devices as well. */ void eeh_remove_bus_device(struct pci_dev *); /** |
1da177e4c
|
72 73 74 75 76 |
* EEH_POSSIBLE_ERROR() -- test for possible MMIO failure. * * If this macro yields TRUE, the caller relays to eeh_check_failure() * which does further tests out of line. */ |
1e28a7ddd
|
77 |
#define EEH_POSSIBLE_ERROR(val, type) ((val) == (type)~0 && eeh_subsystem_enabled) |
1da177e4c
|
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
/* * Reads from a device which has been isolated by EEH will return * all 1s. This macro gives an all-1s value of the given size (in * bytes: 1, 2, or 4) for comparing with the result of a read. */ #define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8)) #else /* !CONFIG_EEH */ static inline void eeh_init(void) { } static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) { return val; } static inline int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) { return 0; } static inline void pci_addr_cache_build(void) { } |
022930ebe
|
100 |
static inline void eeh_add_device_tree_early(struct device_node *dn) { } |
827c1a6c1
|
101 |
static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } |
022930ebe
|
102 |
static inline void eeh_remove_bus_device(struct pci_dev *dev) { } |
1da177e4c
|
103 104 105 |
#define EEH_POSSIBLE_ERROR(val, type) (0) #define EEH_IO_ERROR_VALUE(size) (-1UL) #endif /* CONFIG_EEH */ |
172ca9261
|
106 |
/* |
1da177e4c
|
107 108 109 110 111 112 113 114 115 |
* MMIO read/write operations with EEH support. */ static inline u8 eeh_readb(const volatile void __iomem *addr) { u8 val = in_8(addr); if (EEH_POSSIBLE_ERROR(val, u8)) return eeh_check_failure(addr, val); return val; } |
1da177e4c
|
116 117 118 119 120 121 122 123 |
static inline u16 eeh_readw(const volatile void __iomem *addr) { u16 val = in_le16(addr); if (EEH_POSSIBLE_ERROR(val, u16)) return eeh_check_failure(addr, val); return val; } |
1da177e4c
|
124 125 126 127 128 129 130 131 |
static inline u32 eeh_readl(const volatile void __iomem *addr) { u32 val = in_le32(addr); if (EEH_POSSIBLE_ERROR(val, u32)) return eeh_check_failure(addr, val); return val; } |
4cb3cee03
|
132 133 |
static inline u64 eeh_readq(const volatile void __iomem *addr) |
1da177e4c
|
134 |
{ |
4cb3cee03
|
135 136 |
u64 val = in_le64(addr); if (EEH_POSSIBLE_ERROR(val, u64)) |
1da177e4c
|
137 138 139 |
return eeh_check_failure(addr, val); return val; } |
1da177e4c
|
140 |
|
4cb3cee03
|
141 |
static inline u16 eeh_readw_be(const volatile void __iomem *addr) |
1da177e4c
|
142 |
{ |
4cb3cee03
|
143 144 |
u16 val = in_be16(addr); if (EEH_POSSIBLE_ERROR(val, u16)) |
1da177e4c
|
145 146 147 |
return eeh_check_failure(addr, val); return val; } |
4cb3cee03
|
148 149 |
static inline u32 eeh_readl_be(const volatile void __iomem *addr) |
1da177e4c
|
150 |
{ |
4cb3cee03
|
151 152 153 154 |
u32 val = in_be32(addr); if (EEH_POSSIBLE_ERROR(val, u32)) return eeh_check_failure(addr, val); return val; |
1da177e4c
|
155 |
} |
4cb3cee03
|
156 157 |
static inline u64 eeh_readq_be(const volatile void __iomem *addr) |
1da177e4c
|
158 159 160 161 162 163 |
{ u64 val = in_be64(addr); if (EEH_POSSIBLE_ERROR(val, u64)) return eeh_check_failure(addr, val); return val; } |
1da177e4c
|
164 |
|
68a64357d
|
165 166 |
static inline void eeh_memcpy_fromio(void *dest, const volatile void __iomem *src, |
1da177e4c
|
167 168 |
unsigned long n) { |
68a64357d
|
169 |
_memcpy_fromio(dest, src, n); |
1da177e4c
|
170 171 172 173 |
/* Look for ffff's here at dest[n]. Assume that at least 4 bytes * were copied. Check all four bytes. */ |
68a64357d
|
174 175 |
if (n >= 4 && EEH_POSSIBLE_ERROR(*((u32 *)(dest + n - 4)), u32)) eeh_check_failure(src, *((u32 *)(dest + n - 4))); |
1da177e4c
|
176 |
} |
1da177e4c
|
177 |
/* in-string eeh macros */ |
4cb3cee03
|
178 179 |
static inline void eeh_readsb(const volatile void __iomem *addr, void * buf, int ns) |
1da177e4c
|
180 |
{ |
4cb3cee03
|
181 |
_insb(addr, buf, ns); |
1da177e4c
|
182 |
if (EEH_POSSIBLE_ERROR((*(((u8*)buf)+ns-1)), u8)) |
4cb3cee03
|
183 |
eeh_check_failure(addr, *(u8*)buf); |
1da177e4c
|
184 |
} |
4cb3cee03
|
185 186 |
static inline void eeh_readsw(const volatile void __iomem *addr, void * buf, int ns) |
1da177e4c
|
187 |
{ |
4cb3cee03
|
188 |
_insw(addr, buf, ns); |
1da177e4c
|
189 |
if (EEH_POSSIBLE_ERROR((*(((u16*)buf)+ns-1)), u16)) |
4cb3cee03
|
190 |
eeh_check_failure(addr, *(u16*)buf); |
1da177e4c
|
191 |
} |
4cb3cee03
|
192 193 |
static inline void eeh_readsl(const volatile void __iomem *addr, void * buf, int nl) |
1da177e4c
|
194 |
{ |
4cb3cee03
|
195 |
_insl(addr, buf, nl); |
1da177e4c
|
196 |
if (EEH_POSSIBLE_ERROR((*(((u32*)buf)+nl-1)), u32)) |
4cb3cee03
|
197 |
eeh_check_failure(addr, *(u32*)buf); |
1da177e4c
|
198 |
} |
88ced0314
|
199 |
#endif /* __KERNEL__ */ |
1da177e4c
|
200 |
#endif /* _PPC64_EEH_H */ |