Date: Tue, 15 Sep 1998 23:45:25 +0200
From: Stefan Traby <stefan@sime.com>
To: axp-list@redhat.com
Subject: Re: Problem rebooting AlphaStation 200 with SRM from RedHat 5.1?
Hi Peter !
> > I am trying to get 1.1.121 to work. It compiles, but will not boot after
> > it unzips.
>
> Same problem here (SX164, egcs-1.1b).
> Currently running 2.1.120.
> Linux picu-sgh.demon.co.uk 2.1.120 #3 Mon Sep 7 17:27:20 BST 1998 alpha unknown
The problem lies in the IRQ setup. Please apply the following patch
made by --Jay++ (it will be hopefully included in 2.1.122)
diff -ur TEMP/rth-120-14/arch/alpha/kernel/irq.c PATCH/rth-120-14/arch/alpha/kernel/irq.c
--- TEMP/rth-120-14/arch/alpha/kernel/irq.c Mon Sep 7 22:33:40 1998
+++ PATCH/rth-120-14/arch/alpha/kernel/irq.c Tue Sep 8 17:21:42 1998
@@ -311,26 +311,39 @@
int get_irq_list(char *buf)
{
- int i, len = 0;
+ int i, j;
struct irqaction * action;
- int cpu = smp_processor_id();
+ char *p = buf;
+
+ p += sprintf(p, " ");
+ for (j = 0; j < smp_num_cpus; j++)
+ p += sprintf(p, "CPU%d ", j);
+ *p++ = '\n';
for (i = 0; i < NR_IRQS; i++) {
action = irq_action[i];
if (!action)
continue;
- len += sprintf(buf+len, "%2d: %10u %c %s",
- i, kstat.irqs[cpu][i],
- (action->flags & SA_INTERRUPT) ? '+' : ' ',
- action->name);
+ p += sprintf(p, "%3d: ",i);
+#ifndef __SMP__
+ p += sprintf(p, "%10u ", kstat_irqs(i));
+#else
+ for (j = 0; j < smp_num_cpus; j++)
+ p += sprintf(p, "%10u ",
+ kstat.irqs[cpu_logical_map(j)][i]);
+#endif
+ p += sprintf(p, " %c%s",
+ (action->flags & SA_INTERRUPT)?'+':' ',
+ action->name);
+
for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ", %s%s",
- (action->flags & SA_INTERRUPT) ? "+":"",
- action->name);
+ p += sprintf(p, ", %c%s",
+ (action->flags & SA_INTERRUPT)?'+':' ',
+ action->name);
}
- len += sprintf(buf+len, "\n");
+ *p++ = '\n';
}
- return len;
+ return p - buf;
}
#ifdef __SMP__
diff -ur TEMP/rth-120-14/arch/alpha/kernel/irq.h PATCH/rth-120-14/arch/alpha/kernel/irq.h
--- TEMP/rth-120-14/arch/alpha/kernel/irq.h Mon Sep 7 22:33:40 1998
+++ PATCH/rth-120-14/arch/alpha/kernel/irq.h Wed Sep 9 20:47:11 1998
@@ -11,11 +11,8 @@
#define STANDARD_INIT_IRQ_PROLOG \
outb(0, DMA1_RESET_REG); \
outb(0, DMA2_RESET_REG); \
- outb(0, DMA1_MASK_REG); \
- outb(0, DMA2_MASK_REG); \
outb(0, DMA1_CLR_MASK_REG); \
- outb(0, DMA2_CLR_MASK_REG); \
- outb(DMA_MODE_CASCADE, DMA2_MODE_REG)
+ outb(0, DMA2_CLR_MASK_REG);
extern unsigned long alpha_irq_mask;
diff -ur TEMP/rth-120-14/arch/alpha/kernel/smc37c93x.c PATCH/rth-120-14/arch/alpha/kernel/smc37c93x.c
--- TEMP/rth-120-14/arch/alpha/kernel/smc37c93x.c Mon Sep 7 22:33:41 1998
+++ PATCH/rth-120-14/arch/alpha/kernel/smc37c93x.c Thu Sep 10 09:57:56 1998
@@ -8,6 +8,7 @@
#include <linux/malloc.h>
#include <linux/mm.h>
#include <linux/init.h>
+#include <linux/delay.h>
#include <asm/hwrpb.h>
#include <asm/io.h>
@@ -86,21 +87,28 @@
unsigned long indexPort;
unsigned long dataPort;
+ int i;
+
configPort = indexPort = baseAddr;
dataPort = configPort + 1;
- outb(CONFIG_ON_KEY, configPort);
- outb(CONFIG_ON_KEY, configPort);
- outb(DEVICE_ID, indexPort);
- devId = inb(dataPort);
- if ( devId == VALID_DEVICE_ID ) {
- outb(DEVICE_REV, indexPort);
- devRev = inb(dataPort);
- }
- else {
- baseAddr = 0;
+#define NUM_RETRIES 5
+
+ for (i = 0; i < NUM_RETRIES; i++)
+ {
+ outb(CONFIG_ON_KEY, configPort);
+ outb(CONFIG_ON_KEY, configPort);
+ outb(DEVICE_ID, indexPort);
+ devId = inb(dataPort);
+ if (devId == VALID_DEVICE_ID) {
+ outb(DEVICE_REV, indexPort);
+ devRev = inb(dataPort);
+ break;
+ }
+ else
+ udelay(100);
}
- return baseAddr;
+ return (i != NUM_RETRIES) ? baseAddr : 0L;
}
static void __init SMCRunState(unsigned long baseAddr)
diff -ur TEMP/rth-120-14/arch/alpha/kernel/smp.c PATCH/rth-120-14/arch/alpha/kernel/smp.c
--- TEMP/rth-120-14/arch/alpha/kernel/smp.c Mon Sep 7 22:33:41 1998
+++ PATCH/rth-120-14/arch/alpha/kernel/smp.c Wed Sep 9 12:48:53 1998
@@ -39,6 +39,7 @@
unsigned int boot_cpu_id = 0;
static int smp_activated = 0;
+static unsigned long ipicnt[NR_CPUS] = {0,}; /* IPI counts */
int smp_found_config = 0; /* Have we found an SMP box */
static int max_cpus = -1;
@@ -702,6 +703,8 @@
int ops;
mb();
+
+ ipicnt[this_cpu]++;
#if 0
printk("handle_ipi: on CPU %d ops 0x%x PC 0x%lx\n",
this_cpu, *pending_ipis, regs->pc);
@@ -737,8 +740,13 @@
int smp_info(char *buffer)
{
- return sprintf(buffer, "CPUs probed %d active %d map 0x%x\n",
- smp_num_probed, smp_num_cpus, cpu_present_map);
+ int i;
+ unsigned long sum = 0;
+ for (i = 0; i < NR_CPUS; i++)
+ sum += ipicnt[i];
+
+ return sprintf(buffer, "CPUs probed %d active %d map 0x%x IPIs %ld\n",
+ smp_num_probed, smp_num_cpus, cpu_present_map, sum);
}
/* wrapper for call from panic() */
@@ -876,6 +884,8 @@
long tmp;
long stuck;
void *inline_pc = __builtin_return_address(0);
+ int printed = 0;
+ unsigned long started = jiffies;
try_again:
@@ -905,12 +915,23 @@
: "2" (stuck));
if (stuck < 0) {
- printk("spinlock stuck at %p (cur=%p, own=%p, prev=%p)\n",
- inline_pc, current, lock->task, lock->previous);
+ if (!printed) {
+ printk("spinlock stuck at %p on %x, "
+ "owned at %p on %x\n",
+ inline_pc, smp_processor_id(),
+ lock->previous, lock->task);
+ printed = 1;
+ }
goto try_again;
} else {
lock->previous = inline_pc;
- lock->task = current;
+ lock->task = smp_processor_id();
+ if (printed) {
+ printk("spinlock waited at %p on %x "
+ "for %ld ticks\n",
+ inline_pc, smp_processor_id(),
+ jiffies - started);
+ }
}
}
#endif /* DEBUG_SPINLOCK */
diff -ur TEMP/rth-120-14/arch/alpha/kernel/sys_sx164.c PATCH/rth-120-14/arch/alpha/kernel/sys_sx164.c
--- TEMP/rth-120-14/arch/alpha/kernel/sys_sx164.c Mon Sep 7 22:33:41 1998
+++ PATCH/rth-120-14/arch/alpha/kernel/sys_sx164.c Thu Sep 10 13:34:23 1998
@@ -103,7 +103,10 @@
static void
sx164_init_irq(void)
{
- STANDARD_INIT_IRQ_PROLOG;
+ outb(0, DMA1_RESET_REG);
+ outb(0, DMA2_RESET_REG);
+ outb(DMA_MODE_CASCADE, DMA2_MODE_REG);
+ outb(0, DMA2_MASK_REG);
if (alpha_using_srm) {
alpha_mv.update_irq_hw = sx164_srm_update_irq_hw;
Only in PATCH/rth-120-14/arch/alpha/kernel: sys_sx164.c~
diff -ur TEMP/rth-120-14/include/asm-alpha/hardirq.h PATCH/rth-120-14/include/asm-alpha/hardirq.h
--- TEMP/rth-120-14/include/asm-alpha/hardirq.h Mon Sep 7 22:33:42 1998
+++ PATCH/rth-120-14/include/asm-alpha/hardirq.h Tue Sep 8 18:18:16 1998
@@ -32,6 +32,7 @@
#include <asm/atomic.h>
#include <asm/spinlock.h>
+#include <asm/smp.h>
extern int global_irq_holder;
extern spinlock_t global_irq_lock;
----------------------------------------------------------------------
--
ciao -
Stefan
Stefan Traby phone: +43-3133-6107-2
Mitterlasznitzstr. 13 fax: +43-3133-6107-9
8302 Nestelbach mailto://stefan@sime.com
Austria
--
To unsubscribe: send e-mail to axp-list-request@redhat.com with
'unsubscribe' as the subject. Do not send it to axp-list@redhat.com