xref: /netbsd-src/sys/arch/mips/adm5120/adm5120_cfio.c (revision e265f67bc12b80326d4d602d62420d2b2b89685d)
1*e265f67bSdyoung /* $NetBSD: adm5120_cfio.c,v 1.2 2011/07/01 18:38:48 dyoung Exp $ */
2320845ddSdyoung 
3320845ddSdyoung /*-
4320845ddSdyoung  * Copyright (c) 2007 David Young.  All rights reserved.
5320845ddSdyoung  *
6320845ddSdyoung  * Redistribution and use in source and binary forms, with or
7320845ddSdyoung  * without modification, are permitted provided that the following
8320845ddSdyoung  * conditions are met:
9320845ddSdyoung  * 1. Redistributions of source code must retain the above copyright
10320845ddSdyoung  *    notice, this list of conditions and the following disclaimer.
11320845ddSdyoung  * 2. Redistributions in binary form must reproduce the above
12320845ddSdyoung  *    copyright notice, this list of conditions and the following
13320845ddSdyoung  *    disclaimer in the documentation and/or other materials provided
14320845ddSdyoung  *    with the distribution.
15320845ddSdyoung  * 3. The name of the author may not be used to endorse or promote
16320845ddSdyoung  *    products derived from this software without specific prior
17320845ddSdyoung  *    written permission.
18320845ddSdyoung  *
19320845ddSdyoung  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
20320845ddSdyoung  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21320845ddSdyoung  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22320845ddSdyoung  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR
23320845ddSdyoung  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24320845ddSdyoung  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25320845ddSdyoung  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
26320845ddSdyoung  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27320845ddSdyoung  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
28320845ddSdyoung  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29320845ddSdyoung  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30320845ddSdyoung  * OF SUCH DAMAGE.
31320845ddSdyoung  */
32320845ddSdyoung #include <sys/cdefs.h>
33*e265f67bSdyoung __KERNEL_RCSID(0, "$NetBSD: adm5120_cfio.c,v 1.2 2011/07/01 18:38:48 dyoung Exp $");
34320845ddSdyoung 
35320845ddSdyoung #include <sys/param.h>
36320845ddSdyoung #include <sys/systm.h>
37320845ddSdyoung #include <sys/device.h>
38320845ddSdyoung 
39*e265f67bSdyoung #include <sys/bus.h>
40320845ddSdyoung 
41320845ddSdyoung #include <mips/cache.h>
42320845ddSdyoung #include <mips/cpuregs.h>
43320845ddSdyoung 
44320845ddSdyoung #include <mips/adm5120/include/adm5120reg.h>
45320845ddSdyoung #include <mips/adm5120/include/adm5120var.h>
46320845ddSdyoung #include <mips/adm5120/include/adm5120_mainbusvar.h>
47320845ddSdyoung #include <mips/adm5120/include/adm5120_extiovar.h>
48320845ddSdyoung 
49320845ddSdyoung #ifdef CFIO_DEBUG
50320845ddSdyoung int cfio_debug = 1;
51320845ddSdyoung #define	CFIO_DPRINTF(__fmt, ...)		\
52320845ddSdyoung do {						\
53320845ddSdyoung 	if (cfio_debug)				\
54320845ddSdyoung 		printf((__fmt), __VA_ARGS__);	\
55320845ddSdyoung } while (/*CONSTCOND*/0)
56320845ddSdyoung #else /* !CFIO_DEBUG */
57320845ddSdyoung #define	CFIO_DPRINTF(__fmt, ...)	do { } while (/*CONSTCOND*/0)
58320845ddSdyoung #endif /* CFIO_DEBUG */
59320845ddSdyoung 
60320845ddSdyoung static struct {
61320845ddSdyoung 	bus_space_handle_t	ch_handle[2];
62320845ddSdyoung 	int			ch_inuse;
63320845ddSdyoung 	int			ch_parent;
64320845ddSdyoung } cf_handles[16];
65320845ddSdyoung 
66320845ddSdyoung static int cf_handle_alloc(int);
67320845ddSdyoung static void cf_handle_free(int);
68320845ddSdyoung static void cf_bs_unmap(void *, bus_space_handle_t, bus_size_t, int);
69320845ddSdyoung static int cf_bs_map(void *, bus_addr_t, bus_size_t, int,
70320845ddSdyoung     bus_space_handle_t *, int);
71320845ddSdyoung static int cf_bs_subregion(void *, bus_space_handle_t, bus_size_t,
72320845ddSdyoung     bus_size_t, bus_space_handle_t *);
73320845ddSdyoung static int cf_bs_translate(void *, bus_addr_t, bus_size_t, int,
74320845ddSdyoung     struct mips_bus_space_translation *);
75320845ddSdyoung static int cf_bs_get_window(void *, int, struct mips_bus_space_translation *);
76320845ddSdyoung static int cf_bs_translate(void *, bus_addr_t, bus_size_t, int,
77320845ddSdyoung     struct mips_bus_space_translation *);
78320845ddSdyoung static int cf_bs_get_window(void *, int, struct mips_bus_space_translation *);
79320845ddSdyoung static int cf_bs_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t,
80320845ddSdyoung     bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
81320845ddSdyoung static void cf_bs_free(void *, bus_space_handle_t, bus_size_t size);
82320845ddSdyoung static void *cf_bs_vaddr(void *, bus_space_handle_t);
83320845ddSdyoung static paddr_t cf_bs_mmap(void *, bus_addr_t, off_t off, int prot, int);
84320845ddSdyoung static void cf_bs_barrier(void *, bus_space_handle_t, bus_size_t,
85320845ddSdyoung     bus_size_t length, int);
86320845ddSdyoung static uint8_t cf_bs_r_1(void *, bus_space_handle_t, bus_size_t offset);
87320845ddSdyoung static void cf_bs_rm_1(void *, bus_space_handle_t, bus_size_t,
88320845ddSdyoung     uint8_t *, bus_size_t);
89320845ddSdyoung static void cf_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t val);
90320845ddSdyoung static void cf_bs_wm_1(void *, bus_space_handle_t, bus_size_t,
91320845ddSdyoung     const uint8_t *, bus_size_t);
92320845ddSdyoung static uint8_t cf_bs_rs_1(void *, bus_space_handle_t, bus_size_t offset);
93320845ddSdyoung static void cf_bs_rms_1(void *, bus_space_handle_t, bus_size_t,
94320845ddSdyoung     uint8_t *, bus_size_t);
95320845ddSdyoung static void cf_bs_ws_1(void *, bus_space_handle_t, bus_size_t, uint8_t val);
96320845ddSdyoung static void cf_bs_wms_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
97320845ddSdyoung     bus_size_t);
98320845ddSdyoung static void cf_bs_sm_1(void *, bus_space_handle_t, bus_size_t, uint8_t,
99320845ddSdyoung     bus_size_t);
100320845ddSdyoung 
101320845ddSdyoung static const struct mips_bus_space cfio_space = {
102320845ddSdyoung 	/* cookie */
103320845ddSdyoung 	.bs_cookie = NULL,
104320845ddSdyoung 
105320845ddSdyoung 	/* mapping/unmapping */
106320845ddSdyoung 	.bs_map = cf_bs_map,
107320845ddSdyoung 	.bs_unmap = cf_bs_unmap,
108320845ddSdyoung 	.bs_subregion = cf_bs_subregion,
109320845ddSdyoung 
110320845ddSdyoung 	.bs_translate = cf_bs_translate,
111320845ddSdyoung 	.bs_get_window = cf_bs_get_window,
112320845ddSdyoung 	.bs_alloc = cf_bs_alloc,
113320845ddSdyoung 	.bs_free = cf_bs_free,
114320845ddSdyoung 	.bs_vaddr = cf_bs_vaddr,
115320845ddSdyoung 	.bs_mmap = cf_bs_mmap,
116320845ddSdyoung 	.bs_barrier = cf_bs_barrier,
117320845ddSdyoung 	.bs_r_1 = cf_bs_r_1,
118320845ddSdyoung 	.bs_r_2 = NULL,
119320845ddSdyoung 	.bs_r_4 = NULL,
120320845ddSdyoung 	.bs_r_8 = NULL,
121320845ddSdyoung 	.bs_rm_1 = cf_bs_rm_1,
122320845ddSdyoung 	.bs_rm_2 = NULL,
123320845ddSdyoung 	.bs_rm_4 = NULL,
124320845ddSdyoung 	.bs_rm_8 = NULL,
125320845ddSdyoung 	.bs_rr_1 = NULL,
126320845ddSdyoung 	.bs_rr_2 = NULL,
127320845ddSdyoung 	.bs_rr_4 = NULL,
128320845ddSdyoung 	.bs_rr_8 = NULL,
129320845ddSdyoung 	.bs_w_1 = cf_bs_w_1,
130320845ddSdyoung 	.bs_w_2 = NULL,
131320845ddSdyoung 	.bs_w_4 = NULL,
132320845ddSdyoung 	.bs_w_8 = NULL,
133320845ddSdyoung 
134320845ddSdyoung 	.bs_wm_1 = cf_bs_wm_1,
135320845ddSdyoung 	.bs_wm_2 = NULL,
136320845ddSdyoung 	.bs_wm_4 = NULL,
137320845ddSdyoung 	.bs_wm_8 = NULL,
138320845ddSdyoung 
139320845ddSdyoung 	.bs_wr_1 = NULL,
140320845ddSdyoung 	.bs_wr_2 = NULL,
141320845ddSdyoung 	.bs_wr_4 = NULL,
142320845ddSdyoung 	.bs_wr_8 = NULL,
143320845ddSdyoung 
144320845ddSdyoung 	/* read (single) stream */
145320845ddSdyoung 	.bs_rs_1 = cf_bs_rs_1,
146320845ddSdyoung 	.bs_rs_2 = NULL,
147320845ddSdyoung 	.bs_rs_4 = NULL,
148320845ddSdyoung 	.bs_rs_8 = NULL,
149320845ddSdyoung 
150320845ddSdyoung 	/* read multiple stream */
151320845ddSdyoung 	.bs_rms_1 = cf_bs_rms_1,
152320845ddSdyoung 	.bs_rms_2 = NULL,
153320845ddSdyoung 	.bs_rms_4 = NULL,
154320845ddSdyoung 	.bs_rms_8 = NULL,
155320845ddSdyoung 
156320845ddSdyoung 	/* read region stream */
157320845ddSdyoung 	.bs_rrs_1 = NULL,
158320845ddSdyoung 	.bs_rrs_2 = NULL,
159320845ddSdyoung 	.bs_rrs_4 = NULL,
160320845ddSdyoung 	.bs_rrs_8 = NULL,
161320845ddSdyoung 
162320845ddSdyoung 	/* write (single) stream */
163320845ddSdyoung 	.bs_ws_1 = cf_bs_ws_1,
164320845ddSdyoung 	.bs_ws_2 = NULL,
165320845ddSdyoung 	.bs_ws_4 = NULL,
166320845ddSdyoung 	.bs_ws_8 = NULL,
167320845ddSdyoung 
168320845ddSdyoung 	/* write multiple stream */
169320845ddSdyoung 	.bs_wms_1 = cf_bs_wms_1,
170320845ddSdyoung 	.bs_wms_2 = NULL,
171320845ddSdyoung 	.bs_wms_4 = NULL,
172320845ddSdyoung 	.bs_wms_8 = NULL,
173320845ddSdyoung 
174320845ddSdyoung 	/* write region stream */
175320845ddSdyoung 	.bs_wrs_1 = NULL,
176320845ddSdyoung 	.bs_wrs_2 = NULL,
177320845ddSdyoung 	.bs_wrs_4 = NULL,
178320845ddSdyoung 	.bs_wrs_8 = NULL,
179320845ddSdyoung 
180320845ddSdyoung 	/* set multiple */
181320845ddSdyoung 	.bs_sm_1 = cf_bs_sm_1,
182320845ddSdyoung 	.bs_sm_2 = NULL,
183320845ddSdyoung 	.bs_sm_4 = NULL,
184320845ddSdyoung 	.bs_sm_8 = NULL,
185320845ddSdyoung 
186320845ddSdyoung 	/* set region */
187320845ddSdyoung 	.bs_sr_1 = NULL,
188320845ddSdyoung 	.bs_sr_2 = NULL,
189320845ddSdyoung 	.bs_sr_4 = NULL,
190320845ddSdyoung 	.bs_sr_8 = NULL,
191320845ddSdyoung 
192320845ddSdyoung 	/* copy */
193320845ddSdyoung 	.bs_c_1 = NULL,
194320845ddSdyoung 	.bs_c_2 = NULL,
195320845ddSdyoung 	.bs_c_4 = NULL,
196320845ddSdyoung 	.bs_c_8 = NULL,
197320845ddSdyoung };
198320845ddSdyoung 
199320845ddSdyoung void
cfio_bus_mem_init(bus_space_tag_t cfio,bus_space_tag_t extio)200320845ddSdyoung cfio_bus_mem_init(bus_space_tag_t cfio, bus_space_tag_t extio)
201320845ddSdyoung {
202320845ddSdyoung 	*cfio = cfio_space;
203320845ddSdyoung 	cfio->bs_cookie = (void *)extio;
204320845ddSdyoung }
205320845ddSdyoung 
206320845ddSdyoung static void
cf_bs_unmap(void * cookie,bus_space_handle_t bh,bus_size_t size,int acct)207320845ddSdyoung cf_bs_unmap(void *cookie, bus_space_handle_t bh, bus_size_t size, int acct)
208320845ddSdyoung {
209320845ddSdyoung 	KASSERT(acct == 1);
210320845ddSdyoung 	bus_space_unmap((bus_space_tag_t)cookie,
211320845ddSdyoung 	    cf_handles[bh].ch_handle[1], size);
212320845ddSdyoung 	bus_space_unmap((bus_space_tag_t)cookie,
213320845ddSdyoung 	    cf_handles[bh].ch_handle[0], size);
214320845ddSdyoung 	cf_handle_free(bh);
215320845ddSdyoung }
216320845ddSdyoung 
217320845ddSdyoung static void
cf_handle_free(int which)218320845ddSdyoung cf_handle_free(int which)
219320845ddSdyoung {
220320845ddSdyoung 	int i, parent;
221320845ddSdyoung 
222320845ddSdyoung 	KASSERT(cf_handles[which].ch_inuse);
223320845ddSdyoung 	for (i = 0; i < __arraycount(cf_handles); i++) {
224320845ddSdyoung 		for (parent = cf_handles[i].ch_parent; parent != -1;
225320845ddSdyoung 		     parent = cf_handles[parent].ch_parent) {
226320845ddSdyoung 			if (parent == which) {
227320845ddSdyoung 				CFIO_DPRINTF("%s: free %d (ancestor %d)\n",
228320845ddSdyoung 				    __func__, i, which);
229320845ddSdyoung 				cf_handles[i].ch_inuse = 0;
230320845ddSdyoung 				break;
231320845ddSdyoung 			}
232320845ddSdyoung 		}
233320845ddSdyoung 	}
234320845ddSdyoung 	cf_handles[which].ch_inuse = 0;
235320845ddSdyoung 	for (i = 0; i < __arraycount(cf_handles); i++) {
236320845ddSdyoung 		if (!cf_handles[i].ch_inuse)
237320845ddSdyoung 			cf_handles[i].ch_parent = -1;
238320845ddSdyoung 	}
239320845ddSdyoung }
240320845ddSdyoung 
241320845ddSdyoung static int
cf_handle_alloc(int parent)242320845ddSdyoung cf_handle_alloc(int parent)
243320845ddSdyoung {
244320845ddSdyoung 	int i;
245320845ddSdyoung 
246320845ddSdyoung 	for (i = 0; i < __arraycount(cf_handles) && cf_handles[i].ch_inuse; i++)
247320845ddSdyoung 		;
248320845ddSdyoung 	if (i >= __arraycount(cf_handles))
249320845ddSdyoung 		return -1;
250320845ddSdyoung 	cf_handles[i].ch_inuse = 1;
251320845ddSdyoung 	cf_handles[i].ch_parent = parent;
252320845ddSdyoung 	return i;
253320845ddSdyoung }
254320845ddSdyoung 
255320845ddSdyoung static int
cf_bs_map(void * cookie,bus_addr_t addr,bus_size_t size,int flags,bus_space_handle_t * bhp,int acct)256320845ddSdyoung cf_bs_map(void *cookie, bus_addr_t addr, bus_size_t size, int flags,
257320845ddSdyoung     bus_space_handle_t *bhp, int acct)
258320845ddSdyoung {
259320845ddSdyoung 	int bh, rc;
260320845ddSdyoung 
261320845ddSdyoung 	KASSERT(acct == 1);
262320845ddSdyoung 
263320845ddSdyoung 	if ((bh = cf_handle_alloc(-1)) == -1)
264320845ddSdyoung 		return EBUSY;
265320845ddSdyoung 
266320845ddSdyoung 	rc = bus_space_map((bus_space_tag_t)cookie,
267320845ddSdyoung 	    addr + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0, size, flags,
268320845ddSdyoung 	    &cf_handles[bh].ch_handle[1]);
269320845ddSdyoung 	if (rc != 0)
270320845ddSdyoung 		return rc;
271320845ddSdyoung 
272320845ddSdyoung 	rc = bus_space_map((bus_space_tag_t)cookie, addr, size, flags,
273320845ddSdyoung 	    &cf_handles[bh].ch_handle[0]);
274320845ddSdyoung 	if (rc != 0) {
275320845ddSdyoung 		bus_space_unmap((bus_space_tag_t)cookie,
276320845ddSdyoung 		    cf_handles[bh].ch_handle[1], size);
277320845ddSdyoung 		cf_handle_free(bh);
278320845ddSdyoung 	} else
279320845ddSdyoung 		*bhp = bh;
280320845ddSdyoung 
281320845ddSdyoung 	return rc;
282320845ddSdyoung }
283320845ddSdyoung 
284320845ddSdyoung static int
cf_bs_subregion(void * cookie,bus_space_handle_t h,bus_size_t offset,bus_size_t size,bus_space_handle_t * bhp)285320845ddSdyoung cf_bs_subregion(void *cookie, bus_space_handle_t h, bus_size_t offset,
286320845ddSdyoung     bus_size_t size, bus_space_handle_t *bhp)
287320845ddSdyoung {
288320845ddSdyoung 	int bh, rc;
289320845ddSdyoung 
290320845ddSdyoung 	if ((bh = cf_handle_alloc(h)) == -1)
291320845ddSdyoung 		return EBUSY;
292320845ddSdyoung 
293320845ddSdyoung 	rc = bus_space_subregion((bus_space_tag_t)cookie,
294320845ddSdyoung 	    cf_handles[h].ch_handle[1], offset, size,
295320845ddSdyoung 	    &cf_handles[bh].ch_handle[1]);
296320845ddSdyoung 	if (rc != 0)
297320845ddSdyoung 		return rc;
298320845ddSdyoung 
299320845ddSdyoung 	rc = bus_space_subregion((bus_space_tag_t)cookie,
300320845ddSdyoung 	    cf_handles[h].ch_handle[0], offset, size,
301320845ddSdyoung 	    &cf_handles[bh].ch_handle[0]);
302320845ddSdyoung 	if (rc != 0)
303320845ddSdyoung 		cf_handle_free(bh);
304320845ddSdyoung 	else
305320845ddSdyoung 		*bhp = bh;
306320845ddSdyoung 
307320845ddSdyoung 	return rc;
308320845ddSdyoung }
309320845ddSdyoung 
310320845ddSdyoung static int
cf_bs_translate(void * cookie,bus_addr_t addr,bus_size_t len,int flags,struct mips_bus_space_translation * mbst)311320845ddSdyoung cf_bs_translate(void *cookie, bus_addr_t addr, bus_size_t len, int flags,
312320845ddSdyoung     struct mips_bus_space_translation *mbst)
313320845ddSdyoung {
314320845ddSdyoung 	panic("%s: not implemented\n", __func__);
315320845ddSdyoung }
316320845ddSdyoung 
317320845ddSdyoung static int
cf_bs_get_window(void * cookie,int window,struct mips_bus_space_translation * mbst)318320845ddSdyoung cf_bs_get_window(void *cookie, int window,
319320845ddSdyoung 		    struct mips_bus_space_translation *mbst)
320320845ddSdyoung {
321320845ddSdyoung 	panic("%s: not implemented\n", __func__);
322320845ddSdyoung }
323320845ddSdyoung 
324320845ddSdyoung static int
cf_bs_alloc(void * cookie,bus_addr_t reg_start,bus_addr_t reg_end,bus_size_t size,bus_size_t alignment,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bhp)325320845ddSdyoung cf_bs_alloc(void *cookie, bus_addr_t reg_start,
326320845ddSdyoung     bus_addr_t reg_end, bus_size_t size, bus_size_t alignment,
327320845ddSdyoung     bus_size_t boundary, int flags, bus_addr_t *addrp,
328320845ddSdyoung     bus_space_handle_t *bhp)
329320845ddSdyoung {
330320845ddSdyoung 	bus_addr_t tmp;
331320845ddSdyoung 	int bh, rc;
332320845ddSdyoung 
333320845ddSdyoung 	if ((bh = cf_handle_alloc(-1)) == -1)
334320845ddSdyoung 		return EBUSY;
335320845ddSdyoung 
336320845ddSdyoung 	rc = bus_space_alloc((bus_space_tag_t)cookie,
337320845ddSdyoung 	    reg_start + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0,
338320845ddSdyoung 	    reg_end + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0,
339320845ddSdyoung 	    size, alignment, boundary, flags, &tmp,
340320845ddSdyoung 	    &cf_handles[bh].ch_handle[1]);
341320845ddSdyoung 	if (rc != 0)
342320845ddSdyoung 		return rc;
343320845ddSdyoung 
344320845ddSdyoung 	rc = bus_space_alloc((bus_space_tag_t)cookie, reg_start, reg_end, size,
345320845ddSdyoung 	    alignment, boundary, flags, addrp, &cf_handles[bh].ch_handle[0]);
346320845ddSdyoung 	if (rc != 0) {
347320845ddSdyoung 		bus_space_free((bus_space_tag_t)cookie,
348320845ddSdyoung 		    cf_handles[bh].ch_handle[1], size);
349320845ddSdyoung 		cf_handle_free(bh);
350320845ddSdyoung 	} else
351320845ddSdyoung 		*bhp = bh;
352320845ddSdyoung 
353320845ddSdyoung 	return rc;
354320845ddSdyoung }
355320845ddSdyoung 
356320845ddSdyoung static void
cf_bs_free(void * cookie,bus_space_handle_t bh,bus_size_t size)357320845ddSdyoung cf_bs_free(void *cookie, bus_space_handle_t bh, bus_size_t size)
358320845ddSdyoung {
359320845ddSdyoung 	bus_space_free((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0],
360320845ddSdyoung 	    size);
361320845ddSdyoung 	bus_space_free((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1],
362320845ddSdyoung 	    size);
363320845ddSdyoung 	cf_handle_free(bh);
364320845ddSdyoung }
365320845ddSdyoung 
366320845ddSdyoung static void *
cf_bs_vaddr(void * cookie,bus_space_handle_t bh)367320845ddSdyoung cf_bs_vaddr(void *cookie, bus_space_handle_t bh)
368320845ddSdyoung {
369320845ddSdyoung 	panic("%s: not implemented", __func__);
370320845ddSdyoung }
371320845ddSdyoung 
372320845ddSdyoung static paddr_t
cf_bs_mmap(void * cookie,bus_addr_t addr,off_t off,int prot,int flags)373320845ddSdyoung cf_bs_mmap(void *cookie, bus_addr_t addr, off_t off, int prot, int flags)
374320845ddSdyoung {
375320845ddSdyoung 	panic("%s: not implemented", __func__);
376320845ddSdyoung }
377320845ddSdyoung 
378320845ddSdyoung static void
cf_bs_barrier(void * cookie,bus_space_handle_t bh,bus_size_t offset,bus_size_t length,int flags)379320845ddSdyoung cf_bs_barrier(void *cookie, bus_space_handle_t bh, bus_size_t offset,
380320845ddSdyoung     bus_size_t length, int flags)
381320845ddSdyoung {
382320845ddSdyoung 	bus_space_barrier((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0],
383320845ddSdyoung 	    offset, length, flags);
384320845ddSdyoung 	bus_space_barrier((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1],
385320845ddSdyoung 	    offset, length, flags);
386320845ddSdyoung }
387320845ddSdyoung 
388320845ddSdyoung /* read (single) */
389320845ddSdyoung static uint8_t
cf_bs_r_1(void * cookie,bus_space_handle_t bh,bus_size_t offset)390320845ddSdyoung cf_bs_r_1(void *cookie, bus_space_handle_t bh, bus_size_t offset)
391320845ddSdyoung {
392320845ddSdyoung 	(void)bus_space_read_1((bus_space_tag_t)cookie,
393320845ddSdyoung 	    cf_handles[bh].ch_handle[0], offset);
394320845ddSdyoung 	return bus_space_read_1((bus_space_tag_t)cookie,
395320845ddSdyoung 	    cf_handles[bh].ch_handle[1], offset);
396320845ddSdyoung }
397320845ddSdyoung 
398320845ddSdyoung /* read multiple */
399320845ddSdyoung static void
cf_bs_rm_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,uint8_t * datap,bus_size_t count)400320845ddSdyoung cf_bs_rm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset,
401320845ddSdyoung     uint8_t *datap, bus_size_t count)
402320845ddSdyoung {
403320845ddSdyoung 	while (count-- > 0)
404320845ddSdyoung 		*datap++ = cf_bs_r_1(cookie, bh, offset);
405320845ddSdyoung }
406320845ddSdyoung 
407320845ddSdyoung /* write (single) */
408320845ddSdyoung static void
cf_bs_w_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,uint8_t val)409320845ddSdyoung cf_bs_w_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, uint8_t val)
410320845ddSdyoung {
411320845ddSdyoung 	bus_space_write_1((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0],
412320845ddSdyoung 	    offset, val);
413320845ddSdyoung 	bus_space_write_1((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1],
414320845ddSdyoung 	    offset, val);
415320845ddSdyoung }
416320845ddSdyoung 
417320845ddSdyoung /* write multiple */
418320845ddSdyoung static void
cf_bs_wm_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,const uint8_t * datap,bus_size_t count)419320845ddSdyoung cf_bs_wm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset,
420320845ddSdyoung     const uint8_t *datap, bus_size_t count)
421320845ddSdyoung {
422320845ddSdyoung 	while (count-- > 0)
423320845ddSdyoung 		cf_bs_w_1(cookie, bh, offset, *datap++);
424320845ddSdyoung }
425320845ddSdyoung 
426320845ddSdyoung /* read (single) stream */
427320845ddSdyoung static uint8_t
cf_bs_rs_1(void * cookie,bus_space_handle_t bh,bus_size_t offset)428320845ddSdyoung cf_bs_rs_1(void *cookie, bus_space_handle_t bh, bus_size_t offset)
429320845ddSdyoung {
430320845ddSdyoung 	(void)bus_space_read_stream_1((bus_space_tag_t)cookie,
431320845ddSdyoung 	    cf_handles[bh].ch_handle[0], offset);
432320845ddSdyoung 	return bus_space_read_stream_1((bus_space_tag_t)cookie,
433320845ddSdyoung 	    cf_handles[bh].ch_handle[1], offset);
434320845ddSdyoung }
435320845ddSdyoung 
436320845ddSdyoung /* read multiple stream */
437320845ddSdyoung static void
cf_bs_rms_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,uint8_t * datap,bus_size_t count)438320845ddSdyoung cf_bs_rms_1(void *cookie, bus_space_handle_t bh, bus_size_t offset,
439320845ddSdyoung     uint8_t *datap, bus_size_t count)
440320845ddSdyoung {
441320845ddSdyoung 	while (count-- > 0)
442320845ddSdyoung 		*datap++ = cf_bs_rs_1(cookie, bh, offset);
443320845ddSdyoung }
444320845ddSdyoung 
445320845ddSdyoung /* write (single) stream */
446320845ddSdyoung static void
cf_bs_ws_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,uint8_t val)447320845ddSdyoung cf_bs_ws_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, uint8_t val)
448320845ddSdyoung {
449320845ddSdyoung 	bus_space_write_stream_1((bus_space_tag_t)cookie,
450320845ddSdyoung 	    cf_handles[bh].ch_handle[0], offset, val);
451320845ddSdyoung 	bus_space_write_stream_1((bus_space_tag_t)cookie,
452320845ddSdyoung 	    cf_handles[bh].ch_handle[1], offset, val);
453320845ddSdyoung }
454320845ddSdyoung 
455320845ddSdyoung /* write multiple stream */
456320845ddSdyoung static void
cf_bs_wms_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,const uint8_t * datap,bus_size_t count)457320845ddSdyoung cf_bs_wms_1(void *cookie, bus_space_handle_t bh, bus_size_t offset,
458320845ddSdyoung     const uint8_t *datap, bus_size_t count)
459320845ddSdyoung {
460320845ddSdyoung 	while (count-- > 0)
461320845ddSdyoung 		cf_bs_ws_1(cookie, bh, offset, *datap++);
462320845ddSdyoung }
463320845ddSdyoung 
464320845ddSdyoung /* set multiple */
465320845ddSdyoung static void
cf_bs_sm_1(void * cookie,bus_space_handle_t bh,bus_size_t offset,uint8_t value,bus_size_t count)466320845ddSdyoung cf_bs_sm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset,
467320845ddSdyoung     uint8_t value, bus_size_t count)
468320845ddSdyoung {
469320845ddSdyoung 	while (count-- > 0)
470320845ddSdyoung 		cf_bs_w_1(cookie, bh, offset, value);
471320845ddSdyoung }
472