1 /* $OpenBSD: agpvar.h,v 1.20 2009/06/06 06:02:44 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 bus_addr_t aa_apaddr; 56 bus_size_t aa_apsize; 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 bus_dmamap_t am_dmamap; 72 bus_dma_segment_t *am_dmaseg; 73 bus_size_t am_size; /* number of bytes allocated */ 74 bus_size_t am_offset; /* page offset if bound */ 75 paddr_t am_physical; 76 int am_id; /* unique id for block */ 77 int am_is_bound; /* non-zero if bound */ 78 int am_nseg; 79 int am_type; /* chipset specific type */ 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 void (*bind_page)(void *, bus_addr_t, paddr_t, int); 103 void (*unbind_page)(void *, bus_addr_t); 104 void (*flush_tlb)(void *); 105 void (*dma_sync)(bus_dma_tag_t, bus_dmamap_t, bus_addr_t, 106 bus_size_t, int); 107 int (*enable)(void *, u_int32_t mode); 108 struct agp_memory * 109 (*alloc_memory)(void *, int, vsize_t); 110 int (*free_memory)(void *, struct agp_memory *); 111 int (*bind_memory)(void *, struct agp_memory *, bus_size_t); 112 int (*unbind_memory)(void *, struct agp_memory *); 113 }; 114 115 /* 116 * All chipset drivers must have this at the start of their softc. 117 */ 118 struct agp_softc { 119 struct device sc_dev; 120 121 struct agp_memory_list sc_memory; /* mem blocks */ 122 struct rwlock sc_lock; /* GATT access lock */ 123 const struct agp_methods *sc_methods; /* callbacks */ 124 void *sc_chipc; /* chipset softc */ 125 126 bus_dma_tag_t sc_dmat; 127 pci_chipset_tag_t sc_pc; 128 pcitag_t sc_pcitag; 129 bus_addr_t sc_apaddr; 130 bus_size_t sc_apsize; 131 pcireg_t sc_id; 132 133 int sc_opened; 134 int sc_capoff; 135 int sc_nextid; /* next mem block id */ 136 enum agp_acquire_state sc_state; 137 138 u_int32_t sc_maxmem; /* mem upper bound */ 139 u_int32_t sc_allocated; /* amount allocated */ 140 }; 141 142 struct agp_gatt { 143 u_int32_t ag_entries; 144 u_int32_t *ag_virtual; 145 bus_addr_t ag_physical; 146 bus_dmamap_t ag_dmamap; 147 bus_dma_segment_t ag_dmaseg; 148 size_t ag_size; 149 }; 150 151 /* 152 * Functions private to the AGP code. 153 */ 154 struct device *agp_attach_bus(struct pci_attach_args *, 155 const struct agp_methods *, bus_addr_t, bus_size_t, 156 struct device *); 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 *, 162 bus_size_t); 163 int agp_generic_unbind_memory(struct agp_softc *, struct agp_memory *); 164 165 int agp_alloc_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t *, 166 bus_addr_t *, bus_dma_segment_t *); 167 void agp_free_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t, 168 bus_dma_segment_t *); 169 int agpdev_print(void *, const char *); 170 int agpbus_probe(struct agp_attach_args *aa); 171 172 173 int agp_bus_dma_init(struct agp_softc *, bus_addr_t, bus_addr_t, 174 bus_dma_tag_t *); 175 void agp_bus_dma_destroy(struct agp_softc *, bus_dma_tag_t); 176 void agp_bus_dma_set_alignment(bus_dma_tag_t, bus_dmamap_t, 177 u_long); 178 /* 179 * Kernel API 180 */ 181 /* 182 * Find the AGP device and return it. 183 */ 184 void *agp_find_device(int); 185 186 /* 187 * Return the current owner of the AGP chipset. 188 */ 189 enum agp_acquire_state agp_state(void *); 190 191 /* 192 * Query the state of the AGP system. 193 */ 194 void agp_get_info(void *, struct agp_info *); 195 196 /* 197 * Acquire the AGP chipset for use by the kernel. Returns EBUSY if the 198 * AGP chipset is already acquired by another user. 199 */ 200 int agp_acquire(void *); 201 202 /* 203 * Release the AGP chipset. 204 */ 205 int agp_release(void *); 206 207 /* 208 * Enable the agp hardware with the relavent mode. The mode bits are 209 * defined in <dev/pci/agpreg.h> 210 */ 211 int agp_enable(void *, u_int32_t); 212 213 /* 214 * Allocate physical memory suitable for mapping into the AGP 215 * aperture. The value returned is an opaque handle which can be 216 * passed to agp_bind(), agp_unbind() or agp_deallocate(). 217 */ 218 void *agp_alloc_memory(void *, int, vsize_t); 219 220 /* 221 * Free memory which was allocated with agp_allocate(). 222 */ 223 void agp_free_memory(void *, void *); 224 225 /* 226 * Bind memory allocated with agp_allocate() at a given offset within 227 * the AGP aperture. Returns EINVAL if the memory is already bound or 228 * the offset is not at an AGP page boundary. 229 */ 230 int agp_bind_memory(void *, void *, off_t); 231 232 /* 233 * Unbind memory from the AGP aperture. Returns EINVAL if the memory 234 * is not bound. 235 */ 236 int agp_unbind_memory(void *, void *); 237 238 /* 239 * Retrieve information about a memory block allocated with 240 * agp_alloc_memory(). 241 */ 242 void agp_memory_info(void *, void *, struct agp_memory_info *); 243 244 #endif /* !_PCI_AGPVAR_H_ */ 245