aerdrv_errprint.c 5.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * drivers/pci/pcie/aer/aerdrv_errprint.c
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Format error messages and print them to console.
 *
 * Copyright (C) 2006 Intel Corp.
 *	Tom Long Nguyen (tom.l.nguyen@intel.com)
 *	Zhang Yanmin (yanmin.zhang@intel.com)
 *
 */

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/pm.h>
#include <linux/suspend.h>

#include "aerdrv.h"

#define AER_AGENT_RECEIVER		0
#define AER_AGENT_REQUESTER		1
#define AER_AGENT_COMPLETER		2
#define AER_AGENT_TRANSMITTER		3

30 31 32 33 34 35
#define AER_AGENT_REQUESTER_MASK(t)	((t == AER_CORRECTABLE) ?	\
	0 : (PCI_ERR_UNC_COMP_TIME|PCI_ERR_UNC_UNSUP))
#define AER_AGENT_COMPLETER_MASK(t)	((t == AER_CORRECTABLE) ?	\
	0 : PCI_ERR_UNC_COMP_ABORT)
#define AER_AGENT_TRANSMITTER_MASK(t)	((t == AER_CORRECTABLE) ?	\
	(PCI_ERR_COR_REP_ROLL|PCI_ERR_COR_REP_TIMER) : 0)
36 37

#define AER_GET_AGENT(t, e)						\
38 39 40
	((e & AER_AGENT_COMPLETER_MASK(t)) ? AER_AGENT_COMPLETER :	\
	(e & AER_AGENT_REQUESTER_MASK(t)) ? AER_AGENT_REQUESTER :	\
	(e & AER_AGENT_TRANSMITTER_MASK(t)) ? AER_AGENT_TRANSMITTER :	\
41 42 43 44 45 46
	AER_AGENT_RECEIVER)

#define AER_PHYSICAL_LAYER_ERROR	0
#define AER_DATA_LINK_LAYER_ERROR	1
#define AER_TRANSACTION_LAYER_ERROR	2

47 48 49 50 51 52 53 54 55 56 57 58
#define AER_PHYSICAL_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ?	\
	PCI_ERR_COR_RCVR : 0)
#define AER_DATA_LINK_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ?	\
	(PCI_ERR_COR_BAD_TLP|						\
	PCI_ERR_COR_BAD_DLLP|						\
	PCI_ERR_COR_REP_ROLL|						\
	PCI_ERR_COR_REP_TIMER) : PCI_ERR_UNC_DLP)

#define AER_GET_LAYER_ERROR(t, e)					\
	((e & AER_PHYSICAL_LAYER_ERROR_MASK(t)) ? AER_PHYSICAL_LAYER_ERROR : \
	(e & AER_DATA_LINK_LAYER_ERROR_MASK(t)) ? AER_DATA_LINK_LAYER_ERROR : \
	AER_TRANSACTION_LAYER_ERROR)
59

