irq: add "dump_irqs" command support

Change-Id: Ia20bc3b0f4dc600f311ba3de0e75714b5d4c002c
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2019-08-09 15:00:26 +08:00 committed by Jianhong Chen
parent ae63f11992
commit 92f4f0904b
3 changed files with 65 additions and 0 deletions

View File

@ -405,3 +405,39 @@ int disable_interrupts(void)
{
return cpu_local_irq_disable();
}
static int do_dump_irqs(cmd_tbl_t *cmdtp, int flag,
int argc, char * const argv[])
{
struct udevice *dev;
char *drv_name;
int pirq;
printf(" IRQ En Handler Driver Name Count\n");
printf("----------------------------------------------------------------------\n");
for (pirq = 0; pirq < PLATFORM_MAX_IRQ; pirq++) {
if (!irq_desc[pirq].handle_irq)
continue;
dev = (struct udevice *)irq_desc[pirq].data;
if (strstr(dev->name, "gpio"))
drv_name = "IRQ";
else
drv_name = dev->driver->name;
printf(" %3d %d 0x%08lx %-12s %-12s %d\n",
pirq, irq_desc[pirq].flag & IRQ_FLG_ENABLE ? 1 : 0,
(ulong)irq_desc[pirq].handle_irq,
drv_name, dev->name, irq_desc[pirq].count);
virqs_show(pirq);
}
return 0;
}
U_BOOT_CMD(
dump_irqs, 1, 1, do_dump_irqs, "Dump IRQs", ""
);

View File

@ -36,6 +36,7 @@ struct irq_chip *arch_virq_get_irqchip(void);
* IRQ-VIRTUAL
*/
int bad_virq(int irq);
void virqs_show(int pirq);
void virq_free_handler(int irq);
int virq_install_handler(int irq, interrupt_handler_t *handler, void *data);

View File

@ -102,6 +102,34 @@ int bad_virq(int irq)
return !find_virq_desc(irq);
}
void virqs_show(int pirq)
{
struct virq_data *vdata;
struct virq_desc *desc;
struct udevice *dev;
int num;
int i;
desc = find_virq_desc_by_pirq(pirq);
if (!desc)
return;
vdata = desc->virqs;
num = desc->irq_end - desc->irq_base;
for (i = 0; i < num; i++) {
if (!vdata[i].handle_irq)
continue;
dev = (struct udevice *)vdata[i].data;
printf(" %3d %d 0x%08lx %-12s |-- %-12s %d\n",
vdata[i].irq,
vdata[i].flag & IRQ_FLG_ENABLE ? 1 : 0,
(ulong)vdata[i].handle_irq, dev->driver->name, dev->name,
vdata[i].count);
}
}
int virq_install_handler(int irq, interrupt_handler_t *handler, void *data)
{
struct virq_desc *desc;