diff options
Diffstat (limited to 'arch/powerpc/xmon/xmon.c')
| -rw-r--r-- | arch/powerpc/xmon/xmon.c | 51 | 
1 files changed, 34 insertions, 17 deletions
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index 14e56c25879f..d83364ebc5c5 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c @@ -2534,13 +2534,16 @@ static void dump_pacas(void)  static void dump_one_xive(int cpu)  {  	unsigned int hwid = get_hard_smp_processor_id(cpu); - -	opal_xive_dump(XIVE_DUMP_TM_HYP, hwid); -	opal_xive_dump(XIVE_DUMP_TM_POOL, hwid); -	opal_xive_dump(XIVE_DUMP_TM_OS, hwid); -	opal_xive_dump(XIVE_DUMP_TM_USER, hwid); -	opal_xive_dump(XIVE_DUMP_VP, hwid); -	opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid); +	bool hv = cpu_has_feature(CPU_FTR_HVMODE); + +	if (hv) { +		opal_xive_dump(XIVE_DUMP_TM_HYP, hwid); +		opal_xive_dump(XIVE_DUMP_TM_POOL, hwid); +		opal_xive_dump(XIVE_DUMP_TM_OS, hwid); +		opal_xive_dump(XIVE_DUMP_TM_USER, hwid); +		opal_xive_dump(XIVE_DUMP_VP, hwid); +		opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid); +	}  	if (setjmp(bus_error_jmp) != 0) {  		catch_memory_errors = 0; @@ -2569,16 +2572,28 @@ static void dump_all_xives(void)  		dump_one_xive(cpu);  } -static void dump_one_xive_irq(u32 num) +static void dump_one_xive_irq(u32 num, struct irq_data *d) +{ +	xmon_xive_get_irq_config(num, d); +} + +static void dump_all_xive_irq(void)  { -	s64 rc; -	__be64 vp; -	u8 prio; -	__be32 lirq; - -	rc = opal_xive_get_irq_config(num, &vp, &prio, &lirq); -	xmon_printf("IRQ 0x%x config: vp=0x%llx prio=%d lirq=0x%x (rc=%lld)\n", -		    num, be64_to_cpu(vp), prio, be32_to_cpu(lirq), rc); +	unsigned int i; +	struct irq_desc *desc; + +	for_each_irq_desc(i, desc) { +		struct irq_data *d = irq_desc_get_irq_data(desc); +		unsigned int hwirq; + +		if (!d) +			continue; + +		hwirq = (unsigned int)irqd_to_hwirq(d); +		/* IPIs are special (HW number 0) */ +		if (hwirq) +			dump_one_xive_irq(hwirq, d); +	}  }  static void dump_xives(void) @@ -2597,7 +2612,9 @@ static void dump_xives(void)  		return;  	} else if (c == 'i') {  		if (scanhex(&num)) -			dump_one_xive_irq(num); +			dump_one_xive_irq(num, NULL); +		else +			dump_all_xive_irq();  		return;  	}  | 
