1 // SPDX-License-Identifier: GPL-2.0
3 * Root Complex Event Collector Support
6 * Sean V Kelley <sean.v.kelley@intel.com>
7 * Qiuxu Zhuo <qiuxu.zhuo@intel.com>
9 * Copyright (C) 2020 Intel Corp.
12 #include <linux/kernel.h>
13 #include <linux/pci.h>
14 #include <linux/pci_regs.h>
18 void pci_rcec_init(struct pci_dev *dev)
20 struct rcec_ea *rcec_ea;
24 /* Only for Root Complex Event Collectors */
25 if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_EC)
28 rcec = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_RCEC);
32 rcec_ea = kzalloc(sizeof(*rcec_ea), GFP_KERNEL);
36 pci_read_config_dword(dev, rcec + PCI_RCEC_RCIEP_BITMAP,
39 /* Check whether RCEC BUSN register is present */
40 pci_read_config_dword(dev, rcec, &hdr);
41 ver = PCI_EXT_CAP_VER(hdr);
42 if (ver >= PCI_RCEC_BUSN_REG_VER) {
43 pci_read_config_dword(dev, rcec + PCI_RCEC_BUSN, &busn);
44 rcec_ea->nextbusn = PCI_RCEC_BUSN_NEXT(busn);
45 rcec_ea->lastbusn = PCI_RCEC_BUSN_LAST(busn);
47 /* Avoid later ver check by setting nextbusn */
48 rcec_ea->nextbusn = 0xff;
49 rcec_ea->lastbusn = 0x00;
52 dev->rcec_ea = rcec_ea;
55 void pci_rcec_exit(struct pci_dev *dev)