| AGP(4) | Device Drivers Manual | AGP(4) | 
agp —
agp* at pchb?
agp driver provides machine-independent support for
  the accelerated graphics port (AGP) found on many PC-based and PCI systems.
  The AGP specification was designed by Intel.
The AGP chipset is positioned between the PCI-Host bridge and the graphics accelerator to provide a high-performance dedicated graphics bus for moving large amounts of data directly from host memory to the graphics accelerator. The specification currently supports a peak bandwidth of 528 MB/s. AGP uses a Graphics Address Remapping Table (GART) to provide a physically-contiguous view of scattered pages in host memory for DMA transfers.
The agp driver supports the following
    chipsets:
The agp driver also provides an interface
    to user processes for use by X servers. A user process communicates to the
    device initially by means of
    ioctl(2) calls. The calls
    supported are:
AGPIOC_INFO
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;
    
    AGPIOC_ACQUIREAGPIOC_RELEASEAGPIOC_SETUP
typedef struct _agp_setup {
        uint32_t agp_mode;      /* mode info of bridge          */
} agp_setup;
    
    AGPIOC_ALLOCATE
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;
    
    AGPIOC_DEALLOCATEAGPIOC_BIND
typedef struct _agp_bind {
        int key;                /* tag of allocation            */
        off_t pg_start;         /* starting page to populate    */
} agp_bind;
    
    AGPIOC_UNBIND
typedef struct _agp_unbind {
        int key;                /* tag of allocation            */
        uint32_t priority;      /* priority for paging out      */
} agp_unbind;
    
    
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/agpio.h>
#include <fcntl.h>
#include <err.h>
int
main(int argc, char **argv)
{
	int fd;
	agp_info info;
	agp_allocate alloc;
	agp_setup setup;
	agp_bind bind;
	agp_unbind unbind;
	fd = open("/dev/agp0", O_RDWR);
	if (fd < 0)
		err(1, "open");
	if (ioctl(fd, AGPIOC_INFO, &info) < 0)
		err(2, "ioctl AGPIOC_INFO");
	printf("version:	%u.%u\n", info.version.major,
	    info.version.minor);
	printf("id:		%x\n", info.bridge_id);
	printf("mode:		%x\n", info.agp_mode);
	printf("base:		%x\n", info.aper_base);
	printf("size:		%uM\n", info.aper_size);
	printf("total mem:	%u\n", info.pg_total);
	printf("system mem:	%u\n", info.pg_system);
	printf("used mem:	%u\n\n", info.pg_used);
	setup.agp_mode = info.agp_mode;
	if (ioctl(fd, AGPIOC_SETUP, &setup) < 0)
		err(3, "ioctl AGPIOC_SETUP");
	if (ioctl(fd, AGPIOC_ACQUIRE, 0) < 0)
		err(3, "ioctl AGPIOC_ACQUIRE");
	alloc.type = 0;
	alloc.pg_count = 64;
	if (ioctl(fd, AGPIOC_ALLOCATE, &alloc) < 0)
		err(4, "ioctl AGPIOC_ALLOCATE");
	printf("alloc key %d, paddr %x\n", alloc.key, alloc.physical);
	if (ioctl(fd, AGPIOC_INFO, &info) < 0)
		err(5, "ioctl AGPIOC_INFO");
	bind.key = alloc.key;
	bind.pg_start = 0x1000;
	if (ioctl(fd, AGPIOC_BIND, &bind) < 0)
		err(6, "ioctl AGPIOC_BIND");
	printf("used mem now:	%u\n\n", info.pg_used);
	unbind.key = alloc.key;
	unbind.priority = 0;
	if (ioctl(fd, AGPIOC_UNBIND, &unbind) < 0)
		err(6, "ioctl AGPIOC_BIND");
	if (ioctl(fd, AGPIOC_DEALLOCATE, &alloc.key) < 0)
		err(6, "ioctl AGPIOC_DEALLOCATE");
	if (ioctl(fd, AGPIOC_RELEASE, 0) < 0)
		err(7, "ioctl AGPIOC_RELEASE");
	close(fd);
	printf("agp test successful\n");
	return 0;
}
agp driver first appeared in
  FreeBSD 4.1. It was adopted in NetBSD
  1.6.
| October 3, 2010 | NetBSD 10.0 |