This patch adds a bunch of stuff from FreeBSD5. It consistantly makes
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 9 Dec 2003 19:40:56 +0000 (19:40 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 9 Dec 2003 19:40:56 +0000 (19:40 +0000)
vendor specific drivers depend on agp, consistantly checks the gart size
!= 0, changes agp_generic_enable to the FreeBSD5 function, initializing
the device as v2 or v3 accordingly, syncs up agpio.h, and adds a couple
PCI Ids from FreeBSD5.

Submitted-by: Craig Dooley <cd5697@albany.edu>
share/man/man4/agp.4
sys/dev/agp/agp.c
sys/dev/agp/agp_ali.c
sys/dev/agp/agp_amd.c
sys/dev/agp/agp_i810.c
sys/dev/agp/agp_intel.c
sys/dev/agp/agp_nvidia.c
sys/dev/agp/agp_sis.c
sys/dev/agp/agp_via.c
sys/dev/agp/agpreg.h

index afed55a..3351b03 100644 (file)
@@ -23,7 +23,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man4/agp.4,v 1.2.2.3 2003/02/25 15:27:32 trhodes Exp $
-.\" $DragonFly: src/share/man/man4/agp.4,v 1.2 2003/06/17 04:36:58 dillon Exp $
+.\" $DragonFly: src/share/man/man4/agp.4,v 1.3 2003/12/09 19:40:54 dillon Exp $
 .\"
 .Dd October 5, 2001
 .Dt AGP 4
@@ -42,16 +42,21 @@ the following devices:
 .It
 Ali M1541 host-to-AGP bridge
 .It
-.\" 761 not in -stable
-AMD 751 host-to-AGP bridge
+AMD 751, 761, 762 host-to-AGP bridge
 .It
-Intel i820, i840, i845, i850, and i860 host-to-AGP bridge
+Intel 440 LX, 440 BX, 440 GX, i815, and i820 host-to-AGP bridge
 .It
-Intel i810, i810-DC100, i810E, and i815 SVGA controllers
+Intel i830, i840, i845, i850, and i855 host-to-AGP bridge
 .It
-Intel 82443GX host-to-AGP bridge
+Intel i860, i865, and i875 host-to-AGP bridge
 .It
-SiS 5591 host-to-AGP bridge
+Intel i810, i810-DC100, i810E, i815, i830, and i845 SVGA controllers
+.It
+NVIDIA nForce, and nForce2 host-to-AGP bridge
+.It
+SiS 5591, and 648 host-to-AGP bridge
+.It
+Via Apollo KT133A, MVP4, VP3, MVP3, Pro 133A, and Pro host-to-AGP bridge
 .El
 .Pp
 The most common application of
index 2c40a91..3b5557e 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp.c,v 1.3.2.4 2002/08/11 19:58:12 alc Exp $
- *     $DragonFly: src/sys/dev/agp/agp.c,v 1.7 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp.c,v 1.8 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -177,6 +177,11 @@ agp_alloc_gatt(device_t dev)
                              "allocating GATT for aperture of size %dM\n",
                              apsize / (1024*1024));
 
+       if (entries == 0) {
+               device_printf(dev, "bad aperture size\n");
+               return NULL;
+       }
+
        gatt = malloc(sizeof(struct agp_gatt), M_AGP, M_NOWAIT);
        if (!gatt)
                return 0;
@@ -279,18 +284,83 @@ agp_generic_detach(device_t dev)
        return 0;
 }
 
