1/* 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 30#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) 36 37#define AER_GET_AGENT(t, e) \ 38 ((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 : \ 41 AER_AGENT_RECEIVER) 42 43#define AER_PHYSICAL_LAYER_ERROR 0 44#define AER_DATA_LINK_LAYER_ERROR 1 45#define AER_TRANSACTION_LAYER_ERROR 2 46 47#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) 59 60#define AER_PR(info, pdev, fmt, args...) \ 61 printk("%s%s %s: " fmt, (info->severity == AER_CORRECTABLE) ? \ 62 KERN_WARNING : KERN_ERR, dev_driver_string(&pdev->dev), \ 63 dev_name(&pdev->dev), ## args) 64 65/* 66 * AER error strings 67 */ 68static char *aer_error_severity_string[] = { 69 "Uncorrected (Non-Fatal)", 70 "Uncorrected (Fatal)", 71 "Corrected" 72}; 73 74static char *aer_error_layer[] = { 75 "Physical Layer", 76 "Data Link Layer", 77 "Transaction Layer" 78}; 79static char *aer_correctable_error_string[] = { 80 "Receiver Error ", /* Bit Position 0 */ 81 NULL, 82 NULL, 83 NULL, 84 NULL, 85 NULL, 86 "Bad TLP ", /* Bit Position 6 */ 87 "Bad DLLP ", /* Bit Position 7 */ 88 "RELAY_NUM Rollover ", /* Bit Position 8 */ 89 NULL, 90 NULL, 91 NULL, 92 "Replay Timer Timeout ", /* Bit Position 12 */ 93 "Advisory Non-Fatal ", /* Bit Position 13 */ 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 NULL, 112}; 113 114static char *aer_uncorrectable_error_string[] = { 115 NULL, 116 NULL, 117 NULL, 118 NULL, 119 "Data Link Protocol ", /* Bit Position 4 */ 120 NULL, 121 NULL, 122 NULL, 123 NULL, 124 NULL, 125 NULL, 126 NULL, 127 "Poisoned TLP ", /* Bit Position 12 */ 128 "Flow Control Protocol ", /* Bit Position 13 */ 129 "Completion Timeout ", /* Bit Position 14 */ 130 "Completer Abort ", /* Bit Position 15 */ 131 "Unexpected Completion ", /* Bit Position 16 */ 132 "Receiver Overflow ", /* Bit Position 17 */ 133 "Malformed TLP ", /* Bit Position 18 */ 134 "ECRC ", /* Bit Position 19 */ 135 "Unsupported Request ", /* Bit Position 20 */ 136 NULL, 137 NULL, 138 NULL, 139 NULL, 140 NULL, 141 NULL, 142 NULL, 143 NULL, 144 NULL, 145 NULL, 146 NULL, 147}; 148 149static char *aer_agent_string[] = { 150 "Receiver ID", 151 "Requester ID", 152 "Completer ID", 153 "Transmitter ID" 154}; 155 156static void __aer_print_error(struct aer_err_info *info, struct pci_dev *dev) 157{ 158 int i, status; 159 char *errmsg = NULL; 160 161 status = (info->status & ~info->mask); 162 163 for (i = 0; i < 32; i++) { 164 if (!(status & (1 << i))) 165 continue; 166 167 if (info->severity == AER_CORRECTABLE) 168 errmsg = aer_correctable_error_string[i]; 169 else 170 errmsg = aer_uncorrectable_error_string[i]; 171 172 if (errmsg) 173 AER_PR(info, dev, " [%2d] %s%s\n", i, errmsg, 174 info->first_error == i ? " (First)" : ""); 175 else 176 AER_PR(info, dev, " [%2d] Unknown Error Bit%s\n", i, 177 info->first_error == i ? " (First)" : ""); 178 } 179} 180 181void aer_print_error(struct pci_dev *dev, struct aer_err_info *info) 182{ 183 int id = ((dev->bus->number << 8) | dev->devfn); 184 185 if (info->status == 0) { 186 AER_PR(info, dev, 187 "PCIe Bus Error: severity=%s, type=Unaccessible, " 188 "id=%04x(Unregistered Agent ID)\n", 189 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 agent = AER_GET_AGENT(info->severity, info->status); 195 196 AER_PR(info, dev, 197 "PCIe Bus Error: severity=%s, type=%s, id=%04x(%s)\n", 198 aer_error_severity_string[info->severity], 199 aer_error_layer[layer], id, aer_agent_string[agent]); 200 201 AER_PR(info, dev, 202 " device [%04x:%04x] error status/mask=%08x/%08x\n", 203 dev->vendor, dev->device, info->status, info->mask); 204 205 __aer_print_error(info, dev); 206 207 if (info->tlp_header_valid) { 208 unsigned char *tlp = (unsigned char *) &info->tlp; 209 AER_PR(info, dev, " TLP Header:" 210 " %02x%02x%02x%02x %02x%02x%02x%02x" 211 " %02x%02x%02x%02x %02x%02x%02x%02x\n", 212 *(tlp + 3), *(tlp + 2), *(tlp + 1), *tlp, 213 *(tlp + 7), *(tlp + 6), *(tlp + 5), *(tlp + 4), 214 *(tlp + 11), *(tlp + 10), *(tlp + 9), 215 *(tlp + 8), *(tlp + 15), *(tlp + 14), 216 *(tlp + 13), *(tlp + 12)); 217 } 218 } 219 220 if (info->id && info->error_dev_num > 1 && info->id == id) 221 AER_PR(info, dev, 222 " Error of this Agent(%04x) is reported first\n", id); 223} 224 225void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info) 226{ 227 dev_info(&dev->dev, "AER: %s%s error received: id=%04x\n", 228 info->multi_error_valid ? "Multiple " : "", 229 aer_error_severity_string[info->severity], info->id); 230} 231