xref: /freebsd/sys/dev/agp/agp_if.m (revision a64729f5077d77e13b9497cb33ecb3c82e606ee8)
1#-
2# Copyright (c) 2000 Doug Rabson
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26#
27
28#include <sys/bus.h>
29
30#
31# The AGP interface is used internally to the agp driver to isolate the
32# differences between various AGP chipsets into chipset mini drivers. It
33# should not be used outside the AGP driver. The kernel api for accessing
34# AGP functionality is described in <dev/agp/agpvar.h>
35#
36INTERFACE agp;
37
38CODE {
39	static int
40	null_agp_chipset_flush(device_t dev)
41	{
42		return (ENXIO);
43	}
44};
45
46#
47# Return the current aperture size.
48#
49METHOD u_int32_t get_aperture {
50	device_t	dev;
51};
52
53#
54# Set the size of the aperture. Return EINVAL on error or 0 on success.
55#
56METHOD int set_aperture {
57	device_t	dev;
58	u_int32_t	aperture;
59};
60
61#
62# Bind a single page in the AGP aperture to a given physical address.
63# The offset is a byte offset within the aperture which must be
64# aligned to an AGP page boundary.
65#
66METHOD int bind_page {
67	device_t	dev;
68	vm_offset_t	offset;
69	vm_offset_t	physical;
70};
71
72#
73# Unbind a single page in the AGP aperture.
74#
75METHOD int unbind_page {
76	device_t	dev;
77	vm_offset_t	offset;
78};
79
80#
81# Flush the GATT TLB. This is used after a call to bind_page to
82# ensure that any mappings cached in the chipset are discarded.
83#
84METHOD void flush_tlb {
85	device_t	dev;
86};
87
88#
89# Enable the agp hardware with the relavent mode. The mode bits are
90# defined in <dev/agp/agpreg.h>
91#
92METHOD int enable {
93	device_t	dev;
94	u_int32_t	mode;
95};
96
97#
98# Allocate memory of a given type. The type is a chipset-specific
99# code which is used by certain integrated agp graphics chips
100# (basically just the i810 for now) to access special features of
101# the chipset. An opaque handle representing the memory region is
102# returned and can be used as an argument to free_memory, bind_memory
103# and unbind_memory.
104#
105# The size is specified in bytes but must be a multiple of the AGP
106# page size.
107#
108METHOD struct agp_memory * alloc_memory {
109	device_t	dev;
110	int		type;
111	vm_size_t	size;
112};
113
114#
115# Free a memory region previously allocated with alloc_memory. Return
116# EBUSY if the memory is bound.
117#
118METHOD int free_memory {
119	device_t	dev;
120	struct agp_memory *mem;
121};
122
123#
124# Bind a memory region to a specific byte offset within the chipset's
125# AGP aperture. This effectively defines a range of contiguous
126# physical address which alias the (possibly uncontiguous) pages in
127# the memory region.
128#
129METHOD int bind_memory {
130	device_t	dev;
131	struct agp_memory *mem;
132	vm_offset_t	offset;
133};
134
135#
136# Unbind a memory region bound with bind_memory.
137#
138METHOD int unbind_memory {
139	device_t	dev;
140	struct agp_memory *handle;
141};
142
143METHOD int chipset_flush {
144	device_t	dev;
145} DEFAULT null_agp_chipset_flush;
146