Mention branches and keyring.
[releases.git] / pcie / rcec.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Root Complex Event Collector Support
4  *
5  * Authors:
6  *  Sean V Kelley <sean.v.kelley@intel.com>
7  *  Qiuxu Zhuo <qiuxu.zhuo@intel.com>
8  *
9  * Copyright (C) 2020 Intel Corp.
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/pci.h>
14 #include <linux/pci_regs.h>
15
16 #include "../pci.h"
17
18 void pci_rcec_init(struct pci_dev *dev)
19 {
20         struct rcec_ea *rcec_ea;
21         u32 rcec, hdr, busn;
22         u8 ver;
23
24         /* Only for Root Complex Event Collectors */
25         if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_EC)
26                 return;
27
28         rcec = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_RCEC);
29         if (!rcec)
30                 return;
31
32         rcec_ea = kzalloc(sizeof(*rcec_ea), GFP_KERNEL);
33         if (!rcec_ea)
34                 return;
35
36         pci_read_config_dword(dev, rcec + PCI_RCEC_RCIEP_BITMAP,
37                               &rcec_ea->bitmap);
38
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);
46         } else {
47                 /* Avoid later ver check by setting nextbusn */
48                 rcec_ea->nextbusn = 0xff;
49                 rcec_ea->lastbusn = 0x00;
50         }
51
52         dev->rcec_ea = rcec_ea;
53 }
54
55 void pci_rcec_exit(struct pci_dev *dev)
56 {
57         kfree(dev->rcec_ea);
58         dev->rcec_ea = NULL;
59 }