Page MenuHomeFreeBSD

D46543.id142967.diff
No OneTemporary

D46543.id142967.diff

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

Mime Type
text/plain
Expires
Fri, May 15, 8:13 AM (18 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33042019
Default Alt Text
D46543.id142967.diff (212 KB)

Event Timeline