Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F156418548
D46543.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
212 KB
Referenced Files
None
Subscribers
None
D46543.diff
View Options
diff --git a/include/Makefile b/include/Makefile
--- a/include/Makefile
+++ b/include/Makefile
@@ -48,7 +48,7 @@
LDIRS= geom net net80211 netgraph netinet netinet6 \
netipsec netlink netsmb nfs nfsclient nfsserver sys vm
-LSUBDIRS= dev/acpica dev/agp dev/ciss dev/filemon dev/firewire \
+LSUBDIRS= dev/acpica dev/ciss dev/filemon dev/firewire \
dev/hwpmc dev/hyperv \
dev/ic dev/iicbus dev/io dev/mfi dev/mmc \
dev/ofw dev/pbio dev/pci ${_dev_powermac_nvram} dev/ppbus dev/pwm \
@@ -80,10 +80,6 @@
acpiio.h
ACPICADIR= ${INCLUDEDIR}/dev/acpica
-.PATH: ${SRCTOP}/sys/dev/agp
-AGP= agpreg.h
-AGPDIR= ${INCLUDEDIR}/dev/agp
-
.PATH: ${SRCTOP}/sys/bsm
BSM= audit.h \
audit_errno.h \
@@ -246,7 +242,6 @@
INCSGROUPS= INCS \
ACPICA \
- AGP \
BSM \
CAM \
CAMATA \
@@ -373,7 +368,7 @@
cd ${SDESTDIR}${INCLUDEDIR}; find ${LDIRS} ${LSUBDIRS} ${LSUBSUBDIRS} crypto \
machine machine/pc ${_MARCHS} -maxdepth 1 -mindepth 1 -type l \
-name "*.h" -print -delete || true
-.for i in ${LDIRS} ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec:Ndev/wg} ${LSUBSUBDIRS}
+.for i in ${LDIRS} ${LSUBDIRS:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec:Ndev/wg} ${LSUBSUBDIRS}
cd ${SRCTOP}/sys; \
${INSTALL} -C ${TAG_ARGS:D${TAG_ARGS},dev} -o ${BINOWN} -g ${BINGRP} -m 444 $i/*.h \
${SDESTDIR}${INCLUDEDIR}/$i
@@ -409,15 +404,13 @@
cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
$$(printf '../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
.endfor
-.for i in ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec:Ndev/wg}
+.for i in ${LSUBDIRS:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec:Ndev/wg}
cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
$$(printf '../../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
.endfor
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
$$(printf '../../../../sys/dev/acpica/%s ' acpiio.h acpi_hpet.h) \
${SDESTDIR}${INCLUDEDIR}/dev/acpica; \
- ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/agp/agpreg.h \
- ${SDESTDIR}${INCLUDEDIR}/dev/agp; \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
$$(printf '../../../../sys/dev/evdev/%s ' input.h input-event-codes.h uinput.h) \
${SDESTDIR}${INCLUDEDIR}/dev/evdev;
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -24,7 +24,6 @@
ae.4 \
${_aesni.4} \
age.4 \
- agp.4 \
ahc.4 \
ahci.4 \
ahd.4 \
@@ -640,7 +639,6 @@
ads111x.4 ads1115.4
MLINKS+=ae.4 if_ae.4
MLINKS+=age.4 if_age.4
-MLINKS+=agp.4 agpgart.4
MLINKS+=alc.4 if_alc.4
MLINKS+=ale.4 if_ale.4
MLINKS+=altera_atse.4 atse.4
diff --git a/share/man/man4/agp.4 b/share/man/man4/agp.4
deleted file mode 100644
--- a/share/man/man4/agp.4
+++ /dev/null
@@ -1,180 +0,0 @@
-.\" Copyright (c) 2001 Yar Tikhiy
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd November 28, 2007
-.Dt AGP 4
-.Os
-.Sh NAME
-.Nm agp
-.Nd "generic interface to the Accelerated Graphics Port (AGP)"
-.Sh SYNOPSIS
-.Cd "device agp"
-.Sh DEPRECATION NOTICE
-The
-.Nm
-driver is slated to be removed in
-.Fx 15.0 .
-.Sh DESCRIPTION
-The
-.Nm
-driver provides uniform, abstract methods for controlling
-the following devices:
-.Pp
-.Bl -tag -width "NVIDIA:" -compact
-.It Ali:
-M1541, M1621 and M1671 host to AGP bridges
-.It AMD:
-751, 761 and 762 host to AGP bridges
-.It ATI:
-RS100, RS200, RS250 and RS300 AGP bridges
-.It Intel:
-i820, i840, i845, i850, and i860 host to AGP bridges
-.It Intel:
-i810, i810-DC100, i810E, i815, 830M, 845G, 845M, 852GM, 852GME, 855GM, 855GME, 865G, 915G and 915GM SVGA controllers
-.It Intel:
-82443BX, 82443GX, 82443LX, 82815, 82820, 82830, 82840, 82845, 82845G, 82850, 82855, 82855GM, 82860, 82865, 82875P, E7205 and E7505 host to AGP bridges
-.It NVIDIA:
-nForce and nForce2 AGP controllers
-.It SiS:
-530, 540, 550, 620, 630, 645, 645DX, 648, 650, 651, 655, 661, 730, 735, 740, 741, 745, 746, 760 and 5591 host to AGP bridges
-.It VIA:
-3296, 82C597, 82C598, 82C691, 82C694X, 82C8363, 8235, 8237, 8361, 8367, 8371, 8377, 8501, 8601, 862x, 8633, 8653, 8703, 8753, 8754, 8763, 8783, KT880, PM800, PM880, PN800, PN880, PT880, XM266 and XN266 host to PCI bridges
-.El
-.Pp
-The most common application of
-.Nm
-is for running
-.Xr X 7 Pq Pa ports/x11/xorg-docs
-on the Intel i81x controllers.
-.Sh IOCTLS
-The following
-.Xr ioctl 2
-operations can be performed on
-.Pa /dev/agpgart ,
-which are defined in
-.In sys/agpio.h :
-.Bl -tag -width indent
-.It Dv AGPIOC_INFO
-Returns state of the
-.Nm
-system.
-The result is a pointer to the following structure:
-.Bd -literal
-typedef struct _agp_info {
- agp_version version; /* version of the driver */
- uint32_t bridge_id; /* bridge vendor/device */
- uint32_t agp_mode; /* mode info of bridge */
- off_t aper_base; /* base of aperture */
- size_t aper_size; /* size of aperture */
- size_t pg_total; /* max pages (swap + system) */
- size_t pg_system; /* max pages (system) */
- size_t pg_used; /* current pages used */
-} agp_info;
-.Ed
-.It Dv AGPIOC_ACQUIRE
-Acquire control of the AGP chipset for use by this client.
-Returns
-.Er EBUSY
-if the AGP chipset is already acquired by another client.
-.It Dv AGPIOC_RELEASE
-Release control of the AGP chipset.
-This does not unbind or free any allocated memory, which is the
-responsibility of the client to handle if necessary.
-.It Dv AGPIOC_SETUP
-Enable the AGP hardware with the relevant mode.
-This
-.Xr ioctl 2
-takes the following structure:
-.Bd -literal
-typedef struct _agp_setup {
- uint32_t agp_mode; /* mode info of bridge */
-} agp_setup;
-.Ed
-.Pp
-The mode bits are defined in
-.In sys/agpio.h .
-.It Dv AGPIOC_ALLOCATE
-Allocate physical memory suitable for mapping into the AGP aperture.
-This
-.Xr ioctl 2
-takes the following structure:
-.Bd -literal
-typedef struct _agp_allocate {
- int key; /* tag of allocation */
- size_t pg_count; /* number of pages */
- uint32_t type; /* 0 == normal, other devspec */
- uint32_t physical; /* device specific (some devices
- * need a phys address of the
- * actual page behind the gatt
- * table) */
-} agp_allocate;
-.Ed
-.Pp
-Returns a handle to the allocated memory.
-.It Dv AGPIOC_DEALLOCATE
-Free the previously allocated memory associated with the handle passed.
-.It Dv AGPIOC_BIND
-Bind the allocated memory at given offset with the AGP aperture.
-Returns
-.Er EINVAL
-if the memory is already bound or the offset is not at AGP page boundary.
-This
-.Xr ioctl 2
-takes the following structure:
-.Bd -literal
-typedef struct _agp_bind {
- int key; /* tag of allocation */
- off_t pg_start; /* starting page to populate */
-} agp_bind;
-.Ed
-.Pp
-The tag of allocation is the handle returned by
-.Dv AGPIOC_ALLOCATE .
-.It Dv AGPIOC_UNBIND
-Unbind memory from the AGP aperture.
-Returns
-.Er EINVAL
-if the memory is not bound.
-This
-.Xr ioctl 2
-takes the following structure:
-.Bd -literal
-typedef struct _agp_unbind {
- int key; /* tag of allocation */
- uint32_t priority; /* priority for paging out */
-} agp_unbind;
-.Ed
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /dev/agpgart" -compact
-.It Pa /dev/agpgart
-AGP device node.
-.El
-.Sh SEE ALSO
-.Xr X 7 Pq Pa ports/x11/xorg
-.Sh HISTORY
-The
-.Nm
-driver first appeared in
-.Fx 4.1 .
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -204,8 +204,6 @@
device vt_efifb
device vt_vbefb
-device agp # support several AGP chipsets
-
# CardBus bridge support
device cbb # CardBus (yenta) bridge
device cardbus # CardBus (32-bit) bus
diff --git a/sys/amd64/conf/MINIMAL b/sys/amd64/conf/MINIMAL
--- a/sys/amd64/conf/MINIMAL
+++ b/sys/amd64/conf/MINIMAL
@@ -106,8 +106,6 @@
device vt_efifb
device vt_vbefb
-device agp # support several AGP chipsets
-
# Serial (COM) ports
device uart # Generic UART driver
diff --git a/sys/conf/files b/sys/conf/files
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -790,8 +790,6 @@
dev/adlink/adlink.c optional adlink
dev/ae/if_ae.c optional ae pci
dev/age/if_age.c optional age pci
-dev/agp/agp.c optional agp pci
-dev/agp/agp_if.m optional agp pci
dev/ahci/ahci.c optional ahci
dev/ahci/ahciem.c optional ahci
dev/ahci/ahci_pci.c optional ahci pci
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -20,12 +20,6 @@
crypto/openssl/i386/sha1-586.S optional ossl
crypto/openssl/i386/sha256-586.S optional ossl
crypto/openssl/i386/sha512-586.S optional ossl
-dev/agp/agp_ali.c optional agp
-dev/agp/agp_amd.c optional agp
-dev/agp/agp_ati.c optional agp
-dev/agp/agp_intel.c optional agp
-dev/agp/agp_nvidia.c optional agp
-dev/agp/agp_sis.c optional agp
dev/glxiic/glxiic.c optional glxiic
dev/glxsb/glxsb.c optional glxsb
dev/glxsb/glxsb_hash.c optional glxsb
diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc
--- a/sys/conf/files.powerpc
+++ b/sys/conf/files.powerpc
@@ -75,7 +75,6 @@
dev/adb/adb_hb_if.m optional adb
dev/adb/adb_if.m optional adb
dev/adb/adb_buttons.c optional adb
-dev/agp/agp_apple.c optional agp powermac
dev/fb/fb.c optional sc
dev/gpio/qoriq_gpio.c optional mpc85xx gpio
dev/hwpmc/hwpmc_e500.c optional hwpmc
diff --git a/sys/conf/files.x86 b/sys/conf/files.x86
--- a/sys/conf/files.x86
+++ b/sys/conf/files.x86
@@ -59,9 +59,6 @@
dev/acpica/acpi_pxm.c optional acpi
dev/acpica/acpi_timer.c optional acpi
dev/acpi_support/acpi_wmi_if.m standard
-dev/agp/agp_amd64.c optional agp
-dev/agp/agp_i810.c optional agp
-dev/agp/agp_via.c optional agp
dev/amdsbwd/amdsbwd.c optional amdsbwd
dev/amdsmn/amdsmn.c optional amdsmn | amdtemp
dev/amdtemp/amdtemp.c optional amdtemp
diff --git a/sys/conf/options.amd64 b/sys/conf/options.amd64
--- a/sys/conf/options.amd64
+++ b/sys/conf/options.amd64
@@ -32,9 +32,6 @@
VESA
VESA_DEBUG opt_vesa.h
-# AGP debugging support
-AGP_DEBUG opt_agp.h
-
ATKBD_DFLT_KEYMAP opt_atkbd.h
# iWARP client interface support in ixl
diff --git a/sys/conf/options.i386 b/sys/conf/options.i386
--- a/sys/conf/options.i386
+++ b/sys/conf/options.i386
@@ -74,9 +74,6 @@
VESA
VESA_DEBUG opt_vesa.h
-# AGP debugging support
-AGP_DEBUG opt_agp.h
-
PSM_DEBUG opt_psm.h
PSM_HOOKRESUME opt_psm.h
PSM_RESETAFTERSUSPEND opt_psm.h
diff --git a/sys/conf/options.powerpc b/sys/conf/options.powerpc
--- a/sys/conf/options.powerpc
+++ b/sys/conf/options.powerpc
@@ -32,8 +32,5 @@
OFWCONS_POLL_HZ opt_ofw.h
-# AGP debugging support
-AGP_DEBUG opt_agp.h
-
# iWARP client interface support in ixl
IXL_IW opt_ixl.h
diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c
deleted file mode 100644
--- a/sys/dev/agp/agp.c
+++ /dev/null
@@ -1,1072 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#include "opt_agp.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/ioccom.h>
-#include <sys/agpio.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpvar.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_param.h>
-#include <vm/vm_object.h>
-#include <vm/vm_page.h>
-#include <vm/vm_pageout.h>
-#include <vm/pmap.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-MODULE_VERSION(agp, 1);
-
-MALLOC_DEFINE(M_AGP, "agp", "AGP data structures");
-
- /* agp_drv.c */
-static d_open_t agp_open;
-static d_close_t agp_close;
-static d_ioctl_t agp_ioctl;
-static d_mmap_t agp_mmap;
-
-static struct cdevsw agp_cdevsw = {
- .d_version = D_VERSION,
- .d_flags = D_NEEDGIANT,
- .d_open = agp_open,
- .d_close = agp_close,
- .d_ioctl = agp_ioctl,
- .d_mmap = agp_mmap,
- .d_name = "agp",
-};
-
-static devclass_t agp_devclass;
-
-/* Helper functions for implementing chipset mini drivers. */
-
-u_int8_t
-agp_find_caps(device_t dev)
-{
- int capreg;
-
- if (pci_find_cap(dev, PCIY_AGP, &capreg) != 0)
- capreg = 0;
- return (capreg);
-}
-
-/*
- * Find an AGP display device (if any).
- */
-static device_t
-agp_find_display(void)
-{
- devclass_t pci = devclass_find("pci");
- device_t bus, dev = 0;
- device_t *kids;
- int busnum, numkids, i;
-
- for (busnum = 0; busnum < devclass_get_maxunit(pci); busnum++) {
- bus = devclass_get_device(pci, busnum);
- if (!bus)
- continue;
- if (device_get_children(bus, &kids, &numkids) != 0)
- continue;
- for (i = 0; i < numkids; i++) {
- dev = kids[i];
- if (pci_get_class(dev) == PCIC_DISPLAY
- && pci_get_subclass(dev) == PCIS_DISPLAY_VGA)
- if (agp_find_caps(dev)) {
- free(kids, M_TEMP);
- return dev;
- }
-
- }
- free(kids, M_TEMP);
- }
-
- return 0;
-}
-
-struct agp_gatt *
-agp_alloc_gatt(device_t dev)
-{
- u_int32_t apsize = AGP_GET_APERTURE(dev);
- u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
- struct agp_gatt *gatt;
-
- if (bootverbose)
- device_printf(dev,
- "allocating GATT for aperture of size %dM\n",
- apsize / (1024*1024));
-
- if (entries == 0) {
- device_printf(dev, "bad aperture size\n");
- return NULL;
- }
-
- gatt = malloc(sizeof(struct agp_gatt), M_AGP, M_NOWAIT);
- if (!gatt)
- return 0;
-
- gatt->ag_entries = entries;
- gatt->ag_virtual = kmem_alloc_contig(entries * sizeof(uint32_t),
- M_NOWAIT | M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_WRITE_COMBINING);
- if (!gatt->ag_virtual) {
- if (bootverbose)
- device_printf(dev, "contiguous allocation failed\n");
- free(gatt, M_AGP);
- return 0;
- }
- gatt->ag_physical = vtophys((vm_offset_t) gatt->ag_virtual);
-
- return gatt;
-}
-
-void
-agp_free_gatt(struct agp_gatt *gatt)
-{
- kmem_free(gatt->ag_virtual, gatt->ag_entries * sizeof(uint32_t));
- free(gatt, M_AGP);
-}
-
-static u_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 nitems(agp_max)
-
-/**
- * Sets the PCI resource which represents the AGP aperture.
- *
- * If not called, the default AGP aperture resource of AGP_APBASE will
- * be used. Must be called before agp_generic_attach().
- */
-void
-agp_set_aperture_resource(device_t dev, int rid)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- sc->as_aperture_rid = rid;
-}
-
-int
-agp_generic_attach(device_t dev)
-{
- struct make_dev_args mdargs;
- struct agp_softc *sc = device_get_softc(dev);
- int error, i, unit;
- u_int memsize;
-
- /*
- * Find and map the aperture, RF_SHAREABLE for DRM but not RF_ACTIVE
- * because the kernel doesn't need to map it.
- */
-
- if (sc->as_aperture_rid != -1) {
- if (sc->as_aperture_rid == 0)
- sc->as_aperture_rid = AGP_APBASE;
-
- sc->as_aperture = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &sc->as_aperture_rid, RF_SHAREABLE);
- if (!sc->as_aperture)
- return ENOMEM;
- }
-
- /*
- * Work out an upper bound for agp memory allocation. This
- * uses a heurisitc table from the Linux driver.
- */
- memsize = ptoa(realmem) >> 20;
- for (i = 0; i < AGP_MAX_SIZE; i++) {
- if (memsize <= agp_max[i][0])
- break;
- }
- if (i == AGP_MAX_SIZE)
- i = AGP_MAX_SIZE - 1;
- sc->as_maxmem = agp_max[i][1] << 20U;
-
- /*
- * The lock is used to prevent re-entry to
- * agp_generic_bind_memory() since that function can sleep.
- */
- mtx_init(&sc->as_lock, "agp lock", NULL, MTX_DEF);
-
- /*
- * Initialise stuff for the userland device.
- */
- agp_devclass = devclass_find("agp");
- TAILQ_INIT(&sc->as_memory);
- sc->as_nextid = 1;
-
- sc->as_devalias = NULL;
-
- make_dev_args_init(&mdargs);
- mdargs.mda_devsw = &agp_cdevsw;
- mdargs.mda_uid = UID_ROOT;
- mdargs.mda_gid = GID_WHEEL;
- mdargs.mda_mode = 0600;
- mdargs.mda_si_drv1 = dev;
- mdargs.mda_si_drv2 = NULL;
-
- unit = device_get_unit(dev);
- error = make_dev_s(&mdargs, &sc->as_devnode, "agpgart%d", unit);
- if (error == 0) {
- /*
- * Create an alias for the first device that shows up.
- */
- if (unit == 0) {
- (void)make_dev_alias_p(MAKEDEV_CHECKNAME,
- &sc->as_devalias, sc->as_devnode, "agpgart");
- }
- } else {
- agp_free_res(dev);
- }
-
- return error;
-}
-
-void
-agp_free_cdev(device_t dev)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- destroy_dev(sc->as_devnode);
- if (sc->as_devalias != NULL)
- destroy_dev(sc->as_devalias);
-}
-
-void
-agp_free_res(device_t dev)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- if (sc->as_aperture != NULL)
- bus_release_resource(dev, SYS_RES_MEMORY, sc->as_aperture_rid,
- sc->as_aperture);
- mtx_destroy(&sc->as_lock);
-}
-
-int
-agp_generic_detach(device_t dev)
-{
-
- agp_free_cdev(dev);
- agp_free_res(dev);
- return 0;
-}
-
-/**
- * Default AGP aperture size detection which simply returns the size of
- * the aperture's PCI resource.
- */
-u_int32_t
-agp_generic_get_aperture(device_t dev)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- return rman_get_size(sc->as_aperture);
-}
-
-/**
- * Default AGP aperture size setting function, which simply doesn't allow
- * changes to resource size.
- */
-int
-agp_generic_set_aperture(device_t dev, u_int32_t aperture)
-{
- u_int32_t current_aperture;
-
- current_aperture = AGP_GET_APERTURE(dev);
- if (current_aperture != aperture)
- return EINVAL;
- else
- return 0;
-}
-
-/*
- * This does the enable logic for v3, with the same topology
- * restrictions as in place for v2 -- one bus, one device on the bus.
- */
-static int
-agp_v3_enable(device_t dev, device_t mdev, u_int32_t mode)
-{
- u_int32_t tstatus, mstatus;
- u_int32_t command;
- int rq, sba, fw, rate, arqsz, cal;
-
- tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
- mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
-
- /* Set RQ to the min of mode, tstatus and mstatus */
- rq = AGP_MODE_GET_RQ(mode);
- if (AGP_MODE_GET_RQ(tstatus) < rq)
- rq = AGP_MODE_GET_RQ(tstatus);
- if (AGP_MODE_GET_RQ(mstatus) < rq)
- rq = AGP_MODE_GET_RQ(mstatus);
-
- /*
- * ARQSZ - Set the value to the maximum one.
- * Don't allow the mode register to override values.
- */
- arqsz = AGP_MODE_GET_ARQSZ(mode);
- if (AGP_MODE_GET_ARQSZ(tstatus) > rq)
- rq = AGP_MODE_GET_ARQSZ(tstatus);
- if (AGP_MODE_GET_ARQSZ(mstatus) > rq)
- rq = AGP_MODE_GET_ARQSZ(mstatus);
-
- /* Calibration cycle - don't allow override by mode register */
- cal = AGP_MODE_GET_CAL(tstatus);
- if (AGP_MODE_GET_CAL(mstatus) < cal)
- cal = AGP_MODE_GET_CAL(mstatus);
-
- /* SBA must be supported for AGP v3. */
- sba = 1;
-
- /* Set FW if all three support it. */
- fw = (AGP_MODE_GET_FW(tstatus)
- & AGP_MODE_GET_FW(mstatus)
- & AGP_MODE_GET_FW(mode));
-
- /* Figure out the max rate */
- rate = (AGP_MODE_GET_RATE(tstatus)
- & AGP_MODE_GET_RATE(mstatus)
- & AGP_MODE_GET_RATE(mode));
- if (rate & AGP_MODE_V3_RATE_8x)
- rate = AGP_MODE_V3_RATE_8x;
- else
- rate = AGP_MODE_V3_RATE_4x;
- if (bootverbose)
- device_printf(dev, "Setting AGP v3 mode %d\n", rate * 4);
-
- pci_write_config(dev, agp_find_caps(dev) + AGP_COMMAND, 0, 4);
-
- /* Construct the new mode word and tell the hardware */
- command = 0;
- command = AGP_MODE_SET_RQ(0, rq);
- command = AGP_MODE_SET_ARQSZ(command, arqsz);
- command = AGP_MODE_SET_CAL(command, cal);
- command = AGP_MODE_SET_SBA(command, sba);
- command = AGP_MODE_SET_FW(command, fw);
- command = AGP_MODE_SET_RATE(command, rate);
- command = AGP_MODE_SET_MODE_3(command, 1);
- command = AGP_MODE_SET_AGP(command, 1);
- pci_write_config(dev, agp_find_caps(dev) + AGP_COMMAND, command, 4);
- pci_write_config(mdev, agp_find_caps(mdev) + AGP_COMMAND, command, 4);
-
- return 0;
-}
-
-static int
-agp_v2_enable(device_t dev, device_t mdev, u_int32_t mode)
-{
- u_int32_t tstatus, mstatus;
- u_int32_t command;
- int rq, sba, fw, rate;
-
- tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
- mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
-
- /* Set RQ to the min of mode, tstatus and mstatus */
- rq = AGP_MODE_GET_RQ(mode);
- if (AGP_MODE_GET_RQ(tstatus) < rq)
- rq = AGP_MODE_GET_RQ(tstatus);
- if (AGP_MODE_GET_RQ(mstatus) < rq)
- rq = AGP_MODE_GET_RQ(mstatus);
-
- /* Set SBA if all three can deal with SBA */
- sba = (AGP_MODE_GET_SBA(tstatus)
- & AGP_MODE_GET_SBA(mstatus)
- & AGP_MODE_GET_SBA(mode));
-
- /* Similar for FW */
- fw = (AGP_MODE_GET_FW(tstatus)
- & AGP_MODE_GET_FW(mstatus)
- & AGP_MODE_GET_FW(mode));
-
- /* Figure out the max rate */
- rate = (AGP_MODE_GET_RATE(tstatus)
- & AGP_MODE_GET_RATE(mstatus)
- & AGP_MODE_GET_RATE(mode));
- if (rate & AGP_MODE_V2_RATE_4x)
- rate = AGP_MODE_V2_RATE_4x;
- else if (rate & AGP_MODE_V2_RATE_2x)
- rate = AGP_MODE_V2_RATE_2x;
- else
- rate = AGP_MODE_V2_RATE_1x;
- if (bootverbose)
- device_printf(dev, "Setting AGP v2 mode %d\n", rate);
-
- /* Construct the new mode word and tell the hardware */
- command = 0;
- command = AGP_MODE_SET_RQ(0, rq);
- command = AGP_MODE_SET_SBA(command, sba);
- command = AGP_MODE_SET_FW(command, fw);
- command = AGP_MODE_SET_RATE(command, rate);
- command = AGP_MODE_SET_AGP(command, 1);
- pci_write_config(dev, agp_find_caps(dev) + AGP_COMMAND, command, 4);
- pci_write_config(mdev, agp_find_caps(mdev) + AGP_COMMAND, command, 4);
-
- return 0;
-}
-
-int
-agp_generic_enable(device_t dev, u_int32_t mode)
-{
- device_t mdev = agp_find_display();
- u_int32_t tstatus, mstatus;
-
- if (!mdev) {
- AGP_DPF("can't find display\n");
- return ENXIO;
- }
-
- tstatus = pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
- mstatus = pci_read_config(mdev, agp_find_caps(mdev) + AGP_STATUS, 4);
-
- /*
- * Check display and bridge for AGP v3 support. AGP v3 allows
- * more variety in topology than v2, e.g. multiple AGP devices
- * attached to one bridge, or multiple AGP bridges in one
- * system. This doesn't attempt to address those situations,
- * but should work fine for a classic single AGP slot system
- * with AGP v3.
- */
- if (AGP_MODE_GET_MODE_3(mode) &&
- AGP_MODE_GET_MODE_3(tstatus) &&
- AGP_MODE_GET_MODE_3(mstatus))
- return (agp_v3_enable(dev, mdev, mode));
- else
- return (agp_v2_enable(dev, mdev, mode));
-}
-
-struct agp_memory *
-agp_generic_alloc_memory(device_t dev, int type, vm_size_t size)
-{
- struct agp_softc *sc = device_get_softc(dev);
- struct agp_memory *mem;
-
- if ((size & (AGP_PAGE_SIZE - 1)) != 0)
- return 0;
-
- if (size > sc->as_maxmem - sc->as_allocated)
- return 0;
-
- if (type != 0) {
- printf("agp_generic_alloc_memory: unsupported type %d\n",
- type);
- return 0;
- }
-
- mem = malloc(sizeof *mem, M_AGP, M_WAITOK);
- mem->am_id = sc->as_nextid++;
- mem->am_size = size;
- mem->am_type = 0;
- mem->am_obj = vm_object_allocate(OBJT_SWAP, atop(round_page(size)));
- mem->am_physical = 0;
- mem->am_offset = 0;
- mem->am_is_bound = 0;
- TAILQ_INSERT_TAIL(&sc->as_memory, mem, am_link);
- sc->as_allocated += size;
-
- return mem;
-}
-
-int
-agp_generic_free_memory(device_t dev, struct agp_memory *mem)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- if (mem->am_is_bound)
- return EBUSY;
-
- sc->as_allocated -= mem->am_size;
- TAILQ_REMOVE(&sc->as_memory, mem, am_link);
- vm_object_deallocate(mem->am_obj);
- free(mem, M_AGP);
- return 0;
-}
-
-int
-agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
- vm_offset_t offset)
-{
- struct agp_softc *sc = device_get_softc(dev);
- vm_offset_t i, j, k;
- vm_page_t m;
- int error;
-
- /* Do some sanity checks first. */
- if ((offset & (AGP_PAGE_SIZE - 1)) != 0 ||
- offset + mem->am_size > AGP_GET_APERTURE(dev)) {
- device_printf(dev, "binding memory at bad offset %#x\n",
- (int)offset);
- return EINVAL;
- }
-
- /*
- * Allocate the pages early, before acquiring the lock,
- * because vm_page_grab() may sleep and we can't hold a mutex
- * while sleeping.
- */
- VM_OBJECT_WLOCK(mem->am_obj);
- for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
- /*
- * Find a page from the object and wire it
- * down. This page will be mapped using one or more
- * entries in the GATT (assuming that PAGE_SIZE >=
- * AGP_PAGE_SIZE. If this is the first call to bind,
- * the pages will be allocated and zeroed.
- */
- m = vm_page_grab(mem->am_obj, OFF_TO_IDX(i),
- VM_ALLOC_WIRED | VM_ALLOC_ZERO);
- AGP_DPF("found page pa=%#jx\n", (uintmax_t)VM_PAGE_TO_PHYS(m));
- }
- VM_OBJECT_WUNLOCK(mem->am_obj);
-
- mtx_lock(&sc->as_lock);
-
- if (mem->am_is_bound) {
- device_printf(dev, "memory already bound\n");
- error = EINVAL;
- VM_OBJECT_WLOCK(mem->am_obj);
- i = 0;
- goto bad;
- }
-
- /*
- * Bind the individual pages and flush the chipset's
- * TLB.
- */
- VM_OBJECT_WLOCK(mem->am_obj);
- for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
- m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(i));
-
- /*
- * Install entries in the GATT, making sure that if
- * AGP_PAGE_SIZE < PAGE_SIZE and mem->am_size is not
- * aligned to PAGE_SIZE, we don't modify too many GATT
- * entries.
- */
- for (j = 0; j < PAGE_SIZE && i + j < mem->am_size;
- j += AGP_PAGE_SIZE) {
- vm_offset_t pa = VM_PAGE_TO_PHYS(m) + j;
- AGP_DPF("binding offset %#jx to pa %#jx\n",
- (uintmax_t)offset + i + j, (uintmax_t)pa);
- error = AGP_BIND_PAGE(dev, offset + i + j, pa);
- if (error) {
- /*
- * Bail out. Reverse all the mappings
- * and unwire the pages.
- */
- for (k = 0; k < i + j; k += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(dev, offset + k);
- goto bad;
- }
- }
- vm_page_xunbusy(m);
- }
- VM_OBJECT_WUNLOCK(mem->am_obj);
-
- /*
- * Make sure the chipset gets the new mappings.
- */
- AGP_FLUSH_TLB(dev);
-
- mem->am_offset = offset;
- mem->am_is_bound = 1;
-
- mtx_unlock(&sc->as_lock);
-
- return 0;
-bad:
- mtx_unlock(&sc->as_lock);
- VM_OBJECT_ASSERT_WLOCKED(mem->am_obj);
- for (k = 0; k < mem->am_size; k += PAGE_SIZE) {
- m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k));
- if (k >= i)
- vm_page_xunbusy(m);
- vm_page_unwire(m, PQ_INACTIVE);
- }
- VM_OBJECT_WUNLOCK(mem->am_obj);
-
- return error;
-}
-
-int
-agp_generic_unbind_memory(device_t dev, struct agp_memory *mem)
-{
- struct agp_softc *sc = device_get_softc(dev);
- vm_page_t m;
- int i;
-
- mtx_lock(&sc->as_lock);
-
- if (!mem->am_is_bound) {
- device_printf(dev, "memory is not bound\n");
- mtx_unlock(&sc->as_lock);
- return EINVAL;
- }
-
- /*
- * Unbind the individual pages and flush the chipset's
- * TLB. Unwire the pages so they can be swapped.
- */
- for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(dev, mem->am_offset + i);
-
- AGP_FLUSH_TLB(dev);
-
- VM_OBJECT_WLOCK(mem->am_obj);
- for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
- m = vm_page_lookup(mem->am_obj, atop(i));
- vm_page_unwire(m, PQ_INACTIVE);
- }
- VM_OBJECT_WUNLOCK(mem->am_obj);
-
- mem->am_offset = 0;
- mem->am_is_bound = 0;
-
- mtx_unlock(&sc->as_lock);
-
- return 0;
-}
-
-/* Helper functions for implementing user/kernel api */
-
-static int
-agp_acquire_helper(device_t dev, enum agp_acquire_state state)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- if (sc->as_state != AGP_ACQUIRE_FREE)
- return EBUSY;
- sc->as_state = state;
-
- return 0;
-}
-
-static int
-agp_release_helper(device_t dev, enum agp_acquire_state state)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- if (sc->as_state == AGP_ACQUIRE_FREE)
- return 0;
-
- if (sc->as_state != state)
- return EBUSY;
-
- sc->as_state = AGP_ACQUIRE_FREE;
- return 0;
-}
-
-static struct agp_memory *
-agp_find_memory(device_t dev, int id)
-{
- struct agp_softc *sc = device_get_softc(dev);
- struct agp_memory *mem;
-
- AGP_DPF("searching for memory block %d\n", id);
- TAILQ_FOREACH(mem, &sc->as_memory, am_link) {
- AGP_DPF("considering memory block %d\n", mem->am_id);
- if (mem->am_id == id)
- return mem;
- }
- return 0;
-}
-
-/* Implementation of the userland ioctl api */
-
-static int
-agp_info_user(device_t dev, agp_info *info)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- bzero(info, sizeof *info);
- info->bridge_id = pci_get_devid(dev);
- info->agp_mode =
- pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
- if (sc->as_aperture)
- info->aper_base = rman_get_start(sc->as_aperture);
- else
- info->aper_base = 0;
- info->aper_size = AGP_GET_APERTURE(dev) >> 20;
- info->pg_total = info->pg_system = sc->as_maxmem >> AGP_PAGE_SHIFT;
- info->pg_used = sc->as_allocated >> AGP_PAGE_SHIFT;
-
- return 0;
-}
-
-static int
-agp_setup_user(device_t dev, agp_setup *setup)
-{
- return AGP_ENABLE(dev, setup->agp_mode);
-}
-
-static int
-agp_allocate_user(device_t dev, agp_allocate *alloc)
-{
- struct agp_memory *mem;
-
- mem = AGP_ALLOC_MEMORY(dev,
- alloc->type,
- alloc->pg_count << AGP_PAGE_SHIFT);
- if (mem) {
- alloc->key = mem->am_id;
- alloc->physical = mem->am_physical;
- return 0;
- } else {
- return ENOMEM;
- }
-}
-
-static int
-agp_deallocate_user(device_t dev, int id)
-{
- struct agp_memory *mem = agp_find_memory(dev, id);
-
- if (mem) {
- AGP_FREE_MEMORY(dev, mem);
- return 0;
- } else {
- return ENOENT;
- }
-}
-
-static int
-agp_bind_user(device_t dev, agp_bind *bind)
-{
- struct agp_memory *mem = agp_find_memory(dev, bind->key);
-
- if (!mem)
- return ENOENT;
-
- return AGP_BIND_MEMORY(dev, mem, bind->pg_start << AGP_PAGE_SHIFT);
-}
-
-static int
-agp_unbind_user(device_t dev, agp_unbind *unbind)
-{
- struct agp_memory *mem = agp_find_memory(dev, unbind->key);
-
- if (!mem)
- return ENOENT;
-
- return AGP_UNBIND_MEMORY(dev, mem);
-}
-
-static int
-agp_chipset_flush(device_t dev)
-{
-
- return (AGP_CHIPSET_FLUSH(dev));
-}
-
-static int
-agp_open(struct cdev *kdev, int oflags, int devtype, struct thread *td)
-{
- device_t dev = kdev->si_drv1;
- struct agp_softc *sc = device_get_softc(dev);
-
- if (!sc->as_isopen) {
- sc->as_isopen = 1;
- device_busy(dev);
- }
-
- return 0;
-}
-
-static int
-agp_close(struct cdev *kdev, int fflag, int devtype, struct thread *td)
-{
- device_t dev = kdev->si_drv1;
- struct agp_softc *sc = device_get_softc(dev);
- struct agp_memory *mem;
-
- /*
- * Clear the GATT and force release on last close
- */
- while ((mem = TAILQ_FIRST(&sc->as_memory)) != NULL) {
- if (mem->am_is_bound)
- AGP_UNBIND_MEMORY(dev, mem);
- AGP_FREE_MEMORY(dev, mem);
- }
- if (sc->as_state == AGP_ACQUIRE_USER)
- agp_release_helper(dev, AGP_ACQUIRE_USER);
- sc->as_isopen = 0;
- device_unbusy(dev);
-
- return 0;
-}
-
-static int
-agp_ioctl(struct cdev *kdev, u_long cmd, caddr_t data, int fflag, struct thread *td)
-{
- device_t dev = kdev->si_drv1;
-
- switch (cmd) {
- case AGPIOC_INFO:
- return agp_info_user(dev, (agp_info *) data);
-
- case AGPIOC_ACQUIRE:
- return agp_acquire_helper(dev, AGP_ACQUIRE_USER);
-
- case AGPIOC_RELEASE:
- return agp_release_helper(dev, AGP_ACQUIRE_USER);
-
- case AGPIOC_SETUP:
- return agp_setup_user(dev, (agp_setup *)data);
-
- case AGPIOC_ALLOCATE:
- return agp_allocate_user(dev, (agp_allocate *)data);
-
- case AGPIOC_DEALLOCATE:
- return agp_deallocate_user(dev, *(int *) data);
-
- case AGPIOC_BIND:
- return agp_bind_user(dev, (agp_bind *)data);
-
- case AGPIOC_UNBIND:
- return agp_unbind_user(dev, (agp_unbind *)data);
-
- case AGPIOC_CHIPSET_FLUSH:
- return agp_chipset_flush(dev);
- }
-
- return EINVAL;
-}
-
-static int
-agp_mmap(struct cdev *kdev, vm_ooffset_t offset, vm_paddr_t *paddr,
- int prot, vm_memattr_t *memattr)
-{
- device_t dev = kdev->si_drv1;
- struct agp_softc *sc = device_get_softc(dev);
-
- if (offset > AGP_GET_APERTURE(dev))
- return -1;
- if (sc->as_aperture == NULL)
- return -1;
- *paddr = rman_get_start(sc->as_aperture) + offset;
- return 0;
-}
-
-/* Implementation of the kernel api */
-
-device_t
-agp_find_device(void)
-{
- device_t *children, child;
- int i, count;
-
- if (!agp_devclass)
- return NULL;
- if (devclass_get_devices(agp_devclass, &children, &count) != 0)
- return NULL;
- child = NULL;
- for (i = 0; i < count; i++) {
- if (device_is_attached(children[i])) {
- child = children[i];
- break;
- }
- }
- free(children, M_TEMP);
- return child;
-}
-
-enum agp_acquire_state
-agp_state(device_t dev)
-{
- struct agp_softc *sc = device_get_softc(dev);
- return sc->as_state;
-}
-
-void
-agp_get_info(device_t dev, struct agp_info *info)
-{
- struct agp_softc *sc = device_get_softc(dev);
-
- info->ai_mode =
- pci_read_config(dev, agp_find_caps(dev) + AGP_STATUS, 4);
- if (sc->as_aperture != NULL)
- info->ai_aperture_base = rman_get_start(sc->as_aperture);
- else
- info->ai_aperture_base = 0;
- info->ai_aperture_size = AGP_GET_APERTURE(dev);
- info->ai_memory_allowed = sc->as_maxmem;
- info->ai_memory_used = sc->as_allocated;
-}
-
-int
-agp_acquire(device_t dev)
-{
- return agp_acquire_helper(dev, AGP_ACQUIRE_KERNEL);
-}
-
-int
-agp_release(device_t dev)
-{
- return agp_release_helper(dev, AGP_ACQUIRE_KERNEL);
-}
-
-int
-agp_enable(device_t dev, u_int32_t mode)
-{
- return AGP_ENABLE(dev, mode);
-}
-
-void *agp_alloc_memory(device_t dev, int type, vm_size_t bytes)
-{
- return (void *) AGP_ALLOC_MEMORY(dev, type, bytes);
-}
-
-void agp_free_memory(device_t dev, void *handle)
-{
- struct agp_memory *mem = (struct agp_memory *) handle;
- AGP_FREE_MEMORY(dev, mem);
-}
-
-int agp_bind_memory(device_t dev, void *handle, vm_offset_t offset)
-{
- struct agp_memory *mem = (struct agp_memory *) handle;
- return AGP_BIND_MEMORY(dev, mem, offset);
-}
-
-int agp_unbind_memory(device_t dev, void *handle)
-{
- struct agp_memory *mem = (struct agp_memory *) handle;
- return AGP_UNBIND_MEMORY(dev, mem);
-}
-
-void agp_memory_info(device_t dev, void *handle, struct
- agp_memory_info *mi)
-{
- struct agp_memory *mem = (struct agp_memory *) handle;
-
- mi->ami_size = mem->am_size;
- mi->ami_physical = mem->am_physical;
- mi->ami_offset = mem->am_offset;
- mi->ami_is_bound = mem->am_is_bound;
-}
-
-int
-agp_bind_pages(device_t dev, vm_page_t *pages, vm_size_t size,
- vm_offset_t offset)
-{
- struct agp_softc *sc;
- vm_offset_t i, j, k, pa;
- vm_page_t m;
- int error;
-
- if ((size & (AGP_PAGE_SIZE - 1)) != 0 ||
- (offset & (AGP_PAGE_SIZE - 1)) != 0)
- return (EINVAL);
-
- sc = device_get_softc(dev);
-
- mtx_lock(&sc->as_lock);
- for (i = 0; i < size; i += PAGE_SIZE) {
- m = pages[OFF_TO_IDX(i)];
- KASSERT(vm_page_wired(m),
- ("agp_bind_pages: page %p hasn't been wired", m));
-
- /*
- * Install entries in the GATT, making sure that if
- * AGP_PAGE_SIZE < PAGE_SIZE and size is not
- * aligned to PAGE_SIZE, we don't modify too many GATT
- * entries.
- */
- for (j = 0; j < PAGE_SIZE && i + j < size; j += AGP_PAGE_SIZE) {
- pa = VM_PAGE_TO_PHYS(m) + j;
- AGP_DPF("binding offset %#jx to pa %#jx\n",
- (uintmax_t)offset + i + j, (uintmax_t)pa);
- error = AGP_BIND_PAGE(dev, offset + i + j, pa);
- if (error) {
- /*
- * Bail out. Reverse all the mappings.
- */
- for (k = 0; k < i + j; k += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(dev, offset + k);
-
- mtx_unlock(&sc->as_lock);
- return (error);
- }
- }
- }
-
- AGP_FLUSH_TLB(dev);
-
- mtx_unlock(&sc->as_lock);
- return (0);
-}
-
-int
-agp_unbind_pages(device_t dev, vm_size_t size, vm_offset_t offset)
-{
- struct agp_softc *sc;
- vm_offset_t i;
-
- if ((size & (AGP_PAGE_SIZE - 1)) != 0 ||
- (offset & (AGP_PAGE_SIZE - 1)) != 0)
- return (EINVAL);
-
- sc = device_get_softc(dev);
-
- mtx_lock(&sc->as_lock);
- for (i = 0; i < size; i += AGP_PAGE_SIZE)
- AGP_UNBIND_PAGE(dev, offset + i);
-
- AGP_FLUSH_TLB(dev);
-
- mtx_unlock(&sc->as_lock);
- return (0);
-}
diff --git a/sys/dev/agp/agp_ali.c b/sys/dev/agp/agp_ali.c
deleted file mode 100644
--- a/sys/dev/agp/agp_ali.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-struct agp_ali_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
-};
-
-static const char*
-agp_ali_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return NULL;
-
- if (agp_find_caps(dev) == 0)
- return NULL;
-
- switch (pci_get_devid(dev)) {
- case 0x167110b9:
- return ("Ali M1671 host to AGP bridge");
- case 0x154110b9:
- return ("Ali M1541 host to AGP bridge");
- case 0x162110b9:
- return ("Ali M1621 host to AGP bridge");
- }
-
- return NULL;
-}
-
-static int
-agp_ali_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_ali_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return BUS_PROBE_DEFAULT;
- }
-
- return ENXIO;
-}
-
-static int
-agp_ali_attach(device_t dev)
-{
- struct agp_ali_softc *sc = device_get_softc(dev);
- struct agp_gatt *gatt;
- int error;
- u_int32_t attbase;
-
- error = agp_generic_attach(dev);
- if (error)
- return error;
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
- if (sc->initial_aperture == 0) {
- device_printf(dev, "bad initial aperture size, disabling\n");
- return ENXIO;
- }
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
- }
- sc->gatt = gatt;
-
- /* Install the gatt. */
- attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
- pci_write_config(dev, AGP_ALI_ATTBASE, gatt->ag_physical |
- (attbase & 0xfff), 4);
-
- /* Enable the TLB. */
- pci_write_config(dev, AGP_ALI_TLBCTRL, 0x10, 1);
-
- return 0;
-}
-
-static int
-agp_ali_detach(device_t dev)
-{
- struct agp_ali_softc *sc = device_get_softc(dev);
- u_int32_t attbase;
-
- agp_free_cdev(dev);
-
- /* Disable the TLB.. */
- pci_write_config(dev, AGP_ALI_TLBCTRL, 0x90, 1);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
- attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
- pci_write_config(dev, AGP_ALI_ATTBASE, attbase & 0xfff, 4);
-
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
- return 0;
-}
-
-#define M 1024*1024
-
-static u_int32_t agp_ali_table[] = {
- 0, /* 0 - invalid */
- 1, /* 1 - invalid */
- 2, /* 2 - invalid */
- 4*M, /* 3 - invalid */
- 8*M, /* 4 - invalid */
- 0, /* 5 - invalid */
- 16*M, /* 6 - invalid */
- 32*M, /* 7 - invalid */
- 64*M, /* 8 - invalid */
- 128*M, /* 9 - invalid */
- 256*M, /* 10 - invalid */
-};
-#define AGP_ALI_TABLE_SIZE nitems(agp_ali_table)
-
-static u_int32_t
-agp_ali_get_aperture(device_t dev)
-{
- /*
- * The aperture size is derived from the low bits of attbase.
- * I'm not sure this is correct..
- */
- int i = pci_read_config(dev, AGP_ALI_ATTBASE, 4) & 0xf;
- if (i >= AGP_ALI_TABLE_SIZE)
- return 0;
- return agp_ali_table[i];
-}
-
-static int
-agp_ali_set_aperture(device_t dev, u_int32_t aperture)
-{
- int i;
- u_int32_t attbase;
-
- for (i = 0; i < AGP_ALI_TABLE_SIZE; i++)
- if (agp_ali_table[i] == aperture)
- break;
- if (i == AGP_ALI_TABLE_SIZE)
- return EINVAL;
-
- attbase = pci_read_config(dev, AGP_ALI_ATTBASE, 4);
- pci_write_config(dev, AGP_ALI_ATTBASE, (attbase & ~0xf) | i, 4);
- return 0;
-}
-
-static int
-agp_ali_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_ali_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
- return 0;
-}
-
-static int
-agp_ali_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_ali_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return 0;
-}
-
-static void
-agp_ali_flush_tlb(device_t dev)
-{
- pci_write_config(dev, AGP_ALI_TLBCTRL, 0x90, 1);
- pci_write_config(dev, AGP_ALI_TLBCTRL, 0x10, 1);
-}
-
-static device_method_t agp_ali_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_ali_probe),
- DEVMETHOD(device_attach, agp_ali_attach),
- DEVMETHOD(device_detach, agp_ali_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_ali_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_ali_set_aperture),
- DEVMETHOD(agp_bind_page, agp_ali_bind_page),
- DEVMETHOD(agp_unbind_page, agp_ali_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_ali_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_ali_driver = {
- "agp",
- agp_ali_methods,
- sizeof(struct agp_ali_softc),
-};
-
-DRIVER_MODULE(agp_ali, hostb, agp_ali_driver, 0, 0);
-MODULE_DEPEND(agp_ali, agp, 1, 1, 1);
-MODULE_DEPEND(agp_ali, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_amd.c b/sys/dev/agp/agp_amd.c
deleted file mode 100644
--- a/sys/dev/agp/agp_amd.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-MALLOC_DECLARE(M_AGP);
-
-#define READ2(off) bus_space_read_2(sc->bst, sc->bsh, off)
-#define READ4(off) bus_space_read_4(sc->bst, sc->bsh, off)
-#define WRITE2(off,v) bus_space_write_2(sc->bst, sc->bsh, off, v)
-#define WRITE4(off,v) bus_space_write_4(sc->bst, sc->bsh, off, v)
-
-struct agp_amd_gatt {
- u_int32_t ag_entries;
- u_int32_t *ag_virtual; /* virtual address of gatt */
- vm_offset_t ag_physical;
- u_int32_t *ag_vdir; /* virtual address of page dir */
- vm_offset_t ag_pdir; /* physical address of page dir */
-};
-
-struct agp_amd_softc {
- struct agp_softc agp;
- struct resource *regs; /* memory mapped control registers */
- bus_space_tag_t bst; /* bus_space tag */
- bus_space_handle_t bsh; /* bus_space handle */
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_amd_gatt *gatt;
-};
-
-static struct agp_amd_gatt *
-agp_amd_alloc_gatt(device_t dev)
-{
- u_int32_t apsize = AGP_GET_APERTURE(dev);
- u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
- struct agp_amd_gatt *gatt;
- int i, npages, pdir_offset;
-
- if (bootverbose)
- device_printf(dev,
- "allocating GATT for aperture of size %dM\n",
- apsize / (1024*1024));
-
- gatt = malloc(sizeof(struct agp_amd_gatt), M_AGP, M_NOWAIT);
- if (!gatt)
- return 0;
-
- /*
- * The AMD751 uses a page directory to map a non-contiguous
- * gatt so we don't need to use kmem_alloc_contig.
- * Allocate individual GATT pages and map them into the page
- * directory.
- */
- gatt->ag_entries = entries;
- gatt->ag_virtual = kmem_alloc_attr(entries * sizeof(uint32_t),
- M_NOWAIT | M_ZERO, 0, ~0, VM_MEMATTR_WRITE_COMBINING);
- if (!gatt->ag_virtual) {
- if (bootverbose)
- device_printf(dev, "allocation failed\n");
- free(gatt, M_AGP);
- return 0;
- }
-
- /*
- * Allocate the page directory.
- */
- gatt->ag_vdir = kmem_alloc_attr(AGP_PAGE_SIZE, M_NOWAIT |
- M_ZERO, 0, ~0, VM_MEMATTR_WRITE_COMBINING);
- if (!gatt->ag_vdir) {
- if (bootverbose)
- device_printf(dev,
- "failed to allocate page directory\n");
- kmem_free(gatt->ag_virtual, entries * sizeof(uint32_t));
- free(gatt, M_AGP);
- return 0;
- }
-
- gatt->ag_pdir = vtophys((vm_offset_t) gatt->ag_vdir);
- if(bootverbose)
- device_printf(dev, "gatt -> ag_pdir %#lx\n",
- (u_long)gatt->ag_pdir);
- /*
- * Allocate the gatt pages
- */
- gatt->ag_entries = entries;
- if(bootverbose)
- device_printf(dev, "allocating GATT for %d AGP page entries\n",
- gatt->ag_entries);
-
- gatt->ag_physical = vtophys((vm_offset_t) gatt->ag_virtual);
-
- /*
- * Map the pages of the GATT into the page directory.
- *
- * The GATT page addresses are mapped into the directory offset by
- * an amount dependent on the base address of the aperture. This
- * is and offset into the page directory, not an offset added to
- * the addresses of the gatt pages.
- */
-
- pdir_offset = pci_read_config(dev, AGP_AMD751_APBASE, 4) >> 22;
-
- npages = ((entries * sizeof(u_int32_t) + AGP_PAGE_SIZE - 1)
- >> AGP_PAGE_SHIFT);
-
- for (i = 0; i < npages; i++) {
- vm_offset_t va;
- vm_offset_t pa;
-
- va = ((vm_offset_t) gatt->ag_virtual) + i * AGP_PAGE_SIZE;
- pa = vtophys(va);
- gatt->ag_vdir[i + pdir_offset] = pa | 1;
- }
-
- return gatt;
-}
-
-static void
-agp_amd_free_gatt(struct agp_amd_gatt *gatt)
-{
- kmem_free(gatt->ag_vdir, AGP_PAGE_SIZE);
- kmem_free(gatt->ag_virtual, gatt->ag_entries * sizeof(uint32_t));
- free(gatt, M_AGP);
-}
-
-static const char*
-agp_amd_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return NULL;
-
- if (agp_find_caps(dev) == 0)
- return NULL;
-
- switch (pci_get_devid(dev)) {
- case 0x70061022:
- return ("AMD 751 host to AGP bridge");
- case 0x700e1022:
- return ("AMD 761 host to AGP bridge");
- case 0x700c1022:
- return ("AMD 762 host to AGP bridge");
- }
-
- return NULL;
-}
-
-static int
-agp_amd_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_amd_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return BUS_PROBE_DEFAULT;
- }
-
- return ENXIO;
-}
-
-static int
-agp_amd_attach(device_t dev)
-{
- struct agp_amd_softc *sc = device_get_softc(dev);
- struct agp_amd_gatt *gatt;
- int error, rid;
-
- error = agp_generic_attach(dev);
- if (error)
- return error;
-
- rid = AGP_AMD751_REGISTERS;
- sc->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
- RF_ACTIVE);
- if (!sc->regs) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
-
- sc->bst = rman_get_bustag(sc->regs);
- sc->bsh = rman_get_bushandle(sc->regs);
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_amd_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2))
- return ENOMEM;
- }
- sc->gatt = gatt;
-
- /* Install the gatt. */
- WRITE4(AGP_AMD751_ATTBASE, gatt->ag_pdir);
-
- /* Enable synchronisation between host and agp. */
- pci_write_config(dev,
- AGP_AMD751_MODECTRL,
- AGP_AMD751_MODECTRL_SYNEN, 1);
-
- /* Set indexing mode for two-level and enable page dir cache */
- pci_write_config(dev,
- AGP_AMD751_MODECTRL2,
- AGP_AMD751_MODECTRL2_GPDCE, 1);
-
- /* Enable the TLB and flush */
- WRITE2(AGP_AMD751_STATUS,
- READ2(AGP_AMD751_STATUS) | AGP_AMD751_STATUS_GCE);
- AGP_FLUSH_TLB(dev);
-
- return 0;
-}
-
-static int
-agp_amd_detach(device_t dev)
-{
- struct agp_amd_softc *sc = device_get_softc(dev);
-
- agp_free_cdev(dev);
-
- /* Disable the TLB.. */
- WRITE2(AGP_AMD751_STATUS,
- READ2(AGP_AMD751_STATUS) & ~AGP_AMD751_STATUS_GCE);
-
- /* Disable host-agp sync */
- pci_write_config(dev, AGP_AMD751_MODECTRL, 0x00, 1);
-
- /* Clear the GATT base */
- WRITE4(AGP_AMD751_ATTBASE, 0);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- agp_amd_free_gatt(sc->gatt);
- agp_free_res(dev);
-
- bus_release_resource(dev, SYS_RES_MEMORY,
- AGP_AMD751_REGISTERS, sc->regs);
-
- return 0;
-}
-
-static u_int32_t
-agp_amd_get_aperture(device_t dev)
-{
- int vas;
-
- /*
- * The aperture size is equal to 32M<<vas.
- */
- vas = (pci_read_config(dev, AGP_AMD751_APCTRL, 1) & 0x06) >> 1;
- return (32*1024*1024) << vas;
-}
-
-static int
-agp_amd_set_aperture(device_t dev, u_int32_t aperture)
-{
- int vas;
-
- /*
- * Check for a power of two and make sure its within the
- * programmable range.
- */
- if (aperture & (aperture - 1)
- || aperture < 32*1024*1024
- || aperture > 2U*1024*1024*1024)
- return EINVAL;
-
- vas = ffs(aperture / 32*1024*1024) - 1;
-
- /*
- * While the size register is bits 1-3 of APCTRL, bit 0 must be
- * set for the size value to be 'valid'
- */
- pci_write_config(dev, AGP_AMD751_APCTRL,
- (((pci_read_config(dev, AGP_AMD751_APCTRL, 1) & ~0x06)
- | ((vas << 1) | 1))), 1);
-
- return 0;
-}
-
-static int
-agp_amd_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_amd_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical | 1;
- return 0;
-}
-
-static int
-agp_amd_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_amd_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return 0;
-}
-
-static void
-agp_amd_flush_tlb(device_t dev)
-{
- struct agp_amd_softc *sc = device_get_softc(dev);
-
- /* Set the cache invalidate bit and wait for the chipset to clear */
- WRITE4(AGP_AMD751_TLBCTRL, 1);
- do {
- DELAY(1);
- } while (READ4(AGP_AMD751_TLBCTRL));
-}
-
-static device_method_t agp_amd_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_amd_probe),
- DEVMETHOD(device_attach, agp_amd_attach),
- DEVMETHOD(device_detach, agp_amd_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_amd_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_amd_set_aperture),
- DEVMETHOD(agp_bind_page, agp_amd_bind_page),
- DEVMETHOD(agp_unbind_page, agp_amd_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_amd_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_amd_driver = {
- "agp",
- agp_amd_methods,
- sizeof(struct agp_amd_softc),
-};
-
-DRIVER_MODULE(agp_amd, hostb, agp_amd_driver, 0, 0);
-MODULE_DEPEND(agp_amd, agp, 1, 1, 1);
-MODULE_DEPEND(agp_amd, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_amd64.c b/sys/dev/agp/agp_amd64.c
deleted file mode 100644
--- a/sys/dev/agp/agp_amd64.c
+++ /dev/null
@@ -1,512 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2004, 2005 Jung-uk Kim <jkim@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <machine/pci_cfgreg.h>
-#include <sys/rman.h>
-
-static void agp_amd64_apbase_fixup(device_t);
-
-static void agp_amd64_uli_init(device_t);
-static int agp_amd64_uli_set_aperture(device_t, uint32_t);
-
-static int agp_amd64_nvidia_match(uint16_t);
-static void agp_amd64_nvidia_init(device_t);
-static int agp_amd64_nvidia_set_aperture(device_t, uint32_t);
-
-static int agp_amd64_via_match(void);
-static void agp_amd64_via_init(device_t);
-static int agp_amd64_via_set_aperture(device_t, uint32_t);
-
-MALLOC_DECLARE(M_AGP);
-
-#define AMD64_MAX_MCTRL 8
-
-struct agp_amd64_softc {
- struct agp_softc agp;
- uint32_t initial_aperture;
- struct agp_gatt *gatt;
- uint32_t apbase;
- int mctrl[AMD64_MAX_MCTRL];
- int n_mctrl;
- int via_agp;
-};
-
-static const char*
-agp_amd64_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE ||
- pci_get_subclass(dev) != PCIS_BRIDGE_HOST ||
- agp_find_caps(dev) == 0)
- return (NULL);
-
- switch (pci_get_devid(dev)) {
- case 0x74541022:
- return ("AMD 8151 AGP graphics tunnel");
- case 0x07551039:
- return ("SiS 755 host to AGP bridge");
- case 0x07601039:
- return ("SiS 760 host to AGP bridge");
- case 0x168910b9:
- return ("ULi M1689 AGP Controller");
- case 0x00d110de:
- if (agp_amd64_nvidia_match(0x00d2))
- return (NULL);
- return ("NVIDIA nForce3 AGP Controller");
- case 0x00e110de:
- if (agp_amd64_nvidia_match(0x00e2))
- return (NULL);
- return ("NVIDIA nForce3-250 AGP Controller");
- case 0x02041106:
- return ("VIA 8380 host to PCI bridge");
- case 0x02381106:
- return ("VIA 3238 host to PCI bridge");
- case 0x02821106:
- return ("VIA K8T800Pro host to PCI bridge");
- case 0x31881106:
- return ("VIA 8385 host to PCI bridge");
- }
-
- return (NULL);
-}
-
-static int
-agp_amd64_nvidia_match(uint16_t devid)
-{
- /* XXX nForce3 requires secondary AGP bridge at 0:11:0. */
- if (pci_cfgregread(0, 0, 11, 0, PCIR_CLASS, 1) != PCIC_BRIDGE ||
- pci_cfgregread(0, 0, 11, 0, PCIR_SUBCLASS, 1) != PCIS_BRIDGE_PCI ||
- pci_cfgregread(0, 0, 11, 0, PCIR_VENDOR, 2) != 0x10de ||
- pci_cfgregread(0, 0, 11, 0, PCIR_DEVICE, 2) != devid)
- return (ENXIO);
-
- return (0);
-}
-
-static int
-agp_amd64_via_match(void)
-{
- /* XXX Some VIA bridge requires secondary AGP bridge at 0:1:0. */
- if (pci_cfgregread(0, 0, 1, 0, PCIR_CLASS, 1) != PCIC_BRIDGE ||
- pci_cfgregread(0, 0, 1, 0, PCIR_SUBCLASS, 1) != PCIS_BRIDGE_PCI ||
- pci_cfgregread(0, 0, 1, 0, PCIR_VENDOR, 2) != 0x1106 ||
- pci_cfgregread(0, 0, 1, 0, PCIR_DEVICE, 2) != 0xb188 ||
- (pci_cfgregread(0, 0, 1, 0, AGP_VIA_AGPSEL, 1) & 2))
- return (0);
-
- return (1);
-}
-
-static int
-agp_amd64_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- if ((desc = agp_amd64_match(dev))) {
- device_set_desc(dev, desc);
- return (BUS_PROBE_DEFAULT);
- }
-
- return (ENXIO);
-}
-
-static int
-agp_amd64_attach(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- struct agp_gatt *gatt;
- uint32_t devid;
- int i, n, error;
-
- for (i = 0, n = 0; i < PCI_SLOTMAX && n < AMD64_MAX_MCTRL; i++) {
- devid = pci_cfgregread(0, 0, i, 3, 0, 4);
- if (devid == 0x11031022 || devid == 0x12031022) {
- sc->mctrl[n] = i;
- n++;
- }
- }
- if (n == 0)
- return (ENXIO);
-
- sc->n_mctrl = n;
-
- if (bootverbose)
- device_printf(dev, "%d Miscellaneous Control unit(s) found.\n",
- sc->n_mctrl);
-
- if ((error = agp_generic_attach(dev)))
- return (error);
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) {
- agp_generic_detach(dev);
- return (ENOMEM);
- }
- }
- sc->gatt = gatt;
-
- switch (pci_get_vendor(dev)) {
- case 0x10b9: /* ULi */
- agp_amd64_uli_init(dev);
- if (agp_amd64_uli_set_aperture(dev, sc->initial_aperture))
- return (ENXIO);
- break;
-
- case 0x10de: /* nVidia */
- agp_amd64_nvidia_init(dev);
- if (agp_amd64_nvidia_set_aperture(dev, sc->initial_aperture))
- return (ENXIO);
- break;
-
- case 0x1106: /* VIA */
- sc->via_agp = agp_amd64_via_match();
- if (sc->via_agp) {
- agp_amd64_via_init(dev);
- if (agp_amd64_via_set_aperture(dev,
- sc->initial_aperture))
- return (ENXIO);
- }
- break;
- }
-
- /* Install the gatt and enable aperture. */
- for (i = 0; i < sc->n_mctrl; i++) {
- pci_cfgregwrite(0, 0, sc->mctrl[i], 3, AGP_AMD64_ATTBASE,
- (uint32_t)(gatt->ag_physical >> 8) & AGP_AMD64_ATTBASE_MASK,
- 4);
- pci_cfgregwrite(0, 0, sc->mctrl[i], 3, AGP_AMD64_APCTRL,
- (pci_cfgregread(0, 0, sc->mctrl[i], 3, AGP_AMD64_APCTRL, 4) |
- AGP_AMD64_APCTRL_GARTEN) &
- ~(AGP_AMD64_APCTRL_DISGARTCPU | AGP_AMD64_APCTRL_DISGARTIO),
- 4);
- }
-
- return (0);
-}
-
-static int
-agp_amd64_detach(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- int i;
-
- agp_free_cdev(dev);
-
- for (i = 0; i < sc->n_mctrl; i++)
- pci_cfgregwrite(0, 0, sc->mctrl[i], 3, AGP_AMD64_APCTRL,
- pci_cfgregread(0, 0, sc->mctrl[i], 3, AGP_AMD64_APCTRL, 4) &
- ~AGP_AMD64_APCTRL_GARTEN, 4);
-
- AGP_SET_APERTURE(dev, sc->initial_aperture);
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
-
- return (0);
-}
-
-static uint32_t agp_amd64_table[] = {
- 0x02000000, /* 32 MB */
- 0x04000000, /* 64 MB */
- 0x08000000, /* 128 MB */
- 0x10000000, /* 256 MB */
- 0x20000000, /* 512 MB */
- 0x40000000, /* 1024 MB */
- 0x80000000, /* 2048 MB */
-};
-
-#define AGP_AMD64_TABLE_SIZE nitems(agp_amd64_table)
-
-static uint32_t
-agp_amd64_get_aperture(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- uint32_t i;
-
- i = (pci_cfgregread(0, 0, sc->mctrl[0], 3, AGP_AMD64_APCTRL, 4) &
- AGP_AMD64_APCTRL_SIZE_MASK) >> 1;
-
- if (i >= AGP_AMD64_TABLE_SIZE)
- return (0);
-
- return (agp_amd64_table[i]);
-}
-
-static int
-agp_amd64_set_aperture(device_t dev, uint32_t aperture)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- uint32_t i;
- int j;
-
- for (i = 0; i < AGP_AMD64_TABLE_SIZE; i++)
- if (agp_amd64_table[i] == aperture)
- break;
- if (i >= AGP_AMD64_TABLE_SIZE)
- return (EINVAL);
-
- for (j = 0; j < sc->n_mctrl; j++)
- pci_cfgregwrite(0, 0, sc->mctrl[j], 3, AGP_AMD64_APCTRL,
- (pci_cfgregread(0, 0, sc->mctrl[j], 3, AGP_AMD64_APCTRL, 4) &
- ~(AGP_AMD64_APCTRL_SIZE_MASK)) | (i << 1), 4);
-
- switch (pci_get_vendor(dev)) {
- case 0x10b9: /* ULi */
- return (agp_amd64_uli_set_aperture(dev, aperture));
- break;
-
- case 0x10de: /* nVidia */
- return (agp_amd64_nvidia_set_aperture(dev, aperture));
- break;
-
- case 0x1106: /* VIA */
- if (sc->via_agp)
- return (agp_amd64_via_set_aperture(dev, aperture));
- break;
- }
-
- return (0);
-}
-
-static int
-agp_amd64_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] =
- (physical & 0xfffff000) | ((physical >> 28) & 0x00000ff0) | 3;
-
- return (0);
-}
-
-static int
-agp_amd64_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
-
- return (0);
-}
-
-static void
-agp_amd64_flush_tlb(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- int i;
-
- for (i = 0; i < sc->n_mctrl; i++) {
- uint32_t val;
-
- val = pci_cfgregread(0, 0, sc->mctrl[i], 3, AGP_AMD64_CACHECTRL,
- 4);
- val |= AGP_AMD64_CACHECTRL_INVGART;
- pci_cfgregwrite(0, 0, sc->mctrl[i], 3, AGP_AMD64_CACHECTRL, val,
- 4);
- }
-}
-
-static void
-agp_amd64_apbase_fixup(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- uint32_t apbase;
- int i;
-
- sc->apbase = rman_get_start(sc->agp.as_aperture);
- apbase = (sc->apbase >> 25) & AGP_AMD64_APBASE_MASK;
- for (i = 0; i < sc->n_mctrl; i++)
- pci_cfgregwrite(0, 0, sc->mctrl[i], 3,
- AGP_AMD64_APBASE, apbase, 4);
-}
-
-static void
-agp_amd64_uli_init(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- agp_amd64_apbase_fixup(dev);
- pci_write_config(dev, AGP_AMD64_ULI_APBASE,
- (pci_read_config(dev, AGP_AMD64_ULI_APBASE, 4) & 0x0000000f) |
- sc->apbase, 4);
- pci_write_config(dev, AGP_AMD64_ULI_HTT_FEATURE, sc->apbase, 4);
-}
-
-static int
-agp_amd64_uli_set_aperture(device_t dev, uint32_t aperture)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- switch (aperture) {
- case 0x02000000: /* 32 MB */
- case 0x04000000: /* 64 MB */
- case 0x08000000: /* 128 MB */
- case 0x10000000: /* 256 MB */
- break;
- default:
- return (EINVAL);
- }
-
- pci_write_config(dev, AGP_AMD64_ULI_ENU_SCR,
- sc->apbase + aperture - 1, 4);
-
- return (0);
-}
-
-static void
-agp_amd64_nvidia_init(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- agp_amd64_apbase_fixup(dev);
- pci_write_config(dev, AGP_AMD64_NVIDIA_0_APBASE,
- (pci_read_config(dev, AGP_AMD64_NVIDIA_0_APBASE, 4) & 0x0000000f) |
- sc->apbase, 4);
- pci_cfgregwrite(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APBASE1, sc->apbase, 4);
- pci_cfgregwrite(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APBASE2, sc->apbase, 4);
-}
-
-static int
-agp_amd64_nvidia_set_aperture(device_t dev, uint32_t aperture)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
- uint32_t apsize;
-
- switch (aperture) {
- case 0x02000000: apsize = 0x0f; break; /* 32 MB */
- case 0x04000000: apsize = 0x0e; break; /* 64 MB */
- case 0x08000000: apsize = 0x0c; break; /* 128 MB */
- case 0x10000000: apsize = 0x08; break; /* 256 MB */
- case 0x20000000: apsize = 0x00; break; /* 512 MB */
- default:
- return (EINVAL);
- }
-
- pci_cfgregwrite(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APSIZE,
- (pci_cfgregread(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APSIZE, 4) &
- 0xfffffff0) | apsize, 4);
- pci_cfgregwrite(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APLIMIT1,
- sc->apbase + aperture - 1, 4);
- pci_cfgregwrite(0, 0, 11, 0, AGP_AMD64_NVIDIA_1_APLIMIT2,
- sc->apbase + aperture - 1, 4);
-
- return (0);
-}
-
-static void
-agp_amd64_via_init(device_t dev)
-{
- struct agp_amd64_softc *sc = device_get_softc(dev);
-
- agp_amd64_apbase_fixup(dev);
- pci_cfgregwrite(0, 0, 1, 0, AGP3_VIA_ATTBASE, sc->gatt->ag_physical, 4);
- pci_cfgregwrite(0, 0, 1, 0, AGP3_VIA_GARTCTRL,
- pci_cfgregread(0, 0, 1, 0, AGP3_VIA_ATTBASE, 4) | 0x180, 4);
-}
-
-static int
-agp_amd64_via_set_aperture(device_t dev, uint32_t aperture)
-{
- uint32_t apsize;
-
- apsize = ((aperture - 1) >> 20) ^ 0xff;
- if ((((apsize ^ 0xff) << 20) | ((1 << 20) - 1)) + 1 != aperture)
- return (EINVAL);
- pci_cfgregwrite(0, 0, 1, 0, AGP3_VIA_APSIZE, apsize, 1);
-
- return (0);
-}
-
-static device_method_t agp_amd64_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_amd64_probe),
- DEVMETHOD(device_attach, agp_amd64_attach),
- DEVMETHOD(device_detach, agp_amd64_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_amd64_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_amd64_set_aperture),
- DEVMETHOD(agp_bind_page, agp_amd64_bind_page),
- DEVMETHOD(agp_unbind_page, agp_amd64_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_amd64_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_amd64_driver = {
- "agp",
- agp_amd64_methods,
- sizeof(struct agp_amd64_softc),
-};
-
-DRIVER_MODULE(agp_amd64, hostb, agp_amd64_driver, 0, 0);
-MODULE_DEPEND(agp_amd64, agp, 1, 1, 1);
-MODULE_DEPEND(agp_amd64, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_apple.c b/sys/dev/agp/agp_apple.c
deleted file mode 100644
--- a/sys/dev/agp/agp_apple.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2010 Nathan Whitehorn
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <machine/resource.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-#define UNIN_AGP_GART_BASE 0x8c
-#define UNIN_AGP_BASE_ADDR 0x90
-#define UNIN_AGP_GART_CONTROL 0x94
-
-#define UNIN_AGP_GART_INVAL 0x00000001
-#define UNIN_AGP_GART_ENABLE 0x00000100
-#define UNIN_AGP_GART_2XRESET 0x00010000
-#define UNIN_AGP_U3_GART_PERFRD 0x00080000
-
-struct agp_apple_softc {
- struct agp_softc agp;
- uint32_t aperture;
- struct agp_gatt *gatt;
- int u3;
- int needs_2x_reset;
-};
-
-static int
-agp_apple_probe(device_t dev)
-{
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
-
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return (ENXIO);
-
- if (agp_find_caps(dev) == 0)
- return (ENXIO);
-
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return (ENXIO);
-
- switch (pci_get_devid(dev)) {
- case 0x0020106b:
- case 0x0027106b:
- device_set_desc(dev, "Apple UniNorth AGP Bridge");
- return (BUS_PROBE_DEFAULT);
- case 0x002d106b:
- device_set_desc(dev, "Apple UniNorth 1.5 AGP Bridge");
- return (BUS_PROBE_DEFAULT);
- case 0x0034106b:
- device_set_desc(dev, "Apple UniNorth 2 AGP Bridge");
- return (BUS_PROBE_DEFAULT);
- case 0x004b106b:
- case 0x0058106b:
- case 0x0059106b:
- device_set_desc(dev, "Apple U3 AGP Bridge");
- return (BUS_PROBE_DEFAULT);
- case 0x0066106b:
- device_set_desc(dev, "Apple Intrepid AGP Bridge");
- return (BUS_PROBE_DEFAULT);
- }
-
- return (ENXIO);
-}
-
-static int
-agp_apple_attach(device_t dev)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
- int error;
-
- /* Record quirks */
- sc->needs_2x_reset = 0;
- sc->u3 = 0;
- switch (pci_get_devid(dev)) {
- case 0x0020106b:
- case 0x0027106b:
- sc->needs_2x_reset = 1;
- break;
- case 0x004b106b:
- case 0x0058106b:
- case 0x0059106b:
- sc->u3 = 1;
- break;
- }
-
- /* Set the aperture bus address base (must be 0) */
- pci_write_config(dev, UNIN_AGP_BASE_ADDR, 0, 4);
- agp_set_aperture_resource(dev, -1);
-
- error = agp_generic_attach(dev);
- if (error)
- return (error);
-
- sc->aperture = 256*1024*1024;
-
- for (sc->aperture = 256*1024*1024; sc->aperture >= 4*1024*1024;
- sc->aperture /= 2) {
- sc->gatt = agp_alloc_gatt(dev);
- if (sc->gatt)
- break;
- }
- if (sc->aperture < 4*1024*1024) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
-
- /* Install the gatt. */
- AGP_SET_APERTURE(dev, sc->aperture);
-
- /* XXX: U3 scratch page? */
-
- /* Enable the aperture and TLB. */
- AGP_FLUSH_TLB(dev);
-
- return (0);
-}
-
-static int
-agp_apple_detach(device_t dev)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
-
- agp_free_cdev(dev);
-
- /* Disable the aperture and TLB */
- pci_write_config(dev, UNIN_AGP_GART_CONTROL, UNIN_AGP_GART_INVAL, 4);
- pci_write_config(dev, UNIN_AGP_GART_CONTROL, 0, 4);
-
- if (sc->needs_2x_reset) {
- pci_write_config(dev, UNIN_AGP_GART_CONTROL,
- UNIN_AGP_GART_2XRESET, 4);
- pci_write_config(dev, UNIN_AGP_GART_CONTROL, 0, 4);
- }
-
- AGP_SET_APERTURE(dev, 0);
-
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
- return 0;
-}
-
-static uint32_t
-agp_apple_get_aperture(device_t dev)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
-
- return (sc->aperture);
-}
-
-static int
-agp_apple_set_aperture(device_t dev, uint32_t aperture)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
-
- /*
- * Check for a multiple of 4 MB and make sure it is within the
- * programmable range.
- */
- if (aperture % (4*1024*1024)
- || aperture < 4*1024*1024
- || aperture > ((sc->u3) ? 512 : 256)*1024*1024)
- return EINVAL;
-
- /* The aperture value is a multiple of 4 MB */
- aperture /= (4*1024*1024);
-
- pci_write_config(dev, UNIN_AGP_GART_BASE,
- (sc->gatt->ag_physical & 0xfffff000) | aperture, 4);
-
- return (0);
-}
-
-static int
-agp_apple_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
- return (0);
-}
-
-static int
-agp_apple_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return (0);
-}
-
-static void
-agp_apple_flush_tlb(device_t dev)
-{
- struct agp_apple_softc *sc = device_get_softc(dev);
- uint32_t cntrl = UNIN_AGP_GART_ENABLE;
-
- if (sc->u3)
- cntrl |= UNIN_AGP_U3_GART_PERFRD;
-
- pci_write_config(dev, UNIN_AGP_GART_CONTROL,
- cntrl | UNIN_AGP_GART_INVAL, 4);
- pci_write_config(dev, UNIN_AGP_GART_CONTROL, cntrl, 4);
-
- if (sc->needs_2x_reset) {
- pci_write_config(dev, UNIN_AGP_GART_CONTROL,
- cntrl | UNIN_AGP_GART_2XRESET, 4);
- pci_write_config(dev, UNIN_AGP_GART_CONTROL, cntrl, 4);
- }
-}
-
-static device_method_t agp_apple_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_apple_probe),
- DEVMETHOD(device_attach, agp_apple_attach),
- DEVMETHOD(device_detach, agp_apple_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_apple_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_apple_set_aperture),
- DEVMETHOD(agp_bind_page, agp_apple_bind_page),
- DEVMETHOD(agp_unbind_page, agp_apple_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_apple_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_apple_driver = {
- "agp",
- agp_apple_methods,
- sizeof(struct agp_apple_softc),
-};
-
-DRIVER_MODULE(agp_apple, hostb, agp_apple_driver, 0, 0);
-MODULE_DEPEND(agp_apple, agp, 1, 1, 1);
-MODULE_DEPEND(agp_apple, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_ati.c b/sys/dev/agp/agp_ati.c
deleted file mode 100644
--- a/sys/dev/agp/agp_ati.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2005 Eric Anholt
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * Based on reading the Linux 2.6.8.1 driver by Dave Jones.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-MALLOC_DECLARE(M_AGP);
-
-#define READ4(off) bus_space_read_4(sc->bst, sc->bsh, off)
-#define WRITE4(off,v) bus_space_write_4(sc->bst, sc->bsh, off, v)
-
-struct agp_ati_softc {
- struct agp_softc agp;
- struct resource *regs; /* memory mapped control registers */
- bus_space_tag_t bst; /* bus_space tag */
- bus_space_handle_t bsh; /* bus_space handle */
- u_int32_t initial_aperture; /* aperture size at startup */
- char is_rs300;
-
- /* The GATT */
- u_int32_t ag_entries;
- u_int32_t *ag_virtual; /* virtual address of gatt */
- u_int32_t *ag_vdir; /* virtual address of page dir */
- vm_offset_t ag_pdir; /* physical address of page dir */
-};
-
-static const char*
-agp_ati_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE ||
- pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return NULL;
-
- if (agp_find_caps(dev) == 0)
- return NULL;
-
- switch (pci_get_devid(dev)) {
- case 0xcab01002:
- return ("ATI RS100 AGP bridge");
- case 0xcab21002:
- return ("ATI RS200 AGP bridge");
- case 0xcbb21002:
- return ("ATI RS200M AGP bridge");
- case 0xcab31002:
- return ("ATI RS250 AGP bridge");
- case 0x58301002:
- return ("ATI RS300_100 AGP bridge");
- case 0x58311002:
- return ("ATI RS300_133 AGP bridge");
- case 0x58321002:
- return ("ATI RS300_166 AGP bridge");
- case 0x58331002:
- return ("ATI RS300_200 AGP bridge");
- }
-
- return NULL;
-}
-
-static int
-agp_ati_probe(device_t dev)
-{
- const char *desc;
-
- desc = agp_ati_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return 0;
- }
-
- return ENXIO;
-}
-
-static int
-agp_ati_alloc_gatt(device_t dev)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
- u_int32_t apsize = AGP_GET_APERTURE(dev);
- u_int32_t entries = apsize >> AGP_PAGE_SHIFT;
- u_int32_t apbase_offset;
- int i;
-
- /* Alloc the GATT -- pointers to pages of AGP memory */
- sc->ag_entries = entries;
- sc->ag_virtual = kmem_alloc_attr(entries * sizeof(uint32_t),
- M_NOWAIT | M_ZERO, 0, ~0, VM_MEMATTR_WRITE_COMBINING);
- if (sc->ag_virtual == NULL) {
- if (bootverbose)
- device_printf(dev, "GATT allocation failed\n");
- return ENOMEM;
- }
-
- /* Alloc the page directory -- pointers to each page of the GATT */
- sc->ag_vdir = kmem_alloc_attr(AGP_PAGE_SIZE, M_NOWAIT | M_ZERO,
- 0, ~0, VM_MEMATTR_WRITE_COMBINING);
- if (sc->ag_vdir == NULL) {
- if (bootverbose)
- device_printf(dev, "pagedir allocation failed\n");
- kmem_free(sc->ag_virtual, entries * sizeof(uint32_t));
- return ENOMEM;
- }
- sc->ag_pdir = vtophys((vm_offset_t)sc->ag_vdir);
-
- apbase_offset = pci_read_config(dev, AGP_APBASE, 4) >> 22;
- /* Fill in the pagedir's pointers to GATT pages */
- for (i = 0; i < sc->ag_entries / 1024; i++) {
- vm_offset_t va;
- vm_offset_t pa;
-
- va = ((vm_offset_t)sc->ag_virtual) + i * AGP_PAGE_SIZE;
- pa = vtophys(va);
- sc->ag_vdir[apbase_offset + i] = pa | 1;
- }
-
- return 0;
-}
-
-static int
-agp_ati_attach(device_t dev)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
- int error, rid;
- u_int32_t temp;
- u_int32_t apsize_reg, agpmode_reg;
-
- error = agp_generic_attach(dev);
- if (error)
- return error;
-
- switch (pci_get_devid(dev)) {
- case 0xcab01002: /* ATI RS100 AGP bridge */
- case 0xcab21002: /* ATI RS200 AGP bridge */
- case 0xcbb21002: /* ATI RS200M AGP bridge */
- case 0xcab31002: /* ATI RS250 AGP bridge */
- sc->is_rs300 = 0;
- apsize_reg = ATI_RS100_APSIZE;
- agpmode_reg = ATI_RS100_IG_AGPMODE;
- break;
- case 0x58301002: /* ATI RS300_100 AGP bridge */
- case 0x58311002: /* ATI RS300_133 AGP bridge */
- case 0x58321002: /* ATI RS300_166 AGP bridge */
- case 0x58331002: /* ATI RS300_200 AGP bridge */
- sc->is_rs300 = 1;
- apsize_reg = ATI_RS300_APSIZE;
- agpmode_reg = ATI_RS300_IG_AGPMODE;
- break;
- default:
- /* Unknown chipset */
- return EINVAL;
- }
-
- rid = ATI_GART_MMADDR;
- sc->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
- if (!sc->regs) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
-
- sc->bst = rman_get_bustag(sc->regs);
- sc->bsh = rman_get_bushandle(sc->regs);
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- if (agp_ati_alloc_gatt(dev) == 0)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2))
- return ENOMEM;
- }
-
- temp = pci_read_config(dev, apsize_reg, 4);
- pci_write_config(dev, apsize_reg, temp | 1, 4);
-
- pci_write_config(dev, agpmode_reg, 0x20000, 4);
-
- WRITE4(ATI_GART_FEATURE_ID, 0x00060000);
-
- temp = pci_read_config(dev, 4, 4); /* XXX: Magic reg# */
- pci_write_config(dev, 4, temp | (1 << 14), 4);
-
- WRITE4(ATI_GART_BASE, sc->ag_pdir);
-
- AGP_FLUSH_TLB(dev);
-
- return 0;
-}
-
-static int
-agp_ati_detach(device_t dev)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
- u_int32_t apsize_reg, temp;
-
- agp_free_cdev(dev);
-
- if (sc->is_rs300)
- apsize_reg = ATI_RS300_APSIZE;
- else
- apsize_reg = ATI_RS100_APSIZE;
-
- /* Clear the GATT base */
- WRITE4(ATI_GART_BASE, 0);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- temp = pci_read_config(dev, apsize_reg, 4);
- pci_write_config(dev, apsize_reg, temp & ~1, 4);
-
- kmem_free(sc->ag_vdir, AGP_PAGE_SIZE);
- kmem_free(sc->ag_virtual, sc->ag_entries * sizeof(uint32_t));
-
- bus_release_resource(dev, SYS_RES_MEMORY, ATI_GART_MMADDR, sc->regs);
- agp_free_res(dev);
-
- return 0;
-}
-
-static u_int32_t
-agp_ati_get_aperture(device_t dev)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
- int size_value;
-
- if (sc->is_rs300)
- size_value = pci_read_config(dev, ATI_RS300_APSIZE, 4);
- else
- size_value = pci_read_config(dev, ATI_RS100_APSIZE, 4);
-
- size_value = (size_value & 0x0000000e) >> 1;
- size_value = (32 * 1024 * 1024) << size_value;
-
- return size_value;
-}
-
-static int
-agp_ati_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
- int size_value;
- u_int32_t apsize_reg;
-
- if (sc->is_rs300)
- apsize_reg = ATI_RS300_APSIZE;
- else
- apsize_reg = ATI_RS100_APSIZE;
-
- size_value = pci_read_config(dev, apsize_reg, 4);
-
- size_value &= ~0x0000000e;
- size_value |= (ffs(aperture / (32 * 1024 * 1024)) - 1) << 1;
-
- pci_write_config(dev, apsize_reg, size_value, 4);
-
- return 0;
-}
-
-static int
-agp_ati_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical | 1;
-
- return 0;
-}
-
-static int
-agp_ati_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return 0;
-}
-
-static void
-agp_ati_flush_tlb(device_t dev)
-{
- struct agp_ati_softc *sc = device_get_softc(dev);
-
- /* Set the cache invalidate bit and wait for the chipset to clear */
- WRITE4(ATI_GART_CACHE_CNTRL, 1);
- (void)READ4(ATI_GART_CACHE_CNTRL);
-}
-
-static device_method_t agp_ati_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_ati_probe),
- DEVMETHOD(device_attach, agp_ati_attach),
- DEVMETHOD(device_detach, agp_ati_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_ati_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_ati_set_aperture),
- DEVMETHOD(agp_bind_page, agp_ati_bind_page),
- DEVMETHOD(agp_unbind_page, agp_ati_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_ati_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_ati_driver = {
- "agp",
- agp_ati_methods,
- sizeof(struct agp_ati_softc),
-};
-
-DRIVER_MODULE(agp_ati, hostb, agp_ati_driver, 0, 0);
-MODULE_DEPEND(agp_ati, agp, 1, 1, 1);
-MODULE_DEPEND(agp_ati, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_i810.h b/sys/dev/agp/agp_i810.h
deleted file mode 100644
--- a/sys/dev/agp/agp_i810.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2011 The FreeBSD Foundation
- *
- * This software was developed by Konstantin Belousov under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef AGP_AGP_I810_H
-#define AGP_AGP_I810_H
-
-#include <sys/param.h>
-#include <sys/rman.h>
-#include <sys/sglist.h>
-
-#include <vm/vm.h>
-#include <vm/vm_page.h>
-
-/* Special gtt memory types */
-#define AGP_DCACHE_MEMORY 1
-#define AGP_PHYS_MEMORY 2
-
-/* New caching attributes for gen6/sandybridge */
-#define AGP_USER_CACHED_MEMORY_LLC_MLC (AGP_USER_TYPES + 2)
-#define AGP_USER_UNCACHED_MEMORY (AGP_USER_TYPES + 4)
-
-/* flag for GFDT type */
-#define AGP_USER_CACHED_MEMORY_GFDT (1 << 3)
-
-struct intel_gtt {
- /* Size of memory reserved for graphics by the BIOS */
- unsigned int stolen_size;
- /* Total number of gtt entries. */
- unsigned int gtt_total_entries;
- /* Part of the gtt that is mappable by the cpu, for those chips where
- * this is not the full gtt. */
- unsigned int gtt_mappable_entries;
- /* Whether i915 needs to use the dmar apis or not. */
- unsigned int needs_dmar : 1;
- /* Whether we idle the gpu before mapping/unmapping */
- unsigned int do_idle_maps : 1;
- /* Share the scratch page dma with ppgtts. */
- vm_paddr_t scratch_page_dma;
- vm_page_t scratch_page;
- /* for ppgtt PDE access */
- uint32_t *gtt;
- /* needed for ioremap in drm/i915 */
- bus_addr_t gma_bus_addr;
-};
-
-struct intel_gtt agp_intel_gtt_get(device_t dev);
-int agp_intel_gtt_chipset_flush(device_t dev);
-void agp_intel_gtt_unmap_memory(device_t dev, struct sglist *sg_list);
-void agp_intel_gtt_clear_range(device_t dev, u_int first_entry,
- u_int num_entries);
-int agp_intel_gtt_map_memory(device_t dev, vm_page_t *pages, u_int num_entries,
- struct sglist **sg_list);
-void agp_intel_gtt_insert_sg_entries(device_t dev, struct sglist *sg_list,
- u_int pg_start, u_int flags);
-void agp_intel_gtt_insert_pages(device_t dev, u_int first_entry,
- u_int num_entries, vm_page_t *pages, u_int flags);
-
-struct intel_gtt *intel_gtt_get(void);
-int intel_gtt_chipset_flush(void);
-void intel_gtt_unmap_memory(struct sglist *sg_list);
-void intel_gtt_clear_range(u_int first_entry, u_int num_entries);
-void intel_gtt_install_pte(u_int index, vm_paddr_t addr, u_int flags);
-int intel_gtt_map_memory(vm_page_t *pages, u_int num_entries,
- struct sglist **sg_list);
-void intel_gtt_insert_sg_entries(struct sglist *sg_list, u_int pg_start,
- u_int flags);
-void intel_gtt_insert_pages(u_int first_entry, u_int num_entries,
- vm_page_t *pages, u_int flags);
-vm_paddr_t intel_gtt_read_pte_paddr(u_int entry);
-u_int32_t intel_gtt_read_pte(u_int entry);
-device_t intel_gtt_get_bridge_device(void);
-void intel_gtt_write(u_int entry, uint32_t val);
-
-#endif
diff --git a/sys/dev/agp/agp_i810.c b/sys/dev/agp/agp_i810.c
deleted file mode 100644
--- a/sys/dev/agp/agp_i810.c
+++ /dev/null
@@ -1,2372 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * Copyright (c) 2000 Ruslan Ermilov
- * Copyright (c) 2011 The FreeBSD Foundation
- * All rights reserved.
- *
- * Portions of this software were developed by Konstantin Belousov
- * under sponsorship from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Fixes for 830/845G support: David Dawes <dawes@xfree86.org>
- * 852GM/855GM/865G support added by David Dawes <dawes@xfree86.org>
- *
- * This is generic Intel GTT handling code, morphed from the AGP
- * bridge code.
- */
-
-#include <sys/cdefs.h>
-#if 0
-#define KTR_AGP_I810 KTR_DEV
-#else
-#define KTR_AGP_I810 0
-#endif
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/ktr.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/agp/agp_i810.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pci_private.h>
-
-#include <vm/vm.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_param.h>
-#include <vm/vm_object.h>
-#include <vm/vm_page.h>
-#include <vm/vm_pageout.h>
-#include <vm/pmap.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <machine/md_var.h>
-#include <sys/rman.h>
-
-MALLOC_DECLARE(M_AGP);
-
-struct agp_i810_match;
-
-static int agp_i810_check_active(device_t bridge_dev);
-static int agp_i830_check_active(device_t bridge_dev);
-static int agp_i915_check_active(device_t bridge_dev);
-
-static void agp_82852_set_desc(device_t dev,
- const struct agp_i810_match *match);
-static void agp_i810_set_desc(device_t dev, const struct agp_i810_match *match);
-
-static void agp_i810_dump_regs(device_t dev);
-static void agp_i830_dump_regs(device_t dev);
-static void agp_i855_dump_regs(device_t dev);
-static void agp_i915_dump_regs(device_t dev);
-static void agp_i965_dump_regs(device_t dev);
-
-static int agp_i810_get_stolen_size(device_t dev);
-static int agp_i830_get_stolen_size(device_t dev);
-static int agp_i915_get_stolen_size(device_t dev);
-
-static int agp_i810_get_gtt_mappable_entries(device_t dev);
-static int agp_i830_get_gtt_mappable_entries(device_t dev);
-static int agp_i915_get_gtt_mappable_entries(device_t dev);
-
-static int agp_i810_get_gtt_total_entries(device_t dev);
-static int agp_i965_get_gtt_total_entries(device_t dev);
-static int agp_gen5_get_gtt_total_entries(device_t dev);
-
-static int agp_i810_install_gatt(device_t dev);
-static int agp_i830_install_gatt(device_t dev);
-static int agp_i965_install_gatt(device_t dev);
-static int agp_g4x_install_gatt(device_t dev);
-
-static void agp_i810_deinstall_gatt(device_t dev);
-static void agp_i830_deinstall_gatt(device_t dev);
-
-static void agp_i810_install_gtt_pte(device_t dev, u_int index,
- vm_offset_t physical, int flags);
-static void agp_i830_install_gtt_pte(device_t dev, u_int index,
- vm_offset_t physical, int flags);
-static void agp_i915_install_gtt_pte(device_t dev, u_int index,
- vm_offset_t physical, int flags);
-static void agp_i965_install_gtt_pte(device_t dev, u_int index,
- vm_offset_t physical, int flags);
-static void agp_g4x_install_gtt_pte(device_t dev, u_int index,
- vm_offset_t physical, int flags);
-
-static void agp_i810_write_gtt(device_t dev, u_int index, uint32_t pte);
-static void agp_i915_write_gtt(device_t dev, u_int index, uint32_t pte);
-static void agp_i965_write_gtt(device_t dev, u_int index, uint32_t pte);
-static void agp_g4x_write_gtt(device_t dev, u_int index, uint32_t pte);
-
-static u_int32_t agp_i810_read_gtt_pte(device_t dev, u_int index);
-static u_int32_t agp_i915_read_gtt_pte(device_t dev, u_int index);
-static u_int32_t agp_i965_read_gtt_pte(device_t dev, u_int index);
-static u_int32_t agp_g4x_read_gtt_pte(device_t dev, u_int index);
-
-static vm_paddr_t agp_i810_read_gtt_pte_paddr(device_t dev, u_int index);
-static vm_paddr_t agp_i915_read_gtt_pte_paddr(device_t dev, u_int index);
-
-static int agp_i810_set_aperture(device_t dev, u_int32_t aperture);
-static int agp_i830_set_aperture(device_t dev, u_int32_t aperture);
-static int agp_i915_set_aperture(device_t dev, u_int32_t aperture);
-
-static int agp_i810_chipset_flush_setup(device_t dev);
-static int agp_i915_chipset_flush_setup(device_t dev);
-static int agp_i965_chipset_flush_setup(device_t dev);
-
-static void agp_i810_chipset_flush_teardown(device_t dev);
-static void agp_i915_chipset_flush_teardown(device_t dev);
-static void agp_i965_chipset_flush_teardown(device_t dev);
-
-static void agp_i810_chipset_flush(device_t dev);
-static void agp_i830_chipset_flush(device_t dev);
-static void agp_i915_chipset_flush(device_t dev);
-
-enum {
- CHIP_I810, /* i810/i815 */
- CHIP_I830, /* 830M/845G */
- CHIP_I855, /* 852GM/855GM/865G */
- CHIP_I915, /* 915G/915GM */
- CHIP_I965, /* G965 */
- CHIP_G33, /* G33/Q33/Q35 */
- CHIP_IGD, /* Pineview */
- CHIP_G4X, /* G45/Q45 */
-};
-
-/* The i810 through i855 have the registers at BAR 1, and the GATT gets
- * allocated by us. The i915 has registers in BAR 0 and the GATT is at the
- * start of the stolen memory, and should only be accessed by the OS through
- * BAR 3. The G965 has registers and GATT in the same BAR (0) -- first 512KB
- * is registers, second 512KB is GATT.
- */
-static struct resource_spec agp_i810_res_spec[] = {
- { SYS_RES_MEMORY, AGP_I810_MMADR, RF_ACTIVE | RF_SHAREABLE },
- { -1, 0 }
-};
-
-static struct resource_spec agp_i915_res_spec[] = {
- { SYS_RES_MEMORY, AGP_I915_MMADR, RF_ACTIVE | RF_SHAREABLE },
- { SYS_RES_MEMORY, AGP_I915_GTTADR, RF_ACTIVE | RF_SHAREABLE },
- { -1, 0 }
-};
-
-static struct resource_spec agp_i965_res_spec[] = {
- { SYS_RES_MEMORY, AGP_I965_GTTMMADR, RF_ACTIVE | RF_SHAREABLE },
- { SYS_RES_MEMORY, AGP_I965_APBASE, RF_ACTIVE | RF_SHAREABLE },
- { -1, 0 }
-};
-
-struct agp_i810_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
- u_int32_t dcache_size; /* i810 only */
- u_int32_t stolen; /* number of i830/845 gtt
- entries for stolen memory */
- u_int stolen_size; /* BIOS-reserved graphics memory */
- u_int gtt_total_entries; /* Total number of gtt ptes */
- u_int gtt_mappable_entries; /* Number of gtt ptes mappable by CPU */
- device_t bdev; /* bridge device */
- void *argb_cursor; /* contigmalloc area for ARGB cursor */
- struct resource *sc_res[2];
- const struct agp_i810_match *match;
- int sc_flush_page_rid;
- struct resource *sc_flush_page_res;
- void *sc_flush_page_vaddr;
- int sc_bios_allocated_flush_page;
-};
-
-static device_t intel_agp;
-
-struct agp_i810_driver {
- int chiptype;
- int gen;
- int busdma_addr_mask_sz;
- struct resource_spec *res_spec;
- int (*check_active)(device_t);
- void (*set_desc)(device_t, const struct agp_i810_match *);
- void (*dump_regs)(device_t);
- int (*get_stolen_size)(device_t);
- int (*get_gtt_total_entries)(device_t);
- int (*get_gtt_mappable_entries)(device_t);
- int (*install_gatt)(device_t);
- void (*deinstall_gatt)(device_t);
- void (*write_gtt)(device_t, u_int, uint32_t);
- void (*install_gtt_pte)(device_t, u_int, vm_offset_t, int);
- u_int32_t (*read_gtt_pte)(device_t, u_int);
- vm_paddr_t (*read_gtt_pte_paddr)(device_t , u_int);
- int (*set_aperture)(device_t, u_int32_t);
- int (*chipset_flush_setup)(device_t);
- void (*chipset_flush_teardown)(device_t);
- void (*chipset_flush)(device_t);
-};
-
-static struct {
- struct intel_gtt base;
-} intel_private;
-
-static const struct agp_i810_driver agp_i810_i810_driver = {
- .chiptype = CHIP_I810,
- .gen = 1,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i810_res_spec,
- .check_active = agp_i810_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i810_dump_regs,
- .get_stolen_size = agp_i810_get_stolen_size,
- .get_gtt_mappable_entries = agp_i810_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i810_install_gatt,
- .deinstall_gatt = agp_i810_deinstall_gatt,
- .write_gtt = agp_i810_write_gtt,
- .install_gtt_pte = agp_i810_install_gtt_pte,
- .read_gtt_pte = agp_i810_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr,
- .set_aperture = agp_i810_set_aperture,
- .chipset_flush_setup = agp_i810_chipset_flush_setup,
- .chipset_flush_teardown = agp_i810_chipset_flush_teardown,
- .chipset_flush = agp_i810_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_i815_driver = {
- .chiptype = CHIP_I810,
- .gen = 2,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i810_res_spec,
- .check_active = agp_i810_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i810_dump_regs,
- .get_stolen_size = agp_i810_get_stolen_size,
- .get_gtt_mappable_entries = agp_i830_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i810_install_gatt,
- .deinstall_gatt = agp_i810_deinstall_gatt,
- .write_gtt = agp_i810_write_gtt,
- .install_gtt_pte = agp_i810_install_gtt_pte,
- .read_gtt_pte = agp_i810_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr,
- .set_aperture = agp_i810_set_aperture,
- .chipset_flush_setup = agp_i810_chipset_flush_setup,
- .chipset_flush_teardown = agp_i810_chipset_flush_teardown,
- .chipset_flush = agp_i830_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_i830_driver = {
- .chiptype = CHIP_I830,
- .gen = 2,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i810_res_spec,
- .check_active = agp_i830_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i830_dump_regs,
- .get_stolen_size = agp_i830_get_stolen_size,
- .get_gtt_mappable_entries = agp_i830_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i810_write_gtt,
- .install_gtt_pte = agp_i830_install_gtt_pte,
- .read_gtt_pte = agp_i810_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr,
- .set_aperture = agp_i830_set_aperture,
- .chipset_flush_setup = agp_i810_chipset_flush_setup,
- .chipset_flush_teardown = agp_i810_chipset_flush_teardown,
- .chipset_flush = agp_i830_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_i855_driver = {
- .chiptype = CHIP_I855,
- .gen = 2,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i810_res_spec,
- .check_active = agp_i830_check_active,
- .set_desc = agp_82852_set_desc,
- .dump_regs = agp_i855_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i810_write_gtt,
- .install_gtt_pte = agp_i830_install_gtt_pte,
- .read_gtt_pte = agp_i810_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr,
- .set_aperture = agp_i830_set_aperture,
- .chipset_flush_setup = agp_i810_chipset_flush_setup,
- .chipset_flush_teardown = agp_i810_chipset_flush_teardown,
- .chipset_flush = agp_i830_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_i865_driver = {
- .chiptype = CHIP_I855,
- .gen = 2,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i810_res_spec,
- .check_active = agp_i830_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i855_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i810_write_gtt,
- .install_gtt_pte = agp_i830_install_gtt_pte,
- .read_gtt_pte = agp_i810_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i810_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i810_chipset_flush_setup,
- .chipset_flush_teardown = agp_i810_chipset_flush_teardown,
- .chipset_flush = agp_i830_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_i915_driver = {
- .chiptype = CHIP_I915,
- .gen = 3,
- .busdma_addr_mask_sz = 32,
- .res_spec = agp_i915_res_spec,
- .check_active = agp_i915_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i915_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i810_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i915_write_gtt,
- .install_gtt_pte = agp_i915_install_gtt_pte,
- .read_gtt_pte = agp_i915_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i915_chipset_flush_setup,
- .chipset_flush_teardown = agp_i915_chipset_flush_teardown,
- .chipset_flush = agp_i915_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_g33_driver = {
- .chiptype = CHIP_G33,
- .gen = 3,
- .busdma_addr_mask_sz = 36,
- .res_spec = agp_i915_res_spec,
- .check_active = agp_i915_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i965_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i965_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i915_write_gtt,
- .install_gtt_pte = agp_i915_install_gtt_pte,
- .read_gtt_pte = agp_i915_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i965_chipset_flush_setup,
- .chipset_flush_teardown = agp_i965_chipset_flush_teardown,
- .chipset_flush = agp_i915_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_igd_driver = {
- .chiptype = CHIP_IGD,
- .gen = 3,
- .busdma_addr_mask_sz = 36,
- .res_spec = agp_i915_res_spec,
- .check_active = agp_i915_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i915_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i965_get_gtt_total_entries,
- .install_gatt = agp_i830_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i915_write_gtt,
- .install_gtt_pte = agp_i915_install_gtt_pte,
- .read_gtt_pte = agp_i915_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i965_chipset_flush_setup,
- .chipset_flush_teardown = agp_i965_chipset_flush_teardown,
- .chipset_flush = agp_i915_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_g965_driver = {
- .chiptype = CHIP_I965,
- .gen = 4,
- .busdma_addr_mask_sz = 36,
- .res_spec = agp_i965_res_spec,
- .check_active = agp_i915_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i965_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_i965_get_gtt_total_entries,
- .install_gatt = agp_i965_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_i965_write_gtt,
- .install_gtt_pte = agp_i965_install_gtt_pte,
- .read_gtt_pte = agp_i965_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i965_chipset_flush_setup,
- .chipset_flush_teardown = agp_i965_chipset_flush_teardown,
- .chipset_flush = agp_i915_chipset_flush,
-};
-
-static const struct agp_i810_driver agp_i810_g4x_driver = {
- .chiptype = CHIP_G4X,
- .gen = 5,
- .busdma_addr_mask_sz = 36,
- .res_spec = agp_i965_res_spec,
- .check_active = agp_i915_check_active,
- .set_desc = agp_i810_set_desc,
- .dump_regs = agp_i965_dump_regs,
- .get_stolen_size = agp_i915_get_stolen_size,
- .get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
- .get_gtt_total_entries = agp_gen5_get_gtt_total_entries,
- .install_gatt = agp_g4x_install_gatt,
- .deinstall_gatt = agp_i830_deinstall_gatt,
- .write_gtt = agp_g4x_write_gtt,
- .install_gtt_pte = agp_g4x_install_gtt_pte,
- .read_gtt_pte = agp_g4x_read_gtt_pte,
- .read_gtt_pte_paddr = agp_i915_read_gtt_pte_paddr,
- .set_aperture = agp_i915_set_aperture,
- .chipset_flush_setup = agp_i965_chipset_flush_setup,
- .chipset_flush_teardown = agp_i965_chipset_flush_teardown,
- .chipset_flush = agp_i915_chipset_flush,
-};
-
-/* For adding new devices, devid is the id of the graphics controller
- * (pci:0:2:0, for example). The placeholder (usually at pci:0:2:1) for the
- * second head should never be added. The bridge_offset is the offset to
- * subtract from devid to get the id of the hostb that the device is on.
- */
-static const struct agp_i810_match {
- int devid;
- char *name;
- const struct agp_i810_driver *driver;
-} agp_i810_matches[] = {
- {
- .devid = 0x71218086,
- .name = "Intel 82810 (i810 GMCH) SVGA controller",
- .driver = &agp_i810_i810_driver
- },
- {
- .devid = 0x71238086,
- .name = "Intel 82810-DC100 (i810-DC100 GMCH) SVGA controller",
- .driver = &agp_i810_i810_driver
- },
- {
- .devid = 0x71258086,
- .name = "Intel 82810E (i810E GMCH) SVGA controller",
- .driver = &agp_i810_i810_driver
- },
- {
- .devid = 0x11328086,
- .name = "Intel 82815 (i815 GMCH) SVGA controller",
- .driver = &agp_i810_i815_driver
- },
- {
- .devid = 0x35778086,
- .name = "Intel 82830M (830M GMCH) SVGA controller",
- .driver = &agp_i810_i830_driver
- },
- {
- .devid = 0x25628086,
- .name = "Intel 82845M (845M GMCH) SVGA controller",
- .driver = &agp_i810_i830_driver
- },
- {
- .devid = 0x35828086,
- .name = "Intel 82852/855GM SVGA controller",
- .driver = &agp_i810_i855_driver
- },
- {
- .devid = 0x25728086,
- .name = "Intel 82865G (865G GMCH) SVGA controller",
- .driver = &agp_i810_i865_driver
- },
- {
- .devid = 0x25828086,
- .name = "Intel 82915G (915G GMCH) SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x258A8086,
- .name = "Intel E7221 SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x25928086,
- .name = "Intel 82915GM (915GM GMCH) SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x27728086,
- .name = "Intel 82945G (945G GMCH) SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x27A28086,
- .name = "Intel 82945GM (945GM GMCH) SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x27AE8086,
- .name = "Intel 945GME SVGA controller",
- .driver = &agp_i810_i915_driver
- },
- {
- .devid = 0x29728086,
- .name = "Intel 946GZ SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x29828086,
- .name = "Intel G965 SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x29928086,
- .name = "Intel Q965 SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x29A28086,
- .name = "Intel G965 SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x29B28086,
- .name = "Intel Q35 SVGA controller",
- .driver = &agp_i810_g33_driver
- },
- {
- .devid = 0x29C28086,
- .name = "Intel G33 SVGA controller",
- .driver = &agp_i810_g33_driver
- },
- {
- .devid = 0x29D28086,
- .name = "Intel Q33 SVGA controller",
- .driver = &agp_i810_g33_driver
- },
- {
- .devid = 0xA0018086,
- .name = "Intel Pineview SVGA controller",
- .driver = &agp_i810_igd_driver
- },
- {
- .devid = 0xA0118086,
- .name = "Intel Pineview (M) SVGA controller",
- .driver = &agp_i810_igd_driver
- },
- {
- .devid = 0x2A028086,
- .name = "Intel GM965 SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x2A128086,
- .name = "Intel GME965 SVGA controller",
- .driver = &agp_i810_g965_driver
- },
- {
- .devid = 0x2A428086,
- .name = "Intel GM45 SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x2E028086,
- .name = "Intel Eaglelake SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x2E128086,
- .name = "Intel Q45 SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x2E228086,
- .name = "Intel G45 SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x2E328086,
- .name = "Intel G41 SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x00428086,
- .name = "Intel Ironlake (D) SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0x00468086,
- .name = "Intel Ironlake (M) SVGA controller",
- .driver = &agp_i810_g4x_driver
- },
- {
- .devid = 0,
- }
-};
-
-static const struct agp_i810_match*
-agp_i810_match(device_t dev)
-{
- int i, devid;
-
- if (pci_get_class(dev) != PCIC_DISPLAY
- || (pci_get_subclass(dev) != PCIS_DISPLAY_VGA &&
- pci_get_subclass(dev) != PCIS_DISPLAY_OTHER))
- return (NULL);
-
- devid = pci_get_devid(dev);
- for (i = 0; agp_i810_matches[i].devid != 0; i++) {
- if (agp_i810_matches[i].devid == devid)
- break;
- }
- if (agp_i810_matches[i].devid == 0)
- return (NULL);
- else
- return (&agp_i810_matches[i]);
-}
-
-/*
- * Find bridge device.
- */
-static device_t
-agp_i810_find_bridge(device_t dev)
-{
-
- return (pci_find_dbsf(0, 0, 0, 0));
-}
-
-static void
-agp_i810_identify(driver_t *driver, device_t parent)
-{
-
- if (device_find_child(parent, "agp", -1) == NULL &&
- agp_i810_match(parent))
- device_add_child(parent, "agp", DEVICE_UNIT_ANY);
-}
-
-static int
-agp_i810_check_active(device_t bridge_dev)
-{
- u_int8_t smram;
-
- smram = pci_read_config(bridge_dev, AGP_I810_SMRAM, 1);
- if ((smram & AGP_I810_SMRAM_GMS) == AGP_I810_SMRAM_GMS_DISABLED)
- return (ENXIO);
- return (0);
-}
-
-static int
-agp_i830_check_active(device_t bridge_dev)
-{
- int gcc1;
-
- gcc1 = pci_read_config(bridge_dev, AGP_I830_GCC1, 1);
- if ((gcc1 & AGP_I830_GCC1_DEV2) == AGP_I830_GCC1_DEV2_DISABLED)
- return (ENXIO);
- return (0);
-}
-
-static int
-agp_i915_check_active(device_t bridge_dev)
-{
- int deven;
-
- deven = pci_read_config(bridge_dev, AGP_I915_DEVEN, 4);
- if ((deven & AGP_I915_DEVEN_D2F0) == AGP_I915_DEVEN_D2F0_DISABLED)
- return (ENXIO);
- return (0);
-}
-
-static void
-agp_82852_set_desc(device_t dev, const struct agp_i810_match *match)
-{
-
- switch (pci_read_config(dev, AGP_I85X_CAPID, 1)) {
- case AGP_I855_GME:
- device_set_desc(dev,
- "Intel 82855GME (855GME GMCH) SVGA controller");
- break;
- case AGP_I855_GM:
- device_set_desc(dev,
- "Intel 82855GM (855GM GMCH) SVGA controller");
- break;
- case AGP_I852_GME:
- device_set_desc(dev,
- "Intel 82852GME (852GME GMCH) SVGA controller");
- break;
- case AGP_I852_GM:
- device_set_desc(dev,
- "Intel 82852GM (852GM GMCH) SVGA controller");
- break;
- default:
- device_set_desc(dev,
- "Intel 8285xM (85xGM GMCH) SVGA controller");
- break;
- }
-}
-
-static void
-agp_i810_set_desc(device_t dev, const struct agp_i810_match *match)
-{
-
- device_set_desc(dev, match->name);
-}
-
-static int
-agp_i810_probe(device_t dev)
-{
- device_t bdev;
- const struct agp_i810_match *match;
- int err;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- match = agp_i810_match(dev);
- if (match == NULL)
- return (ENXIO);
-
- bdev = agp_i810_find_bridge(dev);
- if (bdev == NULL) {
- if (bootverbose)
- printf("I810: can't find bridge device\n");
- return (ENXIO);
- }
-
- /*
- * checking whether internal graphics device has been activated.
- */
- err = match->driver->check_active(bdev);
- if (err != 0) {
- if (bootverbose)
- printf("i810: disabled, not probing\n");
- return (err);
- }
-
- match->driver->set_desc(dev, match);
- return (BUS_PROBE_DEFAULT);
-}
-
-static void
-agp_i810_dump_regs(device_t dev)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
-
- device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n",
- bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL));
- device_printf(dev, "AGP_I810_MISCC: 0x%04x\n",
- pci_read_config(sc->bdev, AGP_I810_MISCC, 2));
-}
-
-static void
-agp_i830_dump_regs(device_t dev)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
-
- device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n",
- bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL));
- device_printf(dev, "AGP_I830_GCC1: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I830_GCC1, 1));
-}
-
-static void
-agp_i855_dump_regs(device_t dev)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
-
- device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n",
- bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL));
- device_printf(dev, "AGP_I855_GCC1: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I855_GCC1, 1));
-}
-
-static void
-agp_i915_dump_regs(device_t dev)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
-
- device_printf(dev, "AGP_I810_PGTBL_CTL: %08x\n",
- bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL));
- device_printf(dev, "AGP_I855_GCC1: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I855_GCC1, 1));
- device_printf(dev, "AGP_I915_MSAC: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I915_MSAC, 1));
-}
-
-static void
-agp_i965_dump_regs(device_t dev)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
-
- device_printf(dev, "AGP_I965_PGTBL_CTL2: %08x\n",
- bus_read_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2));
- device_printf(dev, "AGP_I855_GCC1: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I855_GCC1, 1));
- device_printf(dev, "AGP_I965_MSAC: 0x%02x\n",
- pci_read_config(sc->bdev, AGP_I965_MSAC, 1));
-}
-
-static int
-agp_i810_get_stolen_size(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- sc->stolen = 0;
- sc->stolen_size = 0;
- return (0);
-}
-
-static int
-agp_i830_get_stolen_size(device_t dev)
-{
- struct agp_i810_softc *sc;
- unsigned int gcc1;
-
- sc = device_get_softc(dev);
-
- gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 1);
- switch (gcc1 & AGP_I830_GCC1_GMS) {
- case AGP_I830_GCC1_GMS_STOLEN_512:
- sc->stolen = (512 - 132) * 1024 / 4096;
- sc->stolen_size = 512 * 1024;
- break;
- case AGP_I830_GCC1_GMS_STOLEN_1024:
- sc->stolen = (1024 - 132) * 1024 / 4096;
- sc->stolen_size = 1024 * 1024;
- break;
- case AGP_I830_GCC1_GMS_STOLEN_8192:
- sc->stolen = (8192 - 132) * 1024 / 4096;
- sc->stolen_size = 8192 * 1024;
- break;
- default:
- sc->stolen = 0;
- device_printf(dev,
- "unknown memory configuration, disabling (GCC1 %x)\n",
- gcc1);
- return (EINVAL);
- }
- return (0);
-}
-
-static int
-agp_i915_get_stolen_size(device_t dev)
-{
- struct agp_i810_softc *sc;
- unsigned int gcc1, stolen, gtt_size;
-
- sc = device_get_softc(dev);
-
- /*
- * Stolen memory is set up at the beginning of the aperture by
- * the BIOS, consisting of the GATT followed by 4kb for the
- * BIOS display.
- */
- switch (sc->match->driver->chiptype) {
- case CHIP_I855:
- gtt_size = 128;
- break;
- case CHIP_I915:
- gtt_size = 256;
- break;
- case CHIP_I965:
- switch (bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL) &
- AGP_I810_PGTBL_SIZE_MASK) {
- case AGP_I810_PGTBL_SIZE_128KB:
- gtt_size = 128;
- break;
- case AGP_I810_PGTBL_SIZE_256KB:
- gtt_size = 256;
- break;
- case AGP_I810_PGTBL_SIZE_512KB:
- gtt_size = 512;
- break;
- case AGP_I965_PGTBL_SIZE_1MB:
- gtt_size = 1024;
- break;
- case AGP_I965_PGTBL_SIZE_2MB:
- gtt_size = 2048;
- break;
- case AGP_I965_PGTBL_SIZE_1_5MB:
- gtt_size = 1024 + 512;
- break;
- default:
- device_printf(dev, "Bad PGTBL size\n");
- return (EINVAL);
- }
- break;
- case CHIP_G33:
- gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 2);
- switch (gcc1 & AGP_G33_MGGC_GGMS_MASK) {
- case AGP_G33_MGGC_GGMS_SIZE_1M:
- gtt_size = 1024;
- break;
- case AGP_G33_MGGC_GGMS_SIZE_2M:
- gtt_size = 2048;
- break;
- default:
- device_printf(dev, "Bad PGTBL size\n");
- return (EINVAL);
- }
- break;
- case CHIP_IGD:
- case CHIP_G4X:
- gtt_size = 0;
- break;
- default:
- device_printf(dev, "Bad chiptype\n");
- return (EINVAL);
- }
-
- /* GCC1 is called MGGC on i915+ */
- gcc1 = pci_read_config(sc->bdev, AGP_I855_GCC1, 1);
- switch (gcc1 & AGP_I855_GCC1_GMS) {
- case AGP_I855_GCC1_GMS_STOLEN_1M:
- stolen = 1024;
- break;
- case AGP_I855_GCC1_GMS_STOLEN_4M:
- stolen = 4 * 1024;
- break;
- case AGP_I855_GCC1_GMS_STOLEN_8M:
- stolen = 8 * 1024;
- break;
- case AGP_I855_GCC1_GMS_STOLEN_16M:
- stolen = 16 * 1024;
- break;
- case AGP_I855_GCC1_GMS_STOLEN_32M:
- stolen = 32 * 1024;
- break;
- case AGP_I915_GCC1_GMS_STOLEN_48M:
- stolen = sc->match->driver->gen > 2 ? 48 * 1024 : 0;
- break;
- case AGP_I915_GCC1_GMS_STOLEN_64M:
- stolen = sc->match->driver->gen > 2 ? 64 * 1024 : 0;
- break;
- case AGP_G33_GCC1_GMS_STOLEN_128M:
- stolen = sc->match->driver->gen > 2 ? 128 * 1024 : 0;
- break;
- case AGP_G33_GCC1_GMS_STOLEN_256M:
- stolen = sc->match->driver->gen > 2 ? 256 * 1024 : 0;
- break;
- case AGP_G4X_GCC1_GMS_STOLEN_96M:
- if (sc->match->driver->chiptype == CHIP_I965 ||
- sc->match->driver->chiptype == CHIP_G4X)
- stolen = 96 * 1024;
- else
- stolen = 0;
- break;
- case AGP_G4X_GCC1_GMS_STOLEN_160M:
- if (sc->match->driver->chiptype == CHIP_I965 ||
- sc->match->driver->chiptype == CHIP_G4X)
- stolen = 160 * 1024;
- else
- stolen = 0;
- break;
- case AGP_G4X_GCC1_GMS_STOLEN_224M:
- if (sc->match->driver->chiptype == CHIP_I965 ||
- sc->match->driver->chiptype == CHIP_G4X)
- stolen = 224 * 1024;
- else
- stolen = 0;
- break;
- case AGP_G4X_GCC1_GMS_STOLEN_352M:
- if (sc->match->driver->chiptype == CHIP_I965 ||
- sc->match->driver->chiptype == CHIP_G4X)
- stolen = 352 * 1024;
- else
- stolen = 0;
- break;
- default:
- device_printf(dev,
- "unknown memory configuration, disabling (GCC1 %x)\n",
- gcc1);
- return (EINVAL);
- }
-
- gtt_size += 4;
- sc->stolen_size = stolen * 1024;
- sc->stolen = (stolen - gtt_size) * 1024 / 4096;
-
- return (0);
-}
-
-static int
-agp_i810_get_gtt_mappable_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t ap;
- uint16_t miscc;
-
- sc = device_get_softc(dev);
- miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2);
- if ((miscc & AGP_I810_MISCC_WINSIZE) == AGP_I810_MISCC_WINSIZE_32)
- ap = 32;
- else
- ap = 64;
- sc->gtt_mappable_entries = (ap * 1024 * 1024) >> AGP_PAGE_SHIFT;
- return (0);
-}
-
-static int
-agp_i830_get_gtt_mappable_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t ap;
- uint16_t gmch_ctl;
-
- sc = device_get_softc(dev);
- gmch_ctl = pci_read_config(sc->bdev, AGP_I830_GCC1, 2);
- if ((gmch_ctl & AGP_I830_GCC1_GMASIZE) == AGP_I830_GCC1_GMASIZE_64)
- ap = 64;
- else
- ap = 128;
- sc->gtt_mappable_entries = (ap * 1024 * 1024) >> AGP_PAGE_SHIFT;
- return (0);
-}
-
-static int
-agp_i915_get_gtt_mappable_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t ap;
-
- sc = device_get_softc(dev);
- ap = AGP_GET_APERTURE(dev);
- sc->gtt_mappable_entries = ap >> AGP_PAGE_SHIFT;
- return (0);
-}
-
-static int
-agp_i810_get_gtt_total_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- sc->gtt_total_entries = sc->gtt_mappable_entries;
- return (0);
-}
-
-static int
-agp_i965_get_gtt_total_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t pgetbl_ctl;
- int error;
-
- sc = device_get_softc(dev);
- error = 0;
- pgetbl_ctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL);
- switch (pgetbl_ctl & AGP_I810_PGTBL_SIZE_MASK) {
- case AGP_I810_PGTBL_SIZE_128KB:
- sc->gtt_total_entries = 128 * 1024 / 4;
- break;
- case AGP_I810_PGTBL_SIZE_256KB:
- sc->gtt_total_entries = 256 * 1024 / 4;
- break;
- case AGP_I810_PGTBL_SIZE_512KB:
- sc->gtt_total_entries = 512 * 1024 / 4;
- break;
- /* GTT pagetable sizes bigger than 512KB are not possible on G33! */
- case AGP_I810_PGTBL_SIZE_1MB:
- sc->gtt_total_entries = 1024 * 1024 / 4;
- break;
- case AGP_I810_PGTBL_SIZE_2MB:
- sc->gtt_total_entries = 2 * 1024 * 1024 / 4;
- break;
- case AGP_I810_PGTBL_SIZE_1_5MB:
- sc->gtt_total_entries = (1024 + 512) * 1024 / 4;
- break;
- default:
- device_printf(dev, "Unknown page table size\n");
- error = ENXIO;
- }
- return (error);
-}
-
-static void
-agp_gen5_adjust_pgtbl_size(device_t dev, uint32_t sz)
-{
- struct agp_i810_softc *sc;
- uint32_t pgetbl_ctl, pgetbl_ctl2;
-
- sc = device_get_softc(dev);
-
- /* Disable per-process page table. */
- pgetbl_ctl2 = bus_read_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2);
- pgetbl_ctl2 &= ~AGP_I810_PGTBL_ENABLED;
- bus_write_4(sc->sc_res[0], AGP_I965_PGTBL_CTL2, pgetbl_ctl2);
-
- /* Write the new ggtt size. */
- pgetbl_ctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL);
- pgetbl_ctl &= ~AGP_I810_PGTBL_SIZE_MASK;
- pgetbl_ctl |= sz;
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgetbl_ctl);
-}
-
-static int
-agp_gen5_get_gtt_total_entries(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint16_t gcc1;
-
- sc = device_get_softc(dev);
-
- gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2);
- switch (gcc1 & AGP_G4x_GCC1_SIZE_MASK) {
- case AGP_G4x_GCC1_SIZE_1M:
- case AGP_G4x_GCC1_SIZE_VT_1M:
- agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_1MB);
- break;
- case AGP_G4x_GCC1_SIZE_VT_1_5M:
- agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_1_5MB);
- break;
- case AGP_G4x_GCC1_SIZE_2M:
- case AGP_G4x_GCC1_SIZE_VT_2M:
- agp_gen5_adjust_pgtbl_size(dev, AGP_I810_PGTBL_SIZE_2MB);
- break;
- default:
- device_printf(dev, "Unknown page table size\n");
- return (ENXIO);
- }
-
- return (agp_i965_get_gtt_total_entries(dev));
-}
-
-static int
-agp_i810_install_gatt(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
-
- /* Some i810s have on-chip memory called dcache. */
- if ((bus_read_1(sc->sc_res[0], AGP_I810_DRT) & AGP_I810_DRT_POPULATED)
- != 0)
- sc->dcache_size = 4 * 1024 * 1024;
- else
- sc->dcache_size = 0;
-
- /* According to the specs the gatt on the i810 must be 64k. */
- sc->gatt->ag_virtual = kmem_alloc_contig(64 * 1024, M_NOWAIT |
- M_ZERO, 0, ~0, PAGE_SIZE, 0, VM_MEMATTR_WRITE_COMBINING);
- if (sc->gatt->ag_virtual == NULL) {
- if (bootverbose)
- device_printf(dev, "contiguous allocation failed\n");
- return (ENOMEM);
- }
-
- sc->gatt->ag_physical = vtophys((vm_offset_t)sc->gatt->ag_virtual);
- /* Install the GATT. */
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL,
- sc->gatt->ag_physical | 1);
- return (0);
-}
-
-static void
-agp_i830_install_gatt_init(struct agp_i810_softc *sc)
-{
- uint32_t pgtblctl;
-
- /*
- * The i830 automatically initializes the 128k gatt on boot.
- * GATT address is already in there, make sure it's enabled.
- */
- pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL);
- pgtblctl |= 1;
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl);
-
- sc->gatt->ag_physical = pgtblctl & ~1;
-}
-
-static int
-agp_i830_install_gatt(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- agp_i830_install_gatt_init(sc);
- return (0);
-}
-
-static int
-agp_gen4_install_gatt(device_t dev, const vm_size_t gtt_offset)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- pmap_change_attr((vm_offset_t)rman_get_virtual(sc->sc_res[0]) +
- gtt_offset, rman_get_size(sc->sc_res[0]) - gtt_offset,
- VM_MEMATTR_WRITE_COMBINING);
- agp_i830_install_gatt_init(sc);
- return (0);
-}
-
-static int
-agp_i965_install_gatt(device_t dev)
-{
-
- return (agp_gen4_install_gatt(dev, 512 * 1024));
-}
-
-static int
-agp_g4x_install_gatt(device_t dev)
-{
-
- return (agp_gen4_install_gatt(dev, 2 * 1024 * 1024));
-}
-
-static int
-agp_i810_attach(device_t dev)
-{
- struct agp_i810_softc *sc;
- int error;
-
- sc = device_get_softc(dev);
- sc->bdev = agp_i810_find_bridge(dev);
- if (sc->bdev == NULL)
- return (ENOENT);
-
- sc->match = agp_i810_match(dev);
-
- agp_set_aperture_resource(dev, sc->match->driver->gen <= 2 ?
- AGP_APBASE : AGP_I915_GMADR);
- error = agp_generic_attach(dev);
- if (error)
- return (error);
-
- if (ptoa((vm_paddr_t)Maxmem) >
- (1ULL << sc->match->driver->busdma_addr_mask_sz) - 1) {
- device_printf(dev, "agp_i810 does not support physical "
- "memory above %ju.\n", (uintmax_t)(1ULL <<
- sc->match->driver->busdma_addr_mask_sz) - 1);
- return (ENOENT);
- }
-
- if (bus_alloc_resources(dev, sc->match->driver->res_spec, sc->sc_res)) {
- agp_generic_detach(dev);
- return (ENODEV);
- }
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
- sc->gatt = malloc(sizeof(struct agp_gatt), M_AGP, M_WAITOK);
- sc->gatt->ag_entries = AGP_GET_APERTURE(dev) >> AGP_PAGE_SHIFT;
-
- if ((error = sc->match->driver->get_stolen_size(dev)) != 0 ||
- (error = sc->match->driver->install_gatt(dev)) != 0 ||
- (error = sc->match->driver->get_gtt_mappable_entries(dev)) != 0 ||
- (error = sc->match->driver->get_gtt_total_entries(dev)) != 0 ||
- (error = sc->match->driver->chipset_flush_setup(dev)) != 0) {
- bus_release_resources(dev, sc->match->driver->res_spec,
- sc->sc_res);
- free(sc->gatt, M_AGP);
- agp_generic_detach(dev);
- return (error);
- }
-
- intel_agp = dev;
- device_printf(dev, "aperture size is %dM",
- sc->initial_aperture / 1024 / 1024);
- if (sc->stolen > 0)
- printf(", detected %dk stolen memory\n", sc->stolen * 4);
- else
- printf("\n");
- if (bootverbose) {
- sc->match->driver->dump_regs(dev);
- device_printf(dev, "Mappable GTT entries: %d\n",
- sc->gtt_mappable_entries);
- device_printf(dev, "Total GTT entries: %d\n",
- sc->gtt_total_entries);
- }
- return (0);
-}
-
-static void
-agp_i810_deinstall_gatt(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, 0);
- kmem_free(sc->gatt->ag_virtual, 64 * 1024);
-}
-
-static void
-agp_i830_deinstall_gatt(device_t dev)
-{
- struct agp_i810_softc *sc;
- unsigned int pgtblctl;
-
- sc = device_get_softc(dev);
- pgtblctl = bus_read_4(sc->sc_res[0], AGP_I810_PGTBL_CTL);
- pgtblctl &= ~1;
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl);
-}
-
-static int
-agp_i810_detach(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- agp_free_cdev(dev);
-
- /* Clear the GATT base. */
- sc->match->driver->deinstall_gatt(dev);
-
- sc->match->driver->chipset_flush_teardown(dev);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- free(sc->gatt, M_AGP);
- bus_release_resources(dev, sc->match->driver->res_spec, sc->sc_res);
- agp_free_res(dev);
-
- return (0);
-}
-
-static int
-agp_i810_resume(device_t dev)
-{
- struct agp_i810_softc *sc;
- sc = device_get_softc(dev);
-
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- /* Install the GATT. */
- bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL,
- sc->gatt->ag_physical | 1);
-
- return (bus_generic_resume(dev));
-}
-
-/**
- * Sets the PCI resource size of the aperture on i830-class and below chipsets,
- * while returning failure on later chipsets when an actual change is
- * requested.
- *
- * This whole function is likely bogus, as the kernel would probably need to
- * reconfigure the placement of the AGP aperture if a larger size is requested,
- * which doesn't happen currently.
- */
-static int
-agp_i810_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_i810_softc *sc;
- u_int16_t miscc;
-
- sc = device_get_softc(dev);
- /*
- * Double check for sanity.
- */
- if (aperture != 32 * 1024 * 1024 && aperture != 64 * 1024 * 1024) {
- device_printf(dev, "bad aperture size %d\n", aperture);
- return (EINVAL);
- }
-
- miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2);
- miscc &= ~AGP_I810_MISCC_WINSIZE;
- if (aperture == 32 * 1024 * 1024)
- miscc |= AGP_I810_MISCC_WINSIZE_32;
- else
- miscc |= AGP_I810_MISCC_WINSIZE_64;
-
- pci_write_config(sc->bdev, AGP_I810_MISCC, miscc, 2);
- return (0);
-}
-
-static int
-agp_i830_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_i810_softc *sc;
- u_int16_t gcc1;
-
- sc = device_get_softc(dev);
-
- if (aperture != 64 * 1024 * 1024 &&
- aperture != 128 * 1024 * 1024) {
- device_printf(dev, "bad aperture size %d\n", aperture);
- return (EINVAL);
- }
- gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2);
- gcc1 &= ~AGP_I830_GCC1_GMASIZE;
- if (aperture == 64 * 1024 * 1024)
- gcc1 |= AGP_I830_GCC1_GMASIZE_64;
- else
- gcc1 |= AGP_I830_GCC1_GMASIZE_128;
-
- pci_write_config(sc->bdev, AGP_I830_GCC1, gcc1, 2);
- return (0);
-}
-
-static int
-agp_i915_set_aperture(device_t dev, u_int32_t aperture)
-{
-
- return (agp_generic_set_aperture(dev, aperture));
-}
-
-static int
-agp_i810_method_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- return (sc->match->driver->set_aperture(dev, aperture));
-}
-
-/**
- * Writes a GTT entry mapping the page at the given offset from the
- * beginning of the aperture to the given physical address. Setup the
- * caching mode according to flags.
- *
- * For gen 1, 2 and 3, GTT start is located at AGP_I810_GTT offset
- * from corresponding BAR start. For gen 4, offset is 512KB +
- * AGP_I810_GTT, for gen 5 and 6 it is 2MB + AGP_I810_GTT.
- *
- * Also, the bits of the physical page address above 4GB needs to be
- * placed into bits 40-32 of PTE.
- */
-static void
-agp_i810_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical,
- int flags)
-{
- uint32_t pte;
-
- pte = (u_int32_t)physical | I810_PTE_VALID;
- if (flags == AGP_DCACHE_MEMORY)
- pte |= I810_PTE_LOCAL;
- else if (flags == AGP_USER_CACHED_MEMORY)
- pte |= I830_PTE_SYSTEM_CACHED;
- agp_i810_write_gtt(dev, index, pte);
-}
-
-static void
-agp_i810_write_gtt(device_t dev, u_int index, uint32_t pte)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- bus_write_4(sc->sc_res[0], AGP_I810_GTT + index * 4, pte);
- CTR2(KTR_AGP_I810, "810_pte %x %x", index, pte);
-}
-
-static void
-agp_i830_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical,
- int flags)
-{
- uint32_t pte;
-
- pte = (u_int32_t)physical | I810_PTE_VALID;
- if (flags == AGP_USER_CACHED_MEMORY)
- pte |= I830_PTE_SYSTEM_CACHED;
- agp_i810_write_gtt(dev, index, pte);
-}
-
-static void
-agp_i915_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical,
- int flags)
-{
- uint32_t pte;
-
- pte = (u_int32_t)physical | I810_PTE_VALID;
- if (flags == AGP_USER_CACHED_MEMORY)
- pte |= I830_PTE_SYSTEM_CACHED;
- pte |= (physical & 0x0000000f00000000ull) >> 28;
- agp_i915_write_gtt(dev, index, pte);
-}
-
-static void
-agp_i915_write_gtt(device_t dev, u_int index, uint32_t pte)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- bus_write_4(sc->sc_res[1], index * 4, pte);
- CTR2(KTR_AGP_I810, "915_pte %x %x", index, pte);
-}
-
-static void
-agp_i965_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical,
- int flags)
-{
- uint32_t pte;
-
- pte = (u_int32_t)physical | I810_PTE_VALID;
- if (flags == AGP_USER_CACHED_MEMORY)
- pte |= I830_PTE_SYSTEM_CACHED;
- pte |= (physical & 0x0000000f00000000ull) >> 28;
- agp_i965_write_gtt(dev, index, pte);
-}
-
-static void
-agp_i965_write_gtt(device_t dev, u_int index, uint32_t pte)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- bus_write_4(sc->sc_res[0], index * 4 + (512 * 1024), pte);
- CTR2(KTR_AGP_I810, "965_pte %x %x", index, pte);
-}
-
-static void
-agp_g4x_install_gtt_pte(device_t dev, u_int index, vm_offset_t physical,
- int flags)
-{
- uint32_t pte;
-
- pte = (u_int32_t)physical | I810_PTE_VALID;
- if (flags == AGP_USER_CACHED_MEMORY)
- pte |= I830_PTE_SYSTEM_CACHED;
- pte |= (physical & 0x0000000f00000000ull) >> 28;
- agp_g4x_write_gtt(dev, index, pte);
-}
-
-static void
-agp_g4x_write_gtt(device_t dev, u_int index, uint32_t pte)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- bus_write_4(sc->sc_res[0], index * 4 + (2 * 1024 * 1024), pte);
- CTR2(KTR_AGP_I810, "g4x_pte %x %x", index, pte);
-}
-
-static int
-agp_i810_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_i810_softc *sc = device_get_softc(dev);
- u_int index;
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT)) {
- device_printf(dev, "failed: offset is 0x%08jx, "
- "shift is %d, entries is %d\n", (intmax_t)offset,
- AGP_PAGE_SHIFT, sc->gatt->ag_entries);
- return (EINVAL);
- }
- index = offset >> AGP_PAGE_SHIFT;
- if (sc->stolen != 0 && index < sc->stolen) {
- device_printf(dev, "trying to bind into stolen memory\n");
- return (EINVAL);
- }
- sc->match->driver->install_gtt_pte(dev, index, physical, 0);
- return (0);
-}
-
-static int
-agp_i810_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_i810_softc *sc;
- u_int index;
-
- sc = device_get_softc(dev);
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
- index = offset >> AGP_PAGE_SHIFT;
- if (sc->stolen != 0 && index < sc->stolen) {
- device_printf(dev, "trying to unbind from stolen memory\n");
- return (EINVAL);
- }
- sc->match->driver->install_gtt_pte(dev, index, 0, 0);
- return (0);
-}
-
-static u_int32_t
-agp_i810_read_gtt_pte(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
-
- sc = device_get_softc(dev);
- pte = bus_read_4(sc->sc_res[0], AGP_I810_GTT + index * 4);
- return (pte);
-}
-
-static u_int32_t
-agp_i915_read_gtt_pte(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
-
- sc = device_get_softc(dev);
- pte = bus_read_4(sc->sc_res[1], index * 4);
- return (pte);
-}
-
-static u_int32_t
-agp_i965_read_gtt_pte(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
-
- sc = device_get_softc(dev);
- pte = bus_read_4(sc->sc_res[0], index * 4 + (512 * 1024));
- return (pte);
-}
-
-static u_int32_t
-agp_g4x_read_gtt_pte(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
-
- sc = device_get_softc(dev);
- pte = bus_read_4(sc->sc_res[0], index * 4 + (2 * 1024 * 1024));
- return (pte);
-}
-
-static vm_paddr_t
-agp_i810_read_gtt_pte_paddr(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
- vm_paddr_t res;
-
- sc = device_get_softc(dev);
- pte = sc->match->driver->read_gtt_pte(dev, index);
- res = pte & ~PAGE_MASK;
- return (res);
-}
-
-static vm_paddr_t
-agp_i915_read_gtt_pte_paddr(device_t dev, u_int index)
-{
- struct agp_i810_softc *sc;
- u_int32_t pte;
- vm_paddr_t res;
-
- sc = device_get_softc(dev);
- pte = sc->match->driver->read_gtt_pte(dev, index);
- res = (pte & ~PAGE_MASK) | ((pte & 0xf0) << 28);
- return (res);
-}
-
-/*
- * Writing via memory mapped registers already flushes all TLBs.
- */
-static void
-agp_i810_flush_tlb(device_t dev)
-{
-}
-
-static int
-agp_i810_enable(device_t dev, u_int32_t mode)
-{
-
- return (0);
-}
-
-static struct agp_memory *
-agp_i810_alloc_memory(device_t dev, int type, vm_size_t size)
-{
- struct agp_i810_softc *sc;
- struct agp_memory *mem;
- vm_page_t m;
-
- sc = device_get_softc(dev);
-
- if ((size & (AGP_PAGE_SIZE - 1)) != 0 ||
- sc->agp.as_allocated + size > sc->agp.as_maxmem)
- return (0);
-
- if (type == 1) {
- /*
- * Mapping local DRAM into GATT.
- */
- if (sc->match->driver->chiptype != CHIP_I810)
- return (0);
- if (size != sc->dcache_size)
- return (0);
- } else if (type == 2) {
- /*
- * Type 2 is the contiguous physical memory type, that hands
- * back a physical address. This is used for cursors on i810.
- * Hand back as many single pages with physical as the user
- * wants, but only allow one larger allocation (ARGB cursor)
- * for simplicity.
- */
- if (size != AGP_PAGE_SIZE) {
- if (sc->argb_cursor != NULL)
- return (0);
-
- /* Allocate memory for ARGB cursor, if we can. */
- sc->argb_cursor = contigmalloc(size, M_AGP,
- 0, 0, ~0, PAGE_SIZE, 0);
- if (sc->argb_cursor == NULL)
- return (0);
- }
- }
-
- mem = malloc(sizeof *mem, M_AGP, M_WAITOK);
- mem->am_id = sc->agp.as_nextid++;
- mem->am_size = size;
- mem->am_type = type;
- if (type != 1 && (type != 2 || size == AGP_PAGE_SIZE))
- mem->am_obj = vm_object_allocate(OBJT_SWAP,
- atop(round_page(size)));
- else
- mem->am_obj = 0;
-
- if (type == 2) {
- if (size == AGP_PAGE_SIZE) {
- /*
- * Allocate and wire down the page now so that we can
- * get its physical address.
- */
- VM_OBJECT_WLOCK(mem->am_obj);
- m = vm_page_grab(mem->am_obj, 0, VM_ALLOC_NOBUSY |
- VM_ALLOC_WIRED | VM_ALLOC_ZERO);
- VM_OBJECT_WUNLOCK(mem->am_obj);
- mem->am_physical = VM_PAGE_TO_PHYS(m);
- } else {
- /* Our allocation is already nicely wired down for us.
- * Just grab the physical address.
- */
- mem->am_physical = vtophys(sc->argb_cursor);
- }
- } else
- mem->am_physical = 0;
-
- mem->am_offset = 0;
- mem->am_is_bound = 0;
- TAILQ_INSERT_TAIL(&sc->agp.as_memory, mem, am_link);
- sc->agp.as_allocated += size;
-
- return (mem);
-}
-
-static int
-agp_i810_free_memory(device_t dev, struct agp_memory *mem)
-{
- struct agp_i810_softc *sc;
- vm_page_t m;
-
- if (mem->am_is_bound)
- return (EBUSY);
-
- sc = device_get_softc(dev);
-
- if (mem->am_type == 2) {
- if (mem->am_size == AGP_PAGE_SIZE) {
- /*
- * Unwire the page which we wired in alloc_memory.
- */
- VM_OBJECT_WLOCK(mem->am_obj);
- m = vm_page_lookup(mem->am_obj, 0);
- vm_page_unwire(m, PQ_INACTIVE);
- VM_OBJECT_WUNLOCK(mem->am_obj);
- } else {
- free(sc->argb_cursor, M_AGP);
- sc->argb_cursor = NULL;
- }
- }
-
- sc->agp.as_allocated -= mem->am_size;
- TAILQ_REMOVE(&sc->agp.as_memory, mem, am_link);
- if (mem->am_obj)
- vm_object_deallocate(mem->am_obj);
- free(mem, M_AGP);
- return (0);
-}
-
-static int
-agp_i810_bind_memory(device_t dev, struct agp_memory *mem, vm_offset_t offset)
-{
- struct agp_i810_softc *sc;
- vm_offset_t i;
-
- /* Do some sanity checks first. */
- if ((offset & (AGP_PAGE_SIZE - 1)) != 0 ||
- offset + mem->am_size > AGP_GET_APERTURE(dev)) {
- device_printf(dev, "binding memory at bad offset %#x\n",
- (int)offset);
- return (EINVAL);
- }
-
- sc = device_get_softc(dev);
- if (mem->am_type == 2 && mem->am_size != AGP_PAGE_SIZE) {
- mtx_lock(&sc->agp.as_lock);
- if (mem->am_is_bound) {
- mtx_unlock(&sc->agp.as_lock);
- return (EINVAL);
- }
- /* The memory's already wired down, just stick it in the GTT. */
- for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) {
- sc->match->driver->install_gtt_pte(dev, (offset + i) >>
- AGP_PAGE_SHIFT, mem->am_physical + i, 0);
- }
- mem->am_offset = offset;
- mem->am_is_bound = 1;
- mtx_unlock(&sc->agp.as_lock);
- return (0);
- }
-
- if (mem->am_type != 1)
- return (agp_generic_bind_memory(dev, mem, offset));
-
- /*
- * Mapping local DRAM into GATT.
- */
- if (sc->match->driver->chiptype != CHIP_I810)
- return (EINVAL);
- for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE)
- bus_write_4(sc->sc_res[0],
- AGP_I810_GTT + (i >> AGP_PAGE_SHIFT) * 4, i | 3);
-
- return (0);
-}
-
-static int
-agp_i810_unbind_memory(device_t dev, struct agp_memory *mem)
-{
- struct agp_i810_softc *sc;
- vm_offset_t i;
-
- sc = device_get_softc(dev);
-
- if (mem->am_type == 2 && mem->am_size != AGP_PAGE_SIZE) {
- mtx_lock(&sc->agp.as_lock);
- if (!mem->am_is_bound) {
- mtx_unlock(&sc->agp.as_lock);
- return (EINVAL);
- }
-
- for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) {
- sc->match->driver->install_gtt_pte(dev,
- (mem->am_offset + i) >> AGP_PAGE_SHIFT, 0, 0);
- }
- mem->am_is_bound = 0;
- mtx_unlock(&sc->agp.as_lock);
- return (0);
- }
-
- if (mem->am_type != 1)
- return (agp_generic_unbind_memory(dev, mem));
-
- if (sc->match->driver->chiptype != CHIP_I810)
- return (EINVAL);
- for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) {
- sc->match->driver->install_gtt_pte(dev, i >> AGP_PAGE_SHIFT,
- 0, 0);
- }
- return (0);
-}
-
-static device_method_t agp_i810_methods[] = {
- /* Device interface */
- DEVMETHOD(device_identify, agp_i810_identify),
- DEVMETHOD(device_probe, agp_i810_probe),
- DEVMETHOD(device_attach, agp_i810_attach),
- DEVMETHOD(device_detach, agp_i810_detach),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, agp_i810_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_generic_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_i810_method_set_aperture),
- DEVMETHOD(agp_bind_page, agp_i810_bind_page),
- DEVMETHOD(agp_unbind_page, agp_i810_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_i810_flush_tlb),
- DEVMETHOD(agp_enable, agp_i810_enable),
- DEVMETHOD(agp_alloc_memory, agp_i810_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_i810_free_memory),
- DEVMETHOD(agp_bind_memory, agp_i810_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_i810_unbind_memory),
- DEVMETHOD(agp_chipset_flush, agp_intel_gtt_chipset_flush),
- { 0, 0 }
-};
-
-static driver_t agp_i810_driver = {
- "agp",
- agp_i810_methods,
- sizeof(struct agp_i810_softc),
-};
-
-DRIVER_MODULE(agp_i810, vgapci, agp_i810_driver, 0, 0);
-MODULE_DEPEND(agp_i810, agp, 1, 1, 1);
-MODULE_DEPEND(agp_i810, pci, 1, 1, 1);
-
-void
-agp_intel_gtt_clear_range(device_t dev, u_int first_entry, u_int num_entries)
-{
- struct agp_i810_softc *sc;
- u_int i;
-
- sc = device_get_softc(dev);
- for (i = 0; i < num_entries; i++)
- sc->match->driver->install_gtt_pte(dev, first_entry + i,
- VM_PAGE_TO_PHYS(bogus_page), 0);
- sc->match->driver->read_gtt_pte(dev, first_entry + num_entries - 1);
-}
-
-void
-agp_intel_gtt_insert_pages(device_t dev, u_int first_entry, u_int num_entries,
- vm_page_t *pages, u_int flags)
-{
- struct agp_i810_softc *sc;
- u_int i;
-
- sc = device_get_softc(dev);
- for (i = 0; i < num_entries; i++) {
- MPASS(pages[i]->valid == VM_PAGE_BITS_ALL);
- MPASS(pages[i]->ref_count > 0);
- sc->match->driver->install_gtt_pte(dev, first_entry + i,
- VM_PAGE_TO_PHYS(pages[i]), flags);
- }
- sc->match->driver->read_gtt_pte(dev, first_entry + num_entries - 1);
-}
-
-struct intel_gtt
-agp_intel_gtt_get(device_t dev)
-{
- struct agp_i810_softc *sc;
- struct intel_gtt res;
-
- sc = device_get_softc(dev);
- res.stolen_size = sc->stolen_size;
- res.gtt_total_entries = sc->gtt_total_entries;
- res.gtt_mappable_entries = sc->gtt_mappable_entries;
- res.do_idle_maps = 0;
- res.scratch_page_dma = VM_PAGE_TO_PHYS(bogus_page);
- if (sc->agp.as_aperture != NULL)
- res.gma_bus_addr = rman_get_start(sc->agp.as_aperture);
- else
- res.gma_bus_addr = 0;
- return (res);
-}
-
-static int
-agp_i810_chipset_flush_setup(device_t dev)
-{
-
- return (0);
-}
-
-static void
-agp_i810_chipset_flush_teardown(device_t dev)
-{
-
- /* Nothing to do. */
-}
-
-static void
-agp_i810_chipset_flush(device_t dev)
-{
-
- /* Nothing to do. */
-}
-
-static void
-agp_i830_chipset_flush(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t hic;
- int i;
-
- sc = device_get_softc(dev);
- pmap_invalidate_cache();
- hic = bus_read_4(sc->sc_res[0], AGP_I830_HIC);
- bus_write_4(sc->sc_res[0], AGP_I830_HIC, hic | (1U << 31));
- for (i = 0; i < 20000 /* 1 sec */; i++) {
- hic = bus_read_4(sc->sc_res[0], AGP_I830_HIC);
- if ((hic & (1U << 31)) == 0)
- break;
- DELAY(50);
- }
-}
-
-static int
-agp_i915_chipset_flush_alloc_page(device_t dev, uint64_t start, uint64_t end)
-{
- struct agp_i810_softc *sc;
- device_t vga;
-
- sc = device_get_softc(dev);
- vga = device_get_parent(dev);
- sc->sc_flush_page_rid = 100;
- sc->sc_flush_page_res = BUS_ALLOC_RESOURCE(device_get_parent(vga), dev,
- SYS_RES_MEMORY, &sc->sc_flush_page_rid, start, end, PAGE_SIZE,
- RF_ACTIVE);
- if (sc->sc_flush_page_res == NULL) {
- device_printf(dev, "Failed to allocate flush page at 0x%jx\n",
- (uintmax_t)start);
- return (EINVAL);
- }
- sc->sc_flush_page_vaddr = rman_get_virtual(sc->sc_flush_page_res);
- if (bootverbose) {
- device_printf(dev, "Allocated flush page phys 0x%jx virt %p\n",
- (uintmax_t)rman_get_start(sc->sc_flush_page_res),
- sc->sc_flush_page_vaddr);
- }
- return (0);
-}
-
-static void
-agp_i915_chipset_flush_free_page(device_t dev)
-{
- struct agp_i810_softc *sc;
- device_t vga;
-
- sc = device_get_softc(dev);
- vga = device_get_parent(dev);
- if (sc->sc_flush_page_res == NULL)
- return;
- BUS_DEACTIVATE_RESOURCE(device_get_parent(vga), dev,
- sc->sc_flush_page_res);
- BUS_RELEASE_RESOURCE(device_get_parent(vga), dev,
- sc->sc_flush_page_res);
-}
-
-static int
-agp_i915_chipset_flush_setup(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t temp;
- int error;
-
- sc = device_get_softc(dev);
- temp = pci_read_config(sc->bdev, AGP_I915_IFPADDR, 4);
- if ((temp & 1) != 0) {
- temp &= ~1;
- if (bootverbose)
- device_printf(dev,
- "Found already configured flush page at 0x%jx\n",
- (uintmax_t)temp);
- sc->sc_bios_allocated_flush_page = 1;
- /*
- * In the case BIOS initialized the flush pointer (?)
- * register, expect that BIOS also set up the resource
- * for the page.
- */
- error = agp_i915_chipset_flush_alloc_page(dev, temp,
- temp + PAGE_SIZE - 1);
- if (error != 0)
- return (error);
- } else {
- sc->sc_bios_allocated_flush_page = 0;
- error = agp_i915_chipset_flush_alloc_page(dev, 0, 0xffffffff);
- if (error != 0)
- return (error);
- temp = rman_get_start(sc->sc_flush_page_res);
- pci_write_config(sc->bdev, AGP_I915_IFPADDR, temp | 1, 4);
- }
- return (0);
-}
-
-static void
-agp_i915_chipset_flush_teardown(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t temp;
-
- sc = device_get_softc(dev);
- if (sc->sc_flush_page_res == NULL)
- return;
- if (!sc->sc_bios_allocated_flush_page) {
- temp = pci_read_config(sc->bdev, AGP_I915_IFPADDR, 4);
- temp &= ~1;
- pci_write_config(sc->bdev, AGP_I915_IFPADDR, temp, 4);
- }
- agp_i915_chipset_flush_free_page(dev);
-}
-
-static int
-agp_i965_chipset_flush_setup(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint64_t temp;
- uint32_t temp_hi, temp_lo;
- int error;
-
- sc = device_get_softc(dev);
-
- temp_hi = pci_read_config(sc->bdev, AGP_I965_IFPADDR + 4, 4);
- temp_lo = pci_read_config(sc->bdev, AGP_I965_IFPADDR, 4);
-
- if ((temp_lo & 1) != 0) {
- temp = ((uint64_t)temp_hi << 32) | (temp_lo & ~1);
- if (bootverbose)
- device_printf(dev,
- "Found already configured flush page at 0x%jx\n",
- (uintmax_t)temp);
- sc->sc_bios_allocated_flush_page = 1;
- /*
- * In the case BIOS initialized the flush pointer (?)
- * register, expect that BIOS also set up the resource
- * for the page.
- */
- error = agp_i915_chipset_flush_alloc_page(dev, temp,
- temp + PAGE_SIZE - 1);
- if (error != 0)
- return (error);
- } else {
- sc->sc_bios_allocated_flush_page = 0;
- error = agp_i915_chipset_flush_alloc_page(dev, 0, ~0);
- if (error != 0)
- return (error);
- temp = rman_get_start(sc->sc_flush_page_res);
- pci_write_config(sc->bdev, AGP_I965_IFPADDR + 4,
- (temp >> 32) & UINT32_MAX, 4);
- pci_write_config(sc->bdev, AGP_I965_IFPADDR,
- (temp & UINT32_MAX) | 1, 4);
- }
- return (0);
-}
-
-static void
-agp_i965_chipset_flush_teardown(device_t dev)
-{
- struct agp_i810_softc *sc;
- uint32_t temp_lo;
-
- sc = device_get_softc(dev);
- if (sc->sc_flush_page_res == NULL)
- return;
- if (!sc->sc_bios_allocated_flush_page) {
- temp_lo = pci_read_config(sc->bdev, AGP_I965_IFPADDR, 4);
- temp_lo &= ~1;
- pci_write_config(sc->bdev, AGP_I965_IFPADDR, temp_lo, 4);
- }
- agp_i915_chipset_flush_free_page(dev);
-}
-
-static void
-agp_i915_chipset_flush(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- *(uint32_t *)sc->sc_flush_page_vaddr = 1;
-}
-
-int
-agp_intel_gtt_chipset_flush(device_t dev)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- sc->match->driver->chipset_flush(dev);
- return (0);
-}
-
-void
-agp_intel_gtt_unmap_memory(device_t dev, struct sglist *sg_list)
-{
-}
-
-int
-agp_intel_gtt_map_memory(device_t dev, vm_page_t *pages, u_int num_entries,
- struct sglist **sg_list)
-{
-#if 0
- struct agp_i810_softc *sc;
-#endif
- struct sglist *sg;
- int i;
-#if 0
- int error;
- bus_dma_tag_t dmat;
-#endif
-
- if (*sg_list != NULL)
- return (0);
-#if 0
- sc = device_get_softc(dev);
-#endif
- sg = sglist_alloc(num_entries, M_WAITOK /* XXXKIB */);
- for (i = 0; i < num_entries; i++) {
- sg->sg_segs[i].ss_paddr = VM_PAGE_TO_PHYS(pages[i]);
- sg->sg_segs[i].ss_len = PAGE_SIZE;
- }
-
-#if 0
- error = bus_dma_tag_create(bus_get_dma_tag(dev),
- 1 /* alignment */, 0 /* boundary */,
- 1ULL << sc->match->busdma_addr_mask_sz /* lowaddr */,
- BUS_SPACE_MAXADDR /* highaddr */,
- NULL /* filtfunc */, NULL /* filtfuncarg */,
- BUS_SPACE_MAXADDR /* maxsize */,
- BUS_SPACE_UNRESTRICTED /* nsegments */,
- BUS_SPACE_MAXADDR /* maxsegsz */,
- 0 /* flags */, NULL /* lockfunc */, NULL /* lockfuncarg */,
- &dmat);
- if (error != 0) {
- sglist_free(sg);
- return (error);
- }
- /* XXXKIB */
-#endif
- *sg_list = sg;
- return (0);
-}
-
-static void
-agp_intel_gtt_install_pte(device_t dev, u_int index, vm_paddr_t addr,
- u_int flags)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(dev);
- sc->match->driver->install_gtt_pte(dev, index, addr, flags);
-}
-
-void
-agp_intel_gtt_insert_sg_entries(device_t dev, struct sglist *sg_list,
- u_int first_entry, u_int flags)
-{
- struct agp_i810_softc *sc;
- vm_paddr_t spaddr;
- size_t slen;
- u_int i, j;
-
- sc = device_get_softc(dev);
- for (i = j = 0; j < sg_list->sg_nseg; j++) {
- spaddr = sg_list->sg_segs[i].ss_paddr;
- slen = sg_list->sg_segs[i].ss_len;
- for (; slen > 0; i++) {
- sc->match->driver->install_gtt_pte(dev, first_entry + i,
- spaddr, flags);
- spaddr += AGP_PAGE_SIZE;
- slen -= AGP_PAGE_SIZE;
- }
- }
- sc->match->driver->read_gtt_pte(dev, first_entry + i - 1);
-}
-
-void
-intel_gtt_clear_range(u_int first_entry, u_int num_entries)
-{
-
- agp_intel_gtt_clear_range(intel_agp, first_entry, num_entries);
-}
-
-void
-intel_gtt_insert_pages(u_int first_entry, u_int num_entries, vm_page_t *pages,
- u_int flags)
-{
-
- agp_intel_gtt_insert_pages(intel_agp, first_entry, num_entries,
- pages, flags);
-}
-
-struct intel_gtt *
-intel_gtt_get(void)
-{
-
- intel_private.base = agp_intel_gtt_get(intel_agp);
- return (&intel_private.base);
-}
-
-int
-intel_gtt_chipset_flush(void)
-{
-
- return (agp_intel_gtt_chipset_flush(intel_agp));
-}
-
-void
-intel_gtt_unmap_memory(struct sglist *sg_list)
-{
-
- agp_intel_gtt_unmap_memory(intel_agp, sg_list);
-}
-
-int
-intel_gtt_map_memory(vm_page_t *pages, u_int num_entries,
- struct sglist **sg_list)
-{
-
- return (agp_intel_gtt_map_memory(intel_agp, pages, num_entries,
- sg_list));
-}
-
-void
-intel_gtt_insert_sg_entries(struct sglist *sg_list, u_int first_entry,
- u_int flags)
-{
-
- agp_intel_gtt_insert_sg_entries(intel_agp, sg_list, first_entry, flags);
-}
-
-void
-intel_gtt_install_pte(u_int index, vm_paddr_t addr, u_int flags)
-{
-
- agp_intel_gtt_install_pte(intel_agp, index, addr, flags);
-}
-
-device_t
-intel_gtt_get_bridge_device(void)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(intel_agp);
- return (sc->bdev);
-}
-
-vm_paddr_t
-intel_gtt_read_pte_paddr(u_int entry)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(intel_agp);
- return (sc->match->driver->read_gtt_pte_paddr(intel_agp, entry));
-}
-
-u_int32_t
-intel_gtt_read_pte(u_int entry)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(intel_agp);
- return (sc->match->driver->read_gtt_pte(intel_agp, entry));
-}
-
-void
-intel_gtt_write(u_int entry, uint32_t val)
-{
- struct agp_i810_softc *sc;
-
- sc = device_get_softc(intel_agp);
- return (sc->match->driver->write_gtt(intel_agp, entry, val));
-}
diff --git a/sys/dev/agp/agp_if.m b/sys/dev/agp/agp_if.m
deleted file mode 100644
--- a/sys/dev/agp/agp_if.m
+++ /dev/null
@@ -1,145 +0,0 @@
-#-
-# Copyright (c) 2000 Doug Rabson
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-#
-
-#include <sys/bus.h>
-
-#
-# The AGP interface is used internally to the agp driver to isolate the
-# differences between various AGP chipsets into chipset mini drivers. It
-# should not be used outside the AGP driver. The kernel api for accessing
-# AGP functionality is described in <dev/agp/agpvar.h>
-#
-INTERFACE agp;
-
-CODE {
- static int
- null_agp_chipset_flush(device_t dev)
- {
- return (ENXIO);
- }
-};
-
-#
-# Return the current aperture size.
-#
-METHOD u_int32_t get_aperture {
- device_t dev;
-};
-
-#
-# Set the size of the aperture. Return EINVAL on error or 0 on success.
-#
-METHOD int set_aperture {
- device_t dev;
- u_int32_t aperture;
-};
-
-#
-# Bind a single page in the AGP aperture to a given physical address.
-# The offset is a byte offset within the aperture which must be
-# aligned to an AGP page boundary.
-#
-METHOD int bind_page {
- device_t dev;
- vm_offset_t offset;
- vm_offset_t physical;
-};
-
-#
-# Unbind a single page in the AGP aperture.
-#
-METHOD int unbind_page {
- device_t dev;
- vm_offset_t offset;
-};
-
-#
-# Flush the GATT TLB. This is used after a call to bind_page to
-# ensure that any mappings cached in the chipset are discarded.
-#
-METHOD void flush_tlb {
- device_t dev;
-};
-
-#
-# Enable the agp hardware with the relavent mode. The mode bits are
-# defined in <dev/agp/agpreg.h>
-#
-METHOD int enable {
- device_t dev;
- u_int32_t mode;
-};
-
-#
-# Allocate memory of a given type. The type is a chipset-specific
-# code which is used by certain integrated agp graphics chips
-# (basically just the i810 for now) to access special features of
-# the chipset. An opaque handle representing the memory region is
-# returned and can be used as an argument to free_memory, bind_memory
-# and unbind_memory.
-#
-# The size is specified in bytes but must be a multiple of the AGP
-# page size.
-#
-METHOD struct agp_memory * alloc_memory {
- device_t dev;
- int type;
- vm_size_t size;
-};
-
-#
-# Free a memory region previously allocated with alloc_memory. Return
-# EBUSY if the memory is bound.
-#
-METHOD int free_memory {
- device_t dev;
- struct agp_memory *mem;
-};
-
-#
-# Bind a memory region to a specific byte offset within the chipset's
-# AGP aperture. This effectively defines a range of contiguous
-# physical address which alias the (possibly uncontiguous) pages in
-# the memory region.
-#
-METHOD int bind_memory {
- device_t dev;
- struct agp_memory *mem;
- vm_offset_t offset;
-};
-
-#
-# Unbind a memory region bound with bind_memory.
-#
-METHOD int unbind_memory {
- device_t dev;
- struct agp_memory *handle;
-};
-
-METHOD int chipset_flush {
- device_t dev;
-} DEFAULT null_agp_chipset_flush;
diff --git a/sys/dev/agp/agp_intel.c b/sys/dev/agp/agp_intel.c
deleted file mode 100644
--- a/sys/dev/agp/agp_intel.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-#define MAX_APSIZE 0x3f /* 256 MB */
-
-struct agp_intel_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
- u_int aperture_mask;
- u_int32_t current_aperture; /* current aperture size */
-};
-
-static const char*
-agp_intel_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return (NULL);
-
- if (agp_find_caps(dev) == 0)
- return (NULL);
-
- switch (pci_get_devid(dev)) {
- /* Intel -- vendor 0x8086 */
- case 0x71808086:
- return ("Intel 82443LX (440 LX) host to PCI bridge");
- case 0x71908086:
- return ("Intel 82443BX (440 BX) host to PCI bridge");
- case 0x71a08086:
- return ("Intel 82443GX host to PCI bridge");
- case 0x71a18086:
- return ("Intel 82443GX host to AGP bridge");
- case 0x11308086:
- return ("Intel 82815 (i815 GMCH) host to PCI bridge");
- case 0x25008086:
- case 0x25018086:
- return ("Intel 82820 host to AGP bridge");
- case 0x35758086:
- return ("Intel 82830 host to AGP bridge");
- case 0x1a218086:
- return ("Intel 82840 host to AGP bridge");
- case 0x1a308086:
- return ("Intel 82845 host to AGP bridge");
- case 0x25308086:
- return ("Intel 82850 host to AGP bridge");
- case 0x33408086:
- return ("Intel 82855 host to AGP bridge");
- case 0x25318086:
- return ("Intel 82860 host to AGP bridge");
- case 0x25708086:
- return ("Intel 82865 host to AGP bridge");
- case 0x255d8086:
- return ("Intel E7205 host to AGP bridge");
- case 0x25508086:
- return ("Intel E7505 host to AGP bridge");
- case 0x25788086:
- return ("Intel 82875P host to AGP bridge");
- case 0x25608086:
- return ("Intel 82845G host to AGP bridge");
- case 0x35808086:
- return ("Intel 82855GM host to AGP bridge");
- }
-
- return (NULL);
-}
-
-static int
-agp_intel_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_intel_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return (BUS_PROBE_DEFAULT);
- }
-
- return (ENXIO);
-}
-
-static void
-agp_intel_commit_gatt(device_t dev)
-{
- struct agp_intel_softc *sc;
- u_int32_t type;
- u_int32_t value;
-
- sc = device_get_softc(dev);
- type = pci_get_devid(dev);
-
- /* Install the gatt. */
- pci_write_config(dev, AGP_INTEL_ATTBASE, sc->gatt->ag_physical, 4);
-
- /* Enable the GLTB and setup the control register. */
- switch (type) {
- case 0x71908086: /* 440LX/EX */
- pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2080, 4);
- break;
- case 0x71808086: /* 440BX */
- /*
- * XXX: Should be 0xa080? Bit 9 is undefined, and
- * bit 13 being on and bit 15 being clear is illegal.
- */
- pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2280, 4);
- break;
- default:
- value = pci_read_config(dev, AGP_INTEL_AGPCTRL, 4);
- pci_write_config(dev, AGP_INTEL_AGPCTRL, value | 0x80, 4);
- }
-
- /* Enable aperture accesses. */
- switch (type) {
- case 0x25008086: /* i820 */
- case 0x25018086: /* i820 */
- pci_write_config(dev, AGP_INTEL_I820_RDCR,
- (pci_read_config(dev, AGP_INTEL_I820_RDCR, 1)
- | (1 << 1)), 1);
- break;
- case 0x1a308086: /* i845 */
- case 0x25608086: /* i845G */
- case 0x33408086: /* i855 */
- case 0x35808086: /* i855GM */
- case 0x25708086: /* i865 */
- case 0x25788086: /* i875P */
- pci_write_config(dev, AGP_INTEL_I845_AGPM,
- (pci_read_config(dev, AGP_INTEL_I845_AGPM, 1)
- | (1 << 1)), 1);
- break;
- case 0x1a218086: /* i840 */
- case 0x25308086: /* i850 */
- case 0x25318086: /* i860 */
- case 0x255d8086: /* E7205 */
- case 0x25508086: /* E7505 */
- pci_write_config(dev, AGP_INTEL_MCHCFG,
- (pci_read_config(dev, AGP_INTEL_MCHCFG, 2)
- | (1 << 9)), 2);
- break;
- default: /* Intel Generic (maybe) */
- pci_write_config(dev, AGP_INTEL_NBXCFG,
- (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
- & ~(1 << 10)) | (1 << 9), 4);
- }
-
- /* Clear errors. */
- switch (type) {
- case 0x1a218086: /* i840 */
- pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0xc000, 2);
- break;
- case 0x25008086: /* i820 */
- case 0x25018086: /* i820 */
- case 0x1a308086: /* i845 */
- case 0x25608086: /* i845G */
- case 0x25308086: /* i850 */
- case 0x33408086: /* i855 */
- case 0x25318086: /* i860 */
- case 0x25708086: /* i865 */
- case 0x25788086: /* i875P */
- case 0x255d8086: /* E7205 */
- case 0x25508086: /* E7505 */
- pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0x00ff, 2);
- break;
- default: /* Intel Generic (maybe) */
- pci_write_config(dev, AGP_INTEL_ERRSTS + 1, 7, 1);
- }
-}
-
-static int
-agp_intel_attach(device_t dev)
-{
- struct agp_intel_softc *sc;
- struct agp_gatt *gatt;
- u_int32_t value;
- int error;
-
- sc = device_get_softc(dev);
-
- error = agp_generic_attach(dev);
- if (error)
- return (error);
-
- /* Determine maximum supported aperture size. */
- value = pci_read_config(dev, AGP_INTEL_APSIZE, 1);
- pci_write_config(dev, AGP_INTEL_APSIZE, MAX_APSIZE, 1);
- sc->aperture_mask = pci_read_config(dev, AGP_INTEL_APSIZE, 1) &
- MAX_APSIZE;
- pci_write_config(dev, AGP_INTEL_APSIZE, value, 1);
- sc->current_aperture = sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) {
- agp_generic_detach(dev);
- return (ENOMEM);
- }
- }
- sc->gatt = gatt;
-
- agp_intel_commit_gatt(dev);
-
- return (0);
-}
-
-static int
-agp_intel_detach(device_t dev)
-{
- struct agp_intel_softc *sc;
- u_int32_t reg;
-
- sc = device_get_softc(dev);
-
- agp_free_cdev(dev);
-
- /* Disable aperture accesses. */
- switch (pci_get_devid(dev)) {
- case 0x25008086: /* i820 */
- case 0x25018086: /* i820 */
- reg = pci_read_config(dev, AGP_INTEL_I820_RDCR, 1) & ~(1 << 1);
- printf("%s: set RDCR to %02x\n", __func__, reg & 0xff);
- pci_write_config(dev, AGP_INTEL_I820_RDCR, reg, 1);
- break;
- case 0x1a308086: /* i845 */
- case 0x25608086: /* i845G */
- case 0x33408086: /* i855 */
- case 0x35808086: /* i855GM */
- case 0x25708086: /* i865 */
- case 0x25788086: /* i875P */
- reg = pci_read_config(dev, AGP_INTEL_I845_AGPM, 1) & ~(1 << 1);
- printf("%s: set AGPM to %02x\n", __func__, reg & 0xff);
- pci_write_config(dev, AGP_INTEL_I845_AGPM, reg, 1);
- break;
- case 0x1a218086: /* i840 */
- case 0x25308086: /* i850 */
- case 0x25318086: /* i860 */
- case 0x255d8086: /* E7205 */
- case 0x25508086: /* E7505 */
- reg = pci_read_config(dev, AGP_INTEL_MCHCFG, 2) & ~(1 << 9);
- printf("%s: set MCHCFG to %x04\n", __func__, reg & 0xffff);
- pci_write_config(dev, AGP_INTEL_MCHCFG, reg, 2);
- break;
- default: /* Intel Generic (maybe) */
- reg = pci_read_config(dev, AGP_INTEL_NBXCFG, 4) & ~(1 << 9);
- printf("%s: set NBXCFG to %08x\n", __func__, reg);
- pci_write_config(dev, AGP_INTEL_NBXCFG, reg, 4);
- }
- pci_write_config(dev, AGP_INTEL_ATTBASE, 0, 4);
- AGP_SET_APERTURE(dev, sc->initial_aperture);
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
-
- return (0);
-}
-
-static int
-agp_intel_resume(device_t dev)
-{
- struct agp_intel_softc *sc;
- sc = device_get_softc(dev);
-
- AGP_SET_APERTURE(dev, sc->current_aperture);
- agp_intel_commit_gatt(dev);
- return (bus_generic_resume(dev));
-}
-
-static u_int32_t
-agp_intel_get_aperture(device_t dev)
-{
- struct agp_intel_softc *sc;
- u_int32_t apsize;
-
- sc = device_get_softc(dev);
-
- apsize = pci_read_config(dev, AGP_INTEL_APSIZE, 1) & sc->aperture_mask;
-
- /*
- * The size is determined by the number of low bits of
- * register APBASE which are forced to zero. The low 22 bits
- * are always forced to zero and each zero bit in the apsize
- * field just read forces the corresponding bit in the 27:22
- * to be zero. We calculate the aperture size accordingly.
- */
- return ((((apsize ^ sc->aperture_mask) << 22) | ((1 << 22) - 1)) + 1);
-}
-
-static int
-agp_intel_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_intel_softc *sc;
- u_int32_t apsize;
-
- sc = device_get_softc(dev);
-
- /*
- * Reverse the magic from get_aperture.
- */
- apsize = ((aperture - 1) >> 22) ^ sc->aperture_mask;
-
- /*
- * Double check for sanity.
- */
- if ((((apsize ^ sc->aperture_mask) << 22) | ((1 << 22) - 1)) + 1 != aperture)
- return (EINVAL);
-
- sc->current_aperture = apsize;
-
- pci_write_config(dev, AGP_INTEL_APSIZE, apsize, 1);
-
- return (0);
-}
-
-static int
-agp_intel_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_intel_softc *sc;
-
- sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical | 0x17;
- return (0);
-}
-
-static int
-agp_intel_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_intel_softc *sc;
-
- sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return (0);
-}
-
-static void
-agp_intel_flush_tlb(device_t dev)
-{
- u_int32_t val;
-
- val = pci_read_config(dev, AGP_INTEL_AGPCTRL, 4);
- pci_write_config(dev, AGP_INTEL_AGPCTRL, val & ~(1 << 7), 4);
- pci_write_config(dev, AGP_INTEL_AGPCTRL, val, 4);
-}
-
-static device_method_t agp_intel_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_intel_probe),
- DEVMETHOD(device_attach, agp_intel_attach),
- DEVMETHOD(device_detach, agp_intel_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, agp_intel_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_intel_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_intel_set_aperture),
- DEVMETHOD(agp_bind_page, agp_intel_bind_page),
- DEVMETHOD(agp_unbind_page, agp_intel_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_intel_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_intel_driver = {
- "agp",
- agp_intel_methods,
- sizeof(struct agp_intel_softc),
-};
-
-DRIVER_MODULE(agp_intel, hostb, agp_intel_driver, 0, 0);
-MODULE_DEPEND(agp_intel, agp, 1, 1, 1);
-MODULE_DEPEND(agp_intel, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_nvidia.c b/sys/dev/agp/agp_nvidia.c
deleted file mode 100644
--- a/sys/dev/agp/agp_nvidia.c
+++ /dev/null
@@ -1,449 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2003 Matthew N. Dodd <winter@jurai.net>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-/*
- * Written using information gleaned from the
- * NVIDIA nForce/nForce2 AGPGART Linux Kernel Patch.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-#define NVIDIA_VENDORID 0x10de
-#define NVIDIA_DEVICEID_NFORCE 0x01a4
-#define NVIDIA_DEVICEID_NFORCE2 0x01e0
-
-struct agp_nvidia_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt * gatt;
-
- device_t dev; /* AGP Controller */
- device_t mc1_dev; /* Memory Controller */
- device_t mc2_dev; /* Memory Controller */
- device_t bdev; /* Bridge */
-
- u_int32_t wbc_mask;
- int num_dirs;
- int num_active_entries;
- off_t pg_offset;
-};
-
-static const char *agp_nvidia_match(device_t dev);
-static int agp_nvidia_probe(device_t);
-static int agp_nvidia_attach(device_t);
-static int agp_nvidia_detach(device_t);
-static u_int32_t agp_nvidia_get_aperture(device_t);
-static int agp_nvidia_set_aperture(device_t, u_int32_t);
-static int agp_nvidia_bind_page(device_t, vm_offset_t, vm_offset_t);
-static int agp_nvidia_unbind_page(device_t, vm_offset_t);
-
-static int nvidia_init_iorr(u_int32_t, u_int32_t);
-
-static const char *
-agp_nvidia_match (device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE ||
- pci_get_subclass(dev) != PCIS_BRIDGE_HOST ||
- pci_get_vendor(dev) != NVIDIA_VENDORID)
- return (NULL);
-
- switch (pci_get_device(dev)) {
- case NVIDIA_DEVICEID_NFORCE:
- return ("NVIDIA nForce AGP Controller");
- case NVIDIA_DEVICEID_NFORCE2:
- return ("NVIDIA nForce2 AGP Controller");
- }
- return (NULL);
-}
-
-static int
-agp_nvidia_probe (device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_nvidia_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return (BUS_PROBE_DEFAULT);
- }
- return (ENXIO);
-}
-
-static int
-agp_nvidia_attach (device_t dev)
-{
- struct agp_nvidia_softc *sc = device_get_softc(dev);
- struct agp_gatt *gatt;
- u_int32_t apbase;
- u_int32_t aplimit;
- u_int32_t temp;
- int size;
- int i;
- int error;
-
- switch (pci_get_device(dev)) {
- case NVIDIA_DEVICEID_NFORCE:
- sc->wbc_mask = 0x00010000;
- break;
- case NVIDIA_DEVICEID_NFORCE2:
- sc->wbc_mask = 0x80000000;
- break;
- default:
- device_printf(dev, "Bad chip id\n");
- return (ENODEV);
- }
-
- /* AGP Controller */
- sc->dev = dev;
-
- /* Memory Controller 1 */
- sc->mc1_dev = pci_find_bsf(pci_get_bus(dev), 0, 1);
- if (sc->mc1_dev == NULL) {
- device_printf(dev,
- "Unable to find NVIDIA Memory Controller 1.\n");
- return (ENODEV);
- }
-
- /* Memory Controller 2 */
- sc->mc2_dev = pci_find_bsf(pci_get_bus(dev), 0, 2);
- if (sc->mc2_dev == NULL) {
- device_printf(dev,
- "Unable to find NVIDIA Memory Controller 2.\n");
- return (ENODEV);
- }
-
- /* AGP Host to PCI Bridge */
- sc->bdev = pci_find_bsf(pci_get_bus(dev), 30, 0);
- if (sc->bdev == NULL) {
- device_printf(dev,
- "Unable to find NVIDIA AGP Host to PCI Bridge.\n");
- return (ENODEV);
- }
-
- error = agp_generic_attach(dev);
- if (error)
- return (error);
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2))
- goto fail;
- }
- sc->gatt = gatt;
-
- apbase = rman_get_start(sc->agp.as_aperture);
- aplimit = apbase + AGP_GET_APERTURE(dev) - 1;
- pci_write_config(sc->mc2_dev, AGP_NVIDIA_2_APBASE, apbase, 4);
- pci_write_config(sc->mc2_dev, AGP_NVIDIA_2_APLIMIT, aplimit, 4);
- pci_write_config(sc->bdev, AGP_NVIDIA_3_APBASE, apbase, 4);
- pci_write_config(sc->bdev, AGP_NVIDIA_3_APLIMIT, aplimit, 4);
-
- error = nvidia_init_iorr(apbase, AGP_GET_APERTURE(dev));
- if (error) {
- device_printf(dev, "Failed to setup IORRs\n");
- goto fail;
- }
-
- /* directory size is 64k */
- size = AGP_GET_APERTURE(dev) / 1024 / 1024;
- sc->num_dirs = size / 64;
- sc->num_active_entries = (size == 32) ? 16384 : ((size * 1024) / 4);
- sc->pg_offset = 0;
- if (sc->num_dirs == 0) {
- sc->num_dirs = 1;
- sc->num_active_entries /= (64 / size);
- sc->pg_offset = rounddown2(apbase & (64 * 1024 * 1024 - 1),
- AGP_GET_APERTURE(dev)) / PAGE_SIZE;
- }
-
- /* (G)ATT Base Address */
- for (i = 0; i < 8; i++) {
- pci_write_config(sc->mc2_dev, AGP_NVIDIA_2_ATTBASE(i),
- (sc->gatt->ag_physical +
- (i % sc->num_dirs) * 64 * 1024) | 1, 4);
- }
-
- /* GTLB Control */
- temp = pci_read_config(sc->mc2_dev, AGP_NVIDIA_2_GARTCTRL, 4);
- pci_write_config(sc->mc2_dev, AGP_NVIDIA_2_GARTCTRL, temp | 0x11, 4);
-
- /* GART Control */
- temp = pci_read_config(sc->dev, AGP_NVIDIA_0_APSIZE, 4);
- pci_write_config(sc->dev, AGP_NVIDIA_0_APSIZE, temp | 0x100, 4);
-
- return (0);
-fail:
- agp_generic_detach(dev);
- return (ENOMEM);
-}
-
-static int
-agp_nvidia_detach (device_t dev)
-{
- struct agp_nvidia_softc *sc = device_get_softc(dev);
- u_int32_t temp;
-
- agp_free_cdev(dev);
-
- /* GART Control */
- temp = pci_read_config(sc->dev, AGP_NVIDIA_0_APSIZE, 4);
- pci_write_config(sc->dev, AGP_NVIDIA_0_APSIZE, temp & ~(0x100), 4);
-
- /* GTLB Control */
- temp = pci_read_config(sc->mc2_dev, AGP_NVIDIA_2_GARTCTRL, 4);
- pci_write_config(sc->mc2_dev, AGP_NVIDIA_2_GARTCTRL, temp & ~(0x11), 4);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- /* restore iorr for previous aperture size */
- nvidia_init_iorr(rman_get_start(sc->agp.as_aperture),
- sc->initial_aperture);
-
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
-
- return (0);
-}
-
-static u_int32_t
-agp_nvidia_get_aperture(device_t dev)
-{
- switch (pci_read_config(dev, AGP_NVIDIA_0_APSIZE, 1) & 0x0f) {
- case 0: return (512 * 1024 * 1024);
- case 8: return (256 * 1024 * 1024);
- case 12: return (128 * 1024 * 1024);
- case 14: return (64 * 1024 * 1024);
- case 15: return (32 * 1024 * 1024);
- default:
- device_printf(dev, "Invalid aperture setting 0x%x\n",
- pci_read_config(dev, AGP_NVIDIA_0_APSIZE, 1));
- return 0;
- }
-}
-
-static int
-agp_nvidia_set_aperture(device_t dev, u_int32_t aperture)
-{
- u_int8_t val;
- u_int8_t key;
-
- switch (aperture) {
- case (512 * 1024 * 1024): key = 0; break;
- case (256 * 1024 * 1024): key = 8; break;
- case (128 * 1024 * 1024): key = 12; break;
- case (64 * 1024 * 1024): key = 14; break;
- case (32 * 1024 * 1024): key = 15; break;
- default:
- device_printf(dev, "Invalid aperture size (%dMb)\n",
- aperture / 1024 / 1024);
- return (EINVAL);
- }
- val = pci_read_config(dev, AGP_NVIDIA_0_APSIZE, 1);
- pci_write_config(dev, AGP_NVIDIA_0_APSIZE, ((val & ~0x0f) | key), 1);
-
- return (0);
-}
-
-static int
-agp_nvidia_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_nvidia_softc *sc = device_get_softc(dev);
- u_int32_t index;
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- index = (sc->pg_offset + offset) >> AGP_PAGE_SHIFT;
- sc->gatt->ag_virtual[index] = physical | 1;
-
- return (0);
-}
-
-static int
-agp_nvidia_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_nvidia_softc *sc = device_get_softc(dev);
- u_int32_t index;
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return (EINVAL);
-
- index = (sc->pg_offset + offset) >> AGP_PAGE_SHIFT;
- sc->gatt->ag_virtual[index] = 0;
-
- return (0);
-}
-
-static void
-agp_nvidia_flush_tlb (device_t dev)
-{
- struct agp_nvidia_softc *sc;
- u_int32_t wbc_reg;
- volatile u_int32_t *ag_virtual;
- int i, pages;
-
- sc = (struct agp_nvidia_softc *)device_get_softc(dev);
-
- if (sc->wbc_mask) {
- wbc_reg = pci_read_config(sc->mc1_dev, AGP_NVIDIA_1_WBC, 4);
- wbc_reg |= sc->wbc_mask;
- pci_write_config(sc->mc1_dev, AGP_NVIDIA_1_WBC, wbc_reg, 4);
-
- /* Wait no more than 3 seconds. */
- for (i = 0; i < 3000; i++) {
- wbc_reg = pci_read_config(sc->mc1_dev,
- AGP_NVIDIA_1_WBC, 4);
- if ((sc->wbc_mask & wbc_reg) == 0)
- break;
- else
- DELAY(1000);
- }
- if (i == 3000)
- device_printf(dev,
- "TLB flush took more than 3 seconds.\n");
- }
-
- ag_virtual = (volatile u_int32_t *)sc->gatt->ag_virtual;
-
- /* Flush TLB entries. */
- pages = sc->gatt->ag_entries * sizeof(u_int32_t) / PAGE_SIZE;
- for(i = 0; i < pages; i++)
- (void)ag_virtual[i * PAGE_SIZE / sizeof(u_int32_t)];
- for(i = 0; i < pages; i++)
- (void)ag_virtual[i * PAGE_SIZE / sizeof(u_int32_t)];
-}
-
-#define SYSCFG 0xC0010010
-#define IORR_BASE0 0xC0010016
-#define IORR_MASK0 0xC0010017
-#define AMD_K7_NUM_IORR 2
-
-static int
-nvidia_init_iorr(u_int32_t addr, u_int32_t size)
-{
- quad_t base, mask, sys;
- u_int32_t iorr_addr, free_iorr_addr;
-
- /* Find the iorr that is already used for the addr */
- /* If not found, determine the uppermost available iorr */
- free_iorr_addr = AMD_K7_NUM_IORR;
- for(iorr_addr = 0; iorr_addr < AMD_K7_NUM_IORR; iorr_addr++) {
- base = rdmsr(IORR_BASE0 + 2 * iorr_addr);
- mask = rdmsr(IORR_MASK0 + 2 * iorr_addr);
-
- if ((base & 0xfffff000ULL) == (addr & 0xfffff000))
- break;
-
- if ((mask & 0x00000800ULL) == 0)
- free_iorr_addr = iorr_addr;
- }
-
- if (iorr_addr >= AMD_K7_NUM_IORR) {
- iorr_addr = free_iorr_addr;
- if (iorr_addr >= AMD_K7_NUM_IORR)
- return (EINVAL);
- }
-
- base = (addr & ~0xfff) | 0x18;
- mask = (0xfULL << 32) | rounddown2(0xfffff000, size) | 0x800;
- wrmsr(IORR_BASE0 + 2 * iorr_addr, base);
- wrmsr(IORR_MASK0 + 2 * iorr_addr, mask);
-
- sys = rdmsr(SYSCFG);
- sys |= 0x00100000ULL;
- wrmsr(SYSCFG, sys);
-
- return (0);
-}
-
-static device_method_t agp_nvidia_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_nvidia_probe),
- DEVMETHOD(device_attach, agp_nvidia_attach),
- DEVMETHOD(device_detach, agp_nvidia_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_nvidia_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_nvidia_set_aperture),
- DEVMETHOD(agp_bind_page, agp_nvidia_bind_page),
- DEVMETHOD(agp_unbind_page, agp_nvidia_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_nvidia_flush_tlb),
-
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_nvidia_driver = {
- "agp",
- agp_nvidia_methods,
- sizeof(struct agp_nvidia_softc),
-};
-
-DRIVER_MODULE(agp_nvidia, hostb, agp_nvidia_driver, 0, 0);
-MODULE_DEPEND(agp_nvidia, agp, 1, 1, 1);
-MODULE_DEPEND(agp_nvidia, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_sis.c b/sys/dev/agp/agp_sis.c
deleted file mode 100644
--- a/sys/dev/agp/agp_sis.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-struct agp_sis_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
-};
-
-static const char*
-agp_sis_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return NULL;
-
- if (agp_find_caps(dev) == 0)
- return NULL;
-
- switch (pci_get_devid(dev)) {
- case 0x00011039:
- return ("SiS 5591 host to AGP bridge");
- case 0x05301039:
- return ("SiS 530 host to AGP bridge");
- case 0x05401039:
- return ("SiS 540 host to AGP bridge");
- case 0x05501039:
- return ("SiS 550 host to AGP bridge");
- case 0x06201039:
- return ("SiS 620 host to AGP bridge");
- case 0x06301039:
- return ("SiS 630 host to AGP bridge");
- case 0x06451039:
- return ("SiS 645 host to AGP bridge");
- case 0x06461039:
- return ("SiS 645DX host to AGP bridge");
- case 0x06481039:
- return ("SiS 648 host to AGP bridge");
- case 0x06501039:
- return ("SiS 650 host to AGP bridge");
- case 0x06511039:
- return ("SiS 651 host to AGP bridge");
- case 0x06551039:
- return ("SiS 655 host to AGP bridge");
- case 0x06611039:
- return ("SiS 661 host to AGP bridge");
- case 0x07301039:
- return ("SiS 730 host to AGP bridge");
- case 0x07351039:
- return ("SiS 735 host to AGP bridge");
- case 0x07401039:
- return ("SiS 740 host to AGP bridge");
- case 0x07411039:
- return ("SiS 741 host to AGP bridge");
- case 0x07451039:
- return ("SiS 745 host to AGP bridge");
- case 0x07461039:
- return ("SiS 746 host to AGP bridge");
- }
-
- return NULL;
-}
-
-static int
-agp_sis_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_sis_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return BUS_PROBE_DEFAULT;
- }
-
- return ENXIO;
-}
-
-static int
-agp_sis_attach(device_t dev)
-{
- struct agp_sis_softc *sc = device_get_softc(dev);
- struct agp_gatt *gatt;
- int error;
-
- error = agp_generic_attach(dev);
- if (error)
- return error;
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
- }
- sc->gatt = gatt;
-
- /* Install the gatt. */
- pci_write_config(dev, AGP_SIS_ATTBASE, gatt->ag_physical, 4);
-
- /* Enable the aperture. */
- pci_write_config(dev, AGP_SIS_WINCTRL,
- pci_read_config(dev, AGP_SIS_WINCTRL, 1) | 3, 1);
-
- /*
- * Enable the TLB and make it automatically invalidate entries
- * when the GATT is written.
- */
- pci_write_config(dev, AGP_SIS_TLBCTRL, 0x05, 1);
-
- return 0;
-}
-
-static int
-agp_sis_detach(device_t dev)
-{
- struct agp_sis_softc *sc = device_get_softc(dev);
-
- agp_free_cdev(dev);
-
- /* Disable the aperture.. */
- pci_write_config(dev, AGP_SIS_WINCTRL,
- pci_read_config(dev, AGP_SIS_WINCTRL, 1) & ~3, 1);
-
- /* and the TLB. */
- pci_write_config(dev, AGP_SIS_TLBCTRL, 0, 1);
-
- /* Put the aperture back the way it started. */
- AGP_SET_APERTURE(dev, sc->initial_aperture);
-
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
- return 0;
-}
-
-static u_int32_t
-agp_sis_get_aperture(device_t dev)
-{
- int gws;
-
- /*
- * The aperture size is equal to 4M<<gws.
- */
- gws = (pci_read_config(dev, AGP_SIS_WINCTRL, 1) & 0x70) >> 4;
- return (4*1024*1024) << gws;
-}
-
-static int
-agp_sis_set_aperture(device_t dev, u_int32_t aperture)
-{
- int gws;
-
- /*
- * Check for a power of two and make sure its within the
- * programmable range.
- */
- if (aperture & (aperture - 1)
- || aperture < 4*1024*1024
- || aperture > 256*1024*1024)
- return EINVAL;
-
- gws = ffs(aperture / 4*1024*1024) - 1;
-
- pci_write_config(dev, AGP_SIS_WINCTRL,
- ((pci_read_config(dev, AGP_SIS_WINCTRL, 1) & ~0x70)
- | gws << 4), 1);
-
- return 0;
-}
-
-static int
-agp_sis_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_sis_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
- return 0;
-}
-
-static int
-agp_sis_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_sis_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return 0;
-}
-
-static void
-agp_sis_flush_tlb(device_t dev)
-{
- pci_write_config(dev, AGP_SIS_TLBFLUSH, 0x02, 1);
-}
-
-static device_method_t agp_sis_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_sis_probe),
- DEVMETHOD(device_attach, agp_sis_attach),
- DEVMETHOD(device_detach, agp_sis_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_sis_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_sis_set_aperture),
- DEVMETHOD(agp_bind_page, agp_sis_bind_page),
- DEVMETHOD(agp_unbind_page, agp_sis_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_sis_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_sis_driver = {
- "agp",
- agp_sis_methods,
- sizeof(struct agp_sis_softc),
-};
-
-DRIVER_MODULE(agp_sis, hostb, agp_sis_driver, 0, 0);
-MODULE_DEPEND(agp_sis, agp, 1, 1, 1);
-MODULE_DEPEND(agp_sis, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agp_via.c b/sys/dev/agp/agp_via.c
deleted file mode 100644
--- a/sys/dev/agp/agp_via.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-
-#include <dev/agp/agppriv.h>
-#include <dev/agp/agpreg.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <vm/vm.h>
-#include <vm/vm_object.h>
-#include <vm/pmap.h>
-
-#define REG_GARTCTRL 0
-#define REG_APSIZE 1
-#define REG_ATTBASE 2
-
-struct agp_via_softc {
- struct agp_softc agp;
- u_int32_t initial_aperture; /* aperture size at startup */
- struct agp_gatt *gatt;
- int *regs;
-};
-
-static int via_v2_regs[] = { AGP_VIA_GARTCTRL, AGP_VIA_APSIZE,
- AGP_VIA_ATTBASE };
-static int via_v3_regs[] = { AGP3_VIA_GARTCTRL, AGP3_VIA_APSIZE,
- AGP3_VIA_ATTBASE };
-
-static const char*
-agp_via_match(device_t dev)
-{
- if (pci_get_class(dev) != PCIC_BRIDGE
- || pci_get_subclass(dev) != PCIS_BRIDGE_HOST)
- return NULL;
-
- if (agp_find_caps(dev) == 0)
- return NULL;
-
- switch (pci_get_devid(dev)) {
- case 0x01981106:
- return ("VIA 8763 (P4X600) host to PCI bridge");
- case 0x02591106:
- return ("VIA PM800/PN800/PM880/PN880 host to PCI bridge");
- case 0x02691106:
- return ("VIA KT880 host to PCI bridge");
- case 0x02961106:
- return ("VIA 3296 (P4M800) host to PCI bridge");
- case 0x03051106:
- return ("VIA 82C8363 (Apollo KT133x/KM133) host to PCI bridge");
- case 0x03141106:
- return ("VIA 3314 (P4M800CE) host to PCI bridge");
- case 0x03241106:
- return ("VIA VT3324 (CX700) host to PCI bridge");
- case 0x03271106:
- return ("VIA 3327 (P4M890) host to PCI bridge");
- case 0x03641106:
- return ("VIA 3364 (P4M900) host to PCI bridge");
- case 0x03911106:
- return ("VIA 8371 (Apollo KX133) host to PCI bridge");
- case 0x05011106:
- return ("VIA 8501 (Apollo MVP4) host to PCI bridge");
- case 0x05971106:
- return ("VIA 82C597 (Apollo VP3) host to PCI bridge");
- case 0x05981106:
- return ("VIA 82C598 (Apollo MVP3) host to PCI bridge");
- case 0x06011106:
- return ("VIA 8601 (Apollo ProMedia/PLE133Ta) host to PCI bridge");
- case 0x06051106:
- return ("VIA 82C694X (Apollo Pro 133A) host to PCI bridge");
- case 0x06911106:
- return ("VIA 82C691 (Apollo Pro) host to PCI bridge");
- case 0x30911106:
- return ("VIA 8633 (Pro 266) host to PCI bridge");
- case 0x30991106:
- return ("VIA 8367 (KT266/KY266x/KT333) host to PCI bridge");
- case 0x31011106:
- return ("VIA 8653 (Pro266T) host to PCI bridge");
- case 0x31121106:
- return ("VIA 8361 (KLE133) host to PCI bridge");
- case 0x31161106:
- return ("VIA XM266 (PM266/KM266) host to PCI bridge");
- case 0x31231106:
- return ("VIA 862x (CLE266) host to PCI bridge");
- case 0x31281106:
- return ("VIA 8753 (P4X266) host to PCI bridge");
- case 0x31481106:
- return ("VIA 8703 (P4M266x/P4N266) host to PCI bridge");
- case 0x31561106:
- return ("VIA XN266 (Apollo Pro266) host to PCI bridge");
- case 0x31681106:
- return ("VIA 8754 (PT800) host to PCI bridge");
- case 0x31891106:
- return ("VIA 8377 (Apollo KT400/KT400A/KT600) host to PCI bridge");
- case 0x32051106:
- return ("VIA 8235/8237 (Apollo KM400/KM400A) host to PCI bridge");
- case 0x32081106:
- return ("VIA 8783 (PT890) host to PCI bridge");
- case 0x32581106:
- return ("VIA PT880 host to PCI bridge");
- case 0xb1981106:
- return ("VIA VT83xx/VT87xx/KTxxx/Px8xx host to PCI bridge");
- }
-
- return NULL;
-}
-
-static int
-agp_via_probe(device_t dev)
-{
- const char *desc;
-
- if (resource_disabled("agp", device_get_unit(dev)))
- return (ENXIO);
- desc = agp_via_match(dev);
- if (desc) {
- device_set_desc(dev, desc);
- return BUS_PROBE_DEFAULT;
- }
-
- return ENXIO;
-}
-
-static int
-agp_via_attach(device_t dev)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
- struct agp_gatt *gatt;
- int error;
- u_int32_t agpsel;
- u_int32_t capid;
-
- sc->regs = via_v2_regs;
-
- /* Look at the capability register to see if we handle AGP3 */
- capid = pci_read_config(dev, agp_find_caps(dev) + AGP_CAPID, 4);
- if (((capid >> 20) & 0x0f) >= 3) {
- agpsel = pci_read_config(dev, AGP_VIA_AGPSEL, 1);
- if ((agpsel & (1 << 1)) == 0)
- sc->regs = via_v3_regs;
- }
-
- error = agp_generic_attach(dev);
- if (error)
- return error;
-
- sc->initial_aperture = AGP_GET_APERTURE(dev);
-
- for (;;) {
- gatt = agp_alloc_gatt(dev);
- if (gatt)
- break;
-
- /*
- * Probably contigmalloc failure. Try reducing the
- * aperture so that the gatt size reduces.
- */
- if (AGP_SET_APERTURE(dev, AGP_GET_APERTURE(dev) / 2)) {
- agp_generic_detach(dev);
- return ENOMEM;
- }
- }
- sc->gatt = gatt;
-
- if (sc->regs == via_v2_regs) {
- /* Install the gatt. */
- pci_write_config(dev, sc->regs[REG_ATTBASE], gatt->ag_physical | 3, 4);
-
- /* Enable the aperture. */
- pci_write_config(dev, sc->regs[REG_GARTCTRL], 0x0f, 4);
- } else {
- u_int32_t gartctrl;
-
- /* Install the gatt. */
- pci_write_config(dev, sc->regs[REG_ATTBASE], gatt->ag_physical, 4);
-
- /* Enable the aperture. */
- gartctrl = pci_read_config(dev, sc->regs[REG_GARTCTRL], 4);
- pci_write_config(dev, sc->regs[REG_GARTCTRL], gartctrl | (3 << 7), 4);
- }
-
- device_printf(dev, "aperture size is %dM\n",
- sc->initial_aperture / 1024 / 1024);
-
- return 0;
-}
-
-static int
-agp_via_detach(device_t dev)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
-
- agp_free_cdev(dev);
-
- pci_write_config(dev, sc->regs[REG_GARTCTRL], 0, 4);
- pci_write_config(dev, sc->regs[REG_ATTBASE], 0, 4);
- AGP_SET_APERTURE(dev, sc->initial_aperture);
- agp_free_gatt(sc->gatt);
- agp_free_res(dev);
-
- return 0;
-}
-
-static u_int32_t
-agp_via_get_aperture(device_t dev)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
- u_int32_t apsize;
-
- if (sc->regs == via_v2_regs) {
- apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 1);
-
- /*
- * The size is determined by the number of low bits of
- * register APBASE which are forced to zero. The low 20 bits
- * are always forced to zero and each zero bit in the apsize
- * field just read forces the corresponding bit in the 27:20
- * to be zero. We calculate the aperture size accordingly.
- */
- return (((apsize ^ 0xff) << 20) | ((1 << 20) - 1)) + 1;
- } else {
- apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 2) & 0xfff;
- switch (apsize) {
- case 0x800:
- return 0x80000000;
- case 0xc00:
- return 0x40000000;
- case 0xe00:
- return 0x20000000;
- case 0xf00:
- return 0x10000000;
- case 0xf20:
- return 0x08000000;
- case 0xf30:
- return 0x04000000;
- case 0xf38:
- return 0x02000000;
- case 0xf3c:
- return 0x01000000;
- case 0xf3e:
- return 0x00800000;
- case 0xf3f:
- return 0x00400000;
- default:
- device_printf(dev, "Invalid aperture setting 0x%x\n",
- pci_read_config(dev, sc->regs[REG_APSIZE], 2));
- return 0;
- }
- }
-}
-
-static int
-agp_via_set_aperture(device_t dev, u_int32_t aperture)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
- u_int32_t apsize, key, val;
-
- if (sc->regs == via_v2_regs) {
- /*
- * Reverse the magic from get_aperture.
- */
- apsize = ((aperture - 1) >> 20) ^ 0xff;
-
- /*
- * Double check for sanity.
- */
- if ((((apsize ^ 0xff) << 20) | ((1 << 20) - 1)) + 1 != aperture)
- return EINVAL;
-
- pci_write_config(dev, sc->regs[REG_APSIZE], apsize, 1);
- } else {
- switch (aperture) {
- case 0x80000000:
- key = 0x800;
- break;
- case 0x40000000:
- key = 0xc00;
- break;
- case 0x20000000:
- key = 0xe00;
- break;
- case 0x10000000:
- key = 0xf00;
- break;
- case 0x08000000:
- key = 0xf20;
- break;
- case 0x04000000:
- key = 0xf30;
- break;
- case 0x02000000:
- key = 0xf38;
- break;
- case 0x01000000:
- key = 0xf3c;
- break;
- case 0x00800000:
- key = 0xf3e;
- break;
- case 0x00400000:
- key = 0xf3f;
- break;
- default:
- device_printf(dev, "Invalid aperture size (%dMb)\n",
- aperture / 1024 / 1024);
- return EINVAL;
- }
- val = pci_read_config(dev, sc->regs[REG_APSIZE], 2);
- pci_write_config(dev, sc->regs[REG_APSIZE],
- ((val & ~0xfff) | key), 2);
- }
- return 0;
-}
-
-static int
-agp_via_bind_page(device_t dev, vm_offset_t offset, vm_offset_t physical)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = physical;
- return 0;
-}
-
-static int
-agp_via_unbind_page(device_t dev, vm_offset_t offset)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
-
- if (offset >= (sc->gatt->ag_entries << AGP_PAGE_SHIFT))
- return EINVAL;
-
- sc->gatt->ag_virtual[offset >> AGP_PAGE_SHIFT] = 0;
- return 0;
-}
-
-static void
-agp_via_flush_tlb(device_t dev)
-{
- struct agp_via_softc *sc = device_get_softc(dev);
- u_int32_t gartctrl;
-
- if (sc->regs == via_v2_regs) {
- pci_write_config(dev, sc->regs[REG_GARTCTRL], 0x8f, 4);
- pci_write_config(dev, sc->regs[REG_GARTCTRL], 0x0f, 4);
- } else {
- gartctrl = pci_read_config(dev, sc->regs[REG_GARTCTRL], 4);
- pci_write_config(dev, sc->regs[REG_GARTCTRL], gartctrl &
- ~(1 << 7), 4);
- pci_write_config(dev, sc->regs[REG_GARTCTRL], gartctrl, 4);
- }
-
-}
-
-static device_method_t agp_via_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, agp_via_probe),
- DEVMETHOD(device_attach, agp_via_attach),
- DEVMETHOD(device_detach, agp_via_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* AGP interface */
- DEVMETHOD(agp_get_aperture, agp_via_get_aperture),
- DEVMETHOD(agp_set_aperture, agp_via_set_aperture),
- DEVMETHOD(agp_bind_page, agp_via_bind_page),
- DEVMETHOD(agp_unbind_page, agp_via_unbind_page),
- DEVMETHOD(agp_flush_tlb, agp_via_flush_tlb),
- DEVMETHOD(agp_enable, agp_generic_enable),
- DEVMETHOD(agp_alloc_memory, agp_generic_alloc_memory),
- DEVMETHOD(agp_free_memory, agp_generic_free_memory),
- DEVMETHOD(agp_bind_memory, agp_generic_bind_memory),
- DEVMETHOD(agp_unbind_memory, agp_generic_unbind_memory),
- { 0, 0 }
-};
-
-static driver_t agp_via_driver = {
- "agp",
- agp_via_methods,
- sizeof(struct agp_via_softc),
-};
-
-DRIVER_MODULE(agp_via, hostb, agp_via_driver, 0, 0);
-MODULE_DEPEND(agp_via, agp, 1, 1, 1);
-MODULE_DEPEND(agp_via, pci, 1, 1, 1);
diff --git a/sys/dev/agp/agppriv.h b/sys/dev/agp/agppriv.h
deleted file mode 100644
--- a/sys/dev/agp/agppriv.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2000 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _PCI_AGPPRIV_H_
-#define _PCI_AGPPRIV_H_
-
-/*
- * This file *must not* be included by code outside the agp driver itself.
- */
-
-#include <sys/agpio.h>
-#include <dev/agp/agpvar.h>
-
-#ifdef AGP_DEBUG
-#define AGP_DPF(fmt, ...) do { \
- printf("agp: " fmt, ##__VA_ARGS__); \
-} while (0)
-#else
-#define AGP_DPF(fmt, ...) do {} while (0)
-#endif
-
-#include "agp_if.h"
-
-/*
- * Data structure to describe an AGP memory allocation.
- */
-TAILQ_HEAD(agp_memory_list, agp_memory);
-struct agp_memory {
- TAILQ_ENTRY(agp_memory) am_link; /* wiring for the tailq */
- int am_id; /* unique id for block */
- vm_size_t am_size; /* number of bytes allocated */
- int am_type; /* chipset specific type */
- struct vm_object *am_obj; /* VM object owning pages */
- vm_offset_t am_physical; /* bogus hack for i810 */
- vm_offset_t am_offset; /* page offset if bound */
- int am_is_bound; /* non-zero if bound */
-};
-
-/*
- * All chipset drivers must have this at the start of their softc.
- */
-struct agp_softc {
- struct resource *as_aperture; /* location of aperture */
- int as_aperture_rid;
- u_int32_t as_maxmem; /* allocation upper bound */
- u_int32_t as_allocated; /* amount allocated */
- enum agp_acquire_state as_state;
- struct agp_memory_list as_memory; /* list of allocated memory */
- int as_nextid; /* next memory block id */
- int as_isopen; /* user device is open */
- struct cdev *as_devnode; /* from make_dev */
- struct cdev *as_devalias;
- struct mtx as_lock; /* lock for access to GATT */
-};
-
-struct agp_gatt {
- u_int32_t ag_entries;
- u_int32_t *ag_virtual;
- vm_offset_t ag_physical;
-};
-
-u_int8_t agp_find_caps(device_t dev);
-struct agp_gatt *agp_alloc_gatt(device_t dev);
-void agp_set_aperture_resource(device_t dev, int rid);
-void agp_free_cdev(device_t dev);
-void agp_free_gatt(struct agp_gatt *gatt);
-void agp_free_res(device_t dev);
-int agp_generic_attach(device_t dev);
-int agp_generic_detach(device_t dev);
-u_int32_t agp_generic_get_aperture(device_t dev);
-int agp_generic_set_aperture(device_t dev,
- u_int32_t aperture);
-int agp_generic_enable(device_t dev, u_int32_t mode);
-struct agp_memory *agp_generic_alloc_memory(device_t dev, int type,
- vm_size_t size);
-int agp_generic_free_memory(device_t dev,
- struct agp_memory *mem);
-int agp_generic_bind_memory(device_t dev,
- struct agp_memory *mem,
- vm_offset_t offset);
-int agp_generic_unbind_memory(device_t dev,
- struct agp_memory *mem);
-
-#endif /* !_PCI_AGPPRIV_H_ */
diff --git a/sys/dev/drm2/drmP.h b/sys/dev/drm2/drmP.h
--- a/sys/dev/drm2/drmP.h
+++ b/sys/dev/drm2/drmP.h
@@ -87,7 +87,6 @@
#include <sys/rman.h>
#include <sys/memrange.h>
#include <dev/agp/agpvar.h>
-#include <sys/agpio.h>
#include <sys/mutex.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
diff --git a/sys/dev/drm2/drm_os_freebsd.c b/sys/dev/drm2/drm_os_freebsd.c
--- a/sys/dev/drm2/drm_os_freebsd.c
+++ b/sys/dev/drm2/drm_os_freebsd.c
@@ -2,7 +2,6 @@
#include <sys/cdefs.h>
#include <dev/drm2/drmP.h>
-#include <dev/agp/agpreg.h>
#include <dev/pci/pcireg.h>
MALLOC_DEFINE(DRM_MEM_DMA, "drm_dma", "DRM DMA Data Structures");
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -181,8 +181,6 @@
device vt_vga
device vt_vbefb
-device agp # support several AGP chipsets
-
# CardBus bridge support
device cbb # CardBus (yenta) bridge
device cardbus # CardBus (32-bit) bus
diff --git a/sys/i386/conf/MINIMAL b/sys/i386/conf/MINIMAL
--- a/sys/i386/conf/MINIMAL
+++ b/sys/i386/conf/MINIMAL
@@ -115,8 +115,6 @@
device vt_efifb
device vt_vbefb
-device agp # support several AGP chipsets
-
# Serial (COM) ports
device uart # Generic UART driver
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -26,7 +26,6 @@
ae \
${_aesni} \
age \
- ${_agp} \
ahci \
aic7xxx \
alc \
@@ -719,7 +718,6 @@
.endif
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
-_agp= agp
.if ${MACHINE_CPUARCH} == "i386" || !empty(COMPAT_FREEBSD32_ENABLED)
_aout= aout
.endif
@@ -881,7 +879,6 @@
.if ${MACHINE_CPUARCH} == "powerpc"
_aacraid= aacraid
-_agp= agp
_an= an
_cardbus= cardbus
_cbb= cbb
diff --git a/sys/modules/agp/Makefile b/sys/modules/agp/Makefile
deleted file mode 100644
--- a/sys/modules/agp/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-.PATH: ${SRCTOP}/sys/dev/agp
-
-KMOD= agp
-SRCS= agp.c agp_if.c
-.if ${MACHINE_CPUARCH} == "i386"
-SRCS+= agp_i810.c agp_intel.c agp_via.c agp_sis.c agp_ali.c agp_amd.c \
- agp_nvidia.c agp_ati.c
-.endif
-.if ${MACHINE} == "i386"
-SRCS+= agp_amd64.c
-.endif
-.if ${MACHINE_CPUARCH} == "amd64"
-SRCS+= agp_amd64.c agp_i810.c agp_via.c
-.endif
-.if ${MACHINE_CPUARCH} == "powerpc"
-SRCS+= agp_apple.c
-.endif
-SRCS+= device_if.h bus_if.h agp_if.h pci_if.h
-SRCS+= opt_agp.h
-
-EXPORT_SYMS= agp_find_device \
- agp_state \
- agp_acquire \
- agp_release \
- agp_enable \
- agp_alloc_memory \
- agp_free_memory \
- agp_bind_memory \
- agp_unbind_memory \
- agp_memory_info
-
-
-.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
-EXPORT_SYMS+= intel_gtt_clear_range \
- intel_gtt_insert_pages \
- intel_gtt_install_pte \
- intel_gtt_get \
- intel_gtt_chipset_flush \
- intel_gtt_unmap_memory \
- intel_gtt_map_memory \
- intel_gtt_insert_sg_entries \
- intel_gtt_get_bridge_device
-.endif
-
-.include <bsd.kmod.mk>
diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC
--- a/sys/powerpc/conf/GENERIC
+++ b/sys/powerpc/conf/GENERIC
@@ -109,7 +109,6 @@
# Standard busses
device pci
options PCI_HP # PCI-Express native HotPlug
-device agp
# ATA controllers
device ahci # AHCI-compatible SATA controllers
diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64
--- a/sys/powerpc/conf/GENERIC64
+++ b/sys/powerpc/conf/GENERIC64
@@ -119,7 +119,6 @@
# Standard busses
device pci
options PCI_HP # PCI-Express native HotPlug
-device agp
options COMPAT_LINUXKPI
diff --git a/sys/powerpc/conf/GENERIC64LE b/sys/powerpc/conf/GENERIC64LE
--- a/sys/powerpc/conf/GENERIC64LE
+++ b/sys/powerpc/conf/GENERIC64LE
@@ -115,7 +115,6 @@
# Standard busses
device pci
options PCI_HP # PCI-Express native HotPlug
-device agp
options COMPAT_LINUXKPI
diff --git a/sys/powerpc/conf/NOTES b/sys/powerpc/conf/NOTES
--- a/sys/powerpc/conf/NOTES
+++ b/sys/powerpc/conf/NOTES
@@ -48,9 +48,6 @@
# The cpufreq(4) driver provides support for CPU frequency control
device cpufreq
-# Standard busses
-device agp
-
device glc # Sony Playstation 3 Ethernet
device kiic # Apple Keywest I2C Controller
device ofwd # Open Firmware disks
diff --git a/sys/x86/conf/NOTES b/sys/x86/conf/NOTES
--- a/sys/x86/conf/NOTES
+++ b/sys/x86/conf/NOTES
@@ -135,13 +135,6 @@
options MAXMEM=(128*1024)
#options BROKEN_KEYBOARD_RESET
-#
-# AGP GART support
-device agp
-
-# AGP debugging.
-options AGP_DEBUG
-
#
# ACPI support using the Intel ACPI Component Architecture reference
# implementation.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, May 14, 1:44 PM (3 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33042019
Default Alt Text
D46543.diff (212 KB)
Attached To
Mode
D46543: agp: Remove
Attached
Detach File
Event Timeline
Log In to Comment