xref: /openbsd/sys/dev/pci/agpvar.h (revision 274d7c50)
1 /*	$OpenBSD: agpvar.h,v 1.33 2015/12/19 16:07:20 kettenis Exp $	*/
2 /*	$NetBSD: agpvar.h,v 1.4 2001/10/01 21:54:48 fvdl Exp $	*/
3 
4 /*-
5  * Copyright (c) 2000 Doug Rabson
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *	$FreeBSD: src/sys/pci/agppriv.h,v 1.3 2000/07/12 10:13:04 dfr Exp $
30  */
31 
32 #ifndef _PCI_AGPVAR_H_
33 #define _PCI_AGPVAR_H_
34 
35 /* #define	AGP_DEBUG */
36 #ifdef AGP_DEBUG
37 #define AGP_DPF(fmt, arg...) do { printf("agp: " fmt ,##arg); } while (0)
38 #else
39 #define AGP_DPF(fmt, arg...) do {} while (0)
40 #endif
41 
42 #define AGPUNIT(x)	minor(x)
43 
44 struct agp_attach_args {
45 	char			*aa_busname;
46 	struct pci_attach_args	*aa_pa;
47 };
48 
49 struct agpbus_attach_args {
50 	char				*aa_busname; /*so pci doesn't conflict*/
51         struct pci_attach_args		*aa_pa;
52 	const struct agp_methods	*aa_methods;
53 	bus_addr_t			 aa_apaddr;
54 	bus_size_t			 aa_apsize;
55 };
56 
57 enum agp_acquire_state {
58 	AGP_ACQUIRE_FREE,
59 	AGP_ACQUIRE_USER,
60 	AGP_ACQUIRE_KERNEL
61 };
62 
63 /*
64  * This structure is used to query the state of the AGP system.
65  */
66 struct agp_info {
67 	u_int32_t       ai_mode;
68 	bus_addr_t      ai_aperture_base;
69 	bus_size_t      ai_aperture_size;
70 	vsize_t         ai_memory_allowed;
71 	vsize_t         ai_memory_used;
72 	u_int32_t       ai_devid;
73 };
74 
75 struct agp_memory_info {
76         vsize_t         ami_size;       /* size in bytes */
77         bus_addr_t      ami_physical;   /* bogus hack for i810 */
78         off_t           ami_offset;     /* page offset if bound */
79         int             ami_is_bound;   /* non-zero if bound */
80 };
81 
82 struct agp_methods {
83 	void	(*bind_page)(void *, bus_addr_t, paddr_t, int);
84 	void	(*unbind_page)(void *, bus_addr_t);
85 	void	(*flush_tlb)(void *);
86 	int	(*enable)(void *, u_int32_t mode);
87 };
88 
89 /*
90  * All chipset drivers must have this at the start of their softc.
91  */
92 struct agp_softc {
93 	struct device			 sc_dev;
94 
95 	const struct agp_methods 	*sc_methods;	/* callbacks */
96 	void				*sc_chipc;	/* chipset softc */
97 
98 	bus_dma_tag_t			 sc_dmat;
99 	bus_space_tag_t			 sc_memt;
100 	pci_chipset_tag_t		 sc_pc;
101 	pcitag_t			 sc_pcitag;
102 	bus_addr_t			 sc_apaddr;
103 	bus_size_t			 sc_apsize;
104 	uint32_t			 sc_stolen_entries;
105 	pcireg_t			 sc_id;
106 
107 	int				 sc_opened;
108 	int				 sc_capoff;
109 	int				 sc_nextid;	/* next mem block id */
110 	enum agp_acquire_state		 sc_state;
111 
112 	u_int32_t			 sc_maxmem;	/* mem upper bound */
113 	u_int32_t			 sc_allocated;	/* amount allocated */
114 };
115 
116 struct agp_gatt {
117 	u_int32_t	ag_entries;
118 	u_int32_t	*ag_virtual;
119 	bus_addr_t	ag_physical;
120 	bus_dmamap_t	ag_dmamap;
121 	bus_dma_segment_t ag_dmaseg;
122 	size_t		ag_size;
123 };
124 
125 struct agp_map;
126 
127 /*
128  * Functions private to the AGP code.
129  */
130 struct device	*agp_attach_bus(struct pci_attach_args *,
131 		     const struct agp_methods *, bus_addr_t, bus_size_t,
132 		     struct device *);
133 struct agp_gatt *
134 	agp_alloc_gatt(bus_dma_tag_t, u_int32_t);
135 void	agp_free_gatt(bus_dma_tag_t, struct agp_gatt *);
136 void	agp_flush_cache(void);
137 void	agp_flush_cache_range(vaddr_t, vsize_t);
138 int	agp_generic_enable(struct agp_softc *, u_int32_t);
139 int	agp_init_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, struct
140 	    agp_map **);
141 void	agp_destroy_map(struct agp_map *);
142 int	agp_map_subregion(struct agp_map *, bus_size_t, bus_size_t,
143 	    bus_space_handle_t *);
144 void	agp_unmap_subregion(struct agp_map *, bus_space_handle_t,
145 	    bus_size_t);
146 void	agp_map_atomic(struct agp_map *, bus_size_t, bus_space_handle_t *);
147 void	agp_unmap_atomic(struct agp_map *, bus_space_handle_t);
148 
149 int	agp_alloc_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t *,
150 	    bus_addr_t *, bus_dma_segment_t *);
151 void	agp_free_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t,
152 	    bus_dma_segment_t *);
153 int	agpdev_print(void *, const char *);
154 int	agpbus_probe(struct agp_attach_args *aa);
155 
156 paddr_t	agp_mmap(struct agp_softc *, off_t, int);
157 
158 /*
159  * Kernel API
160  */
161 /*
162  * Find the AGP device and return it.
163  */
164 void	*agp_find_device(int);
165 
166 /*
167  * Return the current owner of the AGP chipset.
168  */
169 enum	 agp_acquire_state agp_state(void *);
170 
171 /*
172  * Query the state of the AGP system.
173  */
174 void	 agp_get_info(void *, struct agp_info *);
175 
176 /*
177  * Acquire the AGP chipset for use by the kernel. Returns EBUSY if the
178  * AGP chipset is already acquired by another user.
179  */
180 int	 agp_acquire(void *);
181 
182 /*
183  * Release the AGP chipset.
184  */
185 int	 agp_release(void *);
186 
187 /*
188  * Enable the agp hardware with the relavent mode. The mode bits are
189  * defined in <dev/pci/agpreg.h>
190  */
191 int	 agp_enable(void *, u_int32_t);
192 
193 /*
194  * Retrieve information about a memory block allocated with
195  * agp_alloc_memory().
196  */
197 void	 agp_memory_info(void *, void *, struct agp_memory_info *);
198 
199 #endif /* !_PCI_AGPVAR_H_ */
200