bus_machdep.c revision 281494
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: head/sys/arm64/arm64/bus_machdep.c 281494 2015-04-13 14:43:10Z andrew $"); 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 52281494Sandrewvoid generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t); 53281494Sandrewvoid generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t); 54281494Sandrewvoid generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t); 55281494Sandrewvoid generic_bs_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t); 56281494Sandrew 57281494Sandrewvoid generic_bs_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 58281494Sandrew bus_size_t); 59281494Sandrewvoid generic_bs_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *, 60281494Sandrew bus_size_t); 61281494Sandrewvoid generic_bs_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *, 62281494Sandrew bus_size_t); 63281494Sandrewvoid generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *, 64281494Sandrew bus_size_t); 65281494Sandrew 66281494Sandrewstatic int 67281494Sandrewgeneric_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, 68281494Sandrew bus_space_handle_t *bshp) 69281494Sandrew{ 70281494Sandrew void *va; 71281494Sandrew 72281494Sandrew va = pmap_mapdev(bpa, size); 73281494Sandrew if (va == NULL) 74281494Sandrew return (ENOMEM); 75281494Sandrew *bshp = (bus_space_handle_t)va; 76281494Sandrew return (0); 77281494Sandrew} 78281494Sandrew 79281494Sandrewstatic void 80281494Sandrewgeneric_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size) 81281494Sandrew{ 82281494Sandrew 83281494Sandrew pmap_unmapdev(bsh, size); 84281494Sandrew} 85281494Sandrew 86281494Sandrewstatic void 87281494Sandrewgeneric_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset, 88281494Sandrew bus_size_t size, int flags) 89281494Sandrew{ 90281494Sandrew} 91281494Sandrew 92281494Sandrewstatic int 93281494Sandrewgeneric_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset, 94281494Sandrew bus_size_t size, bus_space_handle_t *nbshp) 95281494Sandrew{ 96281494Sandrew 97281494Sandrew *nbshp = bsh + offset; 98281494Sandrew return (0); 99281494Sandrew} 100281494Sandrew 101281494Sandrewstruct bus_space memmap_bus = { 102281494Sandrew /* cookie */ 103281494Sandrew .bs_cookie = NULL, 104281494Sandrew 105281494Sandrew /* mapping/unmapping */ 106281494Sandrew .bs_map = generic_bs_map, 107281494Sandrew .bs_unmap = generic_bs_unmap, 108281494Sandrew .bs_subregion = generic_bs_subregion, 109281494Sandrew 110281494Sandrew /* allocation/deallocation */ 111281494Sandrew .bs_alloc = NULL, 112281494Sandrew .bs_free = NULL, 113281494Sandrew 114281494Sandrew /* barrier */ 115281494Sandrew .bs_barrier = generic_bs_barrier, 116281494Sandrew 117281494Sandrew /* read single */ 118281494Sandrew .bs_r_1 = generic_bs_r_1, 119281494Sandrew .bs_r_2 = generic_bs_r_2, 120281494Sandrew .bs_r_4 = generic_bs_r_4, 121281494Sandrew .bs_r_8 = generic_bs_r_8, 122281494Sandrew 123281494Sandrew /* read multiple */ 124281494Sandrew .bs_rm_1 = generic_bs_rm_1, 125281494Sandrew .bs_rm_2 = generic_bs_rm_2, 126281494Sandrew .bs_rm_4 = generic_bs_rm_4, 127281494Sandrew .bs_rm_8 = generic_bs_rm_8, 128281494Sandrew 129281494Sandrew /* write single */ 130281494Sandrew .bs_w_1 = generic_bs_w_1, 131281494Sandrew .bs_w_2 = generic_bs_w_2, 132281494Sandrew .bs_w_4 = generic_bs_w_4, 133281494Sandrew .bs_w_8 = generic_bs_w_8, 134281494Sandrew 135281494Sandrew /* write multiple */ 136281494Sandrew .bs_wm_1 = generic_bs_wm_1, 137281494Sandrew .bs_wm_2 = generic_bs_wm_2, 138281494Sandrew .bs_wm_4 = generic_bs_wm_4, 139281494Sandrew .bs_wm_8 = generic_bs_wm_8, 140281494Sandrew 141281494Sandrew /* write region */ 142281494Sandrew .bs_wr_1 = NULL, 143281494Sandrew .bs_wr_2 = NULL, 144281494Sandrew .bs_wr_4 = NULL, 145281494Sandrew .bs_wr_8 = NULL, 146281494Sandrew 147281494Sandrew /* set multiple */ 148281494Sandrew .bs_sm_1 = NULL, 149281494Sandrew .bs_sm_2 = NULL, 150281494Sandrew .bs_sm_4 = NULL, 151281494Sandrew .bs_sm_8 = NULL, 152281494Sandrew 153281494Sandrew /* set region */ 154281494Sandrew .bs_sr_1 = NULL, 155281494Sandrew .bs_sr_2 = NULL, 156281494Sandrew .bs_sr_4 = NULL, 157281494Sandrew .bs_sr_8 = NULL, 158281494Sandrew 159281494Sandrew /* copy */ 160281494Sandrew .bs_c_1 = NULL, 161281494Sandrew .bs_c_2 = NULL, 162281494Sandrew .bs_c_4 = NULL, 163281494Sandrew .bs_c_8 = NULL, 164281494Sandrew 165281494Sandrew /* read single stream */ 166281494Sandrew .bs_r_1_s = NULL, 167281494Sandrew .bs_r_2_s = NULL, 168281494Sandrew .bs_r_4_s = NULL, 169281494Sandrew .bs_r_8_s = NULL, 170281494Sandrew 171281494Sandrew /* read multiple stream */ 172281494Sandrew .bs_rm_1_s = NULL, 173281494Sandrew .bs_rm_2_s = NULL, 174281494Sandrew .bs_rm_4_s = NULL, 175281494Sandrew .bs_rm_8_s = NULL, 176281494Sandrew 177281494Sandrew /* read region stream */ 178281494Sandrew .bs_rr_1_s = NULL, 179281494Sandrew .bs_rr_2_s = NULL, 180281494Sandrew .bs_rr_4_s = NULL, 181281494Sandrew .bs_rr_8_s = NULL, 182281494Sandrew 183281494Sandrew /* write single stream */ 184281494Sandrew .bs_w_1_s = NULL, 185281494Sandrew .bs_w_2_s = NULL, 186281494Sandrew .bs_w_4_s = NULL, 187281494Sandrew .bs_w_8_s = NULL, 188281494Sandrew 189281494Sandrew /* write multiple stream */ 190281494Sandrew .bs_wm_1_s = NULL, 191281494Sandrew .bs_wm_2_s = NULL, 192281494Sandrew .bs_wm_4_s = NULL, 193281494Sandrew .bs_wm_8_s = NULL, 194281494Sandrew 195281494Sandrew /* write region stream */ 196281494Sandrew .bs_wr_1_s = NULL, 197281494Sandrew .bs_wr_2_s = NULL, 198281494Sandrew .bs_wr_4_s = NULL, 199281494Sandrew .bs_wr_8_s = NULL, 200281494Sandrew}; 201281494Sandrew 202281494Sandrew#ifdef FDT 203281494Sandrewbus_space_tag_t fdtbus_bs_tag = &memmap_bus; 204281494Sandrew#endif 205