Module Name: src
Committed By: snj
Date: Sat Mar 24 18:06:51 UTC 2018
Modified Files:
src/sys/arch/vax/boot/boot [netbsd-8]: devopen.c hp.c if_de.c if_qe.c
ra.c vaxstand.h
Log Message:
Pull up following revision(s) (requested by ragge in ticket #655):
sys/arch/vax/boot/boot/devopen.c: 1.19-1.20
sys/arch/vax/boot/boot/hp.c: 1.11
sys/arch/vax/boot/boot/if_de.c: 1.10
sys/arch/vax/boot/boot/if_qe.c: 1.10
sys/arch/vax/boot/boot/ra.c: 1.21-1.22
sys/arch/vax/boot/boot/vaxstand.h: 1.10
Use a common routine ubmap() that setup the map registers as needed,
not expecting everything to be below 4M. This solves the problem
that large kernels cannot be loaded reported on port-vax.
--
Change the driver to map the data structures onto the qbus.
--
Fix bug causing autoboot on 750/780 not to work. Cleanup.
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.18.2.1 src/sys/arch/vax/boot/boot/devopen.c
cvs rdiff -u -r1.10 -r1.10.2.1 src/sys/arch/vax/boot/boot/hp.c
cvs rdiff -u -r1.9 -r1.9.2.1 src/sys/arch/vax/boot/boot/if_de.c \
src/sys/arch/vax/boot/boot/vaxstand.h
cvs rdiff -u -r1.9 -r1.9.56.1 src/sys/arch/vax/boot/boot/if_qe.c
cvs rdiff -u -r1.20 -r1.20.2.1 src/sys/arch/vax/boot/boot/ra.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/vax/boot/boot/devopen.c
diff -u src/sys/arch/vax/boot/boot/devopen.c:1.18 src/sys/arch/vax/boot/boot/devopen.c:1.18.2.1
--- src/sys/arch/vax/boot/boot/devopen.c:1.18 Mon May 22 16:59:32 2017
+++ src/sys/arch/vax/boot/boot/devopen.c Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: devopen.c,v 1.18 2017/05/22 16:59:32 ragge Exp $ */
+/* $NetBSD: devopen.c,v 1.18.2.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 1997 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -27,6 +27,7 @@
#include <lib/libsa/stand.h>
#include <lib/libkern/libkern.h>
+#include <machine/param.h>
#include <machine/rpb.h>
#include <machine/sid.h>
#include <machine/pte.h>
@@ -38,12 +39,16 @@
#include "vaxstand.h"
int nexaddr, csrbase;
+static int *mapaddr;
+/*
+ * Boot device syntax:
+ * device(adapter, controller, unit, partition)file
+ */
int
devopen(struct open_file *f, const char *fname, char **file)
{
int dev, unit, ctlr, part, adapt, i, a[4], x;
- int *mapregs;
struct devsw *dp;
extern int cnvtab[];
char *s, *c;
@@ -124,6 +129,7 @@ devopen(struct open_file *f, const char
switch (vax_boardtype) {
case VAX_BTYP_750:
csrbase = (nexaddr == 0xf30000 ? 0xffe000 : 0xfbe000);
+ mapaddr = (int *)nexaddr + VAX_NBPG;
if (adapt < 0)
break;
nexaddr = (NEX750 + NEXSIZE * adapt);
@@ -132,6 +138,7 @@ devopen(struct open_file *f, const char
case VAX_BTYP_780:
case VAX_BTYP_790:
csrbase = 0x2007e000 + 0x40000 * ((nexaddr & 0x1e000) >> 13);
+ mapaddr = (int *)nexaddr + VAX_NBPG;
if (adapt < 0)
break;
nexaddr = ((int)NEX780 + NEXSIZE * adapt);
@@ -172,12 +179,9 @@ devopen(struct open_file *f, const char
default:
nexaddr = 0; /* No map regs */
csrbase = 0x20000000;
- /* Always map in the lowest 4M on qbus-based machines */
- mapregs = (void *)0x20088000;
if (bootrpb.adpphy == 0x20087800) {
nexaddr = bootrpb.adpphy;
- for (i = 0; i < 8192; i++)
- mapregs[i] = PG_V | i;
+ mapaddr = (int *)nexaddr + VAX_NBPG;
}
break;
}
@@ -195,3 +199,24 @@ usage:
printf("usage: dev(adapter,controller,unit,partition)file -asd\n");
return -1;
}
+
+/*
+ * Map in virtual address vaddr of size vsize starting with map mapno.
+ * Returns the unibus address of the mapped area.
+ */
+int
+ubmap(int mapno, int vaddr, int size)
+{
+ int voff = (vaddr & VAX_PGOFSET);
+ int rv = (mapno << VAX_PGSHIFT) + voff;
+ int vpag, npag;
+
+ if (mapaddr == 0)
+ return vaddr; /* no map, phys == virt */
+
+ npag = (voff + size) / VAX_NBPG;
+ vpag = vaddr >> VAX_PGSHIFT;
+ while (npag-- >= 0)
+ mapaddr[mapno++] = vpag++ | PG_V;
+ return rv;
+}
Index: src/sys/arch/vax/boot/boot/hp.c
diff -u src/sys/arch/vax/boot/boot/hp.c:1.10 src/sys/arch/vax/boot/boot/hp.c:1.10.2.1
--- src/sys/arch/vax/boot/boot/hp.c:1.10 Mon May 22 16:59:32 2017
+++ src/sys/arch/vax/boot/boot/hp.c Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: hp.c,v 1.10 2017/05/22 16:59:32 ragge Exp $ */
+/* $NetBSD: hp.c,v 1.10.2.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -108,13 +108,9 @@ int
hpstrategy(void *f, int func, daddr_t dblk,
size_t size, void *buf, size_t *rsize)
{
- unsigned int pfnum, mapnr, nsize, bn, cn, sn, tn;
+ unsigned int bn, cn, sn, tn;
- pfnum = (u_int)buf >> VAX_PGSHIFT;
-
- for(mapnr = 0, nsize = size; (nsize + VAX_NBPG) > 0;
- nsize -= VAX_NBPG, mapnr++, pfnum++)
- MBA_WCSR(MAPREG(mapnr), PG_V | pfnum);
+ (void)ubmap(0, (int)buf, size);
MBA_WCSR(MBA_VAR, ((u_int)buf & VAX_PGOFSET));
MBA_WCSR(MBA_BC, (~size) + 1);
Index: src/sys/arch/vax/boot/boot/if_de.c
diff -u src/sys/arch/vax/boot/boot/if_de.c:1.9 src/sys/arch/vax/boot/boot/if_de.c:1.9.2.1
--- src/sys/arch/vax/boot/boot/if_de.c:1.9 Mon May 22 16:59:32 2017
+++ src/sys/arch/vax/boot/boot/if_de.c Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_de.c,v 1.9 2017/05/22 16:59:32 ragge Exp $ */
+/* $NetBSD: if_de.c,v 1.9.2.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 2000 Ludd, University of Lule}, Sweden. All rights reserved.
@@ -86,7 +86,7 @@ static int crx, ctx;
int
deopen(struct open_file *f, int adapt, int ctlr, int unit, int part)
{
- int i, cdata, *map, npgs;
+ int i;
u_char eaddr[6];
/* point to the device in memory */
@@ -108,14 +108,8 @@ deopen(struct open_file *f, int adapt, i
/* Map in the control structures and buffers */
dc = alloc(sizeof(struct de_cdata));
- pdc = (struct de_cdata *)((int)dc & VAX_PGOFSET);
- map = (int *)nexaddr + 512;
- npgs = (sizeof(struct de_cdata) >> VAX_PGSHIFT) + 1;
- cdata = (int)dc >> VAX_PGSHIFT;
- for (i = 0; i < npgs; i++) {
- map[i] = PG_V | (cdata + i);
- }
+ pdc = (struct de_cdata *)ubmap(0, (int)dc, sizeof(struct de_cdata));
memset((char *)dc, 0, sizeof(struct de_cdata));
/* Tell the DEUNA about our PCB */
Index: src/sys/arch/vax/boot/boot/vaxstand.h
diff -u src/sys/arch/vax/boot/boot/vaxstand.h:1.9 src/sys/arch/vax/boot/boot/vaxstand.h:1.9.2.1
--- src/sys/arch/vax/boot/boot/vaxstand.h:1.9 Mon May 22 16:59:32 2017
+++ src/sys/arch/vax/boot/boot/vaxstand.h Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: vaxstand.h,v 1.9 2017/05/22 16:59:32 ragge Exp $ */
+/* $NetBSD: vaxstand.h,v 1.9.2.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -46,6 +46,7 @@ extern int csrbase, nexaddr;
struct netif_driver;
int net_devinit(struct open_file *f, struct netif_driver *drv, u_char *eaddr);
+int ubmap(int mapno, int vaddr, int size);
/* device calls */
int raopen(struct open_file *, int, int, int, int),
Index: src/sys/arch/vax/boot/boot/if_qe.c
diff -u src/sys/arch/vax/boot/boot/if_qe.c:1.9 src/sys/arch/vax/boot/boot/if_qe.c:1.9.56.1
--- src/sys/arch/vax/boot/boot/if_qe.c:1.9 Mon Oct 26 19:16:58 2009
+++ src/sys/arch/vax/boot/boot/if_qe.c Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_qe.c,v 1.9 2009/10/26 19:16:58 cegger Exp $ */
+/* $NetBSD: if_qe.c,v 1.9.56.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 1998 Roar Thron�s. All rights reserved.
@@ -69,8 +69,8 @@ static struct qe_softc {
char qein[2048], qeout[2048];/* Packet buffers */
} qe_softc;
-static struct qe_softc *sc = &qe_softc;
-static int addr;
+static struct qe_softc *sc = &qe_softc, *psc;
+static int addr, ubaddr;
#define QE_WCSR(csr, val) \
(*((volatile u_short *)(addr + (csr))) = (val))
@@ -111,6 +111,9 @@ qe_init(u_char *eaddr)
QE_WCSR(QE_CSR_CSR, QE_RESET);
QE_WCSR(QE_CSR_CSR, QE_RCSR(QE_CSR_CSR) & ~QE_RESET);
+ ubaddr = ubmap(0, (int)sc, sizeof(struct qe_softc));
+ psc = (struct qe_softc *)ubaddr;
+
for (i = 0; i < 6; i++) {
sc->setup_pkt[i][1] = QE_RCSR(i * 2);
sc->setup_pkt[i+8][1] = QE_RCSR(i * 2);
@@ -125,13 +128,13 @@ qe_init(u_char *eaddr)
memset((void *)sc->rring, 0, sizeof(struct qe_ring));
sc->rring->qe_buf_len = -64;
- sc->rring->qe_addr_lo = (short)((int)sc->setup_pkt);
- sc->rring->qe_addr_hi = (short)((int)sc->setup_pkt >> 16);
+ sc->rring->qe_addr_lo = LOWORD(psc->setup_pkt);
+ sc->rring->qe_addr_hi = HIWORD(psc->setup_pkt);
memset((void *)sc->tring, 0, sizeof(struct qe_ring));
sc->tring->qe_buf_len = -64;
- sc->tring->qe_addr_lo = (short)((int)sc->setup_pkt);
- sc->tring->qe_addr_hi = (short)((int)sc->setup_pkt >> 16);
+ sc->tring->qe_addr_lo = LOWORD(psc->setup_pkt);
+ sc->tring->qe_addr_hi = HIWORD(psc->setup_pkt);
sc->rring[0].qe_flag = sc->rring[0].qe_status1 = QE_NOTYET;
sc->rring->qe_addr_hi |= QE_VALID;
@@ -141,10 +144,10 @@ qe_init(u_char *eaddr)
QE_WCSR(QE_CSR_CSR, QE_XMIT_INT | QE_RCV_INT);
- QE_WCSR(QE_CSR_RCLL, LOWORD(sc->rring));
- QE_WCSR(QE_CSR_RCLH, HIWORD(sc->rring));
- QE_WCSR(QE_CSR_XMTL, LOWORD(sc->tring));
- QE_WCSR(QE_CSR_XMTH, HIWORD(sc->tring));
+ QE_WCSR(QE_CSR_RCLL, LOWORD(psc->rring));
+ QE_WCSR(QE_CSR_RCLH, HIWORD(psc->rring));
+ QE_WCSR(QE_CSR_XMTL, LOWORD(psc->tring));
+ QE_WCSR(QE_CSR_XMTH, HIWORD(psc->tring));
while ((QE_RCSR(QE_CSR_CSR) & QE_INTS) != QE_INTS)
;
@@ -152,31 +155,31 @@ qe_init(u_char *eaddr)
QE_WCSR(QE_CSR_CSR, QE_RCSR(QE_CSR_CSR) & ~(QE_INT_ENABLE|QE_ELOOP));
QE_WCSR(QE_CSR_CSR, QE_RCSR(QE_CSR_CSR) | QE_ILOOP);
- sc->rring[0].qe_addr_lo = (short)((int)sc->qein & 0xffff);
- sc->rring[0].qe_addr_hi = (short)((int)sc->qein >> 16);
- sc->rring[0].qe_buf_len=-MAXPACKETSIZE/2;
+ sc->rring[0].qe_addr_lo = LOWORD(psc->qein);
+ sc->rring[0].qe_addr_hi = HIWORD(psc->qein);
+ sc->rring[0].qe_buf_len = -MAXPACKETSIZE/2;
sc->rring[0].qe_addr_hi |= QE_VALID;
- sc->rring[0].qe_flag=sc->rring[0].qe_status1=QE_NOTYET;
- sc->rring[0].qe_status2=1;
+ sc->rring[0].qe_flag = sc->rring[0].qe_status1 = QE_NOTYET;
+ sc->rring[0].qe_status2 = 1;
sc->rring[1].qe_addr_lo = 0;
sc->rring[1].qe_addr_hi = 0;
sc->rring[1].qe_flag=sc->rring[1].qe_status1=QE_NOTYET;
sc->rring[1].qe_status2=1;
- sc->tring[0].qe_addr_lo = (short)((int)sc->qeout & 0xffff);
- sc->tring[0].qe_addr_hi = (short)((int)sc->qeout >> 16);
- sc->tring[0].qe_buf_len=0;
- sc->tring[0].qe_flag=sc->tring[0].qe_status1=QE_NOTYET;
+ sc->tring[0].qe_addr_lo = LOWORD(psc->qeout);
+ sc->tring[0].qe_addr_hi = HIWORD(psc->qeout);
+ sc->tring[0].qe_buf_len = 0;
+ sc->tring[0].qe_flag = sc->tring[0].qe_status1 = QE_NOTYET;
sc->tring[0].qe_addr_hi |= QE_EOMSG|QE_VALID;
- sc->tring[1].qe_flag=sc->tring[1].qe_status1=QE_NOTYET;
+ sc->tring[1].qe_flag = sc->tring[1].qe_status1 = QE_NOTYET;
sc->tring[1].qe_addr_lo = 0;
sc->tring[1].qe_addr_hi = 0;
QE_WCSR(QE_CSR_CSR, QE_RCSR(QE_CSR_CSR) | QE_RCV_ENABLE);
- QE_WCSR(QE_CSR_RCLL, LOWORD(sc->rring));
- QE_WCSR(QE_CSR_RCLH, HIWORD(sc->rring));
+ QE_WCSR(QE_CSR_RCLL, LOWORD(psc->rring));
+ QE_WCSR(QE_CSR_RCLH, HIWORD(psc->rring));
}
int
@@ -206,12 +209,12 @@ retry:
end:
sc->rring[0].qe_status2 = sc->rring[1].qe_status2 = 1;
- sc->rring[0].qe_flag=sc->rring[0].qe_status1=QE_NOTYET;
- sc->rring[1].qe_flag=sc->rring[1].qe_status1=QE_NOTYET;
+ sc->rring[0].qe_flag = sc->rring[0].qe_status1 = QE_NOTYET;
+ sc->rring[1].qe_flag = sc->rring[1].qe_status1 = QE_NOTYET;
QE_WCSR(QE_CSR_CSR, QE_RCSR(QE_CSR_CSR) | QE_RCV_ENABLE);
- QE_WCSR(QE_CSR_RCLL, LOWORD(sc->rring));
- QE_WCSR(QE_CSR_RCLH, HIWORD(sc->rring));
+ QE_WCSR(QE_CSR_RCLL, LOWORD(psc->rring));
+ QE_WCSR(QE_CSR_RCLH, HIWORD(psc->rring));
return len;
fail: len = -1;
@@ -223,12 +226,12 @@ qe_put(struct iodesc *desc, void *pkt, s
int j;
memcpy((char *)sc->qeout, pkt, len);
- sc->tring[0].qe_buf_len=-len/2;
- sc->tring[0].qe_flag=sc->tring[0].qe_status1=QE_NOTYET;
- sc->tring[1].qe_flag=sc->tring[1].qe_status1=QE_NOTYET;
+ sc->tring[0].qe_buf_len = -len/2;
+ sc->tring[0].qe_flag = sc->tring[0].qe_status1 = QE_NOTYET;
+ sc->tring[1].qe_flag = sc->tring[1].qe_status1 = QE_NOTYET;
- QE_WCSR(QE_CSR_XMTL, LOWORD(sc->tring));
- QE_WCSR(QE_CSR_XMTH, HIWORD(sc->tring));
+ QE_WCSR(QE_CSR_XMTL, LOWORD(psc->tring));
+ QE_WCSR(QE_CSR_XMTH, HIWORD(psc->tring));
for(j = 0; (j < 0x10000) && ((QE_RCSR(QE_CSR_CSR) & QE_XMIT_INT) == 0); j++)
;
Index: src/sys/arch/vax/boot/boot/ra.c
diff -u src/sys/arch/vax/boot/boot/ra.c:1.20 src/sys/arch/vax/boot/boot/ra.c:1.20.2.1
--- src/sys/arch/vax/boot/boot/ra.c:1.20 Mon May 22 16:59:32 2017
+++ src/sys/arch/vax/boot/boot/ra.c Sat Mar 24 18:06:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ra.c,v 1.20 2017/05/22 16:59:32 ragge Exp $ */
+/* $NetBSD: ra.c,v 1.20.2.1 2018/03/24 18:06:51 snj Exp $ */
/*
* Copyright (c) 1995 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -65,9 +65,8 @@ static volatile struct uda {
static struct disklabel ralabel;
static char io_buf[DEV_BSIZE];
-static int dpart, dunit, remap, is_tmscp, curblock;
+static int dpart, dunit, is_tmscp, curblock;
static volatile u_short *ra_ip, *ra_sa, *ra_sw;
-static volatile u_int *mapregs;
int
raopen(struct open_file *f, int adapt, int ctlr, int unit, int part)
@@ -91,7 +90,6 @@ raopen(struct open_file *f, int adapt, i
dpart = part;
if (ctlr < 0)
ctlr = 0;
- remap = csrbase && nexaddr;
curblock = 0;
if (csrbase) { /* On a uda-alike adapter */
if (askname == 0) {
@@ -102,14 +100,9 @@ raopen(struct open_file *f, int adapt, i
csrbase += (ctlr ? 000334 : 012150);
ra_ip = (u_short *)csrbase;
ra_sa = ra_sw = (u_short *)csrbase + 1;
- if (nexaddr) { /* have map registers */
- mapregs = (u_int *)nexaddr + 512;
- mapregs[494] = PG_V | (((u_int)&uda) >> 9);
- mapregs[495] = mapregs[494] + 1;
- ubauda = (struct uda *)((char*)0x3dc00 +
- (((u_int)(&uda))&0x1ff));
- } else
- ubauda = &uda;
+
+ ubauda = (struct uda *)ubmap(494,
+ (int)&uda, sizeof(struct uda));
johan = (((u_int)ubauda) & 0xffff) + 8;
johan2 = (((u_int)ubauda) >> 16) & 077;
*ra_ip = 0; /* Start init */
@@ -258,21 +251,13 @@ int
rastrategy(void *f, int func, daddr_t dblk,
size_t size, void *buf, size_t *rsize)
{
- u_int pfnum, mapnr, nsize;
#ifdef DEV_DEBUG
- printf("rastrategy: buf %p remap %d is_tmscp %d\n",
- buf, remap, is_tmscp);
+ printf("rastrategy: buf %p is_tmscp %d\n",
+ buf, is_tmscp);
#endif
- if (remap) {
- pfnum = (u_int)buf >> VAX_PGSHIFT;
- for(mapnr = 0, nsize = size; (nsize + VAX_NBPG) > 0;
- nsize -= VAX_NBPG)
- mapregs[mapnr++] = PG_V | pfnum++;
- uda.uda_cmd.mscp_seq.seq_buffer = ((u_int)buf) & 0x1ff;
- } else
- uda.uda_cmd.mscp_seq.seq_buffer = ((u_int)buf);
+ uda.uda_cmd.mscp_seq.seq_buffer = ubmap(0, (int)buf, size);
if (is_tmscp) {
int i;