-int
-agp_generic_enable(device_t dev, u_int32_t mode)
+/*
+ * This does the enable logic for v3, with the same topology
+ * restrictions as in place for v2 -- one bus, one device on the bus.
+ */
+static int
+agp_v3_enable(device_t dev, device_t mdev, u_int32_t mode)
 {
-       device_t mdev = agp_find_display();
        u_int32_t tstatus, mstatus;
        u_int32_t command;
-       int rq, sba, fw, rate;;
+       int rq, sba, fw, rate, arqsz, cal;
 
-       if (!mdev) {
-               AGP_DPF("can't find display\n");
-               return ENXIO;
-       }
+       tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
+       mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
+
+       /* Set RQ to the min of mode, tstatus and mstatus */
+       rq = AGP_MODE_GET_RQ(mode);
+       if (AGP_MODE_GET_RQ(tstatus) < rq)
+               rq = AGP_MODE_GET_RQ(tstatus);
+       if (AGP_MODE_GET_RQ(mstatus) < rq)
+               rq = AGP_MODE_GET_RQ(mstatus);
+
+       /*
+        * ARQSZ - Set the value to the maximum one.
+        * Don't allow the mode register to override values.
+        */
+       arqsz = AGP_MODE_GET_ARQSZ(mode);
+       if (AGP_MODE_GET_ARQSZ(tstatus) > rq)
+               rq = AGP_MODE_GET_ARQSZ(tstatus);
+       if (AGP_MODE_GET_ARQSZ(mstatus) > rq)
+               rq = AGP_MODE_GET_ARQSZ(mstatus);
+
+       /* Calibration cycle - don't allow override by mode register */
+       cal = AGP_MODE_GET_CAL(tstatus);
+       if (AGP_MODE_GET_CAL(mstatus) < cal)
+               cal = AGP_MODE_GET_CAL(mstatus);
+
+       /* SBA must be supported for AGP v3. */
+       sba = 1;
+
+       /* Set FW if all three support it. */
+       fw = (AGP_MODE_GET_FW(tstatus)
+              & AGP_MODE_GET_FW(mstatus)
+              & AGP_MODE_GET_FW(mode));
+       
+       /* Figure out the max rate */
+       rate = (AGP_MODE_GET_RATE(tstatus)
+               & AGP_MODE_GET_RATE(mstatus)
+               & AGP_MODE_GET_RATE(mode));
+       if (rate & AGP_MODE_V3_RATE_8x)
+               rate = AGP_MODE_V3_RATE_8x;
+       else
+               rate = AGP_MODE_V3_RATE_4x;
+       if (bootverbose)
+               device_printf(dev, "Setting AGP v3 mode %d\n", rate * 4);
+
+       pci_write_config(dev, agp_find_caps(dev) + AGP_COMMAND, 0, 4);
+
+       /* Construct the new mode word and tell the hardware */
+       command = AGP_MODE_SET_RQ(0, rq);
+       command = AGP_MODE_SET_ARQSZ(command, arqsz);
+       command = AGP_MODE_SET_CAL(command, cal);
+       command = AGP_MODE_SET_SBA(command, sba);
+       command = AGP_MODE_SET_FW(command, fw);
+       command = AGP_MODE_SET_RATE(command, rate);
+       command = AGP_MODE_SET_AGP(command, 1);
+       pci_write_config(dev, agp_find_caps(dev) + AGP_COMMAND, command, 4);
+       pci_write_config(mdev, agp_find_caps(mdev) + AGP_COMMAND, command, 4);
+
+       return 0;
+}
+
+static int
+agp_v2_enable(device_t dev, device_t mdev, u_int32_t mode)
+{
+       u_int32_t tstatus, mstatus;
+       u_int32_t command;
+       int rq, sba, fw, rate;
 
        tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
        mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
@@ -316,12 +386,14 @@ agp_generic_enable(device_t dev, u_int32_t mode)
        rate = (AGP_MODE_GET_RATE(tstatus)
                & AGP_MODE_GET_RATE(mstatus)
                & AGP_MODE_GET_RATE(mode));
-       if (rate & AGP_MODE_RATE_4x)
-               rate = AGP_MODE_RATE_4x;
-       else if (rate & AGP_MODE_RATE_2x)
-               rate = AGP_MODE_RATE_2x;
+       if (rate & AGP_MODE_V2_RATE_4x)
+               rate = AGP_MODE_V2_RATE_4x;
+       else if (rate & AGP_MODE_V2_RATE_2x)
+               rate = AGP_MODE_V2_RATE_2x;
        else
-               rate = AGP_MODE_RATE_1x;
+               rate = AGP_MODE_V2_RATE_1x;
+       if (bootverbose)
+               device_printf(dev, "Setting AGP v2 mode %d\n", rate);
 
        /* Construct the new mode word and tell the hardware */
        command = AGP_MODE_SET_RQ(0, rq);
@@ -335,6 +407,34 @@ agp_generic_enable(device_t dev, u_int32_t mode)
        return 0;
 }
 
