summaryrefslogtreecommitdiff
path: root/sys/arch/vax/vsa
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2006-08-27 16:55:42 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2006-08-27 16:55:42 +0000
commit8e348635a9f1cf593f640d0a9b7be6dcdec07dc6 (patch)
treede6a6739ddb2ef0e2d5812fa94d9459058c140e8 /sys/arch/vax/vsa
parent5078cd3731f61a8f4967ae7620d9b07f41045098 (diff)
Work-in-progress VXT2000 support (commented out in GENERIC so far). Glass
console works on color model, serial console works, ethernet attaches but does not work correctly yet.
Diffstat (limited to 'sys/arch/vax/vsa')
-rw-r--r--sys/arch/vax/vsa/lcspx.c73
1 files changed, 67 insertions, 6 deletions
diff --git a/sys/arch/vax/vsa/lcspx.c b/sys/arch/vax/vsa/lcspx.c
index fd6b07ec1b1..bcf7c62dea2 100644
--- a/sys/arch/vax/vsa/lcspx.c
+++ b/sys/arch/vax/vsa/lcspx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lcspx.c,v 1.9 2006/08/26 17:39:53 miod Exp $ */
+/* $OpenBSD: lcspx.c,v 1.10 2006/08/27 16:55:41 miod Exp $ */
/*
* Copyright (c) 2006 Miodrag Vallat.
*
@@ -53,6 +53,7 @@
#include <sys/conf.h>
#include <sys/kernel.h>
+#include <machine/nexus.h>
#include <machine/vsbus.h>
#include <machine/scb.h>
#include <machine/sid.h>
@@ -79,8 +80,9 @@
#define LCSPX_HEIGHT 1024
#define LCSPX_FBSIZE (LCSPX_WIDTH * LCSPX_HEIGHT)
-int lcspx_match(struct device *, void *, void *);
void lcspx_attach(struct device *, struct device *, void *);
+int lcspx_vsbus_match(struct device *, void *, void *);
+int lcspx_vxtbus_match(struct device *, void *, void *);
struct lcspx_screen {
struct rasops_info ss_ri;
@@ -104,8 +106,12 @@ struct lcspx_softc {
int sc_nscreens;
};
-struct cfattach lcspx_ca = {
- sizeof(struct lcspx_softc), lcspx_match, lcspx_attach,
+struct cfattach lcspx_vsbus_ca = {
+ sizeof(struct lcspx_softc), lcspx_vsbus_match, lcspx_attach,
+};
+
+struct cfattach lcspx_vxtbus_ca = {
+ sizeof(struct lcspx_softc), lcspx_vxtbus_match, lcspx_attach,
};
struct cfdriver lcspx_cd = {
@@ -154,7 +160,7 @@ void lcspx_resetcmap(struct lcspx_screen *);
int lcspx_setup_screen(struct lcspx_screen *);
int
-lcspx_match(struct device *parent, void *vcf, void *aux)
+lcspx_vsbus_match(struct device *parent, void *vcf, void *aux)
{
struct vsbus_softc *sc = (void *)parent;
struct vsbus_attach_args *va = aux;
@@ -178,6 +184,34 @@ lcspx_match(struct device *parent, void *vcf, void *aux)
return (20);
}
+int
+lcspx_vxtbus_match(struct device *parent, void *vcf, void *aux)
+{
+ struct bp_conf *bp = aux;
+ int missing;
+ volatile u_int8_t *ch;
+
+ if (strcmp(bp->type, lcspx_cd.cd_name) != 0)
+ return (0);
+
+ /*
+ * Check for video memory at SPX address.
+ */
+ missing = 0;
+ ch = (volatile u_int8_t *)vax_map_physmem(LCSPX_FB_ADDR, 1);
+ *ch = 0x01;
+ if ((*ch & 0x01) == 0)
+ missing = 1;
+ else {
+ *ch = 0x00;
+ if ((*ch & 0x01) != 0)
+ missing = 1;
+ }
+ vax_unmap_physmem((vaddr_t)ch, 1);
+
+ return (missing ? 0 : 1);
+}
+
void
lcspx_attach(struct device *parent, struct device *self, void *aux)
{
@@ -187,7 +221,13 @@ lcspx_attach(struct device *parent, struct device *self, void *aux)
int i, console;
extern struct consdev wsdisplay_cons;
- console = (vax_confdata & 8) == 0 && cn_tab == &wsdisplay_cons;
+ if (cn_tab == &wsdisplay_cons) {
+ if (vax_boardtype == VAX_BTYP_49)
+ console = (vax_confdata & 8) == 0;
+ else /* VXT2000 */
+ console = (vax_confdata & 2) != 0;
+ } else
+ console = 0;
if (console) {
ss = &lcspx_consscr;
sc->sc_nscreens = 1;
@@ -498,6 +538,9 @@ void lcspxcninit(void);
int
lcspxcnprobe()
{
+ extern vaddr_t virtual_avail;
+ volatile u_int8_t *ch;
+
switch (vax_boardtype) {
case VAX_BTYP_49:
if ((vax_confdata & 8) != 0)
@@ -508,6 +551,24 @@ lcspxcnprobe()
return (1);
+ case VAX_BTYP_VXT:
+ if ((vax_confdata & 2) == 0)
+ break; /* doesn't use graphics console */
+
+ /*
+ * Check for video memory at SPX address.
+ */
+ ioaccess(virtual_avail, LCSPX_FB_ADDR, 1);
+ ch = (volatile u_int8_t *)virtual_avail;
+ *ch = 0x01;
+ if ((*ch & 0x01) == 0)
+ break;
+ *ch = 0x00;
+ if ((*ch & 0x01) != 0)
+ break;
+
+ return (1);
+
default:
break;
}