1*ce993bccSskrll /* $NetBSD: armv7_generic_space.c,v 1.13 2020/10/30 18:54:36 skrll Exp $ */
21a2450ddSjmcneill
31a2450ddSjmcneill /*-
41a2450ddSjmcneill * Copyright (c) 2012 The NetBSD Foundation, Inc.
51a2450ddSjmcneill * All rights reserved.
61a2450ddSjmcneill *
71a2450ddSjmcneill * This code is derived from software contributed to The NetBSD Foundation
81a2450ddSjmcneill * by Nick Hudson
91a2450ddSjmcneill *
101a2450ddSjmcneill * Redistribution and use in source and binary forms, with or without
111a2450ddSjmcneill * modification, are permitted provided that the following conditions
121a2450ddSjmcneill * are met:
131a2450ddSjmcneill * 1. Redistributions of source code must retain the above copyright
141a2450ddSjmcneill * notice, this list of conditions and the following disclaimer.
151a2450ddSjmcneill * 2. Redistributions in binary form must reproduce the above copyright
161a2450ddSjmcneill * notice, this list of conditions and the following disclaimer in the
171a2450ddSjmcneill * documentation and/or other materials provided with the distribution.
181a2450ddSjmcneill *
191a2450ddSjmcneill * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201a2450ddSjmcneill * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211a2450ddSjmcneill * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221a2450ddSjmcneill * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231a2450ddSjmcneill * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241a2450ddSjmcneill * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251a2450ddSjmcneill * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261a2450ddSjmcneill * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271a2450ddSjmcneill * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281a2450ddSjmcneill * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291a2450ddSjmcneill * POSSIBILITY OF SUCH DAMAGE.
301a2450ddSjmcneill */
311a2450ddSjmcneill
321a2450ddSjmcneill
331a2450ddSjmcneill #include <sys/cdefs.h>
34*ce993bccSskrll __KERNEL_RCSID(0, "$NetBSD: armv7_generic_space.c,v 1.13 2020/10/30 18:54:36 skrll Exp $");
351a2450ddSjmcneill
361a2450ddSjmcneill #include <sys/param.h>
3779ef8ec5Sskrll
3879ef8ec5Sskrll #include <sys/bus.h>
391a2450ddSjmcneill #include <sys/systm.h>
401a2450ddSjmcneill
411a2450ddSjmcneill #include <uvm/uvm_extern.h>
421a2450ddSjmcneill
431a2450ddSjmcneill /* Prototypes for all the bus_space structure functions */
441a2450ddSjmcneill bs_protos(armv7_generic);
451a2450ddSjmcneill bs_protos(armv7_generic_a4x);
461a2450ddSjmcneill bs_protos(a4x);
471a2450ddSjmcneill bs_protos(bs_notimpl);
481a2450ddSjmcneill bs_protos(generic);
491a2450ddSjmcneill bs_protos(generic_armv4);
501a2450ddSjmcneill
511a2450ddSjmcneill #if __ARMEB__
521a2450ddSjmcneill #define NSWAP(n) n ## _swap
531a2450ddSjmcneill #else
541a2450ddSjmcneill #define NSWAP(n) n
551a2450ddSjmcneill #endif
561a2450ddSjmcneill
57fe33aa27Sryo __strong_alias(arm_generic_bs_tag,armv7_generic_bs_tag);
58fe33aa27Sryo __strong_alias(arm_generic_a4x_bs_tag,armv7_generic_a4x_bs_tag);
59fe33aa27Sryo
601a2450ddSjmcneill struct bus_space armv7_generic_bs_tag = {
611a2450ddSjmcneill /* cookie */
62509197b6Sryo .bs_cookie = (void *) 0,
631a2450ddSjmcneill
641a2450ddSjmcneill /* mapping/unmapping */
65509197b6Sryo .bs_map = armv7_generic_bs_map,
66509197b6Sryo .bs_unmap = armv7_generic_bs_unmap,
67509197b6Sryo .bs_subregion = armv7_generic_bs_subregion,
681a2450ddSjmcneill
691a2450ddSjmcneill /* allocation/deallocation */
70509197b6Sryo .bs_alloc = armv7_generic_bs_alloc, /* not implemented */
71509197b6Sryo .bs_free = armv7_generic_bs_free, /* not implemented */
721a2450ddSjmcneill
731a2450ddSjmcneill /* get kernel virtual address */
74509197b6Sryo .bs_vaddr = armv7_generic_bs_vaddr,
751a2450ddSjmcneill
761a2450ddSjmcneill /* mmap */
77509197b6Sryo .bs_mmap = armv7_generic_bs_mmap,
781a2450ddSjmcneill
791a2450ddSjmcneill /* barrier */
80509197b6Sryo .bs_barrier = armv7_generic_bs_barrier,
811a2450ddSjmcneill
821a2450ddSjmcneill /* read (single) */
83509197b6Sryo .bs_r_1 = generic_bs_r_1,
84509197b6Sryo .bs_r_2 = NSWAP(generic_armv4_bs_r_2),
85509197b6Sryo .bs_r_4 = NSWAP(generic_bs_r_4),
86509197b6Sryo .bs_r_8 = bs_notimpl_bs_r_8,
871a2450ddSjmcneill
881a2450ddSjmcneill /* read multiple */
89509197b6Sryo .bs_rm_1 = generic_bs_rm_1,
90509197b6Sryo .bs_rm_2 = NSWAP(generic_armv4_bs_rm_2),
91509197b6Sryo .bs_rm_4 = NSWAP(generic_bs_rm_4),
92509197b6Sryo .bs_rm_8 = bs_notimpl_bs_rm_8,
931a2450ddSjmcneill
941a2450ddSjmcneill /* read region */
95509197b6Sryo .bs_rr_1 = generic_bs_rr_1,
96509197b6Sryo .bs_rr_2 = NSWAP(generic_armv4_bs_rr_2),
97509197b6Sryo .bs_rr_4 = NSWAP(generic_bs_rr_4),
98509197b6Sryo .bs_rr_8 = bs_notimpl_bs_rr_8,
991a2450ddSjmcneill
1001a2450ddSjmcneill /* write (single) */
101509197b6Sryo .bs_w_1 = generic_bs_w_1,
102509197b6Sryo .bs_w_2 = NSWAP(generic_armv4_bs_w_2),
103509197b6Sryo .bs_w_4 = NSWAP(generic_bs_w_4),
104509197b6Sryo .bs_w_8 = bs_notimpl_bs_w_8,
1051a2450ddSjmcneill
1061a2450ddSjmcneill /* write multiple */
107509197b6Sryo .bs_wm_1 = generic_bs_wm_1,
108509197b6Sryo .bs_wm_2 = NSWAP(generic_armv4_bs_wm_2),
109509197b6Sryo .bs_wm_4 = NSWAP(generic_bs_wm_4),
110509197b6Sryo .bs_wm_8 = bs_notimpl_bs_wm_8,
1111a2450ddSjmcneill
1121a2450ddSjmcneill /* write region */
113509197b6Sryo .bs_wr_1 = generic_bs_wr_1,
114509197b6Sryo .bs_wr_2 = NSWAP(generic_armv4_bs_wr_2),
115509197b6Sryo .bs_wr_4 = NSWAP(generic_bs_wr_4),
116509197b6Sryo .bs_wr_8 = bs_notimpl_bs_wr_8,
1171a2450ddSjmcneill
1181a2450ddSjmcneill /* set multiple */
119509197b6Sryo .bs_sm_1 = bs_notimpl_bs_sm_1,
120509197b6Sryo .bs_sm_2 = bs_notimpl_bs_sm_2,
121509197b6Sryo .bs_sm_4 = bs_notimpl_bs_sm_4,
122509197b6Sryo .bs_sm_8 = bs_notimpl_bs_sm_8,
1231a2450ddSjmcneill
1241a2450ddSjmcneill /* set region */
125509197b6Sryo .bs_sr_1 = generic_bs_sr_1,
126509197b6Sryo .bs_sr_2 = NSWAP(generic_armv4_bs_sr_2),
127509197b6Sryo .bs_sr_4 = NSWAP(generic_bs_sr_4),
128509197b6Sryo .bs_sr_8 = bs_notimpl_bs_sr_8,
1291a2450ddSjmcneill
1301a2450ddSjmcneill /* copy */
131509197b6Sryo .bs_c_1 = bs_notimpl_bs_c_1,
132509197b6Sryo .bs_c_2 = generic_armv4_bs_c_2,
133509197b6Sryo .bs_c_4 = bs_notimpl_bs_c_4,
134509197b6Sryo .bs_c_8 = bs_notimpl_bs_c_8,
1351a2450ddSjmcneill
1361a2450ddSjmcneill #ifdef __BUS_SPACE_HAS_STREAM_METHODS
1371a2450ddSjmcneill /* read (single) */
138509197b6Sryo .bs_r_1_s = generic_bs_r_1,
139509197b6Sryo .bs_r_2_s = NSWAP(generic_armv4_bs_r_2),
140509197b6Sryo .bs_r_4_s = NSWAP(generic_bs_r_4),
141509197b6Sryo .bs_r_8_s = bs_notimpl_bs_r_8,
1421a2450ddSjmcneill
1431a2450ddSjmcneill /* read multiple */
144509197b6Sryo .bs_rm_1_s = generic_bs_rm_1,
145509197b6Sryo .bs_rm_2_s = NSWAP(generic_armv4_bs_rm_2),
146509197b6Sryo .bs_rm_4_s = NSWAP(generic_bs_rm_4),
147509197b6Sryo .bs_rm_8_s = bs_notimpl_bs_rm_8,
1481a2450ddSjmcneill
1491a2450ddSjmcneill /* read region */
150509197b6Sryo .bs_rr_1_s = generic_bs_rr_1,
151509197b6Sryo .bs_rr_2_s = NSWAP(generic_armv4_bs_rr_2),
152509197b6Sryo .bs_rr_4_s = NSWAP(generic_bs_rr_4),
153509197b6Sryo .bs_rr_8_s = bs_notimpl_bs_rr_8,
1541a2450ddSjmcneill
1551a2450ddSjmcneill /* write (single) */
156509197b6Sryo .bs_w_1_s = generic_bs_w_1,
157509197b6Sryo .bs_w_2_s = NSWAP(generic_armv4_bs_w_2),
158509197b6Sryo .bs_w_4_s = NSWAP(generic_bs_w_4),
159509197b6Sryo .bs_w_8_s = bs_notimpl_bs_w_8,
1601a2450ddSjmcneill
1611a2450ddSjmcneill /* write multiple */
162509197b6Sryo .bs_wm_1_s = generic_bs_wm_1,
163509197b6Sryo .bs_wm_2_s = NSWAP(generic_armv4_bs_wm_2),
164509197b6Sryo .bs_wm_4_s = NSWAP(generic_bs_wm_4),
165509197b6Sryo .bs_wm_8_s = bs_notimpl_bs_wm_8,
1661a2450ddSjmcneill
1671a2450ddSjmcneill /* write region */
168509197b6Sryo .bs_wr_1_s = generic_bs_wr_1,
169509197b6Sryo .bs_wr_2_s = NSWAP(generic_armv4_bs_wr_2),
170509197b6Sryo .bs_wr_4_s = NSWAP(generic_bs_wr_4),
171509197b6Sryo .bs_wr_8_s = bs_notimpl_bs_wr_8,
1721a2450ddSjmcneill #endif
1731a2450ddSjmcneill };
1741a2450ddSjmcneill
1751a2450ddSjmcneill struct bus_space armv7_generic_a4x_bs_tag = {
1761a2450ddSjmcneill /* cookie */
177509197b6Sryo .bs_cookie = (void *) 0,
1781a2450ddSjmcneill
1791a2450ddSjmcneill /* mapping/unmapping */
180509197b6Sryo .bs_map = armv7_generic_bs_map,
181509197b6Sryo .bs_unmap = armv7_generic_bs_unmap,
182509197b6Sryo .bs_subregion = armv7_generic_a4x_bs_subregion,
1831a2450ddSjmcneill
1841a2450ddSjmcneill /* allocation/deallocation */
185509197b6Sryo .bs_alloc = armv7_generic_bs_alloc, /* not implemented */
186509197b6Sryo .bs_free = armv7_generic_bs_free, /* not implemented */
1871a2450ddSjmcneill
1881a2450ddSjmcneill /* get kernel virtual address */
189509197b6Sryo .bs_vaddr = armv7_generic_bs_vaddr,
1901a2450ddSjmcneill
1911a2450ddSjmcneill /* mmap */
192509197b6Sryo .bs_mmap = armv7_generic_a4x_bs_mmap,
1931a2450ddSjmcneill
1941a2450ddSjmcneill /* barrier */
195509197b6Sryo .bs_barrier = armv7_generic_bs_barrier,
1961a2450ddSjmcneill
1971a2450ddSjmcneill /* read (single) */
198509197b6Sryo .bs_r_1 = a4x_bs_r_1,
199509197b6Sryo .bs_r_2 = NSWAP(a4x_bs_r_2),
200509197b6Sryo .bs_r_4 = NSWAP(a4x_bs_r_4),
201509197b6Sryo .bs_r_8 = bs_notimpl_bs_r_8,
2021a2450ddSjmcneill
2031a2450ddSjmcneill /* read multiple */
204509197b6Sryo .bs_rm_1 = a4x_bs_rm_1,
205509197b6Sryo .bs_rm_2 = NSWAP(a4x_bs_rm_2),
206509197b6Sryo .bs_rm_4 = NSWAP(a4x_bs_rm_4),
207509197b6Sryo .bs_rm_8 = bs_notimpl_bs_rm_8,
2081a2450ddSjmcneill
2091a2450ddSjmcneill /* read region */
210509197b6Sryo .bs_rr_1 = bs_notimpl_bs_rr_1,
211509197b6Sryo .bs_rr_2 = bs_notimpl_bs_rr_2,
212509197b6Sryo .bs_rr_4 = bs_notimpl_bs_rr_4,
213509197b6Sryo .bs_rr_8 = bs_notimpl_bs_rr_8,
2141a2450ddSjmcneill
2151a2450ddSjmcneill /* write (single) */
216509197b6Sryo .bs_w_1 = a4x_bs_w_1,
217509197b6Sryo .bs_w_2 = NSWAP(a4x_bs_w_2),
218509197b6Sryo .bs_w_4 = NSWAP(a4x_bs_w_4),
219509197b6Sryo .bs_w_8 = bs_notimpl_bs_w_8,
2201a2450ddSjmcneill
2211a2450ddSjmcneill /* write multiple */
222509197b6Sryo .bs_wm_1 = a4x_bs_wm_1,
223509197b6Sryo .bs_wm_2 = NSWAP(a4x_bs_wm_2),
224509197b6Sryo .bs_wm_4 = NSWAP(a4x_bs_wm_4),
225509197b6Sryo .bs_wm_8 = bs_notimpl_bs_wm_8,
2261a2450ddSjmcneill
2271a2450ddSjmcneill /* write region */
228509197b6Sryo .bs_wr_1 = bs_notimpl_bs_wr_1,
229509197b6Sryo .bs_wr_2 = bs_notimpl_bs_wr_2,
230509197b6Sryo .bs_wr_4 = bs_notimpl_bs_wr_4,
231509197b6Sryo .bs_wr_8 = bs_notimpl_bs_wr_8,
2321a2450ddSjmcneill
2331a2450ddSjmcneill /* set multiple */
234509197b6Sryo .bs_sm_1 = bs_notimpl_bs_sm_1,
235509197b6Sryo .bs_sm_2 = bs_notimpl_bs_sm_2,
236509197b6Sryo .bs_sm_4 = bs_notimpl_bs_sm_4,
237509197b6Sryo .bs_sm_8 = bs_notimpl_bs_sm_8,
2381a2450ddSjmcneill
2391a2450ddSjmcneill /* set region */
240509197b6Sryo .bs_sr_1 = bs_notimpl_bs_sr_1,
241509197b6Sryo .bs_sr_2 = bs_notimpl_bs_sr_2,
242509197b6Sryo .bs_sr_4 = bs_notimpl_bs_sr_4,
243509197b6Sryo .bs_sr_8 = bs_notimpl_bs_sr_8,
2441a2450ddSjmcneill
2451a2450ddSjmcneill /* copy */
246509197b6Sryo .bs_c_1 = bs_notimpl_bs_c_1,
247509197b6Sryo .bs_c_2 = bs_notimpl_bs_c_2,
248509197b6Sryo .bs_c_4 = bs_notimpl_bs_c_4,
249509197b6Sryo .bs_c_8 = bs_notimpl_bs_c_8,
2501a2450ddSjmcneill
2511a2450ddSjmcneill #ifdef __BUS_SPACE_HAS_STREAM_METHODS
2521a2450ddSjmcneill /* read (single) */
253509197b6Sryo .bs_r_1_s = a4x_bs_r_1,
254509197b6Sryo .bs_r_2_s = NSWAP(a4x_bs_r_2),
255509197b6Sryo .bs_r_4_s = NSWAP(a4x_bs_r_4),
256509197b6Sryo .bs_r_8_s = bs_notimpl_bs_r_8,
2571a2450ddSjmcneill
2581a2450ddSjmcneill /* read multiple */
259509197b6Sryo .bs_rm_1_s = a4x_bs_rm_1,
260509197b6Sryo .bs_rm_2_s = NSWAP(a4x_bs_rm_2),
261509197b6Sryo .bs_rm_4_s = NSWAP(a4x_bs_rm_4),
262509197b6Sryo .bs_rm_8_s = bs_notimpl_bs_rm_8,
2631a2450ddSjmcneill
2641a2450ddSjmcneill /* read region */
265509197b6Sryo .bs_rr_1_s = bs_notimpl_bs_rr_1,
266509197b6Sryo .bs_rr_2_s = bs_notimpl_bs_rr_2,
267509197b6Sryo .bs_rr_4_s = bs_notimpl_bs_rr_4,
268509197b6Sryo .bs_rr_8_s = bs_notimpl_bs_rr_8,
2691a2450ddSjmcneill
2701a2450ddSjmcneill /* write (single) */
271509197b6Sryo .bs_w_1_s = a4x_bs_w_1,
272509197b6Sryo .bs_w_2_s = NSWAP(a4x_bs_w_2),
273509197b6Sryo .bs_w_4_s = NSWAP(a4x_bs_w_4),
274509197b6Sryo .bs_w_8_s = bs_notimpl_bs_w_8,
2751a2450ddSjmcneill
2761a2450ddSjmcneill /* write multiple */
277509197b6Sryo .bs_wm_1_s = a4x_bs_wm_1,
278509197b6Sryo .bs_wm_2_s = NSWAP(a4x_bs_wm_2),
279509197b6Sryo .bs_wm_4_s = NSWAP(a4x_bs_wm_4),
280509197b6Sryo .bs_wm_8_s = bs_notimpl_bs_wm_8,
2811a2450ddSjmcneill
2821a2450ddSjmcneill /* write region */
283509197b6Sryo .bs_wr_1_s = bs_notimpl_bs_wr_1,
284509197b6Sryo .bs_wr_2_s = bs_notimpl_bs_wr_2,
285509197b6Sryo .bs_wr_4_s = bs_notimpl_bs_wr_4,
286509197b6Sryo .bs_wr_8_s = bs_notimpl_bs_wr_8,
2871a2450ddSjmcneill #endif
2881a2450ddSjmcneill };
2891a2450ddSjmcneill
2901a2450ddSjmcneill int
armv7_generic_bs_map(void * t,bus_addr_t bpa,bus_size_t size,int flag,bus_space_handle_t * bshp)2911a2450ddSjmcneill armv7_generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flag,
2921a2450ddSjmcneill bus_space_handle_t *bshp)
2931a2450ddSjmcneill {
2941a2450ddSjmcneill u_long startpa, endpa, pa;
2951a2450ddSjmcneill const struct pmap_devmap *pd;
29606f0558fSskrll int pmapflags;
2971a2450ddSjmcneill vaddr_t va;
2981a2450ddSjmcneill
2991a2450ddSjmcneill if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) {
3001a2450ddSjmcneill /* Device was statically mapped. */
3011a2450ddSjmcneill *bshp = pd->pd_va + (bpa - pd->pd_pa);
3021a2450ddSjmcneill return 0;
3031a2450ddSjmcneill }
3041a2450ddSjmcneill
3051a2450ddSjmcneill startpa = trunc_page(bpa);
3061a2450ddSjmcneill endpa = round_page(bpa + size);
3071a2450ddSjmcneill
3081a2450ddSjmcneill /* XXX use extent manager to check duplicate mapping */
3091a2450ddSjmcneill
3101a2450ddSjmcneill va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
3111a2450ddSjmcneill UVM_KMF_VAONLY | UVM_KMF_NOWAIT | UVM_KMF_COLORMATCH);
3121a2450ddSjmcneill if (!va)
3131a2450ddSjmcneill return ENOMEM;
3141a2450ddSjmcneill
3151a2450ddSjmcneill *bshp = (bus_space_handle_t)(va + (bpa - startpa));
3161a2450ddSjmcneill
31706f0558fSskrll if (flag & BUS_SPACE_MAP_PREFETCHABLE)
31806f0558fSskrll pmapflags = PMAP_WRITE_COMBINE;
31906f0558fSskrll else if (flag & BUS_SPACE_MAP_CACHEABLE)
32006f0558fSskrll pmapflags = 0;
32106f0558fSskrll else
322f50b4456Sskrll pmapflags = PMAP_DEV;
32306f0558fSskrll
3241a2450ddSjmcneill for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
3251a2450ddSjmcneill pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, pmapflags);
3261a2450ddSjmcneill }
3271a2450ddSjmcneill pmap_update(pmap_kernel());
3281a2450ddSjmcneill
3291a2450ddSjmcneill return 0;
3301a2450ddSjmcneill }
3311a2450ddSjmcneill
3321a2450ddSjmcneill void
armv7_generic_bs_unmap(void * t,bus_space_handle_t bsh,bus_size_t size)3331a2450ddSjmcneill armv7_generic_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size)
3341a2450ddSjmcneill {
3351a2450ddSjmcneill vaddr_t va;
3361a2450ddSjmcneill vsize_t sz;
3371a2450ddSjmcneill
3381a2450ddSjmcneill if (pmap_devmap_find_va(bsh, size) != NULL) {
3391a2450ddSjmcneill /* Device was statically mapped; nothing to do. */
3401a2450ddSjmcneill return;
3411a2450ddSjmcneill }
3421a2450ddSjmcneill
3431a2450ddSjmcneill va = trunc_page(bsh);
3441a2450ddSjmcneill sz = round_page(bsh + size) - va;
3451a2450ddSjmcneill
3461a2450ddSjmcneill pmap_kremove(va, sz);
3471a2450ddSjmcneill pmap_update(pmap_kernel());
3481a2450ddSjmcneill uvm_km_free(kernel_map, va, sz, UVM_KMF_VAONLY);
3491a2450ddSjmcneill }
3501a2450ddSjmcneill
3511a2450ddSjmcneill
3521a2450ddSjmcneill int
armv7_generic_bs_subregion(void * t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)3531a2450ddSjmcneill armv7_generic_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
3541a2450ddSjmcneill bus_size_t size, bus_space_handle_t *nbshp)
3551a2450ddSjmcneill {
3561a2450ddSjmcneill
3571a2450ddSjmcneill *nbshp = bsh + offset;
3580e339da9Sskrll return 0;
3591a2450ddSjmcneill }
3601a2450ddSjmcneill
3611a2450ddSjmcneill int
armv7_generic_a4x_bs_subregion(void * t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)3621a2450ddSjmcneill armv7_generic_a4x_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
3631a2450ddSjmcneill bus_size_t size, bus_space_handle_t *nbshp)
3641a2450ddSjmcneill {
3651a2450ddSjmcneill
3661a2450ddSjmcneill *nbshp = bsh + 4 * offset;
3670e339da9Sskrll return 0;
3681a2450ddSjmcneill }
3691a2450ddSjmcneill
3701a2450ddSjmcneill void
armv7_generic_bs_barrier(void * t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t len,int flags)3711a2450ddSjmcneill armv7_generic_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset,
3721a2450ddSjmcneill bus_size_t len, int flags)
3731a2450ddSjmcneill {
3741a2450ddSjmcneill flags &= BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE;
3751a2450ddSjmcneill
3761a2450ddSjmcneill if (flags)
377*ce993bccSskrll dsb(sy);
3781a2450ddSjmcneill }
3791a2450ddSjmcneill
3801a2450ddSjmcneill void *
armv7_generic_bs_vaddr(void * t,bus_space_handle_t bsh)3811a2450ddSjmcneill armv7_generic_bs_vaddr(void *t, bus_space_handle_t bsh)
3821a2450ddSjmcneill {
3831a2450ddSjmcneill
3841a2450ddSjmcneill return (void *)bsh;
3851a2450ddSjmcneill }
3861a2450ddSjmcneill
3871a2450ddSjmcneill paddr_t
armv7_generic_bs_mmap(void * t,bus_addr_t bpa,off_t offset,int prot,int flags)3881a2450ddSjmcneill armv7_generic_bs_mmap(void *t, bus_addr_t bpa, off_t offset, int prot, int flags)
3891a2450ddSjmcneill {
3901a2450ddSjmcneill paddr_t bus_flags = 0;
3911a2450ddSjmcneill
3921a2450ddSjmcneill if (flags & BUS_SPACE_MAP_PREFETCHABLE)
3931a2450ddSjmcneill bus_flags |= ARM32_MMAP_WRITECOMBINE;
3941a2450ddSjmcneill
3950e339da9Sskrll return arm_btop(bpa + offset) | bus_flags;
3961a2450ddSjmcneill }
3971a2450ddSjmcneill
3981a2450ddSjmcneill paddr_t
armv7_generic_a4x_bs_mmap(void * t,bus_addr_t bpa,off_t offset,int prot,int flags)3991a2450ddSjmcneill armv7_generic_a4x_bs_mmap(void *t, bus_addr_t bpa, off_t offset, int prot, int flags)
4001a2450ddSjmcneill {
4011a2450ddSjmcneill paddr_t bus_flags = 0;
4021a2450ddSjmcneill
4031a2450ddSjmcneill if (flags & BUS_SPACE_MAP_PREFETCHABLE)
4041a2450ddSjmcneill bus_flags |= ARM32_MMAP_WRITECOMBINE;
4051a2450ddSjmcneill
4060e339da9Sskrll return arm_btop(bpa + 4 * offset) | bus_flags;
4071a2450ddSjmcneill }
4081a2450ddSjmcneill
4091a2450ddSjmcneill int
armv7_generic_bs_alloc(void * t,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t alignment,bus_size_t boundary,int flags,bus_addr_t * bpap,bus_space_handle_t * bshp)4101a2450ddSjmcneill armv7_generic_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend,
4111a2450ddSjmcneill bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
4121a2450ddSjmcneill bus_addr_t *bpap, bus_space_handle_t *bshp)
4131a2450ddSjmcneill {
4141a2450ddSjmcneill
4151a2450ddSjmcneill panic("%s(): not implemented\n", __func__);
4161a2450ddSjmcneill }
4171a2450ddSjmcneill
4181a2450ddSjmcneill void
armv7_generic_bs_free(void * t,bus_space_handle_t bsh,bus_size_t size)4191a2450ddSjmcneill armv7_generic_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
4201a2450ddSjmcneill {
4211a2450ddSjmcneill
4221a2450ddSjmcneill panic("%s(): not implemented\n", __func__);
4231a2450ddSjmcneill }
424