1ca987d46SWarner Losh /* $FreeBSD$ */ 2ca987d46SWarner Losh /*- 3ca987d46SWarner Losh * Copyright (c) 2013 Hans Petter Selasky. All rights reserved. 4ca987d46SWarner Losh * 5ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without 6ca987d46SWarner Losh * modification, are permitted provided that the following conditions 7ca987d46SWarner Losh * are met: 8ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright 9ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer. 10ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright 11ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer in the 12ca987d46SWarner Losh * documentation and/or other materials provided with the distribution. 13ca987d46SWarner Losh * 14ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17ca987d46SWarner Losh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24ca987d46SWarner Losh * SUCH DAMAGE. 25ca987d46SWarner Losh */ 26ca987d46SWarner Losh 27ca987d46SWarner Losh #include <bsd_kernel.h> 28ca987d46SWarner Losh 29ca987d46SWarner Losh struct burst { 30ca987d46SWarner Losh uint32_t dw0; 31ca987d46SWarner Losh uint32_t dw1; 32ca987d46SWarner Losh uint32_t dw2; 33ca987d46SWarner Losh uint32_t dw3; 34ca987d46SWarner Losh uint32_t dw4; 35ca987d46SWarner Losh uint32_t dw5; 36ca987d46SWarner Losh uint32_t dw6; 37ca987d46SWarner Losh uint32_t dw7; 38ca987d46SWarner Losh }; 39ca987d46SWarner Losh 40ca987d46SWarner Losh int 41ca987d46SWarner Losh bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, 42ca987d46SWarner Losh bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) 43ca987d46SWarner Losh { 44ca987d46SWarner Losh 45ca987d46SWarner Losh *nbshp = bsh + offset; 46ca987d46SWarner Losh return (0); 47ca987d46SWarner Losh } 48ca987d46SWarner Losh 49ca987d46SWarner Losh void 50ca987d46SWarner Losh bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, 51ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count) 52ca987d46SWarner Losh { 53ca987d46SWarner Losh while (count--) { 54ca987d46SWarner Losh *datap++ = bus_space_read_1(t, h, offset); 55ca987d46SWarner Losh } 56ca987d46SWarner Losh } 57ca987d46SWarner Losh 58ca987d46SWarner Losh void 59ca987d46SWarner Losh bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, 60ca987d46SWarner Losh bus_size_t offset, uint16_t *datap, bus_size_t count) 61ca987d46SWarner Losh { 62ca987d46SWarner Losh while (count--) { 63ca987d46SWarner Losh *datap++ = bus_space_read_2(t, h, offset); 64ca987d46SWarner Losh } 65ca987d46SWarner Losh } 66ca987d46SWarner Losh 67ca987d46SWarner Losh void 68ca987d46SWarner Losh bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, 69ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count) 70ca987d46SWarner Losh { 71ca987d46SWarner Losh h += offset; 72ca987d46SWarner Losh 73ca987d46SWarner Losh while (count--) { 74ca987d46SWarner Losh *datap++ = *((volatile uint32_t *)h); 75ca987d46SWarner Losh } 76ca987d46SWarner Losh } 77ca987d46SWarner Losh 78ca987d46SWarner Losh void 79ca987d46SWarner Losh bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, 80ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count) 81ca987d46SWarner Losh { 82ca987d46SWarner Losh while (count--) { 83ca987d46SWarner Losh uint8_t temp = *datap++; 84ca987d46SWarner Losh 85ca987d46SWarner Losh bus_space_write_1(t, h, offset, temp); 86ca987d46SWarner Losh } 87ca987d46SWarner Losh } 88ca987d46SWarner Losh 89ca987d46SWarner Losh void 90ca987d46SWarner Losh bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, 91ca987d46SWarner Losh bus_size_t offset, uint16_t *datap, bus_size_t count) 92ca987d46SWarner Losh { 93ca987d46SWarner Losh while (count--) { 94ca987d46SWarner Losh uint16_t temp = *datap++; 95ca987d46SWarner Losh 96ca987d46SWarner Losh bus_space_write_2(t, h, offset, temp); 97ca987d46SWarner Losh } 98ca987d46SWarner Losh } 99ca987d46SWarner Losh 100ca987d46SWarner Losh void 101ca987d46SWarner Losh bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, 102ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count) 103ca987d46SWarner Losh { 104ca987d46SWarner Losh h += offset; 105ca987d46SWarner Losh 106ca987d46SWarner Losh while (count--) { 107ca987d46SWarner Losh *((volatile uint32_t *)h) = *datap++; 108ca987d46SWarner Losh } 109ca987d46SWarner Losh } 110ca987d46SWarner Losh 111ca987d46SWarner Losh void 112ca987d46SWarner Losh bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, 113ca987d46SWarner Losh bus_size_t offset, uint8_t data) 114ca987d46SWarner Losh { 115ca987d46SWarner Losh *((volatile uint8_t *)(h + offset)) = data; 116ca987d46SWarner Losh } 117ca987d46SWarner Losh 118ca987d46SWarner Losh void 119ca987d46SWarner Losh bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, 120ca987d46SWarner Losh bus_size_t offset, uint16_t data) 121ca987d46SWarner Losh { 122ca987d46SWarner Losh *((volatile uint16_t *)(h + offset)) = data; 123ca987d46SWarner Losh } 124ca987d46SWarner Losh 125ca987d46SWarner Losh void 126ca987d46SWarner Losh bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, 127ca987d46SWarner Losh bus_size_t offset, uint32_t data) 128ca987d46SWarner Losh { 129ca987d46SWarner Losh *((volatile uint32_t *)(h + offset)) = data; 130ca987d46SWarner Losh } 131ca987d46SWarner Losh 132ca987d46SWarner Losh uint8_t 133ca987d46SWarner Losh bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset) 134ca987d46SWarner Losh { 135ca987d46SWarner Losh return (*((volatile uint8_t *)(h + offset))); 136ca987d46SWarner Losh } 137ca987d46SWarner Losh 138ca987d46SWarner Losh uint16_t 139ca987d46SWarner Losh bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset) 140ca987d46SWarner Losh { 141ca987d46SWarner Losh return (*((volatile uint16_t *)(h + offset))); 142ca987d46SWarner Losh } 143ca987d46SWarner Losh 144ca987d46SWarner Losh uint32_t 145ca987d46SWarner Losh bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset) 146ca987d46SWarner Losh { 147ca987d46SWarner Losh return (*((volatile uint32_t *)(h + offset))); 148ca987d46SWarner Losh } 149ca987d46SWarner Losh 150ca987d46SWarner Losh void 151ca987d46SWarner Losh bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, 152ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count) 153ca987d46SWarner Losh { 154ca987d46SWarner Losh h += offset; 155ca987d46SWarner Losh 156ca987d46SWarner Losh while (count--) { 157ca987d46SWarner Losh *datap++ = *((volatile uint8_t *)h); 158ca987d46SWarner Losh h += 1; 159ca987d46SWarner Losh } 160ca987d46SWarner Losh } 161ca987d46SWarner Losh 162ca987d46SWarner Losh void 163ca987d46SWarner Losh bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, 164ca987d46SWarner Losh bus_size_t offset, uint8_t *datap, bus_size_t count) 165ca987d46SWarner Losh { 166ca987d46SWarner Losh h += offset; 167ca987d46SWarner Losh 168ca987d46SWarner Losh while (count--) { 169ca987d46SWarner Losh *((volatile uint8_t *)h) = *datap++; 170ca987d46SWarner Losh h += 1; 171ca987d46SWarner Losh } 172ca987d46SWarner Losh } 173ca987d46SWarner Losh 174ca987d46SWarner Losh void 175ca987d46SWarner Losh bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, 176ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count) 177ca987d46SWarner Losh { 178ca987d46SWarner Losh enum { BURST = sizeof(struct burst) / 4 }; 179ca987d46SWarner Losh 180ca987d46SWarner Losh h += offset; 181ca987d46SWarner Losh 182ca987d46SWarner Losh while (count >= BURST) { 183ca987d46SWarner Losh *(struct burst *)datap = *((/* volatile */ struct burst *)h); 184ca987d46SWarner Losh 185ca987d46SWarner Losh h += BURST * 4; 186ca987d46SWarner Losh datap += BURST; 187ca987d46SWarner Losh count -= BURST; 188ca987d46SWarner Losh } 189ca987d46SWarner Losh 190ca987d46SWarner Losh while (count--) { 191ca987d46SWarner Losh *datap++ = *((volatile uint32_t *)h); 192ca987d46SWarner Losh h += 4; 193ca987d46SWarner Losh } 194ca987d46SWarner Losh } 195ca987d46SWarner Losh 196ca987d46SWarner Losh void 197ca987d46SWarner Losh bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, 198ca987d46SWarner Losh bus_size_t offset, uint32_t *datap, bus_size_t count) 199ca987d46SWarner Losh { 200ca987d46SWarner Losh enum { BURST = sizeof(struct burst) / 4 }; 201ca987d46SWarner Losh 202ca987d46SWarner Losh h += offset; 203ca987d46SWarner Losh 204ca987d46SWarner Losh while (count >= BURST) { 205ca987d46SWarner Losh *((/* volatile */ struct burst *)h) = *(struct burst *)datap; 206ca987d46SWarner Losh 207ca987d46SWarner Losh h += BURST * 4; 208ca987d46SWarner Losh datap += BURST; 209ca987d46SWarner Losh count -= BURST; 210ca987d46SWarner Losh } 211ca987d46SWarner Losh 212ca987d46SWarner Losh while (count--) { 213ca987d46SWarner Losh *((volatile uint32_t *)h) = *datap++; 214ca987d46SWarner Losh h += 4; 215ca987d46SWarner Losh } 216ca987d46SWarner Losh } 217