bus_space_rmi.c revision 202066
1250079Scarl/*- 2250079Scarl * Copyright (c) 2009 RMI Corporation 3289542Scem * All rights reserved. 4250079Scarl * 5250079Scarl * Redistribution and use in source and binary forms, with or without 6250079Scarl * modification, are permitted provided that the following conditions 7250079Scarl * are met: 8250079Scarl * 1. Redistributions of source code must retain the above copyright 9250079Scarl * notice, this list of conditions and the following disclaimer. 10250079Scarl * 2. Redistributions in binary form must reproduce the above copyright 11250079Scarl * notice, this list of conditions and the following disclaimer in the 12250079Scarl * documentation and/or other materials provided with the distribution. 13250079Scarl * 14250079Scarl * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15250079Scarl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16250079Scarl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17250079Scarl * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18250079Scarl * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19250079Scarl * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20250079Scarl * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21250079Scarl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22250079Scarl * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23250079Scarl * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24250079Scarl * SUCH DAMAGE. 25250079Scarl * 26250079Scarl * $FreeBSD: head/sys/mips/rmi/bus_space_rmi.c 202066 2010-01-11 04:49:44Z imp $ 27250079Scarl */ 28250079Scarl#include <sys/cdefs.h> 29250079Scarl__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi.c 202066 2010-01-11 04:49:44Z imp $"); 30250079Scarl 31250079Scarl#include <sys/param.h> 32250079Scarl#include <sys/systm.h> 33250079Scarl#include <sys/bus.h> 34250079Scarl#include <sys/kernel.h> 35250079Scarl#include <sys/malloc.h> 36250079Scarl#include <sys/ktr.h> 37250079Scarl 38250079Scarl#include <vm/vm.h> 39289207Scem#include <vm/pmap.h> 40250079Scarl#include <vm/vm_kern.h> 41250079Scarl#include <vm/vm_extern.h> 42250079Scarl 43250079Scarl#include <machine/bus.h> 44250079Scarl#include <machine/cache.h> 45250079Scarlvoid xlr_print_int(uint32_t); 46250079Scarl 47250079Scarlstatic int 48250079Scarlrmi_bus_space_map(void *t, bus_addr_t addr, 49250079Scarl bus_size_t size, int flags, 50250079Scarl bus_space_handle_t * bshp); 51250079Scarl 52250079Scarl 53250079Scarlstatic void 54250079Scarlrmi_bus_space_unmap(void *t, bus_space_handle_t bsh, 55250079Scarl bus_size_t size); 56250079Scarl 57250079Scarlstatic int 58250079Scarlrmi_bus_space_subregion(void *t, 59250079Scarl bus_space_handle_t bsh, 60250079Scarl bus_size_t offset, bus_size_t size, 61250079Scarl bus_space_handle_t * nbshp); 62250079Scarl 63289538Scemstatic u_int8_t 64250079Scarlrmi_bus_space_read_1(void *t, 65289539Scem bus_space_handle_t handle, 66289539Scem bus_size_t offset); 67250079Scarl 68250079Scarlstatic u_int16_t 69250079Scarlrmi_bus_space_read_2(void *t, 70250079Scarl bus_space_handle_t handle, 71250079Scarl bus_size_t offset); 72250079Scarl 73250079Scarlstatic u_int32_t 74250079Scarlrmi_bus_space_read_4(void *t, 75289610Scem bus_space_handle_t handle, 76289610Scem bus_size_t offset); 77289610Scem 78289610Scemstatic void 79289610Scemrmi_bus_space_read_multi_1(void *t, 80289610Scem bus_space_handle_t handle, 81289610Scem bus_size_t offset, u_int8_t * addr, 82289610Scem size_t count); 83289610Scem 84289610Scemstatic void 85289610Scemrmi_bus_space_read_multi_2(void *t, 86289610Scem bus_space_handle_t handle, 87289539Scem bus_size_t offset, u_int16_t * addr, 88289539Scem size_t count); 89289539Scem 90289539Scemstatic void 91289539Scemrmi_bus_space_read_multi_4(void *t, 92289539Scem bus_space_handle_t handle, 93289539Scem bus_size_t offset, u_int32_t * addr, 94289539Scem size_t count); 95255274Scarl 96255274Scarlstatic void 97255274Scarlrmi_bus_space_read_region_1(void *t, 98255274Scarl bus_space_handle_t bsh, 99250079Scarl bus_size_t offset, u_int8_t * addr, 100250079Scarl size_t count); 101255274Scarl 102250079Scarlstatic void 103289397Scemrmi_bus_space_read_region_2(void *t, 104250079Scarl bus_space_handle_t bsh, 105250079Scarl bus_size_t offset, u_int16_t * addr, 106250079Scarl size_t count); 107250079Scarl 108250079Scarlstatic void 109250079Scarlrmi_bus_space_read_region_4(void *t, 110250079Scarl bus_space_handle_t bsh, 111250079Scarl bus_size_t offset, u_int32_t * addr, 112250079Scarl size_t count); 113250079Scarl 114289543Scemstatic void 115289543Scemrmi_bus_space_write_1(void *t, 116289543Scem bus_space_handle_t handle, 117289543Scem bus_size_t offset, u_int8_t value); 118289543Scem 119250079Scarlstatic void 120250079Scarlrmi_bus_space_write_2(void *t, 121250079Scarl bus_space_handle_t handle, 122250079Scarl bus_size_t offset, u_int16_t value); 123250079Scarl 124250079Scarlstatic void 125250079Scarlrmi_bus_space_write_4(void *t, 126250079Scarl bus_space_handle_t handle, 127289546Scem bus_size_t offset, u_int32_t value); 128250079Scarl 129289546Scemstatic void 130250079Scarlrmi_bus_space_write_multi_1(void *t, 131250079Scarl bus_space_handle_t handle, 132289542Scem bus_size_t offset, 133289542Scem const u_int8_t * addr, 134289542Scem size_t count); 135289542Scemstatic void 136289542Scemrmi_bus_space_write_multi_2(void *t, 137289542Scem bus_space_handle_t handle, 138289542Scem bus_size_t offset, 139289542Scem const u_int16_t * addr, 140289542Scem size_t count); 141289542Scem 142289542Scemstatic void 143289542Scemrmi_bus_space_write_multi_4(void *t, 144289542Scem bus_space_handle_t handle, 145289542Scem bus_size_t offset, 146289546Scem const u_int32_t * addr, 147289546Scem size_t count); 148289546Scem 149289546Scemstatic void 150289546Scemrmi_bus_space_write_region_2(void *t, 151289546Scem bus_space_handle_t bsh, 152289546Scem bus_size_t offset, 153289546Scem const u_int16_t * addr, 154289546Scem size_t count); 155289546Scem 156289546Scemstatic void 157289546Scemrmi_bus_space_write_region_4(void *t, 158289542Scem bus_space_handle_t bsh, 159289542Scem bus_size_t offset, 160289542Scem const u_int32_t * addr, 161289542Scem size_t count); 162289542Scem 163289542Scem 164289542Scemstatic void 165289542Scemrmi_bus_space_set_region_2(void *t, 166289542Scem bus_space_handle_t bsh, 167289542Scem bus_size_t offset, u_int16_t value, 168250079Scarl size_t count); 169250079Scarlstatic void 170250079Scarlrmi_bus_space_set_region_4(void *t, 171255274Scarl bus_space_handle_t bsh, 172250079Scarl bus_size_t offset, u_int32_t value, 173250079Scarl size_t count); 174250079Scarl 175250079Scarlstatic void 176250079Scarlrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 177250079Scarl bus_size_t offset __unused, bus_size_t len __unused, int flags); 178250079Scarl 179250079Scarl 180289546Scemstatic void 181289546Scemrmi_bus_space_copy_region_2(void *t, 182289546Scem bus_space_handle_t bsh1, 183289546Scem bus_size_t off1, 184289546Scem bus_space_handle_t bsh2, 185289546Scem bus_size_t off2, size_t count); 186289546Scem 187250079Scarlu_int8_t 188289610Scemrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 189289610Scem bus_size_t offset); 190289610Scem 191289539Scemstatic u_int16_t 192289542Scemrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 193289542Scem bus_size_t offset); 194289542Scem 195289543Scemstatic u_int32_t 196289542Scemrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 197289542Scem bus_size_t offset); 198289539Scemstatic void 199289539Scemrmi_bus_space_read_multi_stream_1(void *t, 200289539Scem bus_space_handle_t handle, 201289539Scem bus_size_t offset, u_int8_t * addr, 202289539Scem size_t count); 203289542Scem 204289546Scemstatic void 205289546Scemrmi_bus_space_read_multi_stream_2(void *t, 206289546Scem bus_space_handle_t handle, 207289546Scem bus_size_t offset, u_int16_t * addr, 208289542Scem size_t count); 209289542Scem 210289546Scemstatic void 211289546Scemrmi_bus_space_read_multi_stream_4(void *t, 212289542Scem bus_space_handle_t handle, 213289542Scem bus_size_t offset, u_int32_t * addr, 214289542Scem size_t count); 215289546Scem 216289542Scemvoid 217289542Scemrmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 218289542Scem bus_size_t offset, u_int8_t value); 219289542Scemstatic void 220289542Scemrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 221289542Scem bus_size_t offset, u_int16_t value); 222289542Scem 223250079Scarlstatic void 224250079Scarlrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 225289234Scem bus_size_t offset, u_int32_t value); 226289234Scem 227289234Scemstatic void 228289234Scemrmi_bus_space_write_multi_stream_1(void *t, 229289234Scem bus_space_handle_t handle, 230289234Scem bus_size_t offset, 231289234Scem const u_int8_t * addr, 232289234Scem size_t count); 233289234Scemstatic void 234289234Scemrmi_bus_space_write_multi_stream_2(void *t, 235289234Scem bus_space_handle_t handle, 236289234Scem bus_size_t offset, 237289234Scem const u_int16_t * addr, 238289234Scem size_t count); 239289234Scem 240289234Scemstatic void 241289234Scemrmi_bus_space_write_multi_stream_4(void *t, 242289234Scem bus_space_handle_t handle, 243289234Scem bus_size_t offset, 244289234Scem const u_int32_t * addr, 245255279Scarl size_t count); 246255279Scarl 247255279Scarl 248255279Scarlstatic struct bus_space local_rmi_bus_space = { 249255279Scarl /* cookie */ 250255279Scarl (void *)0, 251255279Scarl 252250079Scarl /* mapping/unmapping */ 253255279Scarl rmi_bus_space_map, 254289397Scem rmi_bus_space_unmap, 255289542Scem rmi_bus_space_subregion, 256255279Scarl 257289542Scem /* allocation/deallocation */ 258289397Scem NULL, 259250079Scarl NULL, 260250079Scarl 261250079Scarl /* barrier */ 262250079Scarl rmi_bus_space_barrier, 263289539Scem 264289546Scem /* read (single) */ 265289546Scem rmi_bus_space_read_1, 266289546Scem rmi_bus_space_read_2, 267255272Scarl rmi_bus_space_read_4, 268289541Scem NULL, 269255272Scarl 270255272Scarl /* read multiple */ 271255272Scarl rmi_bus_space_read_multi_1, 272250079Scarl rmi_bus_space_read_multi_2, 273289344Scem rmi_bus_space_read_multi_4, 274289540Scem NULL, 275289342Scem 276289540Scem /* read region */ 277250079Scarl rmi_bus_space_read_region_1, 278289540Scem rmi_bus_space_read_region_2, 279289546Scem rmi_bus_space_read_region_4, 280289546Scem NULL, 281289546Scem 282289546Scem /* write (single) */ 283289546Scem rmi_bus_space_write_1, 284289546Scem rmi_bus_space_write_2, 285289546Scem rmi_bus_space_write_4, 286250079Scarl NULL, 287289397Scem 288289348Scem /* write multiple */ 289289348Scem rmi_bus_space_write_multi_1, 290289542Scem rmi_bus_space_write_multi_2, 291289542Scem rmi_bus_space_write_multi_4, 292289272Scem NULL, 293255279Scarl 294289543Scem /* write region */ 295289543Scem NULL, 296289543Scem rmi_bus_space_write_region_2, 297289543Scem rmi_bus_space_write_region_4, 298289543Scem NULL, 299289543Scem 300289542Scem /* set multiple */ 301289542Scem NULL, 302289546Scem NULL, 303289546Scem NULL, 304289546Scem NULL, 305289546Scem 306289542Scem /* set region */ 307289546Scem NULL, 308250079Scarl rmi_bus_space_set_region_2, 309289546Scem rmi_bus_space_set_region_4, 310255274Scarl NULL, 311250079Scarl 312250079Scarl /* copy */ 313289612Scem NULL, 314289612Scem rmi_bus_space_copy_region_2, 315289612Scem NULL, 316289233Scem NULL, 317289233Scem 318289538Scem /* read (single) stream */ 319289233Scem rmi_bus_space_read_stream_1, 320289538Scem rmi_bus_space_read_stream_2, 321289233Scem rmi_bus_space_read_stream_4, 322289538Scem NULL, 323289538Scem 324289233Scem /* read multiple stream */ 325289538Scem rmi_bus_space_read_multi_stream_1, 326289538Scem rmi_bus_space_read_multi_stream_2, 327289233Scem rmi_bus_space_read_multi_stream_4, 328289538Scem NULL, 329289538Scem 330289233Scem /* read region stream */ 331255274Scarl rmi_bus_space_read_region_1, 332250079Scarl rmi_bus_space_read_region_2, 333250079Scarl rmi_bus_space_read_region_4, 334289542Scem NULL, 335289542Scem 336289542Scem /* write (single) stream */ 337289542Scem rmi_bus_space_write_stream_1, 338289542Scem rmi_bus_space_write_stream_2, 339289542Scem rmi_bus_space_write_stream_4, 340289542Scem NULL, 341289607Scem 342289607Scem /* write multiple stream */ 343289607Scem rmi_bus_space_write_multi_stream_1, 344289607Scem rmi_bus_space_write_multi_stream_2, 345289607Scem rmi_bus_space_write_multi_stream_4, 346289607Scem NULL, 347289542Scem 348289542Scem /* write region stream */ 349289542Scem NULL, 350289542Scem rmi_bus_space_write_region_2, 351289542Scem rmi_bus_space_write_region_4, 352289542Scem NULL, 353289542Scem}; 354289542Scem 355289542Scem/* generic bus_space tag */ 356289546Scembus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 357289546Scem 358289546Scem#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ 359289542Scem#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ 360289546Scem#define MIPS_BUS_SPACE_PCI 10 /* avoid conflict with other spaces */ 361289542Scem 362289546Scem#define BUS_SPACE_UNRESTRICTED (~0) 363289542Scem 364289546Scem#define SWAP32(x)\ 365289542Scem (((x) & 0xff000000) >> 24) | \ 366289542Scem (((x) & 0x000000ff) << 24) | \ 367289542Scem (((x) & 0x0000ff00) << 8) | \ 368289542Scem (((x) & 0x00ff0000) >> 8) 369289542Scem 370289542Scem#define SWAP16(x)\ 371289542Scem (((x) & 0xff00) >> 8) | \ 372289542Scem (((x) & 0x00ff) << 8) 373289542Scem 374289607Scem/* 375289607Scem * Map a region of device bus space into CPU virtual address space. 376289607Scem */ 377289607Scem 378289607Scem 379289607Scemstatic int 380289542Scemrmi_bus_space_map(void *t __unused, bus_addr_t addr, 381289542Scem bus_size_t size __unused, int flags __unused, 382289542Scem bus_space_handle_t * bshp) 383289542Scem{ 384289542Scem 385289542Scem *bshp = addr; 386289542Scem return (0); 387289546Scem} 388289546Scem 389289546Scem/* 390289546Scem * Unmap a region of device bus space. 391289542Scem */ 392289546Scemstatic void 393289546Scemrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 394289546Scem bus_size_t size __unused) 395289542Scem{ 396289546Scem} 397289546Scem 398289542Scem/* 399289542Scem * Get a new handle for a subregion of an already-mapped area of bus space. 400289614Scem */ 401289542Scem 402289542Scemstatic int 403289542Scemrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 404289542Scem bus_size_t offset, bus_size_t size __unused, 405289542Scem bus_space_handle_t * nbshp) 406289542Scem{ 407289542Scem *nbshp = bsh + offset; 408289614Scem return (0); 409289542Scem} 410289542Scem 411289542Scem/* 412289542Scem * Read a 1, 2, 4, or 8 byte quantity from bus space 413289542Scem * described by tag/handle/offset. 414289542Scem */ 415289542Scem 416289614Scemstatic u_int8_t 417289614Scemrmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 418289614Scem bus_size_t offset) 419289614Scem{ 420289614Scem if ((int)tag == MIPS_BUS_SPACE_PCI) 421289614Scem return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 422289614Scem else 423289614Scem return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); 424289614Scem} 425289614Scem 426289614Scemstatic u_int16_t 427289614Scemrmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 428289614Scem bus_size_t offset) 429289614Scem{ 430289614Scem if ((int)tag == MIPS_BUS_SPACE_PCI) 431289614Scem return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); 432289614Scem else 433289614Scem return *(volatile u_int16_t *)(handle + offset); 434289614Scem} 435289614Scem 436289614Scemstatic u_int32_t 437289614Scemrmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 438289614Scem bus_size_t offset) 439289614Scem{ 440289614Scem if ((int)tag == MIPS_BUS_SPACE_PCI) 441289614Scem return SWAP32((*(volatile u_int32_t *)(handle + offset))); 442289614Scem else 443289614Scem return (*(volatile u_int32_t *)(handle + offset)); 444289614Scem} 445289614Scem 446289614Scem 447250079Scarl 448250079Scarl/* 449250079Scarl * Read `count' 1, 2, 4, or 8 byte quantities from bus space 450250079Scarl * described by tag/handle/offset and copy into buffer provided. 451250079Scarl */ 452250079Scarlstatic void 453250079Scarlrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 454250079Scarl bus_size_t offset, u_int8_t * addr, size_t count) 455250079Scarl{ 456250079Scarl 457250079Scarl if ((int)tag != MIPS_BUS_SPACE_PCI) 458250079Scarl return; 459250079Scarl while (count--) { 460250079Scarl *addr = (*(volatile u_int8_t *)(handle + offset)); 461250079Scarl addr++; 462250079Scarl } 463250079Scarl} 464250079Scarl 465250079Scarlstatic void 466250079Scarlrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 467250079Scarl bus_size_t offset, u_int16_t * addr, size_t count) 468250079Scarl{ 469250079Scarl 470289207Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 471289207Scem return; 472250079Scarl while (count--) { 473250079Scarl *addr = *(volatile u_int16_t *)(handle + offset); 474250079Scarl *addr = SWAP16(*addr); 475250079Scarl addr++; 476250079Scarl } 477250079Scarl} 478289209Scem 479250079Scarlstatic void 480289209Scemrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 481289209Scem bus_size_t offset, u_int32_t * addr, size_t count) 482250079Scarl{ 483289209Scem 484289209Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 485289209Scem return; 486250079Scarl while (count--) { 487250079Scarl *addr = *(volatile u_int32_t *)(handle + offset); 488250079Scarl *addr = SWAP32(*addr); 489250079Scarl addr++; 490250079Scarl } 491289209Scem} 492289209Scem 493250079Scarl/* 494250079Scarl * Write the 1, 2, 4, or 8 byte value `value' to bus space 495289209Scem * described by tag/handle/offset. 496289209Scem */ 497289209Scem 498250079Scarl 499250079Scarlstatic void 500255274Scarlrmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 501289543Scem bus_size_t offset, u_int8_t value) 502250079Scarl{ 503250079Scarl mips_sync(); 504283291Sjkim if ((int)tag == MIPS_BUS_SPACE_PCI) 505283291Sjkim *(volatile u_int8_t *)(handle + offset) = value; 506289542Scem else 507289546Scem *(volatile u_int32_t *)(handle + offset) = (u_int32_t) value; 508250079Scarl} 509289348Scem 510289348Scemstatic void 511289348Scemrmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 512289348Scem bus_size_t offset, u_int16_t value) 513289348Scem{ 514289348Scem mips_sync(); 515289348Scem if ((int)tag == MIPS_BUS_SPACE_PCI) { 516289397Scem *(volatile u_int16_t *)(handle + offset) = SWAP16(value); 517289396Scem } else 518289209Scem *(volatile u_int16_t *)(handle + offset) = value; 519289209Scem} 520289209Scem 521289272Scem 522289542Scemstatic void 523289272Scemrmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 524289542Scem bus_size_t offset, u_int32_t value) 525289209Scem{ 526289209Scem mips_sync(); 527289540Scem if ((int)tag == MIPS_BUS_SPACE_PCI) { 528289209Scem *(volatile u_int32_t *)(handle + offset) = SWAP32(value); 529289209Scem } else 530250079Scarl *(volatile u_int32_t *)(handle + offset) = value; 531250079Scarl} 532250079Scarl 533289209Scem 534289209Scem 535289209Scem/* 536250079Scarl * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 537250079Scarl * provided to bus space described by tag/handle/offset. 538250079Scarl */ 539250079Scarl 540250079Scarl 541250079Scarlstatic void 542289209Scemrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 543250079Scarl bus_size_t offset, const u_int8_t * addr, size_t count) 544289209Scem{ 545289542Scem mips_sync(); 546289542Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 547250079Scarl return; 548250079Scarl while (count--) { 549289272Scem (*(volatile u_int8_t *)(handle + offset)) = *addr; 550289272Scem addr++; 551250079Scarl } 552289397Scem} 553289542Scem 554289546Scemstatic void 555289542Scemrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 556289397Scem bus_size_t offset, const u_int16_t * addr, size_t count) 557289397Scem{ 558289397Scem mips_sync(); 559289397Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 560289397Scem return; 561250079Scarl while (count--) { 562250079Scarl (*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr); 563250079Scarl addr++; 564250079Scarl } 565250079Scarl} 566289542Scem 567289542Scemstatic void 568289542Scemrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 569289539Scem bus_size_t offset, const u_int32_t * addr, size_t count) 570289539Scem{ 571289539Scem mips_sync(); 572289539Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 573289543Scem return; 574289543Scem while (count--) { 575289542Scem (*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr); 576289546Scem addr++; 577289539Scem } 578289542Scem} 579289539Scem 580289539Scem/* 581289546Scem * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 582289546Scem * by tag/handle starting at `offset'. 583289546Scem */ 584289546Scem 585289546Scemstatic void 586289546Scemrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 587289546Scem bus_size_t offset, u_int16_t value, size_t count) 588289546Scem{ 589289546Scem bus_addr_t addr = bsh + offset; 590289546Scem 591289546Scem for (; count != 0; count--, addr += 2) 592289546Scem (*(volatile u_int16_t *)(addr)) = value; 593289546Scem} 594289546Scem 595289546Scemstatic void 596289546Scemrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 597289546Scem bus_size_t offset, u_int32_t value, size_t count) 598289546Scem{ 599289546Scem bus_addr_t addr = bsh + offset; 600289546Scem 601289546Scem for (; count != 0; count--, addr += 4) 602289546Scem (*(volatile u_int32_t *)(addr)) = value; 603289546Scem} 604289546Scem 605289546Scem 606289546Scem/* 607289546Scem * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 608289546Scem * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 609289546Scem */ 610289546Scemstatic void 611289546Scemrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 612289546Scem bus_size_t off1, bus_space_handle_t bsh2, 613289546Scem bus_size_t off2, size_t count) 614289546Scem{ 615289546Scem printf("bus_space_copy_region_2 - unimplemented\n"); 616289546Scem} 617289546Scem 618289546Scem/* 619289546Scem * Read `count' 1, 2, 4, or 8 byte quantities from bus space 620289546Scem * described by tag/handle/offset and copy into buffer provided. 621289546Scem */ 622289546Scem 623289546Scemu_int8_t 624289546Scemrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 625289546Scem bus_size_t offset) 626250079Scarl{ 627255272Scarl 628250079Scarl return *((volatile u_int8_t *)(handle + offset)); 629255272Scarl} 630250079Scarl 631250079Scarl 632289541Scemstatic u_int16_t 633255272Scarlrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 634289541Scem bus_size_t offset) 635255272Scarl{ 636289209Scem return *(volatile u_int16_t *)(handle + offset); 637289541Scem} 638255272Scarl 639289541Scem 640289543Scemstatic u_int32_t 641289543Scemrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 642289543Scem bus_size_t offset) 643255272Scarl{ 644289209Scem return (*(volatile u_int32_t *)(handle + offset)); 645289543Scem} 646289538Scem 647289541Scem 648255279Scarlstatic void 649289541Scemrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 650289543Scem bus_size_t offset, u_int8_t * addr, size_t count) 651289543Scem{ 652289543Scem 653289543Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 654289397Scem return; 655289541Scem while (count--) { 656289397Scem *addr = (*(volatile u_int8_t *)(handle + offset)); 657289397Scem addr++; 658289538Scem } 659289541Scem} 660289397Scem 661289541Scemstatic void 662289543Scemrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 663289543Scem bus_size_t offset, u_int16_t * addr, size_t count) 664289543Scem{ 665250079Scarl 666289541Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 667289209Scem return; 668255272Scarl while (count--) { 669255272Scarl *addr = (*(volatile u_int16_t *)(handle + offset)); 670255272Scarl addr++; 671255272Scarl } 672255272Scarl} 673289541Scem 674289541Scemstatic void 675289541Scemrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 676289541Scem bus_size_t offset, u_int32_t * addr, size_t count) 677289541Scem{ 678289541Scem 679289541Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 680289541Scem return; 681255272Scarl while (count--) { 682255272Scarl *addr = (*(volatile u_int32_t *)(handle + offset)); 683255272Scarl addr++; 684255272Scarl } 685255275Scarl} 686289209Scem 687255272Scarl 688255272Scarl 689289209Scem/* 690289209Scem * Read `count' 1, 2, 4, or 8 byte quantities from bus space 691289541Scem * described by tag/handle and starting at `offset' and copy into 692289209Scem * buffer provided. 693255272Scarl */ 694255272Scarlvoid 695255272Scarlrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 696255272Scarl bus_size_t offset, u_int8_t * addr, size_t count) 697255272Scarl{ 698255272Scarl bus_addr_t baddr = bsh + offset; 699255276Scarl 700255272Scarl while (count--) { 701289209Scem *addr++ = (*(volatile u_int8_t *)(baddr)); 702289209Scem baddr += 1; 703250079Scarl } 704255272Scarl} 705255272Scarl 706255276Scarlvoid 707289209Scemrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 708289209Scem bus_size_t offset, u_int16_t * addr, size_t count) 709289209Scem{ 710289209Scem bus_addr_t baddr = bsh + offset; 711289209Scem 712289209Scem while (count--) { 713289209Scem *addr++ = (*(volatile u_int16_t *)(baddr)); 714289209Scem baddr += 2; 715289209Scem } 716289209Scem} 717289209Scem 718289209Scemvoid 719289209Scemrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 720289209Scem bus_size_t offset, u_int32_t * addr, size_t count) 721289209Scem{ 722289209Scem bus_addr_t baddr = bsh + offset; 723289209Scem 724289209Scem while (count--) { 725289209Scem *addr++ = (*(volatile u_int32_t *)(baddr)); 726289209Scem baddr += 4; 727289209Scem } 728289209Scem} 729289209Scem 730289209Scem 731289209Scemvoid 732289209Scemrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 733289209Scem bus_size_t offset, u_int8_t value) 734289209Scem{ 735255272Scarl mips_sync(); 736289209Scem *(volatile u_int8_t *)(handle + offset) = value; 737289209Scem} 738255272Scarl 739250079Scarl 740289209Scemstatic void 741289209Scemrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 742250079Scarl bus_size_t offset, u_int16_t value) 743289209Scem{ 744289209Scem mips_sync(); 745289209Scem *(volatile u_int16_t *)(handle + offset) = value; 746289209Scem} 747289209Scem 748289209Scem 749289209Scemstatic void 750289209Scemrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 751289209Scem bus_size_t offset, u_int32_t value) 752289541Scem{ 753250079Scarl mips_sync(); 754250079Scarl *(volatile u_int32_t *)(handle + offset) = value; 755250079Scarl} 756250079Scarl 757250079Scarl 758250079Scarlstatic void 759250079Scarlrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 760250079Scarl bus_size_t offset, const u_int8_t * addr, size_t count) 761250079Scarl{ 762289397Scem mips_sync(); 763250079Scarl if ((int)tag != MIPS_BUS_SPACE_PCI) 764250079Scarl return; 765250079Scarl while (count--) { 766250079Scarl (*(volatile u_int8_t *)(handle + offset)) = *addr; 767250079Scarl addr++; 768250079Scarl } 769250079Scarl} 770250079Scarl 771250079Scarlstatic void 772289540Scemrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 773250079Scarl bus_size_t offset, const u_int16_t * addr, size_t count) 774289342Scem{ 775289342Scem mips_sync(); 776289342Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 777289342Scem return; 778289342Scem while (count--) { 779289342Scem (*(volatile u_int16_t *)(handle + offset)) = *addr; 780289342Scem addr++; 781289342Scem } 782289342Scem} 783289342Scem 784289342Scemstatic void 785289342Scemrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 786289342Scem bus_size_t offset, const u_int32_t * addr, size_t count) 787289342Scem{ 788289342Scem mips_sync(); 789289546Scem if ((int)tag != MIPS_BUS_SPACE_PCI) 790289546Scem return; 791289342Scem while (count--) { 792289342Scem (*(volatile u_int32_t *)(handle + offset)) = *addr; 793289342Scem addr++; 794289342Scem } 795289342Scem} 796289342Scem 797289342Scemvoid 798289342Scemrmi_bus_space_write_region_2(void *t, 799289344Scem bus_space_handle_t bsh, 800289344Scem bus_size_t offset, 801289344Scem const u_int16_t * addr, 802289344Scem size_t count) 803289344Scem{ 804289344Scem bus_addr_t baddr = (bus_addr_t) bsh + offset; 805289344Scem 806289344Scem while (count--) { 807289344Scem (*(volatile u_int16_t *)(baddr)) = *addr; 808289344Scem addr++; 809289344Scem baddr += 2; 810289344Scem } 811289344Scem} 812289344Scem 813289344Scemvoid 814289344Scemrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 815289344Scem bus_size_t offset, const u_int32_t * addr, size_t count) 816289344Scem{ 817289344Scem bus_addr_t baddr = bsh + offset; 818289344Scem 819289344Scem while (count--) { 820289344Scem (*(volatile u_int32_t *)(baddr)) = *addr; 821289344Scem addr++; 822289344Scem baddr += 4; 823289344Scem } 824289342Scem} 825289344Scem 826289344Scemstatic void 827289344Scemrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 828289344Scem bus_size_t offset __unused, bus_size_t len __unused, int flags) 829289344Scem{ 830289344Scem 831289344Scem} 832289344Scem