summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/alpha/conf/files.alpha4
-rw-r--r--sys/arch/amd64/conf/GENERIC6
-rw-r--r--sys/arch/amd64/conf/files.amd6413
-rw-r--r--sys/arch/amd64/pci/pchb.c47
-rw-r--r--sys/arch/i386/conf/GENERIC17
-rw-r--r--sys/arch/i386/conf/files.i38613
-rw-r--r--sys/arch/i386/pci/pchb.c70
-rw-r--r--sys/conf/files10
-rw-r--r--sys/dev/pci/agp.c388
-rw-r--r--sys/dev/pci/agp_ali.c143
-rw-r--r--sys/dev/pci/agp_amd.c177
-rw-r--r--sys/dev/pci/agp_i810.c405
-rw-r--r--sys/dev/pci/agp_intel.c267
-rw-r--r--sys/dev/pci/agp_sis.c135
-rw-r--r--sys/dev/pci/agp_via.c169
-rw-r--r--sys/dev/pci/agpvar.h142
-rw-r--r--sys/dev/pci/files.agp45
-rw-r--r--sys/dev/pci/vga_pci.c53
18 files changed, 960 insertions, 1144 deletions
diff --git a/sys/arch/alpha/conf/files.alpha b/sys/arch/alpha/conf/files.alpha
index 277b0cea08f..34610f64c5b 100644
--- a/sys/arch/alpha/conf/files.alpha
+++ b/sys/arch/alpha/conf/files.alpha
@@ -1,4 +1,4 @@
-# $OpenBSD: files.alpha,v 1.87 2008/07/19 18:13:04 miod Exp $
+# $OpenBSD: files.alpha,v 1.88 2008/11/09 15:11:18 oga Exp $
# $NetBSD: files.alpha,v 1.32 1996/11/25 04:03:21 cgd Exp $
#
# alpha-specific configuration info
@@ -173,6 +173,8 @@ file arch/alpha/eisa/eisa_machdep.c eisa
# include "dev/pci/files.pci" XXX SEE ABOVE
+include "dev/pci/files.agp"
+
file arch/alpha/pci/pciide_machdep.c pciide
define alpha_pci_sgmap_pte64
diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC
index dfff40beaef..1002709705d 100644
--- a/sys/arch/amd64/conf/GENERIC
+++ b/sys/arch/amd64/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.245 2008/10/24 06:10:25 brad Exp $
+# $OpenBSD: GENERIC,v 1.246 2008/11/09 15:11:19 oga Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -263,7 +263,9 @@ wskbd* at pckbd? mux 1
wsmouse* at pms? mux 0
wsmouse* at pmsi? mux 0
-agp* at vga? # AGP bridge
+intagp* at vga? # intel integrated graphics
+agp* at intagp?
+#agp* at vga? # AGP bridge
#option DRM_DEBUG
inteldrm* at vga? # Intel i915, i945 DRM driver
#machdrm* at vga? # mach64 (3D Rage Pro, Rage) DRM driver
diff --git a/sys/arch/amd64/conf/files.amd64 b/sys/arch/amd64/conf/files.amd64
index 35bc57acdbe..7ce88984879 100644
--- a/sys/arch/amd64/conf/files.amd64
+++ b/sys/arch/amd64/conf/files.amd64
@@ -1,4 +1,4 @@
-# $OpenBSD: files.amd64,v 1.40 2008/06/11 09:22:39 phessler Exp $
+# $OpenBSD: files.amd64,v 1.41 2008/11/09 15:11:19 oga Exp $
maxpartitions 16
maxusers 2 16 128
@@ -104,16 +104,15 @@ file arch/amd64/pci/pciide_machdep.c pciide
include "dev/puc/files.puc"
-# AGP devices
-device agp: agp_i810
-attach agp at agpbus
-file arch/amd64/pci/agp_machdep.c agp
-
# PCI Host bridge chipsets
-device pchb: pcibus
+device pchb: pcibus, agpbus
attach pchb at pci
file arch/amd64/pci/pchb.c pchb
+# AGP bridge support. most attach at pchb
+include "dev/pci/files.agp"
+file arch/amd64/pci/agp_machdep.c agp
+
#
# CARDBUS
#
diff --git a/sys/arch/amd64/pci/pchb.c b/sys/arch/amd64/pci/pchb.c
index 662741dccdc..d59508a7d46 100644
--- a/sys/arch/amd64/pci/pchb.c
+++ b/sys/arch/amd64/pci/pchb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pchb.c,v 1.26 2008/09/26 21:15:53 mikeb Exp $ */
+/* $OpenBSD: pchb.c,v 1.27 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: pchb.c,v 1.1 2003/04/26 18:39:50 fvdl Exp $ */
/*
* Copyright (c) 2000 Michael Shalayeff
@@ -142,7 +142,7 @@ pchbattach(struct device *parent, struct device *self, void *aux)
{
struct pchb_softc *sc = (struct pchb_softc *)self;
struct pci_attach_args *pa = aux;
- int has_agp = 0, i, r;
+ int i, r;
switch (PCI_VENDOR(pa->pa_id)) {
case PCI_VENDOR_AMD:
@@ -158,35 +158,8 @@ pchbattach(struct device *parent, struct device *self, void *aux)
break;
case PCI_VENDOR_INTEL:
switch (PCI_PRODUCT(pa->pa_id)) {
-
- /*
- * As for Intel AGP, the host bridge is either in GFX mode
- * (internal graphics) or in AGP mode. In GFX mode, we pretend
- * to have AGP because the graphics memory access is very
- * similar and the AGP GATT code will deal with this. In the
- * latter case, the pci_get_capability(PCI_CAP_AGP) test below
- * will fire, so we do no harm by already setting the flag.
- */
-
- /* AGP only */
- case PCI_PRODUCT_INTEL_82915GM_HB:
- case PCI_PRODUCT_INTEL_82945GM_HB:
- case PCI_PRODUCT_INTEL_82945GME_HB:
- case PCI_PRODUCT_INTEL_82G965_HB:
- case PCI_PRODUCT_INTEL_82Q965_HB:
- case PCI_PRODUCT_INTEL_82GM965_HB:
- case PCI_PRODUCT_INTEL_82G33_HB:
- case PCI_PRODUCT_INTEL_82G35_HB:
- case PCI_PRODUCT_INTEL_82Q35_HB:
- has_agp = 1;
- break;
-
- /* AGP + RNG */
case PCI_PRODUCT_INTEL_82915G_HB:
case PCI_PRODUCT_INTEL_82945G_HB:
- has_agp = 1;
- /* FALLTHROUGH */
-
case PCI_PRODUCT_INTEL_82925X_HB:
case PCI_PRODUCT_INTEL_82955X_HB:
sc->sc_bt = pa->pa_memt;
@@ -232,15 +205,19 @@ pchbattach(struct device *parent, struct device *self, void *aux)
#if NAGP > 0
/*
- * If we haven't detected AGP yet (via a product ID),
- * then check for AGP capability on the device.
+ * Intel IGD have an odd interface and attach at vga, however
+ * in that mode they don't have the AGP cap bit, so this
+ * test should be sufficient
*/
- if (has_agp ||
- pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
+ if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
NULL, NULL) != 0) {
- agp_set_pchb(pa);
+ struct agp_attach_args aa;
+ aa.aa_busname = "agp";
+ aa.aa_pa = pa;
+
+ config_found(self, &aa, agpdev_print);
}
-#endif
+#endif /* NAGP > 0 */
}
int
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC
index d4bf04a9bd6..de8ff873db1 100644
--- a/sys/arch/i386/conf/GENERIC
+++ b/sys/arch/i386/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.638 2008/10/24 06:10:25 brad Exp $
+# $OpenBSD: GENERIC,v 1.639 2008/11/09 15:11:19 oga Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -330,7 +330,20 @@ wskbd* at pckbd? mux 1
wsmouse* at pms? mux 0
wsmouse* at pmsi? mux 0
-agp* at vga? # AGP bridges
+intagp* at vga? # intel integrated graphics agp
+aliagp* at pchb?
+amdagp* at pchb?
+intelagp* at pchb?
+sisagp* at pchb?
+viaagp* at pchb?
+
+agp* at intagp? # AGP bridges
+agp* at aliagp? # AGP bridges
+agp* at amdagp? # AGP bridges
+agp* at intelagp? # AGP bridges
+agp* at sisagp? # AGP bridges
+agp* at viaagp? # AGP bridges
+
#option DRM_DEBUG
inteldrm* at vga? # Intel i915, i945 DRM driver
#machdrm* at vga? # mach64 (3D Rage Pro, Rage) DRM driver
diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386
index 21b51d2a205..651dfa007c7 100644
--- a/sys/arch/i386/conf/files.i386
+++ b/sys/arch/i386/conf/files.i386
@@ -1,4 +1,4 @@
-# $OpenBSD: files.i386,v 1.183 2008/10/10 20:21:38 deraadt Exp $
+# $OpenBSD: files.i386,v 1.184 2008/11/09 15:11:19 oga Exp $
#
# new style config file for i386 architecture
#
@@ -99,16 +99,15 @@ file arch/i386/pci/pci_machdep.c pci
file arch/i386/pci/pciide_machdep.c pciide
file arch/i386/pci/pcic_pci_machdep.c pcic_pci
-# AGP devices
-device agp: agp_ali, agp_amd, agp_i810, agp_intel, agp_sis, agp_via
-attach agp at agpbus
-file arch/i386/pci/agp_machdep.c agp
-
# PCI-Host bridge chipsets
-device pchb: pcibus
+device pchb: pcibus, agpbus
attach pchb at pci
file arch/i386/pci/pchb.c pchb
+# AGP bridge support. most attach at pchb
+include "dev/pci/files.agp"
+file arch/i386/pci/agp_machdep.c agp
+
# AMD Elan SC520 System Controller (PCI-Host bridge)
device elansc: gpiobus
attach elansc at pci
diff --git a/sys/arch/i386/pci/pchb.c b/sys/arch/i386/pci/pchb.c
index 794f1e673f0..6908385e735 100644
--- a/sys/arch/i386/pci/pchb.c
+++ b/sys/arch/i386/pci/pchb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pchb.c,v 1.74 2008/09/26 21:15:53 mikeb Exp $ */
+/* $OpenBSD: pchb.c,v 1.75 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: pchb.c,v 1.65 2007/08/15 02:26:13 markd Exp $ */
/*
@@ -171,19 +171,13 @@ pchbattach(struct device *parent, struct device *self, void *aux)
pcireg_t bcreg;
u_char bdnum, pbnum;
pcitag_t tag;
- int has_agp = 0, i, r;
+ int i, r;
int doattach = 0;
switch (PCI_VENDOR(pa->pa_id)) {
case PCI_VENDOR_AMD:
printf("\n");
switch (PCI_PRODUCT(pa->pa_id)) {
-#ifdef __i386__
- case PCI_PRODUCT_AMD_SC751_SC:
- case PCI_PRODUCT_AMD_762_PCHB:
- has_agp = 1; /* XXX is this detected otherwise */
- break;
-#endif /* __i386__ */
case PCI_PRODUCT_AMD_AMD64_0F_HT:
case PCI_PRODUCT_AMD_AMD64_10_HT:
case PCI_PRODUCT_AMD_AMD64_11_HT:
@@ -303,55 +297,18 @@ pchbattach(struct device *parent, struct device *self, void *aux)
if (pbnum != 0)
doattach = 1;
break;
-#endif /* __i386__ */
-
- /*
- * As for Intel AGP, the host bridge is either in GFX mode
- * (internal graphics) or in AGP mode. In GFX mode, we pretend
- * to have AGP because the graphics memory access is very
- * similar and the AGP GATT code will deal with this. In the
- * latter case, the pci_get_capability(PCI_CAP_AGP) test below
- * will fire, so we do no harm by already setting the flag.
- */
-
- /* AGP only */
-#ifdef __i386__
- case PCI_PRODUCT_INTEL_82830M_HB:
- case PCI_PRODUCT_INTEL_82845G_HB:
- case PCI_PRODUCT_INTEL_82855GM_HB:
- case PCI_PRODUCT_INTEL_82865G_HB:
-#endif /* __i386__ */
- case PCI_PRODUCT_INTEL_82915GM_HB:
- case PCI_PRODUCT_INTEL_82945GM_HB:
- case PCI_PRODUCT_INTEL_82945GME_HB:
- case PCI_PRODUCT_INTEL_82G965_HB:
- case PCI_PRODUCT_INTEL_82Q965_HB:
- case PCI_PRODUCT_INTEL_82GM965_HB:
- case PCI_PRODUCT_INTEL_82G33_HB:
- case PCI_PRODUCT_INTEL_82G35_HB:
- case PCI_PRODUCT_INTEL_82Q35_HB:
- has_agp = 1;
- break;
-
- /* AGP + RNG */
-#ifdef __i386__
+ /* RNG */
case PCI_PRODUCT_INTEL_82810_HB:
case PCI_PRODUCT_INTEL_82810_DC100_HB:
case PCI_PRODUCT_INTEL_82810E_HB:
case PCI_PRODUCT_INTEL_82815_HB:
-#endif /* __i386__ */
- case PCI_PRODUCT_INTEL_82915G_HB:
- case PCI_PRODUCT_INTEL_82945G_HB:
- has_agp = 1;
- /* FALLTHROUGH */
-
- /* RNG only */
-#ifdef __i386__
case PCI_PRODUCT_INTEL_82820_HB:
case PCI_PRODUCT_INTEL_82840_HB:
case PCI_PRODUCT_INTEL_82850_HB:
case PCI_PRODUCT_INTEL_82860_HB:
#endif /* __i386__ */
+ case PCI_PRODUCT_INTEL_82915G_HB:
+ case PCI_PRODUCT_INTEL_82945G_HB:
case PCI_PRODUCT_INTEL_82925X_HB:
case PCI_PRODUCT_INTEL_82955X_HB:
sc->sc_bt = pa->pa_memt;
@@ -397,13 +354,18 @@ pchbattach(struct device *parent, struct device *self, void *aux)
#if NAGP > 0
/*
- * If we haven't detected AGP yet (via a product ID),
- * then check for AGP capability on the device.
+ * Intel IGD have an odd interface and attach at vga, however,
+ * in that mode they don't have the AGP cap bit, so this
+ * test should be sufficient
*/
- if (has_agp ||
- pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
- NULL, NULL) != 0)
- agp_set_pchb(pa);
+ if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
+ NULL, NULL) != 0) {
+ struct agp_attach_args aa;
+ aa.aa_busname = "agp";
+ aa.aa_pa = pa;
+
+ config_found(self, &aa, agpdev_print);
+ }
#endif /* NAGP > 0 */
#ifdef __i386__
if (doattach == 0)
diff --git a/sys/conf/files b/sys/conf/files
index 49c5c5f2c08..912f7f72939 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1,4 +1,4 @@
-# $OpenBSD: files,v 1.444 2008/10/15 23:23:51 deraadt Exp $
+# $OpenBSD: files,v 1.445 2008/11/09 15:11:19 oga Exp $
# $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93
@@ -97,16 +97,15 @@ file dev/ic/pcdisplay_chars.c pcdisplayops
define mk48txx
file dev/ic/mk48txx.c mk48txx
-# AGP
-define agpbus {}
-include "dev/pci/files.agp"
+# agp integrated graphics attaches at vga. defines are in dev/pci/files.agp
+define agpint {}
# DRM - Direct Rendering Manager: /dev/drm
define drm {}
include "dev/pci/drm/files.drm"
# VGA graphics
-device vga: wsemuldisplaydev, pcdisplayops, drm, agpbus
+device vga: wsemuldisplaydev, pcdisplayops, drm, agpint
file dev/ic/vga.c vga & (vga_pci | vga_isa) needs-flag
file dev/ic/vga_subr.c vga & (vga_pci | vga_isa) needs-flag
@@ -415,6 +414,7 @@ define cbbus {[slot = -1]} # CardBus attachment
define pcmciaslot {[slot = -1]} # PCMCIA slot itself
define sdmmcbus {} # SD/MMC attachment
define btbus {} # Bluetooth host controller
+define agpbus {} # AGP bridge
# UHCI USB controller
device uhci: usbus
diff --git a/sys/dev/pci/agp.c b/sys/dev/pci/agp.c
index 85475c592b9..91051ee9349 100644
--- a/sys/dev/pci/agp.c
+++ b/sys/dev/pci/agp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp.c,v 1.26 2008/09/26 21:15:53 mikeb Exp $ */
+/* $OpenBSD: agp.c,v 1.27 2008/11/09 15:11:19 oga Exp $ */
/*-
* Copyright (c) 2000 Doug Rabson
* All rights reserved.
@@ -46,18 +46,48 @@
#include <dev/pci/agpvar.h>
#include <dev/pci/agpreg.h>
-#include "agp_ali.h"
-#include "agp_amd.h"
-#include "agp_amd64.h"
-#include "agp_apple.h"
-#include "agp_i810.h"
-#include "agp_intel.h"
-#include "agp_sis.h"
-#include "agp_via.h"
+/*
+ * the enable and {alloc, free, bind, unbind} memory routines have default
+ * fallbacks, these macros do the right thing. The callbacks with no fallback
+ * are called directly. These are mostly hacks around the weirdness of intel
+ * integrated graphics, since they are not technically a true agp chipset,
+ * but provide an almost identical interface.
+ */
+#define AGP_ENABLE(sc, m) ((sc->sc_methods->enable != NULL) ? \
+ sc->sc_methods->enable(sc->sc_chipc, m) : \
+ agp_generic_enable(sc, m))
+
+#define AGP_ALLOC_MEMORY(sc, t, s) ((sc->sc_methods->alloc_memory != NULL) ? \
+ sc->sc_methods->alloc_memory(sc->sc_chipc, t, s) : \
+ agp_generic_alloc_memory(sc, t, s))
+
+#define AGP_FREE_MEMORY(sc, m) ((sc->sc_methods->free_memory != NULL) ? \
+ sc->sc_methods->free_memory(sc->sc_chipc, m) : \
+ agp_generic_free_memory(sc, m))
+
+#define AGP_BIND_MEMORY(sc, m, o) ((sc->sc_methods->bind_memory != NULL) ? \
+ sc->sc_methods->bind_memory(sc->sc_chipc, m, o) : \
+ agp_generic_bind_memory(sc, m, o))
+
+#define AGP_UNBIND_MEMORY(sc, m) ((sc->sc_methods->unbind_memory != NULL) ? \
+ sc->sc_methods->unbind_memory(sc->sc_chipc, m) : \
+ agp_generic_unbind_memory(sc, m))
+
+int agp_generic_enable(struct agp_softc *, u_int32_t);
+struct agp_memory *
+ agp_generic_alloc_memory(struct agp_softc *, int, vsize_t size);
+int agp_generic_free_memory(struct agp_softc *, struct agp_memory *);
+void agp_attach(struct device *, struct device *, void *);
+int agp_probe(struct device *, void *, void *);
+int agpbusprint(void *, const char *);
+paddr_t agpmmap(void *, off_t, int);
+int agpioctl(dev_t, u_long, caddr_t, int, struct proc *);
+int agpopen(dev_t, int, int, struct proc *);
+int agpclose(dev_t, int, int , struct proc *);
struct agp_memory *agp_find_memory(struct agp_softc *sc, int id);
-const struct agp_product *agp_lookup(struct pci_attach_args *pa);
/* userland ioctl functions */
+int agpvga_match(struct pci_attach_args *);
int agp_info_user(void *, agp_info *);
int agp_setup_user(void *, agp_setup *);
int agp_allocate_user(void *, agp_allocate *);
@@ -67,137 +97,133 @@ int agp_unbind_user(void *, agp_unbind *);
int agp_acquire_helper(void *dev, enum agp_acquire_state state);
int agp_release_helper(void *dev, enum agp_acquire_state state);
-const struct agp_product agp_products[] = {
-#if NAGP_ALI > 0
- { PCI_VENDOR_ALI, -1, agp_ali_attach },
-#endif
-#if NAGP_AMD > 0
- { PCI_VENDOR_AMD, -1, agp_amd_attach },
-#endif
-#if NAGP_I810 > 0
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82810_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82810_DC100_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82810E_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82815_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82830M_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82845G_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82855GM_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82865G_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82915G_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82915GM_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82945G_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82945GM_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82945GME_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82G965_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82Q965_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82GM965_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82G33_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82G35_HB, agp_i810_attach },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82Q35_HB, agp_i810_attach },
-#endif
-#if NAGP_INTEL > 0
- { PCI_VENDOR_INTEL, -1, agp_intel_attach },
-#endif
-#if NAGP_SIS > 0
- { PCI_VENDOR_SIS, -1, agp_sis_attach },
-#endif
-#if NAGP_VIA > 0
- { PCI_VENDOR_VIATECH, -1, agp_via_attach },
-#endif
- { 0, 0, NULL }
-};
+int
+agpdev_print(void *aux, const char *pnp)
+{
+ if (pnp) {
+ printf("agp at %s", pnp);
+ }
+ return (UNCONF);
+}
+int
+agpbus_probe(struct agp_attach_args *aa)
+{
+ struct pci_attach_args *pa = aa->aa_pa;
+
+ if (strncmp(aa->aa_busname, "agp", 3) == 0 &&
+ PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
+ PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_HOST)
+ return (1);
+ return (0);
+}
+/*
+ * Find the video card hanging off the agp bus XXX assumes only one bus
+ */
int
-agp_probe(struct device *parent, void *match, void *aux)
+agpvga_match(struct pci_attach_args *pa)
+{
+ if (PCI_CLASS(pa->pa_class) == PCI_CLASS_DISPLAY &&
+ PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_DISPLAY_VGA) {
+ if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
+ NULL, NULL))
+ return (1);
+ }
+ return (0);
+}
+
+struct device *
+agp_attach_bus(struct pci_attach_args *pa, const struct agp_methods *methods,
+ int bar, pcireg_t type, struct device *dev)
{
- struct agpbus_attach_args *aaa = aux;
- struct pci_attach_args *pa = &aaa->apa_pci_args;
+ struct agpbus_attach_args arg;
- /* pci_args must be a pchb */
- if (PCI_CLASS(pa->pa_class) != PCI_CLASS_BRIDGE ||
- PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_BRIDGE_HOST)
- return (0);
+ arg.aa_methods = methods;
+ arg.aa_pa = pa;
+ arg.aa_bar = bar;
+ arg.aa_type = type;
- if (agp_lookup(pa) == NULL)
- return (0);
+ printf("\n"); /* newline from the driver that called us */
+ return (config_found(dev, &arg, agpdev_print));
+}
+int
+agp_probe(struct device *parent, void *match, void *aux)
+{
+ /*
+ * we don't do any checking here, driver we're attaching this
+ * interface to should have already done it.
+ */
return (1);
}
void
agp_attach(struct device *parent, struct device *self, void *aux)
{
- struct agpbus_attach_args *aaa = aux;
- struct pci_attach_args *pa = &aaa->apa_pci_args;
+ struct agpbus_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
struct agp_softc *sc = (struct agp_softc *)self;
- const struct agp_product *ap;
u_int memsize;
- int i, ret;
-
- ap = agp_lookup(pa);
- if (ap) {
- static const int agp_max[][2] = {
- {0, 0},
- {32, 4},
- {64, 28},
- {128, 96},
- {256, 204},
- {512, 440},
- {1024, 942},
- {2048, 1920},
- {4096, 3932}
- };
-#define agp_max_size (sizeof(agp_max)/sizeof(agp_max[0]))
-
- /*
- * Work out an upper bound for agp memory allocation. This
- * uses a heuristic table from the Linux driver.
- */
- memsize = ptoa(physmem) >> 20;
+ int i;
- for (i = 0; i < agp_max_size && memsize > agp_max[i][0]; i++)
- ;
- if (i == agp_max_size)
- i = agp_max_size - 1;
- sc->sc_maxmem = agp_max[i][1] << 20;
+ sc->sc_chipc = parent;
+ sc->sc_methods = aa->aa_methods;
+
+ static const int agp_max[][2] = {
+ {0, 0},
+ {32, 4},
+ {64, 28},
+ {128, 96},
+ {256, 204},
+ {512, 440},
+ {1024, 942},
+ {2048, 1920},
+ {4096, 3932}
+ };
+#define agp_max_size (sizeof(agp_max)/sizeof(agp_max[0]))
- /*
- * The lock is used to prevent re-entry to
- * agp_generic_bind_memory() since that function can sleep.
- */
+ /*
+ * Work out an upper bound for agp memory allocation. This
+ * uses a heuristic table from the Linux driver.
+ */
+ memsize = ptoa(physmem) >> 20;
- rw_init(&sc->sc_lock, "agplk");
+ for (i = 0; i < agp_max_size && memsize > agp_max[i][0]; i++)
+ ;
+ if (i == agp_max_size)
+ i = agp_max_size - 1;
+ sc->sc_maxmem = agp_max[i][1] << 20;
- TAILQ_INIT(&sc->sc_memory);
+ /*
+ * The lock is used to prevent re-entry to
+ * agp_generic_bind_memory() since that function can sleep.
+ */
+ rw_init(&sc->sc_lock, "agplk");
- sc->sc_pcitag = pa->pa_tag;
- sc->sc_pc = pa->pa_pc;
- sc->sc_id = pa->pa_id;
- sc->sc_dmat = pa->pa_dmat;
- sc->sc_memt = pa->pa_memt;
- sc->sc_vgapcitag = aaa->apa_vga_args.pa_tag;
- sc->sc_vgapc = aaa->apa_vga_args.pa_pc;
+ TAILQ_INIT(&sc->sc_memory);
- pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_AGP,
- &sc->sc_capoff, NULL);
+ sc->sc_pcitag = pa->pa_tag;
+ sc->sc_pc = pa->pa_pc;
+ sc->sc_id = pa->pa_id;
+ sc->sc_dmat = pa->pa_dmat;
- sc->vga_softc = (struct vga_pci_softc *)parent;
+ pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_AGP,
+ &sc->sc_capoff, NULL);
- printf(": ");
- ret = (*ap->ap_attach)(sc, pa);
- if (ret == 0)
- printf("aperture at 0x%lx, size 0x%lx\n",
- (u_long)sc->sc_apaddr,
- (u_long)AGP_GET_APERTURE(sc));
- else {
- sc->sc_chipc = NULL;
- }
+ printf(": ");
+ if (agp_map_aperture(pa, sc, aa->aa_bar, aa->aa_type) != 0) {
+ printf("can't map aperture\n");
+ sc->sc_chipc = NULL;
+ return;
}
+
+ printf("aperture at 0x%lx, size 0x%lx\n", (u_long)sc->sc_apaddr,
+ (u_long)sc->sc_methods->get_aperture(sc->sc_chipc));
}
struct cfattach agp_ca = {
- sizeof (struct agp_softc), agp_probe, agp_attach,
+ sizeof(struct agp_softc), agp_probe, agp_attach,
NULL, NULL
};
@@ -212,7 +238,7 @@ agpmmap(void *v, off_t off, int prot)
if (sc->sc_apaddr) {
- if (off > AGP_GET_APERTURE(sc))
+ if (off > sc->sc_methods->get_aperture(sc->sc_chipc))
return (-1);
/*
@@ -229,10 +255,7 @@ agpopen(dev_t dev, int oflags, int devtype, struct proc *p)
{
struct agp_softc *sc = agp_find_device(AGPUNIT(dev));
- if (sc == NULL)
- return (ENXIO);
-
- if (sc->sc_chipc == NULL)
+ if (sc == NULL || sc->sc_chipc == NULL)
return (ENXIO);
if (!sc->sc_opened)
@@ -249,7 +272,7 @@ agpioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *pb)
{
struct agp_softc *sc = agp_find_device(AGPUNIT(dev));
- if (sc ==NULL)
+ if (sc == NULL)
return (ENODEV);
if (sc->sc_methods == NULL || sc->sc_chipc == NULL)
@@ -300,8 +323,9 @@ agpclose(dev_t dev, int flags, int devtype, struct proc *p)
*/
if (sc->sc_state == AGP_ACQUIRE_USER) {
while ((mem = TAILQ_FIRST(&sc->sc_memory)) != 0) {
- if (mem->am_is_bound)
+ if (mem->am_is_bound) {
AGP_UNBIND_MEMORY(sc, mem);
+ }
AGP_FREE_MEMORY(sc, mem);
}
agp_release_helper(sc, AGP_ACQUIRE_USER);
@@ -325,78 +349,30 @@ agp_find_memory(struct agp_softc *sc, int id)
return (0);
}
-const struct agp_product *
-agp_lookup(struct pci_attach_args *pa)
-{
- const struct agp_product *ap;
-
- /* First find the vendor. */
- for (ap = agp_products; ap->ap_attach != NULL; ap++)
- if (ap->ap_vendor == PCI_VENDOR(pa->pa_id))
- break;
-
- if (ap->ap_attach == NULL)
- return (NULL);
-
- /* Now find the product within the vendor's domain. */
- for (; ap->ap_attach != NULL; ap++) {
- /* Ran out of this vendor's section of the table. */
- if (ap->ap_vendor != PCI_VENDOR(pa->pa_id))
- return (NULL);
-
- if (ap->ap_product == PCI_PRODUCT(pa->pa_id))
- break; /* Exact match. */
- if (ap->ap_product == (u_int32_t) -1)
- break; /* Wildcard match. */
- }
-
- if (ap->ap_attach == NULL)
- ap = NULL;
-
- return (ap);
-}
-
int
agp_map_aperture(struct pci_attach_args *pa, struct agp_softc *sc, u_int32_t bar, u_int32_t memtype)
{
/* Find the aperture. Don't map it (yet), this would eat KVA */
- if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, bar,
- memtype, &sc->sc_apaddr, &sc->sc_apsize,
- &sc->sc_apflags) != 0)
+ if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, bar, memtype,
+ &sc->sc_apaddr, NULL, NULL) != 0)
return (ENXIO);
return (0);
}
-u_int32_t
-agp_generic_get_aperture(struct agp_softc *sc)
-{
- return (sc->sc_apsize);
-}
-
-int
-agp_generic_set_aperture(struct agp_softc *sc, u_int32_t aperture)
-{
- if (aperture != AGP_GET_APERTURE(sc))
- return (EINVAL);
-
- return (0);
-}
-
struct agp_gatt *
-agp_alloc_gatt(struct agp_softc *sc)
+agp_alloc_gatt(bus_dma_tag_t dmat, u_int32_t apsize)
{
- u_int32_t apsize = AGP_GET_APERTURE(sc);
- u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
- struct agp_gatt *gatt;
- int nseg;
+ struct agp_gatt *gatt;
+ u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
+ int nseg;
gatt = malloc(sizeof(*gatt), M_AGP, M_NOWAIT | M_ZERO);
if (!gatt)
return (NULL);
gatt->ag_entries = entries;
- if (agp_alloc_dmamem(sc->sc_dmat, entries * sizeof(u_int32_t),
+ if (agp_alloc_dmamem(dmat, entries * sizeof(u_int32_t),
0, &gatt->ag_dmamap, (caddr_t *)&gatt->ag_virtual,
&gatt->ag_physical, &gatt->ag_dmaseg, 1, &nseg) != 0)
return (NULL);
@@ -409,28 +385,22 @@ agp_alloc_gatt(struct agp_softc *sc)
}
void
-agp_free_gatt(struct agp_softc *sc, struct agp_gatt *gatt)
+agp_free_gatt(bus_dma_tag_t dmat, struct agp_gatt *gatt)
{
- agp_free_dmamem(sc->sc_dmat, gatt->ag_size, gatt->ag_dmamap,
+ agp_free_dmamem(dmat, gatt->ag_size, gatt->ag_dmamap,
(caddr_t)gatt->ag_virtual, &gatt->ag_dmaseg, 1);
free(gatt, M_AGP);
}
int
-agp_generic_detach(struct agp_softc *sc)
-{
- agp_flush_cache();
- return (0);
-}
-
-int
agp_generic_enable(struct agp_softc *sc, u_int32_t mode)
{
- pcireg_t tstatus, mstatus;
- pcireg_t command;
- int rq, sba, fw, rate, capoff;
+ struct pci_attach_args pa;
+ pcireg_t tstatus, mstatus, command;
+ int rq, sba, fw, rate, capoff;
- if (pci_get_capability(sc->sc_vgapc, sc->sc_vgapcitag, PCI_CAP_AGP,
+ if (pci_find_device(&pa, agpvga_match) == 0 ||
+ pci_get_capability(pa.pa_pc, pa.pa_tag, PCI_CAP_AGP,
&capoff, NULL) == 0) {
printf("agp_generic_enable: not an AGP capable device\n");
return (-1);
@@ -439,7 +409,7 @@ agp_generic_enable(struct agp_softc *sc, u_int32_t mode)
tstatus = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
sc->sc_capoff + AGP_STATUS);
/* display agp mode */
- mstatus = pci_conf_read(sc->sc_vgapc, sc->sc_vgapcitag,
+ mstatus = pci_conf_read(pa.pa_pc, pa.pa_tag,
capoff + AGP_STATUS);
/* Set RQ to the min of mode, tstatus and mstatus */
@@ -479,8 +449,7 @@ agp_generic_enable(struct agp_softc *sc, u_int32_t mode)
pci_conf_write(sc->sc_pc, sc->sc_pcitag,
sc->sc_capoff + AGP_COMMAND, command);
- pci_conf_write(sc->sc_vgapc, sc->sc_vgapcitag, capoff + AGP_COMMAND,
- command);
+ pci_conf_write(pa.pa_pc, pa.pa_tag, capoff + AGP_COMMAND, command);
return (0);
}
@@ -541,9 +510,9 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
return (EINVAL);
}
- if (offset < 0
- || (offset & (AGP_PAGE_SIZE - 1)) != 0
- || offset + mem->am_size > AGP_GET_APERTURE(sc)) {
+ if (offset < 0 || (offset & (AGP_PAGE_SIZE - 1)) != 0
+ || offset + mem->am_size >
+ sc->sc_methods->get_aperture(sc->sc_chipc)) {
printf("AGP: binding memory at bad offset %#lx\n",
(unsigned long) offset);
rw_exit_write(&sc->sc_lock);
@@ -606,14 +575,16 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
AGP_DPF("binding offset %#lx to pa %#lx\n",
(unsigned long)(offset + done + j),
(unsigned long)pa);
- error = AGP_BIND_PAGE(sc, offset + done + j, pa);
+ error = sc->sc_methods->bind_page(sc->sc_chipc,
+ offset + done + j, pa);
if (error) {
/*
* Bail out. Reverse all the mappings
* and unwire the pages.
*/
for (k = 0; k < done + j; k += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(sc, offset + k);
+ sc->sc_methods->unbind_page(
+ sc->sc_chipc, offset + k);
bus_dmamap_unload(sc->sc_dmat, mem->am_dmamap);
bus_dmamem_unmap(sc->sc_dmat, mem->am_virtual,
@@ -638,7 +609,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
/*
* Make sure the chipset gets the new mappings.
*/
- AGP_FLUSH_TLB(sc);
+ sc->sc_methods->flush_tlb(sc->sc_chipc);
mem->am_offset = offset;
mem->am_is_bound = 1;
@@ -667,10 +638,10 @@ agp_generic_unbind_memory(struct agp_softc *sc, struct agp_memory *mem)
* TLB. Unwire the pages so they can be swapped.
*/
for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(sc, mem->am_offset + i);
+ sc->sc_methods->unbind_page(sc->sc_chipc, mem->am_offset + i);
agp_flush_cache();
- AGP_FLUSH_TLB(sc);
+ sc->sc_methods->flush_tlb(sc->sc_chipc);
bus_dmamap_unload(sc->sc_dmat, mem->am_dmamap);
bus_dmamem_unmap(sc->sc_dmat, mem->am_virtual, mem->am_size);
@@ -807,7 +778,7 @@ agp_info_user(void *dev, agp_info *info)
else
info->agp_mode = 0; /* i810 doesn't have real AGP */
info->aper_base = sc->sc_apaddr;
- info->aper_size = AGP_GET_APERTURE(sc) >> 20;
+ info->aper_size = sc->sc_methods->get_aperture(sc->sc_chipc) >> 20;
info->pg_total =
info->pg_system = sc->sc_maxmem >> AGP_PAGE_SHIFT;
info->pg_used = sc->sc_allocated >> AGP_PAGE_SHIFT;
@@ -818,7 +789,7 @@ agp_info_user(void *dev, agp_info *info)
int
agp_setup_user(void *dev, agp_setup *setup)
{
- struct agp_softc *sc = (struct agp_softc *) dev;
+ struct agp_softc *sc = (struct agp_softc *)dev;
return (AGP_ENABLE(sc, setup->agp_mode));
}
@@ -826,7 +797,7 @@ agp_setup_user(void *dev, agp_setup *setup)
int
agp_allocate_user(void *dev, agp_allocate *alloc)
{
- struct agp_softc *sc = (struct agp_softc *) dev;
+ struct agp_softc *sc = (struct agp_softc *)dev;
struct agp_memory* mem;
size_t size = alloc->pg_count << AGP_PAGE_SHIFT;
@@ -901,10 +872,13 @@ agp_get_info(void *dev, struct agp_info *info)
{
struct agp_softc *sc = (struct agp_softc *)dev;
- info->ai_mode = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
- sc->sc_capoff + AGP_STATUS);
+ if (sc->sc_capoff != 0)
+ info->ai_mode = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ AGP_STATUS + sc->sc_capoff);
+ else
+ info->ai_mode = 0; /* i810 doesn't have real AGP */
info->ai_aperture_base = sc->sc_apaddr;
- info->ai_aperture_size = sc->sc_apsize;
+ info->ai_aperture_size = sc->sc_methods->get_aperture(sc->sc_chipc);
info->ai_memory_allowed = sc->sc_maxmem;
info->ai_memory_used = sc->sc_allocated;
}
@@ -938,7 +912,7 @@ agp_alloc_memory(void *dev, int type, vsize_t bytes)
{
struct agp_softc *sc = (struct agp_softc *)dev;
- return ((void *) AGP_ALLOC_MEMORY(sc, type, bytes));
+ return (AGP_ALLOC_MEMORY(sc, type, bytes));
}
void
diff --git a/sys/dev/pci/agp_ali.c b/sys/dev/pci/agp_ali.c
index f6ed191562c..eea5d6b081f 100644
--- a/sys/dev/pci/agp_ali.c
+++ b/sys/dev/pci/agp_ali.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp_ali.c,v 1.5 2007/11/26 15:35:15 deraadt Exp $ */
+/* $OpenBSD: agp_ali.c,v 1.6 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agp_ali.c,v 1.2 2001/09/15 00:25:00 thorpej Exp $ */
@@ -30,8 +30,6 @@
* $FreeBSD: src/sys/pci/agp_ali.c,v 1.3 2001/07/05 21:28:46 jhb Exp $
*/
-
-
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
@@ -44,6 +42,7 @@
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
#include <dev/pci/vga_pcivar.h>
#include <dev/pci/agpvar.h>
#include <dev/pci/agpreg.h>
@@ -51,80 +50,91 @@
#include <machine/bus.h>
struct agp_ali_softc {
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
+ struct device dev;
+ struct agp_softc *agpdev;
+ struct agp_gatt *gatt;
+ pci_chipset_tag_t asc_pc;
+ pcitag_t asc_tag;
+ bus_size_t initial_aperture;
};
-u_int32_t agp_ali_get_aperture(struct agp_softc *);
-int agp_ali_set_aperture(struct agp_softc *sc, u_int32_t);
-int agp_ali_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_ali_unbind_page(struct agp_softc *, off_t);
-void agp_ali_flush_tlb(struct agp_softc *);
+void agp_ali_attach(struct device *, struct device *, void *);
+int agp_ali_probe(struct device *, void *, void *);
+bus_size_t agp_ali_get_aperture(void *);
+int agp_ali_set_aperture(void *sc, bus_size_t);
+int agp_ali_bind_page(void *, off_t, bus_addr_t);
+int agp_ali_unbind_page(void *, off_t);
+void agp_ali_flush_tlb(void *);
+
+struct cfattach aliagp_ca = {
+ sizeof(struct agp_ali_softc), agp_ali_probe, agp_ali_attach
+};
-struct agp_methods agp_ali_methods = {
+struct cfdriver aliagp_cd = {
+ NULL, "aliagp", DV_DULL
+};
+
+const struct agp_methods agp_ali_methods = {
agp_ali_get_aperture,
- agp_ali_set_aperture,
agp_ali_bind_page,
agp_ali_unbind_page,
agp_ali_flush_tlb,
- agp_generic_enable,
- agp_generic_alloc_memory,
- agp_generic_free_memory,
- agp_generic_bind_memory,
- agp_generic_unbind_memory,
};
-int
-agp_ali_attach(struct agp_softc *sc, struct pci_attach_args *pa)
+int
+agp_ali_probe(struct device *parent, void *match, void *aux)
{
- struct agp_ali_softc *asc;
- struct agp_gatt *gatt;
- pcireg_t reg;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
- asc = malloc(sizeof *asc, M_AGP, M_NOWAIT);
- if (asc == NULL) {
- printf("failed to allocate softc\n");
- return (ENOMEM);
- }
- sc->sc_chipc = asc;
- sc->sc_methods = &agp_ali_methods;
+ /* Must be a pchb */
+ if (agpbus_probe(aa) == 1 && PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALI)
+ return (1);
+ return (0);
+}
- if (agp_map_aperture(pa, sc, AGP_APBASE, PCI_MAPREG_TYPE_MEM) != 0) {
- printf("failed to map aperture\n");
- free(asc, M_AGP);
- return (ENXIO);
- }
+void
+agp_ali_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct agp_ali_softc *asc = (struct agp_ali_softc *)self;
+ struct agp_gatt *gatt;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+ pcireg_t reg;
- asc->initial_aperture = agp_ali_get_aperture(sc);
+ asc->asc_tag = pa->pa_tag;
+ asc->asc_pc = pa->pa_pc;
+ asc->initial_aperture = agp_ali_get_aperture(asc);
for (;;) {
- gatt = agp_alloc_gatt(sc);
+ bus_size_t size = agp_ali_get_aperture(asc);
+ gatt = agp_alloc_gatt(pa->pa_dmat, size);
if (gatt != NULL)
break;
-
/*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
+ * almost certainly error allocating contigious dma memory
+ * so reduce aperture so that the gatt size reduces.
*/
- if (AGP_SET_APERTURE(sc, AGP_GET_APERTURE(sc) / 2)) {
- agp_generic_detach(sc);
+ if (agp_ali_set_aperture(asc, size / 2)) {
printf("failed to set aperture\n");
- return (ENOMEM);
+ return;
}
}
asc->gatt = gatt;
/* Install the gatt. */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_ALI_ATTBASE);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_ALI_ATTBASE);
reg = (reg & 0xff) | gatt->ag_physical;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_ALI_ATTBASE, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_ALI_ATTBASE, reg);
/* Enable the TLB. */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_ALI_TLBCTRL);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_ALI_TLBCTRL);
reg = (reg & ~0xff) | 0x10;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_ALI_TLBCTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_ALI_TLBCTRL, reg);
- return (0);
+ asc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_ali_methods,
+ AGP_APBASE, PCI_MAPREG_TYPE_MEM, &asc->dev);
+ return;
}
#if 0
@@ -173,16 +183,17 @@ static const u_int32_t agp_ali_table[] = {
};
#define agp_ali_table_size (sizeof(agp_ali_table) / sizeof(agp_ali_table[0]))
-u_int32_t
-agp_ali_get_aperture(struct agp_softc *sc)
+bus_size_t
+agp_ali_get_aperture(void *sc)
{
- int i;
+ struct agp_ali_softc *asc = sc;
+ int i;
/*
* The aperture size is derived from the low bits of attbase.
* I'm not sure this is correct..
*/
- i = (int)pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ i = (int)pci_conf_read(asc->asc_pc, asc->asc_tag,
AGP_ALI_ATTBASE) & 0xff;
if (i >= agp_ali_table_size)
return (0);
@@ -190,10 +201,11 @@ agp_ali_get_aperture(struct agp_softc *sc)
}
int
-agp_ali_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+agp_ali_set_aperture(void *sc, bus_size_t aperture)
{
- int i;
- pcireg_t reg;
+ struct agp_ali_softc *asc = sc;
+ int i;
+ pcireg_t reg;
for (i = 0; i < agp_ali_table_size; i++)
if (agp_ali_table[i] == aperture)
@@ -201,17 +213,17 @@ agp_ali_set_aperture(struct agp_softc *sc, u_int32_t aperture)
if (i == agp_ali_table_size)
return (EINVAL);
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_ALI_ATTBASE);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_ALI_ATTBASE);
reg &= ~0xff;
reg |= i;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_ALI_ATTBASE, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_ALI_ATTBASE, reg);
return (0);
}
int
-agp_ali_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_ali_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_ali_softc *asc = sc->sc_chipc;
+ struct agp_ali_softc *asc = sc;
if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -221,9 +233,9 @@ agp_ali_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
}
int
-agp_ali_unbind_page(struct agp_softc *sc, off_t offset)
+agp_ali_unbind_page(void *sc, off_t offset)
{
- struct agp_ali_softc *asc = sc->sc_chipc;
+ struct agp_ali_softc *asc = sc;
if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -233,16 +245,17 @@ agp_ali_unbind_page(struct agp_softc *sc, off_t offset)
}
void
-agp_ali_flush_tlb(struct agp_softc *sc)
+agp_ali_flush_tlb(void *sc)
{
- pcireg_t reg;
+ struct agp_ali_softc *asc = sc;
+ pcireg_t reg;
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_ALI_TLBCTRL);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_ALI_TLBCTRL);
reg &= ~0xff;
reg |= 0x90;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_ALI_TLBCTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_ALI_TLBCTRL, reg);
reg &= ~0xff;
reg |= 0x10;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_ALI_TLBCTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_ALI_TLBCTRL, reg);
}
diff --git a/sys/dev/pci/agp_amd.c b/sys/dev/pci/agp_amd.c
index 1c3a3e2b31d..714213f7b00 100644
--- a/sys/dev/pci/agp_amd.c
+++ b/sys/dev/pci/agp_amd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp_amd.c,v 1.8 2007/12/07 17:35:22 oga Exp $ */
+/* $OpenBSD: agp_amd.c,v 1.9 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agp_amd.c,v 1.6 2001/10/06 02:48:50 thorpej Exp $ */
/*-
@@ -29,8 +29,6 @@
* $FreeBSD: src/sys/pci/agp_amd.c,v 1.6 2001/07/05 21:28:46 jhb Exp $
*/
-
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -67,39 +65,45 @@ struct agp_amd_gatt {
};
struct agp_amd_softc {
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_amd_gatt *gatt;
- bus_space_handle_t ioh;
- bus_space_tag_t iot;
+ struct device dev;
+ struct agp_softc *agpdev;
+ struct agp_amd_gatt *gatt;
+ pci_chipset_tag_t asc_pc;
+ pcitag_t asc_tag;
+ bus_space_handle_t ioh;
+ bus_space_tag_t iot;
+ bus_size_t initial_aperture;
};
-u_int32_t agp_amd_get_aperture(struct agp_softc *);
-struct agp_amd_gatt * agp_amd_alloc_gatt(struct agp_softc *);
-int agp_amd_set_aperture(struct agp_softc *, u_int32_t);
-int agp_amd_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_amd_unbind_page(struct agp_softc *, off_t);
-void agp_amd_flush_tlb(struct agp_softc *);
+void agp_amd_attach(struct device *, struct device *, void *);
+int agp_amd_probe(struct device *, void *, void *);
+bus_size_t agp_amd_get_aperture(void *);
+struct agp_amd_gatt *agp_amd_alloc_gatt(bus_dma_tag_t, bus_size_t);
+int agp_amd_set_aperture(void *, bus_size_t);
+int agp_amd_bind_page(void *, off_t, bus_addr_t);
+int agp_amd_unbind_page(void *, off_t);
+void agp_amd_flush_tlb(void *);
+
+struct cfattach amdagp_ca = {
+ sizeof(struct agp_amd_softc), agp_amd_probe, agp_amd_attach
+};
+struct cfdriver amdagp_cd = {
+ NULL, "amdagp", DV_DULL
+};
-struct agp_methods agp_amd_methods = {
+const struct agp_methods agp_amd_methods = {
agp_amd_get_aperture,
- agp_amd_set_aperture,
agp_amd_bind_page,
agp_amd_unbind_page,
agp_amd_flush_tlb,
- agp_generic_enable,
- agp_generic_alloc_memory,
- agp_generic_free_memory,
- agp_generic_bind_memory,
- agp_generic_unbind_memory,
};
struct agp_amd_gatt *
-agp_amd_alloc_gatt(struct agp_softc *sc)
+agp_amd_alloc_gatt(bus_dma_tag_t dmat, bus_size_t apsize)
{
- u_int32_t apsize = AGP_GET_APERTURE(sc);
- u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
+ bus_size_t entries = apsize >> AGP_PAGE_SHIFT;
struct agp_amd_gatt *gatt;
int i, npages;
caddr_t vdir;
@@ -108,7 +112,7 @@ agp_amd_alloc_gatt(struct agp_softc *sc)
if (!gatt)
return (0);
- if (agp_alloc_dmamem(sc->sc_dmat,
+ if (agp_alloc_dmamem(dmat,
AGP_PAGE_SIZE + entries * sizeof(u_int32_t), 0,
&gatt->ag_dmamap, &vdir, &gatt->ag_pdir,
&gatt->ag_dmaseg, 1, &gatt->ag_nseg) != 0) {
@@ -145,9 +149,9 @@ agp_amd_alloc_gatt(struct agp_softc *sc)
#if 0
void
-agp_amd_free_gatt(struct agp_softc *sc, struct agp_amd_gatt *gatt)
+agp_amd_free_gatt(bus_dma_tag_t dmat, struct agp_amd_gatt *gatt)
{
- agp_free_dmamem(sc->sc_dmat, gatt->ag_size,
+ agp_free_dmamem(dmat, gatt->ag_size,
gatt->ag_dmamap, (caddr_t)gatt->ag_virtual, &gatt->ag_dmaseg,
gatt->ag_nseg);
free(gatt, M_AGP);
@@ -155,50 +159,55 @@ agp_amd_free_gatt(struct agp_softc *sc, struct agp_amd_gatt *gatt)
#endif
int
-agp_amd_attach(struct agp_softc *sc, struct pci_attach_args *pa)
+agp_amd_probe(struct device *parent, void *match, void *aux)
{
- struct agp_amd_softc *asc;
- struct agp_amd_gatt *gatt;
- pcireg_t reg;
- int error;
-
- asc = malloc(sizeof *asc, M_AGP, M_NOWAIT | M_ZERO);
- if (asc == NULL) {
- printf("can't allocate softc\n");
- /* agp_generic_detach(sc) */
- return (ENOMEM);
- }
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+
+ /* Must be a pchb */
+ if (agpbus_probe(aa) == 1 && PCI_VENDOR(pa->pa_id) == PCI_VENDOR_AMD &&
+ (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_SC751_SC ||
+ PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_761_PCHB ||
+ PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_762_PCHB))
+ return (1);
+ return (0);
+}
+
+void
+agp_amd_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct agp_amd_softc *asc = (struct agp_amd_softc *)self;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+ struct agp_amd_gatt *gatt;
+ pcireg_t reg;
+ int error;
+
+ asc->asc_pc = pa->pa_pc;
+ asc->asc_tag = pa->pa_tag;
error = pci_mapreg_map(pa, AGP_AMD751_REGISTERS,
PCI_MAPREG_TYPE_MEM, 0, &asc->iot, &asc->ioh, NULL, NULL, 0);
if (error != 0) {
printf("can't map AGP registers\n");
- agp_generic_detach(sc);
- return (error);
+ return;
}
- if (agp_map_aperture(pa, sc, AGP_APBASE, PCI_MAPREG_TYPE_MEM) != 0) {
- printf("can't map aperture\n");
- agp_generic_detach(sc);
- free(asc, M_AGP);
- return (ENXIO);
- }
- sc->sc_methods = &agp_amd_methods;
- sc->sc_chipc = asc;
- asc->initial_aperture = AGP_GET_APERTURE(sc);
+ asc->initial_aperture = agp_amd_get_aperture(asc);
for (;;) {
- gatt = agp_amd_alloc_gatt(sc);
- if (gatt)
+ bus_size_t size = agp_amd_get_aperture(asc);
+ gatt = agp_amd_alloc_gatt(pa->pa_dmat, size);
+ if (gatt != NULL)
break;
/*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
+ * almost certainly error allocating contigious dma memory
+ * so reduce aperture so that the gatt size reduces.
*/
- if (AGP_SET_APERTURE(sc, AGP_GET_APERTURE(sc) / 2)) {
- printf(": can't set aperture\n");
- return (ENOMEM);
+ if (agp_amd_set_aperture(asc, size / 2)) {
+ printf(": failed to set aperture\n");
+ return;
}
}
asc->gatt = gatt;
@@ -207,41 +216,43 @@ agp_amd_attach(struct agp_softc *sc, struct pci_attach_args *pa)
WRITE4(AGP_AMD751_ATTBASE, gatt->ag_physical);
/* Enable synchronisation between host and agp. */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_MODECTRL);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_AMD751_MODECTRL);
reg &= ~0x00ff00ff;
reg |= (AGP_AMD751_MODECTRL_SYNEN) | (AGP_AMD751_MODECTRL2_GPDCE << 16);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_MODECTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_AMD751_MODECTRL, reg);
/* Enable the TLB and flush */
WRITE2(AGP_AMD751_STATUS,
READ2(AGP_AMD751_STATUS) | AGP_AMD751_STATUS_GCE);
- AGP_FLUSH_TLB(sc);
+ agp_amd_flush_tlb(asc);
- return (0);
+ asc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_amd_methods,
+ AGP_APBASE, PCI_MAPREG_TYPE_MEM, &asc->dev);
+ return;
}
#if 0
int
-agp_amd_detach(struct agp_softc *sc)
+agp_amd_detach(void *sc)
{
- pcireg_t reg;
- struct agp_amd_softc *asc = sc->sc_chipc;
+ struct agp_amd_softc *asc = sc;
+ pcireg_t reg;
/* Disable the TLB.. */
WRITE2(AGP_AMD751_STATUS,
READ2(AGP_AMD751_STATUS) & ~AGP_AMD751_STATUS_GCE);
/* Disable host-agp sync */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_MODECTRL);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_AMD751_MODECTRL);
reg &= 0xffffff00;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_MODECTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_pcitag, AGP_AMD751_MODECTRL, reg);
/* Clear the GATT base */
WRITE4(AGP_AMD751_ATTBASE, 0);
/* Put the aperture back the way it started. */
- AGP_SET_APERTURE(sc, asc->initial_aperture);
+ agp_amd_set_aperture(asc, asc->initial_aperture);
- agp_amd_free_gatt(sc, asc->gatt);
+ agp_amd_free_gatt(asc, asc->gatt);
/* XXXfvdl no pci_mapreg_unmap */
@@ -249,12 +260,13 @@ agp_amd_detach(struct agp_softc *sc)
}
#endif
-u_int32_t
-agp_amd_get_aperture(struct agp_softc *sc)
+bus_size_t
+agp_amd_get_aperture(void *sc)
{
- int vas;
+ struct agp_amd_softc *asc = sc;
+ int vas;
- vas = (pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ vas = (pci_conf_read(asc->asc_pc, asc->asc_tag,
AGP_AMD751_APCTRL) & 0x06);
vas >>= 1;
/*
@@ -264,10 +276,11 @@ agp_amd_get_aperture(struct agp_softc *sc)
}
int
-agp_amd_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+agp_amd_set_aperture(void *sc, bus_size_t aperture)
{
- int vas;
- pcireg_t reg;
+ struct agp_amd_softc *asc = sc;
+ int vas;
+ pcireg_t reg;
/*
* Check for a power of two and make sure its within the
@@ -280,17 +293,17 @@ agp_amd_set_aperture(struct agp_softc *sc, u_int32_t aperture)
vas = ffs(aperture / 32*1024*1024) - 1;
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_APCTRL);
+ reg = pci_conf_read(asc->asc_pc, asc->asc_tag, AGP_AMD751_APCTRL);
reg = (reg & ~0x06) | (vas << 1);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_AMD751_APCTRL, reg);
+ pci_conf_write(asc->asc_pc, asc->asc_tag, AGP_AMD751_APCTRL, reg);
return (0);
}
int
-agp_amd_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_amd_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_amd_softc *asc = sc->sc_chipc;
+ struct agp_amd_softc *asc = sc;
if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -300,9 +313,9 @@ agp_amd_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
}
int
-agp_amd_unbind_page(struct agp_softc *sc, off_t offset)
+agp_amd_unbind_page(void *sc, off_t offset)
{
- struct agp_amd_softc *asc = sc->sc_chipc;
+ struct agp_amd_softc *asc = sc;
if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -312,9 +325,9 @@ agp_amd_unbind_page(struct agp_softc *sc, off_t offset)
}
void
-agp_amd_flush_tlb(struct agp_softc *sc)
+agp_amd_flush_tlb(void *sc)
{
- struct agp_amd_softc *asc = sc->sc_chipc;
+ struct agp_amd_softc *asc = sc;
/* Set the cache invalidate bit and wait for the chipset to clear */
WRITE4(AGP_AMD751_TLBCTRL, 1);
diff --git a/sys/dev/pci/agp_i810.c b/sys/dev/pci/agp_i810.c
index f6fc0e5861f..f4bcbab8747 100644
--- a/sys/dev/pci/agp_i810.c
+++ b/sys/dev/pci/agp_i810.c
@@ -1,5 +1,4 @@
-/* $OpenBSD: agp_i810.c,v 1.41 2008/09/26 21:15:53 mikeb Exp $ */
-/* $NetBSD: agp_i810.c,v 1.15 2003/01/31 00:07:39 thorpej Exp $ */
+/* $OpenBSD: agp_i810.c,v 1.42 2008/11/09 15:11:19 oga Exp $ */
/*-
* Copyright (c) 2000 Doug Rabson
@@ -27,10 +26,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/pci/agp_i810.c,v 1.4 2001/07/05 21:28:47 jhb Exp $
*/
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -50,57 +47,60 @@
#include <machine/bus.h>
-#include "agp_intel.h"
-
-#define READ1(off) bus_space_read_1(isc->bst, isc->bsh, off)
-#define READ4(off) bus_space_read_4(isc->bst, isc->bsh, off)
-#define WRITE4(off,v) bus_space_write_4(isc->bst, isc->bsh, off, v)
+#define READ1(off) bus_space_read_1(isc->map->bst, isc->map->bsh, off)
+#define READ4(off) bus_space_read_4(isc->map->bst, isc->map->bsh, off)
+#define WRITE4(off,v) bus_space_write_4(isc->map->bst, isc->map->bsh, off, v)
-#define WRITEGTT(off,v) bus_space_write_4(isc->gtt_bst, isc->gtt_bsh, off, v)
+#define WRITEGTT(off,v) bus_space_write_4(isc->gtt_map->bst, isc->gtt_map->bsh, off, v)
#define WRITE_GATT(off,v) agp_i810_write_gatt(isc, off, v)
-
enum {
- CHIP_I810 = 0, /* i810/i815 */
- CHIP_I830 = 1, /* i830/i845 */
- CHIP_I855 = 2, /* i852GM/i855GM/i865G */
- CHIP_I915 = 3, /* i915G/i915GM */
- CHIP_I965 = 4, /* i965/i965GM */
- CHIP_G33 = 5 /* G33/Q33/Q35 */
+ CHIP_NONE = 0, /* not integrated graphics */
+ CHIP_I810 = 1, /* i810/i815 */
+ CHIP_I830 = 2, /* i830/i845 */
+ CHIP_I855 = 3, /* i852GM/i855GM/i865G */
+ CHIP_I915 = 4, /* i915G/i915GM */
+ CHIP_I965 = 5, /* i965/i965GM */
+ CHIP_G33 = 6 /* G33/Q33/Q35 */
};
struct agp_i810_softc {
- u_int32_t initial_aperture;/* aperture size at startup */
- struct agp_gatt
- *gatt;
- int chiptype; /* i810-like or i830 */
- u_int32_t dcache_size; /* i810 only */
- u_int32_t stolen; /* number of i830/845 gtt entries
- for stolen memory */
- bus_space_tag_t bst; /* bus_space tag */
- bus_space_handle_t bsh; /* bus_space handle */
- bus_size_t bsz; /* bus_space size */
- bus_space_tag_t gtt_bst; /* GATT bus_space tag */
- bus_space_handle_t gtt_bsh; /* GATT bus_space handle */
- struct pci_attach_args vga_pa;
+ struct device dev;
+ struct agp_softc *agpdev;
+ struct agp_gatt *gatt;
+ struct vga_pci_bar *map;
+ struct vga_pci_bar *gtt_map;
+ int chiptype; /* i810-like or i830 */
+ bus_size_t aperture; /* current aperture size */
+ u_int32_t dcache_size; /* i810 only */
+ u_int32_t stolen; /* number of i830/845 gtt
+ entries for stolen memory */
};
-int agp_i810_vgamatch(struct pci_attach_args *);
-int agp_i810_set_aperture(struct agp_softc *, u_int32_t);
-int agp_i810_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_i810_unbind_page(struct agp_softc *, off_t);
-void agp_i810_flush_tlb(struct agp_softc *);
-int agp_i810_enable(struct agp_softc *, u_int32_t mode);
-struct agp_memory * agp_i810_alloc_memory(struct agp_softc *, int, vsize_t);
-int agp_i810_free_memory(struct agp_softc *, struct agp_memory *);
-int agp_i810_bind_memory(struct agp_softc *, struct agp_memory *,
- off_t);
-int agp_i810_unbind_memory(struct agp_softc *, struct agp_memory *);
+void agp_i810_attach(struct device *, struct device *, void *);
+int agp_i810_probe(struct device *, void *, void *);
+int agp_i810_get_chiptype(struct pci_attach_args *);
+bus_size_t agp_i810_get_aperture(void *);
+int agp_i810_bind_page(void *, off_t, bus_addr_t);
+int agp_i810_unbind_page(void *, off_t);
+void agp_i810_flush_tlb(void *);
+int agp_i810_enable(void *, u_int32_t mode);
+struct agp_memory * agp_i810_alloc_memory(void *, int, vsize_t);
+int agp_i810_free_memory(void *, struct agp_memory *);
+int agp_i810_bind_memory(void *, struct agp_memory *, off_t);
+int agp_i810_unbind_memory(void *, struct agp_memory *);
void agp_i810_write_gatt(struct agp_i810_softc *, bus_size_t, u_int32_t);
+struct cfattach intagp_ca = {
+ sizeof(struct agp_i810_softc), agp_i810_probe, agp_i810_attach
+};
+
+struct cfdriver intagp_cd = {
+ NULL, "intagp", DV_DULL
+};
+
struct agp_methods agp_i810_methods = {
- agp_generic_get_aperture,
- agp_i810_set_aperture,
+ agp_i810_get_aperture,
agp_i810_bind_page,
agp_i810_unbind_page,
agp_i810_flush_tlb,
@@ -111,104 +111,23 @@ struct agp_methods agp_i810_methods = {
agp_i810_unbind_memory,
};
-/* XXXthorpej -- duplicated code (see arch/i386/pci/pchb.c) */
int
-agp_i810_vgamatch(struct pci_attach_args *pa)
+agp_i810_get_chiptype(struct pci_attach_args *pa)
{
-
- if (PCI_CLASS(pa->pa_class) != PCI_CLASS_DISPLAY ||
- PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_DISPLAY_VGA)
- return (0);
-
switch (PCI_PRODUCT(pa->pa_id)) {
case PCI_PRODUCT_INTEL_82810_IGD:
case PCI_PRODUCT_INTEL_82810_DC100_IGD:
case PCI_PRODUCT_INTEL_82810E_IGD:
case PCI_PRODUCT_INTEL_82815_IGD:
- case PCI_PRODUCT_INTEL_82830M_IGD:
- case PCI_PRODUCT_INTEL_82845G_IGD:
- case PCI_PRODUCT_INTEL_82855GM_IGD:
- case PCI_PRODUCT_INTEL_82865G_IGD:
- case PCI_PRODUCT_INTEL_82915G_IGD_1:
- case PCI_PRODUCT_INTEL_82915G_IGD_2:
- case PCI_PRODUCT_INTEL_82915GM_IGD_1:
- case PCI_PRODUCT_INTEL_82915GM_IGD_2:
- case PCI_PRODUCT_INTEL_82945G_IGD_1:
- case PCI_PRODUCT_INTEL_82945G_IGD_2:
- case PCI_PRODUCT_INTEL_82945GM_IGD_1:
- case PCI_PRODUCT_INTEL_82945GM_IGD_2:
- case PCI_PRODUCT_INTEL_82945GME_IGD_1:
- case PCI_PRODUCT_INTEL_82G965_IGD_1:
- case PCI_PRODUCT_INTEL_82G965_IGD_2:
- case PCI_PRODUCT_INTEL_82Q965_IGD_1:
- case PCI_PRODUCT_INTEL_82Q965_IGD_2:
- case PCI_PRODUCT_INTEL_82GM965_IGD_1:
- case PCI_PRODUCT_INTEL_82GM965_IGD_2:
- case PCI_PRODUCT_INTEL_82GME965_IGD_1:
- case PCI_PRODUCT_INTEL_82GME965_IGD_2:
- case PCI_PRODUCT_INTEL_82G33_IGD_1:
- case PCI_PRODUCT_INTEL_82G33_IGD_2:
- case PCI_PRODUCT_INTEL_82G35_IGD_1:
- case PCI_PRODUCT_INTEL_82G35_IGD_2:
- case PCI_PRODUCT_INTEL_82Q35_IGD_1:
- case PCI_PRODUCT_INTEL_82Q35_IGD_2:
- return (1);
- }
-
- return (0);
-}
-
-int
-agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
-{
- struct agp_i810_softc *isc;
- struct agp_gatt *gatt;
- bus_addr_t mmaddr, gmaddr;
- struct vga_pci_bar *map;
- int error;
- u_int memtype = 0;
-
- isc = malloc(sizeof *isc, M_AGP, M_NOWAIT | M_ZERO);
- if (isc == NULL) {
- printf("can't allocate chipset-specific softc\n");
- return (ENOMEM);
- }
- sc->sc_chipc = isc;
- sc->sc_methods = &agp_i810_methods;
-
- if (pci_find_device(&isc->vga_pa, agp_i810_vgamatch) == 0) {
-#if NAGP_INTEL > 0
-
- switch (PCI_PRODUCT(pa->pa_id)) {
- case PCI_PRODUCT_INTEL_82815_HB:
- case PCI_PRODUCT_INTEL_82845G_HB:
- case PCI_PRODUCT_INTEL_82865G_HB:
- return (agp_intel_attach(sc, pa));
- }
-#endif
- printf("no integrated graphics\n");
- free(isc, M_AGP);
- return (ENOENT);
- }
-
- /* XXXfvdl */
- sc->sc_dmat = isc->vga_pa.pa_dmat;
- sc->sc_memt = isc->vga_pa.pa_memt;
-
- switch (PCI_PRODUCT(isc->vga_pa.pa_id)) {
- case PCI_PRODUCT_INTEL_82810_IGD:
- case PCI_PRODUCT_INTEL_82810_DC100_IGD:
- case PCI_PRODUCT_INTEL_82810E_IGD:
- case PCI_PRODUCT_INTEL_82815_IGD:
- isc->chiptype = CHIP_I810;
+ return (CHIP_I810);
break;
case PCI_PRODUCT_INTEL_82830M_IGD:
case PCI_PRODUCT_INTEL_82845G_IGD:
- isc->chiptype = CHIP_I830;
+ return (CHIP_I830);
break;
case PCI_PRODUCT_INTEL_82855GM_IGD:
case PCI_PRODUCT_INTEL_82865G_IGD:
- isc->chiptype = CHIP_I855;
+ return (CHIP_I855);
break;
case PCI_PRODUCT_INTEL_82915G_IGD_1:
case PCI_PRODUCT_INTEL_82915G_IGD_2:
@@ -219,7 +138,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
case PCI_PRODUCT_INTEL_82945GM_IGD_1:
case PCI_PRODUCT_INTEL_82945GM_IGD_2:
case PCI_PRODUCT_INTEL_82945GME_IGD_1:
- isc->chiptype = CHIP_I915;
+ return (CHIP_I915);
break;
case PCI_PRODUCT_INTEL_82Q965_IGD_1:
case PCI_PRODUCT_INTEL_82Q965_IGD_2:
@@ -231,15 +150,41 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
case PCI_PRODUCT_INTEL_82GME965_IGD_2:
case PCI_PRODUCT_INTEL_82G35_IGD_1:
case PCI_PRODUCT_INTEL_82G35_IGD_2:
- isc->chiptype = CHIP_I965;
+ return (CHIP_I965);
break;
case PCI_PRODUCT_INTEL_82G33_IGD_1:
case PCI_PRODUCT_INTEL_82G33_IGD_2:
case PCI_PRODUCT_INTEL_82Q35_IGD_1:
case PCI_PRODUCT_INTEL_82Q35_IGD_2:
- isc->chiptype = CHIP_G33;
+ return (CHIP_G33);
break;
}
+ return (CHIP_NONE);
+}
+
+int
+agp_i810_probe(struct device *parent, void *match, void *aux)
+{
+ struct pci_attach_args *pa = aux;
+
+ if (PCI_CLASS(pa->pa_class) != PCI_CLASS_DISPLAY ||
+ PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_DISPLAY_VGA)
+ return (0);
+
+ return (agp_i810_get_chiptype(pa) != CHIP_NONE);
+}
+
+void
+agp_i810_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct agp_i810_softc *isc = (struct agp_i810_softc *)self;
+ struct agp_gatt *gatt;
+ struct pci_attach_args *pa = aux;
+ struct vga_pci_softc *vga = (struct vga_pci_softc *)parent;
+ bus_addr_t mmaddr, gmaddr;
+ pcireg_t memtype;
+
+ isc->chiptype = agp_i810_get_chiptype(pa);
switch (isc->chiptype) {
case CHIP_I915:
@@ -260,46 +205,35 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
break;
}
- error = agp_map_aperture(&isc->vga_pa, sc, gmaddr, memtype);
- if (error != 0) {
- printf("can't map aperture\n");
- free(isc, M_AGP);
- return (error);
+ if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, gmaddr, memtype,
+ NULL, &isc->aperture, NULL) != 0) {
+ printf("can't get aperture size\n");
+ return;
}
- map = vga_pci_bar_map(sc->vga_softc, mmaddr, 0,
- BUS_SPACE_MAP_LINEAR);
- if (map == NULL) {
+ isc->map = vga_pci_bar_map(vga, mmaddr, 0, BUS_SPACE_MAP_LINEAR);
+ if (isc->map == NULL) {
printf("can't map mmadr registers\n");
- agp_generic_detach(sc);
- return (error);
+ return;
}
- isc->bst = map->bst;
- isc->bsh = map->bsh;
- isc->bsz = map->size;
if (isc->chiptype == CHIP_I915 || isc->chiptype == CHIP_G33) {
- map = vga_pci_bar_map(sc->vga_softc, AGP_I915_GTTADR,
- 0, BUS_SPACE_MAP_LINEAR);
- if (map == NULL) {
+ isc->gtt_map = vga_pci_bar_map(vga, AGP_I915_GTTADR, 0,
+ BUS_SPACE_MAP_LINEAR);
+ if (isc->gtt_map == NULL) {
printf("can't map gatt registers\n");
- agp_generic_detach(sc);
- return (error);
+ goto out;
}
- isc->gtt_bst = map->bst;
- isc->gtt_bsh = map->bsh;
}
- isc->initial_aperture = AGP_GET_APERTURE(sc);
-
- gatt = malloc(sizeof(struct agp_gatt), M_AGP, M_NOWAIT);
- if (!gatt) {
- agp_generic_detach(sc);
- return (ENOMEM);
+ gatt = malloc(sizeof(*gatt), M_AGP, M_NOWAIT);
+ if (gatt == NULL) {
+ printf("can't alloc gatt\n");
+ goto out;
}
isc->gatt = gatt;
- gatt->ag_entries = AGP_GET_APERTURE(sc) >> AGP_PAGE_SHIFT;
+ gatt->ag_entries = isc->aperture >> AGP_PAGE_SHIFT;
if (isc->chiptype == CHIP_I810) {
int dummyseg;
@@ -310,12 +244,10 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
isc->dcache_size = 0;
/* According to the specs the gatt on the i810 must be 64k */
- if (agp_alloc_dmamem(sc->sc_dmat, 64 * 1024,
+ if (agp_alloc_dmamem(pa->pa_dmat, 64 * 1024,
0, &gatt->ag_dmamap, (caddr_t *)&gatt->ag_virtual,
&gatt->ag_physical, &gatt->ag_dmaseg, 1, &dummyseg) != 0) {
- free(gatt, M_AGP);
- agp_generic_detach(sc);
- return (ENOMEM);
+ goto out;
}
gatt->ag_size = gatt->ag_entries * sizeof(u_int32_t);
@@ -330,7 +262,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
u_int32_t pgtblctl;
u_int16_t gcc1;
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I830_GCC1);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_I830_GCC1);
gcc1 = (u_int16_t)(reg >> 16);
switch (gcc1 & AGP_I830_GCC1_GMS) {
case AGP_I830_GCC1_GMS_STOLEN_512:
@@ -345,8 +277,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
default:
isc->stolen = 0;
printf("unknown memory configuration, disabling\n");
- agp_generic_detach(sc);
- return (EINVAL);
+ goto out;
}
#ifdef DEBUG
if (isc->stolen > 0) {
@@ -372,7 +303,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
* BIOS display.
*/
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I855_GCC1);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_I855_GCC1);
gcc1 = (u_int16_t)(reg >> 16);
switch (isc->chiptype) {
case CHIP_I855:
@@ -411,8 +342,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
break;
default:
printf("bad chiptype\n");
- agp_generic_detach(sc);
- return (EINVAL);
+ goto out;
}
switch (gcc1 & AGP_I855_GCC1_GMS) {
@@ -446,8 +376,7 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
default:
isc->stolen = 0;
printf("unknown memory configuration, disabling\n");
- agp_generic_detach(sc);
- return (EINVAL);
+ goto out;
}
#ifdef DEBUG
if (isc->stolen > 0) {
@@ -469,7 +398,16 @@ agp_i810_attach(struct agp_softc *sc, struct pci_attach_args *pa)
*/
agp_flush_cache();
- return (0);
+ isc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_i810_methods,
+ gmaddr, memtype, &isc->dev);
+ return;
+out:
+ if (isc->gatt)
+ free(isc->gatt, M_AGP);
+ if (isc->gtt_map != NULL)
+ vga_pci_bar_unmap(isc->gtt_map);
+ if (isc->map != NULL)
+ vga_pci_bar_unmap(isc->map);
}
#if 0
@@ -493,9 +431,6 @@ agp_i810_detach(struct agp_softc *sc)
WRITE4(AGP_I810_PGTBL_CTL, pgtblctl);
}
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(sc, isc->initial_aperture);
-
if (sc->chiptype == CHIP_I810) {
agp_free_dmamem(sc->sc_dmat, gatt->ag_size, gatt->ag_dmamap,
(void *)gatt->ag_virtual, &gatt->ag_dmaseg, 1);
@@ -506,74 +441,23 @@ agp_i810_detach(struct agp_softc *sc)
}
#endif
-int
-agp_i810_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+bus_size_t
+agp_i810_get_aperture(void *sc)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
- pcireg_t reg;
- u_int16_t gcc1, miscc;
-
- switch (isc->chiptype) {
- case CHIP_I810:
- /*
- * Double check for sanity.
- */
- if (aperture != (32 * 1024 * 1024) &&
- aperture != (64 * 1024 * 1024)) {
- printf("agp: bad aperture size %d\n", aperture);
- return (EINVAL);
- }
-
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I810_SMRAM);
- miscc = (u_int16_t)(reg >> 16);
- miscc &= ~AGP_I810_MISCC_WINSIZE;
- if (aperture == 32 * 1024 * 1024)
- miscc |= AGP_I810_MISCC_WINSIZE_32;
- else
- miscc |= AGP_I810_MISCC_WINSIZE_64;
+ struct agp_i810_softc *isc = sc;
- reg &= 0x0000ffff;
- reg |= ((pcireg_t)miscc) << 16;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_I810_SMRAM, reg);
- break;
- case CHIP_I830:
- if (aperture != (64 * 1024 * 1024) &&
- aperture != (128 * 1024 * 1024)) {
- printf("agp: bad aperture size %d\n", aperture);
- return (EINVAL);
- }
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I830_GCC0);
- gcc1 = (u_int16_t)(reg >> 16);
- gcc1 &= ~AGP_I830_GCC1_GMASIZE;
- if (aperture == 64 * 1024 * 1024)
- gcc1 |= AGP_I830_GCC1_GMASIZE_64;
- else
- gcc1 |= AGP_I830_GCC1_GMASIZE_128;
-
- reg &= 0x0000ffff;
- reg |= ((pcireg_t)gcc1) << 16;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_I830_GCC0, reg);
- break;
- case CHIP_I855:
- case CHIP_I915:
- case CHIP_I965:
- case CHIP_G33:
- return agp_generic_set_aperture(sc, aperture);
- }
-
- return (0);
+ return (isc->aperture);
}
int
-agp_i810_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_i810_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
+ struct agp_i810_softc *isc = sc;
if (offset < 0 || offset >= (isc->gatt->ag_entries << AGP_PAGE_SHIFT)) {
#ifdef DEBUG
printf("agp: failed: offset 0x%08x, shift %d, entries %d\n",
- (int)offset, AGP_PAGE_SHIFT,
- isc->gatt->ag_entries);
+ (int)offset, AGP_PAGE_SHIFT, isc->gatt->ag_entries);
#endif
return (EINVAL);
}
@@ -592,9 +476,9 @@ agp_i810_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
}
int
-agp_i810_unbind_page(struct agp_softc *sc, off_t offset)
+agp_i810_unbind_page(void *sc, off_t offset)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
+ struct agp_i810_softc *isc = sc;
if (offset < 0 || offset >= (isc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -616,25 +500,26 @@ agp_i810_unbind_page(struct agp_softc *sc, off_t offset)
* Writing via memory mapped registers already flushes all TLBs.
*/
void
-agp_i810_flush_tlb(struct agp_softc *sc)
+agp_i810_flush_tlb(void *sc)
{
}
int
-agp_i810_enable(struct agp_softc *sc, u_int32_t mode)
+agp_i810_enable(void *sc, u_int32_t mode)
{
return (0);
}
struct agp_memory *
-agp_i810_alloc_memory(struct agp_softc *sc, int type, vsize_t size)
+agp_i810_alloc_memory(void *softc, int type, vsize_t size)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
- struct agp_memory *mem;
- int error;
+ struct agp_i810_softc *isc = softc;
+ struct agp_softc *sc = isc->agpdev;
+ struct agp_memory *mem;
+ int error;
if ((size & (AGP_PAGE_SIZE - 1)) != 0)
- return (0);
+ return (NULL);
if (sc->sc_allocated + size > sc->sc_maxmem)
return (NULL);
@@ -697,8 +582,11 @@ agp_i810_alloc_memory(struct agp_softc *sc, int type, vsize_t size)
}
int
-agp_i810_free_memory(struct agp_softc *sc, struct agp_memory *mem)
+agp_i810_free_memory(void *softc, struct agp_memory *mem)
{
+ struct agp_i810_softc *isc = softc;
+ struct agp_softc *sc = isc->agpdev;
+
if (mem->am_is_bound)
return (EBUSY);
@@ -715,11 +603,10 @@ agp_i810_free_memory(struct agp_softc *sc, struct agp_memory *mem)
}
int
-agp_i810_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
- off_t offset)
+agp_i810_bind_memory(void *sc, struct agp_memory *mem, off_t offset)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
- u_int32_t regval, i;
+ struct agp_i810_softc *isc = sc;
+ u_int32_t regval, i;
/*
* XXX evil hack: the PGTBL_CTL appearently gets overwritten by the
@@ -727,15 +614,11 @@ agp_i810_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
* to the GTT through the MMIO window.
* Until the issue is solved, simply restore it.
*/
-
- regval = bus_space_read_4(isc->bst, isc->bsh, AGP_I810_PGTBL_CTL);
+ regval = READ4(AGP_I810_PGTBL_CTL);
if (regval != (isc->gatt->ag_physical | 1)) {
-#if DEBUG
printf("agp_i810_bind_memory: PGTBL_CTL is 0x%x - fixing\n",
regval);
-#endif
- bus_space_write_4(isc->bst, isc->bsh, AGP_I810_PGTBL_CTL,
- isc->gatt->ag_physical | 1);
+ WRITE4(AGP_I810_PGTBL_CTL, isc->gatt->ag_physical | 1);
}
if (mem->am_type == 2) {
@@ -748,7 +631,7 @@ agp_i810_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
}
if (mem->am_type != 1)
- return (agp_generic_bind_memory(sc, mem, offset));
+ return (agp_generic_bind_memory(isc->agpdev, mem, offset));
if (isc->chiptype != CHIP_I810)
return (EINVAL);
@@ -761,10 +644,10 @@ agp_i810_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
}
int
-agp_i810_unbind_memory(struct agp_softc *sc, struct agp_memory *mem)
+agp_i810_unbind_memory(void *sc, struct agp_memory *mem)
{
- struct agp_i810_softc *isc = sc->sc_chipc;
- u_int32_t i;
+ struct agp_i810_softc *isc = sc;
+ u_int32_t i;
if (mem->am_type == 2) {
for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) {
@@ -776,7 +659,7 @@ agp_i810_unbind_memory(struct agp_softc *sc, struct agp_memory *mem)
}
if (mem->am_type != 1)
- return (agp_generic_unbind_memory(sc, mem));
+ return (agp_generic_unbind_memory(isc->agpdev, mem));
if (isc->chiptype != CHIP_I810)
return (EINVAL);
@@ -798,9 +681,9 @@ agp_i810_write_gatt(struct agp_i810_softc *isc, bus_size_t off, u_int32_t v)
WRITEGTT((u_int32_t)((off) >> AGP_PAGE_SHIFT) * 4, v ? d : 0);
else if (isc->chiptype == CHIP_I965) {
d |= (v & 0x0000000f00000000ULL) >> 28;
- WRITE4(AGP_I965_GTT +
- (u_int32_t)((off) >> AGP_PAGE_SHIFT) * 4, v ? d : 0);
+ WRITE4(AGP_I965_GTT + (u_int32_t)((off) >> AGP_PAGE_SHIFT) * 4,
+ v ? d : 0);
} else
- WRITE4(AGP_I810_GTT +
- (u_int32_t)((off) >> AGP_PAGE_SHIFT) * 4, v ? d : 0);
+ WRITE4(AGP_I810_GTT + (u_int32_t)((off) >> AGP_PAGE_SHIFT) * 4,
+ v ? d : 0);
}
diff --git a/sys/dev/pci/agp_intel.c b/sys/dev/pci/agp_intel.c
index b2d6aeeb458..d6e99b19b1d 100644
--- a/sys/dev/pci/agp_intel.c
+++ b/sys/dev/pci/agp_intel.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp_intel.c,v 1.11 2008/09/02 10:29:34 jsg Exp $ */
+/* $OpenBSD: agp_intel.c,v 1.12 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agp_intel.c,v 1.3 2001/09/15 00:25:00 thorpej Exp $ */
/*-
@@ -29,7 +29,6 @@
* $FreeBSD: src/sys/pci/agp_intel.c,v 1.4 2001/07/05 21:28:47 jhb Exp $
*/
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -40,7 +39,6 @@
#include <sys/device.h>
#include <sys/agpio.h>
-
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcidevs.h>
@@ -50,200 +48,208 @@
#include <machine/bus.h>
struct agp_intel_softc {
- u_int32_t initial_aperture; /* aperture size at startup */
+ struct device dev;
+ struct agp_softc *agpdev;
struct agp_gatt *gatt;
- struct pci_attach_args vga_pa; /* vga card */
- u_int aperture_mask;
- int chiptype;
-#define CHIP_INTEL 0x0
-#define CHIP_I443 0x1
-#define CHIP_I840 0x2
-#define CHIP_I845 0x3
-#define CHIP_I850 0x4
-#define CHIP_I865 0x5
+ pci_chipset_tag_t isc_pc;
+ pcitag_t isc_tag;
+ u_int aperture_mask;
+ enum {
+ CHIP_INTEL,
+ CHIP_I443,
+ CHIP_I840,
+ CHIP_I845,
+ CHIP_I850,
+ CHIP_I865
+ } chiptype;
+ bus_size_t initial_aperture; /* startup aperture size */
};
-int agp_intel_vgamatch(struct pci_attach_args *);
-u_int32_t agp_intel_get_aperture(struct agp_softc *);
-int agp_intel_set_aperture(struct agp_softc *, u_int32_t);
-int agp_intel_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_intel_unbind_page(struct agp_softc *, off_t);
-void agp_intel_flush_tlb(struct agp_softc *);
+void agp_intel_attach(struct device *, struct device *, void *);
+int agp_intel_probe(struct device *, void *, void *);
+bus_size_t agp_intel_get_aperture(void *);
+int agp_intel_set_aperture(void *, bus_size_t);
+int agp_intel_bind_page(void *, off_t, bus_addr_t);
+int agp_intel_unbind_page(void *, off_t);
+void agp_intel_flush_tlb(void *);
+
+struct cfattach intelagp_ca = {
+ sizeof(struct agp_intel_softc), agp_intel_probe, agp_intel_attach
+};
+
+struct cfdriver intelagp_cd = {
+ NULL, "intelagp", DV_DULL
+};
-struct agp_methods agp_intel_methods = {
+const struct agp_methods agp_intel_methods = {
agp_intel_get_aperture,
- agp_intel_set_aperture,
agp_intel_bind_page,
agp_intel_unbind_page,
agp_intel_flush_tlb,
- agp_generic_enable,
- agp_generic_alloc_memory,
- agp_generic_free_memory,
- agp_generic_bind_memory,
- agp_generic_unbind_memory,
+ /* default enable and memory routines */
};
int
-agp_intel_vgamatch(struct pci_attach_args *pa)
+agp_intel_probe(struct device *parent, void *match, void *aux)
{
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+
+ /* Must be a pchb */
+ if (agpbus_probe(aa) == 0)
+ return (0);
+
switch (PCI_PRODUCT(pa->pa_id)) {
- case PCI_PRODUCT_INTEL_82443LX_AGP:
- case PCI_PRODUCT_INTEL_82443BX_AGP:
+ case PCI_PRODUCT_INTEL_82443LX:
+ case PCI_PRODUCT_INTEL_82443BX:
+ case PCI_PRODUCT_INTEL_82440BX:
case PCI_PRODUCT_INTEL_82440BX_AGP:
- case PCI_PRODUCT_INTEL_82840_AGP:
- case PCI_PRODUCT_INTEL_82845_AGP:
- case PCI_PRODUCT_INTEL_82845G_AGP:
- case PCI_PRODUCT_INTEL_82850_AGP: /* i850/i860 */
- case PCI_PRODUCT_INTEL_82855PM_AGP:
- case PCI_PRODUCT_INTEL_82865G_AGP:
- case PCI_PRODUCT_INTEL_82875P_AGP:
+ case PCI_PRODUCT_INTEL_82815_HB:
+ case PCI_PRODUCT_INTEL_82820_HB:
+ case PCI_PRODUCT_INTEL_82830M_HB:
+ case PCI_PRODUCT_INTEL_82840_HB:
+ case PCI_PRODUCT_INTEL_82845_HB:
+ case PCI_PRODUCT_INTEL_82845G_HB:
+ case PCI_PRODUCT_INTEL_82850_HB:
+ case PCI_PRODUCT_INTEL_82855PM_HB:
+ case PCI_PRODUCT_INTEL_82855GM_HB:
+ case PCI_PRODUCT_INTEL_82860_HB:
+ case PCI_PRODUCT_INTEL_82865G_HB:
+ case PCI_PRODUCT_INTEL_82875P_HB:
return (1);
}
return (0);
}
-int
-agp_intel_attach(struct agp_softc *sc, struct pci_attach_args *pa)
+void
+agp_intel_attach(struct device *parent, struct device *self, void *aux)
{
- struct agp_intel_softc *isc;
- struct agp_gatt *gatt;
- pcireg_t reg;
- u_int32_t value;
-
- isc = malloc(sizeof *isc, M_AGP, M_NOWAIT | M_ZERO);
- if (isc == NULL) {
- printf("can't allocate chipset-specific softc\n");
- return (ENOMEM);
- }
-
- sc->sc_methods = &agp_intel_methods;
- sc->sc_chipc = isc;
-
- if (pci_find_device(&isc->vga_pa, agp_intel_vgamatch) == 0)
- isc->chiptype = CHIP_INTEL;
-
- pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP, &sc->sc_capoff,
- NULL);
+ struct agp_intel_softc *isc = (struct agp_intel_softc *)self;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+ struct agp_gatt *gatt;
+ pcireg_t reg;
+ u_int32_t value;
- if (agp_map_aperture(pa, sc, AGP_APBASE, PCI_MAPREG_TYPE_MEM) != 0) {
- printf("can't map aperture\n");
- free(isc, M_AGP);
- sc->sc_chipc = NULL;
- return (ENXIO);
- }
+ isc->isc_pc = pa->pa_pc;
+ isc->isc_tag = pa->pa_tag;
- switch (PCI_PRODUCT(isc->vga_pa.pa_id)) {
- case PCI_PRODUCT_INTEL_82443LX_AGP:
- case PCI_PRODUCT_INTEL_82443BX_AGP:
+ switch (PCI_PRODUCT(pa->pa_id)) {
+ case PCI_PRODUCT_INTEL_82443LX:
+ case PCI_PRODUCT_INTEL_82443BX:
+ case PCI_PRODUCT_INTEL_82440BX:
case PCI_PRODUCT_INTEL_82440BX_AGP:
isc->chiptype = CHIP_I443;
break;
- case PCI_PRODUCT_INTEL_82840_AGP:
+ case PCI_PRODUCT_INTEL_82830M_HB:
+ case PCI_PRODUCT_INTEL_82840_HB:
isc->chiptype = CHIP_I840;
break;
- case PCI_PRODUCT_INTEL_82845_AGP:
- case PCI_PRODUCT_INTEL_82845G_AGP:
- case PCI_PRODUCT_INTEL_82855PM_AGP:
+ case PCI_PRODUCT_INTEL_82845_HB:
+ case PCI_PRODUCT_INTEL_82845G_HB:
+ case PCI_PRODUCT_INTEL_82855PM_HB:
isc->chiptype = CHIP_I845;
break;
- case PCI_PRODUCT_INTEL_82850_AGP:
+ case PCI_PRODUCT_INTEL_82850_HB:
isc->chiptype = CHIP_I850;
break;
- case PCI_PRODUCT_INTEL_82865G_AGP:
- case PCI_PRODUCT_INTEL_82875P_AGP:
+ case PCI_PRODUCT_INTEL_82865G_HB:
+ case PCI_PRODUCT_INTEL_82875P_HB:
isc->chiptype = CHIP_I865;
break;
+ default:
+ isc->chiptype = CHIP_INTEL;
}
/* Determine maximum supported aperture size. */
- value = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_APSIZE);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag,
- AGP_INTEL_APSIZE, APSIZE_MASK);
- isc->aperture_mask = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ value = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_INTEL_APSIZE);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_APSIZE, APSIZE_MASK);
+ isc->aperture_mask = pci_conf_read(pa->pa_pc, pa->pa_tag,
AGP_INTEL_APSIZE) & APSIZE_MASK;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_APSIZE, value);
- isc->initial_aperture = AGP_GET_APERTURE(sc);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_APSIZE, value);
+ isc->initial_aperture = agp_intel_get_aperture(isc);
for (;;) {
- gatt = agp_alloc_gatt(sc);
- if (gatt)
+ bus_size_t size = agp_intel_get_aperture(isc);
+ gatt = agp_alloc_gatt(pa->pa_dmat, size);
+ if (gatt != NULL)
break;
/*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
+ * almost certainly error allocating contigious dma memory
+ * so reduce aperture so that the gatt size reduces.
*/
- if (AGP_SET_APERTURE(sc, AGP_GET_APERTURE(sc) / 2)) {
- agp_generic_detach(sc);
- printf("failed to set aperture\n");
- return (ENOMEM);
+ if (agp_intel_set_aperture(isc, size / 2)) {
+ printf(": failed to set aperture\n");
+ return;
}
}
isc->gatt = gatt;
/* Install the gatt. */
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_ATTBASE,
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_ATTBASE,
gatt->ag_physical);
/* Enable the GLTB and setup the control register. */
switch (isc->chiptype) {
case CHIP_I443:
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_AGPCTRL,
AGPCTRL_AGPRSE | AGPCTRL_GTLB);
break;
default:
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
- pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL)
- | AGPCTRL_GTLB);
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_AGPCTRL,
+ pci_conf_read(isc->isc_pc, isc->isc_tag,
+ AGP_INTEL_AGPCTRL) | AGPCTRL_GTLB);
}
/* Enable things, clear errors etc. */
switch (isc->chiptype) {
case CHIP_I845:
case CHIP_I865:
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I840_MCHCFG);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_I840_MCHCFG);
reg |= MCHCFG_AAGN;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_I840_MCHCFG, reg);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_I840_MCHCFG, reg);
break;
case CHIP_I840:
case CHIP_I850:
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCMD);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_INTEL_AGPCMD);
reg |= AGPCMD_AGPEN;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCMD,
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_AGPCMD,
reg);
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_I840_MCHCFG);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_I840_MCHCFG);
reg |= MCHCFG_AAGN;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_I840_MCHCFG,
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_I840_MCHCFG,
reg);
break;
default:
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_NBXCFG);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_INTEL_NBXCFG);
reg &= ~NBXCFG_APAE;
reg |= NBXCFG_AAGN;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_NBXCFG, reg);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_NBXCFG, reg);
}
/* Clear Error status */
switch (isc->chiptype) {
case CHIP_I840:
- pci_conf_write(sc->sc_pc, sc->sc_pcitag,
+ pci_conf_write(pa->pa_pc, pa->pa_tag,
AGP_INTEL_I8XX_ERRSTS, 0xc000);
break;
case CHIP_I845:
case CHIP_I850:
case CHIP_I865:
- pci_conf_write(sc->sc_pc, sc->sc_pcitag,
+ pci_conf_write(isc->isc_pc, isc->isc_tag,
AGP_INTEL_I8XX_ERRSTS, 0x00ff);
break;
default:
- pci_conf_write(sc->sc_pc, sc->sc_pcitag,
- AGP_INTEL_ERRSTS, 0x70);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, AGP_INTEL_ERRSTS, 0x70);
}
-
- return (0);
+
+ isc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_intel_methods,
+ AGP_APBASE, PCI_MAPREG_TYPE_MEM, &isc->dev);
+ return;
}
#if 0
@@ -259,11 +265,11 @@ agp_intel_detach(struct agp_softc *sc)
return (error);
/* XXX i845/i855PM/i840/i850E */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_NBXCFG);
+ reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AGP_INTEL_NBXCFG);
reg &= ~(1 << 9);
printf("%s: set NBXCFG to %x\n", __FUNCTION__, reg);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_NBXCFG, reg);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_ATTBASE, 0);
+ pci_conf_write(sc->sc_pc, sc->sc_tag, AGP_INTEL_NBXCFG, reg);
+ pci_conf_write(sc->sc_pc, sc->sc_tag, AGP_INTEL_ATTBASE, 0);
AGP_SET_APERTURE(sc, isc->initial_aperture);
agp_free_gatt(sc, isc->gatt);
@@ -271,13 +277,13 @@ agp_intel_detach(struct agp_softc *sc)
}
#endif
-u_int32_t
-agp_intel_get_aperture(struct agp_softc *sc)
+bus_size_t
+agp_intel_get_aperture(void *sc)
{
- struct agp_intel_softc *isc = sc->sc_chipc;
- u_int32_t apsize;
+ struct agp_intel_softc *isc = sc;
+ bus_size_t apsize;
- apsize = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ apsize = pci_conf_read(isc->isc_pc, isc->isc_tag,
AGP_INTEL_APSIZE) & isc->aperture_mask;
/*
@@ -291,10 +297,10 @@ agp_intel_get_aperture(struct agp_softc *sc)
}
int
-agp_intel_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+agp_intel_set_aperture(void *sc, bus_size_t aperture)
{
- struct agp_intel_softc *isc = sc->sc_chipc;
- u_int32_t apsize;
+ struct agp_intel_softc *isc = sc;
+ bus_size_t apsize;
/*
* Reverse the magic from get_aperture.
@@ -308,15 +314,15 @@ agp_intel_set_aperture(struct agp_softc *sc, u_int32_t aperture)
((1 << 22) - 1)) + 1 != aperture)
return (EINVAL);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_APSIZE, apsize);
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_APSIZE, apsize);
return (0);
}
int
-agp_intel_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_intel_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_intel_softc *isc = sc->sc_chipc;
+ struct agp_intel_softc *isc = sc;
if (offset < 0 || offset >= (isc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -326,9 +332,9 @@ agp_intel_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
}
int
-agp_intel_unbind_page(struct agp_softc *sc, off_t offset)
+agp_intel_unbind_page(void *sc, off_t offset)
{
- struct agp_intel_softc *isc = sc->sc_chipc;
+ struct agp_intel_softc *isc = sc;
if (offset < 0 || offset >= (isc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -338,9 +344,9 @@ agp_intel_unbind_page(struct agp_softc *sc, off_t offset)
}
void
-agp_intel_flush_tlb(struct agp_softc *sc)
+agp_intel_flush_tlb(void *sc)
{
- struct agp_intel_softc *isc = sc->sc_chipc;
+ struct agp_intel_softc *isc = sc;
pcireg_t reg;
switch (isc->chiptype) {
@@ -349,17 +355,18 @@ agp_intel_flush_tlb(struct agp_softc *sc)
case CHIP_I845:
case CHIP_I840:
case CHIP_I443:
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL);
+ reg = pci_conf_read(isc->isc_pc, isc->isc_tag,
+ AGP_INTEL_AGPCTRL);
reg &= ~AGPCTRL_GTLB;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
- reg);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
+ pci_conf_write(isc->isc_pc, isc->isc_tag,
+ AGP_INTEL_AGPCTRL, reg);
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_AGPCTRL,
reg | AGPCTRL_GTLB);
break;
default: /* XXX */
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_AGPCTRL,
0x2200);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_INTEL_AGPCTRL,
+ pci_conf_write(isc->isc_pc, isc->isc_tag, AGP_INTEL_AGPCTRL,
0x2280);
}
}
diff --git a/sys/dev/pci/agp_sis.c b/sys/dev/pci/agp_sis.c
index 9a3b8a59329..0bc46a241b7 100644
--- a/sys/dev/pci/agp_sis.c
+++ b/sys/dev/pci/agp_sis.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp_sis.c,v 1.7 2007/12/07 17:35:22 oga Exp $ */
+/* $OpenBSD: agp_sis.c,v 1.8 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agp_sis.c,v 1.2 2001/09/15 00:25:00 thorpej Exp $ */
/*-
@@ -29,7 +29,6 @@
* $FreeBSD: src/sys/pci/agp_sis.c,v 1.3 2001/07/05 21:28:47 jhb Exp $
*/
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -42,6 +41,7 @@
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
#include <dev/pci/vga_pcivar.h>
#include <dev/pci/agpvar.h>
#include <dev/pci/agpreg.h>
@@ -49,80 +49,92 @@
#include <machine/bus.h>
struct agp_sis_softc {
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
+ struct device dev;
+ struct agp_softc *agpdev;
+ struct agp_gatt *gatt;
+ pci_chipset_tag_t ssc_pc;
+ pcitag_t ssc_tag;
+ bus_size_t initial_aperture;
+};
+
+void agp_sis_attach(struct device *, struct device *, void *);
+int agp_sis_probe(struct device *, void *, void *);
+bus_size_t agp_sis_get_aperture(void *);
+int agp_sis_set_aperture(void *, bus_size_t);
+int agp_sis_bind_page(void *, off_t, bus_addr_t);
+int agp_sis_unbind_page(void *, off_t);
+void agp_sis_flush_tlb(void *);
+
+struct cfattach sisagp_ca = {
+ sizeof(struct agp_sis_softc), agp_sis_probe, agp_sis_attach
};
-u_int32_t agp_sis_get_aperture(struct agp_softc *);
-int agp_sis_set_aperture(struct agp_softc *, u_int32_t);
-int agp_sis_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_sis_unbind_page(struct agp_softc *, off_t);
-void agp_sis_flush_tlb(struct agp_softc *);
+struct cfdriver sisagp_cd = {
+ NULL, "intelagp", DV_DULL
+};
-struct agp_methods agp_sis_methods = {
+const struct agp_methods agp_sis_methods = {
agp_sis_get_aperture,
- agp_sis_set_aperture,
agp_sis_bind_page,
agp_sis_unbind_page,
agp_sis_flush_tlb,
- agp_generic_enable,
- agp_generic_alloc_memory,
- agp_generic_free_memory,
- agp_generic_bind_memory,
- agp_generic_unbind_memory,
};
-
int
-agp_sis_attach(struct agp_softc *sc, struct pci_attach_args *pa)
+agp_sis_probe(struct device *parent, void *match, void *aux)
{
- struct agp_sis_softc *ssc;
- struct agp_gatt *gatt;
- pcireg_t reg;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
- ssc = malloc(sizeof *ssc, M_AGP, M_NOWAIT);
- if (ssc == NULL) {
- printf("can't allocate chipset-specific softc\n");
- return (ENOMEM);
- }
- sc->sc_methods = &agp_sis_methods;
- sc->sc_chipc = ssc;
+ /* Must be a pchb */
+ if (agpbus_probe(aa) == 1 && PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SIS)
+ return (1);
+ return (0);
+}
- if (agp_map_aperture(pa, sc, AGP_APBASE, PCI_MAPREG_TYPE_MEM) != 0) {
- printf("can't map aperture\n");
- free(ssc, M_AGP);
- return (ENXIO);
- }
- ssc->initial_aperture = AGP_GET_APERTURE(sc);
+void
+agp_sis_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct agp_sis_softc *ssc = (struct agp_sis_softc *)self;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+ struct agp_gatt *gatt;
+ pcireg_t reg;
+
+ ssc->ssc_pc = pa->pa_pc;
+ ssc->ssc_tag = pa->pa_tag;
+ ssc->initial_aperture = agp_sis_get_aperture(ssc);
for (;;) {
- gatt = agp_alloc_gatt(sc);
- if (gatt)
+ bus_size_t size = agp_sis_get_aperture(ssc);
+ gatt = agp_alloc_gatt(pa->pa_dmat, size);
+ if (gatt != NULL)
break;
/*
- * Probably contigmalloc failure. Try reducing the
+ * Probably failed to alloc congigious memory. Try reducing the
* aperture so that the gatt size reduces.
*/
- if (AGP_SET_APERTURE(sc, AGP_GET_APERTURE(sc) / 2)) {
- agp_generic_detach(sc);
- printf("failed to set aperture\n");
- return (ENOMEM);
+ if (agp_sis_set_aperture(ssc, size / 2)) {
+ printf("can't set aperture size\n");
+ return;
}
}
ssc->gatt = gatt;
/* Install the gatt. */
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_SIS_ATTBASE,
+ pci_conf_write(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_ATTBASE,
gatt->ag_physical);
/* Enable the aperture and auto-tlb-inval */
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_SIS_WINCTRL);
+ reg = pci_conf_read(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_WINCTRL);
reg |= (0x05 << 24) | 3;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_SIS_WINCTRL, reg);
+ pci_conf_write(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_WINCTRL, reg);
- return (0);
+ ssc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_sis_methods,
+ AGP_APBASE, PCI_MAPREG_TYPE_MEM, &ssc->dev);
+ return;
}
#if 0
@@ -150,22 +162,24 @@ agp_sis_detach(struct agp_softc *sc)
}
#endif
-u_int32_t
-agp_sis_get_aperture(struct agp_softc *sc)
+bus_size_t
+agp_sis_get_aperture(void *sc)
{
- int gws;
+ struct agp_sis_softc *ssc = sc;
+ int gws;
/*
* The aperture size is equal to 4M<<gws.
*/
- gws = (pci_conf_read(sc->sc_pc, sc->sc_pcitag,
+ gws = (pci_conf_read(ssc->ssc_pc, ssc->ssc_tag,
AGP_SIS_WINCTRL)&0x70) >> 4;
return ((4 * 1024 * 1024) << gws);
}
int
-agp_sis_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+agp_sis_set_aperture(void *sc, bus_size_t aperture)
{
+ struct agp_sis_softc *ssc = sc;
int gws;
pcireg_t reg;
@@ -180,18 +194,18 @@ agp_sis_set_aperture(struct agp_softc *sc, u_int32_t aperture)
gws = ffs(aperture / 4*1024*1024) - 1;
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_SIS_WINCTRL);
+ reg = pci_conf_read(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_WINCTRL);
reg &= ~0x00000070;
reg |= gws << 4;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_SIS_WINCTRL, reg);
+ pci_conf_write(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_WINCTRL, reg);
return (0);
}
int
-agp_sis_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_sis_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_sis_softc *ssc = sc->sc_chipc;
+ struct agp_sis_softc *ssc = sc;
if (offset < 0 || offset >= (ssc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -201,9 +215,9 @@ agp_sis_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
}
int
-agp_sis_unbind_page(struct agp_softc *sc, off_t offset)
+agp_sis_unbind_page(void *sc, off_t offset)
{
- struct agp_sis_softc *ssc = sc->sc_chipc;
+ struct agp_sis_softc *ssc = sc;
if (offset < 0 || offset >= (ssc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
@@ -213,12 +227,13 @@ agp_sis_unbind_page(struct agp_softc *sc, off_t offset)
}
void
-agp_sis_flush_tlb(struct agp_softc *sc)
+agp_sis_flush_tlb(void *sc)
{
- pcireg_t reg;
+ struct agp_sis_softc *ssc = sc;
+ pcireg_t reg;
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, AGP_SIS_TLBFLUSH);
+ reg = pci_conf_read(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_TLBFLUSH);
reg &= 0xffffff00;
reg |= 0x02;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, AGP_SIS_TLBFLUSH, reg);
+ pci_conf_write(ssc->ssc_pc, ssc->ssc_tag, AGP_SIS_TLBFLUSH, reg);
}
diff --git a/sys/dev/pci/agp_via.c b/sys/dev/pci/agp_via.c
index ce4121dd6db..db7e92f2143 100644
--- a/sys/dev/pci/agp_via.c
+++ b/sys/dev/pci/agp_via.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agp_via.c,v 1.8 2007/12/07 17:35:22 oga Exp $ */
+/* $OpenBSD: agp_via.c,v 1.9 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agp_via.c,v 1.2 2001/09/15 00:25:00 thorpej Exp $ */
/*-
@@ -29,7 +29,6 @@
* $FreeBSD: src/sys/pci/agp_via.c,v 1.3 2001/07/05 21:28:47 jhb Exp $
*/
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
@@ -42,35 +41,44 @@
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
#include <dev/pci/vga_pcivar.h>
#include <dev/pci/agpvar.h>
#include <dev/pci/agpreg.h>
#include <machine/bus.h>
-u_int32_t agp_via_get_aperture(struct agp_softc *);
-int agp_via_set_aperture(struct agp_softc *, u_int32_t);
-int agp_via_bind_page(struct agp_softc *, off_t, bus_addr_t);
-int agp_via_unbind_page(struct agp_softc *, off_t);
-void agp_via_flush_tlb(struct agp_softc *);
+void agp_via_attach(struct device *, struct device *, void *);
+int agp_via_probe(struct device *, void *, void *);
+bus_size_t agp_via_get_aperture(void *);
+int agp_via_set_aperture(void *, bus_size_t);
+int agp_via_bind_page(void *, off_t, bus_addr_t);
+int agp_via_unbind_page(void *, off_t);
+void agp_via_flush_tlb(void *);
-struct agp_methods agp_via_methods = {
+const struct agp_methods agp_via_methods = {
agp_via_get_aperture,
- agp_via_set_aperture,
agp_via_bind_page,
agp_via_unbind_page,
agp_via_flush_tlb,
- agp_generic_enable,
- agp_generic_alloc_memory,
- agp_generic_free_memory,
- agp_generic_bind_memory,
- agp_generic_unbind_memory,
};
struct agp_via_softc {
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
- int *regs;
+ struct device dev;
+ struct agp_softc *agpdev;
+ struct agp_gatt *gatt;
+ int *regs;
+ pci_chipset_tag_t vsc_pc;
+ pcitag_t vsc_tag;
+ bus_size_t initial_aperture;
+};
+
+struct cfattach viaagp_ca = {
+ sizeof(struct agp_via_softc), agp_via_probe, agp_via_attach
+};
+
+struct cfdriver viaagp_cd = {
+ NULL, "viaagp", DV_DULL
};
#define REG_GARTCTRL 0
@@ -83,21 +91,31 @@ int via_v3_regs[] =
{ AGP3_VIA_GARTCTRL, AGP3_VIA_APSIZE, AGP3_VIA_ATTBASE };
int
-agp_via_attach(struct agp_softc *sc, struct pci_attach_args *pa)
+agp_via_probe(struct device *parent, void *match, void *aux)
{
- struct agp_via_softc *asc;
- struct agp_gatt *gatt;
- pcireg_t agpsel, capval;
-
- asc = malloc(sizeof *asc, M_AGP, M_NOWAIT | M_ZERO);
- if (asc == NULL) {
- printf("can't allocate chipset-specific softc\n");
- return (ENOMEM);
- }
- sc->sc_chipc = asc;
- sc->sc_methods = &agp_via_methods;
- pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP, &sc->sc_capoff,
- &capval);
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+
+ /* Must be a pchb */
+ if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
+ PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_HOST &&
+ PCI_VENDOR(pa->pa_id) == PCI_VENDOR_VIATECH)
+ return (1);
+ return (0);
+}
+
+void
+agp_via_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct agp_via_softc *asc = (struct agp_via_softc *)self;
+ struct agp_attach_args *aa = aux;
+ struct pci_attach_args *pa = aa->aa_pa;
+ struct agp_gatt *gatt;
+ pcireg_t agpsel, capval;
+
+ asc->vsc_pc = pa->pa_pc;
+ asc->vsc_tag = pa->pa_tag;
+ pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP, NULL, &capval);
if (AGP_CAPID_GET_MAJOR(capval) >= 3) {
agpsel = pci_conf_read(pa->pa_pc, pa->pa_tag, AGP_VIA_AGPSEL);
@@ -113,27 +131,22 @@ agp_via_attach(struct agp_softc *sc, struct pci_attach_args *pa)
printf("v2, ");
}
- if (agp_map_aperture(pa ,sc, AGP_APBASE, PCI_MAPREG_TYPE_MEM) != 0) {
- printf("can't map aperture\n");
- free(asc, M_AGP);
- return (ENXIO);
- }
- asc->initial_aperture = AGP_GET_APERTURE(sc);
+ asc->initial_aperture = agp_via_get_aperture(asc);
for (;;) {
- gatt = agp_alloc_gatt(sc);
- if (gatt)
+ bus_size_t size = agp_via_get_aperture(asc);
+ gatt = agp_alloc_gatt(pa->pa_dmat, size);
+ if (gatt != NULL)
break;
/*
- * Probably contigmalloc failure. Try reducing the
+ * Probably failed to alloc congigious memory. Try reducing the
* aperture so that the gatt size reduces.
*/
- if (AGP_SET_APERTURE(sc, AGP_GET_APERTURE(sc) / 2)) {
- agp_generic_detach(sc);
+ if (agp_via_set_aperture(asc, size / 2)) {
printf("can't set aperture size\n");
- return (ENOMEM);
+ return;
}
}
asc->gatt = gatt;
@@ -156,8 +169,10 @@ agp_via_attach(struct agp_softc *sc, struct pci_attach_args *pa)
pci_conf_write(pa->pa_pc, pa->pa_tag, asc->regs[REG_GARTCTRL],
gartctrl | (3 << 7));
}
+ asc->agpdev = (struct agp_softc *)agp_attach_bus(pa, &agp_via_methods,
+ AGP_APBASE, PCI_MAPREG_TYPE_MEM, &asc->dev);
- return (0);
+ return;
}
#if 0
@@ -180,14 +195,14 @@ agp_via_detach(struct agp_softc *sc)
}
#endif
-u_int32_t
-agp_via_get_aperture(struct agp_softc *sc)
+bus_size_t
+agp_via_get_aperture(void *sc)
{
- struct agp_via_softc *asc = sc->sc_chipc;
- u_int32_t apsize;
+ struct agp_via_softc *vsc = sc;
+ bus_size_t apsize;
- apsize = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
- asc->regs[REG_APSIZE]) & 0x1f;
+ apsize = pci_conf_read(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_APSIZE]) & 0x1f;
/*
* The size is determined by the number of low bits of
@@ -200,11 +215,11 @@ agp_via_get_aperture(struct agp_softc *sc)
}
int
-agp_via_set_aperture(struct agp_softc *sc, u_int32_t aperture)
+agp_via_set_aperture(void *sc, bus_size_t aperture)
{
- struct agp_via_softc *asc = sc->sc_chipc;
- u_int32_t apsize;
- pcireg_t reg;
+ struct agp_via_softc *vsc = sc;
+ bus_size_t apsize;
+ pcireg_t reg;
/*
* Reverse the magic from get_aperture.
@@ -217,55 +232,55 @@ agp_via_set_aperture(struct agp_softc *sc, u_int32_t aperture)
if ((((apsize ^ 0xff) << 20) | ((1 << 20) - 1)) + 1 != aperture)
return (EINVAL);
- reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_APSIZE]);
+ reg = pci_conf_read(vsc->vsc_pc, vsc->vsc_tag, vsc->regs[REG_APSIZE]);
reg &= ~0xff;
reg |= apsize;
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_APSIZE], reg);
+ pci_conf_write(vsc->vsc_pc, vsc->vsc_tag, vsc->regs[REG_APSIZE], reg);
return (0);
}
int
-agp_via_bind_page(struct agp_softc *sc, off_t offset, bus_addr_t physical)
+agp_via_bind_page(void *sc, off_t offset, bus_addr_t physical)
{
- struct agp_via_softc *asc = sc->sc_chipc;
+ struct agp_via_softc *vsc = sc;
- if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
+ if (offset < 0 || offset >= (vsc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
- asc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
+ vsc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
return (0);
}
int
-agp_via_unbind_page(struct agp_softc *sc, off_t offset)
+agp_via_unbind_page(void *sc, off_t offset)
{
- struct agp_via_softc *asc = sc->sc_chipc;
+ struct agp_via_softc *vsc = sc;
- if (offset < 0 || offset >= (asc->gatt->ag_entries << AGP_PAGE_SHIFT))
+ if (offset < 0 || offset >= (vsc->gatt->ag_entries << AGP_PAGE_SHIFT))
return (EINVAL);
- asc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
+ vsc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
return (0);
}
void
-agp_via_flush_tlb(struct agp_softc *sc)
+agp_via_flush_tlb(void *sc)
{
- struct agp_via_softc *asc = sc->sc_chipc;
+ struct agp_via_softc *vsc = sc;
pcireg_t gartctrl;
- if (asc->regs == via_v2_regs) {
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_GARTCTRL],
- 0x8f);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_GARTCTRL],
- 0x0f);
+ if (vsc->regs == via_v2_regs) {
+ pci_conf_write(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_GARTCTRL], 0x8f);
+ pci_conf_write(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_GARTCTRL], 0x0f);
} else {
- gartctrl = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
- asc->regs[REG_GARTCTRL]);
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_GARTCTRL],
- gartctrl & ~(1 << 7));
- pci_conf_write(sc->sc_pc, sc->sc_pcitag, asc->regs[REG_GARTCTRL],
- gartctrl);
+ gartctrl = pci_conf_read(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_GARTCTRL]);
+ pci_conf_write(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_GARTCTRL], gartctrl & ~(1 << 7));
+ pci_conf_write(vsc->vsc_pc, vsc->vsc_tag,
+ vsc->regs[REG_GARTCTRL], gartctrl);
}
}
diff --git a/sys/dev/pci/agpvar.h b/sys/dev/pci/agpvar.h
index f363ae5e5a9..bd14c5ee33d 100644
--- a/sys/dev/pci/agpvar.h
+++ b/sys/dev/pci/agpvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: agpvar.h,v 1.14 2008/07/12 17:31:06 oga Exp $ */
+/* $OpenBSD: agpvar.h,v 1.15 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: agpvar.h,v 1.4 2001/10/01 21:54:48 fvdl Exp $ */
/*-
@@ -43,9 +43,17 @@
#define AGPUNIT(x) minor(x)
+struct agp_attach_args {
+ char *aa_busname;
+ struct pci_attach_args *aa_pa;
+};
+
struct agpbus_attach_args {
- struct pci_attach_args apa_pci_args;
- struct pci_attach_args apa_vga_args;
+ char *aa_busname; /*so pci doesn't conflict*/
+ struct pci_attach_args *aa_pa;
+ const struct agp_methods *aa_methods;
+ int aa_bar;
+ pcireg_t aa_type;
};
enum agp_acquire_state {
@@ -91,67 +99,43 @@ struct agp_memory_info {
int ami_is_bound; /* non-zero if bound */
};
-struct agp_softc;
-
struct agp_methods {
- u_int32_t (*get_aperture)(struct agp_softc *);
- int (*set_aperture)(struct agp_softc *, u_int32_t);
- int (*bind_page)(struct agp_softc *, off_t, bus_addr_t);
- int (*unbind_page)(struct agp_softc *, off_t);
- void (*flush_tlb)(struct agp_softc *);
- int (*enable)(struct agp_softc *, u_int32_t mode);
+ bus_size_t (*get_aperture)(void *);
+ int (*bind_page)(void *, off_t, bus_addr_t);
+ int (*unbind_page)(void *, off_t);
+ void (*flush_tlb)(void *);
+ int (*enable)(void *, u_int32_t mode);
struct agp_memory *
- (*alloc_memory)(struct agp_softc *, int, vsize_t);
- int (*free_memory)(struct agp_softc *, struct agp_memory *);
- int (*bind_memory)(struct agp_softc *, struct agp_memory *,
- off_t);
- int (*unbind_memory)(struct agp_softc *, struct agp_memory *);
+ (*alloc_memory)(void *, int, vsize_t);
+ int (*free_memory)(void *, struct agp_memory *);
+ int (*bind_memory)(void *, struct agp_memory *, off_t);
+ int (*unbind_memory)(void *, struct agp_memory *);
};
-#define AGP_GET_APERTURE(sc) ((sc)->sc_methods->get_aperture(sc))
-#define AGP_SET_APERTURE(sc,a) ((sc)->sc_methods->set_aperture((sc),(a)))
-#define AGP_BIND_PAGE(sc,o,p) ((sc)->sc_methods->bind_page((sc),(o),(p)))
-#define AGP_UNBIND_PAGE(sc,o) ((sc)->sc_methods->unbind_page((sc), (o)))
-#define AGP_FLUSH_TLB(sc) ((sc)->sc_methods->flush_tlb(sc))
-#define AGP_ENABLE(sc,m) ((sc)->sc_methods->enable((sc),(m)))
-#define AGP_ALLOC_MEMORY(sc,t,s) ((sc)->sc_methods->alloc_memory((sc),(t),(s)))
-#define AGP_FREE_MEMORY(sc,m) ((sc)->sc_methods->free_memory((sc),(m)))
-#define AGP_BIND_MEMORY(sc,m,o) ((sc)->sc_methods->bind_memory((sc),(m),(o)))
-#define AGP_UNBIND_MEMORY(sc,m) ((sc)->sc_methods->unbind_memory((sc),(m)))
-
/*
* All chipset drivers must have this at the start of their softc.
*/
struct agp_softc {
- struct device sc_dev;
-
- bus_space_tag_t sc_bt, sc_memt;
- bus_space_handle_t sc_bh;
- bus_addr_t sc_apaddr;
- bus_size_t sc_apsize;
- bus_dma_tag_t sc_dmat;
- struct rwlock sc_lock; /* lock for access to GATT */
- pcitag_t sc_pcitag; /* PCI tag, in case we need it. */
- pcireg_t sc_id;
- pci_chipset_tag_t sc_pc;
-
- pci_chipset_tag_t sc_vgapc;
- pcitag_t sc_vgapcitag;
-
- struct agp_methods *sc_methods;
- void *sc_chipc; /* chipset-dependent state */
-
- int sc_opened;
- int sc_capoff;
- int sc_apflags;
- int sc_nextid; /* next memory block id */
-
- u_int32_t sc_maxmem; /* allocation upper bound */
- u_int32_t sc_allocated; /* amount allocated */
- enum agp_acquire_state sc_state;
- struct agp_memory_list sc_memory; /* list of allocated memory */
-
- struct vga_pci_softc *vga_softc; /* needed for shared mappings */
+ struct device sc_dev;
+
+ struct agp_memory_list sc_memory; /* mem blocks */
+ struct rwlock sc_lock; /* GATT access lock */
+ const struct agp_methods *sc_methods; /* callbacks */
+ void *sc_chipc; /* chipset softc */
+
+ bus_dma_tag_t sc_dmat;
+ bus_addr_t sc_apaddr;
+ pci_chipset_tag_t sc_pc;
+ pcitag_t sc_pcitag;
+ pcireg_t sc_id;
+
+ int sc_opened;
+ int sc_capoff;
+ int sc_nextid; /* next mem block id */
+ enum agp_acquire_state sc_state;
+
+ u_int32_t sc_maxmem; /* mem upper bound */
+ u_int32_t sc_allocated; /* amount allocated */
};
struct agp_gatt {
@@ -163,57 +147,27 @@ struct agp_gatt {
size_t ag_size;
};
-
-struct agp_product {
- int ap_vendor;
- int ap_product;
- int (*ap_attach)(struct agp_softc *,
- struct pci_attach_args *);
-};
-/* MD-defined */
-extern const struct agp_product agp_products[];
-
-void agp_attach(struct device *, struct device *, void *);
-int agp_probe(struct device *, void *, void *);
-paddr_t agpmmap(void *, off_t, int);
-int agpioctl(dev_t, u_long, caddr_t, int, struct proc *);
-int agpopen(dev_t, int, int, struct proc *);
-int agpclose(dev_t, int, int , struct proc *);
-void agp_set_pchb(struct pci_attach_args*);
/*
* Functions private to the AGP code.
*/
-
-int agp_find_caps(pci_chipset_tag_t, pcitag_t);
+struct device *agp_attach_bus(struct pci_attach_args *,
+ const struct agp_methods *, int, pcireg_t,
+ struct device *);
int agp_map_aperture(struct pci_attach_args *,
struct agp_softc *, u_int32_t, u_int32_t);
-u_int32_t agp_generic_get_aperture(struct agp_softc *);
-int agp_generic_set_aperture(struct agp_softc *, u_int32_t);
struct agp_gatt *
- agp_alloc_gatt(struct agp_softc *);
-void agp_free_gatt(struct agp_softc *, struct agp_gatt *);
+ agp_alloc_gatt(bus_dma_tag_t, u_int32_t);
+void agp_free_gatt(bus_dma_tag_t, struct agp_gatt *);
void agp_flush_cache(void);
-int agp_generic_attach(struct agp_softc *);
-int agp_generic_detach(struct agp_softc *);
-int agp_generic_enable(struct agp_softc *, u_int32_t);
-struct agp_memory *
- agp_generic_alloc_memory(struct agp_softc *, int, vsize_t size);
-int agp_generic_free_memory(struct agp_softc *, struct agp_memory *);
-int agp_generic_bind_memory(struct agp_softc *, struct agp_memory *,
- off_t);
+int agp_generic_bind_memory(struct agp_softc *, struct agp_memory *, off_t);
int agp_generic_unbind_memory(struct agp_softc *, struct agp_memory *);
-int agp_ali_attach(struct agp_softc *, struct pci_attach_args *);
-int agp_amd_attach(struct agp_softc *, struct pci_attach_args *);
-int agp_i810_attach(struct agp_softc *, struct pci_attach_args *);
-int agp_intel_attach(struct agp_softc *, struct pci_attach_args *);
-int agp_via_attach(struct agp_softc *, struct pci_attach_args *);
-int agp_sis_attach(struct agp_softc *, struct pci_attach_args *);
-
int agp_alloc_dmamem(bus_dma_tag_t, size_t, int, bus_dmamap_t *,
caddr_t *, bus_addr_t *, bus_dma_segment_t *, int, int *);
void agp_free_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t,
caddr_t, bus_dma_segment_t *, int nseg) ;
+int agpdev_print(void *, const char *);
+int agpbus_probe(struct agp_attach_args *aa);
/*
diff --git a/sys/dev/pci/files.agp b/sys/dev/pci/files.agp
index cdd86684e62..b60209e0ca0 100644
--- a/sys/dev/pci/files.agp
+++ b/sys/dev/pci/files.agp
@@ -1,27 +1,34 @@
-# $OpenBSD: files.agp,v 1.2 2008/03/16 19:00:28 oga Exp $
+# $OpenBSD: files.agp,v 1.3 2008/11/09 15:11:19 oga Exp $
-file dev/pci/agp.c agp needs-flag
+define agpdev {}
-define agp_ali
-file dev/pci/agp_ali.c agp_ali & agpbus needs-flag
+# agpbus defined in /sys/conf/files
+device agp: agpdev
+attach agp at agpdev
+file dev/pci/agp.c agp needs-flag
-define agp_amd
-file dev/pci/agp_amd.c agp_amd & agpbus needs-flag
+device aliagp: agpdev
+attach aliagp at agpbus
+file dev/pci/agp_ali.c aliagp
-define agp_apple
-file dev/pci/agp_apple.c agp_apple & agpbus needs-flag
+device amdagp: agpdev
+attach amdagp at agpbus
+file dev/pci/agp_amd.c amdagp
-define agp_i810
-file dev/pci/agp_i810.c agp_i810 & agpbus needs-flag
+device intelagp: agpdev
+attach intelagp at agpbus
+file dev/pci/agp_intel.c intelagp
-define agp_intel
-file dev/pci/agp_intel.c agp_intel & agpbus needs-flag
+# agpint defined in /sys/conf/files since it attaches at vga
+device intagp: agpdev
+attach intagp at agpint
+# intelagp needs file to check presence of IGD
+file dev/pci/agp_i810.c intagp needs-flag
-define agp_sis
-file dev/pci/agp_sis.c agp_sis & agpbus needs-flag
+device sisagp: agpdev
+attach sisagp at agpbus
+file dev/pci/agp_sis.c sisagp
-define agp_via
-file dev/pci/agp_via.c agp_via & agpbus needs-flag
-
-define agp_amd64
-file dev/pci/agp_amd64.c agp_amd64 & agpbus needs-flag
+device viaagp: agpdev
+attach viaagp at agpbus
+file dev/pci/agp_via.c viaagp
diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c
index 68fdf3e7e07..bcd4d6b8b8c 100644
--- a/sys/dev/pci/vga_pci.c
+++ b/sys/dev/pci/vga_pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vga_pci.c,v 1.37 2008/08/12 23:10:41 oga Exp $ */
+/* $OpenBSD: vga_pci.c,v 1.38 2008/11/09 15:11:19 oga Exp $ */
/* $NetBSD: vga_pci.c,v 1.3 1998/06/08 06:55:58 thorpej Exp $ */
/*
@@ -95,7 +95,7 @@
#include <dev/vesa/vesabiosvar.h>
#endif
-#include "agp.h"
+#include "intagp.h"
#include "drmbase.h"
int vga_pci_match(struct device *, void *, void *);
@@ -103,9 +103,9 @@ void vga_pci_attach(struct device *, struct device *, void *);
paddr_t vga_pci_mmap(void* v, off_t off, int prot);
void vga_pci_bar_init(struct vga_pci_softc *, struct pci_attach_args *);
-#if NAGP > 0
-int agpsubmatch(struct device *, void *, void *);
-int agpbus_print(void *, const char *);
+#if NINTAGP > 0
+int intagpsubmatch(struct device *, void *, void *);
+int intagp_print(void *, const char *);
#endif
#if NDRMBASE > 0
int drmsubmatch(struct device *, void *, void *);
@@ -121,20 +121,6 @@ struct cfattach vga_pci_ca = {
sizeof(struct vga_pci_softc), vga_pci_match, vga_pci_attach,
};
-#if NAGP > 0
-struct pci_attach_args agp_pchb_pa;
-int agp_pchb_pa_set = 0;
-
-void
-agp_set_pchb(struct pci_attach_args *pa)
-{
- if (!agp_pchb_pa_set) {
- memcpy(&agp_pchb_pa, pa, sizeof *pa);
- agp_pchb_pa_set++;
- }
-}
-#endif
-
int
vga_pci_match(struct device *parent, void *match, void *aux)
{
@@ -166,9 +152,6 @@ void
vga_pci_attach(struct device *parent, struct device *self, void *aux)
{
struct pci_attach_args *pa = aux;
-#if NAGP >0
- struct agpbus_attach_args aba;
-#endif
pcireg_t reg;
struct vga_pci_softc *sc = (struct vga_pci_softc *)self;
@@ -194,15 +177,13 @@ vga_pci_attach(struct device *parent, struct device *self, void *aux)
vga_pci_bar_init(sc, pa);
-#if NAGP > 0
+#if NINTAGP > 0
/*
- * attach agp here instead of pchb so it can share mappings
- * with the DRM
+ * attach intagp here instead of pchb so it can share mappings
+ * with the DRM.
*/
- if (agp_pchb_pa_set) {
- aba.apa_pci_args = agp_pchb_pa;
- memcpy(&aba.apa_vga_args, pa, sizeof(struct pci_attach_args));
- config_found_sm(self, &aba, agpbus_print, agpsubmatch);
+ if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL) {
+ config_found_sm(self, aux, intagp_print, intagpsubmatch);
}
#endif
@@ -212,24 +193,24 @@ vga_pci_attach(struct device *parent, struct device *self, void *aux)
#endif
}
-#if NAGP > 0
+#if NINTAGP > 0
int
-agpsubmatch(struct device *parent, void *match, void *aux)
+intagpsubmatch(struct device *parent, void *match, void *aux)
{
- extern struct cfdriver agp_cd;
+ extern struct cfdriver intagp_cd;
struct cfdata *cf = match;
- /* only allow agp to attach */
- if (cf->cf_driver == &agp_cd)
+ /* only allow intagp to attach */
+ if (cf->cf_driver == &intagp_cd)
return ((*cf->cf_attach->ca_match)(parent, match, aux));
return (0);
}
int
-agpbus_print(void *vaa, const char *pnp)
+intagp_print(void *vaa, const char *pnp)
{
if (pnp)
- printf("agp at %s", pnp);
+ printf("intagp at %s", pnp);
return (UNCONF);
}
#endif