159747216SDoug Rabson /*- 259747216SDoug Rabson * Copyright (c) 2000 Doug Rabson 359747216SDoug Rabson * All rights reserved. 459747216SDoug Rabson * 559747216SDoug Rabson * Redistribution and use in source and binary forms, with or without 659747216SDoug Rabson * modification, are permitted provided that the following conditions 759747216SDoug Rabson * are met: 859747216SDoug Rabson * 1. Redistributions of source code must retain the above copyright 959747216SDoug Rabson * notice, this list of conditions and the following disclaimer. 1059747216SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 1159747216SDoug Rabson * notice, this list of conditions and the following disclaimer in the 1259747216SDoug Rabson * documentation and/or other materials provided with the distribution. 1359747216SDoug Rabson * 1459747216SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1559747216SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1659747216SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1759747216SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1859747216SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1959747216SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2059747216SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2159747216SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2259747216SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2359747216SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2459747216SDoug Rabson * SUCH DAMAGE. 2559747216SDoug Rabson */ 2659747216SDoug Rabson 27f4636c59SDavid E. O'Brien #include <sys/cdefs.h> 28f4636c59SDavid E. O'Brien __FBSDID("$FreeBSD$"); 29f4636c59SDavid E. O'Brien 3059747216SDoug Rabson #include "opt_bus.h" 3159747216SDoug Rabson 3259747216SDoug Rabson #include <sys/param.h> 3359747216SDoug Rabson #include <sys/systm.h> 3459747216SDoug Rabson #include <sys/malloc.h> 3559747216SDoug Rabson #include <sys/kernel.h> 3659747216SDoug Rabson #include <sys/bus.h> 3759747216SDoug Rabson #include <sys/lock.h> 387e9e7dc4SBruce Evans #include <sys/lockmgr.h> 3923955314SAlfred Perlstein #include <sys/mutex.h> 4052b3919dSJohn Baldwin #include <sys/proc.h> 4159747216SDoug Rabson 4219b7ffd1SWarner Losh #include <dev/pci/pcivar.h> 4319b7ffd1SWarner Losh #include <dev/pci/pcireg.h> 4459747216SDoug Rabson #include <pci/agppriv.h> 4559747216SDoug Rabson #include <pci/agpreg.h> 4659747216SDoug Rabson 4759747216SDoug Rabson #include <vm/vm.h> 4859747216SDoug Rabson #include <vm/vm_object.h> 4959747216SDoug Rabson #include <vm/pmap.h> 5059747216SDoug Rabson 514fb8dd97SJohn Baldwin #define MAX_APSIZE 0x3f /* 256 MB */ 524fb8dd97SJohn Baldwin 5359747216SDoug Rabson struct agp_intel_softc { 5459747216SDoug Rabson struct agp_softc agp; 5559747216SDoug Rabson u_int32_t initial_aperture; /* aperture size at startup */ 5659747216SDoug Rabson struct agp_gatt *gatt; 574fb8dd97SJohn Baldwin u_int aperture_mask; 5859747216SDoug Rabson }; 5959747216SDoug Rabson 6059747216SDoug Rabson static const char* 6159747216SDoug Rabson agp_intel_match(device_t dev) 6259747216SDoug Rabson { 6359747216SDoug Rabson if (pci_get_class(dev) != PCIC_BRIDGE 6459747216SDoug Rabson || pci_get_subclass(dev) != PCIS_BRIDGE_HOST) 6559747216SDoug Rabson return NULL; 6659747216SDoug Rabson 6759747216SDoug Rabson if (agp_find_caps(dev) == 0) 6859747216SDoug Rabson return NULL; 6959747216SDoug Rabson 7059747216SDoug Rabson switch (pci_get_devid(dev)) { 7159747216SDoug Rabson /* Intel -- vendor 0x8086 */ 7259747216SDoug Rabson case 0x71808086: 7359747216SDoug Rabson return ("Intel 82443LX (440 LX) host to PCI bridge"); 7459747216SDoug Rabson 7559747216SDoug Rabson case 0x71908086: 7659747216SDoug Rabson return ("Intel 82443BX (440 BX) host to PCI bridge"); 7759747216SDoug Rabson 7859747216SDoug Rabson case 0x71a08086: 7959747216SDoug Rabson return ("Intel 82443GX host to PCI bridge"); 8059747216SDoug Rabson 8159747216SDoug Rabson case 0x71a18086: 8259747216SDoug Rabson return ("Intel 82443GX host to AGP bridge"); 836fdfeafdSAndrey A. Chernov 846fdfeafdSAndrey A. Chernov case 0x11308086: 856fdfeafdSAndrey A. Chernov return ("Intel 82815 (i815 GMCH) host to PCI bridge"); 866183dc49SJun Kuriyama 876183dc49SJun Kuriyama case 0x25008086: 8855dbef54SEric Anholt case 0x25018086: 896183dc49SJun Kuriyama return ("Intel 82820 host to AGP bridge"); 906183dc49SJun Kuriyama 9164eecf3aSBenno Rice case 0x35758086: 9264eecf3aSBenno Rice return ("Intel 82830 host to AGP bridge"); 9364eecf3aSBenno Rice 946183dc49SJun Kuriyama case 0x1a218086: 956183dc49SJun Kuriyama return ("Intel 82840 host to AGP bridge"); 966183dc49SJun Kuriyama 976183dc49SJun Kuriyama case 0x1a308086: 986183dc49SJun Kuriyama return ("Intel 82845 host to AGP bridge"); 996183dc49SJun Kuriyama 1006183dc49SJun Kuriyama case 0x25308086: 1016183dc49SJun Kuriyama return ("Intel 82850 host to AGP bridge"); 1026183dc49SJun Kuriyama 103b02d3a97SMatthew N. Dodd case 0x33408086: 104b02d3a97SMatthew N. Dodd return ("Intel 82855 host to AGP bridge"); 105b02d3a97SMatthew N. Dodd 1066183dc49SJun Kuriyama case 0x25318086: 1076183dc49SJun Kuriyama return ("Intel 82860 host to AGP bridge"); 108e9ff34a5SJohn Baldwin 109e9ff34a5SJohn Baldwin case 0x25708086: 110e9ff34a5SJohn Baldwin return ("Intel 82865 host to AGP bridge"); 111b02d3a97SMatthew N. Dodd 112b02d3a97SMatthew N. Dodd case 0x25788086: 113b02d3a97SMatthew N. Dodd return ("Intel 82875P host to AGP bridge"); 11459747216SDoug Rabson }; 11559747216SDoug Rabson 11659747216SDoug Rabson if (pci_get_vendor(dev) == 0x8086) 11759747216SDoug Rabson return ("Intel Generic host to PCI bridge"); 11859747216SDoug Rabson 11959747216SDoug Rabson return NULL; 12059747216SDoug Rabson } 12159747216SDoug Rabson 12259747216SDoug Rabson static int 12359747216SDoug Rabson agp_intel_probe(device_t dev) 12459747216SDoug Rabson { 12559747216SDoug Rabson const char *desc; 12659747216SDoug Rabson 12759747216SDoug Rabson desc = agp_intel_match(dev); 12859747216SDoug Rabson if (desc) { 12959747216SDoug Rabson device_verbose(dev); 13059747216SDoug Rabson device_set_desc(dev, desc); 13159747216SDoug Rabson return 0; 13259747216SDoug Rabson } 13359747216SDoug Rabson 13459747216SDoug Rabson return ENXIO; 13559747216SDoug Rabson } 13659747216SDoug Rabson 13759747216SDoug Rabson static int 13859747216SDoug Rabson agp_intel_attach(device_t dev) 13959747216SDoug Rabson { 14059747216SDoug Rabson struct agp_intel_softc *sc = device_get_softc(dev); 14159747216SDoug Rabson struct agp_gatt *gatt; 1426183dc49SJun Kuriyama u_int32_t type = pci_get_devid(dev); 143ebca65b6SJohn Baldwin u_int32_t value; 14459747216SDoug Rabson int error; 14559747216SDoug Rabson 14659747216SDoug Rabson error = agp_generic_attach(dev); 14759747216SDoug Rabson if (error) 14859747216SDoug Rabson return error; 14959747216SDoug Rabson 1504fb8dd97SJohn Baldwin /* Determine maximum supported aperture size. */ 1514fb8dd97SJohn Baldwin value = pci_read_config(dev, AGP_INTEL_APSIZE, 1); 1524fb8dd97SJohn Baldwin pci_write_config(dev, AGP_INTEL_APSIZE, MAX_APSIZE, 1); 1534fb8dd97SJohn Baldwin sc->aperture_mask = pci_read_config(dev, AGP_INTEL_APSIZE, 1) & 1544fb8dd97SJohn Baldwin MAX_APSIZE; 1554fb8dd97SJohn Baldwin pci_write_config(dev, AGP_INTEL_APSIZE, value, 1); 15659747216SDoug Rabson sc->initial_aperture = AGP_GET_APERTURE(dev); 15759747216SDoug Rabson 15859747216SDoug Rabson for (;;) { 15959747216SDoug Rabson gatt = agp_alloc_gatt(dev); 16059747216SDoug Rabson if (gatt) 16159747216SDoug Rabson break; 16259747216SDoug Rabson 16359747216SDoug Rabson /* 16459747216SDoug Rabson * Probably contigmalloc failure. Try reducing the 16559747216SDoug Rabson * aperture so that the gatt size reduces. 16659747216SDoug Rabson */ 16759747216SDoug Rabson if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) { 16859747216SDoug Rabson agp_generic_detach(dev); 16959747216SDoug Rabson return ENOMEM; 17059747216SDoug Rabson } 17159747216SDoug Rabson } 17259747216SDoug Rabson sc->gatt = gatt; 17359747216SDoug Rabson 17459747216SDoug Rabson /* Install the gatt. */ 17559747216SDoug Rabson pci_write_config(dev, AGP_INTEL_ATTBASE, gatt->ag_physical, 4); 17659747216SDoug Rabson 17780348907SJohn Baldwin /* Enable the GLTB and setup the control register. */ 17880348907SJohn Baldwin switch (type) { 17980348907SJohn Baldwin case 0x71908086: /* 440LX/EX */ 18080348907SJohn Baldwin pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2080, 4); 18180348907SJohn Baldwin break; 18280348907SJohn Baldwin case 0x71808086: /* 440BX */ 18380348907SJohn Baldwin /* 18480348907SJohn Baldwin * XXX: Should be 0xa080? Bit 9 is undefined, and 18580348907SJohn Baldwin * bit 13 being on and bit 15 being clear is illegal. 18680348907SJohn Baldwin */ 18780348907SJohn Baldwin pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2280, 4); 18880348907SJohn Baldwin break; 18980348907SJohn Baldwin default: 190e9ff34a5SJohn Baldwin value = pci_read_config(dev, AGP_INTEL_AGPCTRL, 4); 191e9ff34a5SJohn Baldwin pci_write_config(dev, AGP_INTEL_AGPCTRL, value | 0x80, 4); 19280348907SJohn Baldwin } 19380348907SJohn Baldwin 19459747216SDoug Rabson /* Enable things, clear errors etc. */ 1956183dc49SJun Kuriyama switch (type) { 1966183dc49SJun Kuriyama case 0x1a218086: /* i840 */ 1976183dc49SJun Kuriyama case 0x25308086: /* i850 */ 1986183dc49SJun Kuriyama case 0x25318086: /* i860 */ 1996183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_MCHCFG, 2006183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_MCHCFG, 2) 2016183dc49SJun Kuriyama | (1 << 9)), 2); 2026183dc49SJun Kuriyama break; 2036183dc49SJun Kuriyama 2046183dc49SJun Kuriyama case 0x25008086: /* i820 */ 20555dbef54SEric Anholt case 0x25018086: /* i820 */ 2066183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_I820_RDCR, 2076183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I820_RDCR, 1) 2086183dc49SJun Kuriyama | (1 << 1)), 1); 2096183dc49SJun Kuriyama break; 2106183dc49SJun Kuriyama 2116183dc49SJun Kuriyama case 0x1a308086: /* i845 */ 212b02d3a97SMatthew N. Dodd case 0x33408086: /* i855 */ 213e9ff34a5SJohn Baldwin case 0x25708086: /* i865 */ 214b02d3a97SMatthew N. Dodd case 0x25788086: /* i875P */ 2156183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_I845_MCHCFG, 2166183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1) 2176183dc49SJun Kuriyama | (1 << 1)), 1); 2186183dc49SJun Kuriyama break; 2196183dc49SJun Kuriyama 2206183dc49SJun Kuriyama default: /* Intel Generic (maybe) */ 22159747216SDoug Rabson pci_write_config(dev, AGP_INTEL_NBXCFG, 22259747216SDoug Rabson (pci_read_config(dev, AGP_INTEL_NBXCFG, 4) 22359747216SDoug Rabson & ~(1 << 10)) | (1 << 9), 4); 2246183dc49SJun Kuriyama } 2256183dc49SJun Kuriyama 2266183dc49SJun Kuriyama switch (type) { 2276183dc49SJun Kuriyama case 0x1a218086: /* i840 */ 2286183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0xc000, 2); 2296183dc49SJun Kuriyama break; 2306183dc49SJun Kuriyama 2316183dc49SJun Kuriyama case 0x25008086: /* i820 */ 23255dbef54SEric Anholt case 0x25018086: /* i820 */ 2336183dc49SJun Kuriyama case 0x1a308086: /* i845 */ 2346183dc49SJun Kuriyama case 0x25308086: /* i850 */ 235b02d3a97SMatthew N. Dodd case 0x33408086: /* i855 */ 2366183dc49SJun Kuriyama case 0x25318086: /* i860 */ 237e9ff34a5SJohn Baldwin case 0x25708086: /* i865 */ 238b02d3a97SMatthew N. Dodd case 0x25788086: /* i875P */ 239e9ff34a5SJohn Baldwin pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0x00ff, 2); 2406183dc49SJun Kuriyama break; 2416183dc49SJun Kuriyama 2426183dc49SJun Kuriyama default: /* Intel Generic (maybe) */ 24359747216SDoug Rabson pci_write_config(dev, AGP_INTEL_ERRSTS + 1, 7, 1); 2446183dc49SJun Kuriyama } 24559747216SDoug Rabson 24659747216SDoug Rabson return 0; 24759747216SDoug Rabson } 24859747216SDoug Rabson 24959747216SDoug Rabson static int 25059747216SDoug Rabson agp_intel_detach(device_t dev) 25159747216SDoug Rabson { 25259747216SDoug Rabson struct agp_intel_softc *sc = device_get_softc(dev); 2536183dc49SJun Kuriyama u_int32_t type = pci_get_devid(dev); 25459747216SDoug Rabson int error; 25559747216SDoug Rabson 25659747216SDoug Rabson error = agp_generic_detach(dev); 25759747216SDoug Rabson if (error) 25859747216SDoug Rabson return error; 25959747216SDoug Rabson 2606183dc49SJun Kuriyama switch (type) { 2616183dc49SJun Kuriyama case 0x1a218086: /* i840 */ 2626183dc49SJun Kuriyama case 0x25308086: /* i850 */ 2636183dc49SJun Kuriyama case 0x25318086: /* i860 */ 2646e551fb6SDavid E. O'Brien printf("%s: set MCHCFG to %x\n", __func__, (unsigned) 2656183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_MCHCFG, 2) 2666183dc49SJun Kuriyama & ~(1 << 9))); 2676183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_MCHCFG, 2686183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_MCHCFG, 2) 2696183dc49SJun Kuriyama & ~(1 << 9)), 2); 2706183dc49SJun Kuriyama 2716183dc49SJun Kuriyama case 0x25008086: /* i820 */ 27255dbef54SEric Anholt case 0x25018086: /* i820 */ 2736e551fb6SDavid E. O'Brien printf("%s: set RDCR to %x\n", __func__, (unsigned) 2746183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I820_RDCR, 1) 2756183dc49SJun Kuriyama & ~(1 << 1))); 2766183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_I820_RDCR, 2776183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I820_RDCR, 1) 2786183dc49SJun Kuriyama & ~(1 << 1)), 1); 2796183dc49SJun Kuriyama 2806183dc49SJun Kuriyama case 0x1a308086: /* i845 */ 281b02d3a97SMatthew N. Dodd case 0x33408086: /* i855 */ 282e9ff34a5SJohn Baldwin case 0x25708086: /* i865 */ 283b02d3a97SMatthew N. Dodd case 0x25788086: /* i875P */ 2846e551fb6SDavid E. O'Brien printf("%s: set MCHCFG to %x\n", __func__, (unsigned) 2856183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1) 2866183dc49SJun Kuriyama & ~(1 << 1))); 2876183dc49SJun Kuriyama pci_write_config(dev, AGP_INTEL_MCHCFG, 2886183dc49SJun Kuriyama (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1) 2896183dc49SJun Kuriyama & ~(1 << 1)), 1); 2906183dc49SJun Kuriyama 2916183dc49SJun Kuriyama default: /* Intel Generic (maybe) */ 2926e551fb6SDavid E. O'Brien printf("%s: set NBXCFG to %x\n", __func__, 29359747216SDoug Rabson (pci_read_config(dev, AGP_INTEL_NBXCFG, 4) 29459747216SDoug Rabson & ~(1 << 9))); 29559747216SDoug Rabson pci_write_config(dev, AGP_INTEL_NBXCFG, 29659747216SDoug Rabson (pci_read_config(dev, AGP_INTEL_NBXCFG, 4) 29759747216SDoug Rabson & ~(1 << 9)), 4); 2986183dc49SJun Kuriyama } 29959747216SDoug Rabson pci_write_config(dev, AGP_INTEL_ATTBASE, 0, 4); 30059747216SDoug Rabson AGP_SET_APERTURE(dev, sc->initial_aperture); 30159747216SDoug Rabson agp_free_gatt(sc->gatt); 30259747216SDoug Rabson 30359747216SDoug Rabson return 0; 30459747216SDoug Rabson } 30559747216SDoug Rabson 30659747216SDoug Rabson static u_int32_t 30759747216SDoug Rabson agp_intel_get_aperture(device_t dev) 30859747216SDoug Rabson { 3094fb8dd97SJohn Baldwin struct agp_intel_softc *sc = device_get_softc(dev); 31059747216SDoug Rabson u_int32_t apsize; 31159747216SDoug Rabson 3124fb8dd97SJohn Baldwin apsize = pci_read_config(dev, AGP_INTEL_APSIZE, 1) & sc->aperture_mask; 31359747216SDoug Rabson 31459747216SDoug Rabson /* 31559747216SDoug Rabson * The size is determined by the number of low bits of 31659747216SDoug Rabson * register APBASE which are forced to zero. The low 22 bits 31759747216SDoug Rabson * are always forced to zero and each zero bit in the apsize 31859747216SDoug Rabson * field just read forces the corresponding bit in the 27:22 31959747216SDoug Rabson * to be zero. We calculate the aperture size accordingly. 32059747216SDoug Rabson */ 3214fb8dd97SJohn Baldwin return (((apsize ^ sc->aperture_mask) << 22) | ((1 << 22) - 1)) + 1; 32259747216SDoug Rabson } 32359747216SDoug Rabson 32459747216SDoug Rabson static int 32559747216SDoug Rabson agp_intel_set_aperture(device_t dev, u_int32_t aperture) 32659747216SDoug Rabson { 3274fb8dd97SJohn Baldwin struct agp_intel_softc *sc = device_get_softc(dev); 32859747216SDoug Rabson u_int32_t apsize; 32959747216SDoug Rabson 33059747216SDoug Rabson /* 33159747216SDoug Rabson * Reverse the magic from get_aperture. 33259747216SDoug Rabson */ 3334fb8dd97SJohn Baldwin apsize = ((aperture - 1) >> 22) ^ sc->aperture_mask; 33459747216SDoug Rabson 33559747216SDoug Rabson /* 33659747216SDoug Rabson * Double check for sanity. 33759747216SDoug Rabson */ 3384fb8dd97SJohn Baldwin if ((((apsize ^ sc->aperture_mask) << 22) | ((1 << 22) - 1)) + 1 != aperture) 33959747216SDoug Rabson return EINVAL; 34059747216SDoug Rabson 34159747216SDoug Rabson pci_write_config(dev, AGP_INTEL_APSIZE, apsize, 1); 34259747216SDoug Rabson 34359747216SDoug Rabson return 0; 34459747216SDoug Rabson } 34559747216SDoug Rabson 34659747216SDoug Rabson static int 34759747216SDoug Rabson agp_intel_bind_page(device_t dev, int offset, vm_offset_t physical) 34859747216SDoug Rabson { 34959747216SDoug Rabson struct agp_intel_softc *sc = device_get_softc(dev); 35059747216SDoug Rabson 35159747216SDoug Rabson if (offset < 0 || offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT)) 35259747216SDoug Rabson return EINVAL; 35359747216SDoug Rabson 35459747216SDoug Rabson sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical | 0x17; 35559747216SDoug Rabson return 0; 35659747216SDoug Rabson } 35759747216SDoug Rabson 35859747216SDoug Rabson static int 35959747216SDoug Rabson agp_intel_unbind_page(device_t dev, int offset) 36059747216SDoug Rabson { 36159747216SDoug Rabson struct agp_intel_softc *sc = device_get_softc(dev); 36259747216SDoug Rabson 36359747216SDoug Rabson if (offset < 0 || offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT)) 36459747216SDoug Rabson return EINVAL; 36559747216SDoug Rabson 36659747216SDoug Rabson sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0; 36759747216SDoug Rabson return 0; 36859747216SDoug Rabson } 36959747216SDoug Rabson 37059747216SDoug Rabson static void 37159747216SDoug Rabson agp_intel_flush_tlb(device_t dev) 37259747216SDoug Rabson { 37380348907SJohn Baldwin u_int32_t val; 37480348907SJohn Baldwin 37580348907SJohn Baldwin val = pci_read_config(dev, AGP_INTEL_AGPCTRL, 4); 37680348907SJohn Baldwin pci_write_config(dev, AGP_INTEL_AGPCTRL, val & ~(1 << 8), 4); 37780348907SJohn Baldwin pci_write_config(dev, AGP_INTEL_AGPCTRL, val, 4); 37859747216SDoug Rabson } 37959747216SDoug Rabson 38059747216SDoug Rabson static device_method_t agp_intel_methods[] = { 38159747216SDoug Rabson /* Device interface */ 38259747216SDoug Rabson DEVMETHOD(device_probe, agp_intel_probe), 38359747216SDoug Rabson DEVMETHOD(device_attach, agp_intel_attach), 38459747216SDoug Rabson DEVMETHOD(device_detach, agp_intel_detach), 38559747216SDoug Rabson DEVMETHOD(device_shutdown, bus_generic_shutdown), 38659747216SDoug Rabson DEVMETHOD(device_suspend, bus_generic_suspend), 38759747216SDoug Rabson DEVMETHOD(device_resume, bus_generic_resume), 38859747216SDoug Rabson 38959747216SDoug Rabson /* AGP interface */ 39059747216SDoug Rabson DEVMETHOD(agp_get_aperture, agp_intel_get_aperture), 39159747216SDoug Rabson DEVMETHOD(agp_set_aperture, agp_intel_set_aperture), 39259747216SDoug Rabson DEVMETHOD(agp_bind_page, agp_intel_bind_page), 39359747216SDoug Rabson DEVMETHOD(agp_unbind_page, agp_intel_unbind_page), 39459747216SDoug Rabson DEVMETHOD(agp_flush_tlb, agp_intel_flush_tlb), 39559747216SDoug Rabson DEVMETHOD(agp_enable, agp_generic_enable), 39659747216SDoug Rabson DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory), 39759747216SDoug Rabson DEVMETHOD(agp_free_memory, agp_generic_free_memory), 39859747216SDoug Rabson DEVMETHOD(agp_bind_memory, agp_generic_bind_memory), 39959747216SDoug Rabson DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory), 40059747216SDoug Rabson 40159747216SDoug Rabson { 0, 0 } 40259747216SDoug Rabson }; 40359747216SDoug Rabson 40459747216SDoug Rabson static driver_t agp_intel_driver = { 40559747216SDoug Rabson "agp", 40659747216SDoug Rabson agp_intel_methods, 40759747216SDoug Rabson sizeof(struct agp_intel_softc), 40859747216SDoug Rabson }; 40959747216SDoug Rabson 41059747216SDoug Rabson static devclass_t agp_devclass; 41159747216SDoug Rabson 41259747216SDoug Rabson DRIVER_MODULE(agp_intel, pci, agp_intel_driver, agp_devclass, 0, 0); 413f246e4a1SMatthew N. Dodd MODULE_DEPEND(agp_intel, agp, 1, 1, 1); 414f246e4a1SMatthew N. Dodd MODULE_DEPEND(agp_intel, pci, 1, 1, 1); 415