1 // SPDX-License-Identifier: GPL-2.0
3 * PCI Virtual Channel support
5 * Copyright (C) 2013 Red Hat, Inc. All rights reserved.
6 * Author: Alex Williamson <alex.williamson@redhat.com>
9 #include <linux/device.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/pci.h>
13 #include <linux/pci_regs.h>
14 #include <linux/types.h>
19 * pci_vc_save_restore_dwords - Save or restore a series of dwords
21 * @pos: starting config space position
22 * @buf: buffer to save to or restore from
23 * @dwords: number of dwords to save/restore
24 * @save: whether to save or restore
26 static void pci_vc_save_restore_dwords(struct pci_dev
*dev
, int pos
,
27 u32
*buf
, int dwords
, bool save
)
31 for (i
= 0; i
< dwords
; i
++, buf
++) {
33 pci_read_config_dword(dev
, pos
+ (i
* 4), buf
);
35 pci_write_config_dword(dev
, pos
+ (i
* 4), *buf
);
40 * pci_vc_load_arb_table - load and wait for VC arbitration table
42 * @pos: starting position of VC capability (VC/VC9/MFVC)
44 * Set Load VC Arbitration Table bit requesting hardware to apply the VC
45 * Arbitration Table (previously loaded). When the VC Arbitration Table
46 * Status clears, hardware has latched the table into VC arbitration logic.
48 static void pci_vc_load_arb_table(struct pci_dev
*dev
, int pos
)
52 pci_read_config_word(dev
, pos
+ PCI_VC_PORT_CTRL
, &ctrl
);
53 pci_write_config_word(dev
, pos
+ PCI_VC_PORT_CTRL
,
54 ctrl
| PCI_VC_PORT_CTRL_LOAD_TABLE
);
55 if (pci_wait_for_pending(dev
, pos
+ PCI_VC_PORT_STATUS
,
56 PCI_VC_PORT_STATUS_TABLE
))
59 pci_err(dev
, "VC arbitration table failed to load\n");
63 * pci_vc_load_port_arb_table - Load and wait for VC port arbitration table
65 * @pos: starting position of VC capability (VC/VC9/MFVC)
66 * @res: VC resource number, ie. VCn (0-7)
68 * Set Load Port Arbitration Table bit requesting hardware to apply the Port
69 * Arbitration Table (previously loaded). When the Port Arbitration Table
70 * Status clears, hardware has latched the table into port arbitration logic.
72 static void pci_vc_load_port_arb_table(struct pci_dev
*dev
, int pos
, int res
)
74 int ctrl_pos
, status_pos
;
77 ctrl_pos
= pos
+ PCI_VC_RES_CTRL
+ (res
* PCI_CAP_VC_PER_VC_SIZEOF
);
78 status_pos
= pos
+ PCI_VC_RES_STATUS
+ (res
* PCI_CAP_VC_PER_VC_SIZEOF
);
80 pci_read_config_dword(dev
, ctrl_pos
, &ctrl
);
81 pci_write_config_dword(dev
, ctrl_pos
,
82 ctrl
| PCI_VC_RES_CTRL_LOAD_TABLE
);
84 if (pci_wait_for_pending(dev
, status_pos
, PCI_VC_RES_STATUS_TABLE
))
87 pci_err(dev
, "VC%d port arbitration table failed to load\n", res
);
91 * pci_vc_enable - Enable virtual channel
93 * @pos: starting position of VC capability (VC/VC9/MFVC)
94 * @res: VC res number, ie. VCn (0-7)
96 * A VC is enabled by setting the enable bit in matching resource control
97 * registers on both sides of a link. We therefore need to find the opposite
98 * end of the link. To keep this simple we enable from the downstream device.
99 * RC devices do not have an upstream device, nor does it seem that VC9 do
100 * (spec is unclear). Once we find the upstream device, match the VC ID to
101 * get the correct resource, disable and enable on both ends.
103 static void pci_vc_enable(struct pci_dev
*dev
, int pos
, int res
)
105 int ctrl_pos
, status_pos
, id
, pos2
, evcc
, i
, ctrl_pos2
, status_pos2
;
106 u32 ctrl
, header
, cap1
, ctrl2
;
107 struct pci_dev
*link
= NULL
;
109 /* Enable VCs from the downstream device */
110 if (!pci_is_pcie(dev
) || !pcie_downstream_port(dev
))
113 ctrl_pos
= pos
+ PCI_VC_RES_CTRL
+ (res
* PCI_CAP_VC_PER_VC_SIZEOF
);
114 status_pos
= pos
+ PCI_VC_RES_STATUS
+ (res
* PCI_CAP_VC_PER_VC_SIZEOF
);
116 pci_read_config_dword(dev
, ctrl_pos
, &ctrl
);
117 id
= ctrl
& PCI_VC_RES_CTRL_ID
;
119 pci_read_config_dword(dev
, pos
, &header
);
121 /* If there is no opposite end of the link, skip to enable */
122 if (PCI_EXT_CAP_ID(header
) == PCI_EXT_CAP_ID_VC9
||
123 pci_is_root_bus(dev
->bus
))
126 pos2
= pci_find_ext_capability(dev
->bus
->self
, PCI_EXT_CAP_ID_VC
);
130 pci_read_config_dword(dev
->bus
->self
, pos2
+ PCI_VC_PORT_CAP1
, &cap1
);
131 evcc
= cap1
& PCI_VC_CAP1_EVCC
;
133 /* VC0 is hardwired enabled, so we can start with 1 */
134 for (i
= 1; i
< evcc
+ 1; i
++) {
135 ctrl_pos2
= pos2
+ PCI_VC_RES_CTRL
+
136 (i
* PCI_CAP_VC_PER_VC_SIZEOF
);
137 status_pos2
= pos2
+ PCI_VC_RES_STATUS
+
138 (i
* PCI_CAP_VC_PER_VC_SIZEOF
);
139 pci_read_config_dword(dev
->bus
->self
, ctrl_pos2
, &ctrl2
);
140 if ((ctrl2
& PCI_VC_RES_CTRL_ID
) == id
) {
141 link
= dev
->bus
->self
;
149 /* Disable if enabled */
150 if (ctrl2
& PCI_VC_RES_CTRL_ENABLE
) {
151 ctrl2
&= ~PCI_VC_RES_CTRL_ENABLE
;
152 pci_write_config_dword(link
, ctrl_pos2
, ctrl2
);
155 /* Enable on both ends */
156 ctrl2
|= PCI_VC_RES_CTRL_ENABLE
;
157 pci_write_config_dword(link
, ctrl_pos2
, ctrl2
);
159 ctrl
|= PCI_VC_RES_CTRL_ENABLE
;
160 pci_write_config_dword(dev
, ctrl_pos
, ctrl
);
162 if (!pci_wait_for_pending(dev
, status_pos
, PCI_VC_RES_STATUS_NEGO
))
163 pci_err(dev
, "VC%d negotiation stuck pending\n", id
);
165 if (link
&& !pci_wait_for_pending(link
, status_pos2
,
166 PCI_VC_RES_STATUS_NEGO
))
167 pci_err(link
, "VC%d negotiation stuck pending\n", id
);
171 * pci_vc_do_save_buffer - Size, save, or restore VC state
173 * @pos: starting position of VC capability (VC/VC9/MFVC)
174 * @save_state: buffer for save/restore
175 * @save: if provided a buffer, this indicates what to do with it
177 * Walking Virtual Channel config space to size, save, or restore it
178 * is complicated, so we do it all from one function to reduce code and
179 * guarantee ordering matches in the buffer. When called with NULL
180 * @save_state, return the size of the necessary save buffer. When called
181 * with a non-NULL @save_state, @save determines whether we save to the
182 * buffer or restore from it.
184 static int pci_vc_do_save_buffer(struct pci_dev
*dev
, int pos
,
185 struct pci_cap_saved_state
*save_state
,
189 char evcc
, lpevcc
, parb_size
;
191 u8
*buf
= save_state
? (u8
*)save_state
->cap
.data
: NULL
;
193 /* Sanity check buffer size for save/restore */
194 if (buf
&& save_state
->cap
.size
!=
195 pci_vc_do_save_buffer(dev
, pos
, NULL
, save
)) {
196 pci_err(dev
, "VC save buffer size does not match @0x%x\n", pos
);
200 pci_read_config_dword(dev
, pos
+ PCI_VC_PORT_CAP1
, &cap1
);
201 /* Extended VC Count (not counting VC0) */
202 evcc
= cap1
& PCI_VC_CAP1_EVCC
;
203 /* Low Priority Extended VC Count (not counting VC0) */
204 lpevcc
= (cap1
& PCI_VC_CAP1_LPEVCC
) >> 4;
205 /* Port Arbitration Table Entry Size (bits) */
206 parb_size
= 1 << ((cap1
& PCI_VC_CAP1_ARB_SIZE
) >> 10);
209 * Port VC Control Register contains VC Arbitration Select, which
210 * cannot be modified when more than one LPVC is in operation. We
211 * therefore save/restore it first, as only VC0 should be enabled
212 * after device reset.
216 pci_read_config_word(dev
, pos
+ PCI_VC_PORT_CTRL
,
219 pci_write_config_word(dev
, pos
+ PCI_VC_PORT_CTRL
,
226 * If we have any Low Priority VCs and a VC Arbitration Table Offset
227 * in Port VC Capability Register 2 then save/restore it next.
233 pci_read_config_dword(dev
, pos
+ PCI_VC_PORT_CAP2
, &cap2
);
234 vcarb_offset
= ((cap2
& PCI_VC_CAP2_ARB_OFF
) >> 24) * 16;
237 int size
, vcarb_phases
= 0;
239 if (cap2
& PCI_VC_CAP2_128_PHASE
)
241 else if (cap2
& PCI_VC_CAP2_64_PHASE
)
243 else if (cap2
& PCI_VC_CAP2_32_PHASE
)
246 /* Fixed 4 bits per phase per lpevcc (plus VC0) */
247 size
= ((lpevcc
+ 1) * vcarb_phases
* 4) / 8;
250 pci_vc_save_restore_dwords(dev
,
255 * On restore, we need to signal hardware to
256 * re-load the VC Arbitration Table.
259 pci_vc_load_arb_table(dev
, pos
);
268 * In addition to each VC Resource Control Register, we may have a
269 * Port Arbitration Table attached to each VC. The Port Arbitration
270 * Table Offset in each VC Resource Capability Register tells us if
271 * it exists. The entry size is global from the Port VC Capability
272 * Register1 above. The number of phases is determined per VC.
274 for (i
= 0; i
< evcc
+ 1; i
++) {
278 pci_read_config_dword(dev
, pos
+ PCI_VC_RES_CAP
+
279 (i
* PCI_CAP_VC_PER_VC_SIZEOF
), &cap
);
280 parb_offset
= ((cap
& PCI_VC_RES_CAP_ARB_OFF
) >> 24) * 16;
282 int size
, parb_phases
= 0;
284 if (cap
& PCI_VC_RES_CAP_256_PHASE
)
286 else if (cap
& (PCI_VC_RES_CAP_128_PHASE
|
287 PCI_VC_RES_CAP_128_PHASE_TB
))
289 else if (cap
& PCI_VC_RES_CAP_64_PHASE
)
291 else if (cap
& PCI_VC_RES_CAP_32_PHASE
)
294 size
= (parb_size
* parb_phases
) / 8;
297 pci_vc_save_restore_dwords(dev
,
306 /* VC Resource Control Register */
308 int ctrl_pos
= pos
+ PCI_VC_RES_CTRL
+
309 (i
* PCI_CAP_VC_PER_VC_SIZEOF
);
311 pci_read_config_dword(dev
, ctrl_pos
,
314 u32 tmp
, ctrl
= *(u32
*)buf
;
316 * For an FLR case, the VC config may remain.
317 * Preserve enable bit, restore the rest.
319 pci_read_config_dword(dev
, ctrl_pos
, &tmp
);
320 tmp
&= PCI_VC_RES_CTRL_ENABLE
;
321 tmp
|= ctrl
& ~PCI_VC_RES_CTRL_ENABLE
;
322 pci_write_config_dword(dev
, ctrl_pos
, tmp
);
323 /* Load port arbitration table if used */
324 if (ctrl
& PCI_VC_RES_CTRL_ARB_SELECT
)
325 pci_vc_load_port_arb_table(dev
, pos
, i
);
326 /* Re-enable if needed */
327 if ((ctrl
^ tmp
) & PCI_VC_RES_CTRL_ENABLE
)
328 pci_vc_enable(dev
, pos
, i
);
335 return buf
? 0 : len
;
341 } vc_caps
[] = { { PCI_EXT_CAP_ID_MFVC
, "MFVC" },
342 { PCI_EXT_CAP_ID_VC
, "VC" },
343 { PCI_EXT_CAP_ID_VC9
, "VC9" } };
346 * pci_save_vc_state - Save VC state to pre-allocate save buffer
349 * For each type of VC capability, VC/VC9/MFVC, find the capability and
350 * save it to the pre-allocated save buffer.
352 int pci_save_vc_state(struct pci_dev
*dev
)
356 for (i
= 0; i
< ARRAY_SIZE(vc_caps
); i
++) {
358 struct pci_cap_saved_state
*save_state
;
360 pos
= pci_find_ext_capability(dev
, vc_caps
[i
].id
);
364 save_state
= pci_find_saved_ext_cap(dev
, vc_caps
[i
].id
);
366 pci_err(dev
, "%s buffer not found in %s\n",
367 vc_caps
[i
].name
, __func__
);
371 ret
= pci_vc_do_save_buffer(dev
, pos
, save_state
, true);
373 pci_err(dev
, "%s save unsuccessful %s\n",
374 vc_caps
[i
].name
, __func__
);
383 * pci_restore_vc_state - Restore VC state from save buffer
386 * For each type of VC capability, VC/VC9/MFVC, find the capability and
387 * restore it from the previously saved buffer.
389 void pci_restore_vc_state(struct pci_dev
*dev
)
393 for (i
= 0; i
< ARRAY_SIZE(vc_caps
); i
++) {
395 struct pci_cap_saved_state
*save_state
;
397 pos
= pci_find_ext_capability(dev
, vc_caps
[i
].id
);
398 save_state
= pci_find_saved_ext_cap(dev
, vc_caps
[i
].id
);
399 if (!save_state
|| !pos
)
402 pci_vc_do_save_buffer(dev
, pos
, save_state
, false);
407 * pci_allocate_vc_save_buffers - Allocate save buffers for VC caps
410 * For each type of VC capability, VC/VC9/MFVC, find the capability, size
411 * it, and allocate a buffer for save/restore.
413 void pci_allocate_vc_save_buffers(struct pci_dev
*dev
)
417 for (i
= 0; i
< ARRAY_SIZE(vc_caps
); i
++) {
418 int len
, pos
= pci_find_ext_capability(dev
, vc_caps
[i
].id
);
423 len
= pci_vc_do_save_buffer(dev
, pos
, NULL
, false);
424 if (pci_add_ext_cap_save_buffer(dev
, vc_caps
[i
].id
, len
))
425 pci_err(dev
, "unable to preallocate %s save buffer\n",