Update from FreeBSD:
authorSimon Schubert <corecode@dragonflybsd.org>
Mon, 7 Jan 2008 01:25:29 +0000 (01:25 +0000)
committerSimon Schubert <corecode@dragonflybsd.org>
Mon, 7 Jan 2008 01:25:29 +0000 (01:25 +0000)
Split agp_generic_detach() up into two routines: agp_free_cdev() destroys
/dev/agpgart and agp_free_res() frees resources like the BAR for the
aperture.  Splitting this up lets chipset-specific detach routines
manipulate the aperture during their detach routines without panicing.

Obtained-from:  FreeBSD

sys/dev/agp/agp.c
sys/dev/agp/agp_ali.c
sys/dev/agp/agp_amd.c
sys/dev/agp/agp_amd64.c
sys/dev/agp/agp_ati.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/agppriv.h

index 16e3145..c796d8f 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp.c,v 1.56 2007/07/13 16:28:11 anholt Exp $
- *     $DragonFly: src/sys/dev/agp/agp.c,v 1.28 2008/01/05 14:02:37 swildner Exp $
+ *     $DragonFly: src/sys/dev/agp/agp.c,v 1.29 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -272,14 +272,27 @@ agp_generic_attach(device_t dev)
        return 0;
 }
 
-int
-agp_generic_detach(device_t dev)
+void
+agp_free_cdev(device_t dev)
+{
+       dev_ops_remove(&agp_ops, -1, device_get_unit(dev));
+}
+
+void
+agp_free_res(device_t dev)
 {
        struct agp_softc *sc = device_get_softc(dev);
 
-       bus_release_resource(dev, SYS_RES_MEMORY, AGP_APBASE, sc->as_aperture);
+       bus_release_resource(dev, SYS_RES_MEMORY, sc->as_aperture_rid,
+                            sc->as_aperture);
        agp_flush_cache();
-       dev_ops_remove(&agp_ops, -1, device_get_unit(dev));
+}
+
+int
+agp_generic_detach(device_t dev)
+{
+       agp_free_cdev(dev);
+       agp_free_res(dev);
        return 0;
 }
 
index 7122ad8..7bbf1ab 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $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 $
+ *     $DragonFly: src/sys/dev/agp/agp_ali.c,v 1.7 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -140,12 +140,9 @@ static int
 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)
-               return error;
+       agp_free_cdev(dev);
 
        /* Disable the TLB.. */
        pci_write_config(dev, AGP_ALI_TLBCTRL, 0x90, 1);
@@ -156,6 +153,7 @@ agp_ali_detach(device_t dev)
        pci_write_config(dev, AGP_ALI_ATTBASE, attbase & 0xfff, 4);
 
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
        return 0;
 }
 
