* Copyright (c) 1992 The Regents of the University of California.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Lawrence Berkeley Laboratories.
* %sccs.include.redist.c%
* @(#)bwtwo.c 7.2 (Berkeley) %G%
* from: $Header: bwtwo.c,v 1.13 92/06/17 06:59:29 torek Exp $
* black&white display (bwtwo) driver.
* Does not handle interrupts, even though they can occur.
#include "machine/autoconf.h"
#include "machine/pmap.h"
#include "machine/fbvar.h"
/* per-display variables */
struct device sc_dev
; /* base device */
struct sbusdev sc_sd
; /* sbus device */
struct fbdevice sc_fb
; /* frame buffer device */
volatile struct bwtworeg
*sc_reg
;/* control registers */
caddr_t sc_phys
; /* display RAM (phys addr) */
/* autoconfiguration driver */
static void bwtwoattach(struct device
*, struct device
*, void *);
struct cfdriver bwtwocd
=
{ NULL
, "bwtwo", matchbyname
, bwtwoattach
,
DV_DULL
, sizeof(struct bwtwo_softc
) };
/* XXX we do not handle frame buffer interrupts (do not know how) */
/* frame buffer generic driver */
static void bwtwounblank(struct device
*);
static struct fbdriver bwtwofbdriver
= { bwtwounblank
};
extern struct tty
*fbconstty
;
static int bwtwo_cnputc();
static struct bwtwo_softc
*bwcons
;
#define BWTWO_MAJOR 27 /* XXX */
* Attach a display. We need to notice if it is the console, too.
bwtwoattach(parent
, self
, args
)
struct device
*parent
, *self
;
register struct bwtwo_softc
*sc
= (struct bwtwo_softc
*)self
;
register struct sbus_attach_args
*sa
= args
;
register int node
= sa
->sa_ra
.ra_node
, ramsize
;
register struct bwtwo_all
*p
;
sc
->sc_fb
.fb_major
= BWTWO_MAJOR
; /* XXX to be removed */
sc
->sc_fb
.fb_driver
= &bwtwofbdriver
;
sc
->sc_fb
.fb_device
= &sc
->sc_dev
;
* The defaults below match my screen, but are not guaranteed
* to be correct as defaults go...
sc
->sc_fb
.fb_type
.fb_type
= FBTYPE_SUN2BW
;
sc
->sc_fb
.fb_type
.fb_width
= getpropint(node
, "width", 1152);
sc
->sc_fb
.fb_type
.fb_height
= getpropint(node
, "height", 900);
sc
->sc_fb
.fb_linebytes
= getpropint(node
, "linebytes", 144);
ramsize
= sc
->sc_fb
.fb_type
.fb_height
* sc
->sc_fb
.fb_linebytes
;
sc
->sc_fb
.fb_type
.fb_depth
= 1;
sc
->sc_fb
.fb_type
.fb_cmsize
= 0;
sc
->sc_fb
.fb_type
.fb_size
= ramsize
;
printf(": %s, %d x %d", getpropstring(node
, "model"),
sc
->sc_fb
.fb_type
.fb_width
, sc
->sc_fb
.fb_type
.fb_height
);
* When the ROM has mapped in a bwtwo display, the address
* maps only the video RAM, so in any case we have to map the
* registers ourselves. We only need the video RAM if we are
* going to print characters via rconsole.
isconsole
= node
== fbnode
&& fbconstty
!= NULL
;
p
= (struct bwtwo_all
*)sa
->sa_ra
.ra_paddr
;
if ((sc
->sc_fb
.fb_pixels
= sa
->sa_ra
.ra_vaddr
) == NULL
&& isconsole
) {
/* this probably cannot happen, but what the heck */
sc
->sc_fb
.fb_pixels
= mapiodev(p
->ba_ram
, ramsize
);
sc
->sc_reg
= (volatile struct bwtworeg
*)
mapiodev((caddr_t
)&p
->ba_reg
, sizeof(p
->ba_reg
));
/* Insure video is enabled */
sc
->sc_reg
->bw_ctl
|= CTL_VE
;
sbus_establish(&sc
->sc_sd
, &sc
->sc_dev
);
bwtwoopen(dev
, flags
, mode
, p
)
if (unit
>= bwtwocd
.cd_ndevs
|| bwtwocd
.cd_devs
[unit
] == NULL
)
bwtwoclose(dev
, flags
, mode
, p
)
bwtwoioctl(dev
, cmd
, data
, flags
, p
)
struct bwtwo_softc
*sc
= bwtwocd
.cd_devs
[minor(dev
)];
*(struct fbtype
*)data
= sc
->sc_fb
.fb_type
;
*(int *)data
= (sc
->sc_reg
->bw_ctl
& CTL_VE
) != 0;
sc
->sc_reg
->bw_ctl
|= CTL_VE
;
sc
->sc_reg
->bw_ctl
&= ~CTL_VE
;
struct bwtwo_softc
*sc
= (struct bwtwo_softc
*)dev
;
sc
->sc_reg
->bw_ctl
|= CTL_VE
;
* Return the address that would map the given device at the given
* offset, allowing for the given protection, or return -1 for error.
register struct bwtwo_softc
*sc
= bwtwocd
.cd_devs
[minor(dev
)];
if ((unsigned)off
>= sc
->sc_fb
.fb_type
.fb_size
)
* I turned on PMAP_NC here to disable the cache as I was
* getting horribly broken behaviour with it on.
return ((int)sc
->sc_phys
+ off
+ PMAP_OBIO
+ PMAP_NC
);