powerpc/eeh: Cleanup comments in the EEH core
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / powerpc / include / asm / eeh.h
1 /*
2  * Copyright (C) 2001  Dave Engebretsen & Todd Inglett IBM Corporation.
3  * Copyright 2001-2012 IBM Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18  */
19
20 #ifndef _POWERPC_EEH_H
21 #define _POWERPC_EEH_H
22 #ifdef __KERNEL__
23
24 #include <linux/init.h>
25 #include <linux/list.h>
26 #include <linux/string.h>
27
28 struct pci_dev;
29 struct pci_bus;
30 struct device_node;
31
32 #ifdef CONFIG_EEH
33
34 extern int eeh_subsystem_enabled;
35
36 /* Values for eeh_mode bits in device_node */
37 #define EEH_MODE_SUPPORTED     (1<<0)
38 #define EEH_MODE_NOCHECK       (1<<1)
39 #define EEH_MODE_ISOLATED      (1<<2)
40 #define EEH_MODE_RECOVERING    (1<<3)
41 #define EEH_MODE_IRQ_DISABLED  (1<<4)
42
43 /*
44  * Max number of EEH freezes allowed before we consider the device
45  * to be permanently disabled.
46  */
47 #define EEH_MAX_ALLOWED_FREEZES 5
48
49 void __init eeh_init(void);
50 unsigned long eeh_check_failure(const volatile void __iomem *token,
51                                 unsigned long val);
52 int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev);
53 void __init pci_addr_cache_build(void);
54 void eeh_add_device_tree_early(struct device_node *);
55 void eeh_add_device_tree_late(struct pci_bus *);
56 void eeh_remove_bus_device(struct pci_dev *);
57
58 /**
59  * EEH_POSSIBLE_ERROR() -- test for possible MMIO failure.
60  *
61  * If this macro yields TRUE, the caller relays to eeh_check_failure()
62  * which does further tests out of line.
63  */
64 #define EEH_POSSIBLE_ERROR(val, type)   ((val) == (type)~0 && eeh_subsystem_enabled)
65
66 /*
67  * Reads from a device which has been isolated by EEH will return
68  * all 1s.  This macro gives an all-1s value of the given size (in
69  * bytes: 1, 2, or 4) for comparing with the result of a read.
70  */
71 #define EEH_IO_ERROR_VALUE(size)        (~0U >> ((4 - (size)) * 8))
72
73 #else /* !CONFIG_EEH */
74 static inline void eeh_init(void) { }
75
76 static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
77 {
78         return val;
79 }
80
81 static inline int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
82 {
83         return 0;
84 }
85
86 static inline void pci_addr_cache_build(void) { }
87
88 static inline void eeh_add_device_tree_early(struct device_node *dn) { }
89
90 static inline void eeh_add_device_tree_late(struct pci_bus *bus) { }
91
92 static inline void eeh_remove_bus_device(struct pci_dev *dev) { }
93 #define EEH_POSSIBLE_ERROR(val, type) (0)
94 #define EEH_IO_ERROR_VALUE(size) (-1UL)
95 #endif /* CONFIG_EEH */
96
97 #ifdef CONFIG_PPC64
98 /*
99  * MMIO read/write operations with EEH support.
100  */
101 static inline u8 eeh_readb(const volatile void __iomem *addr)
102 {
103         u8 val = in_8(addr);
104         if (EEH_POSSIBLE_ERROR(val, u8))
105                 return eeh_check_failure(addr, val);
106         return val;
107 }
108
109 static inline u16 eeh_readw(const volatile void __iomem *addr)
110 {
111         u16 val = in_le16(addr);
112         if (EEH_POSSIBLE_ERROR(val, u16))
113                 return eeh_check_failure(addr, val);
114         return val;
115 }
116
117 static inline u32 eeh_readl(const volatile void __iomem *addr)
118 {
119         u32 val = in_le32(addr);
120         if (EEH_POSSIBLE_ERROR(val, u32))
121                 return eeh_check_failure(addr, val);
122         return val;
123 }
124
125 static inline u64 eeh_readq(const volatile void __iomem *addr)
126 {
127         u64 val = in_le64(addr);
128         if (EEH_POSSIBLE_ERROR(val, u64))
129                 return eeh_check_failure(addr, val);
130         return val;
131 }
132
133 static inline u16 eeh_readw_be(const volatile void __iomem *addr)
134 {
135         u16 val = in_be16(addr);
136         if (EEH_POSSIBLE_ERROR(val, u16))
137                 return eeh_check_failure(addr, val);
138         return val;
139 }
140
141 static inline u32 eeh_readl_be(const volatile void __iomem *addr)
142 {
143         u32 val = in_be32(addr);
144         if (EEH_POSSIBLE_ERROR(val, u32))
145                 return eeh_check_failure(addr, val);
146         return val;
147 }
148
149 static inline u64 eeh_readq_be(const volatile void __iomem *addr)
150 {
151         u64 val = in_be64(addr);
152         if (EEH_POSSIBLE_ERROR(val, u64))
153                 return eeh_check_failure(addr, val);
154         return val;
155 }
156
157 static inline void eeh_memcpy_fromio(void *dest, const
158                                      volatile void __iomem *src,
159                                      unsigned long n)
160 {
161         _memcpy_fromio(dest, src, n);
162
163         /* Look for ffff's here at dest[n].  Assume that at least 4 bytes
164          * were copied. Check all four bytes.
165          */
166         if (n >= 4 && EEH_POSSIBLE_ERROR(*((u32 *)(dest + n - 4)), u32))
167                 eeh_check_failure(src, *((u32 *)(dest + n - 4)));
168 }
169
170 /* in-string eeh macros */
171 static inline void eeh_readsb(const volatile void __iomem *addr, void * buf,
172                               int ns)
173 {
174         _insb(addr, buf, ns);
175         if (EEH_POSSIBLE_ERROR((*(((u8*)buf)+ns-1)), u8))
176                 eeh_check_failure(addr, *(u8*)buf);
177 }
178
179 static inline void eeh_readsw(const volatile void __iomem *addr, void * buf,
180                               int ns)
181 {
182         _insw(addr, buf, ns);
183         if (EEH_POSSIBLE_ERROR((*(((u16*)buf)+ns-1)), u16))
184                 eeh_check_failure(addr, *(u16*)buf);
185 }
186
187 static inline void eeh_readsl(const volatile void __iomem *addr, void * buf,
188                               int nl)
189 {
190         _insl(addr, buf, nl);
191         if (EEH_POSSIBLE_ERROR((*(((u32*)buf)+nl-1)), u32))
192                 eeh_check_failure(addr, *(u32*)buf);
193 }
194
195 #endif /* CONFIG_PPC64 */
196 #endif /* __KERNEL__ */
197 #endif /* _POWERPC_EEH_H */