+int
+agp_generic_enable(device_t dev, u_int32_t mode)
+{
+       device_t mdev = agp_find_display();
+       u_int32_t tstatus, mstatus;
+
+       if (!mdev) {
+               AGP_DPF("can't find display\n");
+               return ENXIO;
+       }
+
+       tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
+       mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
+
+       /*
+        * Check display and bridge for AGP v3 support.  AGP v3 allows
+        * more variety in topology than v2, e.g. multiple AGP devices
+        * attached to one bridge, or multiple AGP bridges in one
+        * system.  This doesn't attempt to address those situations,
+        * but should work fine for a classic single AGP slot system
+        * with AGP v3.
+        */
+       if (AGP_MODE_GET_MODE_3(tstatus) && AGP_MODE_GET_MODE_3(mstatus))
+               return (agp_v3_enable(dev, mdev, mode));
+       else
+               return (agp_v2_enable(dev, mdev, mode));            
+}
+
 struct agp_memory *
 agp_generic_alloc_memory(device_t dev, int type, vm_size_t size)
 {
index 29b0905..69fca19 100644 (file)
@@ -24,7 +24,7 @@
  * 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.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_ali.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -100,6 +100,10 @@ agp_ali_attach(device_t dev)
                return error;
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_alloc_gatt(dev);
@@ -263,3 +267,5 @@ static driver_t agp_ali_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_ali, pci, agp_ali_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_ali, agp, 1, 1, 1);
+MODULE_DEPEND(agp_ali, pci, 1, 1, 1);
index 8d8d9de..01c5b56 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_amd.c,v 1.3.2.4 2002/04/25 23:41:36 cokane Exp $
- *     $DragonFly: src/sys/dev/agp/agp_amd.c,v 1.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_amd.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -238,6 +238,10 @@ agp_amd_attach(device_t dev)
        sc->bsh = rman_get_bushandle(sc->regs);
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_amd_alloc_gatt(dev);
@@ -416,3 +420,5 @@ static driver_t agp_amd_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_amd, pci, agp_amd_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_amd, agp, 1, 1, 1);
+MODULE_DEPEND(agp_amd, pci, 1, 1, 1);
index fd555e9..74c0d45 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_i810.c,v 1.1.2.5 2002/09/15 08:45:41 anholt Exp $
- *     $DragonFly: src/sys/dev/agp/agp_i810.c,v 1.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_i810.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 /*
@@ -239,6 +239,10 @@ agp_i810_attach(device_t dev)
        sc->bsh = rman_get_bushandle(sc->regs);
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        gatt = malloc( sizeof(struct agp_gatt), M_AGP, M_NOWAIT);
        if (!gatt) {
@@ -629,3 +633,5 @@ static driver_t agp_i810_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_i810, pci, agp_i810_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_i810, agp, 1, 1, 1);
+MODULE_DEPEND(agp_i810, pci, 1, 1, 1);
index 5c5b42b..38ddcdb 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_intel.c,v 1.1.2.5 2003/06/02 17:38:19 jhb Exp $
- *     $DragonFly: src/sys/dev/agp/agp_intel.c,v 1.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_intel.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -98,11 +98,17 @@ agp_intel_match(device_t dev)
        case 0x25308086:
                return ("Intel 82850 host to AGP bridge");
 
+       case 0x33408086:
+               return ("Intel 82855 host to AGP bridge");
+
        case 0x25318086:
                return ("Intel 82860 host to AGP bridge");
 
        case 0x25708086:
                return ("Intel 82865 host to AGP bridge");
+
+       case 0x25788086:
+               return ("Intel 82875P host to AGP bridge");
        };
 
        if (pci_get_vendor(dev) == 0x8086)
@@ -146,6 +152,10 @@ agp_intel_attach(device_t dev)
            MAX_APSIZE;
        pci_write_config(dev, AGP_INTEL_APSIZE, value, 1);
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_alloc_gatt(dev);
@@ -201,7 +211,9 @@ agp_intel_attach(device_t dev)
                break;
 
        case 0x1a308086: /* i845 */
+       case 0x33408086: /* i855 */
        case 0x25708086: /* i865 */
+       case 0x25788086: /* i875P */
                pci_write_config(dev, AGP_INTEL_I845_MCHCFG,
                                 (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1)
                                  | (1 << 1)), 1);
@@ -222,8 +234,10 @@ agp_intel_attach(device_t dev)
        case 0x25018086: /* i820 */
        case 0x1a308086: /* i845 */
        case 0x25308086: /* i850 */
+       case 0x33408086: /* i855 */
        case 0x25318086: /* i860 */
        case 0x25708086: /* i865 */
+       case 0x25788086: /* i875P */
                pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0x00ff, 2);
                break;
 
@@ -266,7 +280,9 @@ agp_intel_detach(device_t dev)
                                & ~(1 << 1)), 1);
 
        case 0x1a308086: /* i845 */
+       case 0x33408086: /* i855 */
        case 0x25708086: /* i865 */
+       case 0x25788086: /* i875P */
                printf("%s: set MCHCFG to %x\n", __FUNCTION__, (unsigned)
                                (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1)
                                & ~(1 << 1)));
