Index: src/sys/arch/mac68k/dev/grf_compat.c =================================================================== --- src.orig/sys/arch/mac68k/dev/grf_compat.c 2007-09-03 21:06:34.000000000 +0200 +++ src/sys/arch/mac68k/dev/grf_compat.c 2007-09-03 21:06:34.000000000 +0200 @@ -28,14 +28,12 @@ */ /* - * macfb compatibility with legacy grf devices + * genfb compatibility with legacy grf devices */ #include __KERNEL_RCSID(0, "$NetBSD: grf_compat.c,v 1.20 2007/03/05 21:11:04 he Exp $"); -#include "macfb.h" - #include #include #include @@ -54,7 +52,8 @@ #include #include -#include + +#include #include @@ -74,8 +73,8 @@ void grf_scinit(struct grf_softc *, const char *, int); void grf_init(int); void grfattach(int); -int grfmap(dev_t, struct macfb_softc *, void **, struct proc *); -int grfunmap(dev_t, struct macfb_softc *, void *, struct proc *); +int grfmap(dev_t, struct genfb_softc *, void **, struct proc *); +int grfunmap(dev_t, struct genfb_softc *, void *, struct proc *); /* Non-private for the benefit of libkvm. */ struct grf_softc *grf_softc; @@ -86,10 +85,10 @@ */ void grf_scinit(struct grf_softc *sc, const char *name, int unit) -{ +{ memset(sc, 0, sizeof(struct grf_softc)); snprintf(sc->sc_xname, sizeof(sc->sc_xname), "%s%d", name, unit); - sc->mfb_sc = NULL; + sc->sc_gen = NULL; } /* @@ -154,17 +153,17 @@ } /* - * Called from macfb_attach() after setting up the frame buffer. Since - * there is a 1:1 correspondence between the macfb device and the grf - * device, the only bit of information we really need is the macfb_softc. + * Called from genfb_attach() after setting up the frame buffer. Since + * there is a 1:1 correspondence between the genfb device and the grf + * device, the only bit of information we really need is the genfb_softc. */ void -grf_attach(struct macfb_softc *sc, int unit) +grf_attach(struct genfb_softc *sc, int unit) { grf_init(unit); if (unit < numgrf) - grf_softc[unit].mfb_sc = sc; + grf_softc[unit].sc_gen = sc; } /* @@ -181,7 +180,7 @@ return ENXIO; sc = &grf_softc[unit]; - if (sc->mfb_sc == NULL) + if (sc->sc_gen == NULL) rv = ENXIO; return rv; @@ -198,10 +197,13 @@ return ENXIO; sc = &grf_softc[unit]; - if (sc->mfb_sc != NULL) { -#if NMACFB > 0 - macfb_clear(sc->mfb_sc->sc_dc); /* clear the display */ -#endif + if (sc->sc_gen != NULL) { + long defattr; + struct rasops_info *ri; + + ri = &sc->sc_gen->sc_console_screen.scr_ri; + (*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr); + (*ri->ri_ops.eraserows)(ri, 0, ri->ri_rows, defattr); } else rv = ENXIO; @@ -212,7 +214,7 @@ grfioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct grf_softc *sc; - struct macfb_devconfig *dc; + struct genfb_softc *scgen; #if defined(GRF_COMPAT) || (NGRF > 0) struct grfinfo *gd; #endif /* GRF_COMPAT || (NGRF > 0) */ @@ -224,25 +226,25 @@ return ENXIO; sc = &grf_softc[unit]; - if (sc->mfb_sc == NULL) + if (sc->sc_gen == NULL) return ENXIO; - dc = sc->mfb_sc->sc_dc; + scgen = sc->sc_gen; switch (cmd) { #if defined(GRF_COMPAT) || (NGRF > 0) case GRFIOCGINFO: gd = (struct grfinfo *)data; memset(gd, 0, sizeof(struct grfinfo)); - gd->gd_fbaddr = (void *)dc->dc_paddr; - gd->gd_fbsize = dc->dc_size; - gd->gd_colors = (short)(1 << dc->dc_depth); - gd->gd_planes = (short)dc->dc_depth; - gd->gd_fbwidth = dc->dc_wid; - gd->gd_fbheight = dc->dc_ht; - gd->gd_fbrowbytes = dc->dc_rowbytes; - gd->gd_dwidth = dc->dc_raster.width; - gd->gd_dheight = dc->dc_raster.height; + gd->gd_fbaddr = (void *)scgen->sc_fboffset; + gd->gd_fbsize = scgen->sc_fbsize; + gd->gd_colors = (short)(1 << scgen->sc_depth); + gd->gd_planes = (short)scgen->sc_depth; + gd->gd_fbwidth = scgen->sc_width; + gd->gd_fbheight = scgen->sc_height; + gd->gd_fbrowbytes = scgen->sc_stride; + gd->gd_dwidth = scgen->sc_width; + gd->gd_dheight = scgen->sc_height; rv = 0; break; #endif /* GRF_COMPAT || (NGRF > 0) */ @@ -255,24 +257,24 @@ #if defined(GRF_COMPAT) || (NGRF > 0) case GRFIOCMAP: - rv = grfmap(dev, sc->mfb_sc, (void **)data, l->l_proc); + rv = grfmap(dev, sc->sc_gen, (void **)data, l->l_proc); break; case GRFIOCUNMAP: - rv = grfunmap(dev, sc->mfb_sc, *(void **)data, l->l_proc); + rv = grfunmap(dev, sc->sc_gen, *(void **)data, l->l_proc); break; #endif /* GRF_COMPAT || (NGRF > 0) */ case GRFIOCGMODE: gm = (struct grfmode *)data; memset(gm, 0, sizeof(struct grfmode)); - gm->fbbase = (char *)dc->dc_vaddr; - gm->fbsize = dc->dc_size; - gm->fboff = dc->dc_offset; - gm->rowbytes = dc->dc_rowbytes; - gm->width = dc->dc_wid; - gm->height = dc->dc_ht; - gm->psize = dc->dc_depth; + gm->fbbase = (void *)m68k_trunc_page(scgen->sc_fbaddr); + gm->fbsize = scgen->sc_fbsize; + gm->fboff = m68k_page_offset(scgen->sc_fbaddr); + gm->rowbytes = scgen->sc_stride; + gm->width = scgen->sc_width; + gm->height = scgen->sc_height; + gm->psize = scgen->sc_depth; rv = 0; break; @@ -291,33 +293,36 @@ grfmmap(dev_t dev, off_t off, int prot) { struct grf_softc *sc; - struct macfb_devconfig *dc; + struct genfb_softc *scgen; int unit = GRFUNIT(dev); if (grf_softc == NULL || unit >= numgrf) return ENXIO; sc = &grf_softc[unit]; - if (sc->mfb_sc == NULL) + if (sc->sc_gen == NULL) return ENXIO; - dc = sc->mfb_sc->sc_dc; + scgen = sc->sc_gen; - if ((u_int)off < m68k_round_page(dc->dc_offset + dc->dc_size)) - return m68k_btop(dc->dc_paddr + off); + if ((unsigned int)off < + m68k_round_page(m68k_page_offset(scgen->sc_fboffset) + + scgen->sc_fbsize)) + return m68k_btop((vaddr_t)scgen->sc_fboffset + off); return (-1); } int -grfmap(dev_t dev, struct macfb_softc *sc, void **addrp, struct proc *p) +grfmap(dev_t dev, struct genfb_softc *sc, void **addrp, struct proc *p) { struct specinfo si; struct vnode vn; u_long len; int error, flags; - len = m68k_round_page(sc->sc_dc->dc_offset + sc->sc_dc->dc_size); + len = m68k_round_page(m68k_page_offset(sc->sc_fboffset) + + sc->sc_fbsize); *addrp = (void *)VM_DEFAULT_ADDRESS(p->p_vmspace->vm_daddr, len); flags = MAP_SHARED | MAP_FIXED; @@ -330,22 +335,23 @@ flags, (void *)&vn, 0, p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); /* Offset into page: */ - *addrp = (char*)*addrp + sc->sc_dc->dc_offset; + *addrp = (char *)*addrp + m68k_page_offset(sc->sc_fboffset); return (error); } int -grfunmap(dev_t dev, struct macfb_softc *sc, void *addr, struct proc *p) +grfunmap(dev_t dev, struct genfb_softc *sc, void *addr, struct proc *p) { vm_size_t size; - addr = (char*)addr - sc->sc_dc->dc_offset; + addr = (char *)addr - m68k_page_offset(sc->sc_fboffset); if (addr <= 0) return (-1); - size = m68k_round_page(sc->sc_dc->dc_offset + sc->sc_dc->dc_size); + size = m68k_round_page(m68k_page_offset(sc->sc_fboffset) + + sc->sc_fbsize); uvm_unmap(&p->p_vmspace->vm_map, (vaddr_t)addr, (vaddr_t)addr + size); return 0; } Index: src/sys/arch/mac68k/dev/grfvar.h =================================================================== --- src.orig/sys/arch/mac68k/dev/grfvar.h 2007-09-03 21:02:15.000000000 +0200 +++ src/sys/arch/mac68k/dev/grfvar.h 2007-09-03 22:34:48.000000000 +0200 @@ -83,7 +83,6 @@ */ struct grfbus_softc { struct device sc_dev; - nubus_slot sc_slot; bus_addr_t sc_basepa; /* base of video space */ bus_addr_t sc_fbofs; /* offset to framebuffer */ @@ -92,12 +91,10 @@ bus_space_handle_t sc_handle; bus_space_handle_t sc_regh; - struct grfmode curr_mode; /* hardware desc(for ioctl) */ u_int32_t card_id; /* DrHW value for nubus cards */ bus_size_t cli_offset; /* Offset to clear interrupt */ /* for cards where that's suff. */ u_int32_t cli_value; /* Value to write at cli_offset */ - nubus_dir board_dir; /* Nubus dir for curr board */ }; /* @@ -105,7 +102,7 @@ */ struct grf_softc { char sc_xname[15]; /* name of the device */ - struct macfb_softc *mfb_sc; + struct genfb_softc *sc_gen; }; /* @@ -116,7 +113,6 @@ bus_space_tag_t ga_tag; /* forwarded ... */ bus_space_handle_t ga_handle; struct grfmode *ga_grfmode; - nubus_slot *ga_slot; bus_addr_t ga_phys; bus_addr_t ga_fboff; int (*ga_mode)(struct grf_softc *, int, void *); @@ -172,7 +168,7 @@ #define VID_PAGE_CNT 3 #define VID_DEV_TYPE 4 -void grf_attach(struct macfb_softc *, int); +void grf_attach(struct genfb_softc *, int); void grf_establish(struct grfbus_softc *, nubus_slot *, int (*)(struct grf_softc *, int, void *)); Index: src/sys/arch/mac68k/nubus/genfb_nubus.c =================================================================== --- src.orig/sys/arch/mac68k/nubus/genfb_nubus.c 2007-09-03 21:06:34.000000000 +0200 +++ src/sys/arch/mac68k/nubus/genfb_nubus.c 2007-09-03 21:06:34.000000000 +0200 @@ -32,6 +32,8 @@ #include __KERNEL_RCSID(0, "$NetBSD$"); +#include "grf.h" + #include #include @@ -394,6 +396,9 @@ ops.genfb_mmap = nubus_genfb_mmap; genfb_attach(&sc->sc_gen, &ops); +#if NGRF > 0 + grf_attach(&sc->sc_gen, device_unit(&sc->sc_gen.sc_dev)); +#endif /* NGRF > 0 */ } static int Index: src/sys/arch/mac68k/obio/genfb_obio.c =================================================================== --- src.orig/sys/arch/mac68k/obio/genfb_obio.c 2007-09-03 21:06:34.000000000 +0200 +++ src/sys/arch/mac68k/obio/genfb_obio.c 2007-09-03 22:34:24.000000000 +0200 @@ -103,6 +103,8 @@ #include __KERNEL_RCSID(0, "$NetBSD$"); +#include "grf.h" + #include #include #include @@ -116,6 +118,8 @@ #include #include +#include /* XXX Remove with intvid/macvid. */ +#include #include #include "opt_wsfb.h" @@ -331,6 +335,9 @@ ops.genfb_mmap = obio_genfb_mmap; genfb_attach(&sc->sc_gen, &ops); +#if NGRF > 0 + grf_attach(&sc->sc_gen, device_unit(&sc->sc_gen.sc_dev)); +#endif /* NGRF > 0 */ } static int