| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Common helpers for drivers (e.g. low-level PCI/TSM drivers) implementing the |
| * IDE key management protocol (IDE_KM) as defined by: |
| * PCIe r7.0 section 6.33 Integrity & Data Encryption (IDE) |
| * |
| * Copyright(c) 2024-2025 Intel Corporation. All rights reserved. |
| */ |
| |
| #ifndef __PCI_IDE_H__ |
| #define __PCI_IDE_H__ |
| |
| enum pci_ide_partner_select { |
| PCI_IDE_EP, |
| PCI_IDE_RP, |
| PCI_IDE_PARTNER_MAX, |
| /* |
| * In addition to the resources in each partner port the |
| * platform / host-bridge additionally has a Stream ID pool that |
| * it shares across root ports. Let pci_ide_stream_alloc() use |
| * the alloc_stream_index() helper as endpoints and root ports. |
| */ |
| PCI_IDE_HB = PCI_IDE_PARTNER_MAX, |
| }; |
| |
| /** |
| * struct pci_ide_partner - Per port pair Selective IDE Stream settings |
| * @rid_start: Partner Port Requester ID range start |
| * @rid_end: Partner Port Requester ID range end (inclusive) |
| * @stream_index: Selective IDE Stream Register Block selection |
| * @mem_assoc: PCI bus memory address association for targeting peer partner |
| * @pref_assoc: PCI bus prefetchable memory address association for |
| * targeting peer partner |
| * @default_stream: Endpoint uses this stream for all upstream TLPs regardless of |
| * address and RID association registers |
| * @setup: flag to track whether to run pci_ide_stream_teardown() for this |
| * partner slot |
| * @enable: flag whether to run pci_ide_stream_disable() for this partner slot |
| * |
| * By default, pci_ide_stream_alloc() initializes @mem_assoc and @pref_assoc |
| * with the immediate ancestor downstream port memory ranges (i.e. Type 1 |
| * Configuration Space Header values). Caller may zero size ({0, -1}) the range |
| * to drop it from consideration at pci_ide_stream_setup() time. |
| */ |
| struct pci_ide_partner { |
| u16 rid_start; |
| u16 rid_end; |
| u8 stream_index; |
| struct pci_bus_region mem_assoc; |
| struct pci_bus_region pref_assoc; |
| unsigned int default_stream:1; |
| unsigned int setup:1; |
| unsigned int enable:1; |
| }; |
| |
| /** |
| * struct pci_ide_regs - Hardware register association settings for Selective |
| * IDE Streams |
| * @rid1: IDE RID Association Register 1 |
| * @rid2: IDE RID Association Register 2 |
| * @addr: Up to two address association blocks (IDE Address Association Register |
| * 1 through 3) for MMIO and prefetchable MMIO |
| * @nr_addr: Number of address association blocks initialized |
| * |
| * See pci_ide_stream_to_regs() |
| */ |
| struct pci_ide_regs { |
| u32 rid1; |
| u32 rid2; |
| struct { |
| u32 assoc1; |
| u32 assoc2; |
| u32 assoc3; |
| } addr[2]; |
| int nr_addr; |
| }; |
| |
| /** |
| * struct pci_ide - PCIe Selective IDE Stream descriptor |
| * @pdev: PCIe Endpoint in the pci_ide_partner pair |
| * @partner: per-partner settings |
| * @host_bridge_stream: allocated from host bridge @ide_stream_ida pool |
| * @stream_id: unique Stream ID (within Partner Port pairing) |
| * @name: name of the established Selective IDE Stream in sysfs |
| * |
| * Negative @stream_id values indicate "uninitialized" on the |
| * expectation that with TSM established IDE the TSM owns the stream_id |
| * allocation. |
| */ |
| struct pci_ide { |
| struct pci_dev *pdev; |
| struct pci_ide_partner partner[PCI_IDE_PARTNER_MAX]; |
| u8 host_bridge_stream; |
| int stream_id; |
| const char *name; |
| }; |
| |
| /* |
| * Some devices need help with aliased stream-ids even for idle streams. Use |
| * this id as the "never enabled" place holder. |
| */ |
| #define PCI_IDE_RESERVED_STREAM_ID 255 |
| |
| void pci_ide_set_nr_streams(struct pci_host_bridge *hb, u16 nr); |
| struct pci_ide_partner *pci_ide_to_settings(struct pci_dev *pdev, |
| struct pci_ide *ide); |
| struct pci_ide *pci_ide_stream_alloc(struct pci_dev *pdev); |
| void pci_ide_stream_free(struct pci_ide *ide); |
| int pci_ide_stream_register(struct pci_ide *ide); |
| void pci_ide_stream_unregister(struct pci_ide *ide); |
| void pci_ide_stream_setup(struct pci_dev *pdev, struct pci_ide *ide); |
| void pci_ide_stream_teardown(struct pci_dev *pdev, struct pci_ide *ide); |
| int pci_ide_stream_enable(struct pci_dev *pdev, struct pci_ide *ide); |
| void pci_ide_stream_disable(struct pci_dev *pdev, struct pci_ide *ide); |
| void pci_ide_stream_release(struct pci_ide *ide); |
| DEFINE_FREE(pci_ide_stream_release, struct pci_ide *, if (_T) pci_ide_stream_release(_T)) |
| #endif /* __PCI_IDE_H__ */ |