Allow mmap of frame buffer registers.

This commit is contained in:
tsubai 2000-06-19 19:35:20 +00:00
parent 78d67d6053
commit 1155f3af58
2 changed files with 28 additions and 8 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ofb.c,v 1.12 2000/04/02 12:53:05 tsubai Exp $ */
/* $NetBSD: ofb.c,v 1.13 2000/06/19 19:35:20 tsubai Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@ -46,6 +46,8 @@
#include <dev/wscons/wsdisplayvar.h>
#include <dev/rasops/rasops.h>
#include <dev/ofw/ofw_pci.h>
#include <machine/bus.h>
#include <machine/grfioctl.h>
@ -154,6 +156,9 @@ ofbattach(parent, self, aux)
}
sc->sc_dc = dc;
OF_getprop(dc->dc_node, "assigned-addresses", sc->sc_addrs,
sizeof(sc->sc_addrs));
if (dc->dc_paddr == 0) {
printf(": cannot map framebuffer\n");
return;
@ -185,6 +190,7 @@ ofb_common_init(node, dc)
struct rasops_info *ri = &dc->dc_ri;
int32_t addr, width, height, linebytes, depth;
dc->dc_node = node;
if (dc->dc_ih == 0) {
char name[64];
@ -319,11 +325,25 @@ ofb_mmap(v, offset, prot)
struct ofb_softc *sc = v;
struct ofb_devconfig *dc = sc->sc_dc;
struct rasops_info *ri = &dc->dc_ri;
u_int32_t *ap = sc->sc_addrs;
paddr_t pa;
int i;
if (offset >= (ri->ri_stride * ri->ri_height) || offset < 0)
return -1;
if (offset >=0 && offset < (ri->ri_stride * ri->ri_height))
return dc->dc_paddr + offset;
return dc->dc_paddr + offset;
pa = offset;
for (i = 0; i < 6; i++) {
switch (ap[0] & OFW_PCI_PHYS_HI_SPACEMASK) {
case OFW_PCI_PHYS_HI_SPACE_MEM32:
if (pa >= ap[2] && pa < ap[2] + ap[4])
return pa;
/* XXX I/O space? */
}
ap += 5;
}
return -1;
}
int

View File

@ -1,4 +1,4 @@
/* $NetBSD: ofbvar.h,v 1.2 2000/02/09 13:08:36 tsubai Exp $ */
/* $NetBSD: ofbvar.h,v 1.3 2000/06/19 19:35:21 tsubai Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@ -29,17 +29,17 @@
struct ofb_devconfig {
paddr_t dc_paddr; /* physcal address */
int dc_node; /* phandle of this node */
int dc_ih; /* ihandle of this node */
struct rasops_info dc_ri;
};
struct ofb_softc {
struct device sc_dev;
struct ofb_devconfig *sc_dc; /* device configuration */
struct ofb_devconfig *sc_dc; /* device configuration */
int nscreens;
u_int32_t sc_addrs[30]; /* "assigned-addresses" storage */
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];