Author: rnoland
Date: Sat Jan 23 16:29:04 2010
New Revision: 202890
URL: http://svn.freebsd.org/changeset/base/202890

Log:
  MFC r200764
  
  Fix a handful of issues with via agp support.
  
    * Read the pci capability register to identify AGP 3 support
    * Add missing smaller aperture sizes for AGP3 chips.
    * Fix the aperture size calculation on AGP2 chips.
      All sizes between 32M and 256M reported as 256M.
    * Add \n to error string.

Modified:
  stable/8/sys/dev/agp/agp_via.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/agp/agp_via.c
==============================================================================
--- stable/8/sys/dev/agp/agp_via.c      Sat Jan 23 15:54:21 2010        
(r202889)
+++ stable/8/sys/dev/agp/agp_via.c      Sat Jan 23 16:29:04 2010        
(r202890)
@@ -165,39 +165,16 @@ agp_via_attach(device_t dev)
        struct agp_gatt *gatt;
        int error;
        u_int32_t agpsel;
+       u_int32_t capid;
 
-       /* XXX: This should be keying off of whether the bridge is AGP3 capable,
-        * rather than a bunch of device ids for chipsets that happen to do 8x.
-        */
-       switch (pci_get_devid(dev)) {
-       case 0x01981106:
-       case 0x02591106:
-       case 0x02691106:
-       case 0x02961106:
-       case 0x03141106:
-       case 0x03241106:
-       case 0x03271106:
-       case 0x03641106:
-       case 0x31231106:
-       case 0x31681106:
-       case 0x31891106:
-       case 0x32051106:
-       case 0x32581106:
-       case 0xb1981106:
-               /* The newer VIA chipsets will select the AGP version based on
-                * what AGP versions the card supports.  We still have to
-                * program it using the v2 registers if it has chosen to use
-                * compatibility mode.
-                */
+       sc->regs = via_v2_regs;
+
+       /* Look at the capability register to see if we handle AGP3 */
+       capid = pci_read_config(dev, agp_find_caps(dev) + AGP_CAPID, 4);
+       if (((capid >> 20) & 0x0f) >= 3) { 
                agpsel = pci_read_config(dev, AGP_VIA_AGPSEL, 1);
                if ((agpsel & (1 << 1)) == 0)
                        sc->regs = via_v3_regs;
-               else
-                       sc->regs = via_v2_regs;
-               break;
-       default:
-               sc->regs = via_v2_regs;
-               break;
        }
        
        error = agp_generic_attach(dev);
@@ -235,7 +212,7 @@ agp_via_attach(device_t dev)
                pci_write_config(dev, sc->regs[REG_ATTBASE], gatt->ag_physical, 
4);
                
                /* Enable the aperture. */
-               gartctrl = pci_read_config(dev, sc->regs[REG_ATTBASE], 4);
+               gartctrl = pci_read_config(dev, sc->regs[REG_GARTCTRL], 4);
                pci_write_config(dev, sc->regs[REG_GARTCTRL], gartctrl | (3 << 
7), 4);
        }
 
@@ -268,7 +245,7 @@ agp_via_get_aperture(device_t dev)
        u_int32_t apsize;
 
        if (sc->regs == via_v2_regs) {
-               apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 1) & 0x1f;
+               apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 1);
 
                /*
                 * The size is determined by the number of low bits of
@@ -295,8 +272,14 @@ agp_via_get_aperture(device_t dev)
                        return 0x04000000;
                case 0xf38:
                        return 0x02000000;
+               case 0xf3c:
+                       return 0x01000000;
+               case 0xf3e:
+                       return 0x00800000;
+               case 0xf3f:
+                       return 0x00400000;
                default:
-                       device_printf(dev, "Invalid aperture setting 0x%x",
+                       device_printf(dev, "Invalid aperture setting 0x%x\n",
                            pci_read_config(dev, sc->regs[REG_APSIZE], 2));
                        return 0;
                }
@@ -345,6 +328,15 @@ agp_via_set_aperture(device_t dev, u_int
                case 0x02000000:
                        key = 0xf38;
                        break;
+               case 0x01000000:
+                       key = 0xf3c;
+                       break;
+               case 0x00800000:
+                       key = 0xf3e;
+                       break;
+               case 0x00400000:
+                       key = 0xf3f;
+                       break;
                default:
                        device_printf(dev, "Invalid aperture size (%dMb)\n",
                            aperture / 1024 / 1024);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to