Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Differentiate between Voodoo 3 and Voodoo Banshe...



details:   https://anonhg.NetBSD.org/src/rev/5a160781e1ed
branches:  trunk
changeset: 782626:5a160781e1ed
user:      rkujawa <rkujawa%NetBSD.org@localhost>
date:      Fri Nov 09 19:50:22 2012 +0000

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

diffstat:

 sys/dev/pci/voodoofb.c |  23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diffs (86 lines):

diff -r afe32c96f73b -r 5a160781e1ed sys/dev/pci/voodoofb.c
--- a/sys/dev/pci/voodoofb.c    Fri Nov 09 19:47:11 2012 +0000
+++ b/sys/dev/pci/voodoofb.c    Fri Nov 09 19:50:22 2012 +0000
@@ -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 @@
        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 @@
            (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 @@
        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_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 @@
                                 * 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 @@
                        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 @@
                                    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++;



Home | Main Index | Thread Index | Old Index