1 1.23 thorpej /* $NetBSD: shpcic.c,v 1.23 2023/12/20 15:34:45 thorpej Exp $ */ 2 1.1 itojun 3 1.16 nonaka /*- 4 1.16 nonaka * Copyright (C) 2005 NONAKA Kimihiro <nonaka (at) netbsd.org> 5 1.8 nonaka * All rights reserved. 6 1.1 itojun * 7 1.1 itojun * Redistribution and use in source and binary forms, with or without 8 1.1 itojun * modification, are permitted provided that the following conditions 9 1.1 itojun * are met: 10 1.1 itojun * 1. Redistributions of source code must retain the above copyright 11 1.1 itojun * notice, this list of conditions and the following disclaimer. 12 1.1 itojun * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 itojun * notice, this list of conditions and the following disclaimer in the 14 1.1 itojun * documentation and/or other materials provided with the distribution. 15 1.1 itojun * 16 1.1 itojun * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 itojun * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 itojun * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 itojun * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 itojun * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 itojun * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 itojun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 itojun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 itojun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 itojun * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 itojun */ 27 1.1 itojun 28 1.8 nonaka #include <sys/cdefs.h> 29 1.23 thorpej __KERNEL_RCSID(0, "$NetBSD: shpcic.c,v 1.23 2023/12/20 15:34:45 thorpej Exp $"); 30 1.8 nonaka 31 1.8 nonaka #include "opt_pci.h" 32 1.8 nonaka 33 1.1 itojun #include <sys/param.h> 34 1.1 itojun #include <sys/systm.h> 35 1.8 nonaka #include <sys/kernel.h> 36 1.1 itojun #include <sys/device.h> 37 1.1 itojun 38 1.8 nonaka #include <dev/pci/pcireg.h> 39 1.8 nonaka #include <dev/pci/pcivar.h> 40 1.8 nonaka #include <dev/pci/pciconf.h> 41 1.8 nonaka #include <dev/pci/pcidevs.h> 42 1.8 nonaka 43 1.8 nonaka #include <sh3/bscreg.h> 44 1.8 nonaka #include <sh3/cache.h> 45 1.8 nonaka #include <sh3/exception.h> 46 1.8 nonaka #include <sh3/pcicreg.h> 47 1.1 itojun 48 1.15 dyoung #include <sys/bus.h> 49 1.1 itojun #include <machine/intr.h> 50 1.8 nonaka #include <machine/pci_machdep.h> 51 1.1 itojun 52 1.11 uwe 53 1.11 uwe #if defined(DEBUG) && !defined(SHPCIC_DEBUG) 54 1.11 uwe #define SHPCIC_DEBUG 0 55 1.11 uwe #endif 56 1.8 nonaka #if defined(SHPCIC_DEBUG) 57 1.11 uwe int shpcic_debug = SHPCIC_DEBUG + 0; 58 1.8 nonaka #define DPRINTF(arg) if (shpcic_debug) printf arg 59 1.1 itojun #else 60 1.1 itojun #define DPRINTF(arg) 61 1.1 itojun #endif 62 1.1 itojun 63 1.8 nonaka #define PCI_MODE1_ENABLE 0x80000000UL 64 1.1 itojun 65 1.1 itojun 66 1.12 uwe static int shpcic_match(device_t, cfdata_t, void *); 67 1.11 uwe static void shpcic_attach(device_t, device_t, void *); 68 1.1 itojun 69 1.12 uwe CFATTACH_DECL_NEW(shpcic, 0, 70 1.8 nonaka shpcic_match, shpcic_attach, NULL, NULL); 71 1.1 itojun 72 1.11 uwe 73 1.8 nonaka /* There can be only one. */ 74 1.11 uwe static int shpcic_found = 0; 75 1.1 itojun 76 1.8 nonaka /* PCIC intr priotiry */ 77 1.8 nonaka static int shpcic_intr_priority[2] = { IPL_BIO, IPL_BIO }; 78 1.1 itojun 79 1.1 itojun 80 1.11 uwe static int 81 1.12 uwe shpcic_match(device_t parent, cfdata_t cf, void *aux) 82 1.8 nonaka { 83 1.8 nonaka pcireg_t id; 84 1.1 itojun 85 1.11 uwe if (shpcic_found) 86 1.11 uwe return (0); 87 1.11 uwe 88 1.11 uwe switch (cpu_product) { 89 1.11 uwe case CPU_PRODUCT_7751: 90 1.11 uwe case CPU_PRODUCT_7751R: 91 1.8 nonaka break; 92 1.8 nonaka 93 1.8 nonaka default: 94 1.11 uwe return (0); 95 1.8 nonaka } 96 1.8 nonaka 97 1.1 itojun 98 1.11 uwe id = _reg_read_4(SH4_PCICONF0); 99 1.1 itojun 100 1.11 uwe switch (PCI_VENDOR(id)) { 101 1.11 uwe case PCI_VENDOR_HITACHI: 102 1.11 uwe break; 103 1.1 itojun 104 1.8 nonaka default: 105 1.1 itojun return (0); 106 1.11 uwe } 107 1.11 uwe 108 1.8 nonaka 109 1.11 uwe switch (PCI_PRODUCT(id)) { 110 1.11 uwe case PCI_PRODUCT_HITACHI_SH7751: /* FALLTHROUGH */ 111 1.11 uwe case PCI_PRODUCT_HITACHI_SH7751R: 112 1.8 nonaka break; 113 1.8 nonaka 114 1.11 uwe default: 115 1.8 nonaka return (0); 116 1.11 uwe } 117 1.8 nonaka 118 1.8 nonaka if (_reg_read_2(SH4_BCR2) & BCR2_PORTEN) 119 1.8 nonaka return (0); 120 1.8 nonaka 121 1.1 itojun return (1); 122 1.1 itojun } 123 1.1 itojun 124 1.11 uwe static void 125 1.11 uwe shpcic_attach(device_t parent, device_t self, void *aux) 126 1.8 nonaka { 127 1.8 nonaka struct pcibus_attach_args pba; 128 1.11 uwe pcireg_t id, class; 129 1.11 uwe char devinfo[256]; 130 1.8 nonaka 131 1.8 nonaka shpcic_found = 1; 132 1.8 nonaka 133 1.11 uwe aprint_naive("\n"); 134 1.8 nonaka 135 1.11 uwe id = _reg_read_4(SH4_PCICONF0); 136 1.11 uwe class = _reg_read_4(SH4_PCICONF2); 137 1.11 uwe pci_devinfo(id, class, 1, devinfo, sizeof(devinfo)); 138 1.11 uwe aprint_normal(": %s\n", devinfo); 139 1.8 nonaka 140 1.8 nonaka /* allow PCIC request */ 141 1.8 nonaka _reg_write_4(SH4_BCR1, _reg_read_4(SH4_BCR1) | BCR1_BREQEN); 142 1.8 nonaka 143 1.8 nonaka /* Initialize PCIC */ 144 1.8 nonaka _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_RSTCTL); 145 1.8 nonaka delay(10 * 1000); 146 1.8 nonaka _reg_write_4(SH4_PCICR, PCICR_BASE); 147 1.8 nonaka 148 1.8 nonaka /* Class: Host-Bridge */ 149 1.8 nonaka _reg_write_4(SH4_PCICONF2, 150 1.8 nonaka PCI_CLASS_CODE(PCI_CLASS_BRIDGE, PCI_SUBCLASS_BRIDGE_HOST, 0x00)); 151 1.8 nonaka 152 1.8 nonaka #if !defined(DONT_INIT_PCIBSC) 153 1.8 nonaka #if defined(PCIBCR_BCR1_VAL) 154 1.8 nonaka _reg_write_4(SH4_PCIBCR1, PCIBCR_BCR1_VAL); 155 1.8 nonaka #else 156 1.8 nonaka _reg_write_4(SH4_PCIBCR1, _reg_read_4(SH4_BCR1) | BCR1_MASTER); 157 1.8 nonaka #endif 158 1.8 nonaka #if defined(PCIBCR_BCR2_VAL) 159 1.8 nonaka _reg_write_4(SH4_PCIBCR2, PCIBCR_BCR2_VAL); 160 1.8 nonaka #else 161 1.8 nonaka _reg_write_4(SH4_PCIBCR2, _reg_read_2(SH4_BCR2)); 162 1.8 nonaka #endif 163 1.8 nonaka #if defined(SH4) && defined(SH7751R) 164 1.8 nonaka if (cpu_product == CPU_PRODUCT_7751R) { 165 1.8 nonaka #if defined(PCIBCR_BCR3_VAL) 166 1.8 nonaka _reg_write_4(SH4_PCIBCR3, PCIBCR_BCR3_VAL); 167 1.8 nonaka #else 168 1.8 nonaka _reg_write_4(SH4_PCIBCR3, _reg_read_2(SH4_BCR3)); 169 1.8 nonaka #endif 170 1.8 nonaka } 171 1.8 nonaka #endif /* SH4 && SH7751R && PCIBCR_BCR3_VAL */ 172 1.8 nonaka #if defined(PCIBCR_WCR1_VAL) 173 1.8 nonaka _reg_write_4(SH4_PCIWCR1, PCIBCR_WCR1_VAL); 174 1.8 nonaka #else 175 1.8 nonaka _reg_write_4(SH4_PCIWCR1, _reg_read_4(SH4_WCR1)); 176 1.8 nonaka #endif 177 1.8 nonaka #if defined(PCIBCR_WCR2_VAL) 178 1.8 nonaka _reg_write_4(SH4_PCIWCR2, PCIBCR_WCR2_VAL); 179 1.8 nonaka #else 180 1.8 nonaka _reg_write_4(SH4_PCIWCR2, _reg_read_4(SH4_WCR2)); 181 1.8 nonaka #endif 182 1.8 nonaka #if defined(PCIBCR_WCR3_VAL) 183 1.8 nonaka _reg_write_4(SH4_PCIWCR3, PCIBCR_WCR3_VAL); 184 1.8 nonaka #else 185 1.8 nonaka _reg_write_4(SH4_PCIWCR3, _reg_read_4(SH4_WCR3)); 186 1.8 nonaka #endif 187 1.8 nonaka #if defined(PCIBCR_MCR_VAL) 188 1.8 nonaka _reg_write_4(SH4_PCIMCR, PCIBCR_MCR_VAL); 189 1.8 nonaka #else 190 1.8 nonaka _reg_write_4(SH4_PCIMCR, _reg_read_4(SH4_MCR)); 191 1.8 nonaka #endif 192 1.8 nonaka #endif /* !DONT_INIT_PCIBSC */ 193 1.8 nonaka 194 1.8 nonaka /* set PCI I/O, memory base address */ 195 1.8 nonaka _reg_write_4(SH4_PCIIOBR, SH4_PCIC_IO); 196 1.8 nonaka _reg_write_4(SH4_PCIMBR, SH4_PCIC_MEM); 197 1.8 nonaka 198 1.8 nonaka /* set PCI local address 0 */ 199 1.8 nonaka _reg_write_4(SH4_PCILSR0, (64 - 1) << 20); 200 1.8 nonaka _reg_write_4(SH4_PCILAR0, 0xac000000); 201 1.8 nonaka _reg_write_4(SH4_PCICONF5, 0xac000000); 202 1.8 nonaka 203 1.8 nonaka /* set PCI local address 1 */ 204 1.8 nonaka _reg_write_4(SH4_PCILSR1, (64 - 1) << 20); 205 1.8 nonaka _reg_write_4(SH4_PCILAR1, 0xac000000); 206 1.8 nonaka _reg_write_4(SH4_PCICONF6, 0x8c000000); 207 1.8 nonaka 208 1.8 nonaka /* Enable I/O, memory, bus-master */ 209 1.8 nonaka _reg_write_4(SH4_PCICONF1, PCI_COMMAND_IO_ENABLE 210 1.8 nonaka | PCI_COMMAND_MEM_ENABLE 211 1.8 nonaka | PCI_COMMAND_MASTER_ENABLE 212 1.8 nonaka | PCI_COMMAND_STEPPING_ENABLE 213 1.8 nonaka | PCI_STATUS_DEVSEL_MEDIUM); 214 1.8 nonaka 215 1.8 nonaka /* Initialize done. */ 216 1.8 nonaka _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_CFINIT); 217 1.8 nonaka 218 1.8 nonaka /* set PCI controller interrupt priority */ 219 1.8 nonaka intpri_intr_priority(SH4_INTEVT_PCIERR, shpcic_intr_priority[0]); 220 1.8 nonaka intpri_intr_priority(SH4_INTEVT_PCISERR, shpcic_intr_priority[1]); 221 1.8 nonaka 222 1.8 nonaka /* PCI bus */ 223 1.8 nonaka #ifdef PCI_NETBSD_CONFIGURE 224 1.20 thorpej struct pciconf_resources *pcires = pciconf_resource_init(); 225 1.20 thorpej 226 1.20 thorpej pciconf_resource_add(pcires, PCICONF_RESOURCE_IO, 227 1.20 thorpej SH4_PCIC_IO, SH4_PCIC_IO_SIZE); 228 1.20 thorpej pciconf_resource_add(pcires, PCICONF_RESOURCE_MEM, 229 1.20 thorpej SH4_PCIC_MEM, SH4_PCIC_MEM_SIZE); 230 1.8 nonaka 231 1.20 thorpej pci_configure_bus(NULL, pcires, 0, sh_cache_line_size); 232 1.8 nonaka 233 1.20 thorpej pciconf_resource_fini(pcires); 234 1.8 nonaka #endif 235 1.8 nonaka 236 1.8 nonaka /* PCI bus */ 237 1.8 nonaka memset(&pba, 0, sizeof(pba)); 238 1.8 nonaka pba.pba_iot = shpcic_get_bus_io_tag(); 239 1.8 nonaka pba.pba_memt = shpcic_get_bus_mem_tag(); 240 1.8 nonaka pba.pba_dmat = shpcic_get_bus_dma_tag(); 241 1.8 nonaka pba.pba_dmat64 = NULL; 242 1.8 nonaka pba.pba_pc = NULL; 243 1.8 nonaka pba.pba_bus = 0; 244 1.8 nonaka pba.pba_bridgetag = NULL; 245 1.14 dyoung pba.pba_flags = PCI_FLAGS_IO_OKAY | PCI_FLAGS_MEM_OKAY; 246 1.22 thorpej config_found(self, &pba, NULL, CFARGS_NONE); 247 1.8 nonaka } 248 1.8 nonaka 249 1.1 itojun int 250 1.8 nonaka shpcic_bus_maxdevs(void *v, int busno) 251 1.1 itojun { 252 1.6 uch 253 1.8 nonaka /* 254 1.8 nonaka * Bus number is irrelevant. Configuration Mechanism 1 is in 255 1.8 nonaka * use, can have devices 0-32 (i.e. the `normal' range). 256 1.8 nonaka */ 257 1.8 nonaka return (32); 258 1.1 itojun } 259 1.1 itojun 260 1.8 nonaka pcitag_t 261 1.8 nonaka shpcic_make_tag(void *v, int bus, int device, int function) 262 1.1 itojun { 263 1.8 nonaka pcitag_t tag; 264 1.6 uch 265 1.8 nonaka if (bus >= 256 || device >= 32 || function >= 8) 266 1.8 nonaka panic("pci_make_tag: bad request"); 267 1.8 nonaka 268 1.8 nonaka tag = PCI_MODE1_ENABLE | 269 1.8 nonaka (bus << 16) | (device << 11) | (function << 8); 270 1.1 itojun 271 1.8 nonaka return (tag); 272 1.1 itojun } 273 1.1 itojun 274 1.1 itojun void 275 1.8 nonaka shpcic_decompose_tag(void *v, pcitag_t tag, int *bp, int *dp, int *fp) 276 1.1 itojun { 277 1.1 itojun 278 1.8 nonaka if (bp != NULL) 279 1.8 nonaka *bp = (tag >> 16) & 0xff; 280 1.8 nonaka if (dp != NULL) 281 1.8 nonaka *dp = (tag >> 11) & 0x1f; 282 1.8 nonaka if (fp != NULL) 283 1.8 nonaka *fp = (tag >> 8) & 0x7; 284 1.8 nonaka } 285 1.1 itojun 286 1.8 nonaka pcireg_t 287 1.8 nonaka shpcic_conf_read(void *v, pcitag_t tag, int reg) 288 1.8 nonaka { 289 1.8 nonaka pcireg_t data; 290 1.8 nonaka int s; 291 1.8 nonaka 292 1.18 msaitoh if ((unsigned int)reg >= PCI_CONF_SIZE) 293 1.18 msaitoh return (pcireg_t) -1; 294 1.18 msaitoh 295 1.8 nonaka s = splhigh(); 296 1.8 nonaka _reg_write_4(SH4_PCIPAR, tag | reg); 297 1.8 nonaka data = _reg_read_4(SH4_PCIPDR); 298 1.8 nonaka _reg_write_4(SH4_PCIPAR, 0); 299 1.8 nonaka splx(s); 300 1.8 nonaka 301 1.8 nonaka return data; 302 1.8 nonaka } 303 1.8 nonaka 304 1.8 nonaka void 305 1.8 nonaka shpcic_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data) 306 1.8 nonaka { 307 1.8 nonaka int s; 308 1.1 itojun 309 1.18 msaitoh if ((unsigned int)reg >= PCI_CONF_SIZE) 310 1.18 msaitoh return; 311 1.18 msaitoh 312 1.8 nonaka s = splhigh(); 313 1.8 nonaka _reg_write_4(SH4_PCIPAR, tag | reg); 314 1.8 nonaka _reg_write_4(SH4_PCIPDR, data); 315 1.8 nonaka _reg_write_4(SH4_PCIPAR, 0); 316 1.8 nonaka splx(s); 317 1.8 nonaka } 318 1.1 itojun 319 1.8 nonaka int 320 1.8 nonaka shpcic_set_intr_priority(int intr, int level) 321 1.8 nonaka { 322 1.8 nonaka int evtcode; 323 1.8 nonaka 324 1.8 nonaka if ((intr != 0) && (intr != 1)) { 325 1.8 nonaka return (-1); 326 1.8 nonaka } 327 1.8 nonaka if ((level < IPL_NONE) || (level > IPL_HIGH)) { 328 1.8 nonaka return (-1); 329 1.8 nonaka } 330 1.1 itojun 331 1.8 nonaka if (intr == 0) { 332 1.8 nonaka evtcode = SH4_INTEVT_PCIERR; 333 1.8 nonaka } else { 334 1.8 nonaka evtcode = SH4_INTEVT_PCISERR; 335 1.1 itojun } 336 1.1 itojun 337 1.8 nonaka intpri_intr_priority(evtcode, shpcic_intr_priority[intr]); 338 1.8 nonaka shpcic_intr_priority[intr] = level; 339 1.1 itojun 340 1.8 nonaka return (0); 341 1.8 nonaka } 342 1.1 itojun 343 1.8 nonaka void * 344 1.8 nonaka shpcic_intr_establish(int evtcode, int (*ih_func)(void *), void *ih_arg) 345 1.8 nonaka { 346 1.8 nonaka int level; 347 1.8 nonaka 348 1.8 nonaka switch (evtcode) { 349 1.8 nonaka case SH4_INTEVT_PCISERR: 350 1.8 nonaka level = shpcic_intr_priority[1]; 351 1.8 nonaka break; 352 1.1 itojun 353 1.8 nonaka case SH4_INTEVT_PCIDMA3: 354 1.8 nonaka case SH4_INTEVT_PCIDMA2: 355 1.8 nonaka case SH4_INTEVT_PCIDMA1: 356 1.8 nonaka case SH4_INTEVT_PCIDMA0: 357 1.8 nonaka case SH4_INTEVT_PCIPWON: 358 1.8 nonaka case SH4_INTEVT_PCIPWDWN: 359 1.8 nonaka case SH4_INTEVT_PCIERR: 360 1.8 nonaka level = shpcic_intr_priority[0]; 361 1.8 nonaka break; 362 1.8 nonaka 363 1.8 nonaka default: 364 1.8 nonaka printf("shpcic_intr_establish: unknown evtcode = 0x%08x\n", 365 1.8 nonaka evtcode); 366 1.8 nonaka return NULL; 367 1.1 itojun } 368 1.8 nonaka 369 1.8 nonaka return intc_intr_establish(evtcode, IST_LEVEL, level, ih_func, ih_arg); 370 1.1 itojun } 371 1.1 itojun 372 1.1 itojun void 373 1.8 nonaka shpcic_intr_disestablish(void *ih) 374 1.1 itojun { 375 1.1 itojun 376 1.8 nonaka intc_intr_disestablish(ih); 377 1.1 itojun } 378 1.1 itojun 379 1.8 nonaka /* 380 1.8 nonaka * shpcic bus space 381 1.8 nonaka */ 382 1.8 nonaka int 383 1.8 nonaka shpcic_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, 384 1.8 nonaka int flags, bus_space_handle_t *bshp) 385 1.1 itojun { 386 1.1 itojun 387 1.8 nonaka *bshp = (bus_space_handle_t)bpa; 388 1.1 itojun 389 1.8 nonaka return (0); 390 1.8 nonaka } 391 1.1 itojun 392 1.8 nonaka void 393 1.8 nonaka shpcic_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size) 394 1.8 nonaka { 395 1.1 itojun 396 1.8 nonaka /* Nothing to do */ 397 1.8 nonaka } 398 1.1 itojun 399 1.8 nonaka int 400 1.8 nonaka shpcic_iomem_subregion(void *v, bus_space_handle_t bsh, 401 1.8 nonaka bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) 402 1.8 nonaka { 403 1.1 itojun 404 1.8 nonaka *nbshp = bsh + offset; 405 1.1 itojun 406 1.8 nonaka return (0); 407 1.1 itojun } 408 1.1 itojun 409 1.8 nonaka int 410 1.8 nonaka shpcic_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, 411 1.8 nonaka bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 412 1.8 nonaka bus_addr_t *bpap, bus_space_handle_t *bshp) 413 1.1 itojun { 414 1.1 itojun 415 1.8 nonaka *bshp = *bpap = rstart; 416 1.1 itojun 417 1.8 nonaka return (0); 418 1.1 itojun } 419 1.1 itojun 420 1.1 itojun void 421 1.8 nonaka shpcic_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size) 422 1.1 itojun { 423 1.1 itojun 424 1.8 nonaka /* Nothing to do */ 425 1.8 nonaka } 426 1.8 nonaka 427 1.13 nonaka paddr_t 428 1.13 nonaka shpcic_iomem_mmap(void *v, bus_addr_t addr, off_t off, int prot, int flags) 429 1.13 nonaka { 430 1.13 nonaka 431 1.13 nonaka return (paddr_t)-1; 432 1.13 nonaka } 433 1.13 nonaka 434 1.8 nonaka /* 435 1.8 nonaka * shpcic bus space io/mem read/write 436 1.8 nonaka */ 437 1.8 nonaka /* read */ 438 1.10 perry static inline uint8_t __shpcic_io_read_1(bus_space_handle_t bsh, 439 1.8 nonaka bus_size_t offset); 440 1.10 perry static inline uint16_t __shpcic_io_read_2(bus_space_handle_t bsh, 441 1.8 nonaka bus_size_t offset); 442 1.10 perry static inline uint32_t __shpcic_io_read_4(bus_space_handle_t bsh, 443 1.8 nonaka bus_size_t offset); 444 1.10 perry static inline uint8_t __shpcic_mem_read_1(bus_space_handle_t bsh, 445 1.8 nonaka bus_size_t offset); 446 1.10 perry static inline uint16_t __shpcic_mem_read_2(bus_space_handle_t bsh, 447 1.8 nonaka bus_size_t offset); 448 1.10 perry static inline uint32_t __shpcic_mem_read_4(bus_space_handle_t bsh, 449 1.8 nonaka bus_size_t offset); 450 1.8 nonaka 451 1.10 perry static inline uint8_t 452 1.8 nonaka __shpcic_io_read_1(bus_space_handle_t bsh, bus_size_t offset) 453 1.8 nonaka { 454 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 455 1.1 itojun 456 1.8 nonaka return *(volatile uint8_t *)(SH4_PCIC_IO + adr); 457 1.8 nonaka } 458 1.1 itojun 459 1.10 perry static inline uint16_t 460 1.8 nonaka __shpcic_io_read_2(bus_space_handle_t bsh, bus_size_t offset) 461 1.8 nonaka { 462 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 463 1.1 itojun 464 1.8 nonaka return *(volatile uint16_t *)(SH4_PCIC_IO + adr); 465 1.1 itojun } 466 1.1 itojun 467 1.10 perry static inline uint32_t 468 1.8 nonaka __shpcic_io_read_4(bus_space_handle_t bsh, bus_size_t offset) 469 1.1 itojun { 470 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 471 1.1 itojun 472 1.8 nonaka return *(volatile uint32_t *)(SH4_PCIC_IO + adr); 473 1.8 nonaka } 474 1.1 itojun 475 1.10 perry static inline uint8_t 476 1.8 nonaka __shpcic_mem_read_1(bus_space_handle_t bsh, bus_size_t offset) 477 1.8 nonaka { 478 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 479 1.1 itojun 480 1.8 nonaka return *(volatile uint8_t *)(SH4_PCIC_MEM + adr); 481 1.8 nonaka } 482 1.1 itojun 483 1.10 perry static inline uint16_t 484 1.8 nonaka __shpcic_mem_read_2(bus_space_handle_t bsh, bus_size_t offset) 485 1.8 nonaka { 486 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 487 1.1 itojun 488 1.8 nonaka return *(volatile uint16_t *)(SH4_PCIC_MEM + adr); 489 1.1 itojun } 490 1.1 itojun 491 1.10 perry static inline uint32_t 492 1.8 nonaka __shpcic_mem_read_4(bus_space_handle_t bsh, bus_size_t offset) 493 1.1 itojun { 494 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 495 1.1 itojun 496 1.8 nonaka return *(volatile uint32_t *)(SH4_PCIC_MEM + adr); 497 1.8 nonaka } 498 1.1 itojun 499 1.8 nonaka /* 500 1.8 nonaka * read single 501 1.8 nonaka */ 502 1.8 nonaka uint8_t 503 1.8 nonaka shpcic_io_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset) 504 1.8 nonaka { 505 1.8 nonaka uint8_t value; 506 1.1 itojun 507 1.8 nonaka value = __shpcic_io_read_1(bsh, offset); 508 1.1 itojun 509 1.8 nonaka return value; 510 1.8 nonaka } 511 1.1 itojun 512 1.8 nonaka uint16_t 513 1.8 nonaka shpcic_io_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset) 514 1.8 nonaka { 515 1.8 nonaka uint16_t value; 516 1.1 itojun 517 1.8 nonaka value = __shpcic_io_read_2(bsh, offset); 518 1.1 itojun 519 1.8 nonaka return value; 520 1.1 itojun } 521 1.1 itojun 522 1.8 nonaka uint32_t 523 1.8 nonaka shpcic_io_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset) 524 1.1 itojun { 525 1.8 nonaka uint32_t value; 526 1.1 itojun 527 1.8 nonaka value = __shpcic_io_read_4(bsh, offset); 528 1.1 itojun 529 1.8 nonaka return value; 530 1.1 itojun } 531 1.1 itojun 532 1.8 nonaka uint8_t 533 1.8 nonaka shpcic_mem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset) 534 1.1 itojun { 535 1.8 nonaka uint8_t value; 536 1.8 nonaka 537 1.8 nonaka value = __shpcic_mem_read_1(bsh, offset); 538 1.1 itojun 539 1.8 nonaka return value; 540 1.8 nonaka } 541 1.8 nonaka 542 1.8 nonaka uint16_t 543 1.8 nonaka shpcic_mem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset) 544 1.8 nonaka { 545 1.8 nonaka uint16_t value; 546 1.1 itojun 547 1.8 nonaka value = __shpcic_mem_read_2(bsh, offset); 548 1.1 itojun 549 1.8 nonaka return value; 550 1.1 itojun } 551 1.1 itojun 552 1.8 nonaka uint32_t 553 1.8 nonaka shpcic_mem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset) 554 1.1 itojun { 555 1.8 nonaka uint32_t value; 556 1.1 itojun 557 1.8 nonaka value = __shpcic_mem_read_4(bsh, offset); 558 1.1 itojun 559 1.8 nonaka return value; 560 1.8 nonaka } 561 1.8 nonaka 562 1.8 nonaka /* 563 1.8 nonaka * read multi 564 1.8 nonaka */ 565 1.8 nonaka void 566 1.8 nonaka shpcic_io_read_multi_1(void *v, bus_space_handle_t bsh, 567 1.8 nonaka bus_size_t offset, uint8_t *addr, bus_size_t count) 568 1.8 nonaka { 569 1.8 nonaka 570 1.8 nonaka while (count--) { 571 1.8 nonaka *addr++ = __shpcic_io_read_1(bsh, offset); 572 1.1 itojun } 573 1.8 nonaka } 574 1.8 nonaka 575 1.8 nonaka void 576 1.8 nonaka shpcic_io_read_multi_2(void *v, bus_space_handle_t bsh, 577 1.8 nonaka bus_size_t offset, uint16_t *addr, bus_size_t count) 578 1.8 nonaka { 579 1.8 nonaka 580 1.8 nonaka while (count--) { 581 1.8 nonaka *addr++ = __shpcic_io_read_2(bsh, offset); 582 1.1 itojun } 583 1.8 nonaka } 584 1.8 nonaka 585 1.8 nonaka void 586 1.8 nonaka shpcic_io_read_multi_4(void *v, bus_space_handle_t bsh, 587 1.8 nonaka bus_size_t offset, uint32_t *addr, bus_size_t count) 588 1.8 nonaka { 589 1.8 nonaka 590 1.8 nonaka while (count--) { 591 1.8 nonaka *addr++ = __shpcic_io_read_4(bsh, offset); 592 1.1 itojun } 593 1.8 nonaka } 594 1.8 nonaka 595 1.8 nonaka void 596 1.8 nonaka shpcic_mem_read_multi_1(void *v, bus_space_handle_t bsh, 597 1.8 nonaka bus_size_t offset, uint8_t *addr, bus_size_t count) 598 1.8 nonaka { 599 1.8 nonaka 600 1.8 nonaka while (count--) { 601 1.8 nonaka *addr++ = __shpcic_mem_read_1(bsh, offset); 602 1.1 itojun } 603 1.1 itojun } 604 1.1 itojun 605 1.1 itojun void 606 1.8 nonaka shpcic_mem_read_multi_2(void *v, bus_space_handle_t bsh, 607 1.8 nonaka bus_size_t offset, uint16_t *addr, bus_size_t count) 608 1.1 itojun { 609 1.1 itojun 610 1.8 nonaka while (count--) { 611 1.8 nonaka *addr++ = __shpcic_mem_read_2(bsh, offset); 612 1.8 nonaka } 613 1.1 itojun } 614 1.1 itojun 615 1.1 itojun void 616 1.8 nonaka shpcic_mem_read_multi_4(void *v, bus_space_handle_t bsh, 617 1.8 nonaka bus_size_t offset, uint32_t *addr, bus_size_t count) 618 1.1 itojun { 619 1.1 itojun 620 1.8 nonaka while (count--) { 621 1.8 nonaka *addr++ = __shpcic_mem_read_4(bsh, offset); 622 1.1 itojun } 623 1.1 itojun } 624 1.1 itojun 625 1.8 nonaka /* 626 1.8 nonaka * 627 1.8 nonaka * read region 628 1.8 nonaka */ 629 1.1 itojun void 630 1.8 nonaka shpcic_io_read_region_1(void *v, bus_space_handle_t bsh, 631 1.8 nonaka bus_size_t offset, uint8_t *addr, bus_size_t count) 632 1.1 itojun { 633 1.1 itojun 634 1.8 nonaka while (count--) { 635 1.8 nonaka *addr++ = __shpcic_io_read_1(bsh, offset); 636 1.8 nonaka offset += 1; 637 1.1 itojun } 638 1.1 itojun } 639 1.1 itojun 640 1.1 itojun void 641 1.8 nonaka shpcic_io_read_region_2(void *v, bus_space_handle_t bsh, 642 1.8 nonaka bus_size_t offset, uint16_t *addr, bus_size_t count) 643 1.1 itojun { 644 1.1 itojun 645 1.8 nonaka while (count--) { 646 1.8 nonaka *addr++ = __shpcic_io_read_2(bsh, offset); 647 1.8 nonaka offset += 2; 648 1.8 nonaka } 649 1.8 nonaka } 650 1.1 itojun 651 1.8 nonaka void 652 1.8 nonaka shpcic_io_read_region_4(void *v, bus_space_handle_t bsh, 653 1.8 nonaka bus_size_t offset, uint32_t *addr, bus_size_t count) 654 1.8 nonaka { 655 1.1 itojun 656 1.8 nonaka while (count--) { 657 1.8 nonaka *addr++ = __shpcic_io_read_4(bsh, offset); 658 1.8 nonaka offset += 4; 659 1.8 nonaka } 660 1.1 itojun } 661 1.1 itojun 662 1.8 nonaka void 663 1.8 nonaka shpcic_mem_read_region_1(void *v, bus_space_handle_t bsh, 664 1.8 nonaka bus_size_t offset, uint8_t *addr, bus_size_t count) 665 1.1 itojun { 666 1.8 nonaka 667 1.8 nonaka while (count--) { 668 1.8 nonaka *addr++ = __shpcic_mem_read_1(bsh, offset); 669 1.8 nonaka offset += 1; 670 1.1 itojun } 671 1.1 itojun } 672 1.1 itojun 673 1.1 itojun void 674 1.8 nonaka shpcic_mem_read_region_2(void *v, bus_space_handle_t bsh, 675 1.8 nonaka bus_size_t offset, uint16_t *addr, bus_size_t count) 676 1.1 itojun { 677 1.1 itojun 678 1.8 nonaka while (count--) { 679 1.8 nonaka *addr++ = __shpcic_mem_read_2(bsh, offset); 680 1.8 nonaka offset += 2; 681 1.8 nonaka } 682 1.1 itojun } 683 1.1 itojun 684 1.8 nonaka void 685 1.8 nonaka shpcic_mem_read_region_4(void *v, bus_space_handle_t bsh, 686 1.8 nonaka bus_size_t offset, uint32_t *addr, bus_size_t count) 687 1.8 nonaka { 688 1.8 nonaka 689 1.8 nonaka while (count--) { 690 1.8 nonaka *addr++ = __shpcic_mem_read_4(bsh, offset); 691 1.8 nonaka offset += 4; 692 1.1 itojun } 693 1.8 nonaka } 694 1.1 itojun 695 1.8 nonaka /* write */ 696 1.10 perry static inline void __shpcic_io_write_1(bus_space_handle_t bsh, 697 1.8 nonaka bus_size_t offset, uint8_t value); 698 1.10 perry static inline void __shpcic_io_write_2(bus_space_handle_t bsh, 699 1.8 nonaka bus_size_t offset, uint16_t value); 700 1.10 perry static inline void __shpcic_io_write_4(bus_space_handle_t bsh, 701 1.8 nonaka bus_size_t offset, uint32_t value); 702 1.10 perry static inline void __shpcic_mem_write_1(bus_space_handle_t bsh, 703 1.8 nonaka bus_size_t offset, uint8_t value); 704 1.10 perry static inline void __shpcic_mem_write_2(bus_space_handle_t bsh, 705 1.8 nonaka bus_size_t offset, uint16_t value); 706 1.10 perry static inline void __shpcic_mem_write_4(bus_space_handle_t bsh, 707 1.8 nonaka bus_size_t offset, uint32_t value); 708 1.1 itojun 709 1.10 perry static inline void 710 1.8 nonaka __shpcic_io_write_1(bus_space_handle_t bsh, bus_size_t offset, 711 1.8 nonaka uint8_t value) 712 1.8 nonaka { 713 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 714 1.1 itojun 715 1.8 nonaka *(volatile uint8_t *)(SH4_PCIC_IO + adr) = value; 716 1.8 nonaka } 717 1.1 itojun 718 1.10 perry static inline void 719 1.8 nonaka __shpcic_io_write_2(bus_space_handle_t bsh, bus_size_t offset, 720 1.8 nonaka uint16_t value) 721 1.8 nonaka { 722 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 723 1.1 itojun 724 1.8 nonaka *(volatile uint16_t *)(SH4_PCIC_IO + adr) = value; 725 1.8 nonaka } 726 1.1 itojun 727 1.10 perry static inline void 728 1.8 nonaka __shpcic_io_write_4(bus_space_handle_t bsh, bus_size_t offset, 729 1.8 nonaka uint32_t value) 730 1.8 nonaka { 731 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 732 1.1 itojun 733 1.8 nonaka *(volatile uint32_t *)(SH4_PCIC_IO + adr) = value; 734 1.8 nonaka } 735 1.1 itojun 736 1.10 perry static inline void 737 1.8 nonaka __shpcic_mem_write_1(bus_space_handle_t bsh, bus_size_t offset, 738 1.8 nonaka uint8_t value) 739 1.8 nonaka { 740 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 741 1.1 itojun 742 1.8 nonaka *(volatile uint8_t *)(SH4_PCIC_MEM + adr) = value; 743 1.8 nonaka } 744 1.1 itojun 745 1.10 perry static inline void 746 1.8 nonaka __shpcic_mem_write_2(bus_space_handle_t bsh, bus_size_t offset, 747 1.8 nonaka uint16_t value) 748 1.8 nonaka { 749 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 750 1.1 itojun 751 1.8 nonaka *(volatile uint16_t *)(SH4_PCIC_MEM + adr) = value; 752 1.8 nonaka } 753 1.1 itojun 754 1.10 perry static inline void 755 1.8 nonaka __shpcic_mem_write_4(bus_space_handle_t bsh, bus_size_t offset, 756 1.8 nonaka uint32_t value) 757 1.8 nonaka { 758 1.8 nonaka u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 759 1.1 itojun 760 1.8 nonaka *(volatile uint32_t *)(SH4_PCIC_MEM + adr) = value; 761 1.1 itojun } 762 1.1 itojun 763 1.8 nonaka /* 764 1.8 nonaka * write single 765 1.8 nonaka */ 766 1.1 itojun void 767 1.8 nonaka shpcic_io_write_1(void *v, bus_space_handle_t bsh, 768 1.8 nonaka bus_size_t offset, uint8_t value) 769 1.1 itojun { 770 1.1 itojun 771 1.8 nonaka __shpcic_io_write_1(bsh, offset, value); 772 1.8 nonaka } 773 1.1 itojun 774 1.8 nonaka void 775 1.8 nonaka shpcic_io_write_2(void *v, bus_space_handle_t bsh, 776 1.8 nonaka bus_size_t offset, uint16_t value) 777 1.8 nonaka { 778 1.8 nonaka 779 1.8 nonaka __shpcic_io_write_2(bsh, offset, value); 780 1.1 itojun } 781 1.1 itojun 782 1.8 nonaka void 783 1.8 nonaka shpcic_io_write_4(void *v, bus_space_handle_t bsh, 784 1.8 nonaka bus_size_t offset, uint32_t value) 785 1.1 itojun { 786 1.1 itojun 787 1.8 nonaka __shpcic_io_write_4(bsh, offset, value); 788 1.8 nonaka } 789 1.1 itojun 790 1.8 nonaka void 791 1.8 nonaka shpcic_mem_write_1(void *v, bus_space_handle_t bsh, 792 1.8 nonaka bus_size_t offset, uint8_t value) 793 1.8 nonaka { 794 1.1 itojun 795 1.8 nonaka __shpcic_mem_write_1(bsh, offset, value); 796 1.8 nonaka } 797 1.1 itojun 798 1.8 nonaka void 799 1.8 nonaka shpcic_mem_write_2(void *v, bus_space_handle_t bsh, 800 1.8 nonaka bus_size_t offset, uint16_t value) 801 1.8 nonaka { 802 1.1 itojun 803 1.8 nonaka __shpcic_mem_write_2(bsh, offset, value); 804 1.1 itojun } 805 1.1 itojun 806 1.1 itojun void 807 1.8 nonaka shpcic_mem_write_4(void *v, bus_space_handle_t bsh, 808 1.8 nonaka bus_size_t offset, uint32_t value) 809 1.1 itojun { 810 1.8 nonaka 811 1.8 nonaka __shpcic_mem_write_4(bsh, offset, value); 812 1.1 itojun } 813 1.1 itojun 814 1.8 nonaka /* 815 1.8 nonaka * write multi 816 1.8 nonaka */ 817 1.8 nonaka void 818 1.8 nonaka shpcic_io_write_multi_1(void *v, bus_space_handle_t bsh, 819 1.8 nonaka bus_size_t offset, const uint8_t *addr, bus_size_t count) 820 1.1 itojun { 821 1.1 itojun 822 1.8 nonaka while (count--) { 823 1.8 nonaka __shpcic_io_write_1(bsh, offset, *addr++); 824 1.8 nonaka } 825 1.8 nonaka } 826 1.1 itojun 827 1.8 nonaka void 828 1.8 nonaka shpcic_io_write_multi_2(void *v, bus_space_handle_t bsh, 829 1.8 nonaka bus_size_t offset, const uint16_t *addr, bus_size_t count) 830 1.8 nonaka { 831 1.1 itojun 832 1.8 nonaka while (count--) { 833 1.8 nonaka __shpcic_io_write_2(bsh, offset, *addr++); 834 1.1 itojun } 835 1.8 nonaka } 836 1.1 itojun 837 1.8 nonaka void 838 1.8 nonaka shpcic_io_write_multi_4(void *v, bus_space_handle_t bsh, 839 1.8 nonaka bus_size_t offset, const uint32_t *addr, bus_size_t count) 840 1.8 nonaka { 841 1.1 itojun 842 1.8 nonaka while (count--) { 843 1.8 nonaka __shpcic_io_write_4(bsh, offset, *addr++); 844 1.8 nonaka } 845 1.8 nonaka } 846 1.1 itojun 847 1.8 nonaka void 848 1.8 nonaka shpcic_mem_write_multi_1(void *v, bus_space_handle_t bsh, 849 1.8 nonaka bus_size_t offset, const uint8_t *addr, bus_size_t count) 850 1.8 nonaka { 851 1.1 itojun 852 1.8 nonaka while (count--) { 853 1.8 nonaka __shpcic_mem_write_1(bsh, offset, *addr++); 854 1.8 nonaka } 855 1.8 nonaka } 856 1.1 itojun 857 1.8 nonaka void 858 1.8 nonaka shpcic_mem_write_multi_2(void *v, bus_space_handle_t bsh, 859 1.8 nonaka bus_size_t offset, const uint16_t *addr, bus_size_t count) 860 1.8 nonaka { 861 1.1 itojun 862 1.8 nonaka while (count--) { 863 1.8 nonaka __shpcic_mem_write_2(bsh, offset, *addr++); 864 1.8 nonaka } 865 1.8 nonaka } 866 1.1 itojun 867 1.8 nonaka void 868 1.8 nonaka shpcic_mem_write_multi_4(void *v, bus_space_handle_t bsh, 869 1.8 nonaka bus_size_t offset, const uint32_t *addr, bus_size_t count) 870 1.8 nonaka { 871 1.1 itojun 872 1.8 nonaka while (count--) { 873 1.8 nonaka __shpcic_mem_write_4(bsh, offset, *addr++); 874 1.8 nonaka } 875 1.8 nonaka } 876 1.1 itojun 877 1.8 nonaka /* 878 1.8 nonaka * write region 879 1.8 nonaka */ 880 1.8 nonaka void 881 1.8 nonaka shpcic_io_write_region_1(void *v, bus_space_handle_t bsh, 882 1.8 nonaka bus_size_t offset, const uint8_t *addr, bus_size_t count) 883 1.8 nonaka { 884 1.1 itojun 885 1.8 nonaka while (count--) { 886 1.8 nonaka __shpcic_io_write_1(bsh, offset, *addr++); 887 1.8 nonaka offset += 1; 888 1.1 itojun } 889 1.8 nonaka } 890 1.1 itojun 891 1.8 nonaka void 892 1.8 nonaka shpcic_io_write_region_2(void *v, bus_space_handle_t bsh, 893 1.8 nonaka bus_size_t offset, const uint16_t *addr, bus_size_t count) 894 1.8 nonaka { 895 1.1 itojun 896 1.8 nonaka while (count--) { 897 1.8 nonaka __shpcic_io_write_2(bsh, offset, *addr++); 898 1.8 nonaka offset += 2; 899 1.8 nonaka } 900 1.1 itojun } 901 1.1 itojun 902 1.1 itojun void 903 1.8 nonaka shpcic_io_write_region_4(void *v, bus_space_handle_t bsh, 904 1.8 nonaka bus_size_t offset, const uint32_t *addr, bus_size_t count) 905 1.1 itojun { 906 1.1 itojun 907 1.8 nonaka while (count--) { 908 1.8 nonaka __shpcic_io_write_4(bsh, offset, *addr++); 909 1.8 nonaka offset += 4; 910 1.8 nonaka } 911 1.8 nonaka } 912 1.1 itojun 913 1.8 nonaka void 914 1.8 nonaka shpcic_mem_write_region_1(void *v, bus_space_handle_t bsh, 915 1.8 nonaka bus_size_t offset, const uint8_t *addr, bus_size_t count) 916 1.8 nonaka { 917 1.8 nonaka 918 1.8 nonaka while (count--) { 919 1.8 nonaka __shpcic_mem_write_1(bsh, offset, *addr++); 920 1.8 nonaka offset += 1; 921 1.8 nonaka } 922 1.1 itojun } 923 1.1 itojun 924 1.8 nonaka void 925 1.8 nonaka shpcic_mem_write_region_2(void *v, bus_space_handle_t bsh, 926 1.8 nonaka bus_size_t offset, const uint16_t *addr, bus_size_t count) 927 1.1 itojun { 928 1.1 itojun 929 1.8 nonaka while (count--) { 930 1.8 nonaka __shpcic_mem_write_2(bsh, offset, *addr++); 931 1.8 nonaka offset += 2; 932 1.1 itojun } 933 1.8 nonaka } 934 1.1 itojun 935 1.8 nonaka void 936 1.8 nonaka shpcic_mem_write_region_4(void *v, bus_space_handle_t bsh, 937 1.8 nonaka bus_size_t offset, const uint32_t *addr, bus_size_t count) 938 1.8 nonaka { 939 1.8 nonaka 940 1.8 nonaka while (count--) { 941 1.8 nonaka __shpcic_mem_write_4(bsh, offset, *addr++); 942 1.8 nonaka offset += 4; 943 1.8 nonaka } 944 1.1 itojun } 945 1.1 itojun 946 1.8 nonaka /* 947 1.8 nonaka * set multi 948 1.8 nonaka */ 949 1.1 itojun void 950 1.8 nonaka shpcic_io_set_multi_1(void *v, bus_space_handle_t bsh, 951 1.8 nonaka bus_size_t offset, uint8_t value, bus_size_t count) 952 1.1 itojun { 953 1.1 itojun 954 1.8 nonaka while (count--) { 955 1.8 nonaka __shpcic_io_write_1(bsh, offset, value); 956 1.8 nonaka } 957 1.8 nonaka } 958 1.1 itojun 959 1.8 nonaka void 960 1.8 nonaka shpcic_io_set_multi_2(void *v, bus_space_handle_t bsh, 961 1.8 nonaka bus_size_t offset, uint16_t value, bus_size_t count) 962 1.8 nonaka { 963 1.1 itojun 964 1.8 nonaka while (count--) { 965 1.8 nonaka __shpcic_io_write_2(bsh, offset, value); 966 1.8 nonaka } 967 1.8 nonaka } 968 1.1 itojun 969 1.8 nonaka void 970 1.8 nonaka shpcic_io_set_multi_4(void *v, bus_space_handle_t bsh, 971 1.8 nonaka bus_size_t offset, uint32_t value, bus_size_t count) 972 1.8 nonaka { 973 1.1 itojun 974 1.8 nonaka while (count--) { 975 1.8 nonaka __shpcic_io_write_4(bsh, offset, value); 976 1.8 nonaka } 977 1.8 nonaka } 978 1.1 itojun 979 1.8 nonaka void 980 1.8 nonaka shpcic_mem_set_multi_1(void *v, bus_space_handle_t bsh, 981 1.8 nonaka bus_size_t offset, uint8_t value, bus_size_t count) 982 1.8 nonaka { 983 1.1 itojun 984 1.8 nonaka while (count--) { 985 1.8 nonaka __shpcic_mem_write_1(bsh, offset, value); 986 1.8 nonaka } 987 1.8 nonaka } 988 1.1 itojun 989 1.8 nonaka void 990 1.8 nonaka shpcic_mem_set_multi_2(void *v, bus_space_handle_t bsh, 991 1.8 nonaka bus_size_t offset, uint16_t value, bus_size_t count) 992 1.8 nonaka { 993 1.1 itojun 994 1.8 nonaka while (count--) { 995 1.8 nonaka __shpcic_mem_write_2(bsh, offset, value); 996 1.8 nonaka } 997 1.8 nonaka } 998 1.1 itojun 999 1.8 nonaka void 1000 1.8 nonaka shpcic_mem_set_multi_4(void *v, bus_space_handle_t bsh, 1001 1.8 nonaka bus_size_t offset, uint32_t value, bus_size_t count) 1002 1.8 nonaka { 1003 1.1 itojun 1004 1.8 nonaka while (count--) { 1005 1.8 nonaka __shpcic_mem_write_4(bsh, offset, value); 1006 1.8 nonaka } 1007 1.8 nonaka } 1008 1.1 itojun 1009 1.8 nonaka /* 1010 1.8 nonaka * set region 1011 1.8 nonaka */ 1012 1.8 nonaka void 1013 1.8 nonaka shpcic_io_set_region_1(void *v, bus_space_handle_t bsh, 1014 1.8 nonaka bus_size_t offset, uint8_t value, bus_size_t count) 1015 1.8 nonaka { 1016 1.1 itojun 1017 1.8 nonaka while (count--) { 1018 1.8 nonaka __shpcic_io_write_1(bsh, offset, value); 1019 1.8 nonaka offset += 1; 1020 1.8 nonaka } 1021 1.8 nonaka } 1022 1.1 itojun 1023 1.8 nonaka void 1024 1.8 nonaka shpcic_io_set_region_2(void *v, bus_space_handle_t bsh, 1025 1.8 nonaka bus_size_t offset, uint16_t value, bus_size_t count) 1026 1.8 nonaka { 1027 1.1 itojun 1028 1.8 nonaka while (count--) { 1029 1.8 nonaka __shpcic_io_write_2(bsh, offset, value); 1030 1.8 nonaka offset += 2; 1031 1.1 itojun } 1032 1.8 nonaka } 1033 1.1 itojun 1034 1.8 nonaka void 1035 1.8 nonaka shpcic_io_set_region_4(void *v, bus_space_handle_t bsh, 1036 1.8 nonaka bus_size_t offset, uint32_t value, bus_size_t count) 1037 1.8 nonaka { 1038 1.1 itojun 1039 1.8 nonaka while (count--) { 1040 1.8 nonaka __shpcic_io_write_4(bsh, offset, value); 1041 1.8 nonaka offset += 4; 1042 1.8 nonaka } 1043 1.8 nonaka } 1044 1.1 itojun 1045 1.8 nonaka void 1046 1.8 nonaka shpcic_mem_set_region_1(void *v, bus_space_handle_t bsh, 1047 1.8 nonaka bus_size_t offset, uint8_t value, bus_size_t count) 1048 1.8 nonaka { 1049 1.1 itojun 1050 1.8 nonaka while (count--) { 1051 1.8 nonaka __shpcic_mem_write_1(bsh, offset, value); 1052 1.8 nonaka offset += 1; 1053 1.8 nonaka } 1054 1.8 nonaka } 1055 1.1 itojun 1056 1.8 nonaka void 1057 1.8 nonaka shpcic_mem_set_region_2(void *v, bus_space_handle_t bsh, 1058 1.8 nonaka bus_size_t offset, uint16_t value, bus_size_t count) 1059 1.8 nonaka { 1060 1.1 itojun 1061 1.8 nonaka while (count--) { 1062 1.8 nonaka __shpcic_mem_write_2(bsh, offset, value); 1063 1.8 nonaka offset += 2; 1064 1.8 nonaka } 1065 1.8 nonaka } 1066 1.1 itojun 1067 1.8 nonaka void 1068 1.8 nonaka shpcic_mem_set_region_4(void *v, bus_space_handle_t bsh, 1069 1.8 nonaka bus_size_t offset, uint32_t value, bus_size_t count) 1070 1.8 nonaka { 1071 1.1 itojun 1072 1.8 nonaka while (count--) { 1073 1.8 nonaka __shpcic_mem_write_4(bsh, offset, value); 1074 1.8 nonaka offset += 4; 1075 1.8 nonaka } 1076 1.8 nonaka } 1077 1.1 itojun 1078 1.8 nonaka /* 1079 1.8 nonaka * copy region 1080 1.8 nonaka */ 1081 1.8 nonaka void 1082 1.8 nonaka shpcic_io_copy_region_1(void *v, bus_space_handle_t bsh1, 1083 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1084 1.8 nonaka { 1085 1.8 nonaka u_long addr1 = bsh1 + off1; 1086 1.8 nonaka u_long addr2 = bsh2 + off2; 1087 1.8 nonaka uint8_t value; 1088 1.8 nonaka 1089 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1090 1.8 nonaka while (count--) { 1091 1.8 nonaka value = __shpcic_io_read_1(bsh1, off1); 1092 1.8 nonaka __shpcic_io_write_1(bsh2, off2, value); 1093 1.8 nonaka off1 += 1; 1094 1.8 nonaka off2 += 1; 1095 1.8 nonaka } 1096 1.8 nonaka } else { /* dest after src: copy backwards */ 1097 1.8 nonaka off1 += (count - 1) * 1; 1098 1.8 nonaka off2 += (count - 1) * 1; 1099 1.8 nonaka while (count--) { 1100 1.8 nonaka value = __shpcic_io_read_1(bsh1, off1); 1101 1.8 nonaka __shpcic_io_write_1(bsh2, off2, value); 1102 1.8 nonaka off1 -= 1; 1103 1.8 nonaka off2 -= 1; 1104 1.8 nonaka } 1105 1.8 nonaka } 1106 1.8 nonaka } 1107 1.1 itojun 1108 1.8 nonaka void 1109 1.8 nonaka shpcic_io_copy_region_2(void *v, bus_space_handle_t bsh1, 1110 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1111 1.8 nonaka { 1112 1.8 nonaka u_long addr1 = bsh1 + off1; 1113 1.8 nonaka u_long addr2 = bsh2 + off2; 1114 1.8 nonaka uint16_t value; 1115 1.8 nonaka 1116 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1117 1.8 nonaka while (count--) { 1118 1.8 nonaka value = __shpcic_io_read_2(bsh1, off1); 1119 1.8 nonaka __shpcic_io_write_2(bsh2, off2, value); 1120 1.8 nonaka off1 += 2; 1121 1.8 nonaka off2 += 2; 1122 1.8 nonaka } 1123 1.8 nonaka } else { /* dest after src: copy backwards */ 1124 1.8 nonaka off1 += (count - 1) * 2; 1125 1.8 nonaka off2 += (count - 1) * 2; 1126 1.8 nonaka while (count--) { 1127 1.8 nonaka value = __shpcic_io_read_2(bsh1, off1); 1128 1.8 nonaka __shpcic_io_write_2(bsh2, off2, value); 1129 1.8 nonaka off1 -= 2; 1130 1.8 nonaka off2 -= 2; 1131 1.8 nonaka } 1132 1.8 nonaka } 1133 1.1 itojun } 1134 1.1 itojun 1135 1.1 itojun void 1136 1.8 nonaka shpcic_io_copy_region_4(void *v, bus_space_handle_t bsh1, 1137 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1138 1.1 itojun { 1139 1.8 nonaka u_long addr1 = bsh1 + off1; 1140 1.8 nonaka u_long addr2 = bsh2 + off2; 1141 1.8 nonaka uint32_t value; 1142 1.8 nonaka 1143 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1144 1.8 nonaka while (count--) { 1145 1.8 nonaka value = __shpcic_io_read_4(bsh1, off1); 1146 1.8 nonaka __shpcic_io_write_4(bsh2, off2, value); 1147 1.8 nonaka off1 += 4; 1148 1.8 nonaka off2 += 4; 1149 1.8 nonaka } 1150 1.8 nonaka } else { /* dest after src: copy backwards */ 1151 1.8 nonaka off1 += (count - 1) * 4; 1152 1.8 nonaka off2 += (count - 1) * 4; 1153 1.8 nonaka while (count--) { 1154 1.8 nonaka value = __shpcic_io_read_4(bsh1, off1); 1155 1.8 nonaka __shpcic_io_write_4(bsh2, off2, value); 1156 1.8 nonaka off1 -= 4; 1157 1.8 nonaka off2 -= 4; 1158 1.8 nonaka } 1159 1.8 nonaka } 1160 1.8 nonaka } 1161 1.1 itojun 1162 1.8 nonaka void 1163 1.8 nonaka shpcic_mem_copy_region_1(void *v, bus_space_handle_t bsh1, 1164 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1165 1.8 nonaka { 1166 1.8 nonaka u_long addr1 = bsh1 + off1; 1167 1.8 nonaka u_long addr2 = bsh2 + off2; 1168 1.8 nonaka uint8_t value; 1169 1.8 nonaka 1170 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1171 1.8 nonaka while (count--) { 1172 1.8 nonaka value = __shpcic_mem_read_1(bsh1, off1); 1173 1.8 nonaka __shpcic_mem_write_1(bsh2, off2, value); 1174 1.8 nonaka off1 += 1; 1175 1.8 nonaka off2 += 1; 1176 1.8 nonaka } 1177 1.8 nonaka } else { /* dest after src: copy backwards */ 1178 1.8 nonaka off1 += (count - 1) * 1; 1179 1.8 nonaka off2 += (count - 1) * 1; 1180 1.8 nonaka while (count--) { 1181 1.8 nonaka value = __shpcic_mem_read_1(bsh1, off1); 1182 1.8 nonaka __shpcic_mem_write_1(bsh2, off2, value); 1183 1.8 nonaka off1 -= 1; 1184 1.8 nonaka off2 -= 1; 1185 1.8 nonaka } 1186 1.8 nonaka } 1187 1.8 nonaka } 1188 1.1 itojun 1189 1.8 nonaka void 1190 1.8 nonaka shpcic_mem_copy_region_2(void *v, bus_space_handle_t bsh1, 1191 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1192 1.8 nonaka { 1193 1.8 nonaka u_long addr1 = bsh1 + off1; 1194 1.8 nonaka u_long addr2 = bsh2 + off2; 1195 1.8 nonaka uint16_t value; 1196 1.8 nonaka 1197 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1198 1.8 nonaka while (count--) { 1199 1.8 nonaka value = __shpcic_mem_read_2(bsh1, off1); 1200 1.8 nonaka __shpcic_mem_write_2(bsh2, off2, value); 1201 1.8 nonaka off1 += 2; 1202 1.8 nonaka off2 += 2; 1203 1.8 nonaka } 1204 1.8 nonaka } else { /* dest after src: copy backwards */ 1205 1.8 nonaka off1 += (count - 1) * 2; 1206 1.8 nonaka off2 += (count - 1) * 2; 1207 1.8 nonaka while (count--) { 1208 1.8 nonaka value = __shpcic_mem_read_2(bsh1, off1); 1209 1.8 nonaka __shpcic_mem_write_2(bsh2, off2, value); 1210 1.8 nonaka off1 -= 2; 1211 1.8 nonaka off2 -= 2; 1212 1.8 nonaka } 1213 1.8 nonaka } 1214 1.8 nonaka } 1215 1.1 itojun 1216 1.8 nonaka void 1217 1.8 nonaka shpcic_mem_copy_region_4(void *v, bus_space_handle_t bsh1, 1218 1.8 nonaka bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 1219 1.8 nonaka { 1220 1.8 nonaka u_long addr1 = bsh1 + off1; 1221 1.8 nonaka u_long addr2 = bsh2 + off2; 1222 1.8 nonaka uint32_t value; 1223 1.8 nonaka 1224 1.8 nonaka if (addr1 >= addr2) { /* src after dest: copy forward */ 1225 1.8 nonaka while (count--) { 1226 1.8 nonaka value = __shpcic_mem_read_4(bsh1, off1); 1227 1.8 nonaka __shpcic_mem_write_4(bsh2, off2, value); 1228 1.8 nonaka off1 += 4; 1229 1.8 nonaka off2 += 4; 1230 1.8 nonaka } 1231 1.8 nonaka } else { /* dest after src: copy backwards */ 1232 1.8 nonaka off1 += (count - 1) * 4; 1233 1.8 nonaka off2 += (count - 1) * 4; 1234 1.8 nonaka while (count--) { 1235 1.8 nonaka value = __shpcic_mem_read_4(bsh1, off1); 1236 1.8 nonaka __shpcic_mem_write_4(bsh2, off2, value); 1237 1.8 nonaka off1 -= 4; 1238 1.8 nonaka off2 -= 4; 1239 1.8 nonaka } 1240 1.8 nonaka } 1241 1.1 itojun } 1242