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