* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)autoconf.c 7.12 (Berkeley) %G%
#include "../vax/nexus.h"
#include "../vaxuba/ubareg.h"
#include "../vaxmba/mbareg.h"
#include "../vaxbi/bireg.h"
#if VAX8600 || VAX8200 || VAX780
* These are used on CPU's that do configuration.
struct uba_regs
*ubaddrspace
[MAXNUBA
];
caddr_t uioaddrspace
[MAXNUBA
];
struct mba_regs
*mbaddrspace
[MAXNMBA
];
#define UTR(i) ((struct uba_regs *)(NEX750+(i)))
#define UMA(i) ((caddr_t)UMEM750(i)+UBAIOADDR)
#define MTR(i) ((struct mba_regs *)(NEX750+(i)))
struct uba_regs
*ubaddr750
[] = { UTR(8), UTR(9) };
caddr_t uioaddr750
[] = { UMA(0), UMA(1) };
struct mba_regs
*mbaddr750
[] = { MTR(4), MTR(5), MTR(6), MTR(7) };
#define UTR(i) ((struct uba_regs *)(NEX730+(i)))
#define UMA ((caddr_t)UMEM730+UBAIOADDR)
struct uba_regs
*ubaddr730
[] = { UTR(3) };
caddr_t uioaddr730
[] = { UMA
};
* The map registers start at 20088000 on the ka630, so
* subtract a 2k offset to make things work.
* This could stand serious cleanup.
struct uba_regs
*ubaddr630
[] =
{ (struct uba_regs
*)((caddr_t
)QBAMAP630
- 0x800) };
caddr_t uioaddr630
[] = { (caddr_t
)QIOPAGE630
};
int (*v_getc
)(), (*v_putc
)();
* Virtual console configuration tables.
extern qv_init(),qd_init();
int (*vcons_init
[])() = {
if (boothowto
& RB_KDB
) /* XXX */
cpusid
.cpusid
= mfpr(SID
);
cpu
= cpusid
.cpuany
.cp_type
;
printf("cpu: 8600\nsbia 0:\n");
probenexi(NEXA8600
, (caddr_t
)UMEMA8600(0)+UBAIOADDR
, 0);
probenexi(NEXB8600
, (caddr_t
)UMEMB8600(0)+UBAIOADDR
, 1);
probenexi(NEX780
, (caddr_t
)UMEM780(0)+UBAIOADDR
, 0);
register struct bi_node
*bi
;
for (i
= 0, bi
= BI_BASE(0); i
< NNODEBI
; i
++, bi
++) {
if (badaddr((caddr_t
)bi
, sizeof (long)))
bi
->biic
.bi_ber
= ~(BIBER_MBZ
|BIBER_NMR
|BIBER_UPEN
);
switch (bi
->biic
.bi_dtype
) {
if (nuba
>= MAXNUBA
) /* sorry */
ubaddrspace
[nuba
] = (struct uba_regs
*)bi
;
uioaddrspace
[nuba
] = (caddr_t
)UMEM8200(i
) +
((struct dwbua_regs
*)bi
)->bua_csr
|=
kdbaddr
[nkdb
++] = (caddr_t
)bi
;
printf("unknown type %x\n",
printf("cpu: 750 -- assuming standard config\n");
nmba
= sizeof (mbaddr750
) / sizeof (mbaddr750
[0]);
printf("cpu: 730 -- assuming standard config\n");
printf("cpu: uVAX II\n");
printf("cpu: uVAX 3000\n");
* Forward into the past...
for (i = 0; i < nmba; i++)
if (!badaddr(mbaddr[i], sizeof(long)))
mbaddr[i]->mba_cr = MBCR_INIT;
*((char *)QIOPAGE630
+ QIPCR
) = Q_LMEAE
;
for(i
= 0; vcons_init
[i
] && !(*vcons_init
[i
])(); i
++)
/* give unibus devices a chance to recover... */
probenexi(nxp
, umembase
, sbia
)
register struct nexus
*nxp
;
for (i
= 0; i
< 16; i
++, nxp
++) {
if (badaddr(nxp
, sizeof(long)))
if (nexcsr
.nex_csr
& NEX_APD
)
printf("sbia %d:\n", sbia
);
switch (nexcsr
.nex_type
) {
printf("nexid %2x\n", nexcsr
.nex_type
);
printf("unsupported mba\n");
mbaddrspace
[nmba
] = (struct mba_regs
*)nxp
;
printf("unsupported uba\n");
printf("uba%d umem%d", nuba
,
ubaddrspace
[nuba
] = (struct uba_regs
*)nxp
;
uioaddrspace
[nuba
] = umembase
+
(nexcsr
.nex_csr
& 3) * (512*NBPG
);
printf(" (%x)\n", uioaddrspace
[nuba
]);
((struct uba_regs
*)nxp
)->uba_cr
= UBACR_ADINIT
;
#endif /* VAX780 || VAX8600 */