|
9 | 9 | #include <linux/pci.h>
|
10 | 10 | #include "../pci.h"
|
11 | 11 |
|
12 |
| -static void __pci_disable_ptm(struct pci_dev *dev) |
13 |
| -{ |
14 |
| - u16 ptm = dev->ptm_cap; |
15 |
| - u32 ctrl; |
16 |
| - |
17 |
| - if (!ptm) |
18 |
| - return; |
19 |
| - |
20 |
| - pci_read_config_dword(dev, ptm + PCI_PTM_CTRL, &ctrl); |
21 |
| - ctrl &= ~(PCI_PTM_CTRL_ENABLE | PCI_PTM_CTRL_ROOT); |
22 |
| - pci_write_config_dword(dev, ptm + PCI_PTM_CTRL, ctrl); |
23 |
| -} |
24 |
| - |
25 |
| -/** |
26 |
| - * pci_disable_ptm() - Disable Precision Time Measurement |
27 |
| - * @dev: PCI device |
28 |
| - * |
29 |
| - * Disable Precision Time Measurement for @dev. |
30 |
| - */ |
31 |
| -void pci_disable_ptm(struct pci_dev *dev) |
32 |
| -{ |
33 |
| - if (dev->ptm_enabled) { |
34 |
| - __pci_disable_ptm(dev); |
35 |
| - dev->ptm_enabled = 0; |
36 |
| - } |
37 |
| -} |
38 |
| -EXPORT_SYMBOL(pci_disable_ptm); |
39 |
| - |
40 |
| -void pci_save_ptm_state(struct pci_dev *dev) |
41 |
| -{ |
42 |
| - u16 ptm = dev->ptm_cap; |
43 |
| - struct pci_cap_saved_state *save_state; |
44 |
| - u32 *cap; |
45 |
| - |
46 |
| - if (!ptm) |
47 |
| - return; |
48 |
| - |
49 |
| - save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_PTM); |
50 |
| - if (!save_state) |
51 |
| - return; |
52 |
| - |
53 |
| - cap = (u32 *)&save_state->cap.data[0]; |
54 |
| - pci_read_config_dword(dev, ptm + PCI_PTM_CTRL, cap); |
55 |
| -} |
56 |
| - |
57 |
| -void pci_restore_ptm_state(struct pci_dev *dev) |
58 |
| -{ |
59 |
| - u16 ptm = dev->ptm_cap; |
60 |
| - struct pci_cap_saved_state *save_state; |
61 |
| - u32 *cap; |
62 |
| - |
63 |
| - if (!ptm) |
64 |
| - return; |
65 |
| - |
66 |
| - save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_PTM); |
67 |
| - if (!save_state) |
68 |
| - return; |
69 |
| - |
70 |
| - cap = (u32 *)&save_state->cap.data[0]; |
71 |
| - pci_write_config_dword(dev, ptm + PCI_PTM_CTRL, *cap); |
72 |
| -} |
73 |
| - |
74 | 12 | /*
|
75 | 13 | * If the next upstream device supports PTM, return it; otherwise return
|
76 | 14 | * NULL. PTM Messages are local, so both link partners must support it.
|
@@ -146,6 +84,40 @@ void pci_ptm_init(struct pci_dev *dev)
|
146 | 84 | pci_enable_ptm(dev, NULL);
|
147 | 85 | }
|
148 | 86 |
|
| 87 | +void pci_save_ptm_state(struct pci_dev *dev) |
| 88 | +{ |
| 89 | + u16 ptm = dev->ptm_cap; |
| 90 | + struct pci_cap_saved_state *save_state; |
| 91 | + u32 *cap; |
| 92 | + |
| 93 | + if (!ptm) |
| 94 | + return; |
| 95 | + |
| 96 | + save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_PTM); |
| 97 | + if (!save_state) |
| 98 | + return; |
| 99 | + |
| 100 | + cap = (u32 *)&save_state->cap.data[0]; |
| 101 | + pci_read_config_dword(dev, ptm + PCI_PTM_CTRL, cap); |
| 102 | +} |
| 103 | + |
| 104 | +void pci_restore_ptm_state(struct pci_dev *dev) |
| 105 | +{ |
| 106 | + u16 ptm = dev->ptm_cap; |
| 107 | + struct pci_cap_saved_state *save_state; |
| 108 | + u32 *cap; |
| 109 | + |
| 110 | + if (!ptm) |
| 111 | + return; |
| 112 | + |
| 113 | + save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_PTM); |
| 114 | + if (!save_state) |
| 115 | + return; |
| 116 | + |
| 117 | + cap = (u32 *)&save_state->cap.data[0]; |
| 118 | + pci_write_config_dword(dev, ptm + PCI_PTM_CTRL, *cap); |
| 119 | +} |
| 120 | + |
149 | 121 | /* Enable PTM in the Control register if possible */
|
150 | 122 | static int __pci_enable_ptm(struct pci_dev *dev)
|
151 | 123 | {
|
@@ -226,6 +198,34 @@ int pci_enable_ptm(struct pci_dev *dev, u8 *granularity)
|
226 | 198 | }
|
227 | 199 | EXPORT_SYMBOL(pci_enable_ptm);
|
228 | 200 |
|
| 201 | +static void __pci_disable_ptm(struct pci_dev *dev) |
| 202 | +{ |
| 203 | + u16 ptm = dev->ptm_cap; |
| 204 | + u32 ctrl; |
| 205 | + |
| 206 | + if (!ptm) |
| 207 | + return; |
| 208 | + |
| 209 | + pci_read_config_dword(dev, ptm + PCI_PTM_CTRL, &ctrl); |
| 210 | + ctrl &= ~(PCI_PTM_CTRL_ENABLE | PCI_PTM_CTRL_ROOT); |
| 211 | + pci_write_config_dword(dev, ptm + PCI_PTM_CTRL, ctrl); |
| 212 | +} |
| 213 | + |
| 214 | +/** |
| 215 | + * pci_disable_ptm() - Disable Precision Time Measurement |
| 216 | + * @dev: PCI device |
| 217 | + * |
| 218 | + * Disable Precision Time Measurement for @dev. |
| 219 | + */ |
| 220 | +void pci_disable_ptm(struct pci_dev *dev) |
| 221 | +{ |
| 222 | + if (dev->ptm_enabled) { |
| 223 | + __pci_disable_ptm(dev); |
| 224 | + dev->ptm_enabled = 0; |
| 225 | + } |
| 226 | +} |
| 227 | +EXPORT_SYMBOL(pci_disable_ptm); |
| 228 | + |
229 | 229 | /*
|
230 | 230 | * Disable PTM, but preserve dev->ptm_enabled so we silently re-enable it on
|
231 | 231 | * resume if necessary.
|
|
0 commit comments