/* * AGPGART module version 0.99 * Copyright (C) 1999 Jeff Hartmann * Copyright (C) 1999 Precision Insight, Inc. * Copyright (C) 1999 Xi Graphics, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef _AGP_BACKEND_H #define _AGP_BACKEND_H 1 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define AGPGART_VERSION_MAJOR 0 #define AGPGART_VERSION_MINOR 99 enum chipset_type { NOT_SUPPORTED, INTEL_GENERIC, INTEL_LX, INTEL_BX, INTEL_GX, INTEL_I810, INTEL_I815, INTEL_I820, INTEL_I830_M, INTEL_I840, INTEL_I845, INTEL_I850, INTEL_I860, VIA_GENERIC, VIA_VP3, VIA_MVP3, VIA_MVP4, VIA_APOLLO_PRO, VIA_APOLLO_KX133, VIA_APOLLO_KT133, SIS_GENERIC, AMD_GENERIC, AMD_IRONGATE, AMD_761, AMD_762, ALI_M1541, ALI_M1621, ALI_M1631, ALI_M1632, ALI_M1641, ALI_M1647, ALI_M1651, ALI_GENERIC, SVWRKS_HE, SVWRKS_LE, SVWRKS_GENERIC }; typedef struct _agp_version { u16 major; u16 minor; } agp_version; typedef struct _agp_kern_info { agp_version version; struct pci_dev *device; enum chipset_type chipset; unsigned long mode; off_t aper_base; size_t aper_size; int max_memory; /* In pages */ int current_memory; int cant_use_aperture; unsigned long page_mask; } agp_kern_info; /* * The agp_memory structure has information * about the block of agp memory allocated. * A caller may manipulate the next and prev * pointers to link each allocated item into * a list. These pointers are ignored by the * backend. Everything else should never be * written to, but the caller may read any of * the items to detrimine the status of this * block of agp memory. * */ typedef struct _agp_memory { int key; struct _agp_memory *next; struct _agp_memory *prev; size_t page_count; int num_scratch_pages; unsigned long *memory; off_t pg_start; u32 type; u32 physical; u8 is_bound; u8 is_flushed; } agp_memory; #define AGP_NORMAL_MEMORY 0 extern void agp_free_memory(agp_memory *); /* * agp_free_memory : * * This function frees memory associated with * an agp_memory pointer. It is the only function * that can be called when the backend is not owned * by the caller. (So it can free memory on client * death.) * * It takes an agp_memory pointer as an argument. * */ extern agp_memory *agp_allocate_memory(size_t, u32); /* * agp_allocate_memory : * * This function allocates a group of pages of * a certain type. * * It takes a size_t argument of the number of pages, and * an u32 argument of the type of memory to be allocated. * Every agp bridge device will allow you to allocate * AGP_NORMAL_MEMORY which maps to physical ram. Any other * type is device dependant. * * It returns NULL whenever memory is unavailable. * */ extern void agp_copy_info(agp_kern_info *); /* * agp_copy_info : * * This function copies information about the * agp bridge device and the state of the agp * backend into an agp_kern_info pointer. * * It takes an agp_kern_info pointer as an * argument. The caller should insure that * this pointer is valid. * */ extern int agp_bind_memory(agp_memory *, off_t); /* * agp_bind_memory : * * This function binds an agp_memory structure * into the graphics aperture translation table. * * It takes an agp_memory pointer and an offset into * the graphics aperture translation table as arguments * * It returns -EINVAL if the pointer == NULL. * It returns -EBUSY if the area of the table * requested is already in use. * */ extern int agp_unbind_memory(agp_memory *); /* * agp_unbind_memory : * * This function removes an agp_memory structure * from the graphics aperture translation table. * * It takes an agp_memory pointer as an argument. * * It returns -EINVAL if this piece of agp_memory * is not currently bound to the graphics aperture * translation table or if the agp_memory * pointer == NULL * */ extern void agp_enable(u32); /* * agp_enable : * * This function initializes the agp point-to-point * connection. * * It takes an agp mode register as an argument * */ extern int agp_backend_acquire(void); /* * agp_backend_acquire : * * This Function attempts to acquire the agp * backend. * * returns -EBUSY if agp is in use, * returns 0 if the caller owns the agp backend */ extern void agp_backend_release(void); /* * agp_backend_release : * * This Function releases the lock on the agp * backend. * * The caller must insure that the graphics * aperture translation table is read for use * by another entity. (Ensure that all memory * it bound is unbound.) * */ typedef struct { void (*free_memory)(agp_memory *); agp_memory *(*allocate_memory)(size_t, u32); int (*bind_memory)(agp_memory *, off_t); int (*unbind_memory)(agp_memory *); void (*enable)(u32); int (*acquire)(void); void (*release)(void); void (*copy_info)(agp_kern_info *); } drm_agp_t; extern const drm_agp_t *drm_agp_p; /* * Interface between drm and agp code. When agp initializes, it makes * the above structure available via inter_module_register(), drm might * use it. Keith Owens 28 Oct 2000. */ #endif /* _AGP_BACKEND_H */