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++;