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