1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2024-2025 Intel Corporation. All rights reserved. */
3
4 /* PCIe r7.0 section 6.33 Integrity & Data Encryption (IDE) */
5
6 #define dev_fmt(fmt) "PCI/IDE: " fmt
7 #include <linux/bitfield.h>
8 #include <linux/bitops.h>
9 #include <linux/pci.h>
10 #include <linux/pci-ide.h>
11 #include <linux/pci_regs.h>
12 #include <linux/slab.h>
13 #include <linux/sysfs.h>
14
15 #include "pci.h"
16
__sel_ide_offset(u16 ide_cap,u8 nr_link_ide,u8 stream_index,u8 nr_ide_mem)17 static int __sel_ide_offset(u16 ide_cap, u8 nr_link_ide, u8 stream_index,
18 u8 nr_ide_mem)
19 {
20 u32 offset = ide_cap + PCI_IDE_LINK_STREAM_0 +
21 nr_link_ide * PCI_IDE_LINK_BLOCK_SIZE;
22
23 /*
24 * Assume a constant number of address association resources per stream
25 * index
26 */
27 return offset + stream_index * PCI_IDE_SEL_BLOCK_SIZE(nr_ide_mem);
28 }
29
sel_ide_offset(struct pci_dev * pdev,struct pci_ide_partner * settings)30 static int sel_ide_offset(struct pci_dev *pdev,
31 struct pci_ide_partner *settings)
32 {
33 return __sel_ide_offset(pdev->ide_cap, pdev->nr_link_ide,
34 settings->stream_index, pdev->nr_ide_mem);
35 }
36
reserve_stream_index(struct pci_dev * pdev,u8 idx)37 static bool reserve_stream_index(struct pci_dev *pdev, u8 idx)
38 {
39 int ret;
40
41 ret = ida_alloc_range(&pdev->ide_stream_ida, idx, idx, GFP_KERNEL);
42 return ret >= 0;
43 }
44
reserve_stream_id(struct pci_host_bridge * hb,u8 id)45 static bool reserve_stream_id(struct pci_host_bridge *hb, u8 id)
46 {
47 int ret;
48
49 ret = ida_alloc_range(&hb->ide_stream_ids_ida, id, id, GFP_KERNEL);
50 return ret >= 0;
51 }
52
claim_stream(struct pci_host_bridge * hb,u8 stream_id,struct pci_dev * pdev,u8 stream_idx)53 static bool claim_stream(struct pci_host_bridge *hb, u8 stream_id,
54 struct pci_dev *pdev, u8 stream_idx)
55 {
56 dev_info(&hb->dev, "Stream ID %d active at init\n", stream_id);
57 if (!reserve_stream_id(hb, stream_id)) {
58 dev_info(&hb->dev, "Failed to claim %s Stream ID %d\n",
59 stream_id == PCI_IDE_RESERVED_STREAM_ID ? "reserved" :
60 "active",
61 stream_id);
62 return false;
63 }
64
65 /* No stream index to reserve in the Link IDE case */
66 if (!pdev)
67 return true;
68
69 if (!reserve_stream_index(pdev, stream_idx)) {
70 pci_info(pdev, "Failed to claim active Selective Stream %d\n",
71 stream_idx);
72 return false;
73 }
74
75 return true;
76 }
77
pci_ide_init(struct pci_dev * pdev)78 void pci_ide_init(struct pci_dev *pdev)
79 {
80 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
81 u16 nr_link_ide, nr_ide_mem, nr_streams;
82 u16 ide_cap;
83 u32 val;
84
85 /*
86 * Unconditionally init so that ida idle state is consistent with
87 * pdev->ide_cap.
88 */
89 ida_init(&pdev->ide_stream_ida);
90
91 if (!pci_is_pcie(pdev))
92 return;
93
94 ide_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_IDE);
95 if (!ide_cap)
96 return;
97
98 pci_read_config_dword(pdev, ide_cap + PCI_IDE_CAP, &val);
99 if ((val & PCI_IDE_CAP_SELECTIVE) == 0)
100 return;
101
102 /*
103 * Require endpoint IDE capability to be paired with IDE Root Port IDE
104 * capability.
105 */
106 if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ENDPOINT) {
107 struct pci_dev *rp = pcie_find_root_port(pdev);
108
109 if (!rp->ide_cap)
110 return;
111 }
112
113 pdev->ide_cfg = FIELD_GET(PCI_IDE_CAP_SEL_CFG, val);
114 pdev->ide_tee_limit = FIELD_GET(PCI_IDE_CAP_TEE_LIMITED, val);
115
116 if (val & PCI_IDE_CAP_LINK)
117 nr_link_ide = 1 + FIELD_GET(PCI_IDE_CAP_LINK_TC_NUM, val);
118 else
119 nr_link_ide = 0;
120
121 nr_ide_mem = 0;
122 nr_streams = 1 + FIELD_GET(PCI_IDE_CAP_SEL_NUM, val);
123 for (u16 i = 0; i < nr_streams; i++) {
124 int pos = __sel_ide_offset(ide_cap, nr_link_ide, i, nr_ide_mem);
125 int nr_assoc;
126 u32 val;
127 u8 id;
128
129 pci_read_config_dword(pdev, pos + PCI_IDE_SEL_CAP, &val);
130
131 /*
132 * Let's not entertain streams that do not have a constant
133 * number of address association blocks
134 */
135 nr_assoc = FIELD_GET(PCI_IDE_SEL_CAP_ASSOC_NUM, val);
136 if (i && (nr_assoc != nr_ide_mem)) {
137 pci_info(pdev, "Unsupported Selective Stream %d capability, SKIP the rest\n", i);
138 nr_streams = i;
139 break;
140 }
141
142 nr_ide_mem = nr_assoc;
143
144 /*
145 * Claim Stream IDs and Selective Stream blocks that are already
146 * active on the device
147 */
148 pci_read_config_dword(pdev, pos + PCI_IDE_SEL_CTL, &val);
149 id = FIELD_GET(PCI_IDE_SEL_CTL_ID, val);
150 if ((val & PCI_IDE_SEL_CTL_EN) &&
151 !claim_stream(hb, id, pdev, i))
152 return;
153 }
154
155 /* Reserve link stream-ids that are already active on the device */
156 for (u16 i = 0; i < nr_link_ide; ++i) {
157 int pos = ide_cap + PCI_IDE_LINK_STREAM_0 + i * PCI_IDE_LINK_BLOCK_SIZE;
158 u8 id;
159
160 pci_read_config_dword(pdev, pos + PCI_IDE_LINK_CTL_0, &val);
161 id = FIELD_GET(PCI_IDE_LINK_CTL_ID, val);
162 if ((val & PCI_IDE_LINK_CTL_EN) &&
163 !claim_stream(hb, id, NULL, -1))
164 return;
165 }
166
167 for (u16 i = 0; i < nr_streams; i++) {
168 int pos = __sel_ide_offset(ide_cap, nr_link_ide, i, nr_ide_mem);
169
170 pci_read_config_dword(pdev, pos + PCI_IDE_SEL_CTL, &val);
171 if (val & PCI_IDE_SEL_CTL_EN)
172 continue;
173 FIELD_MODIFY(PCI_IDE_SEL_CTL_ID, &val, PCI_IDE_RESERVED_STREAM_ID);
174 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_CTL, val);
175 }
176
177 for (u16 i = 0; i < nr_link_ide; ++i) {
178 int pos = ide_cap + PCI_IDE_LINK_STREAM_0 +
179 i * PCI_IDE_LINK_BLOCK_SIZE;
180
181 pci_read_config_dword(pdev, pos, &val);
182 if (val & PCI_IDE_LINK_CTL_EN)
183 continue;
184 FIELD_MODIFY(PCI_IDE_LINK_CTL_ID, &val, PCI_IDE_RESERVED_STREAM_ID);
185 pci_write_config_dword(pdev, pos, val);
186 }
187
188 pdev->ide_cap = ide_cap;
189 pdev->nr_link_ide = nr_link_ide;
190 pdev->nr_sel_ide = nr_streams;
191 pdev->nr_ide_mem = nr_ide_mem;
192 }
193
194 struct stream_index {
195 struct ida *ida;
196 u8 stream_index;
197 };
198
free_stream_index(struct stream_index * stream)199 static void free_stream_index(struct stream_index *stream)
200 {
201 ida_free(stream->ida, stream->stream_index);
202 }
203
DEFINE_FREE(free_stream,struct stream_index *,if (_T)free_stream_index (_T))204 DEFINE_FREE(free_stream, struct stream_index *, if (_T) free_stream_index(_T))
205 static struct stream_index *alloc_stream_index(struct ida *ida, u16 max,
206 struct stream_index *stream)
207 {
208 int id;
209
210 if (!max)
211 return NULL;
212
213 id = ida_alloc_max(ida, max - 1, GFP_KERNEL);
214 if (id < 0)
215 return NULL;
216
217 *stream = (struct stream_index) {
218 .ida = ida,
219 .stream_index = id,
220 };
221 return stream;
222 }
223
224 /**
225 * pci_ide_stream_alloc() - Reserve stream indices and probe for settings
226 * @pdev: IDE capable PCIe Endpoint Physical Function
227 *
228 * Retrieve the Requester ID range of @pdev for programming its Root
229 * Port IDE RID Association registers, and conversely retrieve the
230 * Requester ID of the Root Port for programming @pdev's IDE RID
231 * Association registers.
232 *
233 * Allocate a Selective IDE Stream Register Block instance per port.
234 *
235 * Allocate a platform stream resource from the associated host bridge.
236 * Retrieve stream association parameters for Requester ID range and
237 * address range restrictions for the stream.
238 */
pci_ide_stream_alloc(struct pci_dev * pdev)239 struct pci_ide *pci_ide_stream_alloc(struct pci_dev *pdev)
240 {
241 /* EP, RP, + HB Stream allocation */
242 struct stream_index __stream[PCI_IDE_HB + 1];
243 struct pci_bus_region pref_assoc = { 0, -1 };
244 struct pci_bus_region mem_assoc = { 0, -1 };
245 struct resource *mem, *pref;
246 struct pci_host_bridge *hb;
247 struct pci_dev *rp, *br;
248 int num_vf, rid_end;
249
250 if (!pci_is_pcie(pdev))
251 return NULL;
252
253 if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ENDPOINT)
254 return NULL;
255
256 if (!pdev->ide_cap)
257 return NULL;
258
259 struct pci_ide *ide __free(kfree) = kzalloc_obj(*ide);
260 if (!ide)
261 return NULL;
262
263 hb = pci_find_host_bridge(pdev->bus);
264 struct stream_index *hb_stream __free(free_stream) = alloc_stream_index(
265 &hb->ide_stream_ida, hb->nr_ide_streams, &__stream[PCI_IDE_HB]);
266 if (!hb_stream)
267 return NULL;
268
269 rp = pcie_find_root_port(pdev);
270 struct stream_index *rp_stream __free(free_stream) = alloc_stream_index(
271 &rp->ide_stream_ida, rp->nr_sel_ide, &__stream[PCI_IDE_RP]);
272 if (!rp_stream)
273 return NULL;
274
275 struct stream_index *ep_stream __free(free_stream) = alloc_stream_index(
276 &pdev->ide_stream_ida, pdev->nr_sel_ide, &__stream[PCI_IDE_EP]);
277 if (!ep_stream)
278 return NULL;
279
280 /* for SR-IOV case, cover all VFs */
281 num_vf = pci_num_vf(pdev);
282 if (num_vf)
283 rid_end = PCI_DEVID(pci_iov_virtfn_bus(pdev, num_vf - 1),
284 pci_iov_virtfn_devfn(pdev, num_vf - 1));
285 else
286 rid_end = pci_dev_id(pdev);
287
288 br = pci_upstream_bridge(pdev);
289 if (!br)
290 return NULL;
291
292 /*
293 * Check if the device consumes memory and/or prefetch-memory. Setup
294 * downstream address association ranges for each.
295 */
296 mem = pci_resource_n(br, PCI_BRIDGE_MEM_WINDOW);
297 pref = pci_resource_n(br, PCI_BRIDGE_PREF_MEM_WINDOW);
298 if (resource_assigned(mem))
299 pcibios_resource_to_bus(br->bus, &mem_assoc, mem);
300 if (resource_assigned(pref))
301 pcibios_resource_to_bus(br->bus, &pref_assoc, pref);
302
303 *ide = (struct pci_ide) {
304 .pdev = pdev,
305 .partner = {
306 [PCI_IDE_EP] = {
307 .rid_start = pci_dev_id(rp),
308 .rid_end = pci_dev_id(rp),
309 .stream_index = no_free_ptr(ep_stream)->stream_index,
310 /* Disable upstream address association */
311 .mem_assoc = { 0, -1 },
312 .pref_assoc = { 0, -1 },
313 },
314 [PCI_IDE_RP] = {
315 .rid_start = pci_dev_id(pdev),
316 .rid_end = rid_end,
317 .stream_index = no_free_ptr(rp_stream)->stream_index,
318 .mem_assoc = mem_assoc,
319 .pref_assoc = pref_assoc,
320 },
321 },
322 .host_bridge_stream = no_free_ptr(hb_stream)->stream_index,
323 .stream_id = -1,
324 };
325
326 return_ptr(ide);
327 }
328 EXPORT_SYMBOL_GPL(pci_ide_stream_alloc);
329
330 /**
331 * pci_ide_stream_free() - unwind pci_ide_stream_alloc()
332 * @ide: idle IDE settings descriptor
333 *
334 * Free all of the stream index (register block) allocations acquired by
335 * pci_ide_stream_alloc(). The stream represented by @ide is assumed to
336 * be unregistered and not instantiated in any device.
337 */
pci_ide_stream_free(struct pci_ide * ide)338 void pci_ide_stream_free(struct pci_ide *ide)
339 {
340 struct pci_dev *pdev = ide->pdev;
341 struct pci_dev *rp = pcie_find_root_port(pdev);
342 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
343
344 ida_free(&pdev->ide_stream_ida, ide->partner[PCI_IDE_EP].stream_index);
345 ida_free(&rp->ide_stream_ida, ide->partner[PCI_IDE_RP].stream_index);
346 ida_free(&hb->ide_stream_ida, ide->host_bridge_stream);
347 kfree(ide);
348 }
349 EXPORT_SYMBOL_GPL(pci_ide_stream_free);
350
351 /**
352 * pci_ide_stream_release() - unwind and release an @ide context
353 * @ide: partially or fully registered IDE settings descriptor
354 *
355 * In support of automatic cleanup of IDE setup routines perform IDE
356 * teardown in expected reverse order of setup and with respect to which
357 * aspects of IDE setup have successfully completed.
358 *
359 * Be careful that setup order mirrors this shutdown order. Otherwise,
360 * open code releasing the IDE context.
361 */
pci_ide_stream_release(struct pci_ide * ide)362 void pci_ide_stream_release(struct pci_ide *ide)
363 {
364 struct pci_dev *pdev = ide->pdev;
365 struct pci_dev *rp = pcie_find_root_port(pdev);
366
367 if (ide->partner[PCI_IDE_RP].enable)
368 pci_ide_stream_disable(rp, ide);
369
370 if (ide->partner[PCI_IDE_EP].enable)
371 pci_ide_stream_disable(pdev, ide);
372
373 if (ide->partner[PCI_IDE_RP].setup)
374 pci_ide_stream_teardown(rp, ide);
375
376 if (ide->partner[PCI_IDE_EP].setup)
377 pci_ide_stream_teardown(pdev, ide);
378
379 if (ide->name)
380 pci_ide_stream_unregister(ide);
381
382 pci_ide_stream_free(ide);
383 }
384 EXPORT_SYMBOL_GPL(pci_ide_stream_release);
385
386 struct pci_ide_stream_id {
387 struct pci_host_bridge *hb;
388 u8 stream_id;
389 };
390
391 static struct pci_ide_stream_id *
request_stream_id(struct pci_host_bridge * hb,u8 stream_id,struct pci_ide_stream_id * sid)392 request_stream_id(struct pci_host_bridge *hb, u8 stream_id,
393 struct pci_ide_stream_id *sid)
394 {
395 if (!reserve_stream_id(hb, stream_id))
396 return NULL;
397
398 *sid = (struct pci_ide_stream_id) {
399 .hb = hb,
400 .stream_id = stream_id,
401 };
402
403 return sid;
404 }
405 DEFINE_FREE(free_stream_id, struct pci_ide_stream_id *,
406 if (_T) ida_free(&_T->hb->ide_stream_ids_ida, _T->stream_id))
407
408 /**
409 * pci_ide_stream_register() - Prepare to activate an IDE Stream
410 * @ide: IDE settings descriptor
411 *
412 * After a Stream ID has been acquired for @ide, record the presence of
413 * the stream in sysfs. The expectation is that @ide is immutable while
414 * registered.
415 */
pci_ide_stream_register(struct pci_ide * ide)416 int pci_ide_stream_register(struct pci_ide *ide)
417 {
418 struct pci_dev *pdev = ide->pdev;
419 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
420 struct pci_ide_stream_id __sid;
421 u8 ep_stream, rp_stream;
422 int rc;
423
424 if (ide->stream_id < 0 || ide->stream_id > U8_MAX) {
425 pci_err(pdev, "Setup fail: Invalid Stream ID: %d\n", ide->stream_id);
426 return -ENXIO;
427 }
428
429 struct pci_ide_stream_id *sid __free(free_stream_id) =
430 request_stream_id(hb, ide->stream_id, &__sid);
431 if (!sid) {
432 pci_err(pdev, "Setup fail: Stream ID %d in use\n", ide->stream_id);
433 return -EBUSY;
434 }
435
436 ep_stream = ide->partner[PCI_IDE_EP].stream_index;
437 rp_stream = ide->partner[PCI_IDE_RP].stream_index;
438 const char *name __free(kfree) = kasprintf(GFP_KERNEL, "stream%d.%d.%d",
439 ide->host_bridge_stream,
440 rp_stream, ep_stream);
441 if (!name)
442 return -ENOMEM;
443
444 rc = sysfs_create_link(&hb->dev.kobj, &pdev->dev.kobj, name);
445 if (rc)
446 return rc;
447
448 ide->name = no_free_ptr(name);
449
450 /* Stream ID reservation recorded in @ide is now successfully registered */
451 retain_and_null_ptr(sid);
452
453 return 0;
454 }
455 EXPORT_SYMBOL_GPL(pci_ide_stream_register);
456
457 /**
458 * pci_ide_stream_unregister() - unwind pci_ide_stream_register()
459 * @ide: idle IDE settings descriptor
460 *
461 * In preparation for freeing @ide, remove sysfs enumeration for the
462 * stream.
463 */
pci_ide_stream_unregister(struct pci_ide * ide)464 void pci_ide_stream_unregister(struct pci_ide *ide)
465 {
466 struct pci_dev *pdev = ide->pdev;
467 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus);
468
469 sysfs_remove_link(&hb->dev.kobj, ide->name);
470 kfree(ide->name);
471 ida_free(&hb->ide_stream_ids_ida, ide->stream_id);
472 ide->name = NULL;
473 }
474 EXPORT_SYMBOL_GPL(pci_ide_stream_unregister);
475
pci_ide_domain(struct pci_dev * pdev)476 static int pci_ide_domain(struct pci_dev *pdev)
477 {
478 if (pdev->fm_enabled)
479 return pci_domain_nr(pdev->bus);
480 return 0;
481 }
482
pci_ide_to_settings(struct pci_dev * pdev,struct pci_ide * ide)483 struct pci_ide_partner *pci_ide_to_settings(struct pci_dev *pdev, struct pci_ide *ide)
484 {
485 if (!pci_is_pcie(pdev)) {
486 pci_warn_once(pdev, "not a PCIe device\n");
487 return NULL;
488 }
489
490 switch (pci_pcie_type(pdev)) {
491 case PCI_EXP_TYPE_ENDPOINT:
492 if (pdev != ide->pdev) {
493 pci_warn_once(pdev, "setup expected Endpoint: %s\n", pci_name(ide->pdev));
494 return NULL;
495 }
496 return &ide->partner[PCI_IDE_EP];
497 case PCI_EXP_TYPE_ROOT_PORT: {
498 struct pci_dev *rp = pcie_find_root_port(ide->pdev);
499
500 if (pdev != rp) {
501 pci_warn_once(pdev, "setup expected Root Port: %s\n",
502 pci_name(rp));
503 return NULL;
504 }
505 return &ide->partner[PCI_IDE_RP];
506 }
507 default:
508 pci_warn_once(pdev, "invalid device type\n");
509 return NULL;
510 }
511 }
512 EXPORT_SYMBOL_GPL(pci_ide_to_settings);
513
set_ide_sel_ctl(struct pci_dev * pdev,struct pci_ide * ide,struct pci_ide_partner * settings,int pos,bool enable)514 static void set_ide_sel_ctl(struct pci_dev *pdev, struct pci_ide *ide,
515 struct pci_ide_partner *settings, int pos,
516 bool enable)
517 {
518 u32 val = FIELD_PREP(PCI_IDE_SEL_CTL_ID, ide->stream_id) |
519 FIELD_PREP(PCI_IDE_SEL_CTL_DEFAULT, settings->default_stream) |
520 FIELD_PREP(PCI_IDE_SEL_CTL_CFG_EN, pdev->ide_cfg) |
521 FIELD_PREP(PCI_IDE_SEL_CTL_TEE_LIMITED, pdev->ide_tee_limit) |
522 FIELD_PREP(PCI_IDE_SEL_CTL_EN, enable);
523
524 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_CTL, val);
525 }
526
527 #define SEL_ADDR1_LOWER GENMASK(31, 20)
528 #define SEL_ADDR_UPPER GENMASK_ULL(63, 32)
529 #define PREP_PCI_IDE_SEL_ADDR1(base, limit) \
530 (FIELD_PREP(PCI_IDE_SEL_ADDR_1_VALID, 1) | \
531 FIELD_PREP(PCI_IDE_SEL_ADDR_1_BASE_LOW, \
532 FIELD_GET(SEL_ADDR1_LOWER, (base))) | \
533 FIELD_PREP(PCI_IDE_SEL_ADDR_1_LIMIT_LOW, \
534 FIELD_GET(SEL_ADDR1_LOWER, (limit))))
535
mem_assoc_to_regs(struct pci_bus_region * region,struct pci_ide_regs * regs,int idx)536 static void mem_assoc_to_regs(struct pci_bus_region *region,
537 struct pci_ide_regs *regs, int idx)
538 {
539 /* convert to u64 range for bitfield size checks */
540 struct range r = { region->start, region->end };
541
542 regs->addr[idx].assoc1 = PREP_PCI_IDE_SEL_ADDR1(r.start, r.end);
543 regs->addr[idx].assoc2 = FIELD_GET(SEL_ADDR_UPPER, r.end);
544 regs->addr[idx].assoc3 = FIELD_GET(SEL_ADDR_UPPER, r.start);
545 }
546
547 /**
548 * pci_ide_stream_to_regs() - convert IDE settings to association register values
549 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
550 * @ide: registered IDE settings descriptor
551 * @regs: output register values
552 */
pci_ide_stream_to_regs(struct pci_dev * pdev,struct pci_ide * ide,struct pci_ide_regs * regs)553 static void pci_ide_stream_to_regs(struct pci_dev *pdev, struct pci_ide *ide,
554 struct pci_ide_regs *regs)
555 {
556 struct pci_ide_partner *settings = pci_ide_to_settings(pdev, ide);
557 int assoc_idx = 0;
558
559 memset(regs, 0, sizeof(*regs));
560
561 if (!settings)
562 return;
563
564 regs->rid1 = FIELD_PREP(PCI_IDE_SEL_RID_1_LIMIT, settings->rid_end);
565
566 regs->rid2 = FIELD_PREP(PCI_IDE_SEL_RID_2_VALID, 1) |
567 FIELD_PREP(PCI_IDE_SEL_RID_2_BASE, settings->rid_start) |
568 FIELD_PREP(PCI_IDE_SEL_RID_2_SEG, pci_ide_domain(pdev));
569
570 if (pdev->nr_ide_mem && pci_bus_region_size(&settings->mem_assoc)) {
571 mem_assoc_to_regs(&settings->mem_assoc, regs, assoc_idx);
572 assoc_idx++;
573 }
574
575 if (pdev->nr_ide_mem > assoc_idx &&
576 pci_bus_region_size(&settings->pref_assoc)) {
577 mem_assoc_to_regs(&settings->pref_assoc, regs, assoc_idx);
578 assoc_idx++;
579 }
580
581 regs->nr_addr = assoc_idx;
582 }
583
584 /**
585 * pci_ide_stream_setup() - program settings to Selective IDE Stream registers
586 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
587 * @ide: registered IDE settings descriptor
588 *
589 * When @pdev is a PCI_EXP_TYPE_ENDPOINT then the PCI_IDE_EP partner
590 * settings are written to @pdev's Selective IDE Stream register block,
591 * and when @pdev is a PCI_EXP_TYPE_ROOT_PORT, the PCI_IDE_RP settings
592 * are selected.
593 */
pci_ide_stream_setup(struct pci_dev * pdev,struct pci_ide * ide)594 void pci_ide_stream_setup(struct pci_dev *pdev, struct pci_ide *ide)
595 {
596 struct pci_ide_partner *settings = pci_ide_to_settings(pdev, ide);
597 struct pci_ide_regs regs;
598 int pos;
599
600 if (!settings)
601 return;
602
603 pci_ide_stream_to_regs(pdev, ide, ®s);
604
605 pos = sel_ide_offset(pdev, settings);
606
607 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_RID_1, regs.rid1);
608 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_RID_2, regs.rid2);
609
610 for (int i = 0; i < regs.nr_addr; i++) {
611 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_1(i),
612 regs.addr[i].assoc1);
613 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_2(i),
614 regs.addr[i].assoc2);
615 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_3(i),
616 regs.addr[i].assoc3);
617 }
618
619 /* clear extra unused address association blocks */
620 for (int i = regs.nr_addr; i < pdev->nr_ide_mem; i++) {
621 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_1(i), 0);
622 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_2(i), 0);
623 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_3(i), 0);
624 }
625
626 /*
627 * Setup control register early for devices that expect
628 * stream_id is set during key programming.
629 */
630 set_ide_sel_ctl(pdev, ide, settings, pos, false);
631 settings->setup = 1;
632 }
633 EXPORT_SYMBOL_GPL(pci_ide_stream_setup);
634
635 /**
636 * pci_ide_stream_teardown() - disable the stream and clear all settings
637 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
638 * @ide: registered IDE settings descriptor
639 *
640 * For stream destruction, zero all registers that may have been written
641 * by pci_ide_stream_setup(). Consider pci_ide_stream_disable() to leave
642 * settings in place while temporarily disabling the stream.
643 */
pci_ide_stream_teardown(struct pci_dev * pdev,struct pci_ide * ide)644 void pci_ide_stream_teardown(struct pci_dev *pdev, struct pci_ide *ide)
645 {
646 struct pci_ide_partner *settings = pci_ide_to_settings(pdev, ide);
647 int pos, i;
648
649 if (!settings)
650 return;
651
652 pos = sel_ide_offset(pdev, settings);
653
654 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_CTL, 0);
655
656 for (i = 0; i < pdev->nr_ide_mem; i++) {
657 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_1(i), 0);
658 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_2(i), 0);
659 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_ADDR_3(i), 0);
660 }
661
662 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_RID_2, 0);
663 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_RID_1, 0);
664 settings->setup = 0;
665 }
666 EXPORT_SYMBOL_GPL(pci_ide_stream_teardown);
667
668 /**
669 * pci_ide_stream_enable() - enable a Selective IDE Stream
670 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
671 * @ide: registered and setup IDE settings descriptor
672 *
673 * Activate the stream by writing to the Selective IDE Stream Control
674 * Register.
675 *
676 * Return: 0 if the stream successfully entered the "secure" state, and -EINVAL
677 * if @ide is invalid, and -ENXIO if the stream fails to enter the secure state.
678 *
679 * Note that the state may go "insecure" at any point after returning 0, but
680 * those events are equivalent to a "link down" event and handled via
681 * asynchronous error reporting.
682 *
683 * Caller is responsible to clear the enable bit in the -ENXIO case.
684 */
pci_ide_stream_enable(struct pci_dev * pdev,struct pci_ide * ide)685 int pci_ide_stream_enable(struct pci_dev *pdev, struct pci_ide *ide)
686 {
687 struct pci_ide_partner *settings = pci_ide_to_settings(pdev, ide);
688 int pos;
689 u32 val;
690
691 if (!settings)
692 return -EINVAL;
693
694 pos = sel_ide_offset(pdev, settings);
695
696 set_ide_sel_ctl(pdev, ide, settings, pos, true);
697 settings->enable = 1;
698
699 pci_read_config_dword(pdev, pos + PCI_IDE_SEL_STS, &val);
700 if (FIELD_GET(PCI_IDE_SEL_STS_STATE, val) !=
701 PCI_IDE_SEL_STS_STATE_SECURE)
702 return -ENXIO;
703
704 return 0;
705 }
706 EXPORT_SYMBOL_GPL(pci_ide_stream_enable);
707
708 /**
709 * pci_ide_stream_disable() - disable a Selective IDE Stream
710 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
711 * @ide: registered and setup IDE settings descriptor
712 *
713 * Clear the Selective IDE Stream Control Register, but leave all other
714 * registers untouched.
715 */
pci_ide_stream_disable(struct pci_dev * pdev,struct pci_ide * ide)716 void pci_ide_stream_disable(struct pci_dev *pdev, struct pci_ide *ide)
717 {
718 struct pci_ide_partner *settings = pci_ide_to_settings(pdev, ide);
719 int pos;
720
721 if (!settings)
722 return;
723
724 pos = sel_ide_offset(pdev, settings);
725
726 pci_write_config_dword(pdev, pos + PCI_IDE_SEL_CTL, 0);
727 settings->enable = 0;
728 }
729 EXPORT_SYMBOL_GPL(pci_ide_stream_disable);
730
pci_ide_init_host_bridge(struct pci_host_bridge * hb)731 void pci_ide_init_host_bridge(struct pci_host_bridge *hb)
732 {
733 hb->nr_ide_streams = 256;
734 ida_init(&hb->ide_stream_ida);
735 ida_init(&hb->ide_stream_ids_ida);
736 reserve_stream_id(hb, PCI_IDE_RESERVED_STREAM_ID);
737 }
738
available_secure_streams_show(struct device * dev,struct device_attribute * attr,char * buf)739 static ssize_t available_secure_streams_show(struct device *dev,
740 struct device_attribute *attr,
741 char *buf)
742 {
743 struct pci_host_bridge *hb = to_pci_host_bridge(dev);
744 int nr = READ_ONCE(hb->nr_ide_streams);
745 int avail = nr;
746
747 if (!nr)
748 return -ENXIO;
749
750 /*
751 * Yes, this is inefficient and racy, but it is only for occasional
752 * platform resource surveys. Worst case is bounded to 256 streams.
753 */
754 for (int i = 0; i < nr; i++)
755 if (ida_exists(&hb->ide_stream_ida, i))
756 avail--;
757 return sysfs_emit(buf, "%d\n", avail);
758 }
759 static DEVICE_ATTR_RO(available_secure_streams);
760
761 static struct attribute *pci_ide_attrs[] = {
762 &dev_attr_available_secure_streams.attr,
763 NULL
764 };
765
pci_ide_attr_visible(struct kobject * kobj,struct attribute * a,int n)766 static umode_t pci_ide_attr_visible(struct kobject *kobj, struct attribute *a, int n)
767 {
768 struct device *dev = kobj_to_dev(kobj);
769 struct pci_host_bridge *hb = to_pci_host_bridge(dev);
770
771 if (a == &dev_attr_available_secure_streams.attr)
772 if (!hb->nr_ide_streams)
773 return 0;
774
775 return a->mode;
776 }
777
778 const struct attribute_group pci_ide_attr_group = {
779 .attrs = pci_ide_attrs,
780 .is_visible = pci_ide_attr_visible,
781 };
782
783 /**
784 * pci_ide_set_nr_streams() - sets size of the pool of IDE Stream resources
785 * @hb: host bridge boundary for the stream pool
786 * @nr: number of streams
787 *
788 * Platform PCI init and/or expert test module use only. Limit IDE
789 * Stream establishment by setting the number of stream resources
790 * available at the host bridge. Platform init code must set this before
791 * the first pci_ide_stream_alloc() call if the platform has less than the
792 * default of 256 streams per host-bridge.
793 *
794 * The "PCI_IDE" symbol namespace is required because this is typically
795 * a detail that is settled in early PCI init. I.e. this export is not
796 * for endpoint drivers.
797 */
pci_ide_set_nr_streams(struct pci_host_bridge * hb,u16 nr)798 void pci_ide_set_nr_streams(struct pci_host_bridge *hb, u16 nr)
799 {
800 hb->nr_ide_streams = min(nr, 256);
801 WARN_ON_ONCE(!ida_is_empty(&hb->ide_stream_ida));
802 sysfs_update_group(&hb->dev.kobj, &pci_ide_attr_group);
803 }
804 EXPORT_SYMBOL_NS_GPL(pci_ide_set_nr_streams, "PCI_IDE");
805
pci_ide_destroy(struct pci_dev * pdev)806 void pci_ide_destroy(struct pci_dev *pdev)
807 {
808 ida_destroy(&pdev->ide_stream_ida);
809 }
810