blob: 95c3f1ca80765605695af27ebd99b7a96e53a33c [file] [log] [blame]
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +08001/*
2 * drivers/pci/pcie/aer/aerdrv_errprint.c
3 *
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
6 * for more details.
7 *
8 * Format error messages and print them to console.
9 *
10 * Copyright (C) 2006 Intel Corp.
11 * Tom Long Nguyen (tom.l.nguyen@intel.com)
12 * Zhang Yanmin (yanmin.zhang@intel.com)
13 *
14 */
15
16#include <linux/module.h>
17#include <linux/pci.h>
18#include <linux/kernel.h>
19#include <linux/errno.h>
20#include <linux/pm.h>
21#include <linux/suspend.h>
22
23#include "aerdrv.h"
24
25#define AER_AGENT_RECEIVER 0
26#define AER_AGENT_REQUESTER 1
27#define AER_AGENT_COMPLETER 2
28#define AER_AGENT_TRANSMITTER 3
29
Hidetoshi Setof1585752009-09-07 17:08:59 +090030#define AER_AGENT_REQUESTER_MASK(t) ((t == AER_CORRECTABLE) ? \
31 0 : (PCI_ERR_UNC_COMP_TIME|PCI_ERR_UNC_UNSUP))
32#define AER_AGENT_COMPLETER_MASK(t) ((t == AER_CORRECTABLE) ? \
33 0 : PCI_ERR_UNC_COMP_ABORT)
34#define AER_AGENT_TRANSMITTER_MASK(t) ((t == AER_CORRECTABLE) ? \
35 (PCI_ERR_COR_REP_ROLL|PCI_ERR_COR_REP_TIMER) : 0)
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080036
37#define AER_GET_AGENT(t, e) \
Hidetoshi Setof1585752009-09-07 17:08:59 +090038 ((e & AER_AGENT_COMPLETER_MASK(t)) ? AER_AGENT_COMPLETER : \
39 (e & AER_AGENT_REQUESTER_MASK(t)) ? AER_AGENT_REQUESTER : \
40 (e & AER_AGENT_TRANSMITTER_MASK(t)) ? AER_AGENT_TRANSMITTER : \
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080041 AER_AGENT_RECEIVER)
42
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080043#define AER_PHYSICAL_LAYER_ERROR 0
44#define AER_DATA_LINK_LAYER_ERROR 1
45#define AER_TRANSACTION_LAYER_ERROR 2
46
Hidetoshi Setof1585752009-09-07 17:08:59 +090047#define AER_PHYSICAL_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ? \
48 PCI_ERR_COR_RCVR : 0)
49#define AER_DATA_LINK_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ? \
50 (PCI_ERR_COR_BAD_TLP| \
51 PCI_ERR_COR_BAD_DLLP| \
52 PCI_ERR_COR_REP_ROLL| \
53 PCI_ERR_COR_REP_TIMER) : PCI_ERR_UNC_DLP)
54
55#define AER_GET_LAYER_ERROR(t, e) \
56 ((e & AER_PHYSICAL_LAYER_ERROR_MASK(t)) ? AER_PHYSICAL_LAYER_ERROR : \
57 (e & AER_DATA_LINK_LAYER_ERROR_MASK(t)) ? AER_DATA_LINK_LAYER_ERROR : \
58 AER_TRANSACTION_LAYER_ERROR)
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080059
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +090060#define AER_PR(info, fmt, args...) \
61 printk("%s" fmt, (info->severity == AER_CORRECTABLE) ? \
62 KERN_WARNING : KERN_ERR, ## args)
63
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080064/*
65 * AER error strings
66 */
Hidetoshi Setoc9a91882009-09-07 17:07:29 +090067static char *aer_error_severity_string[] = {
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080068 "Uncorrected (Non-Fatal)",
69 "Uncorrected (Fatal)",
70 "Corrected"
71};
72
Hidetoshi Setoc9a91882009-09-07 17:07:29 +090073static char *aer_error_layer[] = {
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080074 "Physical Layer",
75 "Data Link Layer",
76 "Transaction Layer"
77};
Hidetoshi Setoc9a91882009-09-07 17:07:29 +090078static char *aer_correctable_error_string[] = {
79 "Receiver Error ", /* Bit Position 0 */
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080080 NULL,
81 NULL,
82 NULL,
83 NULL,
84 NULL,
Hidetoshi Setoc9a91882009-09-07 17:07:29 +090085 "Bad TLP ", /* Bit Position 6 */
86 "Bad DLLP ", /* Bit Position 7 */
87 "RELAY_NUM Rollover ", /* Bit Position 8 */
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080088 NULL,
89 NULL,
90 NULL,
Hidetoshi Setoc9a91882009-09-07 17:07:29 +090091 "Replay Timer Timeout ", /* Bit Position 12 */
92 "Advisory Non-Fatal ", /* Bit Position 13 */
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +080093 NULL,
94 NULL,
95 NULL,
96 NULL,
97 NULL,
98 NULL,
99 NULL,
100 NULL,
101 NULL,
102 NULL,
103 NULL,
104 NULL,
105 NULL,
106 NULL,
107 NULL,
108 NULL,
109 NULL,
110 NULL,
111};
112
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900113static char *aer_uncorrectable_error_string[] = {
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800114 NULL,
115 NULL,
116 NULL,
117 NULL,
118 "Data Link Protocol ", /* Bit Position 4 */
119 NULL,
120 NULL,
121 NULL,
122 NULL,
123 NULL,
124 NULL,
125 NULL,
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900126 "Poisoned TLP ", /* Bit Position 12 */
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800127 "Flow Control Protocol ", /* Bit Position 13 */
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900128 "Completion Timeout ", /* Bit Position 14 */
129 "Completer Abort ", /* Bit Position 15 */
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800130 "Unexpected Completion ", /* Bit Position 16 */
131 "Receiver Overflow ", /* Bit Position 17 */
132 "Malformed TLP ", /* Bit Position 18 */
133 "ECRC ", /* Bit Position 19 */
134 "Unsupported Request ", /* Bit Position 20 */
135 NULL,
136 NULL,
137 NULL,
138 NULL,
139 NULL,
140 NULL,
141 NULL,
142 NULL,
143 NULL,
144 NULL,
145 NULL,
146};
147
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900148static char *aer_agent_string[] = {
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800149 "Receiver ID",
150 "Requester ID",
151 "Completer ID",
152 "Transmitter ID"
153};
154
Hidetoshi Seto24dbb7b2009-09-07 17:11:29 +0900155static void aer_print_error_source(struct aer_err_info *info)
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800156{
157 int i;
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900158 char *errmsg = NULL;
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800159
160 for (i = 0; i < 32; i++) {
Hidetoshi Seto24dbb7b2009-09-07 17:11:29 +0900161 if (!(info->status & (1 << i)))
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800162 continue;
163
Hidetoshi Seto24dbb7b2009-09-07 17:11:29 +0900164 if (info->severity == AER_CORRECTABLE)
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800165 errmsg = aer_correctable_error_string[i];
166 else
167 errmsg = aer_uncorrectable_error_string[i];
168
Hidetoshi Seto24dbb7b2009-09-07 17:11:29 +0900169 if (errmsg)
170 AER_PR(info, "%s\t:\n", errmsg);
171 else
172 AER_PR(info, "Unknown Error Bit %2d \t:\n", i);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800173
174 break;
175 }
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800176}
177
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800178void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
179{
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800180 int err_layer, agent;
Hidetoshi Seto0d465f22009-09-07 17:10:40 +0900181 int id = ((dev->bus->number << 8) | dev->devfn);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800182
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +0900183 AER_PR(info, "+------ PCI-Express Device Error ------+\n");
184 AER_PR(info, "Error Severity\t\t: %s\n",
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800185 aer_error_severity_string[info->severity]);
186
Hidetoshi Setoc9a91882009-09-07 17:07:29 +0900187 if (info->status == 0) {
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +0900188 AER_PR(info, "PCIE Bus Error type\t: (Unaccessible)\n");
Hidetoshi Seto0d465f22009-09-07 17:10:40 +0900189 AER_PR(info, "Unregistered Agent ID\t: %04x\n", id);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800190 } else {
191 err_layer = AER_GET_LAYER_ERROR(info->severity, info->status);
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +0900192 AER_PR(info, "PCIE Bus Error type\t: %s\n",
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800193 aer_error_layer[err_layer]);
194
Hidetoshi Seto24dbb7b2009-09-07 17:11:29 +0900195 aer_print_error_source(info);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800196
197 agent = AER_GET_AGENT(info->severity, info->status);
Hidetoshi Seto0d465f22009-09-07 17:10:40 +0900198 AER_PR(info, "%s\t\t: %04x\n", aer_agent_string[agent], id);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800199
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +0900200 AER_PR(info, "VendorID=%04xh, DeviceID=%04xh,"
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800201 " Bus=%02xh, Device=%02xh, Function=%02xh\n",
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800202 dev->vendor,
203 dev->device,
204 dev->bus->number,
205 PCI_SLOT(dev->devfn),
206 PCI_FUNC(dev->devfn));
207
208 if (info->flags & AER_TLP_HEADER_VALID_FLAG) {
209 unsigned char *tlp = (unsigned char *) &info->tlp;
Hidetoshi Setobd8fedd2009-09-07 17:08:14 +0900210 AER_PR(info, "TLP Header:\n");
211 AER_PR(info, "%02x%02x%02x%02x %02x%02x%02x%02x"
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800212 " %02x%02x%02x%02x %02x%02x%02x%02x\n",
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800213 *(tlp + 3), *(tlp + 2), *(tlp + 1), *tlp,
214 *(tlp + 7), *(tlp + 6), *(tlp + 5), *(tlp + 4),
215 *(tlp + 11), *(tlp + 10), *(tlp + 9),
216 *(tlp + 8), *(tlp + 15), *(tlp + 14),
217 *(tlp + 13), *(tlp + 12));
218 }
219 }
Hidetoshi Seto0d465f22009-09-07 17:10:40 +0900220
221 if (info->id && info->error_dev_num > 1 && info->id == id)
222 AER_PR(info, "Error of this Agent(%04x) is reported first\n",
223 id);
Zhang, Yanmin6c2b3742006-07-31 15:21:33 +0800224}