Module Name:    src
Committed By:   macallan
Date:           Thu Dec 20 03:08:39 UTC 2012

Modified Files:
        src/sys/dev/pci: radeonfb.c radeonfbvar.h

Log Message:
don't access registers when they're not mapped
now X works on i386 with radeonfb


To generate a diff of this commit:
cvs rdiff -u -r1.67 -r1.68 src/sys/dev/pci/radeonfb.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/pci/radeonfbvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/radeonfb.c
diff -u src/sys/dev/pci/radeonfb.c:1.67 src/sys/dev/pci/radeonfb.c:1.68
--- src/sys/dev/pci/radeonfb.c:1.67	Thu Dec 20 02:58:32 2012
+++ src/sys/dev/pci/radeonfb.c	Thu Dec 20 03:08:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: radeonfb.c,v 1.67 2012/12/20 02:58:32 macallan Exp $ */
+/*	$NetBSD: radeonfb.c,v 1.68 2012/12/20 03:08:39 macallan Exp $ */
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeonfb.c,v 1.67 2012/12/20 02:58:32 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeonfb.c,v 1.68 2012/12/20 03:08:39 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -547,6 +547,8 @@ radeonfb_attach(device_t parent, device_
 	}
 	sc->sc_romt = sc->sc_memt;
 
+	sc->sc_mapped = TRUE;
+
 	/* scratch register test... */
 	if (radeonfb_scratch_test(sc, RADEON_BIOS_0_SCRATCH, 0x55555555) ||
 	    radeonfb_scratch_test(sc, RADEON_BIOS_0_SCRATCH, 0xaaaaaaaa)) {
@@ -974,24 +976,32 @@ error:
 static void
 radeonfb_map(struct radeonfb_softc *sc)
 {
-	if (bus_space_map(sc->sc_regt, sc->sc_regaddr, sc->sc_regsz, 0,
-	    &sc->sc_regh) != 0) {
-		aprint_error("%s: unable to map registers!\n", XNAME(sc));
-		return;
-	}
-	if (bus_space_map(sc->sc_memt, sc->sc_memaddr, sc->sc_memsz,
-		BUS_SPACE_MAP_LINEAR, &sc->sc_memh) != 0) {
-		sc->sc_memsz = 0;
-		aprint_error("%s: Unable to map frame buffer\n", XNAME(sc));
-		return;
+	if (!sc->sc_mapped) {
+		if (bus_space_map(sc->sc_regt, sc->sc_regaddr, sc->sc_regsz, 0,
+		    &sc->sc_regh) != 0) {
+			aprint_error_dev(sc->sc_dev, 
+			    "unable to map registers!\n");
+			return;
+		}
+		if (bus_space_map(sc->sc_memt, sc->sc_memaddr, sc->sc_memsz,
+		    BUS_SPACE_MAP_LINEAR, &sc->sc_memh) != 0) {
+			sc->sc_memsz = 0;
+			aprint_error_dev(sc->sc_dev,
+			    "Unable to map frame buffer\n");
+			return;
+		}
+		sc->sc_mapped = TRUE;
 	}
 }
 
 static void
 radeonfb_unmap(struct radeonfb_softc *sc)
 {
-	bus_space_unmap(sc->sc_regt, sc->sc_regh, sc->sc_regsz);
-	bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsz);
+	if (sc->sc_mapped) {
+		bus_space_unmap(sc->sc_regt, sc->sc_regh, sc->sc_regsz);
+		bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsz);
+		sc->sc_mapped = FALSE;
+	}
 }
 
 static int
@@ -2177,6 +2187,9 @@ radeonfb_isblank(struct radeonfb_display
 {
 	uint32_t	reg, mask;
 
+	if(!dp->rd_softc->sc_mapped)
+		return 1;
+
 	if (dp->rd_crtcs[0].rc_number) {
 		reg = RADEON_CRTC2_GEN_CNTL;
 		mask = RADEON_CRTC2_DISP_DIS;
@@ -2195,6 +2208,9 @@ radeonfb_blank(struct radeonfb_display *
 	uint32_t		fpreg, fpval;
 	int			i;
 
+	if (!sc->sc_mapped)
+		return;
+
 	for (i = 0; i < dp->rd_ncrtcs; i++) {
 
 		if (dp->rd_crtcs[i].rc_number) {

Index: src/sys/dev/pci/radeonfbvar.h
diff -u src/sys/dev/pci/radeonfbvar.h:1.16 src/sys/dev/pci/radeonfbvar.h:1.17
--- src/sys/dev/pci/radeonfbvar.h:1.16	Thu Mar 15 05:47:19 2012
+++ src/sys/dev/pci/radeonfbvar.h	Thu Dec 20 03:08:39 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: radeonfbvar.h,v 1.16 2012/03/15 05:47:19 macallan Exp $ */
+/* $NetBSD: radeonfbvar.h,v 1.17 2012/12/20 03:08:39 macallan Exp $ */
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -233,6 +233,8 @@ struct radeonfb_softc {
 	bus_size_t		sc_iosz;
 	bus_addr_t		sc_ioaddr;
 
+	int			sc_mapped;
+
 	/* size of a single display */
 	int			sc_maxx;
 	int			sc_maxy;

Reply via email to