Blame view

include/asm-powerpc/eeh.h 5.75 KB
172ca9261   Linas Vepstas   [PATCH] ppc64: PC...
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Linas Vepstas   [PATCH] ppc64: PC...
9
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Linas Vepstas   [PATCH] ppc64: PC...
14
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Arnd Bergmann   [PATCH] powerpc: ...
22
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
  #include <linux/init.h>
  #include <linux/list.h>
  #include <linux/string.h>
  
  struct pci_dev;
827c1a6c1   John Rose   [PATCH] powerpc: ...
29
  struct pci_bus;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  struct device_node;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
  
  #ifdef CONFIG_EEH
1e28a7ddd   David Woodhouse   [PATCH] Avoid use...
33
  extern int eeh_subsystem_enabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  /* Values for eeh_mode bits in device_node */
77bd74156   Linas Vepstas   [PATCH] powerpc: ...
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   Linus Torvalds   Linux-2.6.12-rc2
40

172ca9261   Linas Vepstas   [PATCH] ppc64: PC...
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   Linus Torvalds   Linux-2.6.12-rc2
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   Linas Vepstas   [PATCH] powerpc: ...
59
  void eeh_add_device_tree_early(struct device_node *);
827c1a6c1   John Rose   [PATCH] powerpc: ...
60
  void eeh_add_device_tree_late(struct pci_bus *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
  
  /**
e2a296eea   Linas Vepstas   [PATCH] powerpc: ...
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   Linus Torvalds   Linux-2.6.12-rc2
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   David Woodhouse   [PATCH] Avoid use...
77
  #define EEH_POSSIBLE_ERROR(val, type)	((val) == (type)~0 && eeh_subsystem_enabled)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Haren Myneni   [PATCH] Small fix...
100
  static inline void eeh_add_device_tree_early(struct device_node *dn) { }
827c1a6c1   John Rose   [PATCH] powerpc: ...
101
  static inline void eeh_add_device_tree_late(struct pci_bus *bus) { }
022930ebe   Haren Myneni   [PATCH] Small fix...
102
  static inline void eeh_remove_bus_device(struct pci_dev *dev) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
105
  #define EEH_POSSIBLE_ERROR(val, type) (0)
  #define EEH_IO_ERROR_VALUE(size) (-1UL)
  #endif /* CONFIG_EEH */
172ca9261   Linas Vepstas   [PATCH] ppc64: PC...
106
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Linus Torvalds   Linux-2.6.12-rc2
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   Linus Torvalds   Linux-2.6.12-rc2
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   Benjamin Herrenschmidt   [POWERPC] Allow h...
132
133
  
  static inline u64 eeh_readq(const volatile void __iomem *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
135
136
  	u64 val = in_le64(addr);
  	if (EEH_POSSIBLE_ERROR(val, u64))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
139
  		return eeh_check_failure(addr, val);
  	return val;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140

4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
141
  static inline u16 eeh_readw_be(const volatile void __iomem *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
143
144
  	u16 val = in_be16(addr);
  	if (EEH_POSSIBLE_ERROR(val, u16))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
  		return eeh_check_failure(addr, val);
  	return val;
  }
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
148
149
  
  static inline u32 eeh_readl_be(const volatile void __iomem *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
151
152
153
154
  	u32 val = in_be32(addr);
  	if (EEH_POSSIBLE_ERROR(val, u32))
  		return eeh_check_failure(addr, val);
  	return val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
  }
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
156
157
  
  static inline u64 eeh_readq_be(const volatile void __iomem *addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Linus Torvalds   Linux-2.6.12-rc2
164

68a64357d   Benjamin Herrenschmidt   [POWERPC] Merge 3...
165
166
  static inline void eeh_memcpy_fromio(void *dest, const
  				     volatile void __iomem *src,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
  				     unsigned long n)
  {
68a64357d   Benjamin Herrenschmidt   [POWERPC] Merge 3...
169
  	_memcpy_fromio(dest, src, n);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Benjamin Herrenschmidt   [POWERPC] Merge 3...
174
175
  	if (n >= 4 && EEH_POSSIBLE_ERROR(*((u32 *)(dest + n - 4)), u32))
  		eeh_check_failure(src, *((u32 *)(dest + n - 4)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
  /* in-string eeh macros */
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
178
179
  static inline void eeh_readsb(const volatile void __iomem *addr, void * buf,
  			      int ns)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
181
  	_insb(addr, buf, ns);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  	if (EEH_POSSIBLE_ERROR((*(((u8*)buf)+ns-1)), u8))
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
183
  		eeh_check_failure(addr, *(u8*)buf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
  }
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
185
186
  static inline void eeh_readsw(const volatile void __iomem *addr, void * buf,
  			      int ns)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
188
  	_insw(addr, buf, ns);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  	if (EEH_POSSIBLE_ERROR((*(((u16*)buf)+ns-1)), u16))
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
190
  		eeh_check_failure(addr, *(u16*)buf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  }
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
192
193
  static inline void eeh_readsl(const volatile void __iomem *addr, void * buf,
  			      int nl)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  {
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
195
  	_insl(addr, buf, nl);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
  	if (EEH_POSSIBLE_ERROR((*(((u32*)buf)+nl-1)), u32))
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
197
  		eeh_check_failure(addr, *(u32*)buf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
  }
88ced0314   Arnd Bergmann   [PATCH] powerpc: ...
199
  #endif /* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
  #endif /* _PPC64_EEH_H */