xref: /rk3399_rockchip-uboot/drivers/pci/aer.c (revision 5e32deca3bc8bc63abc444c9638cb2b175e71e35)
1 /*
2  * PCI AER infomation display library
3  *
4  * Author: Shawn Lin <shawn.lin@rock-chips.com>
5  *
6  * Copyright 2025 Rockchip Co., Ltd.
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <pci.h>
13 #include <errno.h>
14 #include <dm/device.h>
15 
16 /**
17  * pci_aer_dump - Parse and print AER information in a human-readable format
18  * @dev: PCI device
19  *
20  * Return: 0 on success, negative error code on failure.
21  */
22 int pci_aer_dump(struct udevice *udev, pci_dev_t dev)
23 {
24 	int aer_cap_ptr;
25 	u32 aer_status, aer_mask, aer_severity;
26 	u32 aer_capabilities;
27 	struct dm_pci_ops *ops;
28 	struct udevice *bus;
29 
30 	/* Find the AER Capability */
31 	aer_cap_ptr = dm_pci_find_ext_capability(udev, PCI_EXT_CAP_ID_ERR);
32 	if (!aer_cap_ptr) {
33 		printf("AER Capability not found for device %04x:%04x\n",
34 			   PCI_BUS(dev), PCI_DEV(dev));
35 		return -ENODEV;
36 	}
37 
38 	/* Read AER-related registers */
39 	dm_pci_read_config32(udev, aer_cap_ptr + PCI_AER_STATUS, &aer_status);
40 	dm_pci_read_config32(udev, aer_cap_ptr + PCI_AER_MASK, &aer_mask);
41 	dm_pci_read_config32(udev, aer_cap_ptr + PCI_AER_SEVERITY, &aer_severity);
42 	dm_pci_read_config32(udev, aer_cap_ptr + 0x18, &aer_capabilities); /* AER Capabilities Register */
43 
44 	/* Print AER Capability information */
45 	printf("AER Capability found at offset 0x%x\n", aer_cap_ptr);
46 
47 	/* Print Uncorrectable Error Status (UES) */
48 	printf("  UESta:  ");
49 	printf("DLP-%c ",  (aer_status & (1 << 0))  ? '+' : '-');
50 	printf("SDES-%c ", (aer_status & (1 << 1))  ? '+' : '-');
51 	printf("TLP-%c ",  (aer_status & (1 << 2))  ? '+' : '-');
52 	printf("FCP-%c ",  (aer_status & (1 << 3))  ? '+' : '-');
53 	printf("CmpltTO-%c ", (aer_status & (1 << 4))  ? '+' : '-');
54 	printf("CmpltAbrt-%c ", (aer_status & (1 << 5))  ? '+' : '-');
55 	printf("UnxCmplt-%c ", (aer_status & (1 << 6))  ? '+' : '-');
56 	printf("RxOF-%c ", (aer_status & (1 << 7))  ? '+' : '-');
57 	printf("MalfTLP-%c ", (aer_status & (1 << 8))  ? '+' : '-');
58 	printf("ECRC-%c ", (aer_status & (1 << 9))  ? '+' : '-');
59 	printf("UnsupReq-%c ", (aer_status & (1 << 10)) ? '+' : '-');
60 	printf("ACSViol-%c\n", (aer_status & (1 << 11)) ? '+' : '-');
61 
62 	/* Print Uncorrectable Error Mask (UEMsk) */
63 	printf("  UEMsk:  ");
64 	printf("DLP-%c ",  (aer_mask & (1 << 0))  ? '+' : '-');
65 	printf("SDES-%c ", (aer_mask & (1 << 1))  ? '+' : '-');
66 	printf("TLP-%c ",  (aer_mask & (1 << 2))  ? '+' : '-');
67 	printf("FCP-%c ",  (aer_mask & (1 << 3))  ? '+' : '-');
68 	printf("CmpltTO-%c ", (aer_mask & (1 << 4))  ? '+' : '-');
69 	printf("CmpltAbrt-%c ", (aer_mask & (1 << 5))  ? '+' : '-');
70 	printf("UnxCmplt-%c ", (aer_mask & (1 << 6))  ? '+' : '-');
71 	printf("RxOF-%c ", (aer_mask & (1 << 7))  ? '+' : '-');
72 	printf("MalfTLP-%c ", (aer_mask & (1 << 8))  ? '+' : '-');
73 	printf("ECRC-%c ", (aer_mask & (1 << 9))  ? '+' : '-');
74 	printf("UnsupReq-%c ", (aer_mask & (1 << 10)) ? '+' : '-');
75 	printf("ACSViol-%c\n", (aer_mask & (1 << 11)) ? '+' : '-');
76 
77 	/* Print Uncorrectable Error Severity (UESvrt) */
78 	printf("  UESvrt: ");
79 	printf("DLP%c ",  (aer_severity & (1 << 0))  ? '+' : '-');
80 	printf("SDES%c ", (aer_severity & (1 << 1))  ? '+' : '-');
81 	printf("TLP%c ",  (aer_severity & (1 << 2))  ? '+' : '-');
82 	printf("FCP%c ",  (aer_severity & (1 << 3))  ? '+' : '-');
83 	printf("CmpltTO%c ", (aer_severity & (1 << 4))  ? '+' : '-');
84 	printf("CmpltAbrt%c ", (aer_severity & (1 << 5))  ? '+' : '-');
85 	printf("UnxCmplt%c ", (aer_severity & (1 << 6))  ? '+' : '-');
86 	printf("RxOF%c ", (aer_severity & (1 << 7))  ? '+' : '-');
87 	printf("MalfTLP%c ", (aer_severity & (1 << 8))  ? '+' : '-');
88 	printf("ECRC%c ", (aer_severity & (1 << 9))  ? '+' : '-');
89 	printf("UnsupReq%c ", (aer_severity & (1 << 10)) ? '+' : '-');
90 	printf("ACSViol%c\n", (aer_severity & (1 << 11)) ? '+' : '-');
91 
92 	/* Print Correctable Error Status (CESta) */
93 	printf("  CESta:  ");
94 	printf("RxErr-%c ",  (aer_status & (1 << 12)) ? '+' : '-');
95 	printf("BadTLP-%c ", (aer_status & (1 << 13)) ? '+' : '-');
96 	printf("BadDLLP-%c ", (aer_status & (1 << 14)) ? '+' : '-');
97 	printf("Rollover-%c ", (aer_status & (1 << 15)) ? '+' : '-');
98 	printf("Timeout-%c ", (aer_status & (1 << 16)) ? '+' : '-');
99 	printf("NonFatalErr-%c\n", (aer_status & (1 << 17)) ? '+' : '-');
100 
101 	/* Print Correctable Error Mask (CEMsk) */
102 	printf("  CEMsk:  ");
103 	printf("RxErr-%c ",  (aer_mask & (1 << 12)) ? '+' : '-');
104 	printf("BadTLP-%c ", (aer_mask & (1 << 13)) ? '+' : '-');
105 	printf("BadDLLP-%c ", (aer_mask & (1 << 14)) ? '+' : '-');
106 	printf("Rollover-%c ", (aer_mask & (1 << 15)) ? '+' : '-');
107 	printf("Timeout-%c ", (aer_mask & (1 << 16)) ? '+' : '-');
108 	printf("NonFatalErr-%c\n", (aer_mask & (1 << 17)) ? '+' : '-');
109 
110 	/* Print AER Capabilities (AERCap) */
111 	printf("  AERCap: ");
112 	printf("First Error Pointer: %02x, ", (aer_capabilities >> 0) & 0x1F);
113 	printf("GenCap%c ", (aer_capabilities & (1 << 5)) ? '+' : '-');
114 	printf("CGenEn%c ", (aer_capabilities & (1 << 6)) ? '+' : '-');
115 	printf("ChkCap%c ", (aer_capabilities & (1 << 7)) ? '+' : '-');
116 	printf("ChkEn%c\n", (aer_capabilities & (1 << 8)) ? '+' : '-');
117 
118 	for (bus = udev; device_is_on_pci_bus(bus);)
119 		bus = bus->parent;
120 
121 	ops = pci_get_ops(bus);
122 	if (ops->vendor_aer_dump)
123 		return ops->vendor_aer_dump(bus);
124 
125 	return 0;
126 }
127