1 1.12 andvar /* $NetBSD: mvsoc_space.c,v 1.12 2022/05/23 21:46:11 andvar Exp $ */ 2 1.1 kiyohara /* 3 1.1 kiyohara * Copyright (c) 2007 KIYOHARA Takashi 4 1.1 kiyohara * All rights reserved. 5 1.1 kiyohara * 6 1.1 kiyohara * Redistribution and use in source and binary forms, with or without 7 1.1 kiyohara * modification, are permitted provided that the following conditions 8 1.1 kiyohara * are met: 9 1.1 kiyohara * 1. Redistributions of source code must retain the above copyright 10 1.1 kiyohara * notice, this list of conditions and the following disclaimer. 11 1.1 kiyohara * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 kiyohara * notice, this list of conditions and the following disclaimer in the 13 1.1 kiyohara * documentation and/or other materials provided with the distribution. 14 1.1 kiyohara * 15 1.1 kiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 kiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 1.1 kiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 1.1 kiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 19 1.1 kiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 1.1 kiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 1.1 kiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 kiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 23 1.1 kiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24 1.1 kiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 kiyohara * POSSIBILITY OF SUCH DAMAGE. 26 1.1 kiyohara */ 27 1.1 kiyohara 28 1.1 kiyohara #include <sys/cdefs.h> 29 1.12 andvar __KERNEL_RCSID(0, "$NetBSD: mvsoc_space.c,v 1.12 2022/05/23 21:46:11 andvar Exp $"); 30 1.1 kiyohara 31 1.1 kiyohara #include "opt_mvsoc.h" 32 1.1 kiyohara #include "mvpex.h" 33 1.1 kiyohara #include "gtpci.h" 34 1.1 kiyohara 35 1.1 kiyohara #include <sys/param.h> 36 1.1 kiyohara #include <sys/systm.h> 37 1.1 kiyohara 38 1.1 kiyohara #include <uvm/uvm_extern.h> 39 1.1 kiyohara 40 1.2 dyoung #include <sys/bus.h> 41 1.1 kiyohara 42 1.1 kiyohara #include <arm/marvell/mvsocreg.h> 43 1.1 kiyohara #include <arm/marvell/mvsocvar.h> 44 1.1 kiyohara 45 1.11 rin #ifdef __ARMEB__ 46 1.11 rin #define NSWAP(n) n ## _swap 47 1.11 rin #else 48 1.11 rin #define NSWAP(n) n 49 1.11 rin #endif 50 1.1 kiyohara 51 1.1 kiyohara /* Proto types for all the bus_space structure functions */ 52 1.1 kiyohara bs_protos(mvsoc); 53 1.1 kiyohara bs_protos(generic); 54 1.1 kiyohara bs_protos(generic_armv4); 55 1.1 kiyohara bs_protos(bs_notimpl); 56 1.1 kiyohara 57 1.3 matt #define MVSOC_BUS_SPACE_NORMAL_FUNCS \ 58 1.1 kiyohara /* read (single) */ \ 59 1.10 ryo .bs_r_1 = generic_bs_r_1, \ 60 1.11 rin .bs_r_2 = NSWAP(generic_armv4_bs_r_2), \ 61 1.11 rin .bs_r_4 = NSWAP(generic_bs_r_4), \ 62 1.10 ryo .bs_r_8 = bs_notimpl_bs_r_8, \ 63 1.1 kiyohara \ 64 1.1 kiyohara /* read multiple */ \ 65 1.10 ryo .bs_rm_1 = generic_bs_rm_1, \ 66 1.11 rin .bs_rm_2 = NSWAP(generic_armv4_bs_rm_2),\ 67 1.11 rin .bs_rm_4 = NSWAP(generic_bs_rm_4), \ 68 1.10 ryo .bs_rm_8 = bs_notimpl_bs_rm_8, \ 69 1.1 kiyohara \ 70 1.1 kiyohara /* read region */ \ 71 1.10 ryo .bs_rr_1 = generic_bs_rr_1, \ 72 1.11 rin .bs_rr_2 = NSWAP(generic_armv4_bs_rr_2),\ 73 1.11 rin .bs_rr_4 = NSWAP(generic_bs_rr_4), \ 74 1.10 ryo .bs_rr_8 = bs_notimpl_bs_rr_8, \ 75 1.1 kiyohara \ 76 1.1 kiyohara /* write (single) */ \ 77 1.10 ryo .bs_w_1 = generic_bs_w_1, \ 78 1.11 rin .bs_w_2 = NSWAP(generic_armv4_bs_w_2), \ 79 1.11 rin .bs_w_4 = NSWAP(generic_bs_w_4), \ 80 1.10 ryo .bs_w_8 = bs_notimpl_bs_w_8, \ 81 1.1 kiyohara \ 82 1.1 kiyohara /* write multiple */ \ 83 1.10 ryo .bs_wm_1 = generic_bs_wm_1, \ 84 1.11 rin .bs_wm_2 = NSWAP(generic_armv4_bs_wm_2),\ 85 1.11 rin .bs_wm_4 = NSWAP(generic_bs_wm_4), \ 86 1.10 ryo .bs_wm_8 = bs_notimpl_bs_wm_8, \ 87 1.1 kiyohara \ 88 1.1 kiyohara /* write region */ \ 89 1.10 ryo .bs_wr_1 = generic_bs_wr_1, \ 90 1.11 rin .bs_wr_2 = NSWAP(generic_armv4_bs_wr_2),\ 91 1.11 rin .bs_wr_4 = NSWAP(generic_bs_wr_4), \ 92 1.10 ryo .bs_wr_8 = bs_notimpl_bs_wr_8 93 1.10 ryo 94 1.10 ryo #define MVSOC_BUS_SPACE_STREAM_FUNCS \ 95 1.10 ryo /* read stream (single) */ \ 96 1.10 ryo .bs_r_1_s = generic_bs_r_1, \ 97 1.11 rin .bs_r_2_s = NSWAP(generic_armv4_bs_r_2),\ 98 1.11 rin .bs_r_4_s = NSWAP(generic_bs_r_4), \ 99 1.10 ryo .bs_r_8_s = bs_notimpl_bs_r_8, \ 100 1.10 ryo \ 101 1.10 ryo /* read multiple stream */ \ 102 1.10 ryo .bs_rm_1_s = generic_bs_rm_1, \ 103 1.11 rin .bs_rm_2_s = NSWAP(generic_armv4_bs_rm_2),\ 104 1.11 rin .bs_rm_4_s = NSWAP(generic_bs_rm_4), \ 105 1.10 ryo .bs_rm_8_s = bs_notimpl_bs_rm_8, \ 106 1.10 ryo \ 107 1.10 ryo /* read region stream */ \ 108 1.10 ryo .bs_rr_1_s = generic_bs_rr_1, \ 109 1.11 rin .bs_rr_2_s = NSWAP(generic_armv4_bs_rr_2),\ 110 1.11 rin .bs_rr_4_s = NSWAP(generic_bs_rr_4), \ 111 1.10 ryo .bs_rr_8_s = bs_notimpl_bs_rr_8, \ 112 1.10 ryo \ 113 1.10 ryo /* write stream (single) */ \ 114 1.10 ryo .bs_w_1_s = generic_bs_w_1, \ 115 1.11 rin .bs_w_2_s = NSWAP(generic_armv4_bs_w_2),\ 116 1.11 rin .bs_w_4_s = NSWAP(generic_bs_w_4, \ 117 1.10 ryo .bs_w_8_s = bs_notimpl_bs_w_8, \ 118 1.10 ryo \ 119 1.10 ryo /* write multiple stream */ \ 120 1.10 ryo .bs_wm_1_s = generic_bs_wm_1, \ 121 1.11 rin .bs_wm_2_s = NSWAP(generic_armv4_bs_wm_2),\ 122 1.11 rin .bs_wm_4_s = NSWAP(generic_bs_wm_4), \ 123 1.10 ryo .bs_wm_8_s = bs_notimpl_bs_wm_8, \ 124 1.10 ryo \ 125 1.10 ryo /* write region stream */ \ 126 1.10 ryo .bs_wr_1_s = generic_bs_wr_1, \ 127 1.11 rin .bs_wr_2_s = NSWAP(generic_armv4_bs_wr_2),\ 128 1.11 rin .bs_wr_4_s = NSWAP(generic_bs_wr_4), \ 129 1.10 ryo .bs_wr_8_s = bs_notimpl_bs_wr_8 130 1.3 matt 131 1.3 matt #define MVSOC_BUS_SPACE_DEFAULT_FUNCS \ 132 1.3 matt /* mapping/unmapping */ \ 133 1.10 ryo .bs_map = mvsoc_bs_map, \ 134 1.10 ryo .bs_unmap = mvsoc_bs_unmap, \ 135 1.10 ryo .bs_subregion = mvsoc_bs_subregion, \ 136 1.3 matt \ 137 1.3 matt /* allocation/deallocation */ \ 138 1.11 rin .bs_alloc = mvsoc_bs_alloc, \ 139 1.10 ryo .bs_free = mvsoc_bs_free, \ 140 1.3 matt \ 141 1.3 matt /* get kernel virtual address */ \ 142 1.10 ryo .bs_vaddr = mvsoc_bs_vaddr, \ 143 1.3 matt \ 144 1.3 matt /* mmap bus space for userland */ \ 145 1.10 ryo .bs_mmap = bs_notimpl_bs_mmap, \ 146 1.3 matt \ 147 1.3 matt /* barrier */ \ 148 1.10 ryo .bs_barrier = mvsoc_bs_barrier, \ 149 1.3 matt \ 150 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, \ 151 1.1 kiyohara \ 152 1.1 kiyohara /* set multiple */ \ 153 1.10 ryo .bs_sm_1 = bs_notimpl_bs_sm_1, \ 154 1.10 ryo .bs_sm_2 = bs_notimpl_bs_sm_2, \ 155 1.10 ryo .bs_sm_4 = bs_notimpl_bs_sm_4, \ 156 1.10 ryo .bs_sm_8 = bs_notimpl_bs_sm_8, \ 157 1.1 kiyohara \ 158 1.1 kiyohara /* set region */ \ 159 1.10 ryo .bs_sr_1 = bs_notimpl_bs_sr_1, \ 160 1.11 rin .bs_sr_2 = NSWAP(generic_armv4_bs_sr_2),\ 161 1.11 rin .bs_sr_4 = NSWAP(generic_bs_sr_4), \ 162 1.10 ryo .bs_sr_8 = bs_notimpl_bs_sr_8, \ 163 1.1 kiyohara \ 164 1.1 kiyohara /* copy */ \ 165 1.10 ryo .bs_c_1 = bs_notimpl_bs_c_1, \ 166 1.10 ryo .bs_c_2 = generic_armv4_bs_c_2, \ 167 1.10 ryo .bs_c_4 = bs_notimpl_bs_c_4, \ 168 1.10 ryo .bs_c_8 = bs_notimpl_bs_c_8 169 1.1 kiyohara 170 1.1 kiyohara 171 1.1 kiyohara struct bus_space mvsoc_bs_tag = { 172 1.1 kiyohara /* cookie */ 173 1.10 ryo .bs_cookie = (void *)0, 174 1.1 kiyohara 175 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 176 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 177 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 178 1.3 matt #endif 179 1.1 kiyohara }; 180 1.1 kiyohara 181 1.1 kiyohara #if NMVPEX > 0 182 1.1 kiyohara #if defined(ORION) 183 1.1 kiyohara struct bus_space orion_pex0_mem_bs_tag = { 184 1.1 kiyohara /* cookie */ 185 1.10 ryo .bs_cookie = (void *)ORION_TAG_PEX0_MEM, 186 1.1 kiyohara 187 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 188 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 189 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 190 1.3 matt #endif 191 1.1 kiyohara }; 192 1.1 kiyohara struct bus_space orion_pex0_io_bs_tag = { 193 1.1 kiyohara /* cookie */ 194 1.10 ryo .bs_cookie = (void *)ORION_TAG_PEX0_IO, 195 1.1 kiyohara 196 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 197 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 198 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 199 1.3 matt #endif 200 1.1 kiyohara }; 201 1.1 kiyohara struct bus_space orion_pex1_mem_bs_tag = { 202 1.1 kiyohara /* cookie */ 203 1.10 ryo .bs_cookie = (void *)ORION_TAG_PEX1_MEM, 204 1.1 kiyohara 205 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 206 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 207 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 208 1.3 matt #endif 209 1.1 kiyohara }; 210 1.1 kiyohara struct bus_space orion_pex1_io_bs_tag = { 211 1.1 kiyohara /* cookie */ 212 1.10 ryo .bs_cookie = (void *)ORION_TAG_PEX1_IO, 213 1.1 kiyohara 214 1.5 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 215 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 216 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 217 1.3 matt #endif 218 1.1 kiyohara }; 219 1.1 kiyohara #endif 220 1.1 kiyohara 221 1.1 kiyohara #if defined(KIRKWOOD) 222 1.1 kiyohara struct bus_space kirkwood_pex_mem_bs_tag = { 223 1.1 kiyohara /* cookie */ 224 1.10 ryo .bs_cookie = (void *)KIRKWOOD_TAG_PEX_MEM, 225 1.1 kiyohara 226 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 227 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 228 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 229 1.3 matt #endif 230 1.1 kiyohara }; 231 1.1 kiyohara struct bus_space kirkwood_pex_io_bs_tag = { 232 1.1 kiyohara /* cookie */ 233 1.10 ryo .bs_cookie = (void *)KIRKWOOD_TAG_PEX_IO, 234 1.1 kiyohara 235 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 236 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 237 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 238 1.3 matt #endif 239 1.1 kiyohara }; 240 1.4 kiyohara struct bus_space kirkwood_pex1_mem_bs_tag = { 241 1.4 kiyohara /* cookie */ 242 1.10 ryo .bs_cookie = (void *)KIRKWOOD_TAG_PEX1_MEM, 243 1.4 kiyohara 244 1.5 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 245 1.5 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 246 1.5 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 247 1.5 matt #endif 248 1.4 kiyohara }; 249 1.4 kiyohara struct bus_space kirkwood_pex1_io_bs_tag = { 250 1.4 kiyohara /* cookie */ 251 1.10 ryo .bs_cookie = (void *)KIRKWOOD_TAG_PEX1_IO, 252 1.4 kiyohara 253 1.5 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 254 1.5 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 255 1.5 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 256 1.5 matt #endif 257 1.4 kiyohara }; 258 1.1 kiyohara #endif 259 1.6 rkujawa 260 1.8 kiyohara #if defined(DOVE) 261 1.8 kiyohara struct bus_space dove_pex0_mem_bs_tag = { 262 1.8 kiyohara /* cookie */ 263 1.10 ryo .bs_cookie = (void *)DOVE_TAG_PEX0_MEM, 264 1.8 kiyohara 265 1.8 kiyohara MVSOC_BUS_SPACE_DEFAULT_FUNCS, 266 1.8 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS 267 1.8 kiyohara MVSOC_BUS_SPACE_NORMAL_FUNCS, 268 1.8 kiyohara #endif 269 1.8 kiyohara }; 270 1.8 kiyohara struct bus_space dove_pex0_io_bs_tag = { 271 1.8 kiyohara /* cookie */ 272 1.10 ryo .bs_cookie = (void *)DOVE_TAG_PEX0_IO, 273 1.8 kiyohara 274 1.8 kiyohara MVSOC_BUS_SPACE_DEFAULT_FUNCS, 275 1.8 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS 276 1.8 kiyohara MVSOC_BUS_SPACE_NORMAL_FUNCS, 277 1.8 kiyohara #endif 278 1.8 kiyohara }; 279 1.8 kiyohara struct bus_space dove_pex1_mem_bs_tag = { 280 1.8 kiyohara /* cookie */ 281 1.10 ryo .bs_cookie = (void *)DOVE_TAG_PEX1_MEM, 282 1.8 kiyohara 283 1.8 kiyohara MVSOC_BUS_SPACE_DEFAULT_FUNCS, 284 1.8 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS 285 1.8 kiyohara MVSOC_BUS_SPACE_NORMAL_FUNCS, 286 1.8 kiyohara #endif 287 1.8 kiyohara }; 288 1.8 kiyohara struct bus_space dove_pex1_io_bs_tag = { 289 1.8 kiyohara /* cookie */ 290 1.10 ryo .bs_cookie = (void *)DOVE_TAG_PEX1_IO, 291 1.8 kiyohara 292 1.8 kiyohara MVSOC_BUS_SPACE_DEFAULT_FUNCS, 293 1.8 kiyohara #ifdef __BUS_SPACE_HAS_STREAM_METHODS 294 1.8 kiyohara MVSOC_BUS_SPACE_NORMAL_FUNCS, 295 1.8 kiyohara #endif 296 1.8 kiyohara }; 297 1.8 kiyohara #endif 298 1.8 kiyohara 299 1.6 rkujawa #if defined(ARMADAXP) 300 1.6 rkujawa struct bus_space armadaxp_pex00_mem_bs_tag = { 301 1.6 rkujawa /* cookie */ 302 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX00_MEM, 303 1.6 rkujawa 304 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 305 1.6 rkujawa }; 306 1.6 rkujawa struct bus_space armadaxp_pex00_io_bs_tag = { 307 1.6 rkujawa /* cookie */ 308 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX00_IO, 309 1.6 rkujawa 310 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 311 1.6 rkujawa }; 312 1.6 rkujawa struct bus_space armadaxp_pex01_mem_bs_tag = { 313 1.6 rkujawa /* cookie */ 314 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX01_MEM, 315 1.6 rkujawa 316 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 317 1.6 rkujawa }; 318 1.6 rkujawa struct bus_space armadaxp_pex01_io_bs_tag = { 319 1.6 rkujawa /* cookie */ 320 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX01_IO, 321 1.6 rkujawa 322 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 323 1.6 rkujawa }; 324 1.6 rkujawa struct bus_space armadaxp_pex02_mem_bs_tag = { 325 1.6 rkujawa /* cookie */ 326 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX02_MEM, 327 1.6 rkujawa 328 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 329 1.6 rkujawa }; 330 1.6 rkujawa struct bus_space armadaxp_pex02_io_bs_tag = { 331 1.6 rkujawa /* cookie */ 332 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX02_IO, 333 1.6 rkujawa 334 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 335 1.6 rkujawa }; 336 1.6 rkujawa struct bus_space armadaxp_pex03_mem_bs_tag = { 337 1.6 rkujawa /* cookie */ 338 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX03_MEM, 339 1.6 rkujawa 340 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 341 1.6 rkujawa }; 342 1.6 rkujawa struct bus_space armadaxp_pex03_io_bs_tag = { 343 1.6 rkujawa /* cookie */ 344 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX03_IO, 345 1.6 rkujawa 346 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 347 1.6 rkujawa }; 348 1.9 skrll struct bus_space armadaxp_pex10_mem_bs_tag = { 349 1.9 skrll /* cookie */ 350 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX10_MEM, 351 1.9 skrll 352 1.9 skrll MVSOC_BUS_SPACE_DEFAULT_FUNCS 353 1.9 skrll }; 354 1.9 skrll struct bus_space armadaxp_pex10_io_bs_tag = { 355 1.9 skrll /* cookie */ 356 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX10_IO, 357 1.9 skrll 358 1.9 skrll MVSOC_BUS_SPACE_DEFAULT_FUNCS 359 1.9 skrll }; 360 1.6 rkujawa struct bus_space armadaxp_pex2_mem_bs_tag = { 361 1.6 rkujawa /* cookie */ 362 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX2_MEM, 363 1.6 rkujawa 364 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 365 1.6 rkujawa }; 366 1.6 rkujawa struct bus_space armadaxp_pex2_io_bs_tag = { 367 1.6 rkujawa /* cookie */ 368 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX2_IO, 369 1.6 rkujawa 370 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 371 1.6 rkujawa }; 372 1.6 rkujawa struct bus_space armadaxp_pex3_mem_bs_tag = { 373 1.6 rkujawa /* cookie */ 374 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX3_MEM, 375 1.6 rkujawa 376 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 377 1.6 rkujawa }; 378 1.6 rkujawa struct bus_space armadaxp_pex3_io_bs_tag = { 379 1.6 rkujawa /* cookie */ 380 1.10 ryo .bs_cookie = (void *)ARMADAXP_TAG_PEX3_IO, 381 1.6 rkujawa 382 1.6 rkujawa MVSOC_BUS_SPACE_DEFAULT_FUNCS 383 1.6 rkujawa }; 384 1.6 rkujawa #endif 385 1.1 kiyohara #endif 386 1.1 kiyohara 387 1.1 kiyohara #if NGTPCI > 0 388 1.1 kiyohara #if defined(ORION) 389 1.1 kiyohara struct bus_space orion_pci_mem_bs_tag = { 390 1.1 kiyohara /* cookie */ 391 1.10 ryo .bs_cookie = (void *)ORION_TAG_PCI_MEM, 392 1.1 kiyohara 393 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 394 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 395 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 396 1.3 matt #endif 397 1.1 kiyohara }; 398 1.1 kiyohara struct bus_space orion_pci_io_bs_tag = { 399 1.1 kiyohara /* cookie */ 400 1.10 ryo .bs_cookie = (void *)ORION_TAG_PCI_IO, 401 1.1 kiyohara 402 1.3 matt MVSOC_BUS_SPACE_DEFAULT_FUNCS, 403 1.3 matt #ifdef __BUS_SPACE_HAS_STREAM_METHODS 404 1.3 matt MVSOC_BUS_SPACE_NORMAL_FUNCS, 405 1.3 matt #endif 406 1.1 kiyohara }; 407 1.1 kiyohara #endif 408 1.1 kiyohara #endif 409 1.1 kiyohara 410 1.1 kiyohara 411 1.1 kiyohara int 412 1.1 kiyohara mvsoc_bs_map(void *space, bus_addr_t address, bus_size_t size, int flags, 413 1.1 kiyohara bus_space_handle_t *handlep) 414 1.1 kiyohara { 415 1.1 kiyohara const struct pmap_devmap *pd; 416 1.1 kiyohara paddr_t startpa, endpa, offset, pa; 417 1.1 kiyohara vaddr_t va; 418 1.6 rkujawa 419 1.6 rkujawa /* 420 1.6 rkujawa * XXX: We are not configuring any decode windows for Armada XP 421 1.6 rkujawa * at the moment. We rely on those that have been set by u-boot. 422 1.6 rkujawa * Hence we don't want to mess around with decode windows, 423 1.12 andvar * till we get full control over them. 424 1.6 rkujawa */ 425 1.6 rkujawa 426 1.1 kiyohara int tag = (int)space; 427 1.1 kiyohara 428 1.1 kiyohara if (tag != 0) { 429 1.1 kiyohara bus_addr_t remap; 430 1.1 kiyohara uint32_t base; 431 1.1 kiyohara int window; 432 1.1 kiyohara 433 1.1 kiyohara window = mvsoc_target(tag, NULL, NULL, &base, NULL); 434 1.1 kiyohara if (window == -1) 435 1.1 kiyohara return ENOMEM; 436 1.1 kiyohara if (window < nremap) { 437 1.1 kiyohara remap = read_mlmbreg(MVSOC_MLMB_WRLR(window)) & 438 1.1 kiyohara MVSOC_MLMB_WRLR_REMAP_MASK; 439 1.1 kiyohara remap |= 440 1.1 kiyohara (read_mlmbreg(MVSOC_MLMB_WRHR(window)) << 16) << 16; 441 1.1 kiyohara address = address - remap + base; 442 1.1 kiyohara } 443 1.1 kiyohara } 444 1.1 kiyohara 445 1.1 kiyohara if ((pd = pmap_devmap_find_pa(address, size)) != NULL) { 446 1.1 kiyohara /* Device was statically mapped. */ 447 1.1 kiyohara *handlep = pd->pd_va + (address - pd->pd_pa); 448 1.1 kiyohara return 0; 449 1.1 kiyohara } 450 1.1 kiyohara 451 1.1 kiyohara startpa = trunc_page(address); 452 1.1 kiyohara endpa = round_page(address + size); 453 1.1 kiyohara offset = address & PAGE_MASK; 454 1.1 kiyohara 455 1.1 kiyohara /* XXX use extent manager to check duplicate mapping */ 456 1.1 kiyohara 457 1.1 kiyohara va = uvm_km_alloc(kernel_map, endpa - startpa, 0, 458 1.1 kiyohara UVM_KMF_VAONLY | UVM_KMF_NOWAIT); 459 1.1 kiyohara if (va == 0x00000000) 460 1.1 kiyohara return ENOMEM; 461 1.1 kiyohara 462 1.1 kiyohara *handlep = va + offset; 463 1.1 kiyohara 464 1.7 matt const int pmapflags = 465 1.7 matt (flags & (BUS_SPACE_MAP_CACHEABLE|BUS_SPACE_MAP_PREFETCHABLE)) 466 1.7 matt ? 0 467 1.7 matt : PMAP_NOCACHE; 468 1.7 matt 469 1.1 kiyohara /* Now map the pages */ 470 1.1 kiyohara for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) { 471 1.7 matt pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, pmapflags); 472 1.1 kiyohara } 473 1.1 kiyohara pmap_update(pmap_kernel()); 474 1.1 kiyohara 475 1.1 kiyohara return 0; 476 1.1 kiyohara } 477 1.1 kiyohara 478 1.1 kiyohara void 479 1.1 kiyohara mvsoc_bs_unmap(void *space, bus_space_handle_t handle, bus_size_t size) 480 1.1 kiyohara { 481 1.1 kiyohara vaddr_t va, sz; 482 1.1 kiyohara 483 1.1 kiyohara if (pmap_devmap_find_va(handle, size) != NULL) 484 1.1 kiyohara /* Device was statically mapped; nothing to do. */ 485 1.1 kiyohara return; 486 1.1 kiyohara 487 1.1 kiyohara va = trunc_page(handle); 488 1.1 kiyohara sz = round_page(handle + size) - va; 489 1.1 kiyohara 490 1.1 kiyohara pmap_kremove(va, sz); 491 1.1 kiyohara pmap_update(pmap_kernel()); 492 1.1 kiyohara uvm_km_free(kernel_map, va, sz, UVM_KMF_VAONLY); 493 1.1 kiyohara } 494 1.1 kiyohara 495 1.1 kiyohara /* ARGSUSED */ 496 1.1 kiyohara int 497 1.1 kiyohara mvsoc_bs_subregion(void *space, bus_space_handle_t handle, 498 1.1 kiyohara bus_size_t offset, bus_size_t size, 499 1.1 kiyohara bus_space_handle_t *nhandlep) 500 1.1 kiyohara { 501 1.1 kiyohara 502 1.1 kiyohara *nhandlep = handle + offset; 503 1.1 kiyohara return 0; 504 1.1 kiyohara } 505 1.1 kiyohara 506 1.1 kiyohara /* ARGSUSED */ 507 1.1 kiyohara int 508 1.1 kiyohara mvsoc_bs_alloc(void *space, bus_addr_t reg_start, bus_addr_t reg_end, 509 1.1 kiyohara bus_size_t size, bus_size_t alignment, bus_size_t boundary, 510 1.1 kiyohara int flags, bus_addr_t *addrp, bus_space_handle_t *handlep) 511 1.1 kiyohara { 512 1.1 kiyohara 513 1.1 kiyohara panic("%s(): not implemented\n", __func__); 514 1.1 kiyohara } 515 1.1 kiyohara 516 1.1 kiyohara /* ARGSUSED */ 517 1.1 kiyohara void 518 1.1 kiyohara mvsoc_bs_free(void *space, bus_space_handle_t handle, bus_size_t size) 519 1.1 kiyohara { 520 1.1 kiyohara 521 1.1 kiyohara panic("%s(): not implemented\n", __func__); 522 1.1 kiyohara } 523 1.1 kiyohara 524 1.1 kiyohara /* ARGSUSED */ 525 1.1 kiyohara void 526 1.1 kiyohara mvsoc_bs_barrier(void *space, bus_space_handle_t handle, bus_size_t offset, 527 1.1 kiyohara bus_size_t length, int flags) 528 1.1 kiyohara { 529 1.1 kiyohara 530 1.1 kiyohara /* Nothing to do. */ 531 1.1 kiyohara } 532 1.1 kiyohara 533 1.1 kiyohara /* ARGSUSED */ 534 1.1 kiyohara void * 535 1.1 kiyohara mvsoc_bs_vaddr(void *space, bus_space_handle_t handle) 536 1.1 kiyohara { 537 1.1 kiyohara 538 1.1 kiyohara return (void *)handle; 539 1.1 kiyohara } 540