summaryrefslogtreecommitdiff
path: root/arch/ppc
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-02-27 11:33:51 -0500
committerJeff Garzik <jeff@garzik.org>2006-02-27 11:33:51 -0500
commitdbfedbb98145375106cee7ec7269611d553819dc (patch)
tree81d2a6de51b1bb3c704e5385dbc90ca79efa69bc /arch/ppc
parent7b0386921db20add25afd8678ed34a9253e512fc (diff)
parente95a9ec1bb66e07b138861c743192f06e7b3e4de (diff)
Merge branch 'master'
Diffstat (limited to 'arch/ppc')
-rw-r--r--arch/ppc/kernel/head.S1
-rw-r--r--arch/ppc/xmon/adb.c212
-rw-r--r--arch/ppc/xmon/start.c169
-rw-r--r--arch/ppc/xmon/xmon.c108
4 files changed, 4 insertions, 486 deletions
diff --git a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S
index c5a890dca9cf..53ea845fb911 100644
--- a/arch/ppc/kernel/head.S
+++ b/arch/ppc/kernel/head.S
@@ -751,6 +751,7 @@ AltiVecUnavailable:
#ifdef CONFIG_ALTIVEC
bne load_up_altivec /* if from user, just load it up */
#endif /* CONFIG_ALTIVEC */
+ addi r3,r1,STACK_FRAME_OVERHEAD
EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)
#ifdef CONFIG_PPC64BRIDGE
diff --git a/arch/ppc/xmon/adb.c b/arch/ppc/xmon/adb.c
deleted file mode 100644
index e91384dcccac..000000000000
--- a/arch/ppc/xmon/adb.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 1996 Paul Mackerras.
- */
-#include "nonstdio.h"
-#include "privinst.h"
-
-#define scanhex xmon_scanhex
-#define skipbl xmon_skipbl
-
-#define ADB_B (*(volatile unsigned char *)0xf3016000)
-#define ADB_SR (*(volatile unsigned char *)0xf3017400)
-#define ADB_ACR (*(volatile unsigned char *)0xf3017600)
-#define ADB_IFR (*(volatile unsigned char *)0xf3017a00)
-
-static inline void eieio(void) { asm volatile ("eieio" : :); }
-
-#define N_ADB_LOG 1000
-struct adb_log {
- unsigned char b;
- unsigned char ifr;
- unsigned char acr;
- unsigned int time;
-} adb_log[N_ADB_LOG];
-int n_adb_log;
-
-void
-init_adb_log(void)
-{
- adb_log[0].b = ADB_B;
- adb_log[0].ifr = ADB_IFR;
- adb_log[0].acr = ADB_ACR;
- adb_log[0].time = get_dec();
- n_adb_log = 0;
-}
-
-void
-dump_adb_log(void)
-{
- unsigned t, t0;
- struct adb_log *ap;
- int i;
-
- ap = adb_log;
- t0 = ap->time;
- for (i = 0; i <= n_adb_log; ++i, ++ap) {
- t = t0 - ap->time;
- printf("b=%x ifr=%x acr=%x at %d.%.7d\n", ap->b, ap->ifr, ap->acr,
- t / 1000000000, (t % 1000000000) / 100);
- }
-}
-
-void
-adb_chklog(void)
-{
- struct adb_log *ap = &adb_log[n_adb_log + 1];
-
- ap->b = ADB_B;
- ap->ifr = ADB_IFR;
- ap->acr = ADB_ACR;
- if (ap->b != ap[-1].b || (ap->ifr & 4) != (ap[-1].ifr & 4)
- || ap->acr != ap[-1].acr) {
- ap->time = get_dec();
- ++n_adb_log;
- }
-}
-
-int
-adb_bitwait(int bmask, int bval, int fmask, int fval)
-{
- int i;
- struct adb_log *ap;
-
- for (i = 10000; i > 0; --i) {
- adb_chklog();
- ap = &adb_log[n_adb_log];
- if ((ap->b & bmask) == bval && (ap->ifr & fmask) == fval)
- return 0;
- }
- return -1;
-}
-
-int
-adb_wait(void)
-{
- if (adb_bitwait(0, 0, 4, 4) < 0) {
- printf("adb: ready wait timeout\n");
- return -1;
- }
- return 0;
-}
-
-void
-adb_readin(void)
-{
- int i, j;
- unsigned char d[64];
-
- if (ADB_B & 8) {
- printf("ADB_B: %x\n", ADB_B);
- return;
- }
- i = 0;
- adb_wait();
- j = ADB_SR;
- eieio();
- ADB_B &= ~0x20;
- eieio();
- for (;;) {
- if (adb_wait() < 0)
- break;
- d[i++] = ADB_SR;
- eieio();
- if (ADB_B & 8)
- break;
- ADB_B ^= 0x10;
- eieio();
- }
- ADB_B |= 0x30;
- if (adb_wait() == 0)
- j = ADB_SR;
- for (j = 0; j < i; ++j)
- printf("%.2x ", d[j]);
- printf("\n");
-}
-
-int
-adb_write(unsigned char *d, int i)
-{
- int j;
- unsigned x;
-
- if ((ADB_B & 8) == 0) {
- printf("r: ");
- adb_readin();
- }
- for (;;) {
- ADB_ACR = 0x1c;
- eieio();
- ADB_SR = d[0];
- eieio();
- ADB_B &= ~0x20;
- eieio();
- if (ADB_B & 8)
- break;
- ADB_ACR = 0xc;
- eieio();
- ADB_B |= 0x20;
- eieio();
- adb_readin();
- }
- adb_wait();
- for (j = 1; j < i; ++j) {
- ADB_SR = d[j];
- eieio();
- ADB_B ^= 0x10;
- eieio();
- if (adb_wait() < 0)
- break;
- }
- ADB_ACR = 0xc;
- eieio();
- x = ADB_SR;
- eieio();
- ADB_B |= 0x30;
- return j;
-}
-
-void
-adbcmds(void)
-{
- char cmd;
- unsigned rtcu, rtcl, dec, pdec, x;
- int i, j;
- unsigned char d[64];
-
- cmd = skipbl();
- switch (cmd) {
- case 't':
- for (;;) {
- rtcl = get_rtcl();
- rtcu = get_rtcu();
- dec = get_dec();
- printf("rtc u=%u l=%u dec=%x (%d = %d.%.7d)\n",
- rtcu, rtcl, dec, pdec - dec, (pdec - dec) / 1000000000,
- ((pdec - dec) % 1000000000) / 100);
- pdec = dec;
- if (cmd == 'x')
- break;
- while (xmon_read(stdin, &cmd, 1) != 1)
- ;
- }
- break;
- case 'r':
- init_adb_log();
- while (adb_bitwait(8, 0, 0, 0) == 0)
- adb_readin();
- break;
- case 'w':
- i = 0;
- while (scanhex(&x))
- d[i++] = x;
- init_adb_log();
- j = adb_write(d, i);
- printf("sent %d bytes\n", j);
- while (adb_bitwait(8, 0, 0, 0) == 0)
- adb_readin();
- break;
- case 'l':
- dump_adb_log();
- break;
- }
-}
diff --git a/arch/ppc/xmon/start.c b/arch/ppc/xmon/start.c
index 484f5bb1aa3e..ff86b2d814cb 100644
--- a/arch/ppc/xmon/start.c
+++ b/arch/ppc/xmon/start.c
@@ -6,16 +6,11 @@
#include <asm/machdep.h>
#include <asm/io.h>
#include <asm/page.h>
-#include <linux/adb.h>
-#include <linux/pmu.h>
-#include <linux/cuda.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/sysrq.h>
#include <linux/bitops.h>
#include <asm/xmon.h>
-#include <asm/prom.h>
-#include <asm/bootx.h>
#include <asm/machdep.h>
#include <asm/errno.h>
#include <asm/processor.h>
@@ -26,9 +21,7 @@ static volatile unsigned char *sccc, *sccd;
unsigned int TXRDY, RXRDY, DLAB;
static int xmon_expect(const char *str, unsigned int timeout);
-static int use_screen;
static int via_modem;
-static int xmon_use_sccb;
#define TB_SPEED 25000000
@@ -46,47 +39,6 @@ void buf_access(void)
sccd[3] &= ~DLAB; /* reset DLAB */
}
-extern int adb_init(void);
-
-#ifdef CONFIG_PPC_CHRP
-/*
- * This looks in the "ranges" property for the primary PCI host bridge
- * to find the physical address of the start of PCI/ISA I/O space.
- * It is basically a cut-down version of pci_process_bridge_OF_ranges.
- */
-static unsigned long chrp_find_phys_io_base(void)
-{
- struct device_node *node;
- unsigned int *ranges;
- unsigned long base = CHRP_ISA_IO_BASE;
- int rlen = 0;
- int np;
-
- node = find_devices("isa");
- if (node != NULL) {
- node = node->parent;
- if (node == NULL || node->type == NULL
- || strcmp(node->type, "pci") != 0)
- node = NULL;
- }
- if (node == NULL)
- node = find_devices("pci");
- if (node == NULL)
- return base;
-
- ranges = (unsigned int *) get_property(node, "ranges", &rlen);
- np = prom_n_addr_cells(node) + 5;
- while ((rlen -= np * sizeof(unsigned int)) >= 0) {
- if ((ranges[0] >> 24) == 1 && ranges[2] == 0) {
- /* I/O space starting at 0, grab the phys base */
- base = ranges[np - 3];
- break;
- }
- ranges += np;
- }
- return base;
-}
-#endif /* CONFIG_PPC_CHRP */
#ifdef CONFIG_MAGIC_SYSRQ
static void sysrq_handle_xmon(int key, struct pt_regs *regs,
@@ -109,22 +61,6 @@ xmon_map_scc(void)
#ifdef CONFIG_PPC_MULTIPLATFORM
volatile unsigned char *base;
-#ifdef CONFIG_PPC_CHRP
- base = (volatile unsigned char *) isa_io_base;
- if (_machine == _MACH_chrp)
- base = (volatile unsigned char *)
- ioremap(chrp_find_phys_io_base(), 0x1000);
-
- sccc = base + 0x3fd;
- sccd = base + 0x3f8;
- if (xmon_use_sccb) {
- sccc -= 0x100;
- sccd -= 0x100;
- }
- TXRDY = 0x20;
- RXRDY = 1;
- DLAB = 0x80;
-#endif /* CONFIG_PPC_CHRP */
#elif defined(CONFIG_GEMINI)
/* should already be mapped by the kernel boot */
sccc = (volatile unsigned char *) 0xffeffb0d;
@@ -143,7 +79,7 @@ xmon_map_scc(void)
register_sysrq_key('x', &sysrq_xmon_op);
}
-static int scc_initialized = 0;
+static int scc_initialized;
void xmon_init_scc(void);
@@ -163,14 +99,6 @@ xmon_write(void *handle, void *ptr, int nb)
break;
#endif
-#ifdef CONFIG_BOOTX_TEXT
- if (use_screen) {
- /* write it on the screen */
- for (i = 0; i < nb; ++i)
- btext_drawchar(*p++);
- goto out;
- }
-#endif
if (!scc_initialized)
xmon_init_scc();
ct = 0;
@@ -190,7 +118,6 @@ xmon_write(void *handle, void *ptr, int nb)
eieio();
}
- out:
#ifdef CONFIG_SMP
if (!locked)
clear_bit(0, &xmon_write_lock);
@@ -199,65 +126,7 @@ xmon_write(void *handle, void *ptr, int nb)
}
int xmon_wants_key;
-int xmon_adb_keycode;
-
-#ifdef CONFIG_BOOTX_TEXT
-static int xmon_adb_shiftstate;
-
-static unsigned char xmon_keytab[128] =
- "asdfhgzxcv\000bqwer" /* 0x00 - 0x0f */
- "yt123465=97-80]o" /* 0x10 - 0x1f */
- "u[ip\rlj'k;\\,/nm." /* 0x20 - 0x2f */
- "\t `\177\0\033\0\0\0\0\0\0\0\0\0\0" /* 0x30 - 0x3f */
- "\0.\0*\0+\0\0\0\0\0/\r\0-\0" /* 0x40 - 0x4f */
- "\0\0000123456789\0\0\0"; /* 0x50 - 0x5f */
-
-static unsigned char xmon_shift_keytab[128] =
- "ASDFHGZXCV\000BQWER" /* 0x00 - 0x0f */
- "YT!@#$^%+(&_*)}O" /* 0x10 - 0x1f */
- "U{IP\rLJ\"K:|<?NM>" /* 0x20 - 0x2f */
- "\t ~\177\0\033\0\0\0\0\0\0\0\0\0\0" /* 0x30 - 0x3f */
- "\0.\0*\0+\0\0\0\0\0/\r\0-\0" /* 0x40 - 0x4f */
- "\0\0000123456789\0\0\0"; /* 0x50 - 0x5f */
-
-static int
-xmon_get_adb_key(void)
-{
- int k, t, on;
- xmon_wants_key = 1;
- for (;;) {
- xmon_adb_keycode = -1;
- t = 0;
- on = 0;
- do {
- if (--t < 0) {
- on = 1 - on;
- btext_drawchar(on? 0xdb: 0x20);
- btext_drawchar('\b');
- t = 200000;
- }
- do_poll_adb();
- } while (xmon_adb_keycode == -1);
- k = xmon_adb_keycode;
- if (on)
- btext_drawstring(" \b");
-
- /* test for shift keys */
- if ((k & 0x7f) == 0x38 || (k & 0x7f) == 0x7b) {
- xmon_adb_shiftstate = (k & 0x80) == 0;
- continue;
- }
- if (k >= 0x80)
- continue; /* ignore up transitions */
- k = (xmon_adb_shiftstate? xmon_shift_keytab: xmon_keytab)[k];
- if (k != 0)
- break;
- }
- xmon_wants_key = 0;
- return k;
-}
-#endif /* CONFIG_BOOTX_TEXT */
int
xmon_read(void *handle, void *ptr, int nb)
@@ -265,18 +134,11 @@ xmon_read(void *handle, void *ptr, int nb)
char *p = ptr;
int i;
-#ifdef CONFIG_BOOTX_TEXT
- if (use_screen) {
- for (i = 0; i < nb; ++i)
- *p++ = xmon_get_adb_key();
- return i;
- }
-#endif
if (!scc_initialized)
xmon_init_scc();
for (i = 0; i < nb; ++i) {
while ((*sccc & RXRDY) == 0)
- do_poll_adb();
+ ;
buf_access();
*p++ = *sccd;
}
@@ -287,7 +149,7 @@ int
xmon_read_poll(void)
{
if ((*sccc & RXRDY) == 0) {
- do_poll_adb();
+ ;
return -1;
}
buf_access();
@@ -297,15 +159,6 @@ xmon_read_poll(void)
void
xmon_init_scc(void)
{
- if ( _machine == _MACH_chrp )
- {
- sccd[3] = 0x83; eieio(); /* LCR = 8N1 + DLAB */
- sccd[0] = 12; eieio(); /* DLL = 9600 baud */
- sccd[1] = 0; eieio();
- sccd[2] = 0; eieio(); /* FCR = 0 */
- sccd[3] = 3; eieio(); /* LCR = 8N1 */
- sccd[1] = 0; eieio(); /* IER = 0 */
- }
scc_initialized = 1;
if (via_modem) {
for (;;) {
@@ -321,22 +174,6 @@ xmon_init_scc(void)
}
}
-#if 0
-extern int (*prom_entry)(void *);
-
-int
-xmon_exit(void)
-{
- struct prom_args {
- char *service;
- } args;
-
- for (;;) {
- args.service = "exit";
- (*prom_entry)(&args);
- }
-}
-#endif
void *xmon_stdin;
void *xmon_stdout;
diff --git a/arch/ppc/xmon/xmon.c b/arch/ppc/xmon/xmon.c
index bdaf6597b4c2..06fa44b5c647 100644
--- a/arch/ppc/xmon/xmon.c
+++ b/arch/ppc/xmon/xmon.c
@@ -12,8 +12,6 @@
#include <linux/kallsyms.h>
#include <asm/ptrace.h>
#include <asm/string.h>
-#include <asm/prom.h>
-#include <asm/bootx.h>
#include <asm/machdep.h>
#include <asm/xmon.h>
#include "nonstdio.h"
@@ -101,9 +99,6 @@ void cacheflush(void);
static void cpu_cmd(void);
#endif /* CONFIG_SMP */
static void csum(void);
-#ifdef CONFIG_BOOTX_TEXT
-static void vidcmds(void);
-#endif
static void bootcmds(void);
static void proccall(void);
static void printtime(void);
@@ -522,11 +517,6 @@ cmds(struct pt_regs *excp)
cpu_cmd();
break;
#endif /* CONFIG_SMP */
-#ifdef CONFIG_BOOTX_TEXT
- case 'v':
- vidcmds();
- break;
-#endif
case 'z':
bootcmds();
break;
@@ -618,43 +608,6 @@ static void cpu_cmd(void)
}
#endif /* CONFIG_SMP */
-#ifdef CONFIG_BOOTX_TEXT
-extern boot_infos_t disp_bi;
-
-static void vidcmds(void)
-{
- int c = inchar();
- unsigned int val, w;
- extern int boot_text_mapped;
-
- if (!boot_text_mapped)
- return;
- if (c != '\n' && scanhex(&val)) {
- switch (c) {
- case 'd':
- w = disp_bi.dispDeviceRowBytes
- / (disp_bi.dispDeviceDepth >> 3);
- disp_bi.dispDeviceDepth = val;
- disp_bi.dispDeviceRowBytes = w * (val >> 3);
- return;
- case 'p':
- disp_bi.dispDeviceRowBytes = val;
- return;
- case 'w':
- disp_bi.dispDeviceRect[2] = val;
- return;
- case 'h':
- disp_bi.dispDeviceRect[3] = val;
- return;
- }
- }
- printf("W = %d (0x%x) H = %d (0x%x) D = %d (0x%x) P = %d (0x%x)\n",
- disp_bi.dispDeviceRect[2], disp_bi.dispDeviceRect[2],
- disp_bi.dispDeviceRect[3], disp_bi.dispDeviceRect[3],
- disp_bi.dispDeviceDepth, disp_bi.dispDeviceDepth,
- disp_bi.dispDeviceRowBytes, disp_bi.dispDeviceRowBytes);
-}
-#endif /* CONFIG_BOOTX_TEXT */
static unsigned short fcstab[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
@@ -1020,7 +973,6 @@ dump_hash_table(void)
}
#else
-#ifndef CONFIG_PPC64BRIDGE
static void
dump_hash_table_seg(unsigned seg, unsigned start, unsigned end)
{
@@ -1079,66 +1031,6 @@ dump_hash_table_seg(unsigned seg, unsigned start, unsigned end)
printf(" ... %x\n", last_va);
}
-#else /* CONFIG_PPC64BRIDGE */
-static void
-dump_hash_table_seg(unsigned seg, unsigned start, unsigned end)
-{
- extern void *Hash;
- extern unsigned long Hash_size;
- unsigned *htab = Hash;
- unsigned hsize = Hash_size;
- unsigned v, hmask, va, last_va;
- int found, last_found, i;
- unsigned *hg, w1, last_w2, last_va0;
-
- last_found = 0;
- hmask = hsize / 128 - 1;
- va = start;
- start = (start >> 12) & 0xffff;
- end = (end >> 12) & 0xffff;
- for (v = start; v < end; ++v) {
- found = 0;
- hg = htab + (((v ^ seg) & hmask) * 32);
- w1 = 1 | (seg << 12) | ((v & 0xf800) >> 4);
- for (i = 0; i < 8; ++i, hg += 4) {
- if (hg[1] == w1) {
- found = 1;
- break;
- }
- }
- if (!found) {
- w1 ^= 2;
- hg = htab + ((~(v ^ seg) & hmask) * 32);
- for (i = 0; i < 8; ++i, hg += 4) {
- if (hg[1] == w1) {
- found = 1;
- break;
- }
- }
- }
- if (!(last_found && found && (hg[3] & ~0x180) == last_w2 + 4096)) {
- if (last_found) {
- if (last_va != last_va0)
- printf(" ... %x", last_va);
- printf("\n");
- }
- if (found) {
- printf("%x to %x", va, hg[3]);
- last_va0 = va;
- }
- last_found = found;
- }
- if (found) {
- last_w2 = hg[3] & ~0x180;
- last_va = va;
- }
- va += 4096;
- }
- if (last_found)
- printf(" ... %x\n", last_va);
-}
-#endif /* CONFIG_PPC64BRIDGE */
-
static unsigned hash_ctx;
static unsigned hash_start;
static unsigned hash_end;