@@ -396,3 +412,5 @@ static driver_t agp_intel_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_intel, pci, agp_intel_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_intel, agp, 1, 1, 1);
+MODULE_DEPEND(agp_intel, pci, 1, 1, 1);
index 4e29108..da1fd45 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * Based on FreeBSD v1.2.
- * $DragonFly: src/sys/dev/agp/agp_nvidia.c,v 1.1 2003/10/31 21:49:23 asmodai Exp $
+ * $DragonFly: src/sys/dev/agp/agp_nvidia.c,v 1.2 2003/12/09 19:40:56 dillon Exp $
  */
 
 /*
@@ -173,6 +173,10 @@ agp_nvidia_attach (device_t dev)
                return (error);
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_alloc_gatt(dev);
index 41911f5..40776bb 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_sis.c,v 1.1.2.1 2000/07/19 09:48:04 ru Exp $
- *     $DragonFly: src/sys/dev/agp/agp_sis.c,v 1.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_sis.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -65,6 +65,8 @@ agp_sis_match(device_t dev)
        switch (pci_get_devid(dev)) {
        case 0x00011039:
                return ("SiS 5591 host to AGP bridge");
+       case 0x06481039:
+               return ("SiS 648 host to AGP bridge");
        };
 
        if (pci_get_vendor(dev) == 0x1039)
@@ -100,6 +102,10 @@ agp_sis_attach(device_t dev)
                return error;
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_alloc_gatt(dev);
@@ -255,3 +261,5 @@ static driver_t agp_sis_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_sis, pci, agp_sis_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_sis, agp, 1, 1, 1);
+MODULE_DEPEND(agp_sis, pci, 1, 1, 1);
index 0c2cd0f..d40b1bc 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_via.c,v 1.1.2.2 2001/10/04 09:53:04 ru Exp $
- *     $DragonFly: src/sys/dev/agp/agp_via.c,v 1.3 2003/08/07 21:16:48 dillon Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_via.c,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -63,16 +63,18 @@ agp_via_match(device_t dev)
                return NULL;
 
        switch (pci_get_devid(dev)) {
+       case 0x03051106:
+               return ("VIA 82C8363 (Apollo KT133A) host to PCI bridge");
        case 0x05011106:
                return ("VIA 8501 (Apollo MVP4) host to PCI bridge");
        case 0x05971106:
                return ("VIA 82C597 (Apollo VP3) host to PCI bridge");
        case 0x05981106:
                return ("VIA 82C598 (Apollo MVP3) host to PCI bridge");
+       case 0x06051106:
+               return ("VIA 82C694X (Apollo Pro 133A) host to PCI bridge");
        case 0x06911106:
                return ("VIA 82C691 (Apollo Pro) host to PCI bridge");
-       case 0x03051106:
-           return ("VIA 82C8363 (Apollo KT133A) host to PCI bridge");
        };
 
        if (pci_get_vendor(dev) == 0x1106)
@@ -108,6 +110,10 @@ agp_via_attach(device_t dev)
                return error;
 
        sc->initial_aperture = AGP_GET_APERTURE(dev);
+       if (sc->initial_aperture == 0) {
+               device_printf(dev, "bad initial aperture size, disabling\n");
+               return ENXIO;
+       }
 
        for (;;) {
                gatt = agp_alloc_gatt(dev);
@@ -254,3 +260,5 @@ static driver_t agp_via_driver = {
 static devclass_t agp_devclass;
 
 DRIVER_MODULE(agp_via, pci, agp_via_driver, agp_devclass, 0, 0);
+MODULE_DEPEND(agp_via, agp, 1, 1, 1);
+MODULE_DEPEND(agp_via, pci, 1, 1, 1);
index 9155be4..75f73ed 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agpreg.h,v 1.3.2.5 2003/06/02 17:38:19 jhb Exp $
- *     $DragonFly: src/sys/dev/agp/agpreg.h,v 1.3 2003/10/31 21:49:23 asmodai Exp $
+ *     $DragonFly: src/sys/dev/agp/agpreg.h,v 1.4 2003/12/09 19:40:56 dillon Exp $
  */
 
 #ifndef _PCI_AGPREG_H_
 #define AGP_I830_GCC1_GMASIZE_64       0x01
 #define AGP_I830_GCC1_GMASIZE_128      0x00
 
+/*
+ * Config registers for 852GM/855GM/865G device 0
+ */
+#define AGP_I855_GCC1                  0x52
+#define AGP_I855_GCC1_DEV2             0x08
+#define AGP_I855_GCC1_DEV2_ENABLED     0x00
+#define AGP_I855_GCC1_DEV2_DISABLED    0x08
+#define AGP_I855_GCC1_GMS              0x70
+#define AGP_I855_GCC1_GMS_STOLEN_0M    0x00
+#define AGP_I855_GCC1_GMS_STOLEN_1M    0x10
+#define AGP_I855_GCC1_GMS_STOLEN_4M    0x20
+#define AGP_I855_GCC1_GMS_STOLEN_8M    0x30
+#define AGP_I855_GCC1_GMS_STOLEN_16M   0x40
+#define AGP_I855_GCC1_GMS_STOLEN_32M   0x50
+
+/*
+ * 852GM/855GM variant identification
+ */
+#define AGP_I85X_CAPID                 0x44
+#define AGP_I85X_VARIANT_MASK          0x7
+#define AGP_I85X_VARIANT_SHIFT         5
+#define AGP_I855_GME                   0x0
+#define AGP_I855_GM                    0x4
+#define AGP_I852_GME                   0x2
+#define AGP_I852_GM                    0x5
+
 /*
  * NVIDIA nForce/nForce2 registers
  */