summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/sbus/bwtwo.c119
-rw-r--r--sys/dev/sbus/cgsix.c134
-rw-r--r--sys/dev/sbus/cgsixreg.h7
-rw-r--r--sys/dev/sbus/cgthree.c118
4 files changed, 106 insertions, 272 deletions
diff --git a/sys/dev/sbus/bwtwo.c b/sys/dev/sbus/bwtwo.c
index d19b2b09bcd..cd9fee69d8d 100644
--- a/sys/dev/sbus/bwtwo.c
+++ b/sys/dev/sbus/bwtwo.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bwtwo.c,v 1.8 2003/06/02 18:32:41 jason Exp $ */
+/* $OpenBSD: bwtwo.c,v 1.9 2003/06/18 17:35:30 miod Exp $ */
/*
* Copyright (c) 2002 Jason L. Wright (jason@thought.net)
@@ -49,38 +49,19 @@
#include <dev/wscons/wsdisplayvar.h>
#include <dev/wscons/wscons_raster.h>
#include <dev/rasops/rasops.h>
+#include <machine/fbvar.h>
#define BWTWO_CTRL_OFFSET 0x400000
#define BWTWO_CTRL_SIZE (sizeof(u_int32_t) * 8)
#define BWTWO_VID_OFFSET 0x800000
#define BWTWO_VID_SIZE (1024 * 1024)
-union bt_cmap {
- u_int8_t cm_map[256][3]; /* 256 r/b/g entries */
- u_int32_t cm_chip[256 * 3 / 4]; /* the way the chip is loaded */
-};
-
-#define BT_ADDR 0x00 /* map address register */
-#define BT_CMAP 0x04 /* colormap data register */
-#define BT_CTRL 0x08 /* control register */
-#define BT_OMAP 0x0c /* overlay (cursor) map register */
#define FBC_CTRL 0x10 /* control */
#define FBC_STAT 0x11 /* status */
#define FBC_START 0x12 /* cursor start */
#define FBC_END 0x13 /* cursor end */
#define FBC_VCTRL 0x14 /* 12 bytes of timing goo */
-#define BT_WRITE(sc, reg, val) \
- bus_space_write_4((sc)->sc_bustag, (sc)->sc_ctrl_regs, (reg), (val))
-#define BT_READ(sc, reg) \
- bus_space_read_4((sc)->sc_bustag, (sc)->sc_ctrl_regs, (reg))
-#define BT_BARRIER(sc,reg,flags) \
- bus_space_barrier((sc)->sc_bustag, (sc)->sc_ctrl_regs, (reg), \
- sizeof(u_int32_t), (flags))
-
-#define BT_D4M3(x) ((((x) >> 2) << 1) + ((x) >> 2)) /* (x / 4) * 3 */
-#define BT_D4M4(x) ((x) & ~3) /* (x / 4) * 4 */
-
#define FBC_CTRL_IENAB 0x80 /* interrupt enable */
#define FBC_CTRL_VENAB 0x40 /* video enable */
#define FBC_CTRL_TIME 0x20 /* timing enable */
@@ -115,25 +96,17 @@ union bt_cmap {
bus_space_write_1((sc)->sc_bustag, (sc)->sc_ctrl_regs, (reg), (val))
struct bwtwo_softc {
- struct device sc_dev;
+ struct sunfb sc_sunfb;
struct sbusdev sc_sd;
bus_space_tag_t sc_bustag;
bus_addr_t sc_paddr;
bus_space_handle_t sc_ctrl_regs;
bus_space_handle_t sc_vid_regs;
int sc_nscreens;
- int sc_width, sc_height, sc_depth, sc_linebytes;
- union bt_cmap sc_cmap;
- struct rasops_info sc_rasops;
- int *sc_crowp, *sc_ccolp;
};
struct wsscreen_descr bwtwo_stdscreen = {
"std",
- 0, 0, /* will be filled in -- XXX shouldn't, it's global. */
- 0,
- 0, 0,
- WSSCREEN_UNDERLINE | WSSCREEN_REVERSE
};
const struct wsscreen_descr *bwtwo_scrlist[] = {
@@ -155,7 +128,6 @@ paddr_t bwtwo_mmap(void *, off_t, int);
int bwtwo_is_console(int);
void bwtwo_burner(void *, u_int, u_int);
void bwtwo_updatecursor(struct rasops_info *);
-static int a2int(char *, int);
struct wsdisplay_accessops bwtwo_accessops = {
bwtwo_ioctl,
@@ -200,15 +172,11 @@ bwtwoattach(parent, self, aux)
struct sbus_attach_args *sa = aux;
struct wsemuldisplaydev_attach_args waa;
int console;
- long defattr;
sc->sc_bustag = sa->sa_bustag;
sc->sc_paddr = sbus_bus_addr(sa->sa_bustag, sa->sa_slot, sa->sa_offset);
- sc->sc_depth = getpropint(sa->sa_node, "depth", 1);
- sc->sc_linebytes = getpropint(sa->sa_node, "linebytes", 1152);
- sc->sc_height = getpropint(sa->sa_node, "height", 900);
- sc->sc_width = getpropint(sa->sa_node, "width", 1152);
+ fb_setsize(&sc->sc_sunfb, 1, 1152, 900, sa->sa_node, 0);
if (sa->sa_nreg != 1) {
printf(": expected %d registers, got %d\n", 1, sa->sa_nreg);
@@ -228,7 +196,7 @@ bwtwoattach(parent, self, aux)
if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[0].sbr_slot,
sa->sa_reg[0].sbr_offset + BWTWO_VID_OFFSET,
- sc->sc_linebytes * sc->sc_height, BUS_SPACE_MAP_LINEAR,
+ sc->sc_sunfb.sf_fbsize, BUS_SPACE_MAP_LINEAR,
0, &sc->sc_vid_regs) != 0) {
printf(": cannot map vid registers\n");
goto fail_vid;
@@ -236,42 +204,26 @@ bwtwoattach(parent, self, aux)
console = bwtwo_is_console(sa->sa_node);
- sbus_establish(&sc->sc_sd, &sc->sc_dev);
+ sbus_establish(&sc->sc_sd, &sc->sc_sunfb.sf_dev);
bwtwo_burner(sc, 1, 0);
- sc->sc_rasops.ri_depth = sc->sc_depth;
- sc->sc_rasops.ri_stride = sc->sc_linebytes;
- sc->sc_rasops.ri_flg = RI_CENTER |
- (console ? 0 : RI_CLEAR);
- sc->sc_rasops.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
+ printf("\n");
+
+ sc->sc_sunfb.sf_ro.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
sc->sc_vid_regs);
- sc->sc_rasops.ri_width = sc->sc_width;
- sc->sc_rasops.ri_height = sc->sc_height;
- sc->sc_rasops.ri_hw = sc;
+ sc->sc_sunfb.sf_ro.ri_hw = sc;
+ fbwscons_init(&sc->sc_sunfb, console ? 0 : RI_CLEAR);
- rasops_init(&sc->sc_rasops,
- a2int(getpropstring(optionsnode, "screen-#rows"), 34),
- a2int(getpropstring(optionsnode, "screen-#columns"), 80));
-
- bwtwo_stdscreen.nrows = sc->sc_rasops.ri_rows;
- bwtwo_stdscreen.ncols = sc->sc_rasops.ri_cols;
- bwtwo_stdscreen.textops = &sc->sc_rasops.ri_ops;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops, 0, 0, 0, &defattr);
-
- printf("\n");
+ bwtwo_stdscreen.capabilities = sc->sc_sunfb.sf_ro.ri_caps;
+ bwtwo_stdscreen.nrows = sc->sc_sunfb.sf_ro.ri_rows;
+ bwtwo_stdscreen.ncols = sc->sc_sunfb.sf_ro.ri_cols;
+ bwtwo_stdscreen.textops = &sc->sc_sunfb.sf_ro.ri_ops;
if (console) {
- if (romgetcursoraddr(&sc->sc_crowp, &sc->sc_ccolp))
- sc->sc_ccolp = sc->sc_crowp = NULL;
- if (sc->sc_ccolp != NULL)
- sc->sc_rasops.ri_ccol = *sc->sc_ccolp;
- if (sc->sc_crowp != NULL)
- sc->sc_rasops.ri_crow = *sc->sc_crowp;
- sc->sc_rasops.ri_updatecursor = bwtwo_updatecursor;
-
- wsdisplay_cnattach(&bwtwo_stdscreen, &sc->sc_rasops,
- sc->sc_rasops.ri_ccol, sc->sc_rasops.ri_crow, defattr);
+ sc->sc_sunfb.sf_ro.ri_updatecursor = bwtwo_updatecursor;
+ fbwscons_console_init(&sc->sc_sunfb, &bwtwo_stdscreen, -1,
+ bwtwo_burner);
}
waa.console = console;
@@ -306,13 +258,13 @@ bwtwo_ioctl(v, cmd, data, flags, p)
break;
case WSDISPLAYIO_GINFO:
wdf = (void *)data;
- wdf->height = sc->sc_height;
- wdf->width = sc->sc_width;
- wdf->depth = sc->sc_depth;
+ wdf->height = sc->sc_sunfb.sf_height;
+ wdf->width = sc->sc_sunfb.sf_width;
+ wdf->depth = sc->sc_sunfb.sf_depth;
wdf->cmsize = 0;
break;
case WSDISPLAYIO_LINEBYTES:
- *(u_int *)data = sc->sc_linebytes;
+ *(u_int *)data = sc->sc_sunfb.sf_linebytes;
break;
case WSDISPLAYIO_GETCMAP:
@@ -346,10 +298,11 @@ bwtwo_alloc_screen(v, type, cookiep, curxp, curyp, attrp)
if (sc->sc_nscreens > 0)
return (ENOMEM);
- *cookiep = &sc->sc_rasops;
+ *cookiep = &sc->sc_sunfb.sf_ro;
*curyp = 0;
*curxp = 0;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops, 0, 0, 0, attrp);
+ sc->sc_sunfb.sf_ro.ri_ops.alloc_attr(&sc->sc_sunfb.sf_ro,
+ 0, 0, 0, attrp);
sc->sc_nscreens++;
return (0);
}
@@ -389,25 +342,13 @@ bwtwo_mmap(v, offset, prot)
if (offset & PGOFSET)
return (-1);
- if (offset >= 0 && offset < (sc->sc_linebytes * sc->sc_height))
+ if (offset >= 0 && offset < sc->sc_sunfb.sf_fbsize)
return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
BWTWO_VID_OFFSET + offset, prot, BUS_SPACE_MAP_LINEAR));
return (-1);
}
-static int
-a2int(char *cp, int deflt)
-{
- int i = 0;
-
- if (*cp == '\0')
- return (deflt);
- while (*cp != '\0')
- i = i * 10 + *cp++ - '0';
- return (i);
-}
-
int
bwtwo_is_console(node)
int node;
@@ -445,8 +386,8 @@ bwtwo_updatecursor(ri)
{
struct bwtwo_softc *sc = ri->ri_hw;
- if (sc->sc_crowp != NULL)
- *sc->sc_crowp = ri->ri_crow;
- if (sc->sc_ccolp != NULL)
- *sc->sc_ccolp = ri->ri_ccol;
+ if (sc->sc_sunfb.sf_crowp != NULL)
+ *sc->sc_sunfb.sf_crowp = ri->ri_crow;
+ if (sc->sc_sunfb.sf_ccolp != NULL)
+ *sc->sc_sunfb.sf_ccolp = ri->ri_ccol;
}
diff --git a/sys/dev/sbus/cgsix.c b/sys/dev/sbus/cgsix.c
index 418593b4ae2..d737489d7c2 100644
--- a/sys/dev/sbus/cgsix.c
+++ b/sys/dev/sbus/cgsix.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cgsix.c,v 1.41 2003/06/02 18:32:41 jason Exp $ */
+/* $OpenBSD: cgsix.c,v 1.42 2003/06/18 17:35:30 miod Exp $ */
/*
* Copyright (c) 2001 Jason L. Wright (jason@thought.net)
@@ -49,16 +49,12 @@
#include <dev/wscons/wsdisplayvar.h>
#include <dev/wscons/wscons_raster.h>
#include <dev/rasops/rasops.h>
+#include <machine/fbvar.h>
#include <dev/sbus/cgsixreg.h>
#include <dev/ic/bt458reg.h>
struct wsscreen_descr cgsix_stdscreen = {
"std",
- 0, 0, /* will be filled in -- XXX shouldn't, it's global. */
- 0,
- 0, 0,
- WSSCREEN_UNDERLINE | WSSCREEN_HILIT |
- WSSCREEN_REVERSE | WSSCREEN_WSCOLORS
};
const struct wsscreen_descr *cgsix_scrlist[] = {
@@ -82,13 +78,11 @@ int cg6_bt_getcmap(union bt_cmap *, struct wsdisplay_cmap *);
int cg6_bt_putcmap(union bt_cmap *, struct wsdisplay_cmap *);
void cgsix_loadcmap_immediate(struct cgsix_softc *, u_int, u_int);
void cgsix_loadcmap_deferred(struct cgsix_softc *, u_int, u_int);
-void cgsix_setcolor(struct cgsix_softc *, u_int,
- u_int8_t, u_int8_t, u_int8_t);
+void cgsix_setcolor(void *, u_int, u_int8_t, u_int8_t, u_int8_t);
void cgsix_reset(struct cgsix_softc *, u_int32_t);
void cgsix_hardreset(struct cgsix_softc *);
void cgsix_burner(void *, u_int, u_int);
int cgsix_intr(void *);
-static int a2int(char *, int);
void cgsix_ras_init(struct cgsix_softc *);
void cgsix_ras_copyrows(void *, int, int, int);
void cgsix_ras_copycols(void *, int, int, int, int);
@@ -142,7 +136,6 @@ cgsixattach(parent, self, aux)
struct sbus_attach_args *sa = aux;
struct wsemuldisplaydev_attach_args waa;
int console, i;
- long defattr;
u_int32_t fhc, rev;
sc->sc_bustag = sa->sa_bustag;
@@ -153,10 +146,7 @@ cgsixattach(parent, self, aux)
goto fail;
}
- sc->sc_depth = getpropint(sa->sa_node, "depth", 8);
- sc->sc_linebytes = getpropint(sa->sa_node, "linebytes", 1152);
- sc->sc_height = getpropint(sa->sa_node, "height", 900);
- sc->sc_width = getpropint(sa->sa_node, "width", 1152);
+ fb_setsize(&sc->sc_sunfb, 8, 1152, 900, sa->sa_node, 0);
/*
* Map just BT, FHC, FBC, THC, and video RAM.
@@ -184,7 +174,7 @@ cgsixattach(parent, self, aux)
if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[0].sbr_slot,
sa->sa_reg[0].sbr_offset + CGSIX_VID_OFFSET,
- sc->sc_linebytes * sc->sc_height, BUS_SPACE_MAP_LINEAR,
+ sc->sc_sunfb.sf_fbsize, BUS_SPACE_MAP_LINEAR,
0, &sc->sc_vid_regs) != 0) {
printf(": cannot map vid registers\n");
goto fail_vid;
@@ -232,20 +222,10 @@ cgsixattach(parent, self, aux)
sbus_establish(&sc->sc_sd, self);
- sc->sc_rasops.ri_depth = sc->sc_depth;
- sc->sc_rasops.ri_stride = sc->sc_linebytes;
- sc->sc_rasops.ri_flg = RI_CENTER |
- (console ? 0 : RI_CLEAR);
- sc->sc_rasops.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
+ sc->sc_sunfb.sf_ro.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
sc->sc_vid_regs);
- sc->sc_rasops.ri_width = sc->sc_width;
- sc->sc_rasops.ri_height = sc->sc_height;
- sc->sc_rasops.ri_hw = sc;
-
- rasops_init(&sc->sc_rasops,
- a2int(getpropstring(optionsnode, "screen-#rows"), 34),
- a2int(getpropstring(optionsnode, "screen-#columns"), 80));
- sc->sc_rasops.ri_hw = sc;
+ sc->sc_sunfb.sf_ro.ri_hw = sc;
+ fbwscons_init(&sc->sc_sunfb, console ? 0 : RI_CLEAR);
/*
* Old rev. cg6 cards do not like the current acceleration code.
@@ -254,48 +234,31 @@ cgsixattach(parent, self, aux)
* will be investigated later.
*/
if (rev < 5)
- sc->sc_dev.dv_cfdata->cf_flags |= CG6_CFFLAG_NOACCEL;
-
- if ((sc->sc_dev.dv_cfdata->cf_flags & CG6_CFFLAG_NOACCEL) == 0) {
- sc->sc_rasops.ri_ops.copyrows = cgsix_ras_copyrows;
- sc->sc_rasops.ri_ops.copycols = cgsix_ras_copycols;
- sc->sc_rasops.ri_ops.eraserows = cgsix_ras_eraserows;
- sc->sc_rasops.ri_ops.erasecols = cgsix_ras_erasecols;
- sc->sc_rasops.ri_do_cursor = cgsix_ras_do_cursor;
+ sc->sc_sunfb.sf_dev.dv_cfdata->cf_flags |= CG6_CFFLAG_NOACCEL;
+
+ if ((sc->sc_sunfb.sf_dev.dv_cfdata->cf_flags & CG6_CFFLAG_NOACCEL)
+ == 0) {
+ sc->sc_sunfb.sf_ro.ri_ops.copyrows = cgsix_ras_copyrows;
+ sc->sc_sunfb.sf_ro.ri_ops.copycols = cgsix_ras_copycols;
+ sc->sc_sunfb.sf_ro.ri_ops.eraserows = cgsix_ras_eraserows;
+ sc->sc_sunfb.sf_ro.ri_ops.erasecols = cgsix_ras_erasecols;
+ sc->sc_sunfb.sf_ro.ri_do_cursor = cgsix_ras_do_cursor;
cgsix_ras_init(sc);
}
- cgsix_stdscreen.nrows = sc->sc_rasops.ri_rows;
- cgsix_stdscreen.ncols = sc->sc_rasops.ri_cols;
- cgsix_stdscreen.textops = &sc->sc_rasops.ri_ops;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops,
- WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, &defattr);
+ cgsix_stdscreen.capabilities = sc->sc_sunfb.sf_ro.ri_caps;
+ cgsix_stdscreen.nrows = sc->sc_sunfb.sf_ro.ri_rows;
+ cgsix_stdscreen.ncols = sc->sc_sunfb.sf_ro.ri_cols;
+ cgsix_stdscreen.textops = &sc->sc_sunfb.sf_ro.ri_ops;
printf("\n");
- cgsix_setcolor(sc, WSCOL_BLACK, 0, 0, 0);
- cgsix_setcolor(sc, WSCOL_RED, 255, 0, 0);
- cgsix_setcolor(sc, WSCOL_GREEN, 0, 255, 0);
- cgsix_setcolor(sc, WSCOL_BROWN, 154, 85, 46);
- cgsix_setcolor(sc, WSCOL_BLUE, 0, 0, 255);
- cgsix_setcolor(sc, WSCOL_MAGENTA, 255, 255, 0);
- cgsix_setcolor(sc, WSCOL_CYAN, 0, 255, 255);
- cgsix_setcolor(sc, WSCOL_WHITE, 255, 255, 255);
- /* for cursor inversion */
- cgsix_setcolor(sc, (~WSCOL_WHITE) & 0xff, 0, 0, 0);
- cgsix_setcolor(sc, (~WSCOL_BLACK) & 0xff, 255, 255, 255);
+ fbwscons_setcolormap(&sc->sc_sunfb, cgsix_setcolor);
if (console) {
- if (romgetcursoraddr(&sc->sc_crowp, &sc->sc_ccolp))
- sc->sc_crowp = sc->sc_ccolp = NULL;
- if (sc->sc_ccolp != NULL)
- sc->sc_rasops.ri_ccol = *sc->sc_ccolp;
- if (sc->sc_crowp != NULL)
- sc->sc_rasops.ri_crow = *sc->sc_crowp;
- sc->sc_rasops.ri_updatecursor = cgsix_ras_updatecursor;
-
- wsdisplay_cnattach(&cgsix_stdscreen, &sc->sc_rasops,
- sc->sc_rasops.ri_ccol, sc->sc_rasops.ri_crow, defattr);
+ sc->sc_sunfb.sf_ro.ri_updatecursor = cgsix_ras_updatecursor;
+ fbwscons_console_init(&sc->sc_sunfb, &cgsix_stdscreen, -1,
+ cgsix_burner);
}
waa.console = console;
@@ -346,8 +309,8 @@ cgsix_ioctl(v, cmd, data, flags, p)
break;
case WSDISPLAYIO_SMODE:
mode = *(u_int *)data;
- if ((sc->sc_dev.dv_cfdata->cf_flags & CG6_CFFLAG_NOACCEL)
- == 0) {
+ if ((sc->sc_sunfb.sf_dev.dv_cfdata->cf_flags &
+ CG6_CFFLAG_NOACCEL) == 0) {
if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL &&
mode == WSDISPLAYIO_MODE_EMUL)
cgsix_ras_init(sc);
@@ -356,13 +319,13 @@ cgsix_ioctl(v, cmd, data, flags, p)
break;
case WSDISPLAYIO_GINFO:
wdf = (void *)data;
- wdf->height = sc->sc_height;
- wdf->width = sc->sc_width;
- wdf->depth = sc->sc_depth;
+ wdf->height = sc->sc_sunfb.sf_height;
+ wdf->width = sc->sc_sunfb.sf_width;
+ wdf->depth = sc->sc_sunfb.sf_depth;
wdf->cmsize = 256;
break;
case WSDISPLAYIO_LINEBYTES:
- *(u_int *)data = sc->sc_linebytes;
+ *(u_int *)data = sc->sc_sunfb.sf_linebytes;
break;
case WSDISPLAYIO_GETCMAP:
cm = (struct wsdisplay_cmap *)data;
@@ -585,10 +548,10 @@ cgsix_alloc_screen(v, type, cookiep, curxp, curyp, attrp)
if (sc->sc_nscreens > 0)
return (ENOMEM);
- *cookiep = &sc->sc_rasops;
+ *cookiep = &sc->sc_sunfb.sf_ro;
*curyp = 0;
*curxp = 0;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops,
+ sc->sc_sunfb.sf_ro.ri_ops.alloc_attr(&sc->sc_sunfb.sf_ro,
WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, attrp);
sc->sc_nscreens++;
return (0);
@@ -655,8 +618,7 @@ cgsix_mmap(v, off, prot)
if (off < mo->mo_uaddr)
continue;
u = off - mo->mo_uaddr;
- sz = mo->mo_size ? mo->mo_size :
- sc->sc_linebytes * sc->sc_height;
+ sz = mo->mo_size ? mo->mo_size : sc->sc_sunfb.sf_fbsize;
if (u < sz) {
return (bus_space_mmap(sc->sc_bustag,
sc->sc_paddr, u + mo->mo_physoff,
@@ -667,7 +629,7 @@ cgsix_mmap(v, off, prot)
case WSDISPLAYIO_MODE_DUMBFB:
/* Allow mapping as a dumb framebuffer from offset 0 */
- if (off >= 0 && off < (sc->sc_linebytes * sc->sc_height))
+ if (off >= 0 && off < sc->sc_sunfb.sf_fbsize)
return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
off + CGSIX_VID_OFFSET, prot,
BUS_SPACE_MAP_LINEAR));
@@ -677,18 +639,6 @@ cgsix_mmap(v, off, prot)
return (-1);
}
-static int
-a2int(char *cp, int deflt)
-{
- int i = 0;
-
- if (*cp == '\0')
- return (deflt);
- while (*cp != '\0')
- i = i * 10 + *cp++ - '0';
- return (i);
-}
-
int
cgsix_is_console(node)
int node;
@@ -782,11 +732,9 @@ cgsix_loadcmap_immediate(sc, start, ncolors)
}
void
-cgsix_setcolor(sc, index, r, g, b)
- struct cgsix_softc *sc;
- u_int index;
- u_int8_t r, g, b;
+cgsix_setcolor(void *v, u_int index, u_int8_t r, u_int8_t g, u_int8_t b)
{
+ struct cgsix_softc *sc = v;
union bt_cmap *bcm = &sc->sc_cmap;
bcm->cm_map[index][0] = r;
@@ -1174,8 +1122,8 @@ cgsix_ras_updatecursor(ri)
{
struct cgsix_softc *sc = ri->ri_hw;
- if (sc->sc_crowp != NULL)
- *sc->sc_crowp = ri->ri_crow;
- if (sc->sc_ccolp != NULL)
- *sc->sc_ccolp = ri->ri_ccol;
+ if (sc->sc_sunfb.sf_crowp != NULL)
+ *sc->sc_sunfb.sf_crowp = ri->ri_crow;
+ if (sc->sc_sunfb.sf_ccolp != NULL)
+ *sc->sc_sunfb.sf_ccolp = ri->ri_ccol;
}
diff --git a/sys/dev/sbus/cgsixreg.h b/sys/dev/sbus/cgsixreg.h
index acba294940c..06d81c410ba 100644
--- a/sys/dev/sbus/cgsixreg.h
+++ b/sys/dev/sbus/cgsixreg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cgsixreg.h,v 1.7 2003/06/02 18:32:41 jason Exp $ */
+/* $OpenBSD: cgsixreg.h,v 1.8 2003/06/18 17:35:30 miod Exp $ */
/*
* Copyright (c) 2002 Jason L. Wright (jason@thought.net)
@@ -264,7 +264,7 @@ union bt_cmap {
#define THC_MISC_CYCLS 0x0000000f /* cycles before transfer */
struct cgsix_softc {
- struct device sc_dev;
+ struct sunfb sc_sunfb;
struct sbusdev sc_sd;
bus_space_tag_t sc_bustag;
bus_addr_t sc_paddr;
@@ -274,13 +274,10 @@ struct cgsix_softc {
bus_space_handle_t sc_tec_regs;
bus_space_handle_t sc_vid_regs;
bus_space_handle_t sc_fbc_regs;
- struct rasops_info sc_rasops;
int sc_nscreens;
- int sc_width, sc_height, sc_depth, sc_linebytes;
union bt_cmap sc_cmap;
void *sc_ih;
u_int sc_mode;
- int *sc_crowp, *sc_ccolp;
u_int sc_curs_enabled, sc_curs_fg, sc_curs_bg;
struct wsdisplay_curpos sc_curs_pos, sc_curs_hot, sc_curs_size;
u_char sc_curs_image[128], sc_curs_mask[128];
diff --git a/sys/dev/sbus/cgthree.c b/sys/dev/sbus/cgthree.c
index 5613ecb4eac..862ce4008af 100644
--- a/sys/dev/sbus/cgthree.c
+++ b/sys/dev/sbus/cgthree.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cgthree.c,v 1.31 2003/06/17 19:47:45 miod Exp $ */
+/* $OpenBSD: cgthree.c,v 1.32 2003/06/18 17:35:30 miod Exp $ */
/*
* Copyright (c) 2001 Jason L. Wright (jason@thought.net)
@@ -49,6 +49,8 @@
#include <dev/wscons/wsdisplayvar.h>
#include <dev/wscons/wscons_raster.h>
#include <dev/rasops/rasops.h>
+#include <machine/fbvar.h>
+
#include <dev/ic/bt458reg.h>
#define CGTHREE_CTRL_OFFSET 0x400000
@@ -116,27 +118,19 @@ union bt_cmap {
bus_space_write_1((sc)->sc_bustag, (sc)->sc_ctrl_regs, (reg), (val))
struct cgthree_softc {
- struct device sc_dev;
+ struct sunfb sc_sunfb;
struct sbusdev sc_sd;
bus_space_tag_t sc_bustag;
bus_addr_t sc_paddr;
bus_space_handle_t sc_ctrl_regs;
bus_space_handle_t sc_vid_regs;
int sc_nscreens;
- int sc_width, sc_height, sc_depth, sc_linebytes;
union bt_cmap sc_cmap;
- struct rasops_info sc_rasops;
u_int sc_mode;
- int *sc_crowp, *sc_ccolp;
};
struct wsscreen_descr cgthree_stdscreen = {
"std",
- 0, 0, /* will be filled in -- XXX shouldn't, it's global. */
- 0,
- 0, 0,
- WSSCREEN_UNDERLINE | WSSCREEN_HILIT |
- WSSCREEN_REVERSE | WSSCREEN_WSCOLORS
};
const struct wsscreen_descr *cgthree_scrlist[] = {
@@ -159,12 +153,10 @@ int cgthree_is_console(int);
void cgthree_loadcmap(struct cgthree_softc *, u_int, u_int);
int cg3_bt_putcmap(union bt_cmap *, struct wsdisplay_cmap *);
int cg3_bt_getcmap(union bt_cmap *, struct wsdisplay_cmap *);
-void cgthree_setcolor(struct cgthree_softc *, u_int,
- u_int8_t, u_int8_t, u_int8_t);
+void cgthree_setcolor(void *, u_int, u_int8_t, u_int8_t, u_int8_t);
void cgthree_burner(void *, u_int, u_int);
void cgthree_reset(struct cgthree_softc *);
void cgthree_updatecursor(struct rasops_info *);
-static int a2int(char *, int);
struct wsdisplay_accessops cgthree_accessops = {
cgthree_ioctl,
@@ -238,15 +230,11 @@ cgthreeattach(parent, self, aux)
struct sbus_attach_args *sa = aux;
struct wsemuldisplaydev_attach_args waa;
int console, i;
- long defattr;
sc->sc_bustag = sa->sa_bustag;
sc->sc_paddr = sbus_bus_addr(sa->sa_bustag, sa->sa_slot, sa->sa_offset);
- sc->sc_depth = getpropint(sa->sa_node, "depth", 8);
- sc->sc_linebytes = getpropint(sa->sa_node, "linebytes", 1152);
- sc->sc_height = getpropint(sa->sa_node, "height", 900);
- sc->sc_width = getpropint(sa->sa_node, "width", 1152);
+ fb_setsize(&sc->sc_sunfb, 8, 1152, 900, sa->sa_node, 0);
if (sa->sa_nreg != 1) {
printf(": expected %d registers, got %d\n", 1, sa->sa_nreg);
@@ -266,7 +254,7 @@ cgthreeattach(parent, self, aux)
if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[0].sbr_slot,
sa->sa_reg[0].sbr_offset + CGTHREE_VID_OFFSET,
- sc->sc_linebytes * sc->sc_height, BUS_SPACE_MAP_LINEAR,
+ sc->sc_sunfb.sf_fbsize, BUS_SPACE_MAP_LINEAR,
0, &sc->sc_vid_regs) != 0) {
printf(": cannot map vid registers\n");
goto fail_vid;
@@ -274,7 +262,7 @@ cgthreeattach(parent, self, aux)
console = cgthree_is_console(sa->sa_node);
- sbus_establish(&sc->sc_sd, &sc->sc_dev);
+ sbus_establish(&sc->sc_sd, &sc->sc_sunfb.sf_dev);
cgthree_reset(sc);
@@ -284,50 +272,24 @@ cgthreeattach(parent, self, aux)
cgthree_burner(sc, 1, 0);
- sc->sc_rasops.ri_depth = sc->sc_depth;
- sc->sc_rasops.ri_stride = sc->sc_linebytes;
- sc->sc_rasops.ri_flg = RI_CENTER |
- (console ? 0 : RI_CLEAR);
- sc->sc_rasops.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
+ sc->sc_sunfb.sf_ro.ri_bits = (void *)bus_space_vaddr(sc->sc_bustag,
sc->sc_vid_regs);
- sc->sc_rasops.ri_width = sc->sc_width;
- sc->sc_rasops.ri_height = sc->sc_height;
- sc->sc_rasops.ri_hw = sc;
-
- rasops_init(&sc->sc_rasops,
- a2int(getpropstring(optionsnode, "screen-#rows"), 34),
- a2int(getpropstring(optionsnode, "screen-#columns"), 80));
+ sc->sc_sunfb.sf_ro.ri_hw = sc;
+ fbwscons_init(&sc->sc_sunfb, console ? 0 : RI_CLEAR);
- cgthree_stdscreen.nrows = sc->sc_rasops.ri_rows;
- cgthree_stdscreen.ncols = sc->sc_rasops.ri_cols;
- cgthree_stdscreen.textops = &sc->sc_rasops.ri_ops;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops,
- WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, &defattr);
- sc->sc_rasops.ri_hw = sc;
+ cgthree_stdscreen.capabilities = sc->sc_sunfb.sf_ro.ri_caps;
+ cgthree_stdscreen.nrows = sc->sc_sunfb.sf_ro.ri_rows;
+ cgthree_stdscreen.ncols = sc->sc_sunfb.sf_ro.ri_cols;
+ cgthree_stdscreen.textops = &sc->sc_sunfb.sf_ro.ri_ops;
printf("\n");
- cgthree_setcolor(sc, WSCOL_BLACK, 0, 0, 0);
- cgthree_setcolor(sc, 255, 0, 0, 0);
- cgthree_setcolor(sc, WSCOL_RED, 255, 0, 0);
- cgthree_setcolor(sc, WSCOL_GREEN, 0, 255, 0);
- cgthree_setcolor(sc, WSCOL_BROWN, 154, 85, 46);
- cgthree_setcolor(sc, WSCOL_BLUE, 0, 0, 255);
- cgthree_setcolor(sc, WSCOL_MAGENTA, 255, 255, 0);
- cgthree_setcolor(sc, WSCOL_CYAN, 0, 255, 255);
- cgthree_setcolor(sc, WSCOL_WHITE, 255, 255, 255);
+ fbwscons_setcolormap(&sc->sc_sunfb, cgthree_setcolor);
if (console) {
- if (romgetcursoraddr(&sc->sc_crowp, &sc->sc_ccolp))
- sc->sc_ccolp = sc->sc_crowp = NULL;
- if (sc->sc_ccolp != NULL)
- sc->sc_rasops.ri_ccol = *sc->sc_ccolp;
- if (sc->sc_crowp != NULL)
- sc->sc_rasops.ri_crow = *sc->sc_crowp;
- sc->sc_rasops.ri_updatecursor = cgthree_updatecursor;
-
- wsdisplay_cnattach(&cgthree_stdscreen, &sc->sc_rasops,
- sc->sc_rasops.ri_ccol, sc->sc_rasops.ri_crow, defattr);
+ sc->sc_sunfb.sf_ro.ri_updatecursor = cgthree_updatecursor;
+ fbwscons_console_init(&sc->sc_sunfb, &cgthree_stdscreen, -1,
+ cgthree_burner);
}
waa.console = console;
@@ -367,13 +329,13 @@ cgthree_ioctl(v, cmd, data, flags, p)
break;
case WSDISPLAYIO_GINFO:
wdf = (void *)data;
- wdf->height = sc->sc_height;
- wdf->width = sc->sc_width;
- wdf->depth = sc->sc_depth;
+ wdf->height = sc->sc_sunfb.sf_height;
+ wdf->width = sc->sc_sunfb.sf_width;
+ wdf->depth = sc->sc_sunfb.sf_depth;
wdf->cmsize = 256;
break;
case WSDISPLAYIO_LINEBYTES:
- *(u_int *)data = sc->sc_linebytes;
+ *(u_int *)data = sc->sc_sunfb.sf_linebytes;
break;
case WSDISPLAYIO_GETCMAP:
@@ -418,10 +380,10 @@ cgthree_alloc_screen(v, type, cookiep, curxp, curyp, attrp)
if (sc->sc_nscreens > 0)
return (ENOMEM);
- *cookiep = &sc->sc_rasops;
+ *cookiep = &sc->sc_sunfb.sf_ro;
*curyp = 0;
*curxp = 0;
- sc->sc_rasops.ri_ops.alloc_attr(&sc->sc_rasops,
+ sc->sc_sunfb.sf_ro.ri_ops.alloc_attr(&sc->sc_sunfb.sf_ro,
WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, attrp);
sc->sc_nscreens++;
return (0);
@@ -470,12 +432,12 @@ cgthree_mmap(v, offset, prot)
offset -= START;
else
offset = 0;
- if (offset >= sc->sc_linebytes * sc->sc_height)
+ if (offset >= sc->sc_sunfb.sf_fbsize)
return (-1);
return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
CGTHREE_VID_OFFSET + offset, prot, BUS_SPACE_MAP_LINEAR));
case WSDISPLAYIO_MODE_DUMBFB:
- if (offset < (sc->sc_linebytes * sc->sc_height))
+ if (offset < sc->sc_sunfb.sf_fbsize)
return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
CGTHREE_VID_OFFSET + offset, prot,
BUS_SPACE_MAP_LINEAR));
@@ -484,18 +446,6 @@ cgthree_mmap(v, offset, prot)
return (-1);
}
-static int
-a2int(char *cp, int deflt)
-{
- int i = 0;
-
- if (*cp == '\0')
- return (deflt);
- while (*cp != '\0')
- i = i * 10 + *cp++ - '0';
- return (i);
-}
-
int
cgthree_is_console(node)
int node;
@@ -506,11 +456,9 @@ cgthree_is_console(node)
}
void
-cgthree_setcolor(sc, index, r, g, b)
- struct cgthree_softc *sc;
- u_int index;
- u_int8_t r, g, b;
+cgthree_setcolor(void *v, u_int index, u_int8_t r, u_int8_t g, u_int8_t b)
{
+ struct cgthree_softc *sc = v;
union bt_cmap *bcm = &sc->sc_cmap;
bcm->cm_map[index][0] = r;
@@ -671,8 +619,8 @@ cgthree_updatecursor(ri)
{
struct cgthree_softc *sc = ri->ri_hw;
- if (sc->sc_crowp != NULL)
- *sc->sc_crowp = ri->ri_crow;
- if (sc->sc_ccolp != NULL)
- *sc->sc_ccolp = ri->ri_ccol;
+ if (sc->sc_sunfb.sf_crowp != NULL)
+ *sc->sc_sunfb.sf_crowp = ri->ri_crow;
+ if (sc->sc_sunfb.sf_ccolp != NULL)
+ *sc->sc_sunfb.sf_ccolp = ri->ri_ccol;
}