macintosh/via-pmu: Disambiguate interrupt statistics
Some of the event counters are overloaded which makes it very difficult to interpret their values. Counter 0 is supposed to report CB1 interrupts but it can also count PMU_INT_WAITING_CHARGER events. Counter 1 is supposed to report GPIO interrupts but it can also count other events (depending upon the value of the PMU_INT_ADB bit). Disambiguate these statistics with dedicated counters for GPIO and CB1 interrupts. Comments in the MkLinux source code say that the type 0 and type 1 interrupts are model-specific. Label them as "unknown". This change to the contents of /proc/pmu/interrupts is by necessity visible in userland. However, packages which interact with the PMU (that is, pbbuttonsd, pmac-utils and pmud) don't open this file. AFAIK, user software has no need to poll these counters. Tested-by: Stan Johnson <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
b5c7cccaac
commit
6edc22fc9c
@ -172,7 +172,9 @@ static int drop_interrupts;
|
|||||||
static int option_lid_wakeup = 1;
|
static int option_lid_wakeup = 1;
|
||||||
#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
|
#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
|
||||||
static unsigned long async_req_locks;
|
static unsigned long async_req_locks;
|
||||||
static unsigned int pmu_irq_stats[11];
|
|
||||||
|
#define NUM_IRQ_STATS 13
|
||||||
|
static unsigned int pmu_irq_stats[NUM_IRQ_STATS];
|
||||||
|
|
||||||
static struct proc_dir_entry *proc_pmu_root;
|
static struct proc_dir_entry *proc_pmu_root;
|
||||||
static struct proc_dir_entry *proc_pmu_info;
|
static struct proc_dir_entry *proc_pmu_info;
|
||||||
@ -873,9 +875,9 @@ static int pmu_info_proc_show(struct seq_file *m, void *v)
|
|||||||
static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
|
static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
static const char *irq_names[] = {
|
static const char *irq_names[NUM_IRQ_STATS] = {
|
||||||
"Total CB1 triggered events",
|
"Unknown interrupt (type 0)",
|
||||||
"Total GPIO1 triggered events",
|
"Unknown interrupt (type 1)",
|
||||||
"PC-Card eject button",
|
"PC-Card eject button",
|
||||||
"Sound/Brightness button",
|
"Sound/Brightness button",
|
||||||
"ADB message",
|
"ADB message",
|
||||||
@ -884,10 +886,12 @@ static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
|
|||||||
"Tick timer",
|
"Tick timer",
|
||||||
"Ghost interrupt (zero len)",
|
"Ghost interrupt (zero len)",
|
||||||
"Empty interrupt (empty mask)",
|
"Empty interrupt (empty mask)",
|
||||||
"Max irqs in a row"
|
"Max irqs in a row",
|
||||||
|
"Total CB1 triggered events",
|
||||||
|
"Total GPIO1 triggered events",
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i=0; i<11; i++) {
|
for (i = 0; i < NUM_IRQ_STATS; i++) {
|
||||||
seq_printf(m, " %2u: %10u (%s)\n",
|
seq_printf(m, " %2u: %10u (%s)\n",
|
||||||
i, pmu_irq_stats[i], irq_names[i]);
|
i, pmu_irq_stats[i], irq_names[i]);
|
||||||
}
|
}
|
||||||
@ -1622,7 +1626,7 @@ via_pmu_interrupt(int irq, void *arg)
|
|||||||
}
|
}
|
||||||
if (intr & CB1_INT) {
|
if (intr & CB1_INT) {
|
||||||
adb_int_pending = 1;
|
adb_int_pending = 1;
|
||||||
pmu_irq_stats[0]++;
|
pmu_irq_stats[11]++;
|
||||||
}
|
}
|
||||||
if (intr & SR_INT) {
|
if (intr & SR_INT) {
|
||||||
req = pmu_sr_intr();
|
req = pmu_sr_intr();
|
||||||
@ -1709,7 +1713,7 @@ gpio1_interrupt(int irq, void *arg)
|
|||||||
disable_irq_nosync(gpio_irq);
|
disable_irq_nosync(gpio_irq);
|
||||||
gpio_irq_enabled = 0;
|
gpio_irq_enabled = 0;
|
||||||
}
|
}
|
||||||
pmu_irq_stats[1]++;
|
pmu_irq_stats[12]++;
|
||||||
adb_int_pending = 1;
|
adb_int_pending = 1;
|
||||||
spin_unlock_irqrestore(&pmu_lock, flags);
|
spin_unlock_irqrestore(&pmu_lock, flags);
|
||||||
via_pmu_interrupt(0, NULL);
|
via_pmu_interrupt(0, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user