bus_space_rmi.c revision 198956
1198956Srrs/*- 2198956Srrs * Copyright (c) 2009 RMI Corporation 3198956Srrs * All rights reserved. 4198956Srrs * 5198956Srrs * Redistribution and use in source and binary forms, with or without 6198956Srrs * modification, are permitted provided that the following conditions 7198956Srrs * are met: 8198956Srrs * 1. Redistributions of source code must retain the above copyright 9198956Srrs * notice, this list of conditions and the following disclaimer. 10198956Srrs * 2. Redistributions in binary form must reproduce the above copyright 11198956Srrs * notice, this list of conditions and the following disclaimer in the 12198956Srrs * documentation and/or other materials provided with the distribution. 13198956Srrs * 14198956Srrs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15198956Srrs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16198956Srrs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17198956Srrs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18198956Srrs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19198956Srrs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20198956Srrs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21198956Srrs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22198956Srrs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23198956Srrs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24198956Srrs * SUCH DAMAGE. 25198956Srrs * 26198956Srrs * $FreeBSD$ 27198956Srrs */ 28198956Srrs#include <sys/cdefs.h> 29198956Srrs__FBSDID("$FreeBSD$"); 30198956Srrs 31198956Srrs#include <sys/param.h> 32198956Srrs#include <sys/systm.h> 33198956Srrs#include <sys/bus.h> 34198956Srrs#include <sys/kernel.h> 35198956Srrs#include <sys/malloc.h> 36198956Srrs#include <sys/ktr.h> 37198956Srrs 38198956Srrs#include <vm/vm.h> 39198956Srrs#include <vm/pmap.h> 40198956Srrs#include <vm/vm_kern.h> 41198956Srrs#include <vm/vm_extern.h> 42198956Srrs 43198956Srrs#include <machine/bus.h> 44198956Srrs#include <machine/cache.h> 45198956Srrsvoid xlr_putc(char); 46198956Srrsvoid xlr_print_int(uint32_t); 47198956Srrs 48198956Srrsstatic int rmi_bus_space_map(void *t, bus_addr_t addr, 49198956Srrs bus_size_t size, int flags, 50198956Srrs bus_space_handle_t *bshp); 51198956Srrs 52198956Srrs 53198956Srrsstatic void rmi_bus_space_unmap(void *t, bus_space_handle_t bsh, 54198956Srrs bus_size_t size); 55198956Srrs 56198956Srrsstatic int rmi_bus_space_subregion(void *t, 57198956Srrs bus_space_handle_t bsh, 58198956Srrs bus_size_t offset, bus_size_t size, 59198956Srrs bus_space_handle_t *nbshp); 60198956Srrs 61198956Srrsstatic u_int8_t rmi_bus_space_read_1(void *t, 62198956Srrs bus_space_handle_t handle, 63198956Srrs bus_size_t offset); 64198956Srrs 65198956Srrsstatic u_int16_t rmi_bus_space_read_2(void *t, 66198956Srrs bus_space_handle_t handle, 67198956Srrs bus_size_t offset); 68198956Srrs 69198956Srrsstatic u_int32_t rmi_bus_space_read_4(void *t, 70198956Srrs bus_space_handle_t handle, 71198956Srrs bus_size_t offset); 72198956Srrs 73198956Srrsstatic void rmi_bus_space_read_multi_1(void *t, 74198956Srrs bus_space_handle_t handle, 75198956Srrs bus_size_t offset, u_int8_t *addr, 76198956Srrs size_t count); 77198956Srrs 78198956Srrsstatic void rmi_bus_space_read_multi_2(void *t, 79198956Srrs bus_space_handle_t handle, 80198956Srrs bus_size_t offset, u_int16_t *addr, 81198956Srrs size_t count); 82198956Srrs 83198956Srrsstatic void rmi_bus_space_read_multi_4(void *t, 84198956Srrs bus_space_handle_t handle, 85198956Srrs bus_size_t offset, u_int32_t *addr, 86198956Srrs size_t count); 87198956Srrs 88198956Srrsstatic void rmi_bus_space_read_region_1(void *t, 89198956Srrs bus_space_handle_t bsh, 90198956Srrs bus_size_t offset, u_int8_t *addr, 91198956Srrs size_t count); 92198956Srrs 93198956Srrsstatic void rmi_bus_space_read_region_2(void *t, 94198956Srrs bus_space_handle_t bsh, 95198956Srrs bus_size_t offset, u_int16_t *addr, 96198956Srrs size_t count); 97198956Srrs 98198956Srrsstatic void rmi_bus_space_read_region_4(void *t, 99198956Srrs bus_space_handle_t bsh, 100198956Srrs bus_size_t offset, u_int32_t *addr, 101198956Srrs size_t count); 102198956Srrs 103198956Srrsstatic void rmi_bus_space_write_1(void *t, 104198956Srrs bus_space_handle_t handle, 105198956Srrs bus_size_t offset, u_int8_t value); 106198956Srrs 107198956Srrsstatic void rmi_bus_space_write_2(void *t, 108198956Srrs bus_space_handle_t handle, 109198956Srrs bus_size_t offset, u_int16_t value); 110198956Srrs 111198956Srrsstatic void rmi_bus_space_write_4(void *t, 112198956Srrs bus_space_handle_t handle, 113198956Srrs bus_size_t offset, u_int32_t value); 114198956Srrs 115198956Srrsstatic void rmi_bus_space_write_multi_1(void *t, 116198956Srrs bus_space_handle_t handle, 117198956Srrs bus_size_t offset, 118198956Srrs const u_int8_t *addr, 119198956Srrs size_t count); 120198956Srrsstatic void rmi_bus_space_write_multi_2(void *t, 121198956Srrs bus_space_handle_t handle, 122198956Srrs bus_size_t offset, 123198956Srrs const u_int16_t *addr, 124198956Srrs size_t count); 125198956Srrs 126198956Srrsstatic void rmi_bus_space_write_multi_4(void *t, 127198956Srrs bus_space_handle_t handle, 128198956Srrs bus_size_t offset, 129198956Srrs const u_int32_t *addr, 130198956Srrs size_t count); 131198956Srrs 132198956Srrsstatic void rmi_bus_space_write_region_2(void *t, 133198956Srrs bus_space_handle_t bsh, 134198956Srrs bus_size_t offset, 135198956Srrs const u_int16_t *addr, 136198956Srrs size_t count); 137198956Srrs 138198956Srrsstatic void rmi_bus_space_write_region_4(void *t, 139198956Srrs bus_space_handle_t bsh, 140198956Srrs bus_size_t offset, 141198956Srrs const u_int32_t *addr, 142198956Srrs size_t count); 143198956Srrs 144198956Srrs 145198956Srrsstatic void rmi_bus_space_set_region_2(void *t, 146198956Srrs bus_space_handle_t bsh, 147198956Srrs bus_size_t offset, u_int16_t value, 148198956Srrs size_t count); 149198956Srrsstatic void rmi_bus_space_set_region_4(void *t, 150198956Srrs bus_space_handle_t bsh, 151198956Srrs bus_size_t offset, u_int32_t value, 152198956Srrs size_t count); 153198956Srrs 154198956Srrsstatic void rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 155198956Srrs bus_size_t offset __unused, bus_size_t len __unused, int flags); 156198956Srrs 157198956Srrs 158198956Srrsstatic void rmi_bus_space_copy_region_2(void *t, 159198956Srrs bus_space_handle_t bsh1, 160198956Srrs bus_size_t off1, 161198956Srrs bus_space_handle_t bsh2, 162198956Srrs bus_size_t off2, size_t count); 163198956Srrs 164198956Srrsu_int8_t rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 165198956Srrs bus_size_t offset); 166198956Srrs 167198956Srrsstatic u_int16_t rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 168198956Srrs bus_size_t offset); 169198956Srrs 170198956Srrsstatic u_int32_t rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 171198956Srrs bus_size_t offset); 172198956Srrsstatic void rmi_bus_space_read_multi_stream_1(void *t, 173198956Srrs bus_space_handle_t handle, 174198956Srrs bus_size_t offset, u_int8_t *addr, 175198956Srrs size_t count); 176198956Srrs 177198956Srrsstatic void rmi_bus_space_read_multi_stream_2(void *t, 178198956Srrs bus_space_handle_t handle, 179198956Srrs bus_size_t offset, u_int16_t *addr, 180198956Srrs size_t count); 181198956Srrs 182198956Srrsstatic void rmi_bus_space_read_multi_stream_4(void *t, 183198956Srrs bus_space_handle_t handle, 184198956Srrs bus_size_t offset, u_int32_t *addr, 185198956Srrs size_t count); 186198956Srrs 187198956Srrsvoid rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 188198956Srrs bus_size_t offset, u_int8_t value); 189198956Srrsstatic void rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 190198956Srrs bus_size_t offset, u_int16_t value); 191198956Srrs 192198956Srrsstatic void rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 193198956Srrs bus_size_t offset, u_int32_t value); 194198956Srrs 195198956Srrsstatic void rmi_bus_space_write_multi_stream_1(void *t, 196198956Srrs bus_space_handle_t handle, 197198956Srrs bus_size_t offset, 198198956Srrs const u_int8_t *addr, 199198956Srrs size_t count); 200198956Srrsstatic void rmi_bus_space_write_multi_stream_2(void *t, 201198956Srrs bus_space_handle_t handle, 202198956Srrs bus_size_t offset, 203198956Srrs const u_int16_t *addr, 204198956Srrs size_t count); 205198956Srrs 206198956Srrsstatic void rmi_bus_space_write_multi_stream_4(void *t, 207198956Srrs bus_space_handle_t handle, 208198956Srrs bus_size_t offset, 209198956Srrs const u_int32_t *addr, 210198956Srrs size_t count); 211198956Srrs 212198956Srrs 213198956Srrsstatic struct bus_space local_rmi_bus_space = { 214198956Srrs /* cookie */ 215198956Srrs (void *) 0, 216198956Srrs 217198956Srrs /* mapping/unmapping */ 218198956Srrs rmi_bus_space_map, 219198956Srrs rmi_bus_space_unmap, 220198956Srrs rmi_bus_space_subregion, 221198956Srrs 222198956Srrs /* allocation/deallocation */ 223198956Srrs NULL, 224198956Srrs NULL, 225198956Srrs 226198956Srrs /* barrier */ 227198956Srrs rmi_bus_space_barrier, 228198956Srrs 229198956Srrs /* read (single) */ 230198956Srrs rmi_bus_space_read_1, 231198956Srrs rmi_bus_space_read_2, 232198956Srrs rmi_bus_space_read_4, 233198956Srrs NULL, 234198956Srrs 235198956Srrs /* read multiple */ 236198956Srrs rmi_bus_space_read_multi_1, 237198956Srrs rmi_bus_space_read_multi_2, 238198956Srrs rmi_bus_space_read_multi_4, 239198956Srrs NULL, 240198956Srrs 241198956Srrs /* read region */ 242198956Srrs rmi_bus_space_read_region_1, 243198956Srrs rmi_bus_space_read_region_2, 244198956Srrs rmi_bus_space_read_region_4, 245198956Srrs NULL, 246198956Srrs 247198956Srrs /* write (single) */ 248198956Srrs rmi_bus_space_write_1, 249198956Srrs rmi_bus_space_write_2, 250198956Srrs rmi_bus_space_write_4, 251198956Srrs NULL, 252198956Srrs 253198956Srrs /* write multiple */ 254198956Srrs rmi_bus_space_write_multi_1, 255198956Srrs rmi_bus_space_write_multi_2, 256198956Srrs rmi_bus_space_write_multi_4, 257198956Srrs NULL, 258198956Srrs 259198956Srrs /* write region */ 260198956Srrs NULL, 261198956Srrs rmi_bus_space_write_region_2, 262198956Srrs rmi_bus_space_write_region_4, 263198956Srrs NULL, 264198956Srrs 265198956Srrs /* set multiple */ 266198956Srrs NULL, 267198956Srrs NULL, 268198956Srrs NULL, 269198956Srrs NULL, 270198956Srrs 271198956Srrs /* set region */ 272198956Srrs NULL, 273198956Srrs rmi_bus_space_set_region_2, 274198956Srrs rmi_bus_space_set_region_4, 275198956Srrs NULL, 276198956Srrs 277198956Srrs /* copy */ 278198956Srrs NULL, 279198956Srrs rmi_bus_space_copy_region_2, 280198956Srrs NULL, 281198956Srrs NULL, 282198956Srrs 283198956Srrs /* read (single) stream */ 284198956Srrs rmi_bus_space_read_stream_1, 285198956Srrs rmi_bus_space_read_stream_2, 286198956Srrs rmi_bus_space_read_stream_4, 287198956Srrs NULL, 288198956Srrs 289198956Srrs /* read multiple stream */ 290198956Srrs rmi_bus_space_read_multi_stream_1, 291198956Srrs rmi_bus_space_read_multi_stream_2, 292198956Srrs rmi_bus_space_read_multi_stream_4, 293198956Srrs NULL, 294198956Srrs 295198956Srrs /* read region stream */ 296198956Srrs rmi_bus_space_read_region_1, 297198956Srrs rmi_bus_space_read_region_2, 298198956Srrs rmi_bus_space_read_region_4, 299198956Srrs NULL, 300198956Srrs 301198956Srrs /* write (single) stream */ 302198956Srrs rmi_bus_space_write_stream_1, 303198956Srrs rmi_bus_space_write_stream_2, 304198956Srrs rmi_bus_space_write_stream_4, 305198956Srrs NULL, 306198956Srrs 307198956Srrs /* write multiple stream */ 308198956Srrs rmi_bus_space_write_multi_stream_1, 309198956Srrs rmi_bus_space_write_multi_stream_2, 310198956Srrs rmi_bus_space_write_multi_stream_4, 311198956Srrs NULL, 312198956Srrs 313198956Srrs /* write region stream */ 314198956Srrs NULL, 315198956Srrs rmi_bus_space_write_region_2, 316198956Srrs rmi_bus_space_write_region_4, 317198956Srrs NULL, 318198956Srrs}; 319198956Srrs 320198956Srrs/* generic bus_space tag */ 321198956Srrsbus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 322198956Srrs 323198956Srrs#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ 324198956Srrs#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ 325198956Srrs#define MIPS_BUS_SPACE_PCI 10 /* avoid conflict with other spaces */ 326198956Srrs 327198956Srrs#define BUS_SPACE_UNRESTRICTED (~0) 328198956Srrs 329198956Srrs#define SWAP32(x)\ 330198956Srrs (((x) & 0xff000000) >> 24) | \ 331198956Srrs (((x) & 0x000000ff) << 24) | \ 332198956Srrs (((x) & 0x0000ff00) << 8) | \ 333198956Srrs (((x) & 0x00ff0000) >> 8) 334198956Srrs 335198956Srrs#define SWAP16(x)\ 336198956Srrs (((x) & 0xff00) >> 8) | \ 337198956Srrs (((x) & 0x00ff) << 8) 338198956Srrs 339198956Srrs/* 340198956Srrs * Map a region of device bus space into CPU virtual address space. 341198956Srrs */ 342198956Srrs 343198956Srrs 344198956Srrsstatic int 345198956Srrsrmi_bus_space_map(void *t __unused, bus_addr_t addr, 346198956Srrs bus_size_t size __unused, int flags __unused, 347198956Srrs bus_space_handle_t *bshp) 348198956Srrs{ 349198956Srrs 350198956Srrs *bshp = addr; 351198956Srrs return (0); 352198956Srrs} 353198956Srrs 354198956Srrs/* 355198956Srrs * Unmap a region of device bus space. 356198956Srrs */ 357198956Srrsstatic void 358198956Srrsrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 359198956Srrs bus_size_t size __unused) 360198956Srrs{ 361198956Srrs} 362198956Srrs 363198956Srrs/* 364198956Srrs * Get a new handle for a subregion of an already-mapped area of bus space. 365198956Srrs */ 366198956Srrs 367198956Srrsstatic int 368198956Srrsrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 369198956Srrs bus_size_t offset, bus_size_t size __unused, 370198956Srrs bus_space_handle_t *nbshp) 371198956Srrs{ 372198956Srrs *nbshp = bsh + offset; 373198956Srrs return (0); 374198956Srrs} 375198956Srrs 376198956Srrs/* 377198956Srrs * Read a 1, 2, 4, or 8 byte quantity from bus space 378198956Srrs * described by tag/handle/offset. 379198956Srrs */ 380198956Srrs 381198956Srrsstatic u_int8_t 382198956Srrsrmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 383198956Srrs bus_size_t offset) 384198956Srrs{ 385198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 386198956Srrs return (u_int8_t)(*(volatile u_int8_t *)(handle + offset)); 387198956Srrs else 388198956Srrs return (u_int8_t)(*(volatile u_int32_t *)(handle + offset)); 389198956Srrs} 390198956Srrs 391198956Srrsstatic u_int16_t 392198956Srrsrmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 393198956Srrs bus_size_t offset) 394198956Srrs{ 395198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 396198956Srrs return SWAP16((u_int16_t)(*(volatile u_int16_t *)(handle + offset))); 397198956Srrs else 398198956Srrs return *(volatile u_int16_t *)(handle + offset); 399198956Srrs} 400198956Srrs 401198956Srrsstatic u_int32_t 402198956Srrsrmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 403198956Srrs bus_size_t offset) 404198956Srrs{ 405198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 406198956Srrs return SWAP32((*(volatile u_int32_t *)(handle + offset))); 407198956Srrs else 408198956Srrs return (*(volatile u_int32_t *)(handle + offset)); 409198956Srrs} 410198956Srrs 411198956Srrs 412198956Srrs 413198956Srrs/* 414198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 415198956Srrs * described by tag/handle/offset and copy into buffer provided. 416198956Srrs */ 417198956Srrsstatic void 418198956Srrsrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 419198956Srrs bus_size_t offset, u_int8_t *addr, size_t count) 420198956Srrs{ 421198956Srrs 422198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 423198956Srrs return; 424198956Srrs while (count--) { 425198956Srrs *addr = (*(volatile u_int8_t *)(handle + offset)); 426198956Srrs addr++; 427198956Srrs } 428198956Srrs} 429198956Srrs 430198956Srrsstatic void 431198956Srrsrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 432198956Srrs bus_size_t offset, u_int16_t *addr, size_t count) 433198956Srrs{ 434198956Srrs 435198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 436198956Srrs return; 437198956Srrs while (count--) { 438198956Srrs *addr = *(volatile u_int16_t *)(handle + offset); 439198956Srrs *addr = SWAP16(*addr); 440198956Srrs addr++; 441198956Srrs } 442198956Srrs} 443198956Srrs 444198956Srrsstatic void 445198956Srrsrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 446198956Srrs bus_size_t offset, u_int32_t *addr, size_t count) 447198956Srrs{ 448198956Srrs 449198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 450198956Srrs return; 451198956Srrs while (count--) { 452198956Srrs *addr = *(volatile u_int32_t *)(handle + offset); 453198956Srrs *addr = SWAP32(*addr); 454198956Srrs addr++; 455198956Srrs } 456198956Srrs} 457198956Srrs 458198956Srrs/* 459198956Srrs * Write the 1, 2, 4, or 8 byte value `value' to bus space 460198956Srrs * described by tag/handle/offset. 461198956Srrs */ 462198956Srrs 463198956Srrs 464198956Srrsstatic void 465198956Srrsrmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 466198956Srrs bus_size_t offset, u_int8_t value) 467198956Srrs{ 468198956Srrs mips_sync(); 469198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 470198956Srrs *(volatile u_int8_t *)(handle + offset) = value; 471198956Srrs else 472198956Srrs *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; 473198956Srrs} 474198956Srrs 475198956Srrsstatic void 476198956Srrsrmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 477198956Srrs bus_size_t offset, u_int16_t value) 478198956Srrs{ 479198956Srrs mips_sync(); 480198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) { 481198956Srrs *(volatile u_int16_t *)(handle + offset) = SWAP16(value); 482198956Srrs } else 483198956Srrs *(volatile u_int16_t *)(handle + offset) = value; 484198956Srrs} 485198956Srrs 486198956Srrs 487198956Srrsstatic void 488198956Srrsrmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 489198956Srrs bus_size_t offset, u_int32_t value) 490198956Srrs{ 491198956Srrs mips_sync(); 492198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) { 493198956Srrs *(volatile u_int32_t *)(handle + offset) = SWAP32(value); 494198956Srrs } else 495198956Srrs *(volatile u_int32_t *)(handle + offset) = value; 496198956Srrs} 497198956Srrs 498198956Srrs 499198956Srrs 500198956Srrs/* 501198956Srrs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 502198956Srrs * provided to bus space described by tag/handle/offset. 503198956Srrs */ 504198956Srrs 505198956Srrs 506198956Srrsstatic void 507198956Srrsrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 508198956Srrs bus_size_t offset, const u_int8_t *addr, size_t count) 509198956Srrs{ 510198956Srrs mips_sync(); 511198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 512198956Srrs return; 513198956Srrs while (count--) { 514198956Srrs (*(volatile u_int8_t *)(handle + offset)) = *addr; 515198956Srrs addr++; 516198956Srrs } 517198956Srrs} 518198956Srrs 519198956Srrsstatic void 520198956Srrsrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 521198956Srrs bus_size_t offset, const u_int16_t *addr, size_t count) 522198956Srrs{ 523198956Srrs mips_sync(); 524198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 525198956Srrs return; 526198956Srrs while (count--) { 527198956Srrs (*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr); 528198956Srrs addr++; 529198956Srrs } 530198956Srrs} 531198956Srrs 532198956Srrsstatic void 533198956Srrsrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 534198956Srrs bus_size_t offset, const u_int32_t *addr, size_t count) 535198956Srrs{ 536198956Srrs mips_sync(); 537198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 538198956Srrs return; 539198956Srrs while (count--) { 540198956Srrs (*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr); 541198956Srrs addr++; 542198956Srrs } 543198956Srrs} 544198956Srrs 545198956Srrs/* 546198956Srrs * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 547198956Srrs * by tag/handle starting at `offset'. 548198956Srrs */ 549198956Srrs 550198956Srrsstatic void 551198956Srrsrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 552198956Srrs bus_size_t offset, u_int16_t value, size_t count) 553198956Srrs{ 554198956Srrs bus_addr_t addr = bsh + offset; 555198956Srrs 556198956Srrs for (; count != 0; count--, addr += 2) 557198956Srrs (*(volatile u_int16_t *)(addr)) = value; 558198956Srrs} 559198956Srrs 560198956Srrsstatic void 561198956Srrsrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 562198956Srrs bus_size_t offset, u_int32_t value, size_t count) 563198956Srrs{ 564198956Srrs bus_addr_t addr = bsh + offset; 565198956Srrs 566198956Srrs for (; count != 0; count--, addr += 4) 567198956Srrs (*(volatile u_int32_t *)(addr)) = value; 568198956Srrs} 569198956Srrs 570198956Srrs 571198956Srrs/* 572198956Srrs * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 573198956Srrs * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 574198956Srrs */ 575198956Srrsstatic void 576198956Srrsrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 577198956Srrs bus_size_t off1, bus_space_handle_t bsh2, 578198956Srrs bus_size_t off2, size_t count) 579198956Srrs{ 580198956Srrs printf("bus_space_copy_region_2 - unimplemented\n"); 581198956Srrs} 582198956Srrs 583198956Srrs/* 584198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 585198956Srrs * described by tag/handle/offset and copy into buffer provided. 586198956Srrs */ 587198956Srrs 588198956Srrsu_int8_t 589198956Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 590198956Srrs bus_size_t offset) 591198956Srrs{ 592198956Srrs 593198956Srrs return *((volatile u_int8_t *)(handle + offset)); 594198956Srrs} 595198956Srrs 596198956Srrs 597198956Srrsstatic u_int16_t 598198956Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 599198956Srrs bus_size_t offset) 600198956Srrs{ 601198956Srrs return *(volatile u_int16_t *)(handle + offset); 602198956Srrs} 603198956Srrs 604198956Srrs 605198956Srrsstatic u_int32_t 606198956Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 607198956Srrs bus_size_t offset) 608198956Srrs{ 609198956Srrs return (*(volatile u_int32_t *)(handle + offset)); 610198956Srrs} 611198956Srrs 612198956Srrs 613198956Srrsstatic void 614198956Srrsrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 615198956Srrs bus_size_t offset, u_int8_t *addr, size_t count) 616198956Srrs{ 617198956Srrs 618198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 619198956Srrs return; 620198956Srrs while (count--) { 621198956Srrs *addr = (*(volatile u_int8_t *)(handle + offset)); 622198956Srrs addr++; 623198956Srrs } 624198956Srrs} 625198956Srrs 626198956Srrsstatic void 627198956Srrsrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 628198956Srrs bus_size_t offset, u_int16_t *addr, size_t count) 629198956Srrs{ 630198956Srrs 631198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 632198956Srrs return; 633198956Srrs while (count--) { 634198956Srrs *addr = (*(volatile u_int16_t *)(handle + offset)); 635198956Srrs addr++; 636198956Srrs } 637198956Srrs} 638198956Srrs 639198956Srrsstatic void 640198956Srrsrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 641198956Srrs bus_size_t offset, u_int32_t *addr, size_t count) 642198956Srrs{ 643198956Srrs 644198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 645198956Srrs return; 646198956Srrs while (count--) { 647198956Srrs *addr = (*(volatile u_int32_t *)(handle + offset)); 648198956Srrs addr++; 649198956Srrs } 650198956Srrs} 651198956Srrs 652198956Srrs 653198956Srrs 654198956Srrs/* 655198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 656198956Srrs * described by tag/handle and starting at `offset' and copy into 657198956Srrs * buffer provided. 658198956Srrs */ 659198956Srrsvoid 660198956Srrsrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 661198956Srrs bus_size_t offset, u_int8_t *addr, size_t count) 662198956Srrs{ 663198956Srrs bus_addr_t baddr = bsh + offset; 664198956Srrs 665198956Srrs while (count--) { 666198956Srrs *addr++ = (*(volatile u_int8_t *)(baddr)); 667198956Srrs baddr += 1; 668198956Srrs } 669198956Srrs} 670198956Srrs 671198956Srrsvoid 672198956Srrsrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 673198956Srrs bus_size_t offset, u_int16_t *addr, size_t count) 674198956Srrs{ 675198956Srrs bus_addr_t baddr = bsh + offset; 676198956Srrs 677198956Srrs while (count--) { 678198956Srrs *addr++ = (*(volatile u_int16_t *)(baddr)); 679198956Srrs baddr += 2; 680198956Srrs } 681198956Srrs} 682198956Srrs 683198956Srrsvoid 684198956Srrsrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 685198956Srrs bus_size_t offset, u_int32_t *addr, size_t count) 686198956Srrs{ 687198956Srrs bus_addr_t baddr = bsh + offset; 688198956Srrs 689198956Srrs while (count--) { 690198956Srrs *addr++ = (*(volatile u_int32_t *)(baddr)); 691198956Srrs baddr += 4; 692198956Srrs } 693198956Srrs} 694198956Srrs 695198956Srrs 696198956Srrsvoid 697198956Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 698198956Srrs bus_size_t offset, u_int8_t value) 699198956Srrs{ 700198956Srrs mips_sync(); 701198956Srrs *(volatile u_int8_t *)(handle + offset) = value; 702198956Srrs} 703198956Srrs 704198956Srrs 705198956Srrsstatic void 706198956Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 707198956Srrs bus_size_t offset, u_int16_t value) 708198956Srrs{ 709198956Srrs mips_sync(); 710198956Srrs *(volatile u_int16_t *)(handle + offset) = value; 711198956Srrs} 712198956Srrs 713198956Srrs 714198956Srrsstatic void 715198956Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 716198956Srrs bus_size_t offset, u_int32_t value) 717198956Srrs{ 718198956Srrs mips_sync(); 719198956Srrs *(volatile u_int32_t *)(handle + offset) = value; 720198956Srrs} 721198956Srrs 722198956Srrs 723198956Srrsstatic void 724198956Srrsrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 725198956Srrs bus_size_t offset, const u_int8_t *addr, size_t count) 726198956Srrs{ 727198956Srrs mips_sync(); 728198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 729198956Srrs return; 730198956Srrs while (count--) { 731198956Srrs (*(volatile u_int8_t *)(handle + offset)) = *addr; 732198956Srrs addr++; 733198956Srrs } 734198956Srrs} 735198956Srrs 736198956Srrsstatic void 737198956Srrsrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 738198956Srrs bus_size_t offset, const u_int16_t *addr, size_t count) 739198956Srrs{ 740198956Srrs mips_sync(); 741198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 742198956Srrs return; 743198956Srrs while (count--) { 744198956Srrs (*(volatile u_int16_t *)(handle + offset)) = *addr; 745198956Srrs addr++; 746198956Srrs } 747198956Srrs} 748198956Srrs 749198956Srrsstatic void 750198956Srrsrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 751198956Srrs bus_size_t offset, const u_int32_t *addr, size_t count) 752198956Srrs{ 753198956Srrs mips_sync(); 754198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 755198956Srrs return; 756198956Srrs while (count--) { 757198956Srrs (*(volatile u_int32_t *)(handle + offset)) = *addr; 758198956Srrs addr++; 759198956Srrs } 760198956Srrs} 761198956Srrs 762198956Srrsvoid 763198956Srrsrmi_bus_space_write_region_2(void *t, 764198956Srrs bus_space_handle_t bsh, 765198956Srrs bus_size_t offset, 766198956Srrs const u_int16_t *addr, 767198956Srrs size_t count) 768198956Srrs{ 769198956Srrs bus_addr_t baddr = (bus_addr_t)bsh + offset; 770198956Srrs while (count--) { 771198956Srrs (*(volatile u_int16_t *)(baddr)) = *addr; 772198956Srrs addr++; 773198956Srrs baddr += 2; 774198956Srrs } 775198956Srrs} 776198956Srrs 777198956Srrsvoid 778198956Srrsrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 779198956Srrs bus_size_t offset, const u_int32_t *addr, size_t count) 780198956Srrs{ 781198956Srrs bus_addr_t baddr = bsh + offset; 782198956Srrs 783198956Srrs while (count--) { 784198956Srrs (*(volatile u_int32_t *)(baddr)) = *addr; 785198956Srrs addr++; 786198956Srrs baddr += 4; 787198956Srrs } 788198956Srrs} 789198956Srrs 790198956Srrsstatic void 791198956Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 792198956Srrs bus_size_t offset __unused, bus_size_t len __unused, int flags) 793198956Srrs{ 794198956Srrs 795198956Srrs} 796