1295041Sbr/*- 2298635Sbr * Copyright (c) 2014 Andrew Turner 3295041Sbr * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 4295041Sbr * All rights reserved. 5295041Sbr * 6295041Sbr * Portions of this software were developed by SRI International and the 7295041Sbr * University of Cambridge Computer Laboratory under DARPA/AFRL contract 8295041Sbr * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 9295041Sbr * 10295041Sbr * Portions of this software were developed by the University of Cambridge 11295041Sbr * Computer Laboratory as part of the CTSRD Project, with support from the 12295041Sbr * UK Higher Education Innovation Fund (HEIF). 13295041Sbr * 14295041Sbr * Redistribution and use in source and binary forms, with or without 15295041Sbr * modification, are permitted provided that the following conditions 16295041Sbr * are met: 17295041Sbr * 1. Redistributions of source code must retain the above copyright 18295041Sbr * notice, this list of conditions and the following disclaimer. 19295041Sbr * 2. Redistributions in binary form must reproduce the above copyright 20295041Sbr * notice, this list of conditions and the following disclaimer in the 21295041Sbr * documentation and/or other materials provided with the distribution. 22295041Sbr * 23295041Sbr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24295041Sbr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25295041Sbr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26295041Sbr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 27295041Sbr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28295041Sbr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29295041Sbr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30295041Sbr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31295041Sbr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32295041Sbr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33295041Sbr * SUCH DAMAGE. 34295041Sbr */ 35295041Sbr 36295041Sbr#include "opt_platform.h" 37295041Sbr 38295041Sbr#include <sys/param.h> 39295041Sbr__FBSDID("$FreeBSD$"); 40295041Sbr 41295041Sbr#include <vm/vm.h> 42295041Sbr#include <vm/pmap.h> 43295041Sbr 44295041Sbr#include <machine/bus.h> 45295041Sbr 46298635Sbruint8_t generic_bs_r_1(void *, bus_space_handle_t, bus_size_t); 47298635Sbruint16_t generic_bs_r_2(void *, bus_space_handle_t, bus_size_t); 48298635Sbruint32_t generic_bs_r_4(void *, bus_space_handle_t, bus_size_t); 49298635Sbruint64_t generic_bs_r_8(void *, bus_space_handle_t, bus_size_t); 50298635Sbr 51298635Sbrvoid generic_bs_rm_1(void *, bus_space_handle_t, bus_size_t, uint8_t *, 52298635Sbr bus_size_t); 53298635Sbrvoid generic_bs_rm_2(void *, bus_space_handle_t, bus_size_t, uint16_t *, 54298635Sbr bus_size_t); 55298635Sbrvoid generic_bs_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *, 56298635Sbr bus_size_t); 57298635Sbrvoid generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *, 58298635Sbr bus_size_t); 59298635Sbr 60298635Sbrvoid generic_bs_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *, 61298635Sbr bus_size_t); 62298635Sbrvoid generic_bs_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *, 63298635Sbr bus_size_t); 64298635Sbrvoid generic_bs_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *, 65298635Sbr bus_size_t); 66298635Sbrvoid generic_bs_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *, 67298635Sbr bus_size_t); 68298635Sbr 69298635Sbrvoid generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t); 70298635Sbrvoid generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t); 71298635Sbrvoid generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t); 72298635Sbrvoid generic_bs_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t); 73298635Sbr 74298635Sbrvoid generic_bs_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 75298635Sbr bus_size_t); 76298635Sbrvoid generic_bs_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *, 77298635Sbr bus_size_t); 78298635Sbrvoid generic_bs_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *, 79298635Sbr bus_size_t); 80298635Sbrvoid generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *, 81298635Sbr bus_size_t); 82298635Sbr 83298635Sbrvoid generic_bs_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 84298635Sbr bus_size_t); 85298635Sbrvoid generic_bs_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *, 86298635Sbr bus_size_t); 87298635Sbrvoid generic_bs_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *, 88298635Sbr bus_size_t); 89298635Sbrvoid generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *, 90298635Sbr bus_size_t); 91298635Sbr 92298635Sbrstatic int 93298635Sbrgeneric_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, 94298635Sbr bus_space_handle_t *bshp) 95298635Sbr{ 96298635Sbr void *va; 97298635Sbr 98298635Sbr va = pmap_mapdev(bpa, size); 99298635Sbr if (va == NULL) 100298635Sbr return (ENOMEM); 101298635Sbr *bshp = (bus_space_handle_t)va; 102298635Sbr return (0); 103298635Sbr} 104298635Sbr 105298635Sbrstatic void 106298635Sbrgeneric_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size) 107298635Sbr{ 108298635Sbr 109298635Sbr pmap_unmapdev(bsh, size); 110298635Sbr} 111298635Sbr 112298635Sbrstatic void 113298635Sbrgeneric_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset, 114298635Sbr bus_size_t size, int flags) 115298635Sbr{ 116298635Sbr} 117298635Sbr 118298635Sbrstatic int 119298635Sbrgeneric_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset, 120298635Sbr bus_size_t size, bus_space_handle_t *nbshp) 121298635Sbr{ 122298635Sbr 123298635Sbr *nbshp = bsh + offset; 124298635Sbr return (0); 125298635Sbr} 126298635Sbr 127295041Sbrstruct bus_space memmap_bus = { 128295041Sbr /* cookie */ 129295041Sbr .bs_cookie = NULL, 130295041Sbr 131295041Sbr /* mapping/unmapping */ 132298635Sbr .bs_map = generic_bs_map, 133298635Sbr .bs_unmap = generic_bs_unmap, 134298635Sbr .bs_subregion = generic_bs_subregion, 135295041Sbr 136295041Sbr /* allocation/deallocation */ 137295041Sbr .bs_alloc = NULL, 138295041Sbr .bs_free = NULL, 139295041Sbr 140295041Sbr /* barrier */ 141298635Sbr .bs_barrier = generic_bs_barrier, 142295041Sbr 143295041Sbr /* read single */ 144298635Sbr .bs_r_1 = generic_bs_r_1, 145298635Sbr .bs_r_2 = generic_bs_r_2, 146298635Sbr .bs_r_4 = generic_bs_r_4, 147298635Sbr .bs_r_8 = generic_bs_r_8, 148295041Sbr 149295041Sbr /* read multiple */ 150295041Sbr .bs_rm_1 = NULL, 151295041Sbr .bs_rm_2 = NULL, 152295041Sbr .bs_rm_4 = NULL, 153295041Sbr .bs_rm_8 = NULL, 154295041Sbr 155295041Sbr /* write single */ 156298635Sbr .bs_w_1 = generic_bs_w_1, 157298635Sbr .bs_w_2 = generic_bs_w_2, 158298635Sbr .bs_w_4 = generic_bs_w_4, 159298635Sbr .bs_w_8 = generic_bs_w_8, 160295041Sbr 161295041Sbr /* write multiple */ 162295041Sbr .bs_wm_1 = NULL, 163295041Sbr .bs_wm_2 = NULL, 164295041Sbr .bs_wm_4 = NULL, 165295041Sbr .bs_wm_8 = NULL, 166295041Sbr 167295041Sbr /* write region */ 168295041Sbr .bs_wr_1 = NULL, 169295041Sbr .bs_wr_2 = NULL, 170295041Sbr .bs_wr_4 = NULL, 171295041Sbr .bs_wr_8 = NULL, 172295041Sbr 173295041Sbr /* set multiple */ 174295041Sbr .bs_sm_1 = NULL, 175295041Sbr .bs_sm_2 = NULL, 176295041Sbr .bs_sm_4 = NULL, 177295041Sbr .bs_sm_8 = NULL, 178295041Sbr 179295041Sbr /* set region */ 180295041Sbr .bs_sr_1 = NULL, 181295041Sbr .bs_sr_2 = NULL, 182295041Sbr .bs_sr_4 = NULL, 183295041Sbr .bs_sr_8 = NULL, 184295041Sbr 185295041Sbr /* copy */ 186295041Sbr .bs_c_1 = NULL, 187295041Sbr .bs_c_2 = NULL, 188295041Sbr .bs_c_4 = NULL, 189295041Sbr .bs_c_8 = NULL, 190295041Sbr 191295041Sbr /* read single stream */ 192295041Sbr .bs_r_1_s = NULL, 193295041Sbr .bs_r_2_s = NULL, 194295041Sbr .bs_r_4_s = NULL, 195295041Sbr .bs_r_8_s = NULL, 196295041Sbr 197295041Sbr /* read multiple stream */ 198295041Sbr .bs_rm_1_s = NULL, 199295041Sbr .bs_rm_2_s = NULL, 200295041Sbr .bs_rm_4_s = NULL, 201295041Sbr .bs_rm_8_s = NULL, 202295041Sbr 203295041Sbr /* read region stream */ 204295041Sbr .bs_rr_1_s = NULL, 205295041Sbr .bs_rr_2_s = NULL, 206295041Sbr .bs_rr_4_s = NULL, 207295041Sbr .bs_rr_8_s = NULL, 208295041Sbr 209295041Sbr /* write single stream */ 210295041Sbr .bs_w_1_s = NULL, 211295041Sbr .bs_w_2_s = NULL, 212295041Sbr .bs_w_4_s = NULL, 213295041Sbr .bs_w_8_s = NULL, 214295041Sbr 215295041Sbr /* write multiple stream */ 216295041Sbr .bs_wm_1_s = NULL, 217295041Sbr .bs_wm_2_s = NULL, 218295041Sbr .bs_wm_4_s = NULL, 219295041Sbr .bs_wm_8_s = NULL, 220295041Sbr 221295041Sbr /* write region stream */ 222295041Sbr .bs_wr_1_s = NULL, 223295041Sbr .bs_wr_2_s = NULL, 224295041Sbr .bs_wr_4_s = NULL, 225295041Sbr .bs_wr_8_s = NULL, 226295041Sbr}; 227298635Sbr 228298635Sbr#ifdef FDT 229298635Sbrbus_space_tag_t fdtbus_bs_tag = &memmap_bus; 230298635Sbr#endif 231