diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/acpi.h | 4 | ||||
-rw-r--r-- | include/linux/amd-iommu.h | 138 | ||||
-rw-r--r-- | include/linux/iommu.h | 33 | ||||
-rw-r--r-- | include/linux/msi.h | 3 | ||||
-rw-r--r-- | include/linux/pci-aspm.h | 4 | ||||
-rw-r--r-- | include/linux/pci.h | 1 | ||||
-rw-r--r-- | include/linux/pci_regs.h | 34 |
7 files changed, 192 insertions, 25 deletions
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 6001b4da39dd..627a3a42e4d8 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -302,6 +302,10 @@ extern bool osc_sb_apei_support_acked; | |||
302 | OSC_PCI_EXPRESS_PME_CONTROL | \ | 302 | OSC_PCI_EXPRESS_PME_CONTROL | \ |
303 | OSC_PCI_EXPRESS_AER_CONTROL | \ | 303 | OSC_PCI_EXPRESS_AER_CONTROL | \ |
304 | OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL) | 304 | OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL) |
305 | |||
306 | #define OSC_PCI_NATIVE_HOTPLUG (OSC_PCI_EXPRESS_NATIVE_HP_CONTROL | \ | ||
307 | OSC_SHPC_NATIVE_HP_CONTROL) | ||
308 | |||
305 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, | 309 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, |
306 | u32 *mask, u32 req); | 310 | u32 *mask, u32 req); |
307 | extern void acpi_early_init(void); | 311 | extern void acpi_early_init(void); |
diff --git a/include/linux/amd-iommu.h b/include/linux/amd-iommu.h index a6863a2dec1f..ef00610837d4 100644 --- a/include/linux/amd-iommu.h +++ b/include/linux/amd-iommu.h | |||
@@ -20,12 +20,148 @@ | |||
20 | #ifndef _ASM_X86_AMD_IOMMU_H | 20 | #ifndef _ASM_X86_AMD_IOMMU_H |
21 | #define _ASM_X86_AMD_IOMMU_H | 21 | #define _ASM_X86_AMD_IOMMU_H |
22 | 22 | ||
23 | #include <linux/irqreturn.h> | 23 | #include <linux/types.h> |
24 | 24 | ||
25 | #ifdef CONFIG_AMD_IOMMU | 25 | #ifdef CONFIG_AMD_IOMMU |
26 | 26 | ||
27 | struct task_struct; | ||
28 | struct pci_dev; | ||
29 | |||
27 | extern int amd_iommu_detect(void); | 30 | extern int amd_iommu_detect(void); |
28 | 31 | ||
32 | |||
33 | /** | ||
34 | * amd_iommu_enable_device_erratum() - Enable erratum workaround for device | ||
35 | * in the IOMMUv2 driver | ||
36 | * @pdev: The PCI device the workaround is necessary for | ||
37 | * @erratum: The erratum workaround to enable | ||
38 | * | ||
39 | * The function needs to be called before amd_iommu_init_device(). | ||
40 | * Possible values for the erratum number are for now: | ||
41 | * - AMD_PRI_DEV_ERRATUM_ENABLE_RESET - Reset PRI capability when PRI | ||
42 | * is enabled | ||
43 | * - AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE - Limit number of outstanding PRI | ||
44 | * requests to one | ||
45 | */ | ||
46 | #define AMD_PRI_DEV_ERRATUM_ENABLE_RESET 0 | ||
47 | #define AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE 1 | ||
48 | |||
49 | extern void amd_iommu_enable_device_erratum(struct pci_dev *pdev, u32 erratum); | ||
50 | |||
51 | /** | ||
52 | * amd_iommu_init_device() - Init device for use with IOMMUv2 driver | ||
53 | * @pdev: The PCI device to initialize | ||
54 | * @pasids: Number of PASIDs to support for this device | ||
55 | * | ||
56 | * This function does all setup for the device pdev so that it can be | ||
57 | * used with IOMMUv2. | ||
58 | * Returns 0 on success or negative value on error. | ||
59 | */ | ||
60 | extern int amd_iommu_init_device(struct pci_dev *pdev, int pasids); | ||
61 | |||
62 | /** | ||
63 | * amd_iommu_free_device() - Free all IOMMUv2 related device resources | ||
64 | * and disable IOMMUv2 usage for this device | ||
65 | * @pdev: The PCI device to disable IOMMUv2 usage for' | ||
66 | */ | ||
67 | extern void amd_iommu_free_device(struct pci_dev *pdev); | ||
68 | |||
69 | /** | ||
70 | * amd_iommu_bind_pasid() - Bind a given task to a PASID on a device | ||
71 | * @pdev: The PCI device to bind the task to | ||
72 | * @pasid: The PASID on the device the task should be bound to | ||
73 | * @task: the task to bind | ||
74 | * | ||
75 | * The function returns 0 on success or a negative value on error. | ||
76 | */ | ||
77 | extern int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid, | ||
78 | struct task_struct *task); | ||
79 | |||
80 | /** | ||
81 | * amd_iommu_unbind_pasid() - Unbind a PASID from its task on | ||
82 | * a device | ||
83 | * @pdev: The device of the PASID | ||
84 | * @pasid: The PASID to unbind | ||
85 | * | ||
86 | * When this function returns the device is no longer using the PASID | ||
87 | * and the PASID is no longer bound to its task. | ||
88 | */ | ||
89 | extern void amd_iommu_unbind_pasid(struct pci_dev *pdev, int pasid); | ||
90 | |||
91 | /** | ||
92 | * amd_iommu_set_invalid_ppr_cb() - Register a call-back for failed | ||
93 | * PRI requests | ||
94 | * @pdev: The PCI device the call-back should be registered for | ||
95 | * @cb: The call-back function | ||
96 | * | ||
97 | * The IOMMUv2 driver invokes this call-back when it is unable to | ||
98 | * successfully handle a PRI request. The device driver can then decide | ||
99 | * which PRI response the device should see. Possible return values for | ||
100 | * the call-back are: | ||
101 | * | ||
102 | * - AMD_IOMMU_INV_PRI_RSP_SUCCESS - Send SUCCESS back to the device | ||
103 | * - AMD_IOMMU_INV_PRI_RSP_INVALID - Send INVALID back to the device | ||
104 | * - AMD_IOMMU_INV_PRI_RSP_FAIL - Send Failure back to the device, | ||
105 | * the device is required to disable | ||
106 | * PRI when it receives this response | ||
107 | * | ||
108 | * The function returns 0 on success or negative value on error. | ||
109 | */ | ||
110 | #define AMD_IOMMU_INV_PRI_RSP_SUCCESS 0 | ||
111 | #define AMD_IOMMU_INV_PRI_RSP_INVALID 1 | ||
112 | #define AMD_IOMMU_INV_PRI_RSP_FAIL 2 | ||
113 | |||
114 | typedef int (*amd_iommu_invalid_ppr_cb)(struct pci_dev *pdev, | ||
115 | int pasid, | ||
116 | unsigned long address, | ||
117 | u16); | ||
118 | |||
119 | extern int amd_iommu_set_invalid_ppr_cb(struct pci_dev *pdev, | ||
120 | amd_iommu_invalid_ppr_cb cb); | ||
121 | |||
122 | /** | ||
123 | * amd_iommu_device_info() - Get information about IOMMUv2 support of a | ||
124 | * PCI device | ||
125 | * @pdev: PCI device to query information from | ||
126 | * @info: A pointer to an amd_iommu_device_info structure which will contain | ||
127 | * the information about the PCI device | ||
128 | * | ||
129 | * Returns 0 on success, negative value on error | ||
130 | */ | ||
131 | |||
132 | #define AMD_IOMMU_DEVICE_FLAG_ATS_SUP 0x1 /* ATS feature supported */ | ||
133 | #define AMD_IOMMU_DEVICE_FLAG_PRI_SUP 0x2 /* PRI feature supported */ | ||
134 | #define AMD_IOMMU_DEVICE_FLAG_PASID_SUP 0x4 /* PASID context supported */ | ||
135 | #define AMD_IOMMU_DEVICE_FLAG_EXEC_SUP 0x8 /* Device may request execution | ||
136 | on memory pages */ | ||
137 | #define AMD_IOMMU_DEVICE_FLAG_PRIV_SUP 0x10 /* Device may request | ||
138 | super-user privileges */ | ||
139 | |||
140 | struct amd_iommu_device_info { | ||
141 | int max_pasids; | ||
142 | u32 flags; | ||
143 | }; | ||
144 | |||
145 | extern int amd_iommu_device_info(struct pci_dev *pdev, | ||
146 | struct amd_iommu_device_info *info); | ||
147 | |||
148 | /** | ||
149 | * amd_iommu_set_invalidate_ctx_cb() - Register a call-back for invalidating | ||
150 | * a pasid context. This call-back is | ||
151 | * invoked when the IOMMUv2 driver needs to | ||
152 | * invalidate a PASID context, for example | ||
153 | * because the task that is bound to that | ||
154 | * context is about to exit. | ||
155 | * | ||
156 | * @pdev: The PCI device the call-back should be registered for | ||
157 | * @cb: The call-back function | ||
158 | */ | ||
159 | |||
160 | typedef void (*amd_iommu_invalidate_ctx)(struct pci_dev *pdev, int pasid); | ||
161 | |||
162 | extern int amd_iommu_set_invalidate_ctx_cb(struct pci_dev *pdev, | ||
163 | amd_iommu_invalidate_ctx cb); | ||
164 | |||
29 | #else | 165 | #else |
30 | 166 | ||
31 | static inline int amd_iommu_detect(void) { return -ENODEV; } | 167 | static inline int amd_iommu_detect(void) { return -ENODEV; } |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 432acc4c054d..d937580417ba 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
@@ -48,19 +48,34 @@ struct iommu_domain { | |||
48 | 48 | ||
49 | #ifdef CONFIG_IOMMU_API | 49 | #ifdef CONFIG_IOMMU_API |
50 | 50 | ||
51 | /** | ||
52 | * struct iommu_ops - iommu ops and capabilities | ||
53 | * @domain_init: init iommu domain | ||
54 | * @domain_destroy: destroy iommu domain | ||
55 | * @attach_dev: attach device to an iommu domain | ||
56 | * @detach_dev: detach device from an iommu domain | ||
57 | * @map: map a physically contiguous memory region to an iommu domain | ||
58 | * @unmap: unmap a physically contiguous memory region from an iommu domain | ||
59 | * @iova_to_phys: translate iova to physical address | ||
60 | * @domain_has_cap: domain capabilities query | ||
61 | * @commit: commit iommu domain | ||
62 | * @pgsize_bitmap: bitmap of supported page sizes | ||
63 | */ | ||
51 | struct iommu_ops { | 64 | struct iommu_ops { |
52 | int (*domain_init)(struct iommu_domain *domain); | 65 | int (*domain_init)(struct iommu_domain *domain); |
53 | void (*domain_destroy)(struct iommu_domain *domain); | 66 | void (*domain_destroy)(struct iommu_domain *domain); |
54 | int (*attach_dev)(struct iommu_domain *domain, struct device *dev); | 67 | int (*attach_dev)(struct iommu_domain *domain, struct device *dev); |
55 | void (*detach_dev)(struct iommu_domain *domain, struct device *dev); | 68 | void (*detach_dev)(struct iommu_domain *domain, struct device *dev); |
56 | int (*map)(struct iommu_domain *domain, unsigned long iova, | 69 | int (*map)(struct iommu_domain *domain, unsigned long iova, |
57 | phys_addr_t paddr, int gfp_order, int prot); | 70 | phys_addr_t paddr, size_t size, int prot); |
58 | int (*unmap)(struct iommu_domain *domain, unsigned long iova, | 71 | size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, |
59 | int gfp_order); | 72 | size_t size); |
60 | phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, | 73 | phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, |
61 | unsigned long iova); | 74 | unsigned long iova); |
62 | int (*domain_has_cap)(struct iommu_domain *domain, | 75 | int (*domain_has_cap)(struct iommu_domain *domain, |
63 | unsigned long cap); | 76 | unsigned long cap); |
77 | int (*device_group)(struct device *dev, unsigned int *groupid); | ||
78 | unsigned long pgsize_bitmap; | ||
64 | }; | 79 | }; |
65 | 80 | ||
66 | extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); | 81 | extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); |
@@ -72,15 +87,16 @@ extern int iommu_attach_device(struct iommu_domain *domain, | |||
72 | extern void iommu_detach_device(struct iommu_domain *domain, | 87 | extern void iommu_detach_device(struct iommu_domain *domain, |
73 | struct device *dev); | 88 | struct device *dev); |
74 | extern int iommu_map(struct iommu_domain *domain, unsigned long iova, | 89 | extern int iommu_map(struct iommu_domain *domain, unsigned long iova, |
75 | phys_addr_t paddr, int gfp_order, int prot); | 90 | phys_addr_t paddr, size_t size, int prot); |
76 | extern int iommu_unmap(struct iommu_domain *domain, unsigned long iova, | 91 | extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, |
77 | int gfp_order); | 92 | size_t size); |
78 | extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, | 93 | extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, |
79 | unsigned long iova); | 94 | unsigned long iova); |
80 | extern int iommu_domain_has_cap(struct iommu_domain *domain, | 95 | extern int iommu_domain_has_cap(struct iommu_domain *domain, |
81 | unsigned long cap); | 96 | unsigned long cap); |
82 | extern void iommu_set_fault_handler(struct iommu_domain *domain, | 97 | extern void iommu_set_fault_handler(struct iommu_domain *domain, |
83 | iommu_fault_handler_t handler); | 98 | iommu_fault_handler_t handler); |
99 | extern int iommu_device_group(struct device *dev, unsigned int *groupid); | ||
84 | 100 | ||
85 | /** | 101 | /** |
86 | * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework | 102 | * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework |
@@ -179,6 +195,11 @@ static inline void iommu_set_fault_handler(struct iommu_domain *domain, | |||
179 | { | 195 | { |
180 | } | 196 | } |
181 | 197 | ||
198 | static inline int iommu_device_group(struct device *dev, unsigned int *groupid) | ||
199 | { | ||
200 | return -ENODEV; | ||
201 | } | ||
202 | |||
182 | #endif /* CONFIG_IOMMU_API */ | 203 | #endif /* CONFIG_IOMMU_API */ |
183 | 204 | ||
184 | #endif /* __LINUX_IOMMU_H */ | 205 | #endif /* __LINUX_IOMMU_H */ |
diff --git a/include/linux/msi.h b/include/linux/msi.h index 05acced439a3..ce93a341337d 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef LINUX_MSI_H | 1 | #ifndef LINUX_MSI_H |
2 | #define LINUX_MSI_H | 2 | #define LINUX_MSI_H |
3 | 3 | ||
4 | #include <linux/kobject.h> | ||
4 | #include <linux/list.h> | 5 | #include <linux/list.h> |
5 | 6 | ||
6 | struct msi_msg { | 7 | struct msi_msg { |
@@ -44,6 +45,8 @@ struct msi_desc { | |||
44 | 45 | ||
45 | /* Last set MSI message */ | 46 | /* Last set MSI message */ |
46 | struct msi_msg msg; | 47 | struct msi_msg msg; |
48 | |||
49 | struct kobject kobj; | ||
47 | }; | 50 | }; |
48 | 51 | ||
49 | /* | 52 | /* |
diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index 7cea7b6c1413..c8320144fe79 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h | |||
@@ -29,7 +29,7 @@ extern void pcie_aspm_pm_state_change(struct pci_dev *pdev); | |||
29 | extern void pcie_aspm_powersave_config_link(struct pci_dev *pdev); | 29 | extern void pcie_aspm_powersave_config_link(struct pci_dev *pdev); |
30 | extern void pci_disable_link_state(struct pci_dev *pdev, int state); | 30 | extern void pci_disable_link_state(struct pci_dev *pdev, int state); |
31 | extern void pci_disable_link_state_locked(struct pci_dev *pdev, int state); | 31 | extern void pci_disable_link_state_locked(struct pci_dev *pdev, int state); |
32 | extern void pcie_clear_aspm(void); | 32 | extern void pcie_clear_aspm(struct pci_bus *bus); |
33 | extern void pcie_no_aspm(void); | 33 | extern void pcie_no_aspm(void); |
34 | #else | 34 | #else |
35 | static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) | 35 | static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) |
@@ -47,7 +47,7 @@ static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) | |||
47 | static inline void pci_disable_link_state(struct pci_dev *pdev, int state) | 47 | static inline void pci_disable_link_state(struct pci_dev *pdev, int state) |
48 | { | 48 | { |
49 | } | 49 | } |
50 | static inline void pcie_clear_aspm(void) | 50 | static inline void pcie_clear_aspm(struct pci_bus *bus) |
51 | { | 51 | { |
52 | } | 52 | } |
53 | static inline void pcie_no_aspm(void) | 53 | static inline void pcie_no_aspm(void) |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 7cda65b5f798..84225c756bd1 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -336,6 +336,7 @@ struct pci_dev { | |||
336 | struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */ | 336 | struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */ |
337 | #ifdef CONFIG_PCI_MSI | 337 | #ifdef CONFIG_PCI_MSI |
338 | struct list_head msi_list; | 338 | struct list_head msi_list; |
339 | struct kset *msi_kset; | ||
339 | #endif | 340 | #endif |
340 | struct pci_vpd *vpd; | 341 | struct pci_vpd *vpd; |
341 | #ifdef CONFIG_PCI_ATS | 342 | #ifdef CONFIG_PCI_ATS |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index b5d9657f3100..28fe380cb19d 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
@@ -537,7 +537,9 @@ | |||
537 | #define PCI_EXT_CAP_ID_ARI 14 | 537 | #define PCI_EXT_CAP_ID_ARI 14 |
538 | #define PCI_EXT_CAP_ID_ATS 15 | 538 | #define PCI_EXT_CAP_ID_ATS 15 |
539 | #define PCI_EXT_CAP_ID_SRIOV 16 | 539 | #define PCI_EXT_CAP_ID_SRIOV 16 |
540 | #define PCI_EXT_CAP_ID_PRI 19 | ||
540 | #define PCI_EXT_CAP_ID_LTR 24 | 541 | #define PCI_EXT_CAP_ID_LTR 24 |
542 | #define PCI_EXT_CAP_ID_PASID 27 | ||
541 | 543 | ||
542 | /* Advanced Error Reporting */ | 544 | /* Advanced Error Reporting */ |
543 | #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ | 545 | #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ |
@@ -664,24 +666,24 @@ | |||
664 | #define PCI_ATS_MIN_STU 12 /* shift of minimum STU block */ | 666 | #define PCI_ATS_MIN_STU 12 /* shift of minimum STU block */ |
665 | 667 | ||
666 | /* Page Request Interface */ | 668 | /* Page Request Interface */ |
667 | #define PCI_PRI_CAP 0x13 /* PRI capability ID */ | 669 | #define PCI_PRI_CTRL 0x04 /* PRI control register */ |
668 | #define PCI_PRI_CONTROL_OFF 0x04 /* Offset of control register */ | 670 | #define PCI_PRI_CTRL_ENABLE 0x01 /* Enable */ |
669 | #define PCI_PRI_STATUS_OFF 0x06 /* Offset of status register */ | 671 | #define PCI_PRI_CTRL_RESET 0x02 /* Reset */ |
670 | #define PCI_PRI_ENABLE 0x0001 /* Enable mask */ | 672 | #define PCI_PRI_STATUS 0x06 /* PRI status register */ |
671 | #define PCI_PRI_RESET 0x0002 /* Reset bit mask */ | 673 | #define PCI_PRI_STATUS_RF 0x001 /* Response Failure */ |
672 | #define PCI_PRI_STATUS_RF 0x0001 /* Request Failure */ | 674 | #define PCI_PRI_STATUS_UPRGI 0x002 /* Unexpected PRG index */ |
673 | #define PCI_PRI_STATUS_UPRGI 0x0002 /* Unexpected PRG index */ | 675 | #define PCI_PRI_STATUS_STOPPED 0x100 /* PRI Stopped */ |
674 | #define PCI_PRI_STATUS_STOPPED 0x0100 /* PRI Stopped */ | 676 | #define PCI_PRI_MAX_REQ 0x08 /* PRI max reqs supported */ |
675 | #define PCI_PRI_MAX_REQ_OFF 0x08 /* Cap offset for max reqs supported */ | 677 | #define PCI_PRI_ALLOC_REQ 0x0c /* PRI max reqs allowed */ |
676 | #define PCI_PRI_ALLOC_REQ_OFF 0x0c /* Cap offset for max reqs allowed */ | ||
677 | 678 | ||
678 | /* PASID capability */ | 679 | /* PASID capability */ |
679 | #define PCI_PASID_CAP 0x1b /* PASID capability ID */ | 680 | #define PCI_PASID_CAP 0x04 /* PASID feature register */ |
680 | #define PCI_PASID_CAP_OFF 0x04 /* PASID feature register */ | 681 | #define PCI_PASID_CAP_EXEC 0x02 /* Exec permissions Supported */ |
681 | #define PCI_PASID_CONTROL_OFF 0x06 /* PASID control register */ | 682 | #define PCI_PASID_CAP_PRIV 0x04 /* Priviledge Mode Supported */ |
682 | #define PCI_PASID_ENABLE 0x01 /* Enable/Supported bit */ | 683 | #define PCI_PASID_CTRL 0x06 /* PASID control register */ |
683 | #define PCI_PASID_EXEC 0x02 /* Exec permissions Enable/Supported */ | 684 | #define PCI_PASID_CTRL_ENABLE 0x01 /* Enable bit */ |
684 | #define PCI_PASID_PRIV 0x04 /* Priviledge Mode Enable/Support */ | 685 | #define PCI_PASID_CTRL_EXEC 0x02 /* Exec permissions Enable */ |
686 | #define PCI_PASID_CTRL_PRIV 0x04 /* Priviledge Mode Enable */ | ||
685 | 687 | ||
686 | /* Single Root I/O Virtualization */ | 688 | /* Single Root I/O Virtualization */ |
687 | #define PCI_SRIOV_CAP 0x04 /* SR-IOV Capabilities */ | 689 | #define PCI_SRIOV_CAP 0x04 /* SR-IOV Capabilities */ |