[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel Acked-by: Sebastian Andrzej Siewior --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |8 +++ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index b1d2d6a..8ff79f7 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -195,6 +195,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 3603bc4..edaaad9 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1527,9 +1527,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug(" NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug(" %02x %02X ", i, entry.dest); + pr_cont("%1d%1d%1d %1d %1d" + "%1d%1d%02X\n", + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug(" NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *) + + pr_debug(" %02x %04X ", i, ir_entry->index); + pr_cont("%1d %1d%1d%1d %1d " + "%1d%1d %X%02X\n", + ir_entry->format, + ir_entry->mask, + ir_entry->trigger, + ir_entry->irr, + ir_entry->polarity, + ir_entry->delivery_status, + ir_entry->index2, + ir_entry->zero, + ir_entry->vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1582,58 +1636,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG " IRQ redirection table:\n"); - if (irq_remapping_enabled) { - printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" - " Pol Stat Indx2 Zero Vect:\n"); - } else { - printk(KERN_DEBUG " NR Dst Mask Trig
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel j...@8bytes.org Acked-by: Sebastian Andrzej Siewior sebast...@breakpoint.cc --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |8 +++ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index b1d2d6a..8ff79f7 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -195,6 +195,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 3603bc4..edaaad9 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1527,9 +1527,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug( NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug( %02x %02X , i, entry.dest); + pr_cont(%1d%1d%1d %1d %1d + %1d%1d%02X\n, + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug( NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *)entry; + + pr_debug( %02x %04X , i, ir_entry-index); + pr_cont(%1d %1d%1d%1d %1d + %1d%1d %X%02X\n, + ir_entry-format, + ir_entry-mask, + ir_entry-trigger, + ir_entry-irr, + ir_entry-polarity, + ir_entry-delivery_status, + ir_entry-index2, + ir_entry-zero, + ir_entry-vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1582,58 +1636,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG IRQ redirection table:\n); - if (irq_remapping_enabled) { - printk(KERN_DEBUG NR Indx Fmt Mask Trig IRR -Pol Stat Indx2 Zero Vect:\n); - } else { - printk(KERN_DEBUG NR Dst
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |8 +++ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index c28c991..8c6260f 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1527,9 +1527,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug(" NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug(" %02x %02X ", i, entry.dest); + pr_cont("%1d%1d%1d %1d %1d" + "%1d%1d%02X\n", + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug(" NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *) + + pr_debug(" %02x %04X ", i, ir_entry->index); + pr_cont("%1d %1d%1d%1d %1d " + "%1d%1d %X%02X\n", + ir_entry->format, + ir_entry->mask, + ir_entry->trigger, + ir_entry->irr, + ir_entry->polarity, + ir_entry->delivery_status, + ir_entry->index2, + ir_entry->zero, + ir_entry->vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1582,58 +1636,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG " IRQ redirection table:\n"); - if (irq_remapping_enabled) { - printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" - " Pol Stat Indx2 Zero Vect:\n"); - } else { - printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" - "
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel joerg.roe...@amd.com --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |8 +++ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index c28c991..8c6260f 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1527,9 +1527,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug( NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug( %02x %02X , i, entry.dest); + pr_cont(%1d%1d%1d %1d %1d + %1d%1d%02X\n, + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug( NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *)entry; + + pr_debug( %02x %04X , i, ir_entry-index); + pr_cont(%1d %1d%1d%1d %1d + %1d%1d %X%02X\n, + ir_entry-format, + ir_entry-mask, + ir_entry-trigger, + ir_entry-irr, + ir_entry-polarity, + ir_entry-delivery_status, + ir_entry-index2, + ir_entry-zero, + ir_entry-vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1582,58 +1636,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG IRQ redirection table:\n); - if (irq_remapping_enabled) { - printk(KERN_DEBUG NR Indx Fmt Mask Trig IRR -Pol Stat Indx2 Zero Vect:\n); - } else { - printk(KERN_DEBUG NR Dst Mask Trig IRR Pol -Stat Dmod
Re: [PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
On Mon, Aug 20, 2012 at 03:55:50PM +0200, Joerg Roedel wrote: > This call-back is used to dump IO-APIC entries for debugging > purposes into the kernel log. VT-d needs a special routine > for this and will overwrite the default. Okay, again: code basically does what it did, it has been shifted around and is now called directly. > Signed-off-by: Joerg Roedel > diff --git a/drivers/iommu/intel_irq_remapping.c > b/drivers/iommu/intel_irq_remapping.c > index e0b18f3..321db1a 100644 > --- a/drivers/iommu/intel_irq_remapping.c > +++ b/drivers/iommu/intel_irq_remapping.c > @@ -617,6 +617,10 @@ static int __init intel_enable_irq_remapping(void) > goto error; > > irq_remapping_enabled = 1; > + > + /* VT-d needs a special routine to print IO-APIC entries */ Seriously? That that's why you overwrite it with a different function :) > + x86_io_apic_ops.print_entries = intel_ir_io_apic_print_entries; > + > pr_info("Enabled IRQ remapping in %s mode\n", eim ? "x2apic" : "xapic"); > > return eim ? IRQ_REMAP_X2APIC_MODE : IRQ_REMAP_XAPIC_MODE; Sebastian -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
On Mon, Aug 20, 2012 at 03:55:50PM +0200, Joerg Roedel wrote: This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Okay, again: code basically does what it did, it has been shifted around and is now called directly. Signed-off-by: Joerg Roedel joerg.roe...@amd.com diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c index e0b18f3..321db1a 100644 --- a/drivers/iommu/intel_irq_remapping.c +++ b/drivers/iommu/intel_irq_remapping.c @@ -617,6 +617,10 @@ static int __init intel_enable_irq_remapping(void) goto error; irq_remapping_enabled = 1; + + /* VT-d needs a special routine to print IO-APIC entries */ Seriously? That that's why you overwrite it with a different function :) + x86_io_apic_ops.print_entries = intel_ir_io_apic_print_entries; + pr_info(Enabled IRQ remapping in %s mode\n, eim ? x2apic : xapic); return eim ? IRQ_REMAP_X2APIC_MODE : IRQ_REMAP_XAPIC_MODE; Sebastian -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |4 ++ 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index b919f1e..1ac89a6 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1517,9 +1517,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug(" NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug(" %02x %02X ", i, entry.dest); + pr_cont("%1d%1d%1d %1d %1d" + "%1d%1d%02X\n", + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug(" NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *) + + pr_debug(" %02x %04X ", i, ir_entry->index); + pr_cont("%1d %1d%1d%1d %1d " + "%1d%1d %X%02X\n", + ir_entry->format, + ir_entry->mask, + ir_entry->trigger, + ir_entry->irr, + ir_entry->polarity, + ir_entry->delivery_status, + ir_entry->index2, + ir_entry->zero, + ir_entry->vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1572,58 +1626,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG " IRQ redirection table:\n"); - if (irq_remapping_enabled) { - printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" - " Pol Stat Indx2 Zero Vect:\n"); - } else { - printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" - "
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel joerg.roe...@amd.com --- arch/x86/include/asm/io_apic.h |3 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |4 ++ 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index d59e172..21aa81e 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { @@ -225,6 +227,7 @@ static inline void disable_ioapic_support(void) { } #define native_io_apic_write NULL #define native_io_apic_modify NULL #define native_disable_io_apic NULL +#define native_io_apic_print_entries NULL #endif #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index b919f1e..1ac89a6 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1517,9 +1517,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug( NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug( %02x %02X , i, entry.dest); + pr_cont(%1d%1d%1d %1d %1d + %1d%1d%02X\n, + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug( NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *)entry; + + pr_debug( %02x %04X , i, ir_entry-index); + pr_cont(%1d %1d%1d%1d %1d + %1d%1d %X%02X\n, + ir_entry-format, + ir_entry-mask, + ir_entry-trigger, + ir_entry-irr, + ir_entry-polarity, + ir_entry-delivery_status, + ir_entry-index2, + ir_entry-zero, + ir_entry-vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1572,58 +1626,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG IRQ redirection table:\n); - if (irq_remapping_enabled) { - printk(KERN_DEBUG NR Indx Fmt Mask Trig IRR -Pol Stat Indx2 Zero Vect:\n); - } else { - printk(KERN_DEBUG NR Dst Mask Trig IRR Pol -Stat Dmod
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/io_apic.h |2 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |4 ++ 5 files changed, 64 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 57e5917..32ce9d2 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 3b77b60..c3a05e9 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1517,9 +1517,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug(" NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug(" %02x %02X ", i, entry.dest); + pr_cont("%1d%1d%1d %1d %1d" + "%1d%1d%02X\n", + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug(" NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n"); + + for (i = 0; i <= nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *) + + pr_debug(" %02x %04X ", i, ir_entry->index); + pr_cont("%1d %1d%1d%1d %1d " + "%1d%1d %X%02X\n", + ir_entry->format, + ir_entry->mask, + ir_entry->trigger, + ir_entry->irr, + ir_entry->polarity, + ir_entry->delivery_status, + ir_entry->index2, + ir_entry->zero, + ir_entry->vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1572,58 +1626,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG " IRQ redirection table:\n"); - if (irq_remapping_enabled) { - printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" - " Pol Stat Indx2 Zero Vect:\n"); - } else { - printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" - " Stat Dmod Deli Vect:\n"); - } - - for (i = 0; i <= reg_01.bits.entries; i++) { - if (irq_remapping_enabled) { - struct IO_APIC_route_entry entry; - struct IR_IO_APIC_route_entry *ir_entry; - - entry =
[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging
This call-back is used to dump IO-APIC entries for debugging purposes into the kernel log. VT-d needs a special routine for this and will overwrite the default. Signed-off-by: Joerg Roedel joerg.roe...@amd.com --- arch/x86/include/asm/io_apic.h |2 + arch/x86/include/asm/x86_init.h |1 + arch/x86/kernel/apic/io_apic.c | 109 ++- arch/x86/kernel/x86_init.c |1 + drivers/iommu/intel_irq_remapping.c |4 ++ 5 files changed, 64 insertions(+), 53 deletions(-) diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 57e5917..32ce9d2 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -180,6 +180,8 @@ extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg); extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val); extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) { diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8e1b44c..be8e9a6 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -194,6 +194,7 @@ struct x86_io_apic_ops { void(*write) (unsigned int apic, unsigned int reg, unsigned int value); void(*modify) (unsigned int apic, unsigned int reg, unsigned int value); void(*disable)(void); + void(*print_entries)(unsigned int apic, unsigned int nr_entries); }; extern struct x86_init_ops x86_init; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 3b77b60..c3a05e9 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1517,9 +1517,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx, ioapic_write_entry(ioapic_idx, pin, entry); } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ + int i; + + pr_debug( NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + pr_debug( %02x %02X , i, entry.dest); + pr_cont(%1d%1d%1d %1d %1d + %1d%1d%02X\n, + entry.mask, + entry.trigger, + entry.irr, + entry.polarity, + entry.delivery_status, + entry.dest_mode, + entry.delivery_mode, + entry.vector); + } +} + +void intel_ir_io_apic_print_entries(unsigned int apic, + unsigned int nr_entries) { int i; + + pr_debug( NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n); + + for (i = 0; i = nr_entries; i++) { + struct IR_IO_APIC_route_entry *ir_entry; + struct IO_APIC_route_entry entry; + + entry = ioapic_read_entry(apic, i); + + ir_entry = (struct IR_IO_APIC_route_entry *)entry; + + pr_debug( %02x %04X , i, ir_entry-index); + pr_cont(%1d %1d%1d%1d %1d + %1d%1d %X%02X\n, + ir_entry-format, + ir_entry-mask, + ir_entry-trigger, + ir_entry-irr, + ir_entry-polarity, + ir_entry-delivery_status, + ir_entry-index2, + ir_entry-zero, + ir_entry-vector); + } +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{ union IO_APIC_reg_00 reg_00; union IO_APIC_reg_01 reg_01; union IO_APIC_reg_02 reg_02; @@ -1572,58 +1626,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx) printk(KERN_DEBUG IRQ redirection table:\n); - if (irq_remapping_enabled) { - printk(KERN_DEBUG NR Indx Fmt Mask Trig IRR -Pol Stat Indx2 Zero Vect:\n); - } else { - printk(KERN_DEBUG NR Dst Mask Trig IRR Pol -Stat Dmod Deli Vect:\n); - } - - for (i = 0; i = reg_01.bits.entries; i++) { - if (irq_remapping_enabled) { - struct IO_APIC_route_entry entry; - struct IR_IO_APIC_route_entry *ir_entry; - - entry =