1 /*-
2 * Copyright (c) 2014 Marcel Moolenaar
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 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include <sys/cdefs.h>
28 #include <sys/types.h>
29 #include <errno.h>
30
31 #include "bus.h"
32 #include "busdma.h"
33 #include "libbus.h"
34
35 int16_t
bus_read_1(int rid,long ofs)36 bus_read_1(int rid, long ofs)
37 {
38 uint8_t val;
39
40 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val);
41 }
42
43 int32_t
bus_read_2(int rid,long ofs)44 bus_read_2(int rid, long ofs)
45 {
46 uint16_t val;
47
48 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val);
49 }
50
51 int64_t
bus_read_4(int rid,long ofs)52 bus_read_4(int rid, long ofs)
53 {
54 uint32_t val;
55
56 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int64_t)val);
57 }
58
59 int
bus_write_1(int rid,long ofs,uint8_t val)60 bus_write_1(int rid, long ofs, uint8_t val)
61 {
62
63 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
64 }
65
66 int
bus_write_2(int rid,long ofs,uint16_t val)67 bus_write_2(int rid, long ofs, uint16_t val)
68 {
69
70 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
71 }
72
73 int
bus_write_4(int rid,long ofs,uint32_t val)74 bus_write_4(int rid, long ofs, uint32_t val)
75 {
76
77 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
78 }
79
80 int
bus_map(const char * dev,const char * resource)81 bus_map(const char *dev, const char *resource)
82 {
83
84 return (bs_map(dev, resource));
85 }
86
87 int
bus_unmap(int rid)88 bus_unmap(int rid)
89 {
90
91 return ((!bs_unmap(rid)) ? errno : 0);
92 }
93
94 int
bus_subregion(int rid,long ofs,long sz)95 bus_subregion(int rid, long ofs, long sz)
96 {
97
98 return (bs_subregion(rid, ofs, sz));
99 }
100
101 int
busdma_tag_create(const char * dev,bus_addr_t align,bus_addr_t bndry,bus_addr_t maxaddr,bus_size_t maxsz,u_int nsegs,bus_size_t maxsegsz,u_int datarate,u_int flags,busdma_tag_t * out_p)102 busdma_tag_create(const char *dev, bus_addr_t align, bus_addr_t bndry,
103 bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz,
104 u_int datarate, u_int flags, busdma_tag_t *out_p)
105 {
106 int res;
107
108 res = bd_tag_create(dev, align, bndry, maxaddr, maxsz, nsegs, maxsegsz,
109 datarate, flags);
110 if (res == -1)
111 return (errno);
112 *out_p = res;
113 return (0);
114 }
115
116 int
busdma_tag_derive(busdma_tag_t tag,bus_addr_t align,bus_addr_t bndry,bus_addr_t maxaddr,bus_size_t maxsz,u_int nsegs,bus_size_t maxsegsz,u_int datarate,u_int flags,busdma_tag_t * out_p)117 busdma_tag_derive(busdma_tag_t tag, bus_addr_t align, bus_addr_t bndry,
118 bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz,
119 u_int datarate, u_int flags, busdma_tag_t *out_p)
120 {
121 int res;
122
123 res = bd_tag_derive(tag, align, bndry, maxaddr, maxsz, nsegs, maxsegsz,
124 datarate, flags);
125 if (res == -1)
126 return (errno);
127 *out_p = res;
128 return (0);
129 }
130
131 int
busdma_tag_destroy(busdma_tag_t tag)132 busdma_tag_destroy(busdma_tag_t tag)
133 {
134
135 return (bd_tag_destroy(tag));
136 }
137
138 int
busdma_mem_alloc(busdma_tag_t tag,u_int flags,busdma_md_t * out_p)139 busdma_mem_alloc(busdma_tag_t tag, u_int flags, busdma_md_t *out_p)
140 {
141 int res;
142
143 res = bd_mem_alloc(tag, flags);
144 if (res == -1)
145 return (errno);
146 *out_p = res;
147 return (0);
148 }
149
150 int
busdma_mem_free(busdma_md_t md)151 busdma_mem_free(busdma_md_t md)
152 {
153
154 return (bd_mem_free(md));
155 }
156
157 int
busdma_md_create(busdma_tag_t tag,u_int flags,busdma_md_t * out_p)158 busdma_md_create(busdma_tag_t tag, u_int flags, busdma_md_t *out_p)
159 {
160 int res;
161
162 res = bd_md_create(tag, flags);
163 if (res == -1)
164 return (errno);
165 *out_p = res;
166 return (0);
167 }
168
169 int
busdma_md_destroy(busdma_md_t md)170 busdma_md_destroy(busdma_md_t md)
171 {
172
173 return (bd_md_destroy(md));
174 }
175
176 int
busdma_md_load(busdma_md_t md,void * buf,size_t len,u_int flags)177 busdma_md_load(busdma_md_t md, void *buf, size_t len, u_int flags)
178 {
179
180 return (bd_md_load(md, buf, len, flags));
181 }
182
183 int
busdma_md_unload(busdma_md_t md)184 busdma_md_unload(busdma_md_t md)
185 {
186
187 return (bd_md_unload(md));
188 }
189
190 busdma_seg_t
busdma_md_first_seg(busdma_md_t md,int space)191 busdma_md_first_seg(busdma_md_t md, int space)
192 {
193 busdma_seg_t seg;
194
195 seg = bd_md_first_seg(md, space);
196 return (seg);
197 }
198
199 busdma_seg_t
busdma_md_next_seg(busdma_md_t md,busdma_seg_t seg)200 busdma_md_next_seg(busdma_md_t md, busdma_seg_t seg)
201 {
202
203 seg = bd_md_next_seg(md, seg);
204 return (seg);
205 }
206
207 bus_addr_t
busdma_seg_get_addr(busdma_seg_t seg)208 busdma_seg_get_addr(busdma_seg_t seg)
209 {
210 u_long addr;
211 int error;
212
213 error = bd_seg_get_addr(seg, &addr);
214 return ((error) ? ~0UL : addr);
215 }
216
217 bus_size_t
busdma_seg_get_size(busdma_seg_t seg)218 busdma_seg_get_size(busdma_seg_t seg)
219 {
220 u_long size;
221 int error;
222
223 error = bd_seg_get_size(seg, &size);
224 return ((error) ? ~0UL : size);
225 }
226
227 int
busdma_sync(busdma_md_t md,int op)228 busdma_sync(busdma_md_t md, int op)
229 {
230
231 return (bd_sync(md, op, 0UL, ~0UL));
232 }
233
234 int
busdma_sync_range(busdma_md_t md,int op,bus_size_t ofs,bus_size_t len)235 busdma_sync_range(busdma_md_t md, int op, bus_size_t ofs, bus_size_t len)
236 {
237
238 return (bd_sync(md, op, ofs, len));
239 }
240