[PATCH 04/19] x86, io_apic: Introduce x86_io_apic_ops.print_entries for debugging

2012-11-20 Thread Joerg Roedel
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

2012-11-20 Thread Joerg Roedel
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

2012-09-26 Thread Joerg Roedel
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

2012-09-26 Thread Joerg Roedel
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

2012-08-26 Thread Sebastian Andrzej Siewior
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

2012-08-26 Thread Sebastian Andrzej Siewior
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

2012-08-20 Thread Joerg Roedel
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

2012-08-20 Thread Joerg Roedel
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

2012-08-07 Thread Joerg Roedel
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

2012-08-07 Thread Joerg Roedel
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 =