1281494Sandrew/*- 2281494Sandrew * Copyright (c) 2014 Andrew Turner 3281494Sandrew * All rights reserved. 4281494Sandrew * 5281494Sandrew * Redistribution and use in source and binary forms, with or without 6281494Sandrew * modification, are permitted provided that the following conditions 7281494Sandrew * are met: 8281494Sandrew * 1. Redistributions of source code must retain the above copyright 9281494Sandrew * notice, this list of conditions and the following disclaimer. 10281494Sandrew * 2. Redistributions in binary form must reproduce the above copyright 11281494Sandrew * notice, this list of conditions and the following disclaimer in the 12281494Sandrew * documentation and/or other materials provided with the distribution. 13281494Sandrew * 14281494Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15281494Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16281494Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17281494Sandrew * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18281494Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19281494Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20281494Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21281494Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22281494Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23281494Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24281494Sandrew * SUCH DAMAGE. 25281494Sandrew * 26281494Sandrew */ 27281494Sandrew 28281494Sandrew#include "opt_platform.h" 29281494Sandrew 30281494Sandrew#include <sys/param.h> 31281494Sandrew__FBSDID("$FreeBSD$"); 32281494Sandrew 33281494Sandrew#include <vm/vm.h> 34281494Sandrew#include <vm/pmap.h> 35281494Sandrew 36281494Sandrew#include <machine/bus.h> 37281494Sandrew 38281494Sandrewuint8_t generic_bs_r_1(void *, bus_space_handle_t, bus_size_t); 39281494Sandrewuint16_t generic_bs_r_2(void *, bus_space_handle_t, bus_size_t); 40281494Sandrewuint32_t generic_bs_r_4(void *, bus_space_handle_t, bus_size_t); 41281494Sandrewuint64_t generic_bs_r_8(void *, bus_space_handle_t, bus_size_t); 42281494Sandrew 43281494Sandrewvoid generic_bs_rm_1(void *, bus_space_handle_t, bus_size_t, uint8_t *, 44281494Sandrew bus_size_t); 45281494Sandrewvoid generic_bs_rm_2(void *, bus_space_handle_t, bus_size_t, uint16_t *, 46281494Sandrew bus_size_t); 47281494Sandrewvoid generic_bs_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *, 48281494Sandrew bus_size_t); 49281494Sandrewvoid generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *, 50281494Sandrew bus_size_t); 51281494Sandrew 52286768Sandrewvoid generic_bs_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *, 53286768Sandrew bus_size_t); 54286768Sandrewvoid generic_bs_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *, 55286768Sandrew bus_size_t); 56286768Sandrewvoid generic_bs_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *, 57286768Sandrew bus_size_t); 58286768Sandrewvoid generic_bs_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *, 59286768Sandrew bus_size_t); 60286768Sandrew 61281494Sandrewvoid generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t); 62281494Sandrewvoid generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t); 63281494Sandrewvoid generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t); 64281494Sandrewvoid generic_bs_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t); 65281494Sandrew 66281494Sandrewvoid generic_bs_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 67281494Sandrew bus_size_t); 68281494Sandrewvoid generic_bs_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *, 69281494Sandrew bus_size_t); 70281494Sandrewvoid generic_bs_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *, 71281494Sandrew bus_size_t); 72281494Sandrewvoid generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *, 73281494Sandrew bus_size_t); 74281494Sandrew 75286768Sandrewvoid generic_bs_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 76286768Sandrew bus_size_t); 77286768Sandrewvoid generic_bs_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *, 78286768Sandrew bus_size_t); 79286768Sandrewvoid generic_bs_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *, 80286768Sandrew bus_size_t); 81286768Sandrewvoid generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *, 82286768Sandrew bus_size_t); 83286768Sandrew 84281494Sandrewstatic int 85281494Sandrewgeneric_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, 86281494Sandrew bus_space_handle_t *bshp) 87281494Sandrew{ 88281494Sandrew void *va; 89281494Sandrew 90281494Sandrew va = pmap_mapdev(bpa, size); 91281494Sandrew if (va == NULL) 92281494Sandrew return (ENOMEM); 93281494Sandrew *bshp = (bus_space_handle_t)va; 94281494Sandrew return (0); 95281494Sandrew} 96281494Sandrew 97281494Sandrewstatic void 98281494Sandrewgeneric_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size) 99281494Sandrew{ 100281494Sandrew 101281494Sandrew pmap_unmapdev(bsh, size); 102281494Sandrew} 103281494Sandrew 104281494Sandrewstatic void 105281494Sandrewgeneric_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset, 106281494Sandrew bus_size_t size, int flags) 107281494Sandrew{ 108281494Sandrew} 109281494Sandrew 110281494Sandrewstatic int 111281494Sandrewgeneric_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset, 112281494Sandrew bus_size_t size, bus_space_handle_t *nbshp) 113281494Sandrew{ 114281494Sandrew 115281494Sandrew *nbshp = bsh + offset; 116281494Sandrew return (0); 117281494Sandrew} 118281494Sandrew 119281494Sandrewstruct bus_space memmap_bus = { 120281494Sandrew /* cookie */ 121281494Sandrew .bs_cookie = NULL, 122281494Sandrew 123281494Sandrew /* mapping/unmapping */ 124281494Sandrew .bs_map = generic_bs_map, 125281494Sandrew .bs_unmap = generic_bs_unmap, 126281494Sandrew .bs_subregion = generic_bs_subregion, 127281494Sandrew 128281494Sandrew /* allocation/deallocation */ 129281494Sandrew .bs_alloc = NULL, 130281494Sandrew .bs_free = NULL, 131281494Sandrew 132281494Sandrew /* barrier */ 133281494Sandrew .bs_barrier = generic_bs_barrier, 134281494Sandrew 135281494Sandrew /* read single */ 136281494Sandrew .bs_r_1 = generic_bs_r_1, 137281494Sandrew .bs_r_2 = generic_bs_r_2, 138281494Sandrew .bs_r_4 = generic_bs_r_4, 139281494Sandrew .bs_r_8 = generic_bs_r_8, 140281494Sandrew 141281494Sandrew /* read multiple */ 142281494Sandrew .bs_rm_1 = generic_bs_rm_1, 143281494Sandrew .bs_rm_2 = generic_bs_rm_2, 144281494Sandrew .bs_rm_4 = generic_bs_rm_4, 145281494Sandrew .bs_rm_8 = generic_bs_rm_8, 146281494Sandrew 147286768Sandrew /* read region */ 148286768Sandrew .bs_rr_1 = generic_bs_rr_1, 149286768Sandrew .bs_rr_2 = generic_bs_rr_2, 150286768Sandrew .bs_rr_4 = generic_bs_rr_4, 151286768Sandrew .bs_rr_8 = generic_bs_rr_8, 152286768Sandrew 153281494Sandrew /* write single */ 154281494Sandrew .bs_w_1 = generic_bs_w_1, 155281494Sandrew .bs_w_2 = generic_bs_w_2, 156281494Sandrew .bs_w_4 = generic_bs_w_4, 157281494Sandrew .bs_w_8 = generic_bs_w_8, 158281494Sandrew 159281494Sandrew /* write multiple */ 160281494Sandrew .bs_wm_1 = generic_bs_wm_1, 161281494Sandrew .bs_wm_2 = generic_bs_wm_2, 162281494Sandrew .bs_wm_4 = generic_bs_wm_4, 163281494Sandrew .bs_wm_8 = generic_bs_wm_8, 164281494Sandrew 165281494Sandrew /* write region */ 166286768Sandrew .bs_wr_1 = generic_bs_wr_1, 167286768Sandrew .bs_wr_2 = generic_bs_wr_2, 168286768Sandrew .bs_wr_4 = generic_bs_wr_4, 169286768Sandrew .bs_wr_8 = generic_bs_wr_8, 170281494Sandrew 171281494Sandrew /* set multiple */ 172281494Sandrew .bs_sm_1 = NULL, 173281494Sandrew .bs_sm_2 = NULL, 174281494Sandrew .bs_sm_4 = NULL, 175281494Sandrew .bs_sm_8 = NULL, 176281494Sandrew 177281494Sandrew /* set region */ 178281494Sandrew .bs_sr_1 = NULL, 179281494Sandrew .bs_sr_2 = NULL, 180281494Sandrew .bs_sr_4 = NULL, 181281494Sandrew .bs_sr_8 = NULL, 182281494Sandrew 183281494Sandrew /* copy */ 184281494Sandrew .bs_c_1 = NULL, 185281494Sandrew .bs_c_2 = NULL, 186281494Sandrew .bs_c_4 = NULL, 187281494Sandrew .bs_c_8 = NULL, 188281494Sandrew 189281494Sandrew /* read single stream */ 190281494Sandrew .bs_r_1_s = NULL, 191281494Sandrew .bs_r_2_s = NULL, 192281494Sandrew .bs_r_4_s = NULL, 193281494Sandrew .bs_r_8_s = NULL, 194281494Sandrew 195281494Sandrew /* read multiple stream */ 196282200Sbr .bs_rm_1_s = generic_bs_rm_1, 197282200Sbr .bs_rm_2_s = generic_bs_rm_2, 198282200Sbr .bs_rm_4_s = generic_bs_rm_4, 199282200Sbr .bs_rm_8_s = generic_bs_rm_8, 200281494Sandrew 201281494Sandrew /* read region stream */ 202281494Sandrew .bs_rr_1_s = NULL, 203281494Sandrew .bs_rr_2_s = NULL, 204281494Sandrew .bs_rr_4_s = NULL, 205281494Sandrew .bs_rr_8_s = NULL, 206281494Sandrew 207281494Sandrew /* write single stream */ 208281494Sandrew .bs_w_1_s = NULL, 209281494Sandrew .bs_w_2_s = NULL, 210281494Sandrew .bs_w_4_s = NULL, 211281494Sandrew .bs_w_8_s = NULL, 212281494Sandrew 213281494Sandrew /* write multiple stream */ 214282200Sbr .bs_wm_1_s = generic_bs_wm_1, 215282200Sbr .bs_wm_2_s = generic_bs_wm_2, 216282200Sbr .bs_wm_4_s = generic_bs_wm_4, 217282200Sbr .bs_wm_8_s = generic_bs_wm_8, 218281494Sandrew 219281494Sandrew /* write region stream */ 220281494Sandrew .bs_wr_1_s = NULL, 221281494Sandrew .bs_wr_2_s = NULL, 222281494Sandrew .bs_wr_4_s = NULL, 223281494Sandrew .bs_wr_8_s = NULL, 224281494Sandrew}; 225281494Sandrew 226281494Sandrew#ifdef FDT 227281494Sandrewbus_space_tag_t fdtbus_bs_tag = &memmap_bus; 228281494Sandrew#endif 229