Lines Matching full:iommu

9 #include <linux/amd-iommu.h>
13 #include <asm/iommu.h>
18 #include "../iommu-pages.h"
20 int __init amd_iommu_alloc_ppr_log(struct amd_iommu *iommu) in amd_iommu_alloc_ppr_log() argument
22 iommu->ppr_log = iommu_alloc_4k_pages(iommu, GFP_KERNEL | __GFP_ZERO, in amd_iommu_alloc_ppr_log()
24 return iommu->ppr_log ? 0 : -ENOMEM; in amd_iommu_alloc_ppr_log()
27 void amd_iommu_enable_ppr_log(struct amd_iommu *iommu) in amd_iommu_enable_ppr_log() argument
31 if (iommu->ppr_log == NULL) in amd_iommu_enable_ppr_log()
34 iommu_feature_enable(iommu, CONTROL_PPR_EN); in amd_iommu_enable_ppr_log()
36 entry = iommu_virt_to_phys(iommu->ppr_log) | PPR_LOG_SIZE_512; in amd_iommu_enable_ppr_log()
38 memcpy_toio(iommu->mmio_base + MMIO_PPR_LOG_OFFSET, in amd_iommu_enable_ppr_log()
42 writel(0x00, iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); in amd_iommu_enable_ppr_log()
43 writel(0x00, iommu->mmio_base + MMIO_PPR_TAIL_OFFSET); in amd_iommu_enable_ppr_log()
45 iommu_feature_enable(iommu, CONTROL_PPRINT_EN); in amd_iommu_enable_ppr_log()
46 iommu_feature_enable(iommu, CONTROL_PPRLOG_EN); in amd_iommu_enable_ppr_log()
49 void __init amd_iommu_free_ppr_log(struct amd_iommu *iommu) in amd_iommu_free_ppr_log() argument
51 iommu_free_pages(iommu->ppr_log, get_order(PPR_LOG_SIZE)); in amd_iommu_free_ppr_log()
55 * This function restarts ppr logging in case the IOMMU experienced
58 void amd_iommu_restart_ppr_log(struct amd_iommu *iommu) in amd_iommu_restart_ppr_log() argument
60 amd_iommu_restart_log(iommu, "PPR", CONTROL_PPRINT_EN, in amd_iommu_restart_ppr_log()
81 static bool ppr_is_valid(struct amd_iommu *iommu, u64 *raw) in ppr_is_valid() argument
83 struct device *dev = iommu->iommu.dev; in ppr_is_valid()
89 iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), in ppr_is_valid()
97 iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), in ppr_is_valid()
105 static void iommu_call_iopf_notifier(struct amd_iommu *iommu, u64 *raw) in iommu_call_iopf_notifier() argument
117 pdev = pci_get_domain_bus_and_slot(iommu->pci_seg->id, in iommu_call_iopf_notifier()
122 if (!ppr_is_valid(iommu, raw)) in iommu_call_iopf_notifier()
162 void amd_iommu_poll_ppr_log(struct amd_iommu *iommu) in amd_iommu_poll_ppr_log() argument
166 if (iommu->ppr_log == NULL) in amd_iommu_poll_ppr_log()
169 head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); in amd_iommu_poll_ppr_log()
170 tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET); in amd_iommu_poll_ppr_log()
177 raw = (u64 *)(iommu->ppr_log + head); in amd_iommu_poll_ppr_log()
205 writel(head, iommu->mmio_base + MMIO_PPR_HEAD_OFFSET); in amd_iommu_poll_ppr_log()
208 iommu_call_iopf_notifier(iommu, entry); in amd_iommu_poll_ppr_log()
217 /* Setup per-IOMMU IOPF queue if not exist. */
218 int amd_iommu_iopf_init(struct amd_iommu *iommu) in amd_iommu_iopf_init() argument
222 if (iommu->iopf_queue) in amd_iommu_iopf_init()
225 snprintf(iommu->iopfq_name, sizeof(iommu->iopfq_name), "amdvi-%#x", in amd_iommu_iopf_init()
226 PCI_SEG_DEVID_TO_SBDF(iommu->pci_seg->id, iommu->devid)); in amd_iommu_iopf_init()
228 iommu->iopf_queue = iopf_queue_alloc(iommu->iopfq_name); in amd_iommu_iopf_init()
229 if (!iommu->iopf_queue) in amd_iommu_iopf_init()
235 /* Destroy per-IOMMU IOPF queue if no longer needed. */
236 void amd_iommu_iopf_uninit(struct amd_iommu *iommu) in amd_iommu_iopf_uninit() argument
238 iopf_queue_free(iommu->iopf_queue); in amd_iommu_iopf_uninit()
239 iommu->iopf_queue = NULL; in amd_iommu_iopf_uninit()
248 int amd_iommu_iopf_add_device(struct amd_iommu *iommu, in amd_iommu_iopf_add_device() argument
256 if (!iommu->iopf_queue) in amd_iommu_iopf_add_device()
259 ret = iopf_queue_add_device(iommu->iopf_queue, dev_data->dev); in amd_iommu_iopf_add_device()
268 void amd_iommu_iopf_remove_device(struct amd_iommu *iommu, in amd_iommu_iopf_remove_device() argument
271 iopf_queue_remove_device(iommu->iopf_queue, dev_data->dev); in amd_iommu_iopf_remove_device()