Update the agp(4) code to the latest one from FreeBSD HEAD. This brings in
[dragonfly.git] / sys / dev / agp / agp_ali.c
index bd87b61..7122ad8 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     $FreeBSD: src/sys/pci/agp_ali.c,v 1.1.2.1 2000/07/19 09:48:04 ru Exp $
- *     $DragonFly: src/sys/dev/agp/agp_ali.c,v 1.5 2004/10/10 18:59:02 dillon Exp $
+ *     $FreeBSD: src/sys/pci/agp_ali.c,v 1.18 2005/12/20 21:12:26 jhb Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_ali.c,v 1.6 2007/09/12 08:31:43 hasso Exp $
  */
 
 #include "opt_bus.h"
-#include "opt_pci.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -63,13 +62,14 @@ agp_ali_match(device_t dev)
                return NULL;
 
        switch (pci_get_devid(dev)) {
+       case 0x167110b9:
+               return ("Ali M1671 host to AGP bridge");
        case 0x154110b9:
                return ("Ali M1541 host to AGP bridge");
+       case 0x162110b9:
+               return ("Ali M1621 host to AGP bridge");
        };
 
-       if (pci_get_vendor(dev) == 0x10b9)
-               return ("Ali Generic host to PCI bridge");
-
        return NULL;
 }
 
@@ -78,11 +78,13 @@ agp_ali_probe(device_t dev)
 {
        const char *desc;
 
+       if (resource_disabled("agp", device_get_unit(dev)))
+               return (ENXIO);
        desc = agp_ali_match(dev);
        if (desc) {
                device_verbose(dev);
                device_set_desc(dev, desc);
-               return 0;
+               return BUS_PROBE_DEFAULT;
        }
 
        return ENXIO;
@@ -94,6 +96,7 @@ agp_ali_attach(device_t dev)
        struct agp_ali_softc *sc = device_get_softc(dev);
        struct agp_gatt *gatt;
        int error;
+       u_int32_t attbase;
 
        error = agp_generic_attach(dev);
        if (error)
@@ -123,10 +126,9 @@ agp_ali_attach(device_t dev)
        sc->gatt = gatt;
 
        /* Install the gatt. */
-       pci_write_config(dev, AGP_ALI_ATTBASE,
-                        (gatt->ag_physical
-                         | (pci_read_config(dev, AGP_ALI_ATTBASE, 4) & 0xff)),
-                        4);
+       attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
+       pci_write_config(dev, AGP_ALI_ATTBASE, gatt->ag_physical |
+           (attbase & 0xfff), 4);
        
        /* Enable the TLB. */
        pci_write_config(dev, AGP_ALI_TLBCTRL, 0x10, 1);
@@ -139,6 +141,7 @@ agp_ali_detach(device_t dev)
 {
        struct agp_ali_softc *sc = device_get_softc(dev);
        int error;
+       u_int32_t attbase;
 
        error = agp_generic_detach(dev);
        if (error)
@@ -149,9 +152,8 @@ agp_ali_detach(device_t dev)
 
        /* Put the aperture back the way it started. */
        AGP_SET_APERTURE(dev, sc->initial_aperture);
-       pci_write_config(dev, AGP_ALI_ATTBASE,
-                        pci_read_config(dev, AGP_ALI_ATTBASE, 4) & 0xff,
-                        4);
+       attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
+       pci_write_config(dev, AGP_ALI_ATTBASE, attbase & 0xfff, 4);
 
        agp_free_gatt(sc->gatt);
        return 0;
@@ -181,7 +183,7 @@ agp_ali_get_aperture(device_t dev)
         * The aperture size is derived from the low bits of attbase.
         * I'm not sure this is correct..
         */
-       int i = pci_read_config(dev, AGP_ALI_ATTBASE, 4) & 0xff;
+       int i = pci_read_config(dev, AGP_ALI_ATTBASE, 4) & 0xf;
        if (i >= agp_ali_table_size)
                return 0;
        return agp_ali_table[i];
@@ -191,6 +193,7 @@ static int
 agp_ali_set_aperture(device_t dev, u_int32_t aperture)
 {
        int i;
+       u_int32_t attbase;
 
        for (i = 0; i < agp_ali_table_size; i++)
                if (agp_ali_table[i] == aperture)
@@ -198,9 +201,8 @@ agp_ali_set_aperture(device_t dev, u_int32_t aperture)
        if (i == agp_ali_table_size)
                return EINVAL;
 
-       pci_write_config(dev, AGP_ALI_ATTBASE,
-                        ((pci_read_config(dev, AGP_ALI_ATTBASE, 4) & ~0xff)
-                         | i), 4);
+       attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
+       pci_write_config(dev, AGP_ALI_ATTBASE, (attbase & ~0xf) | i, 4);
        return 0;
 }