Lines Matching +full:ats +full:- +full:supported
1 // SPDX-License-Identifier: GPL-2.0
14 #include <linux/pci-ats.h>
31 dev->ats_cap = pos; in pci_ats_init()
35 * pci_ats_supported - check if the device can use ATS
38 * Returns true if the device supports ATS and is allowed to use it, false
43 if (!dev->ats_cap) in pci_ats_supported()
46 return (dev->untrusted == 0); in pci_ats_supported()
51 * pci_prepare_ats - Setup the PS for ATS
56 * ensure that the VF can have ATS enabled.
65 return -EINVAL; in pci_prepare_ats()
67 if (WARN_ON(dev->ats_enabled)) in pci_prepare_ats()
68 return -EBUSY; in pci_prepare_ats()
71 return -EINVAL; in pci_prepare_ats()
73 if (dev->is_virtfn) in pci_prepare_ats()
76 dev->ats_stu = ps; in pci_prepare_ats()
77 ctrl = PCI_ATS_CTRL_STU(dev->ats_stu - PCI_ATS_MIN_STU); in pci_prepare_ats()
78 pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl); in pci_prepare_ats()
84 * pci_enable_ats - enable the ATS capability
96 return -EINVAL; in pci_enable_ats()
98 if (WARN_ON(dev->ats_enabled)) in pci_enable_ats()
99 return -EBUSY; in pci_enable_ats()
102 return -EINVAL; in pci_enable_ats()
105 * Note that enabling ATS on a VF fails unless it's already enabled in pci_enable_ats()
109 if (dev->is_virtfn) { in pci_enable_ats()
111 if (pdev->ats_stu != ps) in pci_enable_ats()
112 return -EINVAL; in pci_enable_ats()
114 dev->ats_stu = ps; in pci_enable_ats()
115 ctrl |= PCI_ATS_CTRL_STU(dev->ats_stu - PCI_ATS_MIN_STU); in pci_enable_ats()
117 pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl); in pci_enable_ats()
119 dev->ats_enabled = 1; in pci_enable_ats()
125 * pci_disable_ats - disable the ATS capability
132 if (WARN_ON(!dev->ats_enabled)) in pci_disable_ats()
135 pci_read_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, &ctrl); in pci_disable_ats()
137 pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl); in pci_disable_ats()
139 dev->ats_enabled = 0; in pci_disable_ats()
147 if (!dev->ats_enabled) in pci_restore_ats_state()
151 if (!dev->is_virtfn) in pci_restore_ats_state()
152 ctrl |= PCI_ATS_CTRL_STU(dev->ats_stu - PCI_ATS_MIN_STU); in pci_restore_ats_state()
153 pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl); in pci_restore_ats_state()
157 * pci_ats_queue_depth - query the ATS Invalidate Queue Depth
162 * The ATS spec uses 0 in the Invalidate Queue Depth field to
172 if (!dev->ats_cap) in pci_ats_queue_depth()
173 return -EINVAL; in pci_ats_queue_depth()
175 if (dev->is_virtfn) in pci_ats_queue_depth()
178 pci_read_config_word(dev, dev->ats_cap + PCI_ATS_CAP, &cap); in pci_ats_queue_depth()
183 * pci_ats_page_aligned - Return Page Aligned Request bit status.
197 if (!pdev->ats_cap) in pci_ats_page_aligned()
200 pci_read_config_word(pdev, pdev->ats_cap + PCI_ATS_CAP, &cap); in pci_ats_page_aligned()
213 pdev->pri_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI); in pci_pri_init()
215 if (!pdev->pri_cap) in pci_pri_init()
218 pci_read_config_word(pdev, pdev->pri_cap + PCI_PRI_STATUS, &status); in pci_pri_init()
220 pdev->pasid_required = 1; in pci_pri_init()
224 * pci_enable_pri - Enable PRI capability
234 int pri = pdev->pri_cap; in pci_enable_pri()
241 if (pdev->is_virtfn) { in pci_enable_pri()
242 if (pci_physfn(pdev)->pri_enabled) in pci_enable_pri()
244 return -EINVAL; in pci_enable_pri()
247 if (WARN_ON(pdev->pri_enabled)) in pci_enable_pri()
248 return -EBUSY; in pci_enable_pri()
251 return -EINVAL; in pci_enable_pri()
255 return -EBUSY; in pci_enable_pri()
259 pdev->pri_reqs_alloc = reqs; in pci_enable_pri()
265 pdev->pri_enabled = 1; in pci_enable_pri()
271 * pci_disable_pri - Disable PRI capability
274 * Only clears the enabled-bit, regardless of its former value
279 int pri = pdev->pri_cap; in pci_disable_pri()
282 if (pdev->is_virtfn) in pci_disable_pri()
285 if (WARN_ON(!pdev->pri_enabled)) in pci_disable_pri()
295 pdev->pri_enabled = 0; in pci_disable_pri()
300 * pci_restore_pri_state - Restore PRI
306 u32 reqs = pdev->pri_reqs_alloc; in pci_restore_pri_state()
307 int pri = pdev->pri_cap; in pci_restore_pri_state()
309 if (pdev->is_virtfn) in pci_restore_pri_state()
312 if (!pdev->pri_enabled) in pci_restore_pri_state()
323 * pci_reset_pri - Resets device's PRI state
332 int pri = pdev->pri_cap; in pci_reset_pri()
334 if (pdev->is_virtfn) in pci_reset_pri()
337 if (WARN_ON(pdev->pri_enabled)) in pci_reset_pri()
338 return -EBUSY; in pci_reset_pri()
341 return -EINVAL; in pci_reset_pri()
350 * pci_prg_resp_pasid_required - Return PRG Response PASID Required bit
358 if (pdev->is_virtfn) in pci_prg_resp_pasid_required()
361 return pdev->pasid_required; in pci_prg_resp_pasid_required()
365 * pci_pri_supported - Check if PRI is supported.
373 if (pci_physfn(pdev)->pri_cap) in pci_pri_supported()
383 pdev->pasid_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PASID); in pci_pasid_init()
387 * pci_enable_pasid - Enable the PASID capability
392 * whether the features are actually supported by the device and returns
397 u16 control, supported; in pci_enable_pasid() local
398 int pasid = pdev->pasid_cap; in pci_enable_pasid()
404 if (pdev->is_virtfn) { in pci_enable_pasid()
405 if (pci_physfn(pdev)->pasid_enabled) in pci_enable_pasid()
407 return -EINVAL; in pci_enable_pasid()
410 if (WARN_ON(pdev->pasid_enabled)) in pci_enable_pasid()
411 return -EBUSY; in pci_enable_pasid()
413 if (!pdev->eetlp_prefix_max && !pdev->pasid_no_tlp) in pci_enable_pasid()
414 return -EINVAL; in pci_enable_pasid()
417 return -EINVAL; in pci_enable_pasid()
420 return -EINVAL; in pci_enable_pasid()
422 pci_read_config_word(pdev, pasid + PCI_PASID_CAP, &supported); in pci_enable_pasid()
423 supported &= PCI_PASID_CAP_EXEC | PCI_PASID_CAP_PRIV; in pci_enable_pasid()
426 if ((supported & features) != features) in pci_enable_pasid()
427 return -EINVAL; in pci_enable_pasid()
430 pdev->pasid_features = features; in pci_enable_pasid()
434 pdev->pasid_enabled = 1; in pci_enable_pasid()
441 * pci_disable_pasid - Disable the PASID capability
447 int pasid = pdev->pasid_cap; in pci_disable_pasid()
450 if (pdev->is_virtfn) in pci_disable_pasid()
453 if (WARN_ON(!pdev->pasid_enabled)) in pci_disable_pasid()
461 pdev->pasid_enabled = 0; in pci_disable_pasid()
466 * pci_restore_pasid_state - Restore PASID capabilities
472 int pasid = pdev->pasid_cap; in pci_restore_pasid_state()
474 if (pdev->is_virtfn) in pci_restore_pasid_state()
477 if (!pdev->pasid_enabled) in pci_restore_pasid_state()
483 control = PCI_PASID_CTRL_ENABLE | pdev->pasid_features; in pci_restore_pasid_state()
488 * pci_pasid_features - Check which PASID features are supported
492 * Otherwise return a bitmask with supported features. Current
494 * PCI_PASID_CAP_EXEC - Execute permission supported
495 * PCI_PASID_CAP_PRIV - Privileged mode supported
499 u16 supported; in pci_pasid_features() local
502 if (pdev->is_virtfn) in pci_pasid_features()
505 pasid = pdev->pasid_cap; in pci_pasid_features()
507 return -EINVAL; in pci_pasid_features()
509 pci_read_config_word(pdev, pasid + PCI_PASID_CAP, &supported); in pci_pasid_features()
511 supported &= PCI_PASID_CAP_EXEC | PCI_PASID_CAP_PRIV; in pci_pasid_features()
513 return supported; in pci_pasid_features()
518 * pci_max_pasids - Get maximum number of PASIDs supported by device
522 * Otherwise it returns the number of supported PASIDs.
526 u16 supported; in pci_max_pasids() local
529 if (pdev->is_virtfn) in pci_max_pasids()
532 pasid = pdev->pasid_cap; in pci_max_pasids()
534 return -EINVAL; in pci_max_pasids()
536 pci_read_config_word(pdev, pasid + PCI_PASID_CAP, &supported); in pci_max_pasids()
538 return (1 << FIELD_GET(PCI_PASID_CAP_WIDTH, supported)); in pci_max_pasids()