Line data Source code
1 : /* $OpenBSD: agp_machdep.c,v 1.14 2015/03/14 03:38:46 jsg Exp $ */
2 :
3 : /*
4 : * Copyright (c) 2008 - 2009 Owain G. Ainsworth <oga@openbsd.org>
5 : *
6 : * Permission to use, copy, modify, and distribute this software for any
7 : * purpose with or without fee is hereby granted, provided that the above
8 : * copyright notice and this permission notice appear in all copies.
9 : *
10 : * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 : * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 : * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 : * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 : * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 : * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 : * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 : */
18 : /*
19 : * Copyright (c) 2002 Michael Shalayeff
20 : * All rights reserved.
21 : *
22 : * Redistribution and use in source and binary forms, with or without
23 : * modification, are permitted provided that the following conditions
24 : * are met:
25 : * 1. Redistributions of source code must retain the above copyright
26 : * notice, this list of conditions and the following disclaimer.
27 : * 2. Redistributions in binary form must reproduce the above copyright
28 : * notice, this list of conditions and the following disclaimer in the
29 : * documentation and/or other materials provided with the distribution.
30 : *
31 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
32 : * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33 : * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
34 : * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
35 : * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36 : * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
37 : * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 : * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
41 : * THE POSSIBILITY OF SUCH DAMAGE.
42 : */
43 :
44 : #include <sys/param.h>
45 : #include <sys/systm.h>
46 : #include <sys/malloc.h>
47 : #include <sys/rwlock.h>
48 :
49 : #include <dev/pci/pcivar.h>
50 : #include <dev/pci/pcireg.h>
51 : #include <dev/pci/pcidevs.h>
52 :
53 : #include <uvm/uvm_extern.h>
54 :
55 : #include <machine/cpufunc.h>
56 : #include <machine/bus.h>
57 : #include <machine/pmap.h>
58 :
59 : void
60 0 : agp_flush_cache(void)
61 : {
62 0 : wbinvd();
63 0 : }
64 :
65 : void
66 0 : agp_flush_cache_range(vaddr_t va, vsize_t sz)
67 : {
68 0 : pmap_flush_cache(va, sz);
69 0 : }
70 :
71 : struct agp_map {
72 : bus_space_tag_t bst;
73 : bus_space_handle_t bsh;
74 : bus_size_t size;
75 : };
76 :
77 : int
78 0 : agp_init_map(bus_space_tag_t tag, bus_addr_t address, bus_size_t size,
79 : int flags, struct agp_map **mapp)
80 : {
81 : struct agp_map *map;
82 : int err;
83 :
84 0 : map = malloc(sizeof(*map), M_AGP, M_WAITOK | M_CANFAIL);
85 0 : if (map == NULL)
86 0 : return (ENOMEM);
87 :
88 0 : map->bst = tag;
89 0 : map->size = size;
90 :
91 0 : if ((err = bus_space_map(tag, address, size, flags, &map->bsh)) != 0) {
92 0 : free(map, M_AGP, sizeof(*map));
93 0 : return (err);
94 : }
95 0 : *mapp = map;
96 0 : return (0);
97 0 : }
98 :
99 : void
100 0 : agp_destroy_map(struct agp_map *map)
101 : {
102 0 : bus_space_unmap(map->bst, map->bsh, map->size);
103 0 : free(map, M_AGP, sizeof(*map));
104 0 : }
105 :
106 :
107 : int
108 0 : agp_map_subregion(struct agp_map *map, bus_size_t offset, bus_size_t size,
109 : bus_space_handle_t *bshp)
110 : {
111 0 : return (bus_space_subregion(map->bst, map->bsh, offset, size, bshp));
112 : }
113 :
114 : void
115 0 : agp_unmap_subregion(struct agp_map *map, bus_space_handle_t bsh,
116 : bus_size_t size)
117 : {
118 : /* subregion doesn't need unmapping, do nothing */
119 0 : }
120 :
121 : void
122 0 : agp_map_atomic(struct agp_map *map, bus_size_t offset,
123 : bus_space_handle_t *bshp)
124 : {
125 0 : agp_map_subregion(map, offset, PAGE_SIZE, bshp);
126 0 : }
127 :
128 : void
129 0 : agp_unmap_atomic(struct agp_map *map, bus_space_handle_t bsh)
130 : {
131 : /* subregion doesn't need unmapping, do nothing */
132 0 : }
|