AGP(4) | Device Drivers Manual | AGP(4)

# NAME

`agp` — accelerated graphics port driver

# SYNOPSIS

`agp* at pchb?`

# DESCRIPTION

The `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:

- ALI M1541 host-to-AGP bridge
- AMD 751 and 761 host-to-AGP bridges
- Intel 82810, 82810-DC100, 82810E, and 82815 SVGA controllers
- SiS 5591 host-to-AGP bridge
- VIA

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`
  Get AGP information, setting the members in the agp_info structure as defined in <sys/agpio.h>:

      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_ACQUIRE`
  Acquire AGP.
`AGPIOC_RELEASE`
  Release AGP.
`AGPIOC_SETUP`
  Set up AGP, using the members in the agp_setup structure as defined in <sys/agpio.h>:

      typedef struct _agp_setup {
              uint32_t agp_mode;      /* mode info of bridge          */
      } agp_setup;

`AGPIOC_ALLOCATE`
  Allocate AGP space, using and setting the members in the agp_allocate structure as defined in <sys/agpio.h>:

      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_DEALLOCATE`
  Deallocate AGP space.
`AGPIOC_BIND`
  Bind AGP space, using the members in the agp_bind structure as defined in <sys/agpio.h>:

      typedef struct _agp_bind {
              int key;                /* tag of allocation            */
              off_t pg_start;         /* starting page to populate    */
      } agp_bind;

`AGPIOC_UNBIND`
  Unbind AGP space, using the members in the agp_unbind structure as defined in <sys/agpio.h>:

      typedef struct _agp_unbind {
              int key;                /* tag of allocation            */
              uint32_t priority;      /* priority for paging out      */
      } agp_unbind;

# FILES

/dev/agp?
  AGP GART device special files
/dev/agpgart
  AGP GART device special file

# EXAMPLES

This short code fragment is an example of opening the AGP device and performing some basic operations:

    #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;
    }

# SEE ALSO

ioctl(2), pci(4)

# HISTORY

The `agp` driver first appeared in FreeBSD 4.1. It was adopted in NetBSD 1.6.

October 3, 2010 | NetBSD 11.0