patch-2.1.23 linux/arch/sparc/ap1000/hw.c
Next file: linux/arch/sparc/ap1000/irq.c
Previous file: linux/arch/sparc/ap1000/dma.c
Back to the patch index
Back to the overall index
- Lines: 186
- Date:
Sun Jan 26 12:07:06 1997
- Orig file:
v2.1.22/linux/arch/sparc/ap1000/hw.c
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v2.1.22/linux/arch/sparc/ap1000/hw.c linux/arch/sparc/ap1000/hw.c
@@ -0,0 +1,185 @@
+ /*
+ * Copyright 1996 The Australian National University.
+ * Copyright 1996 Fujitsu Laboratories Limited
+ *
+ * This software may be distributed under the terms of the Gnu
+ * Public License version 2 or later
+ */
+/*
+ * Initialize the AP1000 hardware: BIF, MSC+, MC+, etc.
+ */
+
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/malloc.h>
+#include <linux/mpp.h>
+#include <asm/irq.h>
+#include <asm/ap1000/apservice.h>
+#include <asm/ap1000/apreg.h>
+
+#define APLOG 0
+
+/* these make using CellOS code easier */
+int cap_nopt0;
+int cap_cid0;
+int cap_ncel0;
+
+unsigned _cid, _ncel, _ncelx, _ncely, _cidx, _cidy;
+
+/* yuck - needed for sun4c! */
+static unsigned char dummy;
+unsigned char *auxio_register = &dummy;
+
+
+extern struct cap_init cap_init;
+
+static void unexpected_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+ ap_panic("** unexpected interrupt %d **\n",irq);
+}
+
+static void ap_other_irqs(void)
+{
+ request_irq(3, unexpected_irq, SA_INTERRUPT, "unused", 0);
+ request_irq(5, unexpected_irq, SA_INTERRUPT, "unused", 0);
+ request_irq(12, unexpected_irq, SA_INTERRUPT, "unused", 0);
+ request_irq(15, unexpected_irq, SA_INTERRUPT, "unused", 0);
+}
+
+int ap_memory_size(void)
+{
+ if ((MSC_IN(MSC_SIMMCHK) & MSC_SIMMCHK_MASK) == 0) {
+ return 16*1024*1024;
+ }
+ return 64*1024*1024;
+}
+
+static void show_registers(void)
+{
+ extern struct pt_regs *bif_pt_regs;
+ if (bif_pt_regs)
+ show_regs(bif_pt_regs);
+ else
+ printk("unable to show registers\n");
+}
+
+
+static void check_alive(void)
+{
+ printk("Cell %d is alive\n",mpp_cid());
+}
+
+
+
+static void show_task(struct task_struct *t)
+{
+ printk("cell=%3d uid=%5d pid=%5d utime=%3d stime=%3d etime=%3d name=%s\n",
+ mpp_cid(),
+ t->uid,
+ (int)t->pid,
+ (int)t->utime,
+ (int)t->stime,
+ (jiffies - (int)t->start_time) / 100,
+ t->comm);
+}
+
+static void show_ptasks(void)
+{
+ extern struct task_struct *task[];
+ int i;
+ int count=0;
+
+ for (i=MPP_TASK_BASE;i<NR_TASKS;i++)
+ if (task[i]) {
+ show_task(task[i]);
+ count++;
+ }
+ if (count == 0)
+ printk("no parallel tasks on cell %d\n",mpp_cid());
+}
+
+static void show_utasks(void)
+{
+ extern struct task_struct *task[];
+ int i;
+ int count=0;
+
+ for (i=0;i<NR_TASKS;i++)
+ if (task[i] && task[i]->uid > 1) {
+ show_task(task[i]);
+ count++;
+ }
+
+ if (count == 0)
+ printk("no user tasks on cell %d\n",mpp_cid());
+}
+
+
+static void show_otasks(void)
+{
+ extern struct task_struct *task[];
+ int i;
+ int count=0;
+ extern int ap_current_uid;
+
+ for (i=0;i<NR_TASKS;i++)
+ if (task[i] && task[i]->uid == ap_current_uid) {
+ show_task(task[i]);
+ count++;
+ }
+
+ if (count == 0)
+ printk("no tasks on cell %d\n",mpp_cid());
+}
+
+
+void do_panic(void)
+{
+ int *x = 0;
+ *x = 1; /* uggh */
+}
+
+
+void mpp_hw_init(void)
+{
+ extern void show_state(void);
+ extern void breakpoint(void);
+ extern void ctrl_alt_del(void);
+ extern void mac_print_state(void);
+ extern void show_debug_keys(void);
+
+ bif_add_debug_key('c',check_alive,"check if a cell is alive");
+ bif_add_debug_key('k',show_debug_keys,"show the kernel debug keys");
+ bif_add_debug_key('p',show_registers,"show register info");
+ bif_add_debug_key('p',show_registers,"show register info");
+ bif_add_debug_key('m',show_mem,"detailed memory stats");
+ bif_add_debug_key('s',show_state,"detailed process stats");
+ bif_add_debug_key('D',ap_start_debugger,"launch the kernel debugger");
+ bif_add_debug_key('i',breakpoint,"send a breakpoint");
+ bif_add_debug_key('r',ctrl_alt_del,"run shutdown (doesn't work)");
+ bif_add_debug_key('P',show_ptasks,"show running parallel tasks");
+ bif_add_debug_key('U',show_utasks,"show all user tasks");
+ bif_add_debug_key('O',show_otasks,"show own user tasks");
+ bif_add_debug_key('^',do_panic,"panic :-)");
+
+
+ cap_cid0 = BIF_IN(BIF_CIDR1);
+ cap_ncel0 = cap_init.numcells;
+
+ _cid = cap_cid0;
+ _ncel = cap_ncel0;
+ _ncelx = _ncel<8?_ncel:8;
+ _ncely = ((_ncel-1) / _ncelx) + 1;
+ _cidx = _cid % _ncelx;
+ _cidy = _cid / _ncelx;
+
+ ap_bif_init();
+ ap_msc_init();
+ ap_tnet_init();
+ ap_profile_init();
+ ap_other_irqs();
+ ap_ringbuf_init();
+#if APLOG
+ ap_log(NULL,-1);
+#endif
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov