Merge branches 'pci/aer' and 'pci/virtualization' into next
* pci/aer: PCI/AER: Rename PCI_ERR_UNC_TRAIN to PCI_ERR_UNC_UND PCI/AER: Add additional PCIe AER error strings trace, RAS: Add additional PCIe AER error strings trace, RAS: Replace bare numbers with #defines for PCIe AER error strings * pci/virtualization: PCI: Add ACS quirk for Intel 10G NICs
This commit is contained in:
commit
cc0cb67adb
|
@ -89,15 +89,17 @@ static const char *aer_correctable_error_string[] = {
|
||||||
NULL,
|
NULL,
|
||||||
"Replay Timer Timeout", /* Bit Position 12 */
|
"Replay Timer Timeout", /* Bit Position 12 */
|
||||||
"Advisory Non-Fatal", /* Bit Position 13 */
|
"Advisory Non-Fatal", /* Bit Position 13 */
|
||||||
|
"Corrected Internal Error", /* Bit Position 14 */
|
||||||
|
"Header Log Overflow", /* Bit Position 15 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *aer_uncorrectable_error_string[] = {
|
static const char *aer_uncorrectable_error_string[] = {
|
||||||
NULL,
|
"Undefined", /* Bit Position 0 */
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
"Data Link Protocol", /* Bit Position 4 */
|
"Data Link Protocol", /* Bit Position 4 */
|
||||||
NULL,
|
"Surprise Down Error", /* Bit Position 5 */
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -113,6 +115,11 @@ static const char *aer_uncorrectable_error_string[] = {
|
||||||
"Malformed TLP", /* Bit Position 18 */
|
"Malformed TLP", /* Bit Position 18 */
|
||||||
"ECRC", /* Bit Position 19 */
|
"ECRC", /* Bit Position 19 */
|
||||||
"Unsupported Request", /* Bit Position 20 */
|
"Unsupported Request", /* Bit Position 20 */
|
||||||
|
"ACS Violation", /* Bit Position 21 */
|
||||||
|
"Uncorrectable Internal Error", /* Bit Position 22 */
|
||||||
|
"MC Blocked TLP", /* Bit Position 23 */
|
||||||
|
"AtomicOp Egress Blocked", /* Bit Position 24 */
|
||||||
|
"TLP Prefix Blocked Error", /* Bit Position 25 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *aer_agent_string[] = {
|
static const char *aer_agent_string[] = {
|
||||||
|
|
|
@ -3635,14 +3635,16 @@ static int pci_quirk_intel_pch_acs(struct pci_dev *dev, u16 acs_flags)
|
||||||
return acs_flags & ~flags ? 0 : 1;
|
return acs_flags & ~flags ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pci_quirk_solarflare_acs(struct pci_dev *dev, u16 acs_flags)
|
static int pci_quirk_mf_endpoint_acs(struct pci_dev *dev, u16 acs_flags)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* SV, TB, and UF are not relevant to multifunction endpoints.
|
* SV, TB, and UF are not relevant to multifunction endpoints.
|
||||||
*
|
*
|
||||||
* Solarflare indicates that peer-to-peer between functions is not
|
* Multifunction devices are only required to implement RR, CR, and DT
|
||||||
* possible, therefore RR, CR, and DT are not implemented. Mask
|
* in their ACS capability if they support peer-to-peer transactions.
|
||||||
* these out as if they were clear in the ACS capabilities register.
|
* Devices matching this quirk have been verified by the vendor to not
|
||||||
|
* perform peer-to-peer with other functions, allowing us to mask out
|
||||||
|
* these bits as if they were unimplemented in the ACS capability.
|
||||||
*/
|
*/
|
||||||
acs_flags &= ~(PCI_ACS_SV | PCI_ACS_TB | PCI_ACS_RR |
|
acs_flags &= ~(PCI_ACS_SV | PCI_ACS_TB | PCI_ACS_RR |
|
||||||
PCI_ACS_CR | PCI_ACS_UF | PCI_ACS_DT);
|
PCI_ACS_CR | PCI_ACS_UF | PCI_ACS_DT);
|
||||||
|
@ -3661,8 +3663,28 @@ static const struct pci_dev_acs_enabled {
|
||||||
{ PCI_VENDOR_ID_ATI, 0x439d, pci_quirk_amd_sb_acs },
|
{ PCI_VENDOR_ID_ATI, 0x439d, pci_quirk_amd_sb_acs },
|
||||||
{ PCI_VENDOR_ID_ATI, 0x4384, pci_quirk_amd_sb_acs },
|
{ PCI_VENDOR_ID_ATI, 0x4384, pci_quirk_amd_sb_acs },
|
||||||
{ PCI_VENDOR_ID_ATI, 0x4399, pci_quirk_amd_sb_acs },
|
{ PCI_VENDOR_ID_ATI, 0x4399, pci_quirk_amd_sb_acs },
|
||||||
{ PCI_VENDOR_ID_SOLARFLARE, 0x0903, pci_quirk_solarflare_acs },
|
{ PCI_VENDOR_ID_SOLARFLARE, 0x0903, pci_quirk_mf_endpoint_acs },
|
||||||
{ PCI_VENDOR_ID_SOLARFLARE, 0x0923, pci_quirk_solarflare_acs },
|
{ PCI_VENDOR_ID_SOLARFLARE, 0x0923, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10C6, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10DB, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10DD, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10E1, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10F1, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10F7, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10F8, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10F9, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10FA, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10FB, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x10FC, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x1507, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x1514, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x151C, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x1529, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x152A, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x154D, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x154F, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x1551, pci_quirk_mf_endpoint_acs },
|
||||||
|
{ PCI_VENDOR_ID_INTEL, 0x1558, pci_quirk_mf_endpoint_acs },
|
||||||
{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_pch_acs },
|
{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_pch_acs },
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
|
@ -727,7 +727,7 @@ static int __init init_pci_ext_cap_err_perm(struct perm_bits *perm)
|
||||||
p_setd(perm, 0, ALL_VIRT, NO_WRITE);
|
p_setd(perm, 0, ALL_VIRT, NO_WRITE);
|
||||||
|
|
||||||
/* Writable bits mask */
|
/* Writable bits mask */
|
||||||
mask = PCI_ERR_UNC_TRAIN | /* Training */
|
mask = PCI_ERR_UNC_UND | /* Undefined */
|
||||||
PCI_ERR_UNC_DLP | /* Data Link Protocol */
|
PCI_ERR_UNC_DLP | /* Data Link Protocol */
|
||||||
PCI_ERR_UNC_SURPDN | /* Surprise Down */
|
PCI_ERR_UNC_SURPDN | /* Surprise Down */
|
||||||
PCI_ERR_UNC_POISON_TLP | /* Poisoned TLP */
|
PCI_ERR_UNC_POISON_TLP | /* Poisoned TLP */
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <linux/tracepoint.h>
|
#include <linux/tracepoint.h>
|
||||||
#include <linux/edac.h>
|
#include <linux/edac.h>
|
||||||
#include <linux/ktime.h>
|
#include <linux/ktime.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
#include <linux/aer.h>
|
#include <linux/aer.h>
|
||||||
#include <linux/cper.h>
|
#include <linux/cper.h>
|
||||||
|
|
||||||
|
@ -173,25 +174,34 @@ TRACE_EVENT(mc_event,
|
||||||
* u8 severity - error severity 0:NONFATAL 1:FATAL 2:CORRECTED
|
* u8 severity - error severity 0:NONFATAL 1:FATAL 2:CORRECTED
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define aer_correctable_errors \
|
#define aer_correctable_errors \
|
||||||
{BIT(0), "Receiver Error"}, \
|
{PCI_ERR_COR_RCVR, "Receiver Error"}, \
|
||||||
{BIT(6), "Bad TLP"}, \
|
{PCI_ERR_COR_BAD_TLP, "Bad TLP"}, \
|
||||||
{BIT(7), "Bad DLLP"}, \
|
{PCI_ERR_COR_BAD_DLLP, "Bad DLLP"}, \
|
||||||
{BIT(8), "RELAY_NUM Rollover"}, \
|
{PCI_ERR_COR_REP_ROLL, "RELAY_NUM Rollover"}, \
|
||||||
{BIT(12), "Replay Timer Timeout"}, \
|
{PCI_ERR_COR_REP_TIMER, "Replay Timer Timeout"}, \
|
||||||
{BIT(13), "Advisory Non-Fatal"}
|
{PCI_ERR_COR_ADV_NFAT, "Advisory Non-Fatal Error"}, \
|
||||||
|
{PCI_ERR_COR_INTERNAL, "Corrected Internal Error"}, \
|
||||||
|
{PCI_ERR_COR_LOG_OVER, "Header Log Overflow"}
|
||||||
|
|
||||||
#define aer_uncorrectable_errors \
|
#define aer_uncorrectable_errors \
|
||||||
{BIT(4), "Data Link Protocol"}, \
|
{PCI_ERR_UNC_UND, "Undefined"}, \
|
||||||
{BIT(12), "Poisoned TLP"}, \
|
{PCI_ERR_UNC_DLP, "Data Link Protocol Error"}, \
|
||||||
{BIT(13), "Flow Control Protocol"}, \
|
{PCI_ERR_UNC_SURPDN, "Surprise Down Error"}, \
|
||||||
{BIT(14), "Completion Timeout"}, \
|
{PCI_ERR_UNC_POISON_TLP,"Poisoned TLP"}, \
|
||||||
{BIT(15), "Completer Abort"}, \
|
{PCI_ERR_UNC_FCP, "Flow Control Protocol Error"}, \
|
||||||
{BIT(16), "Unexpected Completion"}, \
|
{PCI_ERR_UNC_COMP_TIME, "Completion Timeout"}, \
|
||||||
{BIT(17), "Receiver Overflow"}, \
|
{PCI_ERR_UNC_COMP_ABORT,"Completer Abort"}, \
|
||||||
{BIT(18), "Malformed TLP"}, \
|
{PCI_ERR_UNC_UNX_COMP, "Unexpected Completion"}, \
|
||||||
{BIT(19), "ECRC"}, \
|
{PCI_ERR_UNC_RX_OVER, "Receiver Overflow"}, \
|
||||||
{BIT(20), "Unsupported Request"}
|
{PCI_ERR_UNC_MALF_TLP, "Malformed TLP"}, \
|
||||||
|
{PCI_ERR_UNC_ECRC, "ECRC Error"}, \
|
||||||
|
{PCI_ERR_UNC_UNSUP, "Unsupported Request Error"}, \
|
||||||
|
{PCI_ERR_UNC_ACSV, "ACS Violation"}, \
|
||||||
|
{PCI_ERR_UNC_INTN, "Uncorrectable Internal Error"},\
|
||||||
|
{PCI_ERR_UNC_MCBTLP, "MC Blocked TLP"}, \
|
||||||
|
{PCI_ERR_UNC_ATOMEG, "AtomicOp Egress Blocked"}, \
|
||||||
|
{PCI_ERR_UNC_TLPPRE, "TLP Prefix Blocked Error"}
|
||||||
|
|
||||||
TRACE_EVENT(aer_event,
|
TRACE_EVENT(aer_event,
|
||||||
TP_PROTO(const char *dev_name,
|
TP_PROTO(const char *dev_name,
|
||||||
|
|
|
@ -631,7 +631,7 @@
|
||||||
|
|
||||||
/* Advanced Error Reporting */
|
/* Advanced Error Reporting */
|
||||||
#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */
|
#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */
|
||||||
#define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */
|
#define PCI_ERR_UNC_UND 0x00000001 /* Undefined */
|
||||||
#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */
|
#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */
|
||||||
#define PCI_ERR_UNC_SURPDN 0x00000020 /* Surprise Down */
|
#define PCI_ERR_UNC_SURPDN 0x00000020 /* Surprise Down */
|
||||||
#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */
|
#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */
|
||||||
|
|
Loading…
Reference in New Issue