bus_space_rmi_pci.c revision 225394
197403Sobrien/*- 297403Sobrien * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights 3169691Skan * reserved. 497403Sobrien * 597403Sobrien * Redistribution and use in source and binary forms, with or without 697403Sobrien * modification, are permitted provided that the following conditions are 797403Sobrien * met: 897403Sobrien * 997403Sobrien * 1. Redistributions of source code must retain the above copyright 1097403Sobrien * notice, this list of conditions and the following disclaimer. 1197403Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1297403Sobrien * notice, this list of conditions and the following disclaimer in 1397403Sobrien * the documentation and/or other materials provided with the 1497403Sobrien * distribution. 1597403Sobrien * 1697403Sobrien * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND 1797403Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1897403Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19169691Skan * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE 2097403Sobrien * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2197403Sobrien * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2297403Sobrien * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2397403Sobrien * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2497403Sobrien * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2597403Sobrien * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2697403Sobrien * THE POSSIBILITY OF SUCH DAMAGE. 2797403Sobrien * 2897403Sobrien * NETLOGIC_BSD */ 2997403Sobrien 3097403Sobrien#include <sys/cdefs.h> 3197403Sobrien__FBSDID("$FreeBSD: head/sys/mips/nlm/bus_space_rmi_pci.c 225394 2011-09-05 10:45:29Z jchandra $"); 32169691Skan 3397403Sobrien#include <sys/param.h> 3497403Sobrien#include <sys/systm.h> 35169691Skan#include <sys/bus.h> 36169691Skan#include <sys/kernel.h> 37132720Skan#include <sys/endian.h> 38132720Skan#include <sys/malloc.h> 3997403Sobrien#include <sys/ktr.h> 4097403Sobrien 4197403Sobrien#include <vm/vm.h> 4297403Sobrien#include <vm/pmap.h> 4397403Sobrien#include <vm/vm_kern.h> 4497403Sobrien#include <vm/vm_extern.h> 4597403Sobrien 4697403Sobrien#include <machine/bus.h> 4797403Sobrien#include <machine/cache.h> 48132720Skan 4997403Sobrienstatic int 50169691Skanrmi_pci_bus_space_map(void *t, bus_addr_t addr, 51169691Skan bus_size_t size, int flags, 52117397Skan bus_space_handle_t * bshp); 53117397Skan 5497403Sobrienstatic void 55117397Skanrmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, 56117397Skan bus_size_t size); 5797403Sobrien 58117397Skanstatic int 59117397Skanrmi_pci_bus_space_subregion(void *t, 6097403Sobrien bus_space_handle_t bsh, 61117397Skan bus_size_t offset, bus_size_t size, 6297403Sobrien bus_space_handle_t * nbshp); 6397403Sobrien 64117397Skanstatic u_int8_t 65117397Skanrmi_pci_bus_space_read_1(void *t, 6697403Sobrien bus_space_handle_t handle, 67117397Skan bus_size_t offset); 68117397Skan 6997403Sobrienstatic u_int16_t 70117397Skanrmi_pci_bus_space_read_2(void *t, 71117397Skan bus_space_handle_t handle, 7297403Sobrien bus_size_t offset); 73117397Skan 74117397Skanstatic u_int32_t 7597403Sobrienrmi_pci_bus_space_read_4(void *t, 76117397Skan bus_space_handle_t handle, 77117397Skan bus_size_t offset); 78117397Skan 79117397Skanstatic void 80117397Skanrmi_pci_bus_space_read_multi_1(void *t, 8197403Sobrien bus_space_handle_t handle, 82117397Skan bus_size_t offset, u_int8_t * addr, 83117397Skan size_t count); 84117397Skan 85117397Skanstatic void 86117397Skanrmi_pci_bus_space_read_multi_2(void *t, 87117397Skan bus_space_handle_t handle, 88117397Skan bus_size_t offset, u_int16_t * addr, 8997403Sobrien size_t count); 90169691Skan 9197403Sobrienstatic void 9297403Sobrienrmi_pci_bus_space_read_multi_4(void *t, 93132720Skan bus_space_handle_t handle, 9497403Sobrien bus_size_t offset, u_int32_t * addr, 95169691Skan size_t count); 96169691Skan 97132720Skanstatic void 98132720Skanrmi_pci_bus_space_read_region_1(void *t, 99132720Skan bus_space_handle_t bsh, 100132720Skan bus_size_t offset, u_int8_t * addr, 101132720Skan size_t count); 102132720Skan 103132720Skanstatic void 104132720Skanrmi_pci_bus_space_read_region_2(void *t, 105132720Skan bus_space_handle_t bsh, 106132720Skan bus_size_t offset, u_int16_t * addr, 107132720Skan size_t count); 108117397Skan 109117397Skanstatic void 110117397Skanrmi_pci_bus_space_read_region_4(void *t, 111117397Skan bus_space_handle_t bsh, 112117397Skan bus_size_t offset, u_int32_t * addr, 113117397Skan size_t count); 114117397Skan 115117397Skanstatic void 116117397Skanrmi_pci_bus_space_write_1(void *t, 117117397Skan bus_space_handle_t handle, 11897403Sobrien bus_size_t offset, u_int8_t value); 119117397Skan 120117397Skanstatic void 121132720Skanrmi_pci_bus_space_write_2(void *t, 12297403Sobrien bus_space_handle_t handle, 123132720Skan bus_size_t offset, u_int16_t value); 124132720Skan 12597403Sobrienstatic void 126132720Skanrmi_pci_bus_space_write_4(void *t, 127132720Skan bus_space_handle_t handle, 12897403Sobrien bus_size_t offset, u_int32_t value); 129132720Skan 130132720Skanstatic void 13197403Sobrienrmi_pci_bus_space_write_multi_1(void *t, 132132720Skan bus_space_handle_t handle, 133132720Skan bus_size_t offset, 13497403Sobrien const u_int8_t * addr, 135132720Skan size_t count); 136132720Skan 13797403Sobrienstatic void 138132720Skanrmi_pci_bus_space_write_multi_2(void *t, 139132720Skan bus_space_handle_t handle, 14097403Sobrien bus_size_t offset, 141132720Skan const u_int16_t * addr, 142132720Skan size_t count); 14397403Sobrien 144132720Skanstatic void 145132720Skanrmi_pci_bus_space_write_multi_4(void *t, 14697403Sobrien bus_space_handle_t handle, 147132720Skan bus_size_t offset, 14897403Sobrien const u_int32_t * addr, 149169691Skan size_t count); 150169691Skan 151117397Skanstatic void 15297403Sobrienrmi_pci_bus_space_write_region_2(void *t, 15397403Sobrien bus_space_handle_t bsh, 154132720Skan bus_size_t offset, 155132720Skan const u_int16_t * addr, 156132720Skan size_t count); 157132720Skan 158169691Skanstatic void 159132720Skanrmi_pci_bus_space_write_region_4(void *t, 160132720Skan bus_space_handle_t bsh, 161132720Skan bus_size_t offset, 16297403Sobrien const u_int32_t * addr, 163132720Skan size_t count); 164132720Skan 165132720Skan 166132720Skanstatic void 167132720Skanrmi_pci_bus_space_set_region_2(void *t, 168132720Skan bus_space_handle_t bsh, 169132720Skan bus_size_t offset, u_int16_t value, 170132720Skan size_t count); 17197403Sobrienstatic void 172132720Skanrmi_pci_bus_space_set_region_4(void *t, 173132720Skan bus_space_handle_t bsh, 174132720Skan bus_size_t offset, u_int32_t value, 175132720Skan size_t count); 176132720Skan 177169691Skanstatic void 178132720Skanrmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 179132720Skan bus_size_t offset __unused, bus_size_t len __unused, int flags); 180132720Skan 18197403Sobrienstatic void 182132720Skanrmi_pci_bus_space_copy_region_2(void *t, 183132720Skan bus_space_handle_t bsh1, 184132720Skan bus_size_t off1, 185132720Skan bus_space_handle_t bsh2, 186132720Skan bus_size_t off2, size_t count); 187169691Skan 188132720Skanu_int8_t 189132720Skanrmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 190132720Skan bus_size_t offset); 19197403Sobrien 192132720Skanstatic u_int16_t 193132720Skanrmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 194132720Skan bus_size_t offset); 195132720Skan 196132720Skanstatic u_int32_t 197169691Skanrmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 198132720Skan bus_size_t offset); 199132720Skanstatic void 200132720Skanrmi_pci_bus_space_read_multi_stream_1(void *t, 20197403Sobrien bus_space_handle_t handle, 202132720Skan bus_size_t offset, u_int8_t * addr, 203132720Skan size_t count); 204132720Skan 205132720Skanstatic void 206132720Skanrmi_pci_bus_space_read_multi_stream_2(void *t, 207169691Skan bus_space_handle_t handle, 208132720Skan bus_size_t offset, u_int16_t * addr, 209132720Skan size_t count); 210132720Skan 21197403Sobrienstatic void 21297403Sobrienrmi_pci_bus_space_read_multi_stream_4(void *t, 21397403Sobrien bus_space_handle_t handle, 214169691Skan bus_size_t offset, u_int32_t * addr, 21597403Sobrien size_t count); 21697403Sobrien 217132720Skanvoid 218132720Skanrmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, 219132720Skan bus_size_t offset, u_int8_t value); 220132720Skanstatic void 221132720Skanrmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 222132720Skan bus_size_t offset, u_int16_t value); 223132720Skan 224132720Skanstatic void 225132720Skanrmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 226132720Skan bus_size_t offset, u_int32_t value); 227132720Skan 228132720Skanstatic void 22997403Sobrienrmi_pci_bus_space_write_multi_stream_1(void *t, 230132720Skan bus_space_handle_t handle, 231132720Skan bus_size_t offset, 232132720Skan const u_int8_t * addr, 233132720Skan size_t count); 234169691Skanstatic void 235169691Skanrmi_pci_bus_space_write_multi_stream_2(void *t, 236132720Skan bus_space_handle_t handle, 237132720Skan bus_size_t offset, 238132720Skan const u_int16_t * addr, 239132720Skan size_t count); 240169691Skan 241132720Skanstatic void 242132720Skanrmi_pci_bus_space_write_multi_stream_4(void *t, 243132720Skan bus_space_handle_t handle, 244132720Skan bus_size_t offset, 245132720Skan const u_int32_t * addr, 246169691Skan size_t count); 247169691Skan 248132720Skan#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) 249132720Skan 250132720Skanstatic struct bus_space local_rmi_pci_bus_space = { 251132720Skan /* cookie */ 25297403Sobrien (void *)0, 253132720Skan 254132720Skan /* mapping/unmapping */ 255132720Skan rmi_pci_bus_space_map, 256132720Skan rmi_pci_bus_space_unmap, 257132720Skan rmi_pci_bus_space_subregion, 258132720Skan 259132720Skan /* allocation/deallocation */ 260132720Skan NULL, 261132720Skan NULL, 262132720Skan 263169691Skan /* barrier */ 264132720Skan rmi_pci_bus_space_barrier, 265132720Skan 266132720Skan /* read (single) */ 267132720Skan rmi_pci_bus_space_read_1, 268132720Skan rmi_pci_bus_space_read_2, 269169691Skan rmi_pci_bus_space_read_4, 270169691Skan NULL, 271132720Skan 272132720Skan /* read multiple */ 273132720Skan rmi_pci_bus_space_read_multi_1, 274132720Skan rmi_pci_bus_space_read_multi_2, 27597403Sobrien rmi_pci_bus_space_read_multi_4, 276132720Skan NULL, 277132720Skan 278132720Skan /* read region */ 279132720Skan rmi_pci_bus_space_read_region_1, 280132720Skan rmi_pci_bus_space_read_region_2, 281132720Skan rmi_pci_bus_space_read_region_4, 282132720Skan NULL, 283132720Skan 284132720Skan /* write (single) */ 285132720Skan rmi_pci_bus_space_write_1, 286132720Skan rmi_pci_bus_space_write_2, 287132720Skan rmi_pci_bus_space_write_4, 288132720Skan NULL, 289169691Skan 290132720Skan /* write multiple */ 291132720Skan rmi_pci_bus_space_write_multi_1, 292132720Skan rmi_pci_bus_space_write_multi_2, 293132720Skan rmi_pci_bus_space_write_multi_4, 294132720Skan NULL, 295132720Skan 296132720Skan /* write region */ 297132720Skan NULL, 298132720Skan rmi_pci_bus_space_write_region_2, 299132720Skan rmi_pci_bus_space_write_region_4, 300132720Skan NULL, 301132720Skan 302132720Skan /* set multiple */ 30397403Sobrien NULL, 304132720Skan NULL, 305132720Skan NULL, 306132720Skan NULL, 307132720Skan 308132720Skan /* set region */ 309132720Skan NULL, 310132720Skan rmi_pci_bus_space_set_region_2, 311132720Skan rmi_pci_bus_space_set_region_4, 312132720Skan NULL, 313132720Skan 314132720Skan /* copy */ 315132720Skan NULL, 31697403Sobrien rmi_pci_bus_space_copy_region_2, 317117397Skan NULL, 318132720Skan NULL, 319132720Skan 320132720Skan /* read (single) stream */ 321132720Skan rmi_pci_bus_space_read_stream_1, 322132720Skan rmi_pci_bus_space_read_stream_2, 323132720Skan rmi_pci_bus_space_read_stream_4, 324132720Skan NULL, 325132720Skan 326132720Skan /* read multiple stream */ 327132720Skan rmi_pci_bus_space_read_multi_stream_1, 328132720Skan rmi_pci_bus_space_read_multi_stream_2, 329132720Skan rmi_pci_bus_space_read_multi_stream_4, 330132720Skan NULL, 33197403Sobrien 33297403Sobrien /* read region stream */ 33397403Sobrien rmi_pci_bus_space_read_region_1, 334132720Skan rmi_pci_bus_space_read_region_2, 335117397Skan rmi_pci_bus_space_read_region_4, 336132720Skan NULL, 337132720Skan 338117397Skan /* write (single) stream */ 339132720Skan rmi_pci_bus_space_write_stream_1, 340132720Skan rmi_pci_bus_space_write_stream_2, 341117397Skan rmi_pci_bus_space_write_stream_4, 342132720Skan NULL, 343132720Skan 344117397Skan /* write multiple stream */ 345117397Skan rmi_pci_bus_space_write_multi_stream_1, 34697403Sobrien rmi_pci_bus_space_write_multi_stream_2, 347132720Skan rmi_pci_bus_space_write_multi_stream_4, 348117397Skan NULL, 349132720Skan 350132720Skan /* write region stream */ 351117397Skan NULL, 352132720Skan rmi_pci_bus_space_write_region_2, 353132720Skan rmi_pci_bus_space_write_region_4, 354117397Skan NULL, 355132720Skan}; 356132720Skan 357117397Skan/* generic bus_space tag */ 358132720Skanbus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; 359132720Skan 360117397Skan/* 361132720Skan * Map a region of device bus space into CPU virtual address space. 362132720Skan */ 363117397Skanstatic int 364132720Skanrmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, 365132720Skan bus_size_t size __unused, int flags __unused, 366117397Skan bus_space_handle_t * bshp) 367132720Skan{ 368132720Skan *bshp = addr; 369117397Skan return (0); 370132720Skan} 371132720Skan 37297403Sobrien/* 373132720Skan * Unmap a region of device bus space. 374132720Skan */ 37597403Sobrienstatic void 376132720Skanrmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, 377132720Skan bus_size_t size __unused) 378117397Skan{ 379132720Skan} 380132720Skan 381117397Skan/* 382132720Skan * Get a new handle for a subregion of an already-mapped area of bus space. 383132720Skan */ 384117397Skan 385132720Skanstatic int 386132720Skanrmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, 387117397Skan bus_size_t offset, bus_size_t size __unused, 388132720Skan bus_space_handle_t * nbshp) 389132720Skan{ 390117397Skan *nbshp = bsh + offset; 391132720Skan return (0); 392132720Skan} 393117397Skan 394132720Skan/* 395132720Skan * Read a 1, 2, 4, or 8 byte quantity from bus space 396117397Skan * described by tag/handle/offset. 397132720Skan */ 398132720Skan 399117397Skanstatic u_int8_t 400132720Skanrmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, 401132720Skan bus_size_t offset) 40297403Sobrien{ 403132720Skan return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); 404132720Skan} 40597403Sobrien 40697403Sobrienstatic u_int16_t 40797403Sobrienrmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, 408169691Skan bus_size_t offset) 40997403Sobrien{ 410169691Skan u_int16_t value; 41197403Sobrien 412169691Skan value = *(volatile u_int16_t *)(handle + offset); 41397403Sobrien return bswap16(value); 414169691Skan} 41597403Sobrien 416169691Skanstatic u_int32_t 41797403Sobrienrmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, 418169691Skan bus_size_t offset) 41997403Sobrien{ 420169691Skan uint32_t value; 42197403Sobrien 422169691Skan value = *(volatile u_int32_t *)(handle + offset); 42397403Sobrien return bswap32(value); 424169691Skan} 42597403Sobrien 426169691Skan/* 42797403Sobrien * Read `count' 1, 2, 4, or 8 byte quantities from bus space 42897403Sobrien * described by tag/handle/offset and copy into buffer provided. 429132720Skan */ 43097403Sobrienstatic void 431132720Skanrmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, 432132720Skan bus_size_t offset, u_int8_t * addr, size_t count) 433132720Skan{ 434132720Skan while (count--) { 435132720Skan *addr = *(volatile u_int8_t *)(handle + offset); 436132720Skan addr++; 437132720Skan } 438132720Skan} 439132720Skan 440132720Skanstatic void 44197403Sobrienrmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, 442132720Skan bus_size_t offset, u_int16_t * addr, size_t count) 443132720Skan{ 44497403Sobrien 44597403Sobrien while (count--) { 446132720Skan *addr = *(volatile u_int16_t *)(handle + offset); 447132720Skan *addr = bswap16(*addr); 448132720Skan addr++; 449132720Skan } 450132720Skan} 451169691Skan 452169691Skanstatic void 453132720Skanrmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, 454132720Skan bus_size_t offset, u_int32_t * addr, size_t count) 455132720Skan{ 456132720Skan 457132720Skan while (count--) { 458132720Skan *addr = *(volatile u_int32_t *)(handle + offset); 459132720Skan *addr = bswap32(*addr); 460132720Skan addr++; 46197403Sobrien } 462132720Skan} 463132720Skan 464132720Skan/* 465132720Skan * Write the 1, 2, 4, or 8 byte value `value' to bus space 466132720Skan * described by tag/handle/offset. 467132720Skan */ 468169691Skan 469132720Skanstatic void 470132720Skanrmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, 471132720Skan bus_size_t offset, u_int8_t value) 472132720Skan{ 473132720Skan mips_sync(); 474132720Skan *(volatile u_int8_t *)(handle + offset) = value; 475132720Skan} 476132720Skan 477132720Skanstatic void 47897403Sobrienrmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, 479132720Skan bus_size_t offset, u_int16_t value) 480132720Skan{ 481132720Skan mips_sync(); 482132720Skan *(volatile u_int16_t *)(handle + offset) = bswap16(value); 483132720Skan} 484132720Skan 485169691Skan 486132720Skanstatic void 487132720Skanrmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, 488132720Skan bus_size_t offset, u_int32_t value) 489132720Skan{ 490169691Skan mips_sync(); 491132720Skan *(volatile u_int32_t *)(handle + offset) = bswap32(value); 492132720Skan} 493132720Skan 494132720Skan/* 495132720Skan * Write `count' 1, 2, 4, or 8 byte quantities from the buffer 496132720Skan * provided to bus space described by tag/handle/offset. 497169691Skan */ 498132720Skan 499132720Skan 500132720Skanstatic void 501132720Skanrmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, 502169691Skan bus_size_t offset, const u_int8_t * addr, size_t count) 503132720Skan{ 504132720Skan mips_sync(); 505132720Skan while (count--) { 506132720Skan (*(volatile u_int8_t *)(handle + offset)) = *addr; 507169691Skan addr++; 508132720Skan } 509132720Skan} 510132720Skan 511132720Skanstatic void 512132720Skanrmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, 51397403Sobrien bus_size_t offset, const u_int16_t * addr, size_t count) 51497403Sobrien{ 515117397Skan mips_sync(); 51697403Sobrien while (count--) { 51797403Sobrien (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); 518117397Skan addr++; 51997403Sobrien } 520117397Skan} 52197403Sobrien 52297403Sobrienstatic void 523117397Skanrmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, 524117397Skan bus_size_t offset, const u_int32_t * addr, size_t count) 525132720Skan{ 526132720Skan mips_sync(); 527169691Skan while (count--) { 528132720Skan (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); 52997403Sobrien addr++; 53097403Sobrien } 531117397Skan} 532117397Skan 533132720Skan/* 534132720Skan * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described 535169691Skan * by tag/handle starting at `offset'. 536132720Skan */ 53797403Sobrien 538169691Skanstatic void 539132720Skanrmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, 540132720Skan bus_size_t offset, u_int16_t value, size_t count) 54197403Sobrien{ 54297403Sobrien bus_addr_t addr = bsh + offset; 54397403Sobrien 54497403Sobrien for (; count != 0; count--, addr += 2) 54597403Sobrien (*(volatile u_int16_t *)(addr)) = value; 54697403Sobrien} 547169691Skan 548169691Skanstatic void 54997403Sobrienrmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, 550117397Skan bus_size_t offset, u_int32_t value, size_t count) 551117397Skan{ 55297403Sobrien bus_addr_t addr = bsh + offset; 55397403Sobrien 554117397Skan for (; count != 0; count--, addr += 4) 555117397Skan (*(volatile u_int32_t *)(addr)) = value; 556169691Skan} 557132720Skan 55897403Sobrien 55997403Sobrien/* 560117397Skan * Copy `count' 1, 2, 4, or 8 byte values from bus space starting 561117397Skan * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. 562169691Skan */ 563132720Skanstatic void 56497403Sobrienrmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, 56597403Sobrien bus_size_t off1, bus_space_handle_t bsh2, 566117397Skan bus_size_t off2, size_t count) 567117397Skan{ 568169691Skan TODO(); 569132720Skan} 570132720Skan 571132720Skan/* 572132720Skan * Read `count' 1, 2, 4, or 8 byte quantities from bus space 57397403Sobrien * described by tag/handle/offset and copy into buffer provided. 57497403Sobrien */ 575117397Skan 576117397Skanu_int8_t 577169691Skanrmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, 578169691Skan bus_size_t offset) 579169691Skan{ 58097403Sobrien 58197403Sobrien return *((volatile u_int8_t *)(handle + offset)); 582117397Skan} 583117397Skan 584169691Skan 585117397Skanstatic u_int16_t 586169691Skanrmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, 587117397Skan bus_size_t offset) 588117397Skan{ 58997403Sobrien return *(volatile u_int16_t *)(handle + offset); 59097403Sobrien} 591117397Skan 592117397Skan 593169691Skanstatic u_int32_t 594169691Skanrmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, 595117397Skan bus_size_t offset) 596169691Skan{ 597117397Skan return (*(volatile u_int32_t *)(handle + offset)); 598117397Skan} 599117397Skan 60097403Sobrien 60197403Sobrienstatic void 602117397Skanrmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, 603117397Skan bus_size_t offset, u_int8_t * addr, size_t count) 604169691Skan{ 605117397Skan while (count--) { 606169691Skan *addr = (*(volatile u_int8_t *)(handle + offset)); 607117397Skan addr++; 608117397Skan } 60997403Sobrien} 61097403Sobrien 611117397Skanstatic void 612117397Skanrmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, 613169691Skan bus_size_t offset, u_int16_t * addr, size_t count) 614117397Skan{ 615169691Skan while (count--) { 616117397Skan *addr = (*(volatile u_int16_t *)(handle + offset)); 617117397Skan addr++; 61897403Sobrien } 61997403Sobrien} 620117397Skan 621117397Skanstatic void 622169691Skanrmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, 623169691Skan bus_size_t offset, u_int32_t * addr, size_t count) 62497403Sobrien{ 62597403Sobrien while (count--) { 626117397Skan *addr = (*(volatile u_int32_t *)(handle + offset)); 627117397Skan addr++; 628117397Skan } 629132720Skan} 630132720Skan 631117397Skan 63297403Sobrien 63397403Sobrien/* 634117397Skan * Read `count' 1, 2, 4, or 8 byte quantities from bus space 635117397Skan * described by tag/handle and starting at `offset' and copy into 636117397Skan * buffer provided. 637132720Skan */ 638132720Skanvoid 63997403Sobrienrmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, 640117397Skan bus_size_t offset, u_int8_t * addr, size_t count) 64197403Sobrien{ 64297403Sobrien bus_addr_t baddr = bsh + offset; 643117397Skan 644117397Skan while (count--) { 645117397Skan *addr++ = (*(volatile u_int8_t *)(baddr)); 646132720Skan baddr += 1; 64797403Sobrien } 648117397Skan} 64997403Sobrien 65097403Sobrienvoid 651117397Skanrmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, 652117397Skan bus_size_t offset, u_int16_t * addr, size_t count) 653117397Skan{ 654132720Skan bus_addr_t baddr = bsh + offset; 655132720Skan 656132720Skan while (count--) { 65797403Sobrien *addr++ = (*(volatile u_int16_t *)(baddr)); 658117397Skan baddr += 2; 65997403Sobrien } 66097403Sobrien} 661117397Skan 662117397Skanvoid 663117397Skanrmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, 664132720Skan bus_size_t offset, u_int32_t * addr, size_t count) 665132720Skan{ 666132720Skan bus_addr_t baddr = bsh + offset; 66797403Sobrien 668117397Skan while (count--) { 66997403Sobrien *addr++ = (*(volatile u_int32_t *)(baddr)); 67097403Sobrien baddr += 4; 671117397Skan } 672117397Skan} 673117397Skan 674132720Skan 675132720Skanvoid 676132720Skanrmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, 67797403Sobrien bus_size_t offset, u_int8_t value) 678117397Skan{ 67997403Sobrien mips_sync(); 68097403Sobrien *(volatile u_int8_t *)(handle + offset) = value; 681117397Skan} 682117397Skan 683117397Skanstatic void 684132720Skanrmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, 685132720Skan bus_size_t offset, u_int16_t value) 686132720Skan{ 68797403Sobrien mips_sync(); 688117397Skan *(volatile u_int16_t *)(handle + offset) = value; 68997403Sobrien} 69097403Sobrien 691117397Skan 692117397Skanstatic void 693117397Skanrmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, 694132720Skan bus_size_t offset, u_int32_t value) 695132720Skan{ 696132720Skan mips_sync(); 697117397Skan *(volatile u_int32_t *)(handle + offset) = value; 69897403Sobrien} 69997403Sobrien 700117397Skan 701117397Skanstatic void 702117397Skanrmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, 70397403Sobrien bus_size_t offset, const u_int8_t * addr, size_t count) 704117397Skan{ 705117397Skan mips_sync(); 70697403Sobrien while (count--) { 70797403Sobrien (*(volatile u_int8_t *)(handle + offset)) = *addr; 708117397Skan addr++; 709117397Skan } 710169691Skan} 71197403Sobrien 71297403Sobrienstatic void 713117397Skanrmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, 714117397Skan bus_size_t offset, const u_int16_t * addr, size_t count) 715117397Skan{ 71697403Sobrien mips_sync(); 71797403Sobrien while (count--) { 718117397Skan (*(volatile u_int16_t *)(handle + offset)) = *addr; 719117397Skan addr++; 72097403Sobrien } 72197403Sobrien} 722117397Skan 723117397Skanstatic void 724117397Skanrmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, 72597403Sobrien bus_size_t offset, const u_int32_t * addr, size_t count) 726117397Skan{ 727117397Skan mips_sync(); 72897403Sobrien while (count--) { 72997403Sobrien (*(volatile u_int32_t *)(handle + offset)) = *addr; 730117397Skan addr++; 731117397Skan } 732117397Skan} 733117397Skan 734117397Skanvoid 73597403Sobrienrmi_pci_bus_space_write_region_2(void *t, 736117397Skan bus_space_handle_t bsh, 737117397Skan bus_size_t offset, 738117397Skan const u_int16_t * addr, 739117397Skan size_t count) 74097403Sobrien{ 74197403Sobrien bus_addr_t baddr = (bus_addr_t) bsh + offset; 742117397Skan 743117397Skan while (count--) { 744117397Skan (*(volatile u_int16_t *)(baddr)) = *addr; 745117397Skan addr++; 746117397Skan baddr += 2; 74797403Sobrien } 748117397Skan} 749117397Skan 750117397Skanvoid 75197403Sobrienrmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, 75297403Sobrien bus_size_t offset, const u_int32_t * addr, size_t count) 753117397Skan{ 754117397Skan bus_addr_t baddr = bsh + offset; 755117397Skan 75697403Sobrien while (count--) { 757117397Skan (*(volatile u_int32_t *)(baddr)) = *addr; 758117397Skan addr++; 75997403Sobrien baddr += 4; 76097403Sobrien } 761117397Skan} 762117397Skan 763117397Skanstatic void 764117397Skanrmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, 765117397Skan bus_size_t offset __unused, bus_size_t len __unused, int flags) 766117397Skan{ 76797403Sobrien 76897403Sobrien} 769117397Skan