diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/access.c | 22 | ||||
-rw-r--r-- | lib/caps.c | 2 | ||||
-rw-r--r-- | lib/dump.c | 3 | ||||
-rw-r--r-- | lib/filter.c | 6 | ||||
-rw-r--r-- | lib/header.h | 13 | ||||
-rw-r--r-- | lib/internal.h | 1 | ||||
-rw-r--r-- | lib/libpci.ver | 5 | ||||
-rw-r--r-- | lib/pci.h | 6 | ||||
-rw-r--r-- | lib/sysfs.c | 14 |
9 files changed, 55 insertions, 17 deletions
diff --git a/lib/access.c b/lib/access.c index 7d66123..baaabcb 100644 --- a/lib/access.c +++ b/lib/access.c @@ -191,7 +191,7 @@ pci_reset_properties(struct pci_dev *d) } int -pci_fill_info_v38(struct pci_dev *d, int flags) +pci_fill_info_v313(struct pci_dev *d, int flags) { unsigned int uflags = flags; if (uflags & PCI_FILL_RESCAN) @@ -205,21 +205,23 @@ pci_fill_info_v38(struct pci_dev *d, int flags) } /* In version 3.1, pci_fill_info got new flags => versioned alias */ -/* In versions 3.2, 3.3, 3.4, 3.5 and 3.8, the same has happened */ -STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v38(d, flags)); -DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v38); -DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v38); -DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v38); -DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v38); -DEFINE_ALIAS(int pci_fill_info_v34(struct pci_dev *d, int flags), pci_fill_info_v38); -DEFINE_ALIAS(int pci_fill_info_v35(struct pci_dev *d, int flags), pci_fill_info_v38); +/* In versions 3.2, 3.3, 3.4, 3.5, 3.8 and 3.12, the same has happened */ +STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v313(d, flags)); +DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v34(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v35(struct pci_dev *d, int flags), pci_fill_info_v313); +DEFINE_ALIAS(int pci_fill_info_v38(struct pci_dev *d, int flags), pci_fill_info_v313); SYMBOL_VERSION(pci_fill_info_v30, pci_fill_info@LIBPCI_3.0); SYMBOL_VERSION(pci_fill_info_v31, pci_fill_info@LIBPCI_3.1); SYMBOL_VERSION(pci_fill_info_v32, pci_fill_info@LIBPCI_3.2); SYMBOL_VERSION(pci_fill_info_v33, pci_fill_info@LIBPCI_3.3); SYMBOL_VERSION(pci_fill_info_v34, pci_fill_info@LIBPCI_3.4); SYMBOL_VERSION(pci_fill_info_v35, pci_fill_info@LIBPCI_3.5); -SYMBOL_VERSION(pci_fill_info_v38, pci_fill_info@@LIBPCI_3.8); +SYMBOL_VERSION(pci_fill_info_v38, pci_fill_info@LIBPCI_3.8); +SYMBOL_VERSION(pci_fill_info_v313, pci_fill_info@@LIBPCI_3.13); void pci_setup_cache(struct pci_dev *d, byte *cache, int len) @@ -130,7 +130,7 @@ pci_find_cap_nr(struct pci_dev *d, unsigned int id, unsigned int type, unsigned int target = (cap_number ? *cap_number : 0); unsigned int index = 0; - pci_fill_info_v38(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); + pci_fill_info_v313(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); for (c=d->first_cap; c; c=c->next) { @@ -83,7 +83,8 @@ dump_init(struct pci_access *a) mn = 0; if (dump_validate(buf, "##:##.# ") && sscanf(buf, "%x:%x.%d", &bn, &dn, &fn) == 3 || dump_validate(buf, "####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4 || - dump_validate(buf, "#####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4) + dump_validate(buf, "#####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4 || + dump_validate(buf, "######:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4) { dev = pci_get_dev(a, mn, bn, dn, fn); dump_alloc_data(dev, 256); diff --git a/lib/filter.c b/lib/filter.c index 0301f49..4221f57 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -204,20 +204,20 @@ pci_filter_match_v38(struct pci_filter *f, struct pci_dev *d) return 0; if (f->device >= 0 || f->vendor >= 0) { - pci_fill_info_v38(d, PCI_FILL_IDENT); + pci_fill_info_v313(d, PCI_FILL_IDENT); if ((f->device >= 0 && f->device != d->device_id) || (f->vendor >= 0 && f->vendor != d->vendor_id)) return 0; } if (f->device_class >= 0) { - pci_fill_info_v38(d, PCI_FILL_CLASS); + pci_fill_info_v313(d, PCI_FILL_CLASS); if ((f->device_class ^ d->device_class) & f->device_class_mask) return 0; } if (f->prog_if >= 0) { - pci_fill_info_v38(d, PCI_FILL_CLASS_EXT); + pci_fill_info_v313(d, PCI_FILL_CLASS_EXT); if (f->prog_if != d->prog_if) return 0; } diff --git a/lib/header.h b/lib/header.h index 0b0ed9a..0827ac0 100644 --- a/lib/header.h +++ b/lib/header.h @@ -993,6 +993,16 @@ #define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ #define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ #define PCI_ERR_UNC_ACS_VIOL 0x00200000 /* ACS Violation */ +#define PCI_ERR_UNC_INTERNAL 0x00400000 /* Uncorrectable Internal Error */ +#define PCI_ERR_UNC_MC_BLOCKED_TLP 0x00800000 /* MC Blocked TLP */ +#define PCI_ERR_UNC_ATOMICOP_EGRESS_BLOCKED 0x01000000 /* AtomicOp Egress Blocked */ +#define PCI_ERR_UNC_TLP_PREFIX_BLOCKED 0x02000000 /* TLP Prefix Blocked Error */ +#define PCI_ERR_UNC_POISONED_TLP_EGRESS 0x04000000 /* Poisoned TLP Egress Blocked */ +#define PCI_ERR_UNC_DMWR_REQ_EGRESS_BLOCKED 0x08000000 /* DMWr Request Egress Blocked */ +#define PCI_ERR_UNC_IDE_CHECK 0x10000000 /* IDE Check Failed */ +#define PCI_ERR_UNC_MISR_IDE_TLP 0x20000000 /* Misrouted IDE TLP */ +#define PCI_ERR_UNC_PCRC_CHECK 0x40000000 /* PCRC Check Failed */ +#define PCI_ERR_UNC_TLP_XLAT_EGRESS_BLOCKED 0x80000000 /* TLP Translation Egress Blocked */ #define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ /* Same bits as above */ #define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */ @@ -1004,6 +1014,8 @@ #define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ #define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ #define PCI_ERR_COR_REP_ANFE 0x00002000 /* Advisory Non-Fatal Error */ +#define PCI_ERR_COR_INTERNAL 0x00004000 /* Corrected Internal Error */ +#define PCI_ERR_COR_HDRLOG_OVER 0x00008000 /* Header Log Overflow */ #define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */ /* Same bits as above */ #define PCI_ERR_CAP 24 /* Advanced Error Capabilities */ @@ -1464,6 +1476,7 @@ #define PCI_IDE_SEL_CTL_TX_AGGR_PR(x) (((x) >> 4) & 0x3) /* Tx Aggregation Mode PR */ #define PCI_IDE_SEL_CTL_TX_AGGR_CPL(x) (((x) >> 6) & 0x3) /* Tx Aggregation Mode CPL */ #define PCI_IDE_SEL_CTL_PCRC_EN 0x100 /* PCRC Enable */ +#define PCI_IDE_SEL_CTL_CFG_EN 0x200 /* Selective IDE for Configuration Requests Enable */ #define PCI_IDE_SEL_CTL_PART_ENC(x) (((x) >> 10) & 0xf) /* Partial Header Encryption Mode */ #define PCI_IDE_SEL_CTL_ALG(x) (((x) >> 14) & 0x1f) /* Selected Algorithm */ #define PCI_IDE_SEL_CTL_TC(x) (((x) >> 19) & 0x7) /* Traffic Class */ diff --git a/lib/internal.h b/lib/internal.h index 68e9fa0..996b80d 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -104,6 +104,7 @@ int pci_fill_info_v33(struct pci_dev *, int flags) VERSIONED_ABI; int pci_fill_info_v34(struct pci_dev *, int flags) VERSIONED_ABI; int pci_fill_info_v35(struct pci_dev *, int flags) VERSIONED_ABI; int pci_fill_info_v38(struct pci_dev *, int flags) VERSIONED_ABI; +int pci_fill_info_v313(struct pci_dev *, int flags) VERSIONED_ABI; static inline int want_fill(struct pci_dev *d, unsigned want_fields, unsigned int try_fields) { diff --git a/lib/libpci.ver b/lib/libpci.ver index 33ee024..dbcc876 100644 --- a/lib/libpci.ver +++ b/lib/libpci.ver @@ -98,3 +98,8 @@ LIBPCI_3.8 { pci_filter_parse_id; pci_filter_parse_slot; }; + +LIBPCI_3.13 { + global: + pci_fill_info; +}; @@ -18,7 +18,7 @@ #include "header.h" #include "types.h" -#define PCI_LIB_VERSION 0x030c00 +#define PCI_LIB_VERSION 0x030d00 #ifndef PCI_ABI #define PCI_ABI @@ -159,6 +159,9 @@ struct pci_dev { u16 subsys_vendor_id, subsys_id; /* Subsystem vendor id and subsystem id */ struct pci_dev *parent; /* Parent device, does not have to be always accessible */ int no_config_access; /* No access to config space for this device */ + u32 rcd_link_cap; /* Link Capabilities register for Restricted CXL Devices */ + u16 rcd_link_status; /* Link Status register for RCD */ + u16 rcd_link_ctrl; /* Link Control register for RCD */ /* Fields used internally */ struct pci_access *access; @@ -231,6 +234,7 @@ char *pci_get_string_property(struct pci_dev *d, u32 prop) PCI_ABI; #define PCI_FILL_SUBSYS 0x00040000 /* subsys_vendor_id and subsys_id */ #define PCI_FILL_PARENT 0x00080000 #define PCI_FILL_DRIVER 0x00100000 /* OS driver currently in use (string property) */ +#define PCI_FILL_RCD_LNK 0x00200000 /* CXL RCD Link status properties (rcd_*) */ void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI; diff --git a/lib/sysfs.c b/lib/sysfs.c index 0e763dc..7dedc0b 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -2,7 +2,7 @@ * The PCI Library -- Configuration Access via /sys/bus/pci * * Copyright (c) 2003 Matthew Wilcox <matthew@wil.cx> - * Copyright (c) 1997--2023 Martin Mares <mj@ucw.cz> + * Copyright (c) 1997--2024 Martin Mares <mj@ucw.cz> * * Can be freely distributed and used under the terms of the GNU GPL v2+. * @@ -19,6 +19,7 @@ #include <errno.h> #include <dirent.h> #include <fcntl.h> +#include <libgen.h> #include <sys/types.h> #include "internal.h" @@ -483,6 +484,17 @@ sysfs_fill_info(struct pci_dev *d, unsigned int flags) clear_fill(d, PCI_FILL_DRIVER); } + if (want_fill(d, flags, PCI_FILL_RCD_LNK)) + { + char buf[OBJBUFSIZE]; + if (sysfs_get_string(d, "rcd_link_cap", buf, 0)) + d->rcd_link_cap = strtoul(buf, NULL, 16); + if (sysfs_get_string(d, "rcd_link_ctrl", buf, 0)) + d->rcd_link_ctrl = strtoul(buf, NULL, 16); + if (sysfs_get_string(d, "rcd_link_status", buf, 0)) + d->rcd_link_status = strtoul(buf, NULL, 16); + } + pci_generic_fill_info(d, flags); } |