2 * drivers/pci/pcie/aer/aerdrv_errprint.c
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
8 * Format error messages and print them to console.
10 * Copyright (C) 2006 Intel Corp.
11 * Tom Long Nguyen (tom.l.nguyen@intel.com)
12 * Zhang Yanmin (yanmin.zhang@intel.com)
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 #include <linux/kernel.h>
19 #include <linux/errno.h>
21 #include <linux/suspend.h>
25 #define AER_AGENT_RECEIVER 0
26 #define AER_AGENT_REQUESTER 1
27 #define AER_AGENT_COMPLETER 2
28 #define AER_AGENT_TRANSMITTER 3
30 #define AER_AGENT_REQUESTER_MASK (PCI_ERR_UNC_COMP_TIME| \
33 #define AER_AGENT_COMPLETER_MASK PCI_ERR_UNC_COMP_ABORT
35 #define AER_AGENT_TRANSMITTER_MASK(t, e) (e & (PCI_ERR_COR_REP_ROLL| \
36 ((t == AER_CORRECTABLE) ? PCI_ERR_COR_REP_TIMER : 0)))
38 #define AER_GET_AGENT(t, e) \
39 ((e & AER_AGENT_COMPLETER_MASK) ? AER_AGENT_COMPLETER : \
40 (e & AER_AGENT_REQUESTER_MASK) ? AER_AGENT_REQUESTER : \
41 (AER_AGENT_TRANSMITTER_MASK(t, e)) ? AER_AGENT_TRANSMITTER : \
44 #define AER_PHYSICAL_LAYER_ERROR_MASK PCI_ERR_COR_RCVR
45 #define AER_DATA_LINK_LAYER_ERROR_MASK(t, e) \
47 PCI_ERR_COR_BAD_TLP| \
48 PCI_ERR_COR_BAD_DLLP| \
49 PCI_ERR_COR_REP_ROLL| \
50 ((t == AER_CORRECTABLE) ? \
51 PCI_ERR_COR_REP_TIMER : 0))
53 #define AER_PHYSICAL_LAYER_ERROR 0
54 #define AER_DATA_LINK_LAYER_ERROR 1
55 #define AER_TRANSACTION_LAYER_ERROR 2
57 #define AER_GET_LAYER_ERROR(t, e) \
58 ((e & AER_PHYSICAL_LAYER_ERROR_MASK) ? \
59 AER_PHYSICAL_LAYER_ERROR : \
60 (e & AER_DATA_LINK_LAYER_ERROR_MASK(t, e)) ? \
61 AER_DATA_LINK_LAYER_ERROR : \
62 AER_TRANSACTION_LAYER_ERROR)
64 #define AER_PR(info, fmt, args...) \
65 printk("%s" fmt, (info->severity == AER_CORRECTABLE) ? \
66 KERN_WARNING : KERN_ERR, ## args)
71 static char *aer_error_severity_string[] = {
72 "Uncorrected (Non-Fatal)",
73 "Uncorrected (Fatal)",
77 static char *aer_error_layer[] = {
82 static char *aer_correctable_error_string[] = {
83 "Receiver Error ", /* Bit Position 0 */
89 "Bad TLP ", /* Bit Position 6 */
90 "Bad DLLP ", /* Bit Position 7 */
91 "RELAY_NUM Rollover ", /* Bit Position 8 */
95 "Replay Timer Timeout ", /* Bit Position 12 */
96 "Advisory Non-Fatal ", /* Bit Position 13 */
117 static char *aer_uncorrectable_error_string[] = {
122 "Data Link Protocol ", /* Bit Position 4 */
130 "Poisoned TLP ", /* Bit Position 12 */
131 "Flow Control Protocol ", /* Bit Position 13 */
132 "Completion Timeout ", /* Bit Position 14 */
133 "Completer Abort ", /* Bit Position 15 */
134 "Unexpected Completion ", /* Bit Position 16 */
135 "Receiver Overflow ", /* Bit Position 17 */
136 "Malformed TLP ", /* Bit Position 18 */
137 "ECRC ", /* Bit Position 19 */
138 "Unsupported Request ", /* Bit Position 20 */
152 static char *aer_agent_string[] = {
159 static char *aer_get_error_source_name(int severity,
166 for (i = 0; i < 32; i++) {
167 if (!(status & (1 << i)))
170 if (severity == AER_CORRECTABLE)
171 errmsg = aer_correctable_error_string[i];
173 errmsg = aer_uncorrectable_error_string[i];
176 sprintf(errmsg_buff, "Unknown Error Bit %2d ", i);
177 errmsg = errmsg_buff;
186 static DEFINE_SPINLOCK(logbuf_lock);
187 static char errmsg_buff[100];
188 void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
191 int err_layer, agent;
193 AER_PR(info, "+------ PCI-Express Device Error ------+\n");
194 AER_PR(info, "Error Severity\t\t: %s\n",
195 aer_error_severity_string[info->severity]);
197 if (info->status == 0) {
198 AER_PR(info, "PCIE Bus Error type\t: (Unaccessible)\n");
199 AER_PR(info, "Unaccessible Received\t: %s\n",
200 info->flags & AER_MULTI_ERROR_VALID_FLAG ?
201 "Multiple" : "First");
202 AER_PR(info, "Unregistered Agent ID\t: %04x\n",
203 (dev->bus->number << 8) | dev->devfn);
205 err_layer = AER_GET_LAYER_ERROR(info->severity, info->status);
206 AER_PR(info, "PCIE Bus Error type\t: %s\n",
207 aer_error_layer[err_layer]);
209 spin_lock(&logbuf_lock);
210 errmsg = aer_get_error_source_name(info->severity,
213 AER_PR(info, "%s\t: %s\n", errmsg,
214 info->flags & AER_MULTI_ERROR_VALID_FLAG ?
215 "Multiple" : "First");
216 spin_unlock(&logbuf_lock);
218 agent = AER_GET_AGENT(info->severity, info->status);
219 AER_PR(info, "%s\t\t: %04x\n",
220 aer_agent_string[agent],
221 (dev->bus->number << 8) | dev->devfn);
223 AER_PR(info, "VendorID=%04xh, DeviceID=%04xh,"
224 " Bus=%02xh, Device=%02xh, Function=%02xh\n",
228 PCI_SLOT(dev->devfn),
229 PCI_FUNC(dev->devfn));
231 if (info->flags & AER_TLP_HEADER_VALID_FLAG) {
232 unsigned char *tlp = (unsigned char *) &info->tlp;
233 AER_PR(info, "TLP Header:\n");
234 AER_PR(info, "%02x%02x%02x%02x %02x%02x%02x%02x"
235 " %02x%02x%02x%02x %02x%02x%02x%02x\n",
236 *(tlp + 3), *(tlp + 2), *(tlp + 1), *tlp,
237 *(tlp + 7), *(tlp + 6), *(tlp + 5), *(tlp + 4),
238 *(tlp + 11), *(tlp + 10), *(tlp + 9),
239 *(tlp + 8), *(tlp + 15), *(tlp + 14),
240 *(tlp + 13), *(tlp + 12));