index 49f2a6a..571cc9a 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_amd.c,v 1.23 2005/12/20 21:12:26 jhb Exp $
- *     $DragonFly: src/sys/dev/agp/agp_amd.c,v 1.9 2007/09/12 08:31:43 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_amd.c,v 1.10 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -259,11 +259,8 @@ static int
 agp_amd_detach(device_t dev)
 {
        struct agp_amd_softc *sc = device_get_softc(dev);
-       int error;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return error;
+       agp_free_cdev(dev);
 
        /* Disable the TLB.. */
        WRITE2(AGP_AMD751_STATUS,
@@ -279,6 +276,7 @@ agp_amd_detach(device_t dev)
        AGP_SET_APERTURE(dev, sc->initial_aperture);
 
        agp_amd_free_gatt(sc->gatt);
+       agp_free_res(dev);
 
        bus_release_resource(dev, SYS_RES_MEMORY,
                             AGP_AMD751_REGISTERS, sc->regs);
index c404720..49af99d 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/agp_amd64.c,v 1.14 2006/10/09 20:26:32 jkim Exp $
- * $DragonFly: src/sys/dev/agp/agp_amd64.c,v 1.1 2007/09/12 08:31:43 hasso Exp $
+ * $DragonFly: src/sys/dev/agp/agp_amd64.c,v 1.2 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -251,10 +251,9 @@ static int
 agp_amd64_detach(device_t dev)
 {
        struct agp_amd64_softc *sc = device_get_softc(dev);
-       int i, error;
+       int i;
 
-       if ((error = agp_generic_detach(dev)))
-               return (error);
+       agp_free_cdev(dev);
 
        for (i = 0; i < sc->n_mctrl; i++)
                pci_cfgregwrite(0, sc->mctrl[i], 3, AGP_AMD64_APCTRL,
@@ -263,6 +262,7 @@ agp_amd64_detach(device_t dev)
 
        AGP_SET_APERTURE(dev, sc->initial_aperture);
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
 
        return (0);
 }
index f28c601..0134d62 100644 (file)
@@ -26,7 +26,7 @@
  * Based on reading the Linux 2.6.8.1 driver by Dave Jones.
  *
  * $FreeBSD: src/sys/pci/agp_ati.c,v 1.3 2006/09/01 02:22:17 anholt Exp $
- * $DragonFly: src/sys/dev/agp/agp_ati.c,v 1.1 2007/09/12 08:31:43 hasso Exp $
+ * $DragonFly: src/sys/dev/agp/agp_ati.c,v 1.2 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include <sys/cdefs.h>
@@ -253,18 +253,15 @@ static int
 agp_ati_detach(device_t dev)
 {
        struct agp_ati_softc *sc = device_get_softc(dev);
-       int error;
        u_int32_t apsize_reg, temp;
 
+       agp_free_cdev(dev);
+
        if (sc->is_rs300)
                apsize_reg = ATI_RS300_APSIZE;
        else
                apsize_reg = ATI_RS100_APSIZE;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return error;
-
        /* Clear the GATT base */
        WRITE4(ATI_GART_BASE, 0);
 
@@ -278,6 +275,7 @@ agp_ati_detach(device_t dev)
        kfree(sc->ag_virtual, M_AGP);
 
        bus_release_resource(dev, SYS_RES_MEMORY, ATI_GART_MMADDR, sc->regs);
+       agp_free_res(dev);
 
        return 0;
 }
index d95f850..cd6d78e 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_i810.c,v 1.40 2007/07/13 16:28:12 anholt Exp $
- *     $DragonFly: src/sys/dev/agp/agp_i810.c,v 1.13 2007/11/29 09:28:38 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_i810.c,v 1.14 2008/01/07 01:25:29 corecode Exp $
  */
 
 /*
@@ -586,11 +586,8 @@ static int
 agp_i810_detach(device_t dev)
 {
        struct agp_i810_softc *sc = device_get_softc(dev);
-       int error;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return error;
+       agp_free_cdev(dev);
 
        /* Clear the GATT base. */
        if ( sc->chiptype == CHIP_I810 ) {
@@ -611,6 +608,7 @@ agp_i810_detach(device_t dev)
        kfree(sc->gatt, M_AGP);
 
        bus_release_resources(dev, sc->sc_res_spec, sc->sc_res);
+       agp_free_res(dev);
 
        return 0;
 }
index b8415b2..aa73d66 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_intel.c,v 1.34 2007/01/06 08:31:31 takawata Exp $
- *     $DragonFly: src/sys/dev/agp/agp_intel.c,v 1.8 2007/09/12 08:31:43 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_intel.c,v 1.9 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -264,13 +264,10 @@ agp_intel_detach(device_t dev)
 {
        struct agp_intel_softc *sc;
        u_int32_t reg;
-       int error;
 
        sc = device_get_softc(dev);
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return (error);
+       agp_free_cdev(dev);
 
        /* Disable aperture accesses. */
        switch (pci_get_devid(dev)) {
@@ -307,6 +304,7 @@ agp_intel_detach(device_t dev)
        pci_write_config(dev, AGP_INTEL_ATTBASE, 0, 4);
        AGP_SET_APERTURE(dev, sc->initial_aperture);
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
 
        return (0);
 }
index 41feec6..02f22fa 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/agp_nvidia.c,v 1.11 2005/12/20 21:12:26 jhb Exp $
- * $DragonFly: src/sys/dev/agp/agp_nvidia.c,v 1.5 2007/09/12 08:31:43 hasso Exp $
+ * $DragonFly: src/sys/dev/agp/agp_nvidia.c,v 1.6 2008/01/07 01:25:29 corecode Exp $
  */
 
 /*
@@ -239,12 +239,9 @@ static int
 agp_nvidia_detach (device_t dev)
 {
        struct agp_nvidia_softc *sc = device_get_softc(dev);
-       int error;
        u_int32_t temp;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return (error);
+       agp_free_cdev(dev);
 
        /* GART Control */
        temp = pci_read_config(sc->dev, AGP_NVIDIA_0_APSIZE, 4);
@@ -262,6 +259,7 @@ agp_nvidia_detach (device_t dev)
                         sc->initial_aperture);
 
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
 
        return (0);
 }
index 47aaebe..9bacea1 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_sis.c,v 1.20 2006/05/30 18:41:26 jkim Exp $
- *     $DragonFly: src/sys/dev/agp/agp_sis.c,v 1.6 2007/09/12 08:31:43 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_sis.c,v 1.7 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -171,11 +171,8 @@ static int
 agp_sis_detach(device_t dev)
 {
        struct agp_sis_softc *sc = device_get_softc(dev);
-       int error;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return error;
+       agp_free_cdev(dev);
 
        /* Disable the aperture.. */
        pci_write_config(dev, AGP_SIS_WINCTRL,
@@ -188,6 +185,7 @@ agp_sis_detach(device_t dev)
        AGP_SET_APERTURE(dev, sc->initial_aperture);
 
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
        return 0;
 }
 
index 8c09ea9..9441cfc 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp_via.c,v 1.23 2005/12/20 21:12:26 jhb Exp $
- *     $DragonFly: src/sys/dev/agp/agp_via.c,v 1.6 2007/09/12 08:31:43 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agp_via.c,v 1.7 2008/01/07 01:25:29 corecode Exp $
  */
 
 #include "opt_bus.h"
@@ -236,16 +236,14 @@ static int
 agp_via_detach(device_t dev)
 {
        struct agp_via_softc *sc = device_get_softc(dev);
-       int error;
 
-       error = agp_generic_detach(dev);
-       if (error)
-               return error;
+       agp_free_cdev(dev);
 
        pci_write_config(dev, sc->regs[REG_GARTCTRL], 0, 4);
        pci_write_config(dev, sc->regs[REG_ATTBASE], 0, 4);
        AGP_SET_APERTURE(dev, sc->initial_aperture);
        agp_free_gatt(sc->gatt);
+       agp_free_res(dev);
 
        return 0;
 }
index 2ed28f7..c910d45 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agppriv.h,v 1.6 2007/07/13 16:28:12 anholt Exp $
- *     $DragonFly: src/sys/dev/agp/agppriv.h,v 1.6 2007/09/12 08:31:43 hasso Exp $
+ *     $DragonFly: src/sys/dev/agp/agppriv.h,v 1.7 2008/01/07 01:25:29 corecode Exp $
  */
 
 #ifndef _PCI_AGPPRIV_H_
@@ -91,7 +91,9 @@ void                  agp_flush_cache(void);
 u_int8_t               agp_find_caps(device_t dev);
 struct agp_gatt               *agp_alloc_gatt(device_t dev);
 void                   agp_set_aperture_resource(device_t dev, int rid);
+void                   agp_free_cdev(device_t dev);
 void                   agp_free_gatt(struct agp_gatt *gatt);
+void                   agp_free_res(device_t dev);
 int                    agp_generic_attach(device_t dev);
 int                    agp_generic_detach(device_t dev);
 int                    agp_generic_get_aperture(device_t dev);