AGP(4)                  NetBSD Kernel Interfaces 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 graph-
     ics 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 struc-
             ture 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   */
                     paddr_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 per-
     forming 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.

NetBSD 5.0_STABLE             September 11, 2001             NetBSD 5.0_STABLE
