11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AGPGART module version 0.99
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Jeff Hartmann
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Precision Insight, Inc.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Xi Graphics, Inc.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Permission is hereby granted, free of charge, to any person obtaining a
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * copy of this software and associated documentation files (the "Software"),
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to deal in the Software without restriction, including without limitation
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the rights to use, copy, modify, merge, publish, distribute, sublicense,
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and/or sell copies of the Software, and to permit persons to whom the
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software is furnished to do so, subject to the following conditions:
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The above copyright notice and this permission notice shall be included
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in all copies or substantial portions of the Software.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _AGP_H
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _AGP_H 1
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29168678233ca45af3f74fef60c4265fa5dd217e29Andrew Morton#include <linux/mutex.h>
3072b9760b65cbe0d24e668c34c8fefb2ba417f14bDavid Woodhouse#include <linux/agp_backend.h>
31607ca46e97a1b6594b29647d98a32d545c24bdffDavid Howells#include <uapi/linux/agpgart.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGPGART_MINOR 175
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_info {
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_version version;	/* version of the driver        */
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 bridge_id;		/* bridge vendor/device         */
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 agp_mode;		/* mode info of bridge          */
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long aper_base;/* base of aperture             */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t aper_size;	/* size of aperture             */
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_total;	/* max pages (swap + system)    */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_system;	/* max pages (system)           */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_used;		/* current pages used           */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_setup {
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 agp_mode;		/* mode info of bridge          */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The "prot" down below needs still a "sleep" flag somehow ...
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_segment {
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	off_t pg_start;		/* starting page to populate    */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_count;	/* number of pages              */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int prot;		/* prot flags for mmap          */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_segment_priv {
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	off_t pg_start;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_count;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pgprot_t prot;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_region {
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pid_t pid;		/* pid of process               */
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t seg_count;	/* number of segments           */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_segment *seg_list;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_allocate {
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int key;		/* tag of allocation            */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t pg_count;	/* number of pages              */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 type;		/* 0 == normal, other devspec   */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 physical;           /* device specific (some devices
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				 * need a phys address of the
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				 * actual page behind the gatt
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				 * table)                        */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_bind {
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int key;		/* tag of allocation            */
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	off_t pg_start;		/* starting page to populate    */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_unbind {
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int key;		/* tag of allocation            */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 priority;		/* priority for paging out      */
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_client {
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_client *next;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_client *prev;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pid_t pid;
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int num_segments;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_segment_priv **segments;
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_controller {
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_controller *next;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_controller *prev;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pid_t pid;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int num_clients;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_memory *pool;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_client *clients;
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGP_FF_ALLOW_CLIENT		0
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGP_FF_ALLOW_CONTROLLER 	1
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGP_FF_IS_CLIENT		2
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGP_FF_IS_CONTROLLER		3
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AGP_FF_IS_VALID 		4
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_file_private {
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_file_private *next;
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_file_private *prev;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pid_t my_pid;
11864b33619a30ff18c1535ee779572ecffcc4711d2Al Viro	unsigned long access_flags;	/* long req'd for set_bit --RR */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct agp_front_data {
122168678233ca45af3f74fef60c4265fa5dd217e29Andrew Morton	struct mutex agp_mutex;
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_controller *current_controller;
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_controller *controllers;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct agp_file_private *file_priv_list;
1269516b030b484fc99cf24213caf88df01f99248ddDave Airlie	bool used_by_controller;
1279516b030b484fc99cf24213caf88df01f99248ddDave Airlie	bool backend_acquired;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif				/* _AGP_H */
131