irqdomain: Kill CONFIG_IRQ_DOMAIN_DEBUG
CONFIG_IRQ_DOMAIN_DEBUG is similar to CONFIG_GENERIC_IRQ_DEBUGFS, just with less information. Spring cleanup time. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Yang Shunyong <shunyong.yang@hxt-semitech.com> Link: https://lkml.kernel.org/r/20180117142647.23622-1-marc.zyngier@arm.com
This commit is contained in:
parent
80023aea83
commit
c5baa1be8f
|
@ -265,37 +265,5 @@ support other architectures, such as ARM, ARM64 etc.
|
||||||
|
|
||||||
=== Debugging ===
|
=== Debugging ===
|
||||||
|
|
||||||
If you switch on CONFIG_IRQ_DOMAIN_DEBUG (which depends on
|
Most of the internals of the IRQ subsystem are exposed in debugfs by
|
||||||
CONFIG_IRQ_DOMAIN and CONFIG_DEBUG_FS), you will find a new file in
|
turning CONFIG_GENERIC_IRQ_DEBUGFS on.
|
||||||
your debugfs mount point, called irq_domain_mapping. This file
|
|
||||||
contains a live snapshot of all the IRQ domains in the system:
|
|
||||||
|
|
||||||
name mapped linear-max direct-max devtree-node
|
|
||||||
pl061 8 8 0 /smb/gpio@e0080000
|
|
||||||
pl061 8 8 0 /smb/gpio@e1050000
|
|
||||||
pMSI 0 0 0 /interrupt-controller@e1101000/v2m@e0080000
|
|
||||||
MSI 37 0 0 /interrupt-controller@e1101000/v2m@e0080000
|
|
||||||
GICv2m 37 0 0 /interrupt-controller@e1101000/v2m@e0080000
|
|
||||||
GICv2 448 448 0 /interrupt-controller@e1101000
|
|
||||||
|
|
||||||
it also iterates over the interrupts to display their mapping in the
|
|
||||||
domains, and makes the domain stacking visible:
|
|
||||||
|
|
||||||
|
|
||||||
irq hwirq chip name chip data active type domain
|
|
||||||
1 0x00019 GICv2 0xffff00000916bfd8 * LINEAR GICv2
|
|
||||||
2 0x0001d GICv2 0xffff00000916bfd8 LINEAR GICv2
|
|
||||||
3 0x0001e GICv2 0xffff00000916bfd8 * LINEAR GICv2
|
|
||||||
4 0x0001b GICv2 0xffff00000916bfd8 * LINEAR GICv2
|
|
||||||
5 0x0001a GICv2 0xffff00000916bfd8 LINEAR GICv2
|
|
||||||
[...]
|
|
||||||
96 0x81808 MSI 0x (null) RADIX MSI
|
|
||||||
96+ 0x00063 GICv2m 0xffff8003ee116980 RADIX GICv2m
|
|
||||||
96+ 0x00063 GICv2 0xffff00000916bfd8 LINEAR GICv2
|
|
||||||
97 0x08800 MSI 0x (null) * RADIX MSI
|
|
||||||
97+ 0x00064 GICv2m 0xffff8003ee116980 * RADIX GICv2m
|
|
||||||
97+ 0x00064 GICv2 0xffff00000916bfd8 * LINEAR GICv2
|
|
||||||
|
|
||||||
Here, interrupts 1-5 are only using a single domain, while 96 and 97
|
|
||||||
are build out of a stack of three domain, each level performing a
|
|
||||||
particular function.
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_KERNEL_XZ=y
|
CONFIG_KERNEL_XZ=y
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_KERNEL_XZ=y
|
CONFIG_KERNEL_XZ=y
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_CGROUPS=y
|
CONFIG_CGROUPS=y
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_BSD_PROCESS_ACCT=y
|
CONFIG_BSD_PROCESS_ACCT=y
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
|
|
|
@ -71,7 +71,6 @@ CONFIG_IP_ROUTE_MULTIPATH=y
|
||||||
CONFIG_IP_ROUTE_VERBOSE=y
|
CONFIG_IP_ROUTE_VERBOSE=y
|
||||||
CONFIG_IP_SCTP=m
|
CONFIG_IP_SCTP=m
|
||||||
CONFIG_IPV6=y
|
CONFIG_IPV6=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_JFFS2_FS_DEBUG=1
|
CONFIG_JFFS2_FS_DEBUG=1
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
|
|
|
@ -4,7 +4,6 @@ CONFIG_CPU_LITTLE_ENDIAN=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_TASKSTATS=y
|
CONFIG_TASKSTATS=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_PPC64=y
|
CONFIG_PPC64=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_TASKSTATS=y
|
CONFIG_TASKSTATS=y
|
||||||
|
|
|
@ -3,7 +3,6 @@ CONFIG_NR_CPUS=2048
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_TASKSTATS=y
|
CONFIG_TASKSTATS=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_USELIB=y
|
CONFIG_USELIB=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_FHANDLE=y
|
CONFIG_FHANDLE=y
|
||||||
CONFIG_IRQ_DOMAIN_DEBUG=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -103,16 +103,6 @@ config GENERIC_IRQ_MATRIX_ALLOCATOR
|
||||||
config GENERIC_IRQ_RESERVATION_MODE
|
config GENERIC_IRQ_RESERVATION_MODE
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config IRQ_DOMAIN_DEBUG
|
|
||||||
bool "Expose hardware/virtual IRQ mapping via debugfs"
|
|
||||||
depends on IRQ_DOMAIN && DEBUG_FS
|
|
||||||
help
|
|
||||||
This option will show the mapping relationship between hardware irq
|
|
||||||
numbers and Linux irq numbers. The mapping is exposed via debugfs
|
|
||||||
in the file "irq_domain_mapping".
|
|
||||||
|
|
||||||
If you don't know what this means you don't need it.
|
|
||||||
|
|
||||||
# Support forced irq threading
|
# Support forced irq threading
|
||||||
config IRQ_FORCED_THREADING
|
config IRQ_FORCED_THREADING
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -897,124 +897,6 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
||||||
|
|
||||||
#ifdef CONFIG_IRQ_DOMAIN_DEBUG
|
|
||||||
static void virq_debug_show_one(struct seq_file *m, struct irq_desc *desc)
|
|
||||||
{
|
|
||||||
struct irq_domain *domain;
|
|
||||||
struct irq_data *data;
|
|
||||||
|
|
||||||
domain = desc->irq_data.domain;
|
|
||||||
data = &desc->irq_data;
|
|
||||||
|
|
||||||
while (domain) {
|
|
||||||
unsigned int irq = data->irq;
|
|
||||||
unsigned long hwirq = data->hwirq;
|
|
||||||
struct irq_chip *chip;
|
|
||||||
bool direct;
|
|
||||||
|
|
||||||
if (data == &desc->irq_data)
|
|
||||||
seq_printf(m, "%5d ", irq);
|
|
||||||
else
|
|
||||||
seq_printf(m, "%5d+ ", irq);
|
|
||||||
seq_printf(m, "0x%05lx ", hwirq);
|
|
||||||
|
|
||||||
chip = irq_data_get_irq_chip(data);
|
|
||||||
seq_printf(m, "%-15s ", (chip && chip->name) ? chip->name : "none");
|
|
||||||
|
|
||||||
seq_printf(m, "0x%p ", irq_data_get_irq_chip_data(data));
|
|
||||||
|
|
||||||
seq_printf(m, " %c ", (desc->action && desc->action->handler) ? '*' : ' ');
|
|
||||||
direct = (irq == hwirq) && (irq < domain->revmap_direct_max_irq);
|
|
||||||
seq_printf(m, "%6s%-8s ",
|
|
||||||
(hwirq < domain->revmap_size) ? "LINEAR" : "RADIX",
|
|
||||||
direct ? "(DIRECT)" : "");
|
|
||||||
seq_printf(m, "%s\n", domain->name);
|
|
||||||
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
|
||||||
domain = domain->parent;
|
|
||||||
data = data->parent_data;
|
|
||||||
#else
|
|
||||||
domain = NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int virq_debug_show(struct seq_file *m, void *private)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
struct irq_desc *desc;
|
|
||||||
struct irq_domain *domain;
|
|
||||||
struct radix_tree_iter iter;
|
|
||||||
void __rcu **slot;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
seq_printf(m, " %-16s %-6s %-10s %-10s %s\n",
|
|
||||||
"name", "mapped", "linear-max", "direct-max", "devtree-node");
|
|
||||||
mutex_lock(&irq_domain_mutex);
|
|
||||||
list_for_each_entry(domain, &irq_domain_list, link) {
|
|
||||||
struct device_node *of_node;
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
of_node = irq_domain_get_of_node(domain);
|
|
||||||
if (of_node)
|
|
||||||
name = of_node_full_name(of_node);
|
|
||||||
else if (is_fwnode_irqchip(domain->fwnode))
|
|
||||||
name = container_of(domain->fwnode, struct irqchip_fwid,
|
|
||||||
fwnode)->name;
|
|
||||||
else
|
|
||||||
name = "";
|
|
||||||
|
|
||||||
radix_tree_for_each_slot(slot, &domain->revmap_tree, &iter, 0)
|
|
||||||
count++;
|
|
||||||
seq_printf(m, "%c%-16s %6u %10u %10u %s\n",
|
|
||||||
domain == irq_default_domain ? '*' : ' ', domain->name,
|
|
||||||
domain->revmap_size + count, domain->revmap_size,
|
|
||||||
domain->revmap_direct_max_irq,
|
|
||||||
name);
|
|
||||||
}
|
|
||||||
mutex_unlock(&irq_domain_mutex);
|
|
||||||
|
|
||||||
seq_printf(m, "%-5s %-7s %-15s %-*s %6s %-14s %s\n", "irq", "hwirq",
|
|
||||||
"chip name", (int)(2 * sizeof(void *) + 2), "chip data",
|
|
||||||
"active", "type", "domain");
|
|
||||||
|
|
||||||
for (i = 1; i < nr_irqs; i++) {
|
|
||||||
desc = irq_to_desc(i);
|
|
||||||
if (!desc)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&desc->lock, flags);
|
|
||||||
virq_debug_show_one(m, desc);
|
|
||||||
raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int virq_debug_open(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
return single_open(file, virq_debug_show, inode->i_private);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct file_operations virq_debug_fops = {
|
|
||||||
.open = virq_debug_open,
|
|
||||||
.read = seq_read,
|
|
||||||
.llseek = seq_lseek,
|
|
||||||
.release = single_release,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init irq_debugfs_init(void)
|
|
||||||
{
|
|
||||||
if (debugfs_create_file("irq_domain_mapping", S_IRUGO, NULL,
|
|
||||||
NULL, &virq_debug_fops) == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
__initcall(irq_debugfs_init);
|
|
||||||
#endif /* CONFIG_IRQ_DOMAIN_DEBUG */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* irq_domain_xlate_onecell() - Generic xlate for direct one cell bindings
|
* irq_domain_xlate_onecell() - Generic xlate for direct one cell bindings
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue