summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Reindl <martin@cvs.openbsd.org>2005-08-06 19:51:45 +0000
committerMartin Reindl <martin@cvs.openbsd.org>2005-08-06 19:51:45 +0000
commit50f81f3d5e5b5b206944aab7cf18d58adb4564ec (patch)
treef0243447d3cd295e5cb489ad664920b7e4e94953
parent9f36dcaaddbb3cb52a01409a14c2f52efd1287d8 (diff)
overhaul the grf driver:
- Simplify grfmv_phys() to work like grfiv_phys(), and eliminate the second argument to both, as we don't use it anyway. - Handle fbbase and fboff consistently throughout. - Eliminate grfaddr() by pulling it into grfmmap(), which is the only place it was used, previously. - grfmap() now gets the physical address of the framebuffer from the appropriate driver, rather than try to compute it by itself. Be careful with aligning the base to a page address and increase the length of the mapped region appropriately. - Store the PA of the framebuffer in the softc. This eliminates the need for the sc_phys callback; we can just store the PA in the grfbus attach args, rather than a function pointer, which simplifies the code nicely. - Disable Valkyrie interrupts on the Quadra 630 - New and improved console framebuffer initialization and autoconfig. This resolves a great many issues, including Performa 58x interrupt handling and offset displays on some models. - Remove unused grf ioctls - Some KNF and other minor things help and ok miod@ from NetBSD
-rw-r--r--sys/arch/mac68k/dev/grf.c160
-rw-r--r--sys/arch/mac68k/dev/grf_iv.c236
-rw-r--r--sys/arch/mac68k/dev/grf_mv.c20
-rw-r--r--sys/arch/mac68k/dev/grf_subr.c7
-rw-r--r--sys/arch/mac68k/dev/grfvar.h30
-rw-r--r--sys/arch/mac68k/include/grfioctl.h27
-rw-r--r--sys/arch/mac68k/mac68k/machdep.c97
-rw-r--r--sys/arch/mac68k/mac68k/pmap_bootstrap.c5
8 files changed, 289 insertions, 293 deletions
diff --git a/sys/arch/mac68k/dev/grf.c b/sys/arch/mac68k/dev/grf.c
index 6e84a03efb4..09af2b76281 100644
--- a/sys/arch/mac68k/dev/grf.c
+++ b/sys/arch/mac68k/dev/grf.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: grf.c,v 1.27 2005/07/23 23:28:58 martin Exp $ */
-/* $NetBSD: grf.c,v 1.41 1997/02/24 06:20:04 scottr Exp $ */
+/* $OpenBSD: grf.c,v 1.28 2005/08/06 19:51:43 martin Exp $ */
+/* $NetBSD: grf.c,v 1.53 1998/06/02 02:14:20 scottr Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -66,9 +66,9 @@
#include <uvm/uvm.h>
-#include "nubus.h"
-#include "itevar.h"
-#include "grfvar.h"
+#include <mac68k/dev/nubus.h>
+#include <mac68k/dev/itevar.h>
+#include <mac68k/dev/grfvar.h>
#include "grf.h"
#include "ite.h"
@@ -90,11 +90,15 @@ struct cfattach grf_ca = {
};
#ifdef DEBUG
+#define GRF_DEBUG
+#endif
+
+#ifdef GRF_DEBUG
#define GDB_DEVNO 0x01
#define GDB_MMAP 0x02
#define GDB_IOMAP 0x04
#define GDB_LOCK 0x08
-static int grfdebug = (GDB_DEVNO|GDB_MMAP|GDB_IOMAP|GDB_LOCK);
+int grfdebug = 0;
#endif
int
@@ -121,6 +125,8 @@ grfattach(parent, self, aux)
/* Load forwarded pointers. */
sc->sc_grfmode = ga->ga_grfmode;
sc->sc_slot = ga->ga_slot;
+ sc->sc_tag = ga->ga_tag;
+ sc->sc_regh = ga->ga_handle;
sc->sc_mode = ga->ga_mode;
sc->sc_phys = ga->ga_phys;
@@ -179,7 +185,7 @@ grfclose(dev, flag, mode, p)
gp = grf_cd.cd_devs[GRFUNIT(dev)];
- (void) grfoff(dev);
+ (void)grfoff(dev);
gp->sc_flags &= GF_ALIVE;
return (0);
@@ -204,34 +210,12 @@ grfioctl(dev, cmd, data, flag, p)
error = 0;
switch (cmd) {
- case GRFIOCGINFO: /* XXX - This should go away as soon as X and */
- /* dt are fixed to use GRFIOC*MODE* */
- { struct grfinfo *g;
- g = (struct grfinfo *) data;
- bzero(data, sizeof(struct grfinfo));
- g->gd_id = gm->mode_id;
- g->gd_fbaddr = gm->fbbase;
- g->gd_fbsize = gm->fbsize;
- g->gd_colors = 1 << (u_int32_t) gm->psize;
- g->gd_planes = gm->psize;
- g->gd_fbwidth = g->gd_dwidth = gm->width;
- g->gd_fbheight = g->gd_dheight = gm->height;
- g->gd_fbrowbytes = gm->rowbytes;
- }
- break;
-
case GRFIOCON:
error = grfon(dev);
break;
case GRFIOCOFF:
error = grfoff(dev);
break;
- case GRFIOCMAP:
- error = grfmap(dev, (caddr_t *) data, p);
- break;
- case GRFIOCUNMAP:
- error = grfunmap(dev, *(caddr_t *) data, p);
- break;
case GRFIOCGMODE:
bcopy(gm, data, sizeof(struct grfmode));
@@ -271,11 +255,26 @@ grfmmap(dev, off, prot)
off_t off;
int prot;
{
- int unit = GRFUNIT(dev);
- struct grf_softc *gp;
+ struct grf_softc *gp = grf_cd.cd_devs[GRFUNIT(dev)];
+ struct grfmode *gm = gp->sc_grfmode;
+ u_long addr;
- gp = grf_cd.cd_devs[unit];
- return (grfaddr(gp, off));
+#ifdef GRF_DEBUG
+ if (grfdebug & GDB_MMAP)
+ printf("grfmmap(%x): off %x, prot %x\n", dev, off, prot);
+#endif
+
+ if (off < m68k_trunc_page(gm->fboff) ||
+ off >= m68k_round_page(gm->fbsize + gm->fboff))
+ addr = (-1); /* XXX bogus */
+ else
+ addr = m68k_btop(gp->sc_phys + off);
+
+#ifdef GRF_DEBUG
+ if (grfdebug & GDB_MMAP)
+ printf("grfmmap(%x): returning addr 0x%08lx\n", dev, addr);
+#endif
+ return (int)addr;
}
int
@@ -294,7 +293,7 @@ grfon(dev)
*/
iteoff(unit, 3);
- return (*gp->sc_mode) (gp, GM_GRFON, NULL);
+ return (*gp->sc_mode)(gp, GM_GRFON, NULL);
}
int
@@ -307,101 +306,10 @@ grfoff(dev)
gp = grf_cd.cd_devs[unit];
- (void) grfunmap(dev, (caddr_t) 0, curproc);
-
- error = (*gp->sc_mode) (gp, GM_GRFOFF, NULL);
+ error = (*gp->sc_mode)(gp, GM_GRFOFF, NULL);
/* XXX: see comment for iteoff above */
iteon(unit, 2);
return (error);
}
-
-int
-grfaddr(gp, off)
- struct grf_softc *gp;
- register int off;
-{
- register struct grfmode *gm = gp->sc_grfmode;
- u_long addr;
-
- if (off >= 0 && off < m68k_round_page(gm->fbsize + gm->fboff)) {
- addr = (u_long)(*gp->sc_phys)(gp, (vaddr_t)gm->fbbase)+off;
- return m68k_btop(addr);
- }
- /* bogus */
- return (-1);
-}
-
-int
-grfmap(dev, addrp, p)
- dev_t dev;
- caddr_t *addrp;
- struct proc *p;
-{
- extern u_int32_t mac68k_vidphys;
- struct grf_softc *gp;
- struct specinfo si;
- struct vnode vn;
- int len, error;
- int flags;
-
- gp = grf_cd.cd_devs[GRFUNIT(dev)];
-#ifdef DEBUG
- if (grfdebug & GDB_MMAP)
- printf("grfmap(%d): addr %p\n", p->p_pid, *addrp);
-#endif
- len = m68k_round_page(gp->sc_grfmode->fbsize + gp->sc_grfmode->fboff);
- flags = MAP_SHARED | MAP_FIXED;
-
- if (gp->sc_slot == NULL)
- *addrp = (caddr_t) m68k_trunc_page(mac68k_vidphys);
- else
- *addrp = (caddr_t) m68k_trunc_page(
- NUBUS_SLOT2PA(gp->sc_slot->slot));
-
- vn.v_type = VCHR; /* XXX */
- vn.v_specinfo = &si; /* XXX */
- vn.v_rdev = dev; /* XXX */
-
- error = uvm_mmap(&p->p_vmspace->vm_map, (vaddr_t *)addrp,
- (vm_size_t)len, UVM_PROT_RW, UVM_PROT_RW, flags, (caddr_t)&vn, 0,
- p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur, p);
-
- /* Offset into page: */
- *addrp += (unsigned long) gp->sc_grfmode->fboff & 0xfff;
-
-#ifdef DEBUG
- if (grfdebug & GDB_MMAP)
- printf("grfmap(%d): returning addr %p\n", p->p_pid, *addrp);
-#endif
-
- return (error);
-}
-
-int
-grfunmap(dev, addr, p)
- dev_t dev;
- caddr_t addr;
- struct proc *p;
-{
- struct grf_softc *gp;
- vm_size_t size;
-
- gp = grf_cd.cd_devs[GRFUNIT(dev)];
-
-#ifdef DEBUG
- if (grfdebug & GDB_MMAP)
- printf("grfunmap(%d): dev %x addr %p\n", p->p_pid, dev, addr);
-#endif
-
- if (addr == 0)
- return (EINVAL);/* XXX: how do we deal with this? */
-
- size = round_page(gp->sc_grfmode->fbsize);
-
- uvm_unmap(&p->p_vmspace->vm_map, (vaddr_t)addr,
- (vaddr_t)addr + size);
-
- return (0);
-}
diff --git a/sys/arch/mac68k/dev/grf_iv.c b/sys/arch/mac68k/dev/grf_iv.c
index c4335be40f5..fccc9ec53d7 100644
--- a/sys/arch/mac68k/dev/grf_iv.c
+++ b/sys/arch/mac68k/dev/grf_iv.c
@@ -1,7 +1,33 @@
-/* $OpenBSD: grf_iv.c,v 1.25 2005/08/01 19:09:19 martin Exp $ */
+/* $OpenBSD: grf_iv.c,v 1.26 2005/08/06 19:51:43 martin Exp $ */
/* $NetBSD: grf_iv.c,v 1.17 1997/02/20 00:23:27 scottr Exp $ */
/*
+ * Copyright (C) 1998 Scott Reynolds
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
* Copyright (c) 1995 Allen Briggs. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,7 +61,6 @@
*/
#include <sys/param.h>
-
#include <sys/device.h>
#include <sys/ioctl.h>
#include <sys/file.h>
@@ -50,18 +75,18 @@
#include <machine/grfioctl.h>
#include <machine/viareg.h>
-#include "nubus.h"
-#include "obiovar.h"
-#include "grfvar.h"
+#include <mac68k/dev/nubus.h>
+#include <mac68k/dev/obiovar.h>
+#include <mac68k/dev/grfvar.h>
-extern u_int32_t mac68k_vidlog;
extern u_int32_t mac68k_vidphys;
+extern u_int32_t mac68k_vidlen;
+extern long videoaddr;
extern long videorowbytes;
extern long videobitdepth;
-extern unsigned long videosize;
+extern u_long videosize;
static int grfiv_mode(struct grf_softc *gp, int cmd, void *arg);
-static caddr_t grfiv_phys(struct grf_softc *gp, vaddr_t addr);
static int grfiv_match(struct device *, void *, void *);
static void grfiv_attach(struct device *, struct device *, void *);
@@ -73,8 +98,12 @@ struct cfattach intvid_ca = {
sizeof(struct grfbus_softc), grfiv_match, grfiv_attach
};
-#define QUADRA_DAFB_BASE 0xF9800000
+#define DAFB_BASE 0xf9000000
+#define DAFB_CONTROL_BASE 0xf9800000
+#define CIVIC_BASE 0x50100000
#define CIVIC_CONTROL_BASE 0x50036000
+#define VALKYRIE_BASE 0xf9000000
+#define VALKYRIE_CONTROL_BASE 0x50f2a000
static int
grfiv_match(parent, vcf, aux)
@@ -82,39 +111,50 @@ grfiv_match(parent, vcf, aux)
void *vcf;
void *aux;
{
- struct obio_attach_args *oa = (struct obio_attach_args *) aux;
- bus_space_handle_t bsh;
- int found, sense;
+ struct obio_attach_args *oa = (struct obio_attach_args *)aux;
+ bus_space_handle_t bsh;
+ int found;
+ u_int base;
found = 1;
switch (current_mac_model->class) {
- case MACH_CLASSQ:
case MACH_CLASSQ2:
+ if (current_mac_model->machineid != MACH_MACLC575) {
+ base = VALKYRIE_CONTROL_BASE;
+
+ if (bus_space_map(oa->oa_tag, base, 0x40, 0, &bsh))
+ return 0;
+ /* Disable interrupts */
+ bus_space_write_1(oa->oa_tag, bsh, 0x18, 0x1);
+ break;
+ }
+ /*
+ * Note: the only system in this class that does not have
+ * the Valkyrie chip -- at least, that we know of -- is
+ * the Performa/LC 57x series. This system has a version
+ * of the DAFB controller, instead.
+ *
+ * If this assumption proves false, we'll have to be more
+ * intelligent here.
+ */
+ /*FALLTHROUGH*/
+ case MACH_CLASSQ:
/*
* Assume DAFB for all of these, unless we can't
* access the memory.
*/
+ base = DAFB_CONTROL_BASE;
- if (bus_space_map(oa->oa_tag, QUADRA_DAFB_BASE, PAGE_SIZE,
- 0, &bsh)) {
- panic("failed to map space for DAFB regs.");
- }
+ if (bus_space_map(oa->oa_tag, base, 0x1000, 0, &bsh))
+ return 0;
- if (mac68k_bus_space_probe(oa->oa_tag, bsh, 0x1C, 4) == 0) {
+ if (mac68k_bus_space_probe(oa->oa_tag, bsh, 0x1c, 4) == 0) {
bus_space_unmap(oa->oa_tag, bsh, PAGE_SIZE);
- found = 0;
- goto nodafb;
+ return 0;
}
- sense = (bus_space_read_4(oa->oa_tag, bsh, 0x1C) & 7);
-
-#if 0 /* when using a non-Apple monitor with an adapter, sense is zero */
- if (sense == 0)
- found = 0;
-#endif
-
/* Set "Turbo SCSI" configuration to default */
bus_space_write_4(oa->oa_tag, bsh, 0x24, 0x1d1); /* ch0 */
bus_space_write_4(oa->oa_tag, bsh, 0x28, 0x1d1); /* ch1 */
@@ -128,62 +168,134 @@ grfiv_match(parent, vcf, aux)
bus_space_write_4(oa->oa_tag, bsh, 0x114, 0);
bus_space_unmap(oa->oa_tag, bsh, PAGE_SIZE);
-
break;
-
case MACH_CLASSAV:
- if (bus_space_map(oa->oa_tag, CIVIC_CONTROL_BASE, 0x1000,
- 0, &bsh)) {
- panic("failed to map space for CIVIC control regs.\n");
- }
+ base = CIVIC_CONTROL_BASE;
+
+ if (bus_space_map(oa->oa_tag, base, 0x1000, 0, &bsh))
+ return 0;
+
/* Disable interrupts */
bus_space_write_1(oa->oa_tag, bsh, 0x120, 0);
+
bus_space_unmap(oa->oa_tag, bsh, 0x1000);
break;
-
default:
-nodafb:
- if (mac68k_vidlog == 0) {
+ if (mac68k_vidlen == 0)
found = 0;
- }
-
break;
}
return found;
}
-#define R4(sc, o) (bus_space_read_4((sc)->sc_tag, (sc)->sc_regh, o) & 0xfff)
-
static void
grfiv_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
{
struct obio_attach_args *oa = (struct obio_attach_args *) aux;
- struct grfbus_softc *sc;
- struct grfmode *gm;
+ struct grfbus_softc *sc;
+ struct grfmode *gm;
+ u_long base, length;
+ u_int32_t vbase1, vbase2;
- sc = (struct grfbus_softc *) self;
+ sc = (struct grfbus_softc *)self;
sc->card_id = 0;
switch (current_mac_model->class) {
+ case MACH_CLASSQ2:
+ if (current_mac_model->machineid != MACH_MACLC575) {
+ sc->sc_basepa = VALKYRIE_BASE;
+ length = 0x00100000; /* 1MB */
+
+ if (sc->sc_basepa <= mac68k_vidphys &&
+ mac68k_vidphys < (sc->sc_basepa + length))
+ sc->sc_fbofs = mac68k_vidphys - sc->sc_basepa;
+ else
+ sc->sc_fbofs = 0;
+
+#ifdef DEBUG
+ printf(" @ %lx", sc->sc_basepa + sc->sc_fbofs);
+#endif
+ printf(": Valkyrie\n");
+ break;
+ }
+ /* See note in grfiv_match() */
+ /*FALLTHROUGH*/
case MACH_CLASSQ:
- case MACH_CLASSQ2:
+ base = DAFB_CONTROL_BASE;
sc->sc_tag = oa->oa_tag;
- if (bus_space_map(sc->sc_tag, QUADRA_DAFB_BASE, 0x20,
- 0, &sc->sc_regh)) {
- panic("failed to map space for DAFB regs.");
+ if (bus_space_map(sc->sc_tag, base, 0x1000, 0, &sc->sc_regh)) {
+ printf(": failed to map DAFB register space\n");
+ return;
}
- printf(": DAFB: Monitor sense %x.\n", R4(sc,0x1C)&7);
- bus_space_unmap(sc->sc_tag, sc->sc_regh, 0x20);
+
+ sc->sc_basepa = DAFB_BASE;
+ length = 0x00100000; /* 1MB */
+
+ /* Compute the current frame buffer offset */
+ vbase1 = bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x0) & 0xfff;
+ vbase2 = bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x4) & 0xf;
+ sc->sc_fbofs = (vbase1 << 9) | (vbase2 << 5);
+#if 1
+ /*
+ * XXX The following hack exists because the DAFB v7 in these
+ * systems doesn't compute fbofs correctly. (sar 19980813)
+ */
+ switch (current_mac_model->machineid) {
+ case MACH_MACLC475:
+ case MACH_MACLC475_33:
+ case MACH_MACLC575:
+ sc->sc_fbofs = 0x1000;
+ break;
+ }
+#endif
+
+#ifdef DEBUG
+ printf(" @ %lx", sc->sc_basepa + sc->sc_fbofs);
+#endif
+ printf(": DAFB: monitor sense %x\n",
+ (bus_space_read_4(sc->sc_tag, sc->sc_regh, 0x1c) & 0x7));
+
+ bus_space_unmap(sc->sc_tag, sc->sc_regh, 0x1000);
+ break;
+ case MACH_CLASSAV:
+ sc->sc_basepa = CIVIC_BASE;
+ length = 0x00200000; /* 2MB */
+
+ if (sc->sc_basepa <= mac68k_vidphys &&
+ mac68k_vidphys < (sc->sc_basepa + length))
+ sc->sc_fbofs = mac68k_vidphys - sc->sc_basepa;
+ else
+ sc->sc_fbofs = 0;
+
+#ifdef DEBUG
+ printf(" @ %lx", sc->sc_basepa + sc->sc_fbofs);
+#endif
+ printf(": Civic\n");
break;
default:
- printf(": Internal Video\n");
+ sc->sc_basepa = m68k_trunc_page(mac68k_vidphys);
+ sc->sc_fbofs = mac68k_vidphys & PGOFSET;
+ length = mac68k_vidlen + sc->sc_fbofs;
+
+ printf(" @ %lx: On-board video\n",
+ sc->sc_basepa + sc->sc_fbofs);
break;
}
+ if (bus_space_map(sc->sc_tag, sc->sc_basepa, length, 0,
+ &sc->sc_handle)) {
+ printf("%s: failed to map video RAM\n", sc->sc_dev.dv_xname);
+ return;
+ }
+
+ if (sc->sc_basepa <= mac68k_vidphys &&
+ mac68k_vidphys < (sc->sc_basepa + length))
+ videoaddr = sc->sc_handle + sc->sc_fbofs; /* XXX big ol' hack */
+
gm = &(sc->curr_mode);
gm->mode_id = 0;
gm->psize = videobitdepth;
@@ -191,14 +303,14 @@ grfiv_attach(parent, self, aux)
gm->width = videosize & 0xffff;
gm->height = (videosize >> 16) & 0xffff;
gm->rowbytes = videorowbytes;
- gm->hres = 80; /* XXX Hack */
- gm->vres = 80; /* XXX Hack */
- gm->fbsize = gm->rowbytes * gm->height;
- gm->fbbase = (caddr_t) m68k_trunc_page(mac68k_vidlog);
- gm->fboff = mac68k_vidlog & PGOFSET;
+ gm->hres = 80; /* XXX Hack */
+ gm->vres = 80; /* XXX Hack */
+ gm->fbsize = gm->height * gm->rowbytes;
+ gm->fbbase = (caddr_t)sc->sc_handle; /* XXX yet another hack */
+ gm->fboff = sc->sc_fbofs;
/* Perform common video attachment. */
- grf_establish(sc, NULL, grfiv_mode, grfiv_phys);
+ grf_establish(sc, NULL, grfiv_mode);
}
static int
@@ -220,15 +332,3 @@ grfiv_mode(sc, cmd, arg)
}
return EINVAL;
}
-
-static caddr_t
-grfiv_phys(gp, addr)
- struct grf_softc *gp;
- vaddr_t addr;
-{
- /*
- * If we're using IIsi or similar, this will be 0.
- * If we're using IIvx or similar, this will be correct.
- */
- return (caddr_t) mac68k_vidphys;
-}
diff --git a/sys/arch/mac68k/dev/grf_mv.c b/sys/arch/mac68k/dev/grf_mv.c
index fe08c3715e6..ae2deee1206 100644
--- a/sys/arch/mac68k/dev/grf_mv.c
+++ b/sys/arch/mac68k/dev/grf_mv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: grf_mv.c,v 1.24 2005/07/23 23:28:58 martin Exp $ */
+/* $OpenBSD: grf_mv.c,v 1.25 2005/08/06 19:51:43 martin Exp $ */
/* $NetBSD: grf_nubus.c,v 1.62 2001/01/22 20:27:02 briggs Exp $ */
/*
@@ -69,7 +69,6 @@ static int grfmv_intr_radius_gsc(void *vsc);
static int grfmv_intr_radius_gx(void *vsc);
static int grfmv_mode(struct grf_softc *gp, int cmd, void *arg);
-static caddr_t grfmv_phys(struct grf_softc *gp, vaddr_t addr);
static int grfmv_match(struct device *, void *, void *);
static void grfmv_attach(struct device *, struct device *, void *);
@@ -150,9 +149,11 @@ grfmv_attach(parent, self, aux)
sc->sc_tag = na->na_tag;
sc->card_id = na->drhw;
+ sc->sc_basepa = (bus_addr_t)NUBUS_SLOT2PA(na->slot);
+ sc->sc_fbofs = 0;
- if (bus_space_map(sc->sc_tag,
- NUBUS_SLOT2PA(na->slot), NBMEMSIZE, 0, &sc->sc_regh)) {
+ if (bus_space_map(sc->sc_tag, sc->sc_basepa, NBMEMSIZE,
+ 0, &sc->sc_regh)) {
printf(": grfmv_attach: failed to map slot %d\n", na->slot);
return;
}
@@ -374,7 +375,7 @@ bad:
}
/* Perform common video attachment. */
- grf_establish(sc, &sc->sc_slot, grfmv_mode, grfmv_phys);
+ grf_establish(sc, &sc->sc_slot, grfmv_mode);
}
static int
@@ -397,15 +398,6 @@ grfmv_mode(gp, cmd, arg)
return EINVAL;
}
-static caddr_t
-grfmv_phys(gp, addr)
- struct grf_softc *gp;
- vaddr_t addr;
-{
- return (caddr_t)(NUBUS_SLOT2PA(gp->sc_slot->slot) +
- (addr - gp->sc_regh)); /* XXX evil hack */
-}
-
/* Interrupt handlers... */
/*
* Generic routine to clear interrupts for cards where it simply takes
diff --git a/sys/arch/mac68k/dev/grf_subr.c b/sys/arch/mac68k/dev/grf_subr.c
index cb25065a4f8..58c44afef60 100644
--- a/sys/arch/mac68k/dev/grf_subr.c
+++ b/sys/arch/mac68k/dev/grf_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: grf_subr.c,v 1.6 2005/07/23 23:28:58 martin Exp $ */
+/* $OpenBSD: grf_subr.c,v 1.7 2005/08/06 19:51:43 martin Exp $ */
/* $NetBSD: grf_subr.c,v 1.6 1997/02/20 00:23:28 scottr Exp $ */
/*-
@@ -48,11 +48,10 @@
#include <mac68k/dev/grfvar.h>
void
-grf_establish(sc, sp, g_mode, g_phys)
+grf_establish(sc, sp, g_mode)
struct grfbus_softc *sc;
nubus_slot *sp;
int (*g_mode)(struct grf_softc *, int, void *);
- caddr_t (*g_phys)(struct grf_softc *, vaddr_t);
{
struct grfmode *gm = &sc->curr_mode;
struct grfbus_attach_args ga;
@@ -68,8 +67,8 @@ grf_establish(sc, sp, g_mode, g_phys)
ga.ga_name = "grf";
ga.ga_grfmode = gm;
ga.ga_slot = sp;
+ ga.ga_phys = sc->sc_basepa;
ga.ga_mode = g_mode;
- ga.ga_phys = g_phys;
(void)config_found(&sc->sc_dev, &ga, grfbusprint);
}
diff --git a/sys/arch/mac68k/dev/grfvar.h b/sys/arch/mac68k/dev/grfvar.h
index 42b6e382194..4ac5a1ffb60 100644
--- a/sys/arch/mac68k/dev/grfvar.h
+++ b/sys/arch/mac68k/dev/grfvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: grfvar.h,v 1.15 2005/07/23 23:28:58 martin Exp $ */
+/* $OpenBSD: grfvar.h,v 1.16 2005/08/06 19:51:43 martin Exp $ */
/* $NetBSD: grfvar.h,v 1.11 1996/08/04 06:03:58 scottr Exp $ */
/*
@@ -48,15 +48,18 @@ 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 */
+
bus_space_tag_t sc_tag;
+ bus_space_handle_t sc_handle;
bus_space_handle_t sc_regh;
- bus_space_handle_t sc_fbh;
struct grfmode curr_mode; /* hardware desc(for ioctl) */
u_int32_t card_id; /* DrHW value for nubus cards */
- u_int32_t cli_offset; /* Offset of byte to clear intr */
+ bus_size_t cli_offset; /* Offset of byte to clear intr */
/* for cards where that's suff. */
- unsigned char cli_value; /* Value to write at cli_offset */
+ u_int32_t cli_value; /* Value to write at cli_offset */
nubus_dir board_dir; /* Nubus dir for curr board */
};
@@ -69,24 +72,26 @@ struct grf_softc {
bus_space_tag_t sc_tag;
bus_space_handle_t sc_regh;
- int sc_flags; /* software flags */
+ int sc_flags; /* driver flags */
+ u_long sc_phys; /* PA of framebuffer */
+
struct grfmode *sc_grfmode; /* forwarded ... */
nubus_slot *sc_slot;
/* mode-change on/off/mode function */
int (*sc_mode)(struct grf_softc *, int, void *);
- /* map virtual addr to physical addr */
- caddr_t (*sc_phys)(struct grf_softc *, vaddr_t);
};
/*
* Attach grf and ite semantics to Mac video hardware.
*/
struct grfbus_attach_args {
- char *ga_name; /* name of semantics to attach */
- struct grfmode *ga_grfmode; /* forwarded ... */
+ char *ga_name; /* name of semantics to attach */
+ bus_space_tag_t ga_tag;
+ bus_space_handle_t ga_handle;
+ struct grfmode *ga_grfmode;
nubus_slot *ga_slot;
- int (*ga_mode)(struct grf_softc *, int, void *);
- caddr_t (*ga_phys)(struct grf_softc *, vaddr_t);
+ bus_addr_t ga_phys;
+ int (*ga_mode)(struct grf_softc *, int, void *);
};
typedef caddr_t (*grf_phys_t)(struct grf_softc *gp, vaddr_t addr);
@@ -151,6 +156,5 @@ int grfmap(dev_t dev, caddr_t *addrp, struct proc *p);
int grfunmap(dev_t dev, caddr_t addr, struct proc *p);
void grf_establish(struct grfbus_softc *, nubus_slot *,
- int (*)(struct grf_softc *, int, void *),
- caddr_t (*)(struct grf_softc *, vaddr_t));
+ int (*)(struct grf_softc *, int, void *));
int grfbusprint(void *, const char *);
diff --git a/sys/arch/mac68k/include/grfioctl.h b/sys/arch/mac68k/include/grfioctl.h
index 95e09392207..bbc3ae5a740 100644
--- a/sys/arch/mac68k/include/grfioctl.h
+++ b/sys/arch/mac68k/include/grfioctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: grfioctl.h,v 1.5 2003/06/02 23:27:49 millert Exp $ */
+/* $OpenBSD: grfioctl.h,v 1.6 2005/08/06 19:51:44 martin Exp $ */
/* $NetBSD: grfioctl.h,v 1.5 1995/07/02 05:26:45 briggs Exp $ */
/*
@@ -66,36 +66,11 @@ struct grfmodes {
* BSD ioctls (first few match HP-UX ioctl()s. In case we want
* compatibility later, start our own at 16).
*/
-#define GRFIOCGINFO _IOR('G', 0, struct grfinfo) /* get info on device */
#define GRFIOCON _IO('G', 1) /* turn graphics on */
#define GRFIOCOFF _IO('G', 2) /* turn graphics off */
-#define GRFIOCMAP _IOWR('G', 5, int) /* map in regs+framebuffer */
-#define GRFIOCUNMAP _IOW('G', 6, int) /* unmap regs+framebuffer */
-
#define GRFIOCLISTMODES _IOWR('G', 16, struct grfmodes) /* Get list of modes */
#define GRFIOCGETMODE _IOR('G', 17, int) /* Get list of modes */
#define GRFIOCSETMODE _IOW('G', 18, int) /* Set to mode_id mode */
#define GRFIOCGMODE _IOR('G', 19, struct grfmode) /* Get list of modes */
-/*
- * Obsolete structure.
- * Only used to return information to older programs that still
- * depend on GRFIOCGINFO.
- */
-struct grfinfo {
- int gd_id; /* HP-UX identifier */
- caddr_t gd_regaddr; /* control registers physaddr */
- int gd_regsize; /* control registers size */
- caddr_t gd_fbaddr; /* frame buffer physaddr */
- int gd_fbsize; /* frame buffer size */
- short gd_colors; /* number of colors */
- short gd_planes; /* number of planes */
- int gd_fbwidth; /* frame buffer width */
- int gd_fbheight; /* frame buffer height */
- int gd_fbrowbytes; /* frame buffer rowbytes */
- int gd_dwidth; /* displayed part width */
- int gd_dheight; /* displayed part height */
- int gd_pad[6]; /* for future expansion */
-};
-
#endif /* _MAC68K_GRFIOCTL_H_ */
diff --git a/sys/arch/mac68k/mac68k/machdep.c b/sys/arch/mac68k/mac68k/machdep.c
index 31f5198ab2b..13c50d0c26b 100644
--- a/sys/arch/mac68k/mac68k/machdep.c
+++ b/sys/arch/mac68k/mac68k/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.117 2005/07/23 23:30:56 martin Exp $ */
+/* $OpenBSD: machdep.c,v 1.118 2005/08/06 19:51:44 martin Exp $ */
/* $NetBSD: machdep.c,v 1.207 1998/07/08 04:39:34 thorpej Exp $ */
/*
@@ -2044,7 +2044,7 @@ struct {
int machineid;
caddr_t fbbase;
u_long fblen;
-} intvid_info[] = {
+} intvid_info[] = {
{ MACH_MACCLASSICII, (caddr_t)0xfee09a80, 21888 },
{ MACH_MACPB140, (caddr_t)0xfee00000, 32 * 1024 },
{ MACH_MACPB145, (caddr_t)0xfee00000, 32 * 1024 },
@@ -2053,26 +2053,30 @@ struct {
{ MACH_MACPB160, (caddr_t)0x60000000, 128 * 1024 },
{ MACH_MACPB165, (caddr_t)0x60000000, 128 * 1024 },
{ MACH_MACPB180, (caddr_t)0x60000000, 128 * 1024 },
+ { MACH_MACIICI, (caddr_t)0x0, 320 * 1024 },
+ { MACH_MACIISI, (caddr_t)0x0, 320 * 1024 },
{ MACH_MACCCLASSIC, (caddr_t)0x50f40000, 512 * 1024 },
{ MACH_MACPB165C, (caddr_t)0xfc040000, 512 * 1024 },
{ MACH_MACPB180C, (caddr_t)0xfc040000, 512 * 1024 },
{ MACH_MACPB500, (caddr_t)0x60000000, 512 * 1024 },
- { MACH_MACLC520, (caddr_t)0x60000000, 1024 * 1024 },
- { MACH_MACLC475, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACLC475_33, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACLC575, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACC610, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACC650, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACP580, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ605, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ605_33, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ610, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ630, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ650, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ700, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ800, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ900, (caddr_t)0xf9000000, 1024 * 1024 },
- { MACH_MACQ950, (caddr_t)0xf9000000, 1024 * 1024 },
+ { MACH_MACLC520, (caddr_t)0x60000000, 1 * 1024 * 1024 },
+ { MACH_MACLC475, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACLC475_33, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACLC575, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACC610, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACC650, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACP580, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ605, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ605_33, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ610, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ630, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ650, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACC660AV, (caddr_t)0x50100000, 1 * 1024 * 1024 },
+ { MACH_MACQ700, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ800, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ900, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ950, (caddr_t)0xf9000000, 1 * 1024 * 1024 },
+ { MACH_MACQ840AV, (caddr_t)0x50100000, 2 * 1024 * 1024 },
{ 0, (caddr_t)0x0, 0 },
}; /* End of intvid_info[] initialization. */
@@ -2277,7 +2281,6 @@ setmachdep()
{
int setup_mrg_vectors = 0;
struct cpu_model_info *cpui;
- int i;
/*
* First, set things that need to be set on the first pass only
@@ -2397,19 +2400,6 @@ setmachdep()
}
/*
- * Set `internal' framebuffer location and length, if we know
- * what they are.
- */
- for (i = 0; intvid_info[i].machineid; i++) {
- if (mac68k_machine.machineid == intvid_info[i].machineid) {
- mac68k_vidlog = mac68k_vidphys =
- (u_int32_t)intvid_info[i].fbbase;
- mac68k_vidlen = (u_int32_t)intvid_info[i].fblen;
- break;
- }
- }
-
- /*
* Set up current ROM Glue vectors. Actually now all we do
* is save the address of the ROM Glue Vector table. This gets
* used later when we re-map the vectors from MacOS Address
@@ -2558,10 +2548,10 @@ extern int get_pte(u_int addr, u_long pte[2], u_short * psr);
u_long
get_physical(u_int addr, u_long * phys)
{
+ extern u_int macos_tc;
u_long pte[2], ph, mask;
u_short psr;
int i, numbits;
- extern u_int macos_tc;
if (mmutype == MMU_68040) {
ph = ptest040((caddr_t)addr, FC_SUPERD);
@@ -2688,15 +2678,46 @@ get_mapping(void)
}
#endif
+ /*
+ * Find on-board video, if we have an idea of where to look
+ * on this system.
+ */
+ for (i = 0; intvid_info[i].machineid; i++)
+ if (mac68k_machine.machineid == intvid_info[i].machineid)
+ break;
+
+ if (mac68k_machine.machineid == intvid_info[i].machineid &&
+ get_physical(videoaddr, &phys) &&
+ phys >= (u_long)intvid_info[i].fbbase &&
+ phys < (u_long)(intvid_info[i].fbbase + intvid_info[i].fblen)) {
+ mac68k_vidphys = phys;
+ mac68k_vidlen = 32768;
+ if (mac68k_vidlen > intvid_info[i].fblen) {
+ mac68k_vidlen = intvid_info[i].fblen;
+ } else {
+ addr = videoaddr + 32768;
+ while (get_physical(addr, &phys)) {
+ if ((phys - mac68k_vidphys) != mac68k_vidlen)
+ break;
+ if (mac68k_vidlen + 32768 >
+ intvid_info[i].fblen) {
+ mac68k_vidlen = intvid_info[i].fblen;
+ break;
+ }
+ mac68k_vidlen += 32768;
+ addr += 32768;
+ }
+ }
+ }
+
if (mac68k_vidlen > 0) {
/*
- * We've already figured out where internal video is in
- * setmachdep() (by using intvid_info[]). Tell the user
- * what we know.
+ * We've already figured out where internal video is.
+ * Tell the user what we know.
*/
#ifdef DIAGNOSTIC
- printf("On-board video at addr 0x%x (phys 0x%x), len 0x%x.\n",
- mac68k_vidlog, mac68k_vidphys, mac68k_vidlen);
+ printf("On-board video at addr 0x%lx (phys 0x%x), len 0x%x.\n",
+ videoaddr, mac68k_vidphys, mac68k_vidlen);
#endif
} else {
/*
diff --git a/sys/arch/mac68k/mac68k/pmap_bootstrap.c b/sys/arch/mac68k/mac68k/pmap_bootstrap.c
index 9b01d5b12e9..5533ad6a0f9 100644
--- a/sys/arch/mac68k/mac68k/pmap_bootstrap.c
+++ b/sys/arch/mac68k/mac68k/pmap_bootstrap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap_bootstrap.c,v 1.30 2005/08/01 12:10:23 miod Exp $ */
+/* $OpenBSD: pmap_bootstrap.c,v 1.31 2005/08/06 19:51:44 martin Exp $ */
/* $NetBSD: pmap_bootstrap.c,v 1.50 1999/04/07 06:14:33 scottr Exp $ */
/*
@@ -67,7 +67,6 @@ u_long high[8];
u_long maxaddr; /* PA of the last physical page */
int vidlen;
#define VIDMAPSIZE btoc(vidlen)
-extern u_int32_t mac68k_vidlog;
extern u_int32_t mac68k_vidphys;
extern u_int32_t videoaddr;
extern u_int32_t videorowbytes;
@@ -166,8 +165,6 @@ do { \
if (vidlen != 0) { \
newvideoaddr = iiobase + m68k_ptob(IIOMAPSIZE + ROMMAPSIZE) \
+ (mac68k_vidphys & PGOFSET); \
- if (mac68k_vidlog) \
- mac68k_vidlog = newvideoaddr; \
} \
} while (0)