File Index
Files and directories
Sign in
FILE

ide.c

File preview with syntax highlighting.

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