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