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 -#include "opt_agp.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -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<> 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 - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -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 -#include -#include - -#include -#include - -/* 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 - * 852GM/855GM/865G support added by David Dawes - * - * This is generic Intel GTT handling code, morphed from the AGP - * bridge code. - */ - -#include -#if 0 -#define KTR_AGP_I810 KTR_DEV -#else -#define KTR_AGP_I810 0 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -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 - -# -# 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 -# -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 -# -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#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 - * 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 -/* - * Written using information gleaned from the - * NVIDIA nForce/nForce2 AGPGART Linux Kernel Patch. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -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<> 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#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 -#include - -#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 #include #include -#include #include #include #include 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 #include -#include #include 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 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.