1 #ifndef LINUX_PCI_ATS_H
2 #define LINUX_PCI_ATS_H
3
4 #include <linux/pci.h>
5
6 /* Address Translation Service */
7 struct pci_ats {
8 int pos; /* capability position */
9 int stu; /* Smallest Translation Unit */
10 int qdep; /* Invalidate Queue Depth */
11 int ref_cnt; /* Physical Function reference count */
12 unsigned int is_enabled:1; /* Enable bit is set */
13 };
14
15 #ifdef CONFIG_PCI_ATS
16
17 extern int pci_enable_ats(struct pci_dev *dev, int ps);
18 extern void pci_disable_ats(struct pci_dev *dev);
19 extern int pci_ats_queue_depth(struct pci_dev *dev);
20
21 /**
22 * pci_ats_enabled - query the ATS status
23 * @dev: the PCI device
24 *
25 * Returns 1 if ATS capability is enabled, or 0 if not.
26 */
pci_ats_enabled(struct pci_dev * dev)27 static inline int pci_ats_enabled(struct pci_dev *dev)
28 {
29 return dev->ats && dev->ats->is_enabled;
30 }
31
32 #else /* CONFIG_PCI_ATS */
33
pci_enable_ats(struct pci_dev * dev,int ps)34 static inline int pci_enable_ats(struct pci_dev *dev, int ps)
35 {
36 return -ENODEV;
37 }
38
pci_disable_ats(struct pci_dev * dev)39 static inline void pci_disable_ats(struct pci_dev *dev)
40 {
41 }
42
pci_ats_queue_depth(struct pci_dev * dev)43 static inline int pci_ats_queue_depth(struct pci_dev *dev)
44 {
45 return -ENODEV;
46 }
47
pci_ats_enabled(struct pci_dev * dev)48 static inline int pci_ats_enabled(struct pci_dev *dev)
49 {
50 return 0;
51 }
52
53 #endif /* CONFIG_PCI_ATS */
54
55 #ifdef CONFIG_PCI_PRI
56
57 extern int pci_enable_pri(struct pci_dev *pdev, u32 reqs);
58 extern void pci_disable_pri(struct pci_dev *pdev);
59 extern bool pci_pri_enabled(struct pci_dev *pdev);
60 extern int pci_reset_pri(struct pci_dev *pdev);
61 extern bool pci_pri_stopped(struct pci_dev *pdev);
62 extern int pci_pri_status(struct pci_dev *pdev);
63
64 #else /* CONFIG_PCI_PRI */
65
pci_enable_pri(struct pci_dev * pdev,u32 reqs)66 static inline int pci_enable_pri(struct pci_dev *pdev, u32 reqs)
67 {
68 return -ENODEV;
69 }
70
pci_disable_pri(struct pci_dev * pdev)71 static inline void pci_disable_pri(struct pci_dev *pdev)
72 {
73 }
74
pci_pri_enabled(struct pci_dev * pdev)75 static inline bool pci_pri_enabled(struct pci_dev *pdev)
76 {
77 return false;
78 }
79
pci_reset_pri(struct pci_dev * pdev)80 static inline int pci_reset_pri(struct pci_dev *pdev)
81 {
82 return -ENODEV;
83 }
84
pci_pri_stopped(struct pci_dev * pdev)85 static inline bool pci_pri_stopped(struct pci_dev *pdev)
86 {
87 return true;
88 }
89
pci_pri_status(struct pci_dev * pdev)90 static inline int pci_pri_status(struct pci_dev *pdev)
91 {
92 return -ENODEV;
93 }
94 #endif /* CONFIG_PCI_PRI */
95
96 #ifdef CONFIG_PCI_PASID
97
98 extern int pci_enable_pasid(struct pci_dev *pdev, int features);
99 extern void pci_disable_pasid(struct pci_dev *pdev);
100 extern int pci_pasid_features(struct pci_dev *pdev);
101 extern int pci_max_pasids(struct pci_dev *pdev);
102
103 #else /* CONFIG_PCI_PASID */
104
pci_enable_pasid(struct pci_dev * pdev,int features)105 static inline int pci_enable_pasid(struct pci_dev *pdev, int features)
106 {
107 return -EINVAL;
108 }
109
pci_disable_pasid(struct pci_dev * pdev)110 static inline void pci_disable_pasid(struct pci_dev *pdev)
111 {
112 }
113
pci_pasid_features(struct pci_dev * pdev)114 static inline int pci_pasid_features(struct pci_dev *pdev)
115 {
116 return -EINVAL;
117 }
118
pci_max_pasids(struct pci_dev * pdev)119 static inline int pci_max_pasids(struct pci_dev *pdev)
120 {
121 return -EINVAL;
122 }
123
124 #endif /* CONFIG_PCI_PASID */
125
126
127 #endif /* LINUX_PCI_ATS_H*/
128