1 /* $OpenBSD: agpvar.h,v 1.16 2009/04/20 01:28:45 oga 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 #include <sys/rwlock.h> 36 37 /* #define AGP_DEBUG */ 38 #ifdef AGP_DEBUG 39 #define AGP_DPF(fmt, arg...) do { printf("agp: " fmt ,##arg); } while (0) 40 #else 41 #define AGP_DPF(fmt, arg...) do {} while (0) 42 #endif 43 44 #define AGPUNIT(x) minor(x) 45 46 struct agp_attach_args { 47 char *aa_busname; 48 struct pci_attach_args *aa_pa; 49 }; 50 51 struct agpbus_attach_args { 52 char *aa_busname; /*so pci doesn't conflict*/ 53 struct pci_attach_args *aa_pa; 54 const struct agp_methods *aa_methods; 55 int aa_bar; 56 pcireg_t aa_type; 57 }; 58 59 enum agp_acquire_state { 60 AGP_ACQUIRE_FREE, 61 AGP_ACQUIRE_USER, 62 AGP_ACQUIRE_KERNEL 63 }; 64 65 /* 66 * Data structure to describe an AGP memory allocation. 67 */ 68 TAILQ_HEAD(agp_memory_list, agp_memory); 69 struct agp_memory { 70 TAILQ_ENTRY(agp_memory) am_link; /* wiring for the tailq */ 71 int am_id; /* unique id for block */ 72 vsize_t am_size; /* number of bytes allocated */ 73 int am_type; /* chipset specific type */ 74 off_t am_offset; /* page offset if bound */ 75 int am_is_bound; /* non-zero if bound */ 76 bus_addr_t am_physical; 77 bus_dmamap_t am_dmamap; 78 int am_nseg; 79 bus_dma_segment_t *am_dmaseg; 80 }; 81 82 /* 83 * This structure is used to query the state of the AGP system. 84 */ 85 struct agp_info { 86 u_int32_t ai_mode; 87 bus_addr_t ai_aperture_base; 88 bus_size_t ai_aperture_size; 89 vsize_t ai_memory_allowed; 90 vsize_t ai_memory_used; 91 u_int32_t ai_devid; 92 }; 93 94 struct agp_memory_info { 95 vsize_t ami_size; /* size in bytes */ 96 bus_addr_t ami_physical; /* bogus hack for i810 */ 97 off_t ami_offset; /* page offset if bound */ 98 int ami_is_bound; /* non-zero if bound */ 99 }; 100 101 struct agp_methods { 102 bus_size_t (*get_aperture)(void *); 103 int (*bind_page)(void *, off_t, bus_addr_t); 104 int (*unbind_page)(void *, off_t); 105 void (*flush_tlb)(void *); 106 int (*enable)(void *, u_int32_t mode); 107 struct agp_memory * 108 (*alloc_memory)(void *, int, vsize_t); 109 int (*free_memory)(void *, struct agp_memory *); 110 int (*bind_memory)(void *, struct agp_memory *, off_t); 111 int (*unbind_memory)(void *, struct agp_memory *); 112 }; 113 114 /* 115 * All chipset drivers must have this at the start of their softc. 116 */ 117 struct agp_softc { 118 struct device sc_dev; 119 120 struct agp_memory_list sc_memory; /* mem blocks */ 121 struct rwlock sc_lock; /* GATT access lock */ 122 const struct agp_methods *sc_methods; /* callbacks */ 123 void *sc_chipc; /* chipset softc */ 124 125 bus_dma_tag_t sc_dmat; 126 bus_addr_t sc_apaddr; 127 pci_chipset_tag_t sc_pc; 128 pcitag_t sc_pcitag; 129 pcireg_t sc_id; 130 131 int sc_opened; 132 int sc_capoff; 133 int sc_nextid; /* next mem block id */ 134 enum agp_acquire_state sc_state; 135 136 u_int32_t sc_maxmem; /* mem upper bound */ 137 u_int32_t sc_allocated; /* amount allocated */ 138 }; 139 140 struct agp_gatt { 141 u_int32_t ag_entries; 142 u_int32_t *ag_virtual; 143 bus_addr_t ag_physical; 144 bus_dmamap_t ag_dmamap; 145 bus_dma_segment_t ag_dmaseg; 146 size_t ag_size; 147 }; 148 149 /* 150 * Functions private to the AGP code. 151 */ 152 struct device *agp_attach_bus(struct pci_attach_args *, 153 const struct agp_methods *, int, pcireg_t, 154 struct device *); 155 int agp_map_aperture(struct pci_attach_args *, 156 struct agp_softc *, u_int32_t, u_int32_t); 157 struct agp_gatt * 158 agp_alloc_gatt(bus_dma_tag_t, u_int32_t); 159 void agp_free_gatt(bus_dma_tag_t, struct agp_gatt *); 160 void agp_flush_cache(void); 161 int agp_generic_bind_memory(struct agp_softc *, struct agp_memory *, off_t); 162 int agp_generic_unbind_memory(struct agp_softc *, struct agp_memory *); 163 164 int agp_alloc_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t *, 165 bus_addr_t *, bus_dma_segment_t *); 166 void agp_free_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t, 167 bus_dma_segment_t *); 168 int agpdev_print(void *, const char *); 169 int agpbus_probe(struct agp_attach_args *aa); 170 171 172 /* 173 * Kernel API 174 */ 175 /* 176 * Find the AGP device and return it. 177 */ 178 void *agp_find_device(int); 179 180 /* 181 * Return the current owner of the AGP chipset. 182 */ 183 enum agp_acquire_state agp_state(void *); 184 185 /* 186 * Query the state of the AGP system. 187 */ 188 void agp_get_info(void *, struct agp_info *); 189 190 /* 191 * Acquire the AGP chipset for use by the kernel. Returns EBUSY if the 192 * AGP chipset is already acquired by another user. 193 */ 194 int agp_acquire(void *); 195 196 /* 197 * Release the AGP chipset. 198 */ 199 int agp_release(void *); 200 201 /* 202 * Enable the agp hardware with the relavent mode. The mode bits are 203 * defined in <dev/pci/agpreg.h> 204 */ 205 int agp_enable(void *, u_int32_t); 206 207 /* 208 * Allocate physical memory suitable for mapping into the AGP 209 * aperture. The value returned is an opaque handle which can be 210 * passed to agp_bind(), agp_unbind() or agp_deallocate(). 211 */ 212 void *agp_alloc_memory(void *, int, vsize_t); 213 214 /* 215 * Free memory which was allocated with agp_allocate(). 216 */ 217 void agp_free_memory(void *, void *); 218 219 /* 220 * Bind memory allocated with agp_allocate() at a given offset within 221 * the AGP aperture. Returns EINVAL if the memory is already bound or 222 * the offset is not at an AGP page boundary. 223 */ 224 int agp_bind_memory(void *, void *, off_t); 225 226 /* 227 * Unbind memory from the AGP aperture. Returns EINVAL if the memory 228 * is not bound. 229 */ 230 int agp_unbind_memory(void *, void *); 231 232 /* 233 * Retrieve information about a memory block allocated with 234 * agp_alloc_memory(). 235 */ 236 void agp_memory_info(void *, void *, struct agp_memory_info *); 237 238 #endif /* !_PCI_AGPVAR_H_ */ 239