60 61 62 63
#define AER_PR(info, pdev, fmt, args...)				\
	printk("%s%s %s: " fmt, (info->severity == AER_CORRECTABLE) ?	\
		KERN_WARNING : KERN_ERR, dev_driver_string(&pdev->dev),	\
		dev_name(&pdev->dev), ## args)
64

65 66 67
/*
 * AER error strings
 */
68
static char *aer_error_severity_string[] = {
69 70 71 72 73
	"Uncorrected (Non-Fatal)",
	"Uncorrected (Fatal)",
	"Corrected"
};

74
static char *aer_error_layer[] = {
75 76 77 78
	"Physical Layer",
	"Data Link Layer",
	"Transaction Layer"
};
79 80
static char *aer_correctable_error_string[] = {
	"Receiver Error        ",	/* Bit Position 0	*/
81 82 83 84 85
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
86 87 88
	"Bad TLP               ",	/* Bit Position 6	*/
	"Bad DLLP              ",	/* Bit Position 7	*/
	"RELAY_NUM Rollover    ",	/* Bit Position 8	*/
89 90 91
	NULL,
	NULL,
	NULL,
92 93
	"Replay Timer Timeout  ",	/* Bit Position 12	*/
	"Advisory Non-Fatal    ",	/* Bit Position 13	*/
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
};

114
static char *aer_uncorrectable_error_string[] = {
115 116 117 118 119 120 121 122 123 124 125 126
	NULL,
	NULL,
	NULL,
	NULL,
	"Data Link Protocol    ",	/* Bit Position 4	*/
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
127
	"Poisoned TLP          ",	/* Bit Position 12	*/
128
	"Flow Control Protocol ",	/* Bit Position 13	*/
129 130
	"Completion Timeout    ",	/* Bit Position 14	*/
	"Completer Abort       ",	/* Bit Position 15	*/
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
	"Unexpected Completion ",	/* Bit Position 16	*/
	"Receiver Overflow     ",	/* Bit Position 17	*/
	"Malformed TLP         ",	/* Bit Position 18	*/
	"ECRC                  ",	/* Bit Position 19	*/
	"Unsupported Request   ",	/* Bit Position 20	*/
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
};

149
static char *aer_agent_string[] = {
150 151 152 153 154 155
	"Receiver ID",
	"Requester ID",
	"Completer ID",
	"Transmitter ID"
};

156
static void __aer_print_error(struct aer_err_info *info, struct pci_dev *dev)
157
{
158
	int i, status;
159
	char *errmsg = NULL;
160

161 162
	status = (info->status & ~info->mask);

163
	for (i = 0; i < 32; i++) {
164
		if (!(status & (1 << i)))
165 166
			continue;

167
		if (info->severity == AER_CORRECTABLE)
168 169 170 171
			errmsg = aer_correctable_error_string[i];
		else
			errmsg = aer_uncorrectable_error_string[i];

172
		if (errmsg)
173 174
			AER_PR(info, dev, "   [%2d] %s%s\n", i, errmsg,
				info->first_error == i ? " (First)" : "");
175
		else
176 177
			AER_PR(info, dev, "   [%2d] Unknown Error Bit%s\n", i,
				info->first_error == i ? " (First)" : "");
178 179 180 181 182
	}
}

void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
{
183
	int id = ((dev->bus->number << 8) | dev->devfn);
184

185
	if (info->status == 0) {
186 187 188 189
		AER_PR(info, dev,
			"PCIE Bus Error: severity=%s, type=Unaccessible, "
			"id=%04x(Unregistered Agent ID)\n",
			aer_error_severity_string[info->severity], id);
190
	} else {
191
		int layer, agent;
192

193
		layer = AER_GET_LAYER_ERROR(info->severity, info->status);
194 195
		agent = AER_GET_AGENT(info->severity, info->status);

196 197 198 199 200 201 202 203 204 205
		AER_PR(info, dev,
			"PCIE Bus Error: severity=%s, type=%s, id=%04x(%s)\n",
			aer_error_severity_string[info->severity],
			aer_error_layer[layer], id, aer_agent_string[agent]);

		AER_PR(info, dev,
			"  device [%04x:%04x] error status/mask=%08x/%08x\n",
			dev->vendor, dev->device, info->status, info->mask);

		__aer_print_error(info, dev);
206

H
Hidetoshi Seto 已提交
207
		if (info->tlp_header_valid) {
208
			unsigned char *tlp = (unsigned char *) &info->tlp;
209 210
			AER_PR(info, dev, "  TLP Header:"
				" %02x%02x%02x%02x %02x%02x%02x%02x"
211 212 213 214 215 216 217 218
				" %02x%02x%02x%02x %02x%02x%02x%02x\n",
				*(tlp + 3), *(tlp + 2), *(tlp + 1), *tlp,
				*(tlp + 7), *(tlp + 6), *(tlp + 5), *(tlp + 4),
				*(tlp + 11), *(tlp + 10), *(tlp + 9),
				*(tlp + 8), *(tlp + 15), *(tlp + 14),
				*(tlp + 13), *(tlp + 12));
		}
	}
219 220

	if (info->id && info->error_dev_num > 1 && info->id == id)
221 222 223 224 225 226 227 228 229
		AER_PR(info, dev,
			"  Error of this Agent(%04x) is reported first\n", id);
}

void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)
{
	dev_info(&dev->dev, "AER: %s%s error received: id=%04x\n",
		info->multi_error_valid ? "Multiple " : "",
		aer_error_severity_string[info->severity], info->id);
230
}