1ca987d46SWarner Losh /*-
2ca987d46SWarner Losh * Copyright (c) 2013 Hans Petter Selasky. All rights reserved.
3ca987d46SWarner Losh *
4ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without
5ca987d46SWarner Losh * modification, are permitted provided that the following conditions
6ca987d46SWarner Losh * are met:
7ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright
8ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer.
9ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright
10ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer in the
11ca987d46SWarner Losh * documentation and/or other materials provided with the distribution.
12ca987d46SWarner Losh *
13ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16ca987d46SWarner Losh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23ca987d46SWarner Losh * SUCH DAMAGE.
24ca987d46SWarner Losh */
25ca987d46SWarner Losh
26ca987d46SWarner Losh #include <bsd_kernel.h>
27ca987d46SWarner Losh
28ca987d46SWarner Losh struct burst {
29ca987d46SWarner Losh uint32_t dw0;
30ca987d46SWarner Losh uint32_t dw1;
31ca987d46SWarner Losh uint32_t dw2;
32ca987d46SWarner Losh uint32_t dw3;
33ca987d46SWarner Losh uint32_t dw4;
34ca987d46SWarner Losh uint32_t dw5;
35ca987d46SWarner Losh uint32_t dw6;
36ca987d46SWarner Losh uint32_t dw7;
37ca987d46SWarner Losh };
38ca987d46SWarner Losh
39ca987d46SWarner Losh int
bus_space_subregion(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)40ca987d46SWarner Losh bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
41ca987d46SWarner Losh bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
42ca987d46SWarner Losh {
43ca987d46SWarner Losh
44ca987d46SWarner Losh *nbshp = bsh + offset;
45ca987d46SWarner Losh return (0);
46ca987d46SWarner Losh }
47ca987d46SWarner Losh
48ca987d46SWarner Losh void
bus_space_read_multi_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint8_t * datap,bus_size_t count)49ca987d46SWarner Losh bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h,
50ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count)
51ca987d46SWarner Losh {
52ca987d46SWarner Losh while (count--) {
53ca987d46SWarner Losh *datap++ = bus_space_read_1(t, h, offset);
54ca987d46SWarner Losh }
55ca987d46SWarner Losh }
56ca987d46SWarner Losh
57ca987d46SWarner Losh void
bus_space_read_multi_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint16_t * datap,bus_size_t count)58ca987d46SWarner Losh bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h,
59ca987d46SWarner Losh bus_size_t offset, uint16_t *datap, bus_size_t count)
60ca987d46SWarner Losh {
61ca987d46SWarner Losh while (count--) {
62ca987d46SWarner Losh *datap++ = bus_space_read_2(t, h, offset);
63ca987d46SWarner Losh }
64ca987d46SWarner Losh }
65ca987d46SWarner Losh
66ca987d46SWarner Losh void
bus_space_read_multi_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint32_t * datap,bus_size_t count)67ca987d46SWarner Losh bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h,
68ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count)
69ca987d46SWarner Losh {
70ca987d46SWarner Losh h += offset;
71ca987d46SWarner Losh
72ca987d46SWarner Losh while (count--) {
73ca987d46SWarner Losh *datap++ = *((volatile uint32_t *)h);
74ca987d46SWarner Losh }
75ca987d46SWarner Losh }
76ca987d46SWarner Losh
77ca987d46SWarner Losh void
bus_space_write_multi_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint8_t * datap,bus_size_t count)78ca987d46SWarner Losh bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h,
79ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count)
80ca987d46SWarner Losh {
81ca987d46SWarner Losh while (count--) {
82ca987d46SWarner Losh uint8_t temp = *datap++;
83ca987d46SWarner Losh
84ca987d46SWarner Losh bus_space_write_1(t, h, offset, temp);
85ca987d46SWarner Losh }
86ca987d46SWarner Losh }
87ca987d46SWarner Losh
88ca987d46SWarner Losh void
bus_space_write_multi_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint16_t * datap,bus_size_t count)89ca987d46SWarner Losh bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h,
90ca987d46SWarner Losh bus_size_t offset, uint16_t *datap, bus_size_t count)
91ca987d46SWarner Losh {
92ca987d46SWarner Losh while (count--) {
93ca987d46SWarner Losh uint16_t temp = *datap++;
94ca987d46SWarner Losh
95ca987d46SWarner Losh bus_space_write_2(t, h, offset, temp);
96ca987d46SWarner Losh }
97ca987d46SWarner Losh }
98ca987d46SWarner Losh
99ca987d46SWarner Losh void
bus_space_write_multi_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint32_t * datap,bus_size_t count)100ca987d46SWarner Losh bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h,
101ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count)
102ca987d46SWarner Losh {
103ca987d46SWarner Losh h += offset;
104ca987d46SWarner Losh
105ca987d46SWarner Losh while (count--) {
106ca987d46SWarner Losh *((volatile uint32_t *)h) = *datap++;
107ca987d46SWarner Losh }
108ca987d46SWarner Losh }
109ca987d46SWarner Losh
110ca987d46SWarner Losh void
bus_space_write_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint8_t data)111ca987d46SWarner Losh bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h,
112ca987d46SWarner Losh bus_size_t offset, uint8_t data)
113ca987d46SWarner Losh {
114ca987d46SWarner Losh *((volatile uint8_t *)(h + offset)) = data;
115ca987d46SWarner Losh }
116ca987d46SWarner Losh
117ca987d46SWarner Losh void
bus_space_write_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint16_t data)118ca987d46SWarner Losh bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h,
119ca987d46SWarner Losh bus_size_t offset, uint16_t data)
120ca987d46SWarner Losh {
121ca987d46SWarner Losh *((volatile uint16_t *)(h + offset)) = data;
122ca987d46SWarner Losh }
123ca987d46SWarner Losh
124ca987d46SWarner Losh void
bus_space_write_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint32_t data)125ca987d46SWarner Losh bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h,
126ca987d46SWarner Losh bus_size_t offset, uint32_t data)
127ca987d46SWarner Losh {
128ca987d46SWarner Losh *((volatile uint32_t *)(h + offset)) = data;
129ca987d46SWarner Losh }
130ca987d46SWarner Losh
131ca987d46SWarner Losh uint8_t
bus_space_read_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset)132ca987d46SWarner Losh bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset)
133ca987d46SWarner Losh {
134ca987d46SWarner Losh return (*((volatile uint8_t *)(h + offset)));
135ca987d46SWarner Losh }
136ca987d46SWarner Losh
137ca987d46SWarner Losh uint16_t
bus_space_read_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset)138ca987d46SWarner Losh bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset)
139ca987d46SWarner Losh {
140ca987d46SWarner Losh return (*((volatile uint16_t *)(h + offset)));
141ca987d46SWarner Losh }
142ca987d46SWarner Losh
143ca987d46SWarner Losh uint32_t
bus_space_read_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset)144ca987d46SWarner Losh bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset)
145ca987d46SWarner Losh {
146ca987d46SWarner Losh return (*((volatile uint32_t *)(h + offset)));
147ca987d46SWarner Losh }
148ca987d46SWarner Losh
149ca987d46SWarner Losh void
bus_space_read_region_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint8_t * datap,bus_size_t count)150ca987d46SWarner Losh bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h,
151ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count)
152ca987d46SWarner Losh {
153ca987d46SWarner Losh h += offset;
154ca987d46SWarner Losh
155ca987d46SWarner Losh while (count--) {
156ca987d46SWarner Losh *datap++ = *((volatile uint8_t *)h);
157ca987d46SWarner Losh h += 1;
158ca987d46SWarner Losh }
159ca987d46SWarner Losh }
160ca987d46SWarner Losh
161ca987d46SWarner Losh void
bus_space_write_region_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint8_t * datap,bus_size_t count)162ca987d46SWarner Losh bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h,
163ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count)
164ca987d46SWarner Losh {
165ca987d46SWarner Losh h += offset;
166ca987d46SWarner Losh
167ca987d46SWarner Losh while (count--) {
168ca987d46SWarner Losh *((volatile uint8_t *)h) = *datap++;
169ca987d46SWarner Losh h += 1;
170ca987d46SWarner Losh }
171ca987d46SWarner Losh }
172ca987d46SWarner Losh
173ca987d46SWarner Losh void
bus_space_read_region_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint32_t * datap,bus_size_t count)174ca987d46SWarner Losh bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h,
175ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count)
176ca987d46SWarner Losh {
177ca987d46SWarner Losh enum { BURST = sizeof(struct burst) / 4 };
178ca987d46SWarner Losh
179ca987d46SWarner Losh h += offset;
180ca987d46SWarner Losh
181ca987d46SWarner Losh while (count >= BURST) {
182ca987d46SWarner Losh *(struct burst *)datap = *((/* volatile */ struct burst *)h);
183ca987d46SWarner Losh
184ca987d46SWarner Losh h += BURST * 4;
185ca987d46SWarner Losh datap += BURST;
186ca987d46SWarner Losh count -= BURST;
187ca987d46SWarner Losh }
188ca987d46SWarner Losh
189ca987d46SWarner Losh while (count--) {
190ca987d46SWarner Losh *datap++ = *((volatile uint32_t *)h);
191ca987d46SWarner Losh h += 4;
192ca987d46SWarner Losh }
193ca987d46SWarner Losh }
194ca987d46SWarner Losh
195ca987d46SWarner Losh void
bus_space_write_region_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t offset,uint32_t * datap,bus_size_t count)196ca987d46SWarner Losh bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h,
197ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count)
198ca987d46SWarner Losh {
199ca987d46SWarner Losh enum { BURST = sizeof(struct burst) / 4 };
200ca987d46SWarner Losh
201ca987d46SWarner Losh h += offset;
202ca987d46SWarner Losh
203ca987d46SWarner Losh while (count >= BURST) {
204ca987d46SWarner Losh *((/* volatile */ struct burst *)h) = *(struct burst *)datap;
205ca987d46SWarner Losh
206ca987d46SWarner Losh h += BURST * 4;
207ca987d46SWarner Losh datap += BURST;
208ca987d46SWarner Losh count -= BURST;
209ca987d46SWarner Losh }
210ca987d46SWarner Losh
211ca987d46SWarner Losh while (count--) {
212ca987d46SWarner Losh *((volatile uint32_t *)h) = *datap++;
213ca987d46SWarner Losh h += 4;
214ca987d46SWarner Losh }
215ca987d46SWarner Losh }
216