-/* $OpenBSD: autoconf.c,v 1.10 2008/05/21 19:42:07 miod Exp $ */
+/* $OpenBSD: autoconf.c,v 1.11 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: autoconf.c,v 1.19 2002/06/01 15:33:22 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
void findcpu(void);
void consinit(void);
void scbinit(void);
+void clkstart(void);
int getsecs(void);
void scb_stray(void *);
void longjmp(int *);
int fromnet = (bootregs[12] != -1);
findcpu(); /* Configures CPU variables */
+ scbinit(); /* Setup interrupts */
consinit(); /* Allow us to print out things */
- scbinit(); /* Fix interval clock etc */
+ clkstart(); /* Fix interval clock etc */
#ifdef DEV_DEBUG
printf("Register contents:\n");
struct ivec_dsp *scb_vec;
extern struct ivec_dsp idsptch;
extern int jbuf[10];
+extern int mcheck_silent;
static void
mcheck(void *arg)
{
int off, *mfp = (int *)&arg;
- off = (mfp[7]/4 + 8);
- printf("Machine check, pc=%x, psl=%x\n", mfp[off], mfp[off+1]);
+ if (!mcheck_silent) {
+ off = (mfp[7]/4 + 8);
+ printf("Machine check, pc=%x, psl=%x\n", mfp[off], mfp[off+1]);
+ }
longjmp(jbuf);
}
scb_vec[i].pushlarg = (void *) (i * 4);
scb_vec[i].ev = NULL;
}
- scb_vec[0xc0/4].hoppaddr = rtimer;
scb_vec[4/4].hoppaddr = mcheck;
+}
+void
+clkstart(void)
+{
+ scb_vec[0xc0/4].hoppaddr = rtimer;
if (vax_boardtype != VAX_BTYP_VXT)
mtpr(-10000, PR_NICR); /* Load in count register */
mtpr(0x800000d1, PR_ICCS); /* Start clock and enable interrupt */
-/* $OpenBSD: boot.c,v 1.17 2008/03/30 19:54:05 miod Exp $ */
+/* $OpenBSD: boot.c,v 1.18 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: boot.c,v 1.18 2002/05/31 15:58:26 ragge Exp $ */
/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
int jbuf[10];
int sluttid, senast, skip, askname;
+int mcheck_silent;
struct rpb bootrpb;
void
transition = ' ';
askname = bootrpb.rpb_bootr5 & RB_ASKNAME;
- printf("\n\r>> OpenBSD/vax boot [%s] [%s] <<\n", "1.13", __DATE__);
+ printf("\n\r>> OpenBSD/vax boot [%s] <<\n", "1.14");
printf(">> Press enter to autoboot now, or any other key to abort: ");
sluttid = getsecs() + 5;
senast = 0;
-/* $OpenBSD: consio.c,v 1.7 2006/08/30 20:02:13 miod Exp $ */
+/* $OpenBSD: consio.c,v 1.8 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: consio.c,v 1.13 2002/05/24 21:40:59 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
/* All bugs are subject to removal without further notice */
-
-
-#include "sys/param.h"
+#include <sys/param.h>
#include "../vax/gencons.h"
static int (*get_fp)(void) = NULL;
static int (*test_fp)(void) = NULL;
-void pr_putchar(int c); /* putchar() using mtpr/mfpr */
-int pr_getchar(void);
-int pr_testchar(void);
+/*
+ * I/O using mtpr/mfpr
+ */
-void rom_putchar(int c); /* putchar() using ROM routines */
-int rom_getchar(void);
-int rom_testchar(void);
+void pr_putchar(int c);
+int pr_getchar(void);
+int pr_testchar(void);
-int rom_putc; /* ROM-address of put-routine */
-int rom_getc; /* ROM-address of get-routine */
+/*
+ * I/O using ROM routines
+ */
+
+void rom_putchar(int c);
+int rom_getchar(void);
+int rom_testchar(void);
+
+int rom_putc; /* ROM-address of put-routine */
+int rom_getc; /* ROM-address of get-routine */
+
+/*
+ * I/O using the KA630 ROM console routines
+ */
/* Pointer to KA630 console page, initialized by ka630_consinit */
unsigned char *ka630_conspage;
+void ka630_consinit(void);
-/* Function that initializes things for KA630 ROM console I/O */
-void ka630_consinit(void);
+void ka630_rom_putchar(int c);
+int ka630_rom_getchar(void);
+int ka630_rom_testchar(void);
-/* Functions that use KA630 ROM for console I/O */
-void ka630_rom_putchar(int c);
-int ka630_rom_getchar(void);
-int ka630_rom_testchar(void);
+/*
+ * I/O using the KA53 ROM console routines
+ */
-/* Also added such a thing for KA53 - MK-991208 */
unsigned char *ka53_conspage;
-void ka53_consinit(void);
+void ka53_consinit(void);
-void ka53_rom_putchar(int c);
-int ka53_rom_getchar(void);
-int ka53_rom_testchar(void);
+void ka53_rom_putchar(int c);
+int ka53_rom_getchar(void);
+int ka53_rom_testchar(void);
-void vxt_putchar(int c);
-int vxt_getchar(void);
-int vxt_testchar(void);
+/*
+ * I/O using the VXT2000 serial ports
+ */
-void putchar(int);
-int getchar(void);
-int testkey(void);
-void consinit(void);
-void _rtt(void);
+void vxt_putchar(int c);
+int vxt_getchar(void);
+int vxt_testchar(void);
+
+/*
+ * I/O using the VS3[58][24]0 serial ports
+ */
+
+void ff_consinit(void);
+void ff_putchar(int c);
+int ff_getchar(void);
+int ff_testchar(void);
+
+void putchar(int);
+int getchar(void);
+int testkey(void);
+void consinit(void);
+void _rtt(void);
void
putchar(int c)
c = (*get_fp)() & 0177;
while (c == 17 || c == 19); /* ignore XON/XOFF */
if (c < 96 && c > 64)
- c += 32;
+ c += 32; /* force lowercase */
return c;
}
ka53_consinit();
break;
+ case VAX_BTYP_60:
+ put_fp = ff_putchar;
+ get_fp = ff_getchar;
+ test_fp = ff_testchar;
+ ff_consinit();
+ break;
+
#ifdef notdef
case VAX_BTYP_630:
case VAX_BTYP_650:
case VAX_BTYP_9CC:
- case VAX_BTYP_60:
put_fp = pr_putchar;
get_fp = pr_getchar;
break
return vxtregs[CH_DATA];
}
}
+
+/*
+ * VaxStation 3[58][24]0 console routines.
+ *
+ * We do not know what the proper ROM entry points are, so these routines
+ * drive the serial ports directly.
+ *
+ * Unfortunately the address of the serial ports depend on the position
+ * of the L2003 I/O board in the system, which requires us to check all
+ * slots for their ID. Of course, empty slots will cause a machine check,
+ * and the suggested method of looking at the BUSCTL register to know
+ * which slots are populated is not usable, since we are way too late in
+ * the boot process.
+ */
+
+struct ff_dzregs {
+ volatile unsigned short csr;
+ volatile unsigned short unused;
+ volatile unsigned short rbuf;
+ volatile unsigned short unused2;
+ volatile unsigned short tcr;
+ volatile unsigned short unused3;
+ volatile unsigned short tdr;
+};
+
+#define DZ_CSR_TX_READY 0100000
+#define DZ_CSR_RX_DONE 0000200
+
+int ff_ioslot = -1;
+static struct ff_dzregs *ff_dz;
+
+void
+ff_consinit()
+{
+ extern int jbuf[10];
+ extern int mcheck_silent;
+ extern int setjmp(int *);
+
+ int line = 3; /* printer port */
+ int mid, modaddr, modtype;
+
+ mcheck_silent = 1;
+ for (mid = 0; mid < 8; mid++) {
+ modaddr = 0x31fffffc + (mid << 25);
+ if (setjmp(jbuf)) {
+ /* this slot is empty */
+ continue;
+ }
+ modtype = *(int *)modaddr;
+ if ((modtype & 0xff) == 0x04) {
+ ff_ioslot = mid;
+ break;
+ }
+ }
+ mcheck_silent = 0;
+
+ if (ff_ioslot < 0) {
+ /*
+ * This shouldn't happen. Try mid #5 (slot #4) as a
+ * supposedly sane default.
+ */
+ ff_ioslot = 5;
+ }
+
+ ff_dz = (struct ff_dzregs *)
+ (0x30000000 + (ff_ioslot << 25) + 0x00600000);
+ ff_dz->tcr = 1 << line;
+}
+
+void
+ff_putchar(int c)
+{
+ while ((ff_dz->csr & DZ_CSR_TX_READY) == 0)
+ ;
+ ff_dz->tdr = c;
+ while ((ff_dz->csr & DZ_CSR_TX_READY) == 0)
+ ;
+}
+
+int
+ff_getchar()
+{
+ int line = 3; /* printer port */
+ unsigned short rbuf;
+
+ for(;;) {
+ while ((ff_dz->csr & DZ_CSR_RX_DONE) == 0)
+ ;
+ rbuf = ff_dz->rbuf;
+ if (((rbuf >> 8) & 3) == line)
+ break;
+ }
+
+ rbuf &= 0x7f;
+ if (rbuf == 13)
+ rbuf = 10;
+
+ return (int)rbuf;
+}
+
+int
+ff_testchar()
+{
+ int line = 3; /* printer port */
+ unsigned short rbuf;
+
+ if ((ff_dz->csr & DZ_CSR_RX_DONE) == 0)
+ return 0;
+ rbuf = ff_dz->rbuf;
+ if (((rbuf >> 8) & 3) != line)
+ return 0;
+
+ rbuf &= 0x7f;
+ if (rbuf == 13)
+ rbuf = 10;
+
+ return (int)rbuf;
+}
-/* $OpenBSD: if_le.c,v 1.3 2003/11/07 10:16:45 jmc Exp $ */
+/* $OpenBSD: if_le.c,v 1.4 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: if_le.c,v 1.6 2000/05/20 13:30:03 ragge Exp $ */
/*
* Copyright (c) 1997, 1999 Ludd, University of Lule}, Sweden.
short bd_mcnt;
} *rdesc, *tdesc;
-static int addoff, kopiera = 0;
+static int addoff;
+static int lebufaddr;
/* Flags in the address field */
#define BR_OWN 0x80000000
if (vax_boardtype == VAX_BTYP_650 &&
((vax_siedata >> 8) & 0xff) == VAX_SIE_KA640) {
- kopiera = 1;
+ lebufaddr = 0x20120000;
ea = (void *)0x20084200;
nireg = (void *)0x20084400;
+ } else if (vax_boardtype == VAX_BTYP_60) {
+ extern int ff_ioslot;
+ lebufaddr = 0x30a00000 + (ff_ioslot << 25);
+ ea = (int *)(0x30800000 + (ff_ioslot << 25));
+ for (i = 0; i < 6; i++) {
+ eaddr[i] = *(u_char *)((int)ea + 2);
+ ea++;
+ }
+ ea = NULL;
+ nireg = (void *)(0x30200000 + (ff_ioslot << 25));
} else {
*(int *)0x20080014 = 0; /* Be sure we do DMA in low 16MB */
ea = (void *)0x20090000; /* XXX Ethernet address */
while (to--)
;
- for (i = 0; i < 6; i++)
- eaddr[i] = ea[i] & 0377;
+ if (ea != NULL) {
+ for (i = 0; i < 6; i++)
+ eaddr[i] = ea[i] & 0377;
+ }
if (initblock == NULL) {
(void *)initblock =
(int)rdesc = QW_ALLOC(sizeof(struct buffdesc) * NRBUF) + addoff;
initblock->ib_rdr = (RLEN << 29) | (int)rdesc;
- if (kopiera)
+ if (lebufaddr)
initblock->ib_rdr -= (int)initblock;
(int)tdesc = QW_ALLOC(sizeof(struct buffdesc) * NTBUF) + addoff;
initblock->ib_tdr = (TLEN << 29) | (int)tdesc;
- if (kopiera)
+ if (lebufaddr)
initblock->ib_tdr -= (int)initblock;
- if (kopiera)
+ if (lebufaddr)
copyout(initblock, 0, sizeof(struct initblock));
for (i = 0; i < NRBUF; i++) {
rdesc[i].bd_adrflg = QW_ALLOC(BUFSIZE) | BR_OWN;
- if (kopiera)
+ if (lebufaddr)
rdesc[i].bd_adrflg -= (int)initblock;
rdesc[i].bd_bcnt = -BUFSIZE;
rdesc[i].bd_mcnt = 0;
}
- if (kopiera)
+ if (lebufaddr)
copyout((void *)rdesc, (int)rdesc - (int)initblock,
sizeof(struct buffdesc) * NRBUF);
for (i = 0; i < NTBUF; i++) {
tdesc[i].bd_adrflg = QW_ALLOC(BUFSIZE);
- if (kopiera)
+ if (lebufaddr)
tdesc[i].bd_adrflg -= (int)initblock;
tdesc[i].bd_bcnt = 0xf000;
tdesc[i].bd_mcnt = 0;
}
- if (kopiera)
+ if (lebufaddr)
copyout((void *)tdesc, (int)tdesc - (int)initblock,
sizeof(struct buffdesc) * NTBUF);
}
- if (kopiera) {
+ if (lebufaddr) {
LEWRCSR(LE_CSR1, 0);
LEWRCSR(LE_CSR2, 0);
} else {
csr = LERDCSR(LE_CSR0);
LEWRCSR(LE_CSR0, csr & (LE_C0_BABL|LE_C0_MISS|LE_C0_MERR|LE_C0_RINT));
- if (kopiera)
+ if (lebufaddr)
copyin((int)&rdesc[next_rdesc] - (int)initblock,
(void *)&rdesc[next_rdesc], sizeof(struct buffdesc));
if (rdesc[next_rdesc].bd_adrflg & BR_OWN)
if ((len = rdesc[next_rdesc].bd_mcnt - 4) > maxlen)
len = maxlen;
- if (kopiera)
+ if (lebufaddr)
copyin((rdesc[next_rdesc].bd_adrflg&0xffffff),
pkt, len);
else
rdesc[next_rdesc].bd_mcnt = 0;
rdesc[next_rdesc].bd_adrflg |= BR_OWN;
- if (kopiera)
+ if (lebufaddr)
copyout((void *)&rdesc[next_rdesc], (int)&rdesc[next_rdesc] -
(int)initblock, sizeof(struct buffdesc));
if (++next_rdesc >= NRBUF)
csr = LERDCSR(LE_CSR0);
LEWRCSR(LE_CSR0, csr & (LE_C0_MISS|LE_C0_CERR|LE_C0_TINT));
- if (kopiera)
+ if (lebufaddr)
copyin((int)&tdesc[next_tdesc] - (int)initblock,
(void *)&tdesc[next_tdesc], sizeof(struct buffdesc));
if (tdesc[next_tdesc].bd_adrflg & BT_OWN)
goto retry;
- if (kopiera)
+ if (lebufaddr)
copyout(pkt, (tdesc[next_tdesc].bd_adrflg & 0xffffff), len);
else
bcopy(pkt, (char *)(tdesc[next_tdesc].bd_adrflg & 0xffffff) +
(len < ETHER_MIN_LEN ? -ETHER_MIN_LEN : -len);
tdesc[next_tdesc].bd_mcnt = 0;
tdesc[next_tdesc].bd_adrflg |= BT_OWN | BT_STP | BT_ENP;
- if (kopiera)
+ if (lebufaddr)
copyout((void *)&tdesc[next_tdesc], (int)&tdesc[next_tdesc] -
(int)initblock, sizeof(struct buffdesc));
void
copyout(void *f, int dest, int len)
{
- short *from = f;
- short *toaddr;
+ if (vax_boardtype == VAX_BTYP_60) {
+ u_char *from = f;
+ u_char *toaddr = (u_char *)lebufaddr + dest;
- toaddr = (short *)0x20120000 + dest;
+ while (len-- > 0)
+ *toaddr++ = *from++;
+ } else {
+ short *from = f;
+ short *toaddr;
- while (len > 0) {
- *toaddr = *from++;
- toaddr += 2;
- len -= 2;
+ toaddr = (short *)lebufaddr + dest;
+
+ while (len > 0) {
+ *toaddr = *from++;
+ toaddr += 2;
+ len -= 2;
+ }
}
}
void
copyin(int src, void *f, int len)
{
- short *to = f;
- short *fromaddr;
+ if (vax_boardtype == VAX_BTYP_60) {
+ u_char *to = f;
+ u_char *fromaddr;
- fromaddr = (short *)0x20120000 + src;
+ fromaddr = (u_char *)lebufaddr + src;
- while (len > 0) {
- *to++ = *fromaddr;
- fromaddr += 2;
- len -= 2;
+ while (len-- > 0)
+ *to++ = *fromaddr++;
+ } else {
+ short *to = f;
+ short *fromaddr;
+
+ fromaddr = (short *)lebufaddr + src;
+
+ while (len > 0) {
+ *to++ = *fromaddr;
+ fromaddr += 2;
+ len -= 2;
+ }
}
}
-$OpenBSD: version,v 1.5 2008/03/30 19:54:05 miod Exp $
+$OpenBSD: version,v 1.6 2008/08/10 18:20:07 miod Exp $
$NetBSD: version,v 1.4 2001/11/09 19:53:15 scw Exp $
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
1.11: Better VXT2000{,+} support.
1.12: Glass console support on VXT2000{,+}.
1.13: Enable the loadfile code added in revision 1.8.
+1.14: Support for VaxStation 3[58][24]0 (serial port console only).
-/* $OpenBSD: autoconf.c,v 1.10 2008/05/21 19:42:07 miod Exp $ */
+/* $OpenBSD: autoconf.c,v 1.11 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: autoconf.c,v 1.19 2002/06/01 15:33:22 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
void findcpu(void);
void consinit(void);
void scbinit(void);
+void clkstart(void);
int getsecs(void);
void scb_stray(void *);
void longjmp(int *);
int fromnet = (bootregs[12] != -1);
findcpu(); /* Configures CPU variables */
+ scbinit(); /* Setup interrupts */
consinit(); /* Allow us to print out things */
- scbinit(); /* Fix interval clock etc */
+ clkstart(); /* Fix interval clock etc */
#ifdef DEV_DEBUG
printf("Register contents:\n");
struct ivec_dsp *scb_vec;
extern struct ivec_dsp idsptch;
extern int jbuf[10];
+extern int mcheck_silent;
static void
mcheck(void *arg)
{
int off, *mfp = (int *)&arg;
- off = (mfp[7]/4 + 8);
- printf("Machine check, pc=%x, psl=%x\n", mfp[off], mfp[off+1]);
+ if (!mcheck_silent) {
+ off = (mfp[7]/4 + 8);
+ printf("Machine check, pc=%x, psl=%x\n", mfp[off], mfp[off+1]);
+ }
longjmp(jbuf);
}
scb_vec[i].pushlarg = (void *) (i * 4);
scb_vec[i].ev = NULL;
}
- scb_vec[0xc0/4].hoppaddr = rtimer;
scb_vec[4/4].hoppaddr = mcheck;
+}
+void
+clkstart(void)
+{
+ scb_vec[0xc0/4].hoppaddr = rtimer;
if (vax_boardtype != VAX_BTYP_VXT)
mtpr(-10000, PR_NICR); /* Load in count register */
mtpr(0x800000d1, PR_ICCS); /* Start clock and enable interrupt */
-/* $OpenBSD: boot.c,v 1.17 2008/03/30 19:54:05 miod Exp $ */
+/* $OpenBSD: boot.c,v 1.18 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: boot.c,v 1.18 2002/05/31 15:58:26 ragge Exp $ */
/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
int jbuf[10];
int sluttid, senast, skip, askname;
+int mcheck_silent;
struct rpb bootrpb;
void
transition = ' ';
askname = bootrpb.rpb_bootr5 & RB_ASKNAME;
- printf("\n\r>> OpenBSD/vax boot [%s] [%s] <<\n", "1.13", __DATE__);
+ printf("\n\r>> OpenBSD/vax boot [%s] <<\n", "1.14");
printf(">> Press enter to autoboot now, or any other key to abort: ");
sluttid = getsecs() + 5;
senast = 0;
-/* $OpenBSD: consio.c,v 1.7 2006/08/30 20:02:13 miod Exp $ */
+/* $OpenBSD: consio.c,v 1.8 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: consio.c,v 1.13 2002/05/24 21:40:59 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
/* All bugs are subject to removal without further notice */
-
-
-#include "sys/param.h"
+#include <sys/param.h>
#include "../vax/gencons.h"
static int (*get_fp)(void) = NULL;
static int (*test_fp)(void) = NULL;
-void pr_putchar(int c); /* putchar() using mtpr/mfpr */
-int pr_getchar(void);
-int pr_testchar(void);
+/*
+ * I/O using mtpr/mfpr
+ */
-void rom_putchar(int c); /* putchar() using ROM routines */
-int rom_getchar(void);
-int rom_testchar(void);
+void pr_putchar(int c);
+int pr_getchar(void);
+int pr_testchar(void);
-int rom_putc; /* ROM-address of put-routine */
-int rom_getc; /* ROM-address of get-routine */
+/*
+ * I/O using ROM routines
+ */
+
+void rom_putchar(int c);
+int rom_getchar(void);
+int rom_testchar(void);
+
+int rom_putc; /* ROM-address of put-routine */
+int rom_getc; /* ROM-address of get-routine */
+
+/*
+ * I/O using the KA630 ROM console routines
+ */
/* Pointer to KA630 console page, initialized by ka630_consinit */
unsigned char *ka630_conspage;
+void ka630_consinit(void);
-/* Function that initializes things for KA630 ROM console I/O */
-void ka630_consinit(void);
+void ka630_rom_putchar(int c);
+int ka630_rom_getchar(void);
+int ka630_rom_testchar(void);
-/* Functions that use KA630 ROM for console I/O */
-void ka630_rom_putchar(int c);
-int ka630_rom_getchar(void);
-int ka630_rom_testchar(void);
+/*
+ * I/O using the KA53 ROM console routines
+ */
-/* Also added such a thing for KA53 - MK-991208 */
unsigned char *ka53_conspage;
-void ka53_consinit(void);
+void ka53_consinit(void);
-void ka53_rom_putchar(int c);
-int ka53_rom_getchar(void);
-int ka53_rom_testchar(void);
+void ka53_rom_putchar(int c);
+int ka53_rom_getchar(void);
+int ka53_rom_testchar(void);
-void vxt_putchar(int c);
-int vxt_getchar(void);
-int vxt_testchar(void);
+/*
+ * I/O using the VXT2000 serial ports
+ */
-void putchar(int);
-int getchar(void);
-int testkey(void);
-void consinit(void);
-void _rtt(void);
+void vxt_putchar(int c);
+int vxt_getchar(void);
+int vxt_testchar(void);
+
+/*
+ * I/O using the VS3[58][24]0 serial ports
+ */
+
+void ff_consinit(void);
+void ff_putchar(int c);
+int ff_getchar(void);
+int ff_testchar(void);
+
+void putchar(int);
+int getchar(void);
+int testkey(void);
+void consinit(void);
+void _rtt(void);
void
putchar(int c)
c = (*get_fp)() & 0177;
while (c == 17 || c == 19); /* ignore XON/XOFF */
if (c < 96 && c > 64)
- c += 32;
+ c += 32; /* force lowercase */
return c;
}
ka53_consinit();
break;
+ case VAX_BTYP_60:
+ put_fp = ff_putchar;
+ get_fp = ff_getchar;
+ test_fp = ff_testchar;
+ ff_consinit();
+ break;
+
#ifdef notdef
case VAX_BTYP_630:
case VAX_BTYP_650:
case VAX_BTYP_9CC:
- case VAX_BTYP_60:
put_fp = pr_putchar;
get_fp = pr_getchar;
break
return vxtregs[CH_DATA];
}
}
+
+/*
+ * VaxStation 3[58][24]0 console routines.
+ *
+ * We do not know what the proper ROM entry points are, so these routines
+ * drive the serial ports directly.
+ *
+ * Unfortunately the address of the serial ports depend on the position
+ * of the L2003 I/O board in the system, which requires us to check all
+ * slots for their ID. Of course, empty slots will cause a machine check,
+ * and the suggested method of looking at the BUSCTL register to know
+ * which slots are populated is not usable, since we are way too late in
+ * the boot process.
+ */
+
+struct ff_dzregs {
+ volatile unsigned short csr;
+ volatile unsigned short unused;
+ volatile unsigned short rbuf;
+ volatile unsigned short unused2;
+ volatile unsigned short tcr;
+ volatile unsigned short unused3;
+ volatile unsigned short tdr;
+};
+
+#define DZ_CSR_TX_READY 0100000
+#define DZ_CSR_RX_DONE 0000200
+
+int ff_ioslot = -1;
+static struct ff_dzregs *ff_dz;
+
+void
+ff_consinit()
+{
+ extern int jbuf[10];
+ extern int mcheck_silent;
+ extern int setjmp(int *);
+
+ int line = 3; /* printer port */
+ int mid, modaddr, modtype;
+
+ mcheck_silent = 1;
+ for (mid = 0; mid < 8; mid++) {
+ modaddr = 0x31fffffc + (mid << 25);
+ if (setjmp(jbuf)) {
+ /* this slot is empty */
+ continue;
+ }
+ modtype = *(int *)modaddr;
+ if ((modtype & 0xff) == 0x04) {
+ ff_ioslot = mid;
+ break;
+ }
+ }
+ mcheck_silent = 0;
+
+ if (ff_ioslot < 0) {
+ /*
+ * This shouldn't happen. Try mid #5 (slot #4) as a
+ * supposedly sane default.
+ */
+ ff_ioslot = 5;
+ }
+
+ ff_dz = (struct ff_dzregs *)
+ (0x30000000 + (ff_ioslot << 25) + 0x00600000);
+ ff_dz->tcr = 1 << line;
+}
+
+void
+ff_putchar(int c)
+{
+ while ((ff_dz->csr & DZ_CSR_TX_READY) == 0)
+ ;
+ ff_dz->tdr = c;
+ while ((ff_dz->csr & DZ_CSR_TX_READY) == 0)
+ ;
+}
+
+int
+ff_getchar()
+{
+ int line = 3; /* printer port */
+ unsigned short rbuf;
+
+ for(;;) {
+ while ((ff_dz->csr & DZ_CSR_RX_DONE) == 0)
+ ;
+ rbuf = ff_dz->rbuf;
+ if (((rbuf >> 8) & 3) == line)
+ break;
+ }
+
+ rbuf &= 0x7f;
+ if (rbuf == 13)
+ rbuf = 10;
+
+ return (int)rbuf;
+}
+
+int
+ff_testchar()
+{
+ int line = 3; /* printer port */
+ unsigned short rbuf;
+
+ if ((ff_dz->csr & DZ_CSR_RX_DONE) == 0)
+ return 0;
+ rbuf = ff_dz->rbuf;
+ if (((rbuf >> 8) & 3) != line)
+ return 0;
+
+ rbuf &= 0x7f;
+ if (rbuf == 13)
+ rbuf = 10;
+
+ return (int)rbuf;
+}
-/* $OpenBSD: if_le.c,v 1.3 2003/11/07 10:16:45 jmc Exp $ */
+/* $OpenBSD: if_le.c,v 1.4 2008/08/10 18:20:07 miod Exp $ */
/* $NetBSD: if_le.c,v 1.6 2000/05/20 13:30:03 ragge Exp $ */
/*
* Copyright (c) 1997, 1999 Ludd, University of Lule}, Sweden.
short bd_mcnt;
} *rdesc, *tdesc;
-static int addoff, kopiera = 0;
+static int addoff;
+static int lebufaddr;
/* Flags in the address field */
#define BR_OWN 0x80000000
if (vax_boardtype == VAX_BTYP_650 &&
((vax_siedata >> 8) & 0xff) == VAX_SIE_KA640) {
- kopiera = 1;
+ lebufaddr = 0x20120000;
ea = (void *)0x20084200;
nireg = (void *)0x20084400;
+ } else if (vax_boardtype == VAX_BTYP_60) {
+ extern int ff_ioslot;
+ lebufaddr = 0x30a00000 + (ff_ioslot << 25);
+ ea = (int *)(0x30800000 + (ff_ioslot << 25));
+ for (i = 0; i < 6; i++) {
+ eaddr[i] = *(u_char *)((int)ea + 2);
+ ea++;
+ }
+ ea = NULL;
+ nireg = (void *)(0x30200000 + (ff_ioslot << 25));
} else {
*(int *)0x20080014 = 0; /* Be sure we do DMA in low 16MB */
ea = (void *)0x20090000; /* XXX Ethernet address */
while (to--)
;
- for (i = 0; i < 6; i++)
- eaddr[i] = ea[i] & 0377;
+ if (ea != NULL) {
+ for (i = 0; i < 6; i++)
+ eaddr[i] = ea[i] & 0377;
+ }
if (initblock == NULL) {
(void *)initblock =
(int)rdesc = QW_ALLOC(sizeof(struct buffdesc) * NRBUF) + addoff;
initblock->ib_rdr = (RLEN << 29) | (int)rdesc;
- if (kopiera)
+ if (lebufaddr)
initblock->ib_rdr -= (int)initblock;
(int)tdesc = QW_ALLOC(sizeof(struct buffdesc) * NTBUF) + addoff;
initblock->ib_tdr = (TLEN << 29) | (int)tdesc;
- if (kopiera)
+ if (lebufaddr)
initblock->ib_tdr -= (int)initblock;
- if (kopiera)
+ if (lebufaddr)
copyout(initblock, 0, sizeof(struct initblock));
for (i = 0; i < NRBUF; i++) {
rdesc[i].bd_adrflg = QW_ALLOC(BUFSIZE) | BR_OWN;
- if (kopiera)
+ if (lebufaddr)
rdesc[i].bd_adrflg -= (int)initblock;
rdesc[i].bd_bcnt = -BUFSIZE;
rdesc[i].bd_mcnt = 0;
}
- if (kopiera)
+ if (lebufaddr)
copyout((void *)rdesc, (int)rdesc - (int)initblock,
sizeof(struct buffdesc) * NRBUF);
for (i = 0; i < NTBUF; i++) {
tdesc[i].bd_adrflg = QW_ALLOC(BUFSIZE);
- if (kopiera)
+ if (lebufaddr)
tdesc[i].bd_adrflg -= (int)initblock;
tdesc[i].bd_bcnt = 0xf000;
tdesc[i].bd_mcnt = 0;
}
- if (kopiera)
+ if (lebufaddr)
copyout((void *)tdesc, (int)tdesc - (int)initblock,
sizeof(struct buffdesc) * NTBUF);
}
- if (kopiera) {
+ if (lebufaddr) {
LEWRCSR(LE_CSR1, 0);
LEWRCSR(LE_CSR2, 0);
} else {
csr = LERDCSR(LE_CSR0);
LEWRCSR(LE_CSR0, csr & (LE_C0_BABL|LE_C0_MISS|LE_C0_MERR|LE_C0_RINT));
- if (kopiera)
+ if (lebufaddr)
copyin((int)&rdesc[next_rdesc] - (int)initblock,
(void *)&rdesc[next_rdesc], sizeof(struct buffdesc));
if (rdesc[next_rdesc].bd_adrflg & BR_OWN)
if ((len = rdesc[next_rdesc].bd_mcnt - 4) > maxlen)
len = maxlen;
- if (kopiera)
+ if (lebufaddr)
copyin((rdesc[next_rdesc].bd_adrflg&0xffffff),
pkt, len);
else
rdesc[next_rdesc].bd_mcnt = 0;
rdesc[next_rdesc].bd_adrflg |= BR_OWN;
- if (kopiera)
+ if (lebufaddr)
copyout((void *)&rdesc[next_rdesc], (int)&rdesc[next_rdesc] -
(int)initblock, sizeof(struct buffdesc));
if (++next_rdesc >= NRBUF)
csr = LERDCSR(LE_CSR0);
LEWRCSR(LE_CSR0, csr & (LE_C0_MISS|LE_C0_CERR|LE_C0_TINT));
- if (kopiera)
+ if (lebufaddr)
copyin((int)&tdesc[next_tdesc] - (int)initblock,
(void *)&tdesc[next_tdesc], sizeof(struct buffdesc));
if (tdesc[next_tdesc].bd_adrflg & BT_OWN)
goto retry;
- if (kopiera)
+ if (lebufaddr)
copyout(pkt, (tdesc[next_tdesc].bd_adrflg & 0xffffff), len);
else
bcopy(pkt, (char *)(tdesc[next_tdesc].bd_adrflg & 0xffffff) +
(len < ETHER_MIN_LEN ? -ETHER_MIN_LEN : -len);
tdesc[next_tdesc].bd_mcnt = 0;
tdesc[next_tdesc].bd_adrflg |= BT_OWN | BT_STP | BT_ENP;
- if (kopiera)
+ if (lebufaddr)
copyout((void *)&tdesc[next_tdesc], (int)&tdesc[next_tdesc] -
(int)initblock, sizeof(struct buffdesc));
void
copyout(void *f, int dest, int len)
{
- short *from = f;
- short *toaddr;
+ if (vax_boardtype == VAX_BTYP_60) {
+ u_char *from = f;
+ u_char *toaddr = (u_char *)lebufaddr + dest;
- toaddr = (short *)0x20120000 + dest;
+ while (len-- > 0)
+ *toaddr++ = *from++;
+ } else {
+ short *from = f;
+ short *toaddr;
- while (len > 0) {
- *toaddr = *from++;
- toaddr += 2;
- len -= 2;
+ toaddr = (short *)lebufaddr + dest;
+
+ while (len > 0) {
+ *toaddr = *from++;
+ toaddr += 2;
+ len -= 2;
+ }
}
}
void
copyin(int src, void *f, int len)
{
- short *to = f;
- short *fromaddr;
+ if (vax_boardtype == VAX_BTYP_60) {
+ u_char *to = f;
+ u_char *fromaddr;
- fromaddr = (short *)0x20120000 + src;
+ fromaddr = (u_char *)lebufaddr + src;
- while (len > 0) {
- *to++ = *fromaddr;
- fromaddr += 2;
- len -= 2;
+ while (len-- > 0)
+ *to++ = *fromaddr++;
+ } else {
+ short *to = f;
+ short *fromaddr;
+
+ fromaddr = (short *)lebufaddr + src;
+
+ while (len > 0) {
+ *to++ = *fromaddr;
+ fromaddr += 2;
+ len -= 2;
+ }
}
}
-$OpenBSD: version,v 1.5 2008/03/30 19:54:05 miod Exp $
+$OpenBSD: version,v 1.6 2008/08/10 18:20:07 miod Exp $
$NetBSD: version,v 1.4 2001/11/09 19:53:15 scw Exp $
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
1.11: Better VXT2000{,+} support.
1.12: Glass console support on VXT2000{,+}.
1.13: Enable the loadfile code added in revision 1.8.
+1.14: Support for VaxStation 3[58][24]0 (serial port console only).