1225394Sjchandra/*- 2225394Sjchandra * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights 3225394Sjchandra * reserved. 4225394Sjchandra * 5225394Sjchandra * Redistribution and use in source and binary forms, with or without 6225394Sjchandra * modification, are permitted provided that the following conditions are 7225394Sjchandra * met: 8225394Sjchandra * 9225394Sjchandra * 1. Redistributions of source code must retain the above copyright 10225394Sjchandra * notice, this list of conditions and the following disclaimer. 11225394Sjchandra * 2. Redistributions in binary form must reproduce the above copyright 12225394Sjchandra * notice, this list of conditions and the following disclaimer in 13225394Sjchandra * the documentation and/or other materials provided with the 14225394Sjchandra * distribution. 15225394Sjchandra * 16225394Sjchandra * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND 17225394Sjchandra * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18225394Sjchandra * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19225394Sjchandra * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE 20225394Sjchandra * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21225394Sjchandra * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22225394Sjchandra * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23225394Sjchandra * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24225394Sjchandra * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25225394Sjchandra * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26225394Sjchandra * THE POSSIBILITY OF SUCH DAMAGE. 27225394Sjchandra * 28225394Sjchandra * NETLOGIC_BSD */ 29225394Sjchandra 30225394Sjchandra#include <sys/cdefs.h> 31225394Sjchandra__FBSDID("$FreeBSD$"); 32225394Sjchandra 33225394Sjchandra#include <sys/param.h> 34225394Sjchandra#include <sys/systm.h> 35225394Sjchandra#include <sys/bus.h> 36225394Sjchandra#include <sys/kernel.h> 37225394Sjchandra#include <sys/endian.h> 38225394Sjchandra#include <sys/malloc.h> 39225394Sjchandra#include <sys/ktr.h> 40225394Sjchandra 41225394Sjchandra#include <vm/vm.h> 42225394Sjchandra#include <vm/pmap.h> 43225394Sjchandra#include <vm/vm_kern.h> 44225394Sjchandra#include <vm/vm_extern.h> 45225394Sjchandra 46225394Sjchandra#include <machine/bus.h> 47225394Sjchandra#include <machine/cache.h> 48225394Sjchandra 49225394Sjchandrastatic int 50225394Sjchandrarmi_pci_bus_space_map(void *t, bus_addr_t addr, 51225394Sjchandra bus_size_t size, int flags, 52225394Sjchandra bus_space_handle_t * bshp); 53225394Sjchandra 54225394Sjchandrastatic void 55225394Sjchandrarmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, 56225394Sjchandra bus_size_t size); 57225394Sjchandra 58225394Sjchandrastatic int 59225394Sjchandrarmi_pci_bus_space_subregion(void *t, 60225394Sjchandra bus_space_handle_t bsh, 61225394Sjchandra bus_size_t offset, bus_size_t size, 62225394Sjchandra bus_space_handle_t * nbshp); 63225394Sjchandra 64225394Sjchandrastatic u_int8_t 65225394Sjchandrarmi_pci_bus_space_read_1(void *t, 66225394Sjchandra bus_space_handle_t handle, 67225394Sjchandra bus_size_t offset); 68225394Sjchandra 69225394Sjchandrastatic u_int16_t 70225394Sjchandrarmi_pci_bus_space_read_2(void *t, 71225394Sjchandra bus_space_handle_t handle, 72225394Sjchandra bus_size_t offset); 73225394Sjchandra 74225394Sjchandrastatic u_int32_t 75225394Sjchandrarmi_pci_bus_space_read_4(void *t, 76225394Sjchandra bus_space_handle_t handle, 77225394Sjchandra bus_size_t offset); 78225394Sjchandra 79225394Sjchandrastatic void 80225394Sjchandrarmi_pci_bus_space_read_multi_1(void *t, 81225394Sjchandra bus_space_handle_t handle, 82225394Sjchandra bus_size_t offset, u_int8_t * addr, 83225394Sjchandra size_t count); 84225394Sjchandra 85225394Sjchandrastatic void 86225394Sjchandrarmi_pci_bus_space_read_multi_2(void *t, 87225394Sjchandra bus_space_handle_t handle, 88225394Sjchandra bus_size_t offset, u_int16_t * addr, 89225394Sjchandra size_t count); 90225394Sjchandra 91225394Sjchandrastatic void 92225394Sjchandrarmi_pci_bus_space_read_multi_4(void *t, 93225394Sjchandra bus_space_handle_t handle, 94225394Sjchandra bus_size_t offset, u_int32_t * addr, 95225394Sjchandra size_t count); 96225394Sjchandra 97225394Sjchandrastatic void 98225394Sjchandrarmi_pci_bus_space_read_region_1(void *t, 99225394Sjchandra bus_space_handle_t bsh, 100225394Sjchandra bus_size_t offset, u_int8_t * addr, 101225394Sjchandra size_t count); 102225394Sjchandra 103225394Sjchandrastatic void 104225394Sjchandrarmi_pci_bus_space_read_region_2(void *t, 105225394Sjchandra bus_space_handle_t bsh, 106225394Sjchandra bus_size_t offset, u_int16_t * addr, 107225394Sjchandra size_t count); 108225394Sjchandra 109225394Sjchandrastatic void 110225394Sjchandrarmi_pci_bus_space_read_region_4(void *t, 111225394Sjchandra bus_space_handle_t bsh, 112225394Sjchandra bus_size_t offset, u_int32_t * addr, 113225394Sjchandra size_t count); 114225394Sjchandra 115225394Sjchandrastatic void 116225394Sjchandrarmi_pci_bus_space_write_1(void *t, 117225394Sjchandra bus_space_handle_t handle, 118225394Sjchandra bus_size_t offset, u_int8_t value); 119225394Sjchandra 120225394Sjchandrastatic void 121225394Sjchandrarmi_pci_bus_space_write_2(void *t, 122225394Sjchandra bus_space_handle_t handle, 123225394Sjchandra bus_size_t offset, u_int16_t value); 124225394Sjchandra 125225394Sjchandrastatic void 126225394Sjchandrarmi_pci_bus_space_write_4(void *t, 127225394Sjchandra bus_space_handle_t handle, 128225394Sjchandra bus_size_t offset, u_int32_t value); 129225394Sjchandra 130225394Sjchandrastatic void 131225394Sjchandrarmi_pci_bus_space_write_multi_1(void *t, 132225394Sjchandra bus_space_handle_t handle, 133225394Sjchandra bus_size_t offset, 134225394Sjchandra const u_int8_t * addr, 135225394Sjchandra size_t count); 136225394Sjchandra 137225394Sjchandrastatic void 138225394Sjchandrarmi_pci_bus_space_write_multi_2(void *t, 139225394Sjchandra bus_space_handle_t handle, 140225394Sjchandra bus_size_t offset, 141225394Sjchandra const u_int16_t * addr, 142225394Sjchandra size_t count); 143225394Sjchandra 144225394Sjchandrastatic void 145225394Sjchandrarmi_pci_bus_space_write_multi_4(void *t, 146225394Sjchandra bus_space_handle_t handle, 147225394Sjchandra bus_size_t offset, 148225394Sjchandra const u_int32_t * addr, 149225394Sjchandra size_t count); 150225394Sjchandra 151225394Sjchandrastatic void 152225394Sjchandrarmi_pci_bus_space_write_region_2(void *t, 153225394Sjchandra bus_space_handle_t bsh, 154225394Sjchandra bus_size_t offset, 155225394Sjchandra const u_int16_t * addr, 156225394Sjchandra size_t count); 157225394Sjchandra 158225394Sjchandrastatic void 159225394Sjchandrarmi_pci_bus_space_write_region_4(void *t, 160225394Sjchandra bus_space_handle_t bsh, 161225394Sjchandra bus_size_t offset, 162225394Sjchandra const u_int32_t * addr, 163225394Sjchandra size_t count); 164225394Sjchandra 165225394Sjchandra 166225394Sjchandrastatic void 167225394Sjchandrarmi_pci_bus_space_set_region_2(void *t, 168225394Sjchandra bus_space_handle_t bsh, 169225394Sjchandra bus_size_t offset, u_int16_t value, 170225394Sjchandra size_t count); 171225394Sjchandrastatic void 172225394Sjchandrarmi_pci_bus_space_set_region_4(void *t, 173225394Sjchandra bus_space_handle_t bsh, 174225394Sjchandra bus_size_t offset, u_int32_t value, 175225394Sjchandra size_t count); 176225394Sjchandra 177225394Sjchandrastatic void 178225394Sjchandrarmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 179225394Sjchandra bus_size_t offset __unused, bus_size_t len __unused, int flags); 180225394Sjchandra 181225394Sjchandrastatic void 182225394Sjchandrarmi_pci_bus_space_copy_region_2(void *t, 183225394Sjchandra bus_space_handle_t bsh1, 184225394Sjchandra bus_size_t off1, 185225394Sjchandra bus_space_handle_t bsh2, 186225394Sjchandra bus_size_t off2, size_t count); 187225394Sjchandra 188225394Sjchandrau_int8_t 189225394Sjchandrarmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 190225394Sjchandra bus_size_t offset); 191225394Sjchandra 192225394Sjchandrastatic u_int16_t 193225394Sjchandrarmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 194225394Sjchandra bus_size_t offset); 195225394Sjchandra 196225394Sjchandrastatic u_int32_t 197225394Sjchandrarmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 198225394Sjchandra bus_size_t offset); 199225394Sjchandrastatic void 200225394Sjchandrarmi_pci_bus_space_read_multi_stream_1(void *t, 201225394Sjchandra bus_space_handle_t handle, 202225394Sjchandra bus_size_t offset, u_int8_t * addr, 203225394Sjchandra size_t count); 204225394Sjchandra 205225394Sjchandrastatic void 206225394Sjchandrarmi_pci_bus_space_read_multi_stream_2(void *t, 207225394Sjchandra bus_space_handle_t handle, 208225394Sjchandra bus_size_t offset, u_int16_t * addr, 209225394Sjchandra size_t count); 210225394Sjchandra 211225394Sjchandrastatic void 212225394Sjchandrarmi_pci_bus_space_read_multi_stream_4(void *t, 213225394Sjchandra bus_space_handle_t handle, 214225394Sjchandra bus_size_t offset, u_int32_t * addr, 215225394Sjchandra size_t count); 216225394Sjchandra 217225394Sjchandravoid 218225394Sjchandrarmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 219225394Sjchandra bus_size_t offset, u_int8_t value); 220225394Sjchandrastatic void 221225394Sjchandrarmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 222225394Sjchandra bus_size_t offset, u_int16_t value); 223225394Sjchandra 224225394Sjchandrastatic void 225225394Sjchandrarmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 226225394Sjchandra bus_size_t offset, u_int32_t value); 227225394Sjchandra 228225394Sjchandrastatic void 229225394Sjchandrarmi_pci_bus_space_write_multi_stream_1(void *t, 230225394Sjchandra bus_space_handle_t handle, 231225394Sjchandra bus_size_t offset, 232225394Sjchandra const u_int8_t * addr, 233225394Sjchandra size_t count); 234225394Sjchandrastatic void 235225394Sjchandrarmi_pci_bus_space_write_multi_stream_2(void *t, 236225394Sjchandra bus_space_handle_t handle, 237225394Sjchandra bus_size_t offset, 238225394Sjchandra const u_int16_t * addr, 239225394Sjchandra size_t count); 240225394Sjchandra 241225394Sjchandrastatic void 242225394Sjchandrarmi_pci_bus_space_write_multi_stream_4(void *t, 243225394Sjchandra bus_space_handle_t handle, 244225394Sjchandra bus_size_t offset, 245225394Sjchandra const u_int32_t * addr, 246225394Sjchandra size_t count); 247225394Sjchandra 248225394Sjchandra#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) 249225394Sjchandra 250225394Sjchandrastatic struct bus_space local_rmi_pci_bus_space = { 251225394Sjchandra /* cookie */ 252225394Sjchandra (void *)0, 253225394Sjchandra 254225394Sjchandra /* mapping/unmapping */ 255225394Sjchandra rmi_pci_bus_space_map, 256225394Sjchandra rmi_pci_bus_space_unmap, 257225394Sjchandra rmi_pci_bus_space_subregion, 258225394Sjchandra 259225394Sjchandra /* allocation/deallocation */ 260225394Sjchandra NULL, 261225394Sjchandra NULL, 262225394Sjchandra 263225394Sjchandra /* barrier */ 264225394Sjchandra rmi_pci_bus_space_barrier, 265225394Sjchandra 266225394Sjchandra /* read (single) */ 267225394Sjchandra rmi_pci_bus_space_read_1, 268225394Sjchandra rmi_pci_bus_space_read_2, 269225394Sjchandra rmi_pci_bus_space_read_4, 270225394Sjchandra NULL, 271225394Sjchandra 272225394Sjchandra /* read multiple */ 273225394Sjchandra rmi_pci_bus_space_read_multi_1, 274225394Sjchandra rmi_pci_bus_space_read_multi_2, 275225394Sjchandra rmi_pci_bus_space_read_multi_4, 276225394Sjchandra NULL, 277225394Sjchandra 278225394Sjchandra /* read region */ 279225394Sjchandra rmi_pci_bus_space_read_region_1, 280225394Sjchandra rmi_pci_bus_space_read_region_2, 281225394Sjchandra rmi_pci_bus_space_read_region_4, 282225394Sjchandra NULL, 283225394Sjchandra 284225394Sjchandra /* write (single) */ 285225394Sjchandra rmi_pci_bus_space_write_1, 286225394Sjchandra rmi_pci_bus_space_write_2, 287225394Sjchandra rmi_pci_bus_space_write_4, 288225394Sjchandra NULL, 289225394Sjchandra 290225394Sjchandra /* write multiple */ 291225394Sjchandra rmi_pci_bus_space_write_multi_1, 292225394Sjchandra rmi_pci_bus_space_write_multi_2, 293225394Sjchandra rmi_pci_bus_space_write_multi_4, 294225394Sjchandra NULL, 295225394Sjchandra 296225394Sjchandra /* write region */ 297225394Sjchandra NULL, 298225394Sjchandra rmi_pci_bus_space_write_region_2, 299225394Sjchandra rmi_pci_bus_space_write_region_4, 300225394Sjchandra NULL, 301225394Sjchandra 302225394Sjchandra /* set multiple */ 303225394Sjchandra NULL, 304225394Sjchandra NULL, 305225394Sjchandra NULL, 306225394Sjchandra NULL, 307225394Sjchandra 308225394Sjchandra /* set region */ 309225394Sjchandra NULL, 310225394Sjchandra rmi_pci_bus_space_set_region_2, 311225394Sjchandra rmi_pci_bus_space_set_region_4, 312225394Sjchandra NULL, 313225394Sjchandra 314225394Sjchandra /* copy */ 315225394Sjchandra NULL, 316225394Sjchandra rmi_pci_bus_space_copy_region_2, 317225394Sjchandra NULL, 318225394Sjchandra NULL, 319225394Sjchandra 320225394Sjchandra /* read (single) stream */ 321225394Sjchandra rmi_pci_bus_space_read_stream_1, 322225394Sjchandra rmi_pci_bus_space_read_stream_2, 323225394Sjchandra rmi_pci_bus_space_read_stream_4, 324225394Sjchandra NULL, 325225394Sjchandra 326225394Sjchandra /* read multiple stream */ 327225394Sjchandra rmi_pci_bus_space_read_multi_stream_1, 328225394Sjchandra rmi_pci_bus_space_read_multi_stream_2, 329225394Sjchandra rmi_pci_bus_space_read_multi_stream_4, 330225394Sjchandra NULL, 331225394Sjchandra 332225394Sjchandra /* read region stream */ 333225394Sjchandra rmi_pci_bus_space_read_region_1, 334225394Sjchandra rmi_pci_bus_space_read_region_2, 335225394Sjchandra rmi_pci_bus_space_read_region_4, 336225394Sjchandra NULL, 337225394Sjchandra 338225394Sjchandra /* write (single) stream */ 339225394Sjchandra rmi_pci_bus_space_write_stream_1, 340225394Sjchandra rmi_pci_bus_space_write_stream_2, 341225394Sjchandra rmi_pci_bus_space_write_stream_4, 342225394Sjchandra NULL, 343225394Sjchandra 344225394Sjchandra /* write multiple stream */ 345225394Sjchandra rmi_pci_bus_space_write_multi_stream_1, 346225394Sjchandra rmi_pci_bus_space_write_multi_stream_2, 347225394Sjchandra rmi_pci_bus_space_write_multi_stream_4, 348225394Sjchandra NULL, 349225394Sjchandra 350225394Sjchandra /* write region stream */ 351225394Sjchandra NULL, 352225394Sjchandra rmi_pci_bus_space_write_region_2, 353225394Sjchandra rmi_pci_bus_space_write_region_4, 354225394Sjchandra NULL, 355225394Sjchandra}; 356225394Sjchandra 357225394Sjchandra/* generic bus_space tag */ 358225394Sjchandrabus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; 359225394Sjchandra 360225394Sjchandra/* 361225394Sjchandra * Map a region of device bus space into CPU virtual address space. 362225394Sjchandra */ 363225394Sjchandrastatic int 364225394Sjchandrarmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, 365225394Sjchandra bus_size_t size __unused, int flags __unused, 366225394Sjchandra bus_space_handle_t * bshp) 367225394Sjchandra{ 368225394Sjchandra *bshp = addr; 369225394Sjchandra return (0); 370225394Sjchandra} 371225394Sjchandra 372225394Sjchandra/* 373225394Sjchandra * Unmap a region of device bus space. 374225394Sjchandra */ 375225394Sjchandrastatic void 376225394Sjchandrarmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 377225394Sjchandra bus_size_t size __unused) 378225394Sjchandra{ 379225394Sjchandra} 380225394Sjchandra 381225394Sjchandra/* 382225394Sjchandra * Get a new handle for a subregion of an already-mapped area of bus space. 383225394Sjchandra */ 384225394Sjchandra 385225394Sjchandrastatic int 386225394Sjchandrarmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 387225394Sjchandra bus_size_t offset, bus_size_t size __unused, 388225394Sjchandra bus_space_handle_t * nbshp) 389225394Sjchandra{ 390225394Sjchandra *nbshp = bsh + offset; 391225394Sjchandra return (0); 392225394Sjchandra} 393225394Sjchandra 394225394Sjchandra/* 395225394Sjchandra * Read a 1, 2, 4, or 8 byte quantity from bus space 396225394Sjchandra * described by tag/handle/offset. 397225394Sjchandra */ 398225394Sjchandra 399225394Sjchandrastatic u_int8_t 400225394Sjchandrarmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, 401225394Sjchandra bus_size_t offset) 402225394Sjchandra{ 403225394Sjchandra return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 404225394Sjchandra} 405225394Sjchandra 406225394Sjchandrastatic u_int16_t 407225394Sjchandrarmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, 408225394Sjchandra bus_size_t offset) 409225394Sjchandra{ 410225394Sjchandra u_int16_t value; 411225394Sjchandra 412225394Sjchandra value = *(volatile u_int16_t *)(handle + offset); 413225394Sjchandra return bswap16(value); 414225394Sjchandra} 415225394Sjchandra 416225394Sjchandrastatic u_int32_t 417225394Sjchandrarmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, 418225394Sjchandra bus_size_t offset) 419225394Sjchandra{ 420225394Sjchandra uint32_t value; 421225394Sjchandra 422225394Sjchandra value = *(volatile u_int32_t *)(handle + offset); 423225394Sjchandra return bswap32(value); 424225394Sjchandra} 425225394Sjchandra 426225394Sjchandra/* 427225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space 428225394Sjchandra * described by tag/handle/offset and copy into buffer provided. 429225394Sjchandra */ 430225394Sjchandrastatic void 431225394Sjchandrarmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 432225394Sjchandra bus_size_t offset, u_int8_t * addr, size_t count) 433225394Sjchandra{ 434225394Sjchandra while (count--) { 435225394Sjchandra *addr = *(volatile u_int8_t *)(handle + offset); 436225394Sjchandra addr++; 437225394Sjchandra } 438225394Sjchandra} 439225394Sjchandra 440225394Sjchandrastatic void 441225394Sjchandrarmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 442225394Sjchandra bus_size_t offset, u_int16_t * addr, size_t count) 443225394Sjchandra{ 444225394Sjchandra 445225394Sjchandra while (count--) { 446225394Sjchandra *addr = *(volatile u_int16_t *)(handle + offset); 447225394Sjchandra *addr = bswap16(*addr); 448225394Sjchandra addr++; 449225394Sjchandra } 450225394Sjchandra} 451225394Sjchandra 452225394Sjchandrastatic void 453225394Sjchandrarmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 454225394Sjchandra bus_size_t offset, u_int32_t * addr, size_t count) 455225394Sjchandra{ 456225394Sjchandra 457225394Sjchandra while (count--) { 458225394Sjchandra *addr = *(volatile u_int32_t *)(handle + offset); 459225394Sjchandra *addr = bswap32(*addr); 460225394Sjchandra addr++; 461225394Sjchandra } 462225394Sjchandra} 463225394Sjchandra 464225394Sjchandra/* 465225394Sjchandra * Write the 1, 2, 4, or 8 byte value `value' to bus space 466225394Sjchandra * described by tag/handle/offset. 467225394Sjchandra */ 468225394Sjchandra 469225394Sjchandrastatic void 470225394Sjchandrarmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, 471225394Sjchandra bus_size_t offset, u_int8_t value) 472225394Sjchandra{ 473225394Sjchandra mips_sync(); 474225394Sjchandra *(volatile u_int8_t *)(handle + offset) = value; 475225394Sjchandra} 476225394Sjchandra 477225394Sjchandrastatic void 478225394Sjchandrarmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, 479225394Sjchandra bus_size_t offset, u_int16_t value) 480225394Sjchandra{ 481225394Sjchandra mips_sync(); 482225394Sjchandra *(volatile u_int16_t *)(handle + offset) = bswap16(value); 483225394Sjchandra} 484225394Sjchandra 485225394Sjchandra 486225394Sjchandrastatic void 487225394Sjchandrarmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, 488225394Sjchandra bus_size_t offset, u_int32_t value) 489225394Sjchandra{ 490225394Sjchandra mips_sync(); 491225394Sjchandra *(volatile u_int32_t *)(handle + offset) = bswap32(value); 492225394Sjchandra} 493225394Sjchandra 494225394Sjchandra/* 495225394Sjchandra * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 496225394Sjchandra * provided to bus space described by tag/handle/offset. 497225394Sjchandra */ 498225394Sjchandra 499225394Sjchandra 500225394Sjchandrastatic void 501225394Sjchandrarmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 502225394Sjchandra bus_size_t offset, const u_int8_t * addr, size_t count) 503225394Sjchandra{ 504225394Sjchandra mips_sync(); 505225394Sjchandra while (count--) { 506225394Sjchandra (*(volatile u_int8_t *)(handle + offset)) = *addr; 507225394Sjchandra addr++; 508225394Sjchandra } 509225394Sjchandra} 510225394Sjchandra 511225394Sjchandrastatic void 512225394Sjchandrarmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 513225394Sjchandra bus_size_t offset, const u_int16_t * addr, size_t count) 514225394Sjchandra{ 515225394Sjchandra mips_sync(); 516225394Sjchandra while (count--) { 517225394Sjchandra (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); 518225394Sjchandra addr++; 519225394Sjchandra } 520225394Sjchandra} 521225394Sjchandra 522225394Sjchandrastatic void 523225394Sjchandrarmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 524225394Sjchandra bus_size_t offset, const u_int32_t * addr, size_t count) 525225394Sjchandra{ 526225394Sjchandra mips_sync(); 527225394Sjchandra while (count--) { 528225394Sjchandra (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); 529225394Sjchandra addr++; 530225394Sjchandra } 531225394Sjchandra} 532225394Sjchandra 533225394Sjchandra/* 534225394Sjchandra * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 535225394Sjchandra * by tag/handle starting at `offset'. 536225394Sjchandra */ 537225394Sjchandra 538225394Sjchandrastatic void 539225394Sjchandrarmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 540225394Sjchandra bus_size_t offset, u_int16_t value, size_t count) 541225394Sjchandra{ 542225394Sjchandra bus_addr_t addr = bsh + offset; 543225394Sjchandra 544225394Sjchandra for (; count != 0; count--, addr += 2) 545225394Sjchandra (*(volatile u_int16_t *)(addr)) = value; 546225394Sjchandra} 547225394Sjchandra 548225394Sjchandrastatic void 549225394Sjchandrarmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 550225394Sjchandra bus_size_t offset, u_int32_t value, size_t count) 551225394Sjchandra{ 552225394Sjchandra bus_addr_t addr = bsh + offset; 553225394Sjchandra 554225394Sjchandra for (; count != 0; count--, addr += 4) 555225394Sjchandra (*(volatile u_int32_t *)(addr)) = value; 556225394Sjchandra} 557225394Sjchandra 558225394Sjchandra 559225394Sjchandra/* 560225394Sjchandra * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 561225394Sjchandra * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 562225394Sjchandra */ 563225394Sjchandrastatic void 564225394Sjchandrarmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 565225394Sjchandra bus_size_t off1, bus_space_handle_t bsh2, 566225394Sjchandra bus_size_t off2, size_t count) 567225394Sjchandra{ 568225394Sjchandra TODO(); 569225394Sjchandra} 570225394Sjchandra 571225394Sjchandra/* 572225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space 573225394Sjchandra * described by tag/handle/offset and copy into buffer provided. 574225394Sjchandra */ 575225394Sjchandra 576225394Sjchandrau_int8_t 577225394Sjchandrarmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 578225394Sjchandra bus_size_t offset) 579225394Sjchandra{ 580225394Sjchandra 581225394Sjchandra return *((volatile u_int8_t *)(handle + offset)); 582225394Sjchandra} 583225394Sjchandra 584225394Sjchandra 585225394Sjchandrastatic u_int16_t 586225394Sjchandrarmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 587225394Sjchandra bus_size_t offset) 588225394Sjchandra{ 589225394Sjchandra return *(volatile u_int16_t *)(handle + offset); 590225394Sjchandra} 591225394Sjchandra 592225394Sjchandra 593225394Sjchandrastatic u_int32_t 594225394Sjchandrarmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 595225394Sjchandra bus_size_t offset) 596225394Sjchandra{ 597225394Sjchandra return (*(volatile u_int32_t *)(handle + offset)); 598225394Sjchandra} 599225394Sjchandra 600225394Sjchandra 601225394Sjchandrastatic void 602225394Sjchandrarmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 603225394Sjchandra bus_size_t offset, u_int8_t * addr, size_t count) 604225394Sjchandra{ 605225394Sjchandra while (count--) { 606225394Sjchandra *addr = (*(volatile u_int8_t *)(handle + offset)); 607225394Sjchandra addr++; 608225394Sjchandra } 609225394Sjchandra} 610225394Sjchandra 611225394Sjchandrastatic void 612225394Sjchandrarmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 613225394Sjchandra bus_size_t offset, u_int16_t * addr, size_t count) 614225394Sjchandra{ 615225394Sjchandra while (count--) { 616225394Sjchandra *addr = (*(volatile u_int16_t *)(handle + offset)); 617225394Sjchandra addr++; 618225394Sjchandra } 619225394Sjchandra} 620225394Sjchandra 621225394Sjchandrastatic void 622225394Sjchandrarmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 623225394Sjchandra bus_size_t offset, u_int32_t * addr, size_t count) 624225394Sjchandra{ 625225394Sjchandra while (count--) { 626225394Sjchandra *addr = (*(volatile u_int32_t *)(handle + offset)); 627225394Sjchandra addr++; 628225394Sjchandra } 629225394Sjchandra} 630225394Sjchandra 631225394Sjchandra 632225394Sjchandra 633225394Sjchandra/* 634225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space 635225394Sjchandra * described by tag/handle and starting at `offset' and copy into 636225394Sjchandra * buffer provided. 637225394Sjchandra */ 638225394Sjchandravoid 639225394Sjchandrarmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 640225394Sjchandra bus_size_t offset, u_int8_t * addr, size_t count) 641225394Sjchandra{ 642225394Sjchandra bus_addr_t baddr = bsh + offset; 643225394Sjchandra 644225394Sjchandra while (count--) { 645225394Sjchandra *addr++ = (*(volatile u_int8_t *)(baddr)); 646225394Sjchandra baddr += 1; 647225394Sjchandra } 648225394Sjchandra} 649225394Sjchandra 650225394Sjchandravoid 651225394Sjchandrarmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 652225394Sjchandra bus_size_t offset, u_int16_t * addr, size_t count) 653225394Sjchandra{ 654225394Sjchandra bus_addr_t baddr = bsh + offset; 655225394Sjchandra 656225394Sjchandra while (count--) { 657225394Sjchandra *addr++ = (*(volatile u_int16_t *)(baddr)); 658225394Sjchandra baddr += 2; 659225394Sjchandra } 660225394Sjchandra} 661225394Sjchandra 662225394Sjchandravoid 663225394Sjchandrarmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 664225394Sjchandra bus_size_t offset, u_int32_t * addr, size_t count) 665225394Sjchandra{ 666225394Sjchandra bus_addr_t baddr = bsh + offset; 667225394Sjchandra 668225394Sjchandra while (count--) { 669225394Sjchandra *addr++ = (*(volatile u_int32_t *)(baddr)); 670225394Sjchandra baddr += 4; 671225394Sjchandra } 672225394Sjchandra} 673225394Sjchandra 674225394Sjchandra 675225394Sjchandravoid 676225394Sjchandrarmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 677225394Sjchandra bus_size_t offset, u_int8_t value) 678225394Sjchandra{ 679225394Sjchandra mips_sync(); 680225394Sjchandra *(volatile u_int8_t *)(handle + offset) = value; 681225394Sjchandra} 682225394Sjchandra 683225394Sjchandrastatic void 684225394Sjchandrarmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 685225394Sjchandra bus_size_t offset, u_int16_t value) 686225394Sjchandra{ 687225394Sjchandra mips_sync(); 688225394Sjchandra *(volatile u_int16_t *)(handle + offset) = value; 689225394Sjchandra} 690225394Sjchandra 691225394Sjchandra 692225394Sjchandrastatic void 693225394Sjchandrarmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 694225394Sjchandra bus_size_t offset, u_int32_t value) 695225394Sjchandra{ 696225394Sjchandra mips_sync(); 697225394Sjchandra *(volatile u_int32_t *)(handle + offset) = value; 698225394Sjchandra} 699225394Sjchandra 700225394Sjchandra 701225394Sjchandrastatic void 702225394Sjchandrarmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 703225394Sjchandra bus_size_t offset, const u_int8_t * addr, size_t count) 704225394Sjchandra{ 705225394Sjchandra mips_sync(); 706225394Sjchandra while (count--) { 707225394Sjchandra (*(volatile u_int8_t *)(handle + offset)) = *addr; 708225394Sjchandra addr++; 709225394Sjchandra } 710225394Sjchandra} 711225394Sjchandra 712225394Sjchandrastatic void 713225394Sjchandrarmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 714225394Sjchandra bus_size_t offset, const u_int16_t * addr, size_t count) 715225394Sjchandra{ 716225394Sjchandra mips_sync(); 717225394Sjchandra while (count--) { 718225394Sjchandra (*(volatile u_int16_t *)(handle + offset)) = *addr; 719225394Sjchandra addr++; 720225394Sjchandra } 721225394Sjchandra} 722225394Sjchandra 723225394Sjchandrastatic void 724225394Sjchandrarmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 725225394Sjchandra bus_size_t offset, const u_int32_t * addr, size_t count) 726225394Sjchandra{ 727225394Sjchandra mips_sync(); 728225394Sjchandra while (count--) { 729225394Sjchandra (*(volatile u_int32_t *)(handle + offset)) = *addr; 730225394Sjchandra addr++; 731225394Sjchandra } 732225394Sjchandra} 733225394Sjchandra 734225394Sjchandravoid 735225394Sjchandrarmi_pci_bus_space_write_region_2(void *t, 736225394Sjchandra bus_space_handle_t bsh, 737225394Sjchandra bus_size_t offset, 738225394Sjchandra const u_int16_t * addr, 739225394Sjchandra size_t count) 740225394Sjchandra{ 741225394Sjchandra bus_addr_t baddr = (bus_addr_t) bsh + offset; 742225394Sjchandra 743225394Sjchandra while (count--) { 744225394Sjchandra (*(volatile u_int16_t *)(baddr)) = *addr; 745225394Sjchandra addr++; 746225394Sjchandra baddr += 2; 747225394Sjchandra } 748225394Sjchandra} 749225394Sjchandra 750225394Sjchandravoid 751225394Sjchandrarmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 752225394Sjchandra bus_size_t offset, const u_int32_t * addr, size_t count) 753225394Sjchandra{ 754225394Sjchandra bus_addr_t baddr = bsh + offset; 755225394Sjchandra 756225394Sjchandra while (count--) { 757225394Sjchandra (*(volatile u_int32_t *)(baddr)) = *addr; 758225394Sjchandra addr++; 759225394Sjchandra baddr += 4; 760225394Sjchandra } 761225394Sjchandra} 762225394Sjchandra 763225394Sjchandrastatic void 764225394Sjchandrarmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 765225394Sjchandra bus_size_t offset __unused, bus_size_t len __unused, int flags) 766225394Sjchandra{ 767225394Sjchandra 768225394Sjchandra} 769