bus_space_rmi.c revision 198957
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 48198957Srrsstatic int 49198957Srrsrmi_bus_space_map(void *t, bus_addr_t addr, 50198957Srrs bus_size_t size, int flags, 51198957Srrs bus_space_handle_t * bshp); 52198956Srrs 53198956Srrs 54198957Srrsstatic void 55198957Srrsrmi_bus_space_unmap(void *t, bus_space_handle_t bsh, 56198957Srrs bus_size_t size); 57198956Srrs 58198957Srrsstatic int 59198957Srrsrmi_bus_space_subregion(void *t, 60198957Srrs bus_space_handle_t bsh, 61198957Srrs bus_size_t offset, bus_size_t size, 62198957Srrs bus_space_handle_t * nbshp); 63198956Srrs 64198957Srrsstatic u_int8_t 65198957Srrsrmi_bus_space_read_1(void *t, 66198957Srrs bus_space_handle_t handle, 67198957Srrs bus_size_t offset); 68198956Srrs 69198957Srrsstatic u_int16_t 70198957Srrsrmi_bus_space_read_2(void *t, 71198957Srrs bus_space_handle_t handle, 72198957Srrs bus_size_t offset); 73198956Srrs 74198957Srrsstatic u_int32_t 75198957Srrsrmi_bus_space_read_4(void *t, 76198957Srrs bus_space_handle_t handle, 77198957Srrs bus_size_t offset); 78198956Srrs 79198957Srrsstatic void 80198957Srrsrmi_bus_space_read_multi_1(void *t, 81198957Srrs bus_space_handle_t handle, 82198957Srrs bus_size_t offset, u_int8_t * addr, 83198957Srrs size_t count); 84198956Srrs 85198957Srrsstatic void 86198957Srrsrmi_bus_space_read_multi_2(void *t, 87198957Srrs bus_space_handle_t handle, 88198957Srrs bus_size_t offset, u_int16_t * addr, 89198957Srrs size_t count); 90198956Srrs 91198957Srrsstatic void 92198957Srrsrmi_bus_space_read_multi_4(void *t, 93198957Srrs bus_space_handle_t handle, 94198957Srrs bus_size_t offset, u_int32_t * addr, 95198957Srrs size_t count); 96198956Srrs 97198957Srrsstatic void 98198957Srrsrmi_bus_space_read_region_1(void *t, 99198957Srrs bus_space_handle_t bsh, 100198957Srrs bus_size_t offset, u_int8_t * addr, 101198957Srrs size_t count); 102198956Srrs 103198957Srrsstatic void 104198957Srrsrmi_bus_space_read_region_2(void *t, 105198957Srrs bus_space_handle_t bsh, 106198957Srrs bus_size_t offset, u_int16_t * addr, 107198957Srrs size_t count); 108198956Srrs 109198957Srrsstatic void 110198957Srrsrmi_bus_space_read_region_4(void *t, 111198957Srrs bus_space_handle_t bsh, 112198957Srrs bus_size_t offset, u_int32_t * addr, 113198957Srrs size_t count); 114198956Srrs 115198957Srrsstatic void 116198957Srrsrmi_bus_space_write_1(void *t, 117198957Srrs bus_space_handle_t handle, 118198957Srrs bus_size_t offset, u_int8_t value); 119198956Srrs 120198957Srrsstatic void 121198957Srrsrmi_bus_space_write_2(void *t, 122198957Srrs bus_space_handle_t handle, 123198957Srrs bus_size_t offset, u_int16_t value); 124198956Srrs 125198957Srrsstatic void 126198957Srrsrmi_bus_space_write_4(void *t, 127198957Srrs bus_space_handle_t handle, 128198957Srrs bus_size_t offset, u_int32_t value); 129198956Srrs 130198957Srrsstatic void 131198957Srrsrmi_bus_space_write_multi_1(void *t, 132198957Srrs bus_space_handle_t handle, 133198957Srrs bus_size_t offset, 134198957Srrs const u_int8_t * addr, 135198957Srrs size_t count); 136198957Srrsstatic void 137198957Srrsrmi_bus_space_write_multi_2(void *t, 138198957Srrs bus_space_handle_t handle, 139198957Srrs bus_size_t offset, 140198957Srrs const u_int16_t * addr, 141198957Srrs size_t count); 142198956Srrs 143198957Srrsstatic void 144198957Srrsrmi_bus_space_write_multi_4(void *t, 145198957Srrs bus_space_handle_t handle, 146198957Srrs bus_size_t offset, 147198957Srrs const u_int32_t * addr, 148198957Srrs size_t count); 149198956Srrs 150198957Srrsstatic void 151198957Srrsrmi_bus_space_write_region_2(void *t, 152198957Srrs bus_space_handle_t bsh, 153198957Srrs bus_size_t offset, 154198957Srrs const u_int16_t * addr, 155198957Srrs size_t count); 156198956Srrs 157198957Srrsstatic void 158198957Srrsrmi_bus_space_write_region_4(void *t, 159198957Srrs bus_space_handle_t bsh, 160198957Srrs bus_size_t offset, 161198957Srrs const u_int32_t * addr, 162198957Srrs size_t count); 163198956Srrs 164198956Srrs 165198957Srrsstatic void 166198957Srrsrmi_bus_space_set_region_2(void *t, 167198957Srrs bus_space_handle_t bsh, 168198957Srrs bus_size_t offset, u_int16_t value, 169198957Srrs size_t count); 170198957Srrsstatic void 171198957Srrsrmi_bus_space_set_region_4(void *t, 172198957Srrs bus_space_handle_t bsh, 173198957Srrs bus_size_t offset, u_int32_t value, 174198957Srrs size_t count); 175198956Srrs 176198957Srrsstatic void 177198957Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 178198957Srrs bus_size_t offset __unused, bus_size_t len __unused, int flags); 179198956Srrs 180198956Srrs 181198957Srrsstatic void 182198957Srrsrmi_bus_space_copy_region_2(void *t, 183198957Srrs bus_space_handle_t bsh1, 184198957Srrs bus_size_t off1, 185198957Srrs bus_space_handle_t bsh2, 186198957Srrs bus_size_t off2, size_t count); 187198956Srrs 188198957Srrsu_int8_t 189198957Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 190198957Srrs bus_size_t offset); 191198956Srrs 192198957Srrsstatic u_int16_t 193198957Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 194198957Srrs bus_size_t offset); 195198956Srrs 196198957Srrsstatic u_int32_t 197198957Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 198198957Srrs bus_size_t offset); 199198957Srrsstatic void 200198957Srrsrmi_bus_space_read_multi_stream_1(void *t, 201198957Srrs bus_space_handle_t handle, 202198957Srrs bus_size_t offset, u_int8_t * addr, 203198957Srrs size_t count); 204198956Srrs 205198957Srrsstatic void 206198957Srrsrmi_bus_space_read_multi_stream_2(void *t, 207198957Srrs bus_space_handle_t handle, 208198957Srrs bus_size_t offset, u_int16_t * addr, 209198957Srrs size_t count); 210198956Srrs 211198957Srrsstatic void 212198957Srrsrmi_bus_space_read_multi_stream_4(void *t, 213198957Srrs bus_space_handle_t handle, 214198957Srrs bus_size_t offset, u_int32_t * addr, 215198957Srrs size_t count); 216198956Srrs 217198957Srrsvoid 218198957Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 219198957Srrs bus_size_t offset, u_int8_t value); 220198957Srrsstatic void 221198957Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 222198957Srrs bus_size_t offset, u_int16_t value); 223198956Srrs 224198957Srrsstatic void 225198957Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 226198957Srrs bus_size_t offset, u_int32_t value); 227198956Srrs 228198957Srrsstatic void 229198957Srrsrmi_bus_space_write_multi_stream_1(void *t, 230198957Srrs bus_space_handle_t handle, 231198957Srrs bus_size_t offset, 232198957Srrs const u_int8_t * addr, 233198957Srrs size_t count); 234198957Srrsstatic void 235198957Srrsrmi_bus_space_write_multi_stream_2(void *t, 236198957Srrs bus_space_handle_t handle, 237198957Srrs bus_size_t offset, 238198957Srrs const u_int16_t * addr, 239198957Srrs size_t count); 240198956Srrs 241198957Srrsstatic void 242198957Srrsrmi_bus_space_write_multi_stream_4(void *t, 243198957Srrs bus_space_handle_t handle, 244198957Srrs bus_size_t offset, 245198957Srrs const u_int32_t * addr, 246198957Srrs size_t count); 247198956Srrs 248198957Srrs 249198956Srrsstatic struct bus_space local_rmi_bus_space = { 250198956Srrs /* cookie */ 251198957Srrs (void *)0, 252198956Srrs 253198956Srrs /* mapping/unmapping */ 254198956Srrs rmi_bus_space_map, 255198956Srrs rmi_bus_space_unmap, 256198956Srrs rmi_bus_space_subregion, 257198956Srrs 258198956Srrs /* allocation/deallocation */ 259198956Srrs NULL, 260198956Srrs NULL, 261198956Srrs 262198956Srrs /* barrier */ 263198957Srrs rmi_bus_space_barrier, 264198956Srrs 265198956Srrs /* read (single) */ 266198956Srrs rmi_bus_space_read_1, 267198956Srrs rmi_bus_space_read_2, 268198956Srrs rmi_bus_space_read_4, 269198956Srrs NULL, 270198956Srrs 271198956Srrs /* read multiple */ 272198956Srrs rmi_bus_space_read_multi_1, 273198956Srrs rmi_bus_space_read_multi_2, 274198956Srrs rmi_bus_space_read_multi_4, 275198956Srrs NULL, 276198956Srrs 277198956Srrs /* read region */ 278198956Srrs rmi_bus_space_read_region_1, 279198956Srrs rmi_bus_space_read_region_2, 280198956Srrs rmi_bus_space_read_region_4, 281198956Srrs NULL, 282198956Srrs 283198956Srrs /* write (single) */ 284198956Srrs rmi_bus_space_write_1, 285198956Srrs rmi_bus_space_write_2, 286198956Srrs rmi_bus_space_write_4, 287198956Srrs NULL, 288198956Srrs 289198956Srrs /* write multiple */ 290198956Srrs rmi_bus_space_write_multi_1, 291198956Srrs rmi_bus_space_write_multi_2, 292198956Srrs rmi_bus_space_write_multi_4, 293198956Srrs NULL, 294198956Srrs 295198956Srrs /* write region */ 296198956Srrs NULL, 297198956Srrs rmi_bus_space_write_region_2, 298198956Srrs rmi_bus_space_write_region_4, 299198956Srrs NULL, 300198956Srrs 301198956Srrs /* set multiple */ 302198956Srrs NULL, 303198956Srrs NULL, 304198956Srrs NULL, 305198956Srrs NULL, 306198956Srrs 307198956Srrs /* set region */ 308198956Srrs NULL, 309198956Srrs rmi_bus_space_set_region_2, 310198956Srrs rmi_bus_space_set_region_4, 311198956Srrs NULL, 312198956Srrs 313198956Srrs /* copy */ 314198956Srrs NULL, 315198956Srrs rmi_bus_space_copy_region_2, 316198956Srrs NULL, 317198956Srrs NULL, 318198956Srrs 319198956Srrs /* read (single) stream */ 320198956Srrs rmi_bus_space_read_stream_1, 321198956Srrs rmi_bus_space_read_stream_2, 322198956Srrs rmi_bus_space_read_stream_4, 323198956Srrs NULL, 324198956Srrs 325198956Srrs /* read multiple stream */ 326198956Srrs rmi_bus_space_read_multi_stream_1, 327198956Srrs rmi_bus_space_read_multi_stream_2, 328198956Srrs rmi_bus_space_read_multi_stream_4, 329198956Srrs NULL, 330198956Srrs 331198956Srrs /* read region stream */ 332198956Srrs rmi_bus_space_read_region_1, 333198956Srrs rmi_bus_space_read_region_2, 334198956Srrs rmi_bus_space_read_region_4, 335198956Srrs NULL, 336198956Srrs 337198956Srrs /* write (single) stream */ 338198956Srrs rmi_bus_space_write_stream_1, 339198956Srrs rmi_bus_space_write_stream_2, 340198956Srrs rmi_bus_space_write_stream_4, 341198956Srrs NULL, 342198956Srrs 343198956Srrs /* write multiple stream */ 344198956Srrs rmi_bus_space_write_multi_stream_1, 345198956Srrs rmi_bus_space_write_multi_stream_2, 346198956Srrs rmi_bus_space_write_multi_stream_4, 347198956Srrs NULL, 348198956Srrs 349198956Srrs /* write region stream */ 350198956Srrs NULL, 351198956Srrs rmi_bus_space_write_region_2, 352198956Srrs rmi_bus_space_write_region_4, 353198956Srrs NULL, 354198956Srrs}; 355198956Srrs 356198956Srrs/* generic bus_space tag */ 357198956Srrsbus_space_tag_t rmi_bus_space = &local_rmi_bus_space; 358198956Srrs 359198956Srrs#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ 360198956Srrs#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ 361198957Srrs#define MIPS_BUS_SPACE_PCI 10 /* avoid conflict with other spaces */ 362198956Srrs 363198956Srrs#define BUS_SPACE_UNRESTRICTED (~0) 364198956Srrs 365198956Srrs#define SWAP32(x)\ 366198956Srrs (((x) & 0xff000000) >> 24) | \ 367198956Srrs (((x) & 0x000000ff) << 24) | \ 368198956Srrs (((x) & 0x0000ff00) << 8) | \ 369198956Srrs (((x) & 0x00ff0000) >> 8) 370198956Srrs 371198956Srrs#define SWAP16(x)\ 372198956Srrs (((x) & 0xff00) >> 8) | \ 373198957Srrs (((x) & 0x00ff) << 8) 374198956Srrs 375198956Srrs/* 376198956Srrs * Map a region of device bus space into CPU virtual address space. 377198956Srrs */ 378198956Srrs 379198956Srrs 380198956Srrsstatic int 381198956Srrsrmi_bus_space_map(void *t __unused, bus_addr_t addr, 382198957Srrs bus_size_t size __unused, int flags __unused, 383198957Srrs bus_space_handle_t * bshp) 384198956Srrs{ 385198956Srrs 386198956Srrs *bshp = addr; 387198956Srrs return (0); 388198956Srrs} 389198956Srrs 390198956Srrs/* 391198956Srrs * Unmap a region of device bus space. 392198956Srrs */ 393198956Srrsstatic void 394198956Srrsrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 395198957Srrs bus_size_t size __unused) 396198956Srrs{ 397198956Srrs} 398198956Srrs 399198956Srrs/* 400198956Srrs * Get a new handle for a subregion of an already-mapped area of bus space. 401198956Srrs */ 402198956Srrs 403198956Srrsstatic int 404198956Srrsrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 405198957Srrs bus_size_t offset, bus_size_t size __unused, 406198957Srrs bus_space_handle_t * nbshp) 407198956Srrs{ 408198956Srrs *nbshp = bsh + offset; 409198956Srrs return (0); 410198956Srrs} 411198956Srrs 412198956Srrs/* 413198956Srrs * Read a 1, 2, 4, or 8 byte quantity from bus space 414198956Srrs * described by tag/handle/offset. 415198956Srrs */ 416198956Srrs 417198956Srrsstatic u_int8_t 418198956Srrsrmi_bus_space_read_1(void *tag, bus_space_handle_t handle, 419198957Srrs bus_size_t offset) 420198956Srrs{ 421198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 422198957Srrs return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 423198956Srrs else 424198957Srrs return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); 425198956Srrs} 426198956Srrs 427198956Srrsstatic u_int16_t 428198956Srrsrmi_bus_space_read_2(void *tag, bus_space_handle_t handle, 429198957Srrs bus_size_t offset) 430198956Srrs{ 431198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 432198957Srrs return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); 433198956Srrs else 434198956Srrs return *(volatile u_int16_t *)(handle + offset); 435198956Srrs} 436198956Srrs 437198956Srrsstatic u_int32_t 438198956Srrsrmi_bus_space_read_4(void *tag, bus_space_handle_t handle, 439198957Srrs bus_size_t offset) 440198956Srrs{ 441198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 442198956Srrs return SWAP32((*(volatile u_int32_t *)(handle + offset))); 443198957Srrs else 444198956Srrs return (*(volatile u_int32_t *)(handle + offset)); 445198956Srrs} 446198956Srrs 447198956Srrs 448198956Srrs 449198956Srrs/* 450198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 451198956Srrs * described by tag/handle/offset and copy into buffer provided. 452198956Srrs */ 453198956Srrsstatic void 454198956Srrsrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 455198957Srrs bus_size_t offset, u_int8_t * addr, size_t count) 456198956Srrs{ 457198956Srrs 458198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 459198956Srrs return; 460198956Srrs while (count--) { 461198956Srrs *addr = (*(volatile u_int8_t *)(handle + offset)); 462198956Srrs addr++; 463198956Srrs } 464198956Srrs} 465198956Srrs 466198956Srrsstatic void 467198956Srrsrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 468198957Srrs bus_size_t offset, u_int16_t * addr, size_t count) 469198956Srrs{ 470198956Srrs 471198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 472198956Srrs return; 473198956Srrs while (count--) { 474198956Srrs *addr = *(volatile u_int16_t *)(handle + offset); 475198956Srrs *addr = SWAP16(*addr); 476198956Srrs addr++; 477198956Srrs } 478198956Srrs} 479198956Srrs 480198956Srrsstatic void 481198956Srrsrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 482198957Srrs bus_size_t offset, u_int32_t * addr, size_t count) 483198956Srrs{ 484198956Srrs 485198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 486198956Srrs return; 487198956Srrs while (count--) { 488198956Srrs *addr = *(volatile u_int32_t *)(handle + offset); 489198956Srrs *addr = SWAP32(*addr); 490198956Srrs addr++; 491198956Srrs } 492198956Srrs} 493198956Srrs 494198956Srrs/* 495198956Srrs * Write the 1, 2, 4, or 8 byte value `value' to bus space 496198956Srrs * described by tag/handle/offset. 497198956Srrs */ 498198956Srrs 499198956Srrs 500198956Srrsstatic void 501198956Srrsrmi_bus_space_write_1(void *tag, bus_space_handle_t handle, 502198957Srrs bus_size_t offset, u_int8_t value) 503198956Srrs{ 504198956Srrs mips_sync(); 505198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) 506198956Srrs *(volatile u_int8_t *)(handle + offset) = value; 507198956Srrs else 508198957Srrs *(volatile u_int32_t *)(handle + offset) = (u_int32_t) value; 509198956Srrs} 510198956Srrs 511198956Srrsstatic void 512198956Srrsrmi_bus_space_write_2(void *tag, bus_space_handle_t handle, 513198957Srrs bus_size_t offset, u_int16_t value) 514198956Srrs{ 515198956Srrs mips_sync(); 516198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) { 517198956Srrs *(volatile u_int16_t *)(handle + offset) = SWAP16(value); 518198956Srrs } else 519198956Srrs *(volatile u_int16_t *)(handle + offset) = value; 520198956Srrs} 521198956Srrs 522198956Srrs 523198956Srrsstatic void 524198956Srrsrmi_bus_space_write_4(void *tag, bus_space_handle_t handle, 525198957Srrs bus_size_t offset, u_int32_t value) 526198956Srrs{ 527198956Srrs mips_sync(); 528198956Srrs if ((int)tag == MIPS_BUS_SPACE_PCI) { 529198956Srrs *(volatile u_int32_t *)(handle + offset) = SWAP32(value); 530198956Srrs } else 531198956Srrs *(volatile u_int32_t *)(handle + offset) = value; 532198956Srrs} 533198956Srrs 534198956Srrs 535198956Srrs 536198956Srrs/* 537198956Srrs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 538198956Srrs * provided to bus space described by tag/handle/offset. 539198956Srrs */ 540198956Srrs 541198956Srrs 542198956Srrsstatic void 543198956Srrsrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 544198957Srrs bus_size_t offset, const u_int8_t * addr, size_t count) 545198956Srrs{ 546198956Srrs mips_sync(); 547198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 548198956Srrs return; 549198956Srrs while (count--) { 550198956Srrs (*(volatile u_int8_t *)(handle + offset)) = *addr; 551198956Srrs addr++; 552198956Srrs } 553198956Srrs} 554198956Srrs 555198956Srrsstatic void 556198956Srrsrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 557198957Srrs bus_size_t offset, const u_int16_t * addr, size_t count) 558198956Srrs{ 559198956Srrs mips_sync(); 560198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 561198956Srrs return; 562198956Srrs while (count--) { 563198956Srrs (*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr); 564198956Srrs addr++; 565198956Srrs } 566198956Srrs} 567198956Srrs 568198956Srrsstatic void 569198956Srrsrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 570198957Srrs bus_size_t offset, const u_int32_t * addr, size_t count) 571198956Srrs{ 572198956Srrs mips_sync(); 573198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 574198956Srrs return; 575198956Srrs while (count--) { 576198956Srrs (*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr); 577198956Srrs addr++; 578198956Srrs } 579198956Srrs} 580198956Srrs 581198956Srrs/* 582198956Srrs * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 583198956Srrs * by tag/handle starting at `offset'. 584198956Srrs */ 585198956Srrs 586198956Srrsstatic void 587198956Srrsrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 588198957Srrs bus_size_t offset, u_int16_t value, size_t count) 589198956Srrs{ 590198956Srrs bus_addr_t addr = bsh + offset; 591198956Srrs 592198956Srrs for (; count != 0; count--, addr += 2) 593198956Srrs (*(volatile u_int16_t *)(addr)) = value; 594198956Srrs} 595198956Srrs 596198956Srrsstatic void 597198956Srrsrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 598198957Srrs bus_size_t offset, u_int32_t value, size_t count) 599198956Srrs{ 600198956Srrs bus_addr_t addr = bsh + offset; 601198956Srrs 602198956Srrs for (; count != 0; count--, addr += 4) 603198956Srrs (*(volatile u_int32_t *)(addr)) = value; 604198956Srrs} 605198956Srrs 606198956Srrs 607198956Srrs/* 608198956Srrs * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 609198956Srrs * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 610198956Srrs */ 611198956Srrsstatic void 612198956Srrsrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 613198957Srrs bus_size_t off1, bus_space_handle_t bsh2, 614198957Srrs bus_size_t off2, size_t count) 615198956Srrs{ 616198956Srrs printf("bus_space_copy_region_2 - unimplemented\n"); 617198956Srrs} 618198956Srrs 619198956Srrs/* 620198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 621198956Srrs * described by tag/handle/offset and copy into buffer provided. 622198956Srrs */ 623198956Srrs 624198956Srrsu_int8_t 625198956Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 626198956Srrs bus_size_t offset) 627198956Srrs{ 628198956Srrs 629198956Srrs return *((volatile u_int8_t *)(handle + offset)); 630198956Srrs} 631198956Srrs 632198956Srrs 633198956Srrsstatic u_int16_t 634198956Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 635198957Srrs bus_size_t offset) 636198956Srrs{ 637198957Srrs return *(volatile u_int16_t *)(handle + offset); 638198956Srrs} 639198956Srrs 640198956Srrs 641198956Srrsstatic u_int32_t 642198956Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 643198957Srrs bus_size_t offset) 644198956Srrs{ 645198957Srrs return (*(volatile u_int32_t *)(handle + offset)); 646198956Srrs} 647198956Srrs 648198956Srrs 649198956Srrsstatic void 650198956Srrsrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 651198957Srrs bus_size_t offset, u_int8_t * addr, size_t count) 652198956Srrs{ 653198956Srrs 654198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 655198956Srrs return; 656198956Srrs while (count--) { 657198956Srrs *addr = (*(volatile u_int8_t *)(handle + offset)); 658198956Srrs addr++; 659198956Srrs } 660198956Srrs} 661198956Srrs 662198956Srrsstatic void 663198956Srrsrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 664198957Srrs bus_size_t offset, u_int16_t * addr, size_t count) 665198956Srrs{ 666198956Srrs 667198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 668198956Srrs return; 669198956Srrs while (count--) { 670198956Srrs *addr = (*(volatile u_int16_t *)(handle + offset)); 671198956Srrs addr++; 672198956Srrs } 673198956Srrs} 674198956Srrs 675198956Srrsstatic void 676198956Srrsrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 677198957Srrs bus_size_t offset, u_int32_t * addr, size_t count) 678198956Srrs{ 679198956Srrs 680198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 681198956Srrs return; 682198956Srrs while (count--) { 683198956Srrs *addr = (*(volatile u_int32_t *)(handle + offset)); 684198956Srrs addr++; 685198956Srrs } 686198956Srrs} 687198956Srrs 688198956Srrs 689198956Srrs 690198956Srrs/* 691198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space 692198956Srrs * described by tag/handle and starting at `offset' and copy into 693198956Srrs * buffer provided. 694198956Srrs */ 695198956Srrsvoid 696198956Srrsrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 697198957Srrs bus_size_t offset, u_int8_t * addr, size_t count) 698198956Srrs{ 699198956Srrs bus_addr_t baddr = bsh + offset; 700198956Srrs 701198956Srrs while (count--) { 702198956Srrs *addr++ = (*(volatile u_int8_t *)(baddr)); 703198956Srrs baddr += 1; 704198956Srrs } 705198956Srrs} 706198956Srrs 707198956Srrsvoid 708198956Srrsrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 709198957Srrs bus_size_t offset, u_int16_t * addr, size_t count) 710198956Srrs{ 711198956Srrs bus_addr_t baddr = bsh + offset; 712198956Srrs 713198956Srrs while (count--) { 714198956Srrs *addr++ = (*(volatile u_int16_t *)(baddr)); 715198956Srrs baddr += 2; 716198956Srrs } 717198956Srrs} 718198956Srrs 719198956Srrsvoid 720198956Srrsrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 721198957Srrs bus_size_t offset, u_int32_t * addr, size_t count) 722198956Srrs{ 723198956Srrs bus_addr_t baddr = bsh + offset; 724198956Srrs 725198956Srrs while (count--) { 726198956Srrs *addr++ = (*(volatile u_int32_t *)(baddr)); 727198956Srrs baddr += 4; 728198956Srrs } 729198956Srrs} 730198956Srrs 731198956Srrs 732198956Srrsvoid 733198956Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 734198956Srrs bus_size_t offset, u_int8_t value) 735198956Srrs{ 736198956Srrs mips_sync(); 737198956Srrs *(volatile u_int8_t *)(handle + offset) = value; 738198956Srrs} 739198956Srrs 740198956Srrs 741198956Srrsstatic void 742198956Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 743198957Srrs bus_size_t offset, u_int16_t value) 744198956Srrs{ 745198956Srrs mips_sync(); 746198956Srrs *(volatile u_int16_t *)(handle + offset) = value; 747198956Srrs} 748198956Srrs 749198956Srrs 750198956Srrsstatic void 751198956Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 752198957Srrs bus_size_t offset, u_int32_t value) 753198956Srrs{ 754198956Srrs mips_sync(); 755198956Srrs *(volatile u_int32_t *)(handle + offset) = value; 756198956Srrs} 757198956Srrs 758198956Srrs 759198956Srrsstatic void 760198956Srrsrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 761198957Srrs bus_size_t offset, const u_int8_t * addr, size_t count) 762198956Srrs{ 763198956Srrs mips_sync(); 764198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 765198956Srrs return; 766198956Srrs while (count--) { 767198956Srrs (*(volatile u_int8_t *)(handle + offset)) = *addr; 768198956Srrs addr++; 769198956Srrs } 770198956Srrs} 771198956Srrs 772198956Srrsstatic void 773198956Srrsrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 774198957Srrs bus_size_t offset, const u_int16_t * addr, size_t count) 775198956Srrs{ 776198956Srrs mips_sync(); 777198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 778198956Srrs return; 779198956Srrs while (count--) { 780198956Srrs (*(volatile u_int16_t *)(handle + offset)) = *addr; 781198956Srrs addr++; 782198956Srrs } 783198956Srrs} 784198956Srrs 785198956Srrsstatic void 786198956Srrsrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 787198957Srrs bus_size_t offset, const u_int32_t * addr, size_t count) 788198956Srrs{ 789198956Srrs mips_sync(); 790198956Srrs if ((int)tag != MIPS_BUS_SPACE_PCI) 791198956Srrs return; 792198956Srrs while (count--) { 793198956Srrs (*(volatile u_int32_t *)(handle + offset)) = *addr; 794198956Srrs addr++; 795198956Srrs } 796198956Srrs} 797198956Srrs 798198956Srrsvoid 799198956Srrsrmi_bus_space_write_region_2(void *t, 800198957Srrs bus_space_handle_t bsh, 801198957Srrs bus_size_t offset, 802198957Srrs const u_int16_t * addr, 803198957Srrs size_t count) 804198956Srrs{ 805198957Srrs bus_addr_t baddr = (bus_addr_t) bsh + offset; 806198957Srrs 807198956Srrs while (count--) { 808198956Srrs (*(volatile u_int16_t *)(baddr)) = *addr; 809198956Srrs addr++; 810198956Srrs baddr += 2; 811198956Srrs } 812198956Srrs} 813198956Srrs 814198956Srrsvoid 815198956Srrsrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 816198957Srrs bus_size_t offset, const u_int32_t * addr, size_t count) 817198956Srrs{ 818198956Srrs bus_addr_t baddr = bsh + offset; 819198956Srrs 820198956Srrs while (count--) { 821198956Srrs (*(volatile u_int32_t *)(baddr)) = *addr; 822198956Srrs addr++; 823198956Srrs baddr += 4; 824198956Srrs } 825198956Srrs} 826198956Srrs 827198956Srrsstatic void 828198956Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 829198957Srrs bus_size_t offset __unused, bus_size_t len __unused, int flags) 830198956Srrs{ 831198956Srrs 832198956Srrs} 833