From: Sohil Mehta <sohil.mehta@intel.com> To: Joerg Roedel <joro@8bytes.org>, Alex Williamson <alex.williamson@redhat.com> Cc: David Woodhouse <dwmw2@infradead.org>, Ashok Raj <ashok.raj@intel.com>, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Jacob Pan <jacob.jun.pan@linux.intel.com>, Gayatri Kammela <gayatri.kammela@intel.com>, Sohil Mehta <sohil.mehta@intel.com>, Ravi V Shankar <ravi.v.shankar@intel.com>, Andriy Shevchenko <andriy.shevchenko@intel.com>, Fenghua Yu <fenghua.yu@intel.com> Subject: [PATCH v2 2/6] iommu/vt-d: Add Intel IOMMU debugfs to show context internals Date: Wed, 22 Nov 2017 11:25:42 -0800 [thread overview] Message-ID: <1511378746-109275-3-git-send-email-sohil.mehta@intel.com> (raw) In-Reply-To: <1511378746-109275-1-git-send-email-sohil.mehta@intel.com> From: Gayatri Kammela <gayatri.kammela@intel.com> IOMMU internals states such as root and context can be exported to the userspace. Example of such dump in Kabylake: root@OTC-KBLH-01:~# cat /sys/kernel/debug/intel_iommu/intel_iommu_ctx IOMMU dmar2: Root Table Addr:4558a3000 Root tbl entries: Bus 0 L: 4558aa001 H: 0 Context table entries for Bus: 0 [entry] DID :B :D .F Low High [160] 0000:00:14.00 4558a9001 102 [184] 0000:00:17.00 400eac001 302 [248] 0000:00:1f.00 4558af001 202 [251] 0000:00:1f.03 40070e001 502 [254] 0000:00:1f.06 4467c9001 602 Root tbl entries: Bus 1 L: 3fc8c2001 H: 0 Context table entries for Bus: 1 [entry] DID :B :D .F Low High [0] 0000:01:00.00 3fc8c3001 402 Cc: Sohil Mehta <sohil.mehta@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Gayatri Kammela <gayatri.kammela@intel.com> --- v2: No change drivers/iommu/Makefile | 1 + drivers/iommu/intel-iommu-debug.c | 149 ++++++++++++++++++++++++++++++++++++++ drivers/iommu/intel-iommu.c | 4 + 3 files changed, 154 insertions(+) create mode 100644 drivers/iommu/intel-iommu-debug.c diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index 1fb6958..fdbaf46 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_ARM_SMMU) += arm-smmu.o obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o obj-$(CONFIG_DMAR_TABLE) += dmar.o obj-$(CONFIG_INTEL_IOMMU) += intel-iommu.o +obj-$(CONFIG_INTEL_IOMMU_DEBUG) += intel-iommu-debug.o obj-$(CONFIG_INTEL_IOMMU_SVM) += intel-svm.o obj-$(CONFIG_IPMMU_VMSA) += ipmmu-vmsa.o obj-$(CONFIG_IRQ_REMAP) += intel_irq_remapping.o irq_remapping.o diff --git a/drivers/iommu/intel-iommu-debug.c b/drivers/iommu/intel-iommu-debug.c new file mode 100644 index 0000000..90872ed --- /dev/null +++ b/drivers/iommu/intel-iommu-debug.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2017 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * Authors: Gayatri Kammela <gayatri.kammela@intel.com> + * Jacob Pan <jacob.jun.pan@linux.intel.com> + * + */ + +#define pr_fmt(fmt) "INTEL_IOMMU: " fmt +#include <linux/err.h> +#include <linux/io.h> +#include <linux/slab.h> +#include <linux/uaccess.h> +#include <linux/pm_runtime.h> +#include <linux/debugfs.h> +#include <linux/pci.h> +#include <linux/iommu.h> +#include <linux/intel-iommu.h> +#include <linux/intel-svm.h> +#include <linux/dmar.h> +#include <linux/spinlock.h> + +#include "irq_remapping.h" + +#define TOTAL_BUS_NR (256) /* full bus range 256 */ + +static void ctx_tbl_entry_show(struct seq_file *m, void *unused, + struct intel_iommu *iommu, int bus, bool ext, + bool new_ext) +{ + struct context_entry *context; + int ctx; + unsigned long flags; + + seq_printf(m, "%s Context table entries for Bus: %d\n", + ext ? "Lower" : "", bus); + seq_printf(m, "[entry]\tDID :B :D .F\tLow\t\tHigh\n"); + + spin_lock_irqsave(&iommu->lock, flags); + + /* Publish either context entries or extended contenxt entries */ + for (ctx = 0; ctx < (ext ? 128 : 256); ctx++) { + context = iommu_context_addr(iommu, bus, ctx, 0); + if (!context) + goto out; + if (context_present(context)) { + seq_printf(m, "[%d]\t%04x:%02x:%02x.%02x\t%llx\t%llx\n", + ctx, iommu->segment, bus, PCI_SLOT(ctx), + PCI_FUNC(ctx), context[0].lo, context[0].hi); + } + } +out: + spin_unlock_irqrestore(&iommu->lock, flags); +} + +static void root_tbl_entry_show(struct seq_file *m, void *unused, + struct intel_iommu *iommu, u64 rtaddr_reg, + bool ext, bool new_ext) +{ + int bus; + + seq_printf(m, "\nIOMMU %s: %2s Root Table Addr:%llx\n", iommu->name, + ext ? "Extended" : "", rtaddr_reg); + /* Publish extended root table entries or root table entries here */ + for (bus = 0; bus < TOTAL_BUS_NR; bus++) { + if (!iommu->root_entry[bus].lo) + continue; + + seq_printf(m, "%s Root tbl entries:\n", ext ? "Extended" : ""); + seq_printf(m, "Bus %d L: %llx H: %llx\n", bus, + iommu->root_entry[bus].lo, iommu->root_entry[bus].hi + ); + + ctx_tbl_entry_show(m, unused, iommu, bus, ext, new_ext); + } +} + +static int intel_iommu_debug_show(struct seq_file *m, void *unused) +{ + struct dmar_drhd_unit *drhd; + struct intel_iommu *iommu; + u64 rtaddr_reg; + bool new_ext, ext; + + rcu_read_lock(); + for_each_active_iommu(iommu, drhd) { + if (iommu) { + /* Check if root table type is set */ + rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG); + ext = !!(rtaddr_reg & DMA_RTADDR_RTT); + new_ext = !!ecap_ecs(iommu->ecap); + if (new_ext != ext) { + seq_printf(m, "IOMMU %s: invalid ecs\n", + iommu->name); + rcu_read_unlock(); + return -EINVAL; + } + root_tbl_entry_show(m, unused, iommu, rtaddr_reg, ext, + new_ext); + } + } + rcu_read_unlock(); + + return 0; +} + +static int intel_iommu_debug_open(struct inode *inode, struct file *file) +{ + return single_open(file, intel_iommu_debug_show, inode->i_private); +} + +static const struct file_operations intel_iommu_debug_fops = { + .open = intel_iommu_debug_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .owner = THIS_MODULE, +}; + +void __init intel_iommu_debugfs_init(void) +{ + struct dentry *iommu_debug_root; + + iommu_debug_root = debugfs_create_dir("intel_iommu", NULL); + + if (!iommu_debug_root) { + pr_err("can't create debugfs dir\n"); + goto err; + } + + if (!debugfs_create_file("intel_iommu_ctx", S_IRUGO, iommu_debug_root, + NULL, &intel_iommu_debug_fops)) { + pr_err("Can't create intel_iommu_ctx file\n"); + goto err; + } + +err: + debugfs_remove_recursive(iommu_debug_root); + +} diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 419a559..7794e0c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -4797,6 +4797,10 @@ int __init intel_iommu_init(void) intel_iommu_cpu_dead); intel_iommu_enabled = 1; +#ifdef CONFIG_INTEL_IOMMU_DEBUG + intel_iommu_debugfs_init(); +#endif + return 0; out_free_reserved_range: -- 2.7.4
WARNING: multiple messages have this Message-ID (diff)
From: Sohil Mehta <sohil.mehta-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>, Alex Williamson <alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Ravi V Shankar <ravi.v.shankar-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>, Fenghua Yu <fenghua.yu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>, Gayatri Kammela <gayatri.kammela-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>, Andriy Shevchenko <andriy.shevchenko-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> Subject: [PATCH v2 2/6] iommu/vt-d: Add Intel IOMMU debugfs to show context internals Date: Wed, 22 Nov 2017 11:25:42 -0800 [thread overview] Message-ID: <1511378746-109275-3-git-send-email-sohil.mehta@intel.com> (raw) In-Reply-To: <1511378746-109275-1-git-send-email-sohil.mehta-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> From: Gayatri Kammela <gayatri.kammela@intel.com> IOMMU internals states such as root and context can be exported to the userspace. Example of such dump in Kabylake: root@OTC-KBLH-01:~# cat /sys/kernel/debug/intel_iommu/intel_iommu_ctx IOMMU dmar2: Root Table Addr:4558a3000 Root tbl entries: Bus 0 L: 4558aa001 H: 0 Context table entries for Bus: 0 [entry] DID :B :D .F Low High [160] 0000:00:14.00 4558a9001 102 [184] 0000:00:17.00 400eac001 302 [248] 0000:00:1f.00 4558af001 202 [251] 0000:00:1f.03 40070e001 502 [254] 0000:00:1f.06 4467c9001 602 Root tbl entries: Bus 1 L: 3fc8c2001 H: 0 Context table entries for Bus: 1 [entry] DID :B :D .F Low High [0] 0000:01:00.00 3fc8c3001 402 Cc: Sohil Mehta <sohil.mehta@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Gayatri Kammela <gayatri.kammela@intel.com> --- v2: No change drivers/iommu/Makefile | 1 + drivers/iommu/intel-iommu-debug.c | 149 ++++++++++++++++++++++++++++++++++++++ drivers/iommu/intel-iommu.c | 4 + 3 files changed, 154 insertions(+) create mode 100644 drivers/iommu/intel-iommu-debug.c diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index 1fb6958..fdbaf46 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_ARM_SMMU) += arm-smmu.o obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o obj-$(CONFIG_DMAR_TABLE) += dmar.o obj-$(CONFIG_INTEL_IOMMU) += intel-iommu.o +obj-$(CONFIG_INTEL_IOMMU_DEBUG) += intel-iommu-debug.o obj-$(CONFIG_INTEL_IOMMU_SVM) += intel-svm.o obj-$(CONFIG_IPMMU_VMSA) += ipmmu-vmsa.o obj-$(CONFIG_IRQ_REMAP) += intel_irq_remapping.o irq_remapping.o diff --git a/drivers/iommu/intel-iommu-debug.c b/drivers/iommu/intel-iommu-debug.c new file mode 100644 index 0000000..90872ed --- /dev/null +++ b/drivers/iommu/intel-iommu-debug.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2017 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * Authors: Gayatri Kammela <gayatri.kammela@intel.com> + * Jacob Pan <jacob.jun.pan@linux.intel.com> + * + */ + +#define pr_fmt(fmt) "INTEL_IOMMU: " fmt +#include <linux/err.h> +#include <linux/io.h> +#include <linux/slab.h> +#include <linux/uaccess.h> +#include <linux/pm_runtime.h> +#include <linux/debugfs.h> +#include <linux/pci.h> +#include <linux/iommu.h> +#include <linux/intel-iommu.h> +#include <linux/intel-svm.h> +#include <linux/dmar.h> +#include <linux/spinlock.h> + +#include "irq_remapping.h" + +#define TOTAL_BUS_NR (256) /* full bus range 256 */ + +static void ctx_tbl_entry_show(struct seq_file *m, void *unused, + struct intel_iommu *iommu, int bus, bool ext, + bool new_ext) +{ + struct context_entry *context; + int ctx; + unsigned long flags; + + seq_printf(m, "%s Context table entries for Bus: %d\n", + ext ? "Lower" : "", bus); + seq_printf(m, "[entry]\tDID :B :D .F\tLow\t\tHigh\n"); + + spin_lock_irqsave(&iommu->lock, flags); + + /* Publish either context entries or extended contenxt entries */ + for (ctx = 0; ctx < (ext ? 128 : 256); ctx++) { + context = iommu_context_addr(iommu, bus, ctx, 0); + if (!context) + goto out; + if (context_present(context)) { + seq_printf(m, "[%d]\t%04x:%02x:%02x.%02x\t%llx\t%llx\n", + ctx, iommu->segment, bus, PCI_SLOT(ctx), + PCI_FUNC(ctx), context[0].lo, context[0].hi); + } + } +out: + spin_unlock_irqrestore(&iommu->lock, flags); +} + +static void root_tbl_entry_show(struct seq_file *m, void *unused, + struct intel_iommu *iommu, u64 rtaddr_reg, + bool ext, bool new_ext) +{ + int bus; + + seq_printf(m, "\nIOMMU %s: %2s Root Table Addr:%llx\n", iommu->name, + ext ? "Extended" : "", rtaddr_reg); + /* Publish extended root table entries or root table entries here */ + for (bus = 0; bus < TOTAL_BUS_NR; bus++) { + if (!iommu->root_entry[bus].lo) + continue; + + seq_printf(m, "%s Root tbl entries:\n", ext ? "Extended" : ""); + seq_printf(m, "Bus %d L: %llx H: %llx\n", bus, + iommu->root_entry[bus].lo, iommu->root_entry[bus].hi + ); + + ctx_tbl_entry_show(m, unused, iommu, bus, ext, new_ext); + } +} + +static int intel_iommu_debug_show(struct seq_file *m, void *unused) +{ + struct dmar_drhd_unit *drhd; + struct intel_iommu *iommu; + u64 rtaddr_reg; + bool new_ext, ext; + + rcu_read_lock(); + for_each_active_iommu(iommu, drhd) { + if (iommu) { + /* Check if root table type is set */ + rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG); + ext = !!(rtaddr_reg & DMA_RTADDR_RTT); + new_ext = !!ecap_ecs(iommu->ecap); + if (new_ext != ext) { + seq_printf(m, "IOMMU %s: invalid ecs\n", + iommu->name); + rcu_read_unlock(); + return -EINVAL; + } + root_tbl_entry_show(m, unused, iommu, rtaddr_reg, ext, + new_ext); + } + } + rcu_read_unlock(); + + return 0; +} + +static int intel_iommu_debug_open(struct inode *inode, struct file *file) +{ + return single_open(file, intel_iommu_debug_show, inode->i_private); +} + +static const struct file_operations intel_iommu_debug_fops = { + .open = intel_iommu_debug_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .owner = THIS_MODULE, +}; + +void __init intel_iommu_debugfs_init(void) +{ + struct dentry *iommu_debug_root; + + iommu_debug_root = debugfs_create_dir("intel_iommu", NULL); + + if (!iommu_debug_root) { + pr_err("can't create debugfs dir\n"); + goto err; + } + + if (!debugfs_create_file("intel_iommu_ctx", S_IRUGO, iommu_debug_root, + NULL, &intel_iommu_debug_fops)) { + pr_err("Can't create intel_iommu_ctx file\n"); + goto err; + } + +err: + debugfs_remove_recursive(iommu_debug_root); + +} diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 419a559..7794e0c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -4797,6 +4797,10 @@ int __init intel_iommu_init(void) intel_iommu_cpu_dead); intel_iommu_enabled = 1; +#ifdef CONFIG_INTEL_IOMMU_DEBUG + intel_iommu_debugfs_init(); +#endif + return 0; out_free_reserved_range: -- 2.7.4 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2017-11-22 19:25 UTC|newest] Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-11-22 19:25 [PATCH v2 0/6] Intel IOMMU debugfs support Sohil Mehta 2017-11-22 18:47 ` Raj, Ashok 2017-11-22 18:47 ` Raj, Ashok 2017-11-22 19:25 ` [PATCH v2 1/6] iommu/vt-d: Add debugfs support for Intel IOMMU internals Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta [this message] 2017-11-22 19:25 ` [PATCH v2 2/6] iommu/vt-d: Add Intel IOMMU debugfs to show context internals Sohil Mehta 2017-11-22 19:25 ` [PATCH v2 3/6] iommu/vt-d: Add Intel IOMMU debugfs to show extended " Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta 2017-11-22 19:25 ` [PATCH v2 4/6] iommu/vt-d: Add debugfs extension to show register contents Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta 2017-11-22 21:19 ` Andy Shevchenko 2017-11-22 21:19 ` Andy Shevchenko 2017-11-27 20:52 ` Kammela, Gayatri 2017-11-28 0:02 ` Mehta, Sohil 2017-11-28 0:02 ` Mehta, Sohil 2017-11-28 12:15 ` Andy Shevchenko 2017-11-28 13:55 ` Andy Shevchenko 2017-11-28 13:55 ` Andy Shevchenko 2017-11-22 19:25 ` [PATCH v2 5/6] iommu/vt-d: Add debugfs extension to show Pasid table contents Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta 2017-11-22 19:25 ` [PATCH v2 6/6] iommu/vt-d: Add debugfs support for Intel IOMMU Interrupt remapping Sohil Mehta 2017-11-22 19:25 ` Sohil Mehta 2017-11-22 21:18 ` Andy Shevchenko 2017-11-22 21:18 ` Andy Shevchenko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1511378746-109275-3-git-send-email-sohil.mehta@intel.com \ --to=sohil.mehta@intel.com \ --cc=alex.williamson@redhat.com \ --cc=andriy.shevchenko@intel.com \ --cc=ashok.raj@intel.com \ --cc=dwmw2@infradead.org \ --cc=fenghua.yu@intel.com \ --cc=gayatri.kammela@intel.com \ --cc=iommu@lists.linux-foundation.org \ --cc=jacob.jun.pan@linux.intel.com \ --cc=joro@8bytes.org \ --cc=linux-kernel@vger.kernel.org \ --cc=ravi.v.shankar@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.