Lines Matching +full:pcie +full:- +full:root +full:- +full:port +full:- +full:1

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2024-2025 Intel Corporation. All rights reserved. */
4 /* PCIe r7.0 section 6.33 Integrity & Data Encryption (IDE) */
10 #include <linux/pci-ide.h>
34 return __sel_ide_offset(pdev->ide_cap, pdev->nr_link_ide, in sel_ide_offset()
35 settings->stream_index, pdev->nr_ide_mem); in sel_ide_offset()
42 ret = ida_alloc_range(&pdev->ide_stream_ida, idx, idx, GFP_KERNEL); in reserve_stream_index()
50 ret = ida_alloc_range(&hb->ide_stream_ids_ida, id, id, GFP_KERNEL); in reserve_stream_id()
57 dev_info(&hb->dev, "Stream ID %d active at init\n", stream_id); in claim_stream()
59 dev_info(&hb->dev, "Failed to claim %s Stream ID %d\n", in claim_stream()
81 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus); in pci_ide_init()
88 * pdev->ide_cap. in pci_ide_init()
90 ida_init(&pdev->ide_stream_ida); in pci_ide_init()
104 * Require endpoint IDE capability to be paired with IDE Root Port IDE in pci_ide_init()
110 if (!rp->ide_cap) in pci_ide_init()
114 pdev->ide_cfg = FIELD_GET(PCI_IDE_CAP_SEL_CFG, val); in pci_ide_init()
115 pdev->ide_tee_limit = FIELD_GET(PCI_IDE_CAP_TEE_LIMITED, val); in pci_ide_init()
118 nr_link_ide = 1 + FIELD_GET(PCI_IDE_CAP_LINK_TC_NUM, val); in pci_ide_init()
123 nr_streams = 1 + FIELD_GET(PCI_IDE_CAP_SEL_NUM, val); in pci_ide_init()
156 /* Reserve link stream-ids that are already active on the device */ in pci_ide_init()
164 !claim_stream(hb, id, NULL, -1)) in pci_ide_init()
191 pdev->ide_cap = ide_cap; in pci_ide_init()
192 pdev->nr_link_ide = nr_link_ide; in pci_ide_init()
193 pdev->nr_sel_ide = nr_streams; in pci_ide_init()
194 pdev->nr_ide_mem = nr_ide_mem; in pci_ide_init()
204 ida_free(stream->ida, stream->stream_index); in free_stream_index()
216 id = ida_alloc_max(ida, max - 1, GFP_KERNEL); in DEFINE_FREE()
228 * pci_ide_stream_alloc() - Reserve stream indices and probe for settings
229 * @pdev: IDE capable PCIe Endpoint Physical Function
231 * Retrieve the Requester ID range of @pdev for programming its Root
232 * Port IDE RID Association registers, and conversely retrieve the
233 * Requester ID of the Root Port for programming @pdev's IDE RID
236 * Allocate a Selective IDE Stream Register Block instance per port.
245 struct stream_index __stream[PCI_IDE_HB + 1]; in pci_ide_stream_alloc()
246 struct pci_bus_region pref_assoc = { 0, -1 }; in pci_ide_stream_alloc()
247 struct pci_bus_region mem_assoc = { 0, -1 }; in pci_ide_stream_alloc()
259 if (!pdev->ide_cap) in pci_ide_stream_alloc()
266 hb = pci_find_host_bridge(pdev->bus); in pci_ide_stream_alloc()
268 &hb->ide_stream_ida, hb->nr_ide_streams, &__stream[PCI_IDE_HB]); in pci_ide_stream_alloc()
274 &rp->ide_stream_ida, rp->nr_sel_ide, &__stream[PCI_IDE_RP]); in pci_ide_stream_alloc()
279 &pdev->ide_stream_ida, pdev->nr_sel_ide, &__stream[PCI_IDE_EP]); in pci_ide_stream_alloc()
283 /* for SR-IOV case, cover all VFs */ in pci_ide_stream_alloc()
296 * Check if the device consumes memory and/or prefetch-memory. Setup in pci_ide_stream_alloc()
302 pcibios_resource_to_bus(br->bus, &mem_assoc, mem); in pci_ide_stream_alloc()
304 pcibios_resource_to_bus(br->bus, &pref_assoc, pref); in pci_ide_stream_alloc()
312 .stream_index = no_free_ptr(ep_stream)->stream_index, in pci_ide_stream_alloc()
314 .mem_assoc = { 0, -1 }, in pci_ide_stream_alloc()
315 .pref_assoc = { 0, -1 }, in pci_ide_stream_alloc()
320 .stream_index = no_free_ptr(rp_stream)->stream_index, in pci_ide_stream_alloc()
325 .host_bridge_stream = no_free_ptr(hb_stream)->stream_index, in pci_ide_stream_alloc()
326 .stream_id = -1, in pci_ide_stream_alloc()
334 * pci_ide_stream_free() - unwind pci_ide_stream_alloc()
343 struct pci_dev *pdev = ide->pdev; in pci_ide_stream_free()
345 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus); in pci_ide_stream_free()
347 ida_free(&pdev->ide_stream_ida, ide->partner[PCI_IDE_EP].stream_index); in pci_ide_stream_free()
348 ida_free(&rp->ide_stream_ida, ide->partner[PCI_IDE_RP].stream_index); in pci_ide_stream_free()
349 ida_free(&hb->ide_stream_ida, ide->host_bridge_stream); in pci_ide_stream_free()
355 * pci_ide_stream_release() - unwind and release an @ide context
367 struct pci_dev *pdev = ide->pdev; in pci_ide_stream_release()
370 if (ide->partner[PCI_IDE_RP].enable) in pci_ide_stream_release()
373 if (ide->partner[PCI_IDE_EP].enable) in pci_ide_stream_release()
376 if (ide->tsm_dev) in pci_ide_stream_release()
379 if (ide->partner[PCI_IDE_RP].setup) in pci_ide_stream_release()
382 if (ide->partner[PCI_IDE_EP].setup) in pci_ide_stream_release()
385 if (ide->name) in pci_ide_stream_release()
412 if (_T) ida_free(&_T->hb->ide_stream_ids_ida, _T->stream_id))
415 * pci_ide_stream_register() - Prepare to activate an IDE Stream
424 struct pci_dev *pdev = ide->pdev; in pci_ide_stream_register()
425 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus); in pci_ide_stream_register()
430 if (ide->stream_id < 0 || ide->stream_id > U8_MAX) { in pci_ide_stream_register()
431 pci_err(pdev, "Setup fail: Invalid Stream ID: %d\n", ide->stream_id); in pci_ide_stream_register()
432 return -ENXIO; in pci_ide_stream_register()
436 request_stream_id(hb, ide->stream_id, &__sid); in pci_ide_stream_register()
438 pci_err(pdev, "Setup fail: Stream ID %d in use\n", ide->stream_id); in pci_ide_stream_register()
439 return -EBUSY; in pci_ide_stream_register()
442 ep_stream = ide->partner[PCI_IDE_EP].stream_index; in pci_ide_stream_register()
443 rp_stream = ide->partner[PCI_IDE_RP].stream_index; in pci_ide_stream_register()
445 ide->host_bridge_stream, in pci_ide_stream_register()
448 return -ENOMEM; in pci_ide_stream_register()
450 rc = sysfs_create_link(&hb->dev.kobj, &pdev->dev.kobj, name); in pci_ide_stream_register()
454 ide->name = no_free_ptr(name); in pci_ide_stream_register()
464 * pci_ide_stream_unregister() - unwind pci_ide_stream_register()
472 struct pci_dev *pdev = ide->pdev; in pci_ide_stream_unregister()
473 struct pci_host_bridge *hb = pci_find_host_bridge(pdev->bus); in pci_ide_stream_unregister()
475 sysfs_remove_link(&hb->dev.kobj, ide->name); in pci_ide_stream_unregister()
476 kfree(ide->name); in pci_ide_stream_unregister()
477 ida_free(&hb->ide_stream_ids_ida, ide->stream_id); in pci_ide_stream_unregister()
478 ide->name = NULL; in pci_ide_stream_unregister()
484 if (pdev->fm_enabled) in pci_ide_domain()
485 return pci_domain_nr(pdev->bus); in pci_ide_domain()
492 pci_warn_once(pdev, "not a PCIe device\n"); in pci_ide_to_settings()
498 if (pdev != ide->pdev) { in pci_ide_to_settings()
499 pci_warn_once(pdev, "setup expected Endpoint: %s\n", pci_name(ide->pdev)); in pci_ide_to_settings()
502 return &ide->partner[PCI_IDE_EP]; in pci_ide_to_settings()
504 struct pci_dev *rp = pcie_find_root_port(ide->pdev); in pci_ide_to_settings()
507 pci_warn_once(pdev, "setup expected Root Port: %s\n", in pci_ide_to_settings()
511 return &ide->partner[PCI_IDE_RP]; in pci_ide_to_settings()
524 u32 val = FIELD_PREP(PCI_IDE_SEL_CTL_ID, ide->stream_id) | in set_ide_sel_ctl()
525 FIELD_PREP(PCI_IDE_SEL_CTL_DEFAULT, settings->default_stream) | in set_ide_sel_ctl()
526 FIELD_PREP(PCI_IDE_SEL_CTL_CFG_EN, pdev->ide_cfg) | in set_ide_sel_ctl()
527 FIELD_PREP(PCI_IDE_SEL_CTL_TEE_LIMITED, pdev->ide_tee_limit) | in set_ide_sel_ctl()
536 (FIELD_PREP(PCI_IDE_SEL_ADDR_1_VALID, 1) | \
546 struct range r = { region->start, region->end }; in mem_assoc_to_regs()
548 regs->addr[idx].assoc1 = PREP_PCI_IDE_SEL_ADDR1(r.start, r.end); in mem_assoc_to_regs()
549 regs->addr[idx].assoc2 = FIELD_GET(SEL_ADDR_UPPER, r.end); in mem_assoc_to_regs()
550 regs->addr[idx].assoc3 = FIELD_GET(SEL_ADDR_UPPER, r.start); in mem_assoc_to_regs()
554 * pci_ide_stream_to_regs() - convert IDE settings to association register values
555 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
570 regs->rid1 = FIELD_PREP(PCI_IDE_SEL_RID_1_LIMIT, settings->rid_end); in pci_ide_stream_to_regs()
572 regs->rid2 = FIELD_PREP(PCI_IDE_SEL_RID_2_VALID, 1) | in pci_ide_stream_to_regs()
573 FIELD_PREP(PCI_IDE_SEL_RID_2_BASE, settings->rid_start) | in pci_ide_stream_to_regs()
576 if (pdev->nr_ide_mem && pci_bus_region_size(&settings->mem_assoc)) { in pci_ide_stream_to_regs()
577 mem_assoc_to_regs(&settings->mem_assoc, regs, assoc_idx); in pci_ide_stream_to_regs()
581 if (pdev->nr_ide_mem > assoc_idx && in pci_ide_stream_to_regs()
582 pci_bus_region_size(&settings->pref_assoc)) { in pci_ide_stream_to_regs()
583 mem_assoc_to_regs(&settings->pref_assoc, regs, assoc_idx); in pci_ide_stream_to_regs()
587 regs->nr_addr = assoc_idx; in pci_ide_stream_to_regs()
591 * pci_ide_stream_setup() - program settings to Selective IDE Stream registers
592 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
626 for (int i = regs.nr_addr; i < pdev->nr_ide_mem; i++) { in pci_ide_stream_setup()
637 settings->setup = 1; in pci_ide_stream_setup()
642 * pci_ide_stream_teardown() - disable the stream and clear all settings
643 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
662 for (i = 0; i < pdev->nr_ide_mem; i++) { in pci_ide_stream_teardown()
670 settings->setup = 0; in pci_ide_stream_teardown()
675 * pci_ide_stream_enable() - enable a Selective IDE Stream
676 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
682 * Return: 0 if the stream successfully entered the "secure" state, and -EINVAL
683 * if @ide is invalid, and -ENXIO if the stream fails to enter the secure state.
689 * Caller is responsible to clear the enable bit in the -ENXIO case.
698 return -EINVAL; in pci_ide_stream_enable()
703 settings->enable = 1; in pci_ide_stream_enable()
708 return -ENXIO; in pci_ide_stream_enable()
715 * pci_ide_stream_disable() - disable a Selective IDE Stream
716 * @pdev: PCIe device object for either a Root Port or Endpoint Partner Port
733 settings->enable = 0; in pci_ide_stream_disable()
739 hb->nr_ide_streams = 256; in pci_ide_init_host_bridge()
740 ida_init(&hb->ide_stream_ida); in pci_ide_init_host_bridge()
741 ida_init(&hb->ide_stream_ids_ida); in pci_ide_init_host_bridge()
750 int nr = READ_ONCE(hb->nr_ide_streams); in available_secure_streams_show()
754 return -ENXIO; in available_secure_streams_show()
761 if (ida_exists(&hb->ide_stream_ida, i)) in available_secure_streams_show()
762 avail--; in available_secure_streams_show()
778 if (!hb->nr_ide_streams) in pci_ide_attr_visible()
781 return a->mode; in pci_ide_attr_visible()
790 * pci_ide_set_nr_streams() - sets size of the pool of IDE Stream resources
798 * default of 256 streams per host-bridge.
806 hb->nr_ide_streams = min(nr, 256); in pci_ide_set_nr_streams()
807 WARN_ON_ONCE(!ida_is_empty(&hb->ide_stream_ida)); in pci_ide_set_nr_streams()
808 sysfs_update_group(&hb->dev.kobj, &pci_ide_attr_group); in pci_ide_set_nr_streams()
814 ida_destroy(&pdev->ide_stream_ida); in pci_ide_destroy()