Module Name:    src
Committed By:   rkujawa
Date:           Fri Nov  9 19:50:22 UTC 2012

Modified Files:
        src/sys/dev/pci: voodoofb.c

Log Message:
Differentiate between Voodoo 3 and Voodoo Banshee (MAX_CLOCK).
Ok'd by macallan@.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/pci/voodoofb.c

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/voodoofb.c
diff -u src/sys/dev/pci/voodoofb.c:1.42 src/sys/dev/pci/voodoofb.c:1.43
--- src/sys/dev/pci/voodoofb.c:1.42	Fri Nov  9 11:28:40 2012
+++ src/sys/dev/pci/voodoofb.c	Fri Nov  9 19:50:22 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: voodoofb.c,v 1.42 2012/11/09 11:28:40 rkujawa Exp $	*/
+/*	$NetBSD: voodoofb.c,v 1.43 2012/11/09 19:50:22 rkujawa Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2012 Michael Lorenz
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: voodoofb.c,v 1.42 2012/11/09 11:28:40 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: voodoofb.c,v 1.43 2012/11/09 19:50:22 rkujawa Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -82,6 +82,11 @@ struct voodoofb_softc {
 	bus_size_t sc_regsize, sc_fbsize, sc_ioregsize;
 
 	void *sc_ih;
+
+#define MAX_CLOCK_VB	270000	/* Voodoo Banshee */
+#define MAX_CLOCK_V3	300000	/* Voodoo3 */
+#define MAX_CLOCK_V45	350000	/* Voodoo4/5 (not yet) */
+	uint32_t sc_max_clock;
 	
 	size_t sc_memsize;
 	int sc_memtype;
@@ -340,7 +345,6 @@ voodoofb_match(device_t parent, cfdata_t
 	    (PCI_PRODUCT(pa->pa_id)>=PCI_PRODUCT_3DFX_VOODOO3))
 		return 100;
 
-	/* XXX: Banshee has different MAX_CLOCK, but otherwise is almost same */
 	if ((PCI_VENDOR(pa->pa_id)==PCI_VENDOR_3DFX) && 
 	    (PCI_PRODUCT(pa->pa_id)>=PCI_PRODUCT_3DFX_BANSHEE))
 		return 100;
@@ -376,6 +380,11 @@ voodoofb_attach(device_t parent, device_
 	sc->sc_iot = pa->pa_iot;
 	sc->sc_pa = *pa;
 
+	if (PCI_PRODUCT(pa->pa_id)>=PCI_PRODUCT_3DFX_BANSHEE)
+		sc->sc_max_clock = MAX_CLOCK_VB;
+	else
+		sc->sc_max_clock = MAX_CLOCK_V3;
+
 	/* the framebuffer */
 	if (pci_mapreg_info(sc->sc_pc, sc->sc_pcitag, 0x14, PCI_MAPREG_TYPE_MEM,
 	    &sc->sc_fb, &sc->sc_fbsize, &flags)) {
@@ -1663,7 +1672,6 @@ voodoofb_init(struct voodoofb_softc *sc)
 	voodoofb_wait_idle(sc);
 }
 
-#define MAX_CLOCK 250000	/* all Voodoo3 should support that */
 #define MAX_HRES  1700		/*
 				 * XXX in theory we can go higher but I
 				 * couldn't get anything above 1680 x 1200
@@ -1671,7 +1679,7 @@ voodoofb_init(struct voodoofb_softc *sc)
 				 * disabled so people won't end up with a
 				 * blank screen
 				 */
-#define MODE_IS_VALID(m) (((m)->dot_clock <= MAX_CLOCK) && \
+#define MODE_IS_VALID(m, mclk) (((m)->dot_clock <= (mclk)) && \
 					    ((m)->hdisplay < MAX_HRES))
 static void
 voodoofb_setup_i2c(struct voodoofb_softc *sc)
@@ -1719,7 +1727,7 @@ voodoofb_setup_i2c(struct voodoofb_softc
 			if ((sc->sc_edid_info.edid_preferred_mode != NULL)) {
 				struct videomode *m =
 				    sc->sc_edid_info.edid_preferred_mode;
-				if (MODE_IS_VALID(m)) {
+				if (MODE_IS_VALID(m, sc->sc_max_clock)) {
 					sc->sc_videomode = m;
 				} else {
 					aprint_error_dev(sc->sc_dev,
@@ -1740,7 +1748,8 @@ voodoofb_setup_i2c(struct voodoofb_softc
 				    sc->sc_edid_info.edid_nmodes);
 				while ((sc->sc_videomode == NULL) &&
 				       (n < sc->sc_edid_info.edid_nmodes)) {
-					if (MODE_IS_VALID(&m[n])) {
+					if (MODE_IS_VALID(&m[n], 
+					    sc->sc_max_clock)) {
 						sc->sc_videomode = &m[n];
 					}
 					n++;

Reply via email to