1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/* Generic I/O port emulation.
3 *
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7#ifndef __ASM_GENERIC_IO_H
8#define __ASM_GENERIC_IO_H
9
10#include <asm/page.h> /* I/O is all done through memory accesses */
11#include <linux/string.h> /* for memset() and memcpy() */
12#include <linux/sizes.h>
13#include <linux/types.h>
14#include <linux/instruction_pointer.h>
15
16#ifdef CONFIG_GENERIC_IOMAP
17#include <asm-generic/iomap.h>
18#endif
19
20#include <asm/mmiowb.h>
21#include <asm-generic/pci_iomap.h>
22
23#ifndef __io_br
24#define __io_br() barrier()
25#endif
26
27/* prevent prefetching of coherent DMA data ahead of a dma-complete */
28#ifndef __io_ar
29#ifdef rmb
30#define __io_ar(v) rmb()
31#else
32#define __io_ar(v) barrier()
33#endif
34#endif
35
36/* flush writes to coherent DMA data before possibly triggering a DMA read */
37#ifndef __io_bw
38#ifdef wmb
39#define __io_bw() wmb()
40#else
41#define __io_bw() barrier()
42#endif
43#endif
44
45/* serialize device access against a spin_unlock, usually handled there. */
46#ifndef __io_aw
47#define __io_aw() mmiowb_set_pending()
48#endif
49
50#ifndef __io_pbw
51#define __io_pbw() __io_bw()
52#endif
53
54#ifndef __io_paw
55#define __io_paw() __io_aw()
56#endif
57
58#ifndef __io_pbr
59#define __io_pbr() __io_br()
60#endif
61
62#ifndef __io_par
63#define __io_par(v) __io_ar(v)
64#endif
65
66/*
67 * "__DISABLE_TRACE_MMIO__" flag can be used to disable MMIO tracing for
68 * specific kernel drivers in case of excessive/unwanted logging.
69 *
70 * Usage: Add a #define flag at the beginning of the driver file.
71 * Ex: #define __DISABLE_TRACE_MMIO__
72 * #include <...>
73 * ...
74 */
75#if IS_ENABLED(CONFIG_TRACE_MMIO_ACCESS) && !(defined(__DISABLE_TRACE_MMIO__))
76#include <linux/tracepoint-defs.h>
77
78#define rwmmio_tracepoint_enabled(tracepoint) tracepoint_enabled(tracepoint)
79DECLARE_TRACEPOINT(rwmmio_write);
80DECLARE_TRACEPOINT(rwmmio_post_write);
81DECLARE_TRACEPOINT(rwmmio_read);
82DECLARE_TRACEPOINT(rwmmio_post_read);
83
84void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
85 unsigned long caller_addr, unsigned long caller_addr0);
86void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
87 unsigned long caller_addr, unsigned long caller_addr0);
88void log_read_mmio(u8 width, const volatile void __iomem *addr,
89 unsigned long caller_addr, unsigned long caller_addr0);
90void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
91 unsigned long caller_addr, unsigned long caller_addr0);
92
93#else
94
95#define rwmmio_tracepoint_enabled(tracepoint) false
96static inline void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
97 unsigned long caller_addr, unsigned long caller_addr0) {}
98static inline void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
99 unsigned long caller_addr, unsigned long caller_addr0) {}
100static inline void log_read_mmio(u8 width, const volatile void __iomem *addr,
101 unsigned long caller_addr, unsigned long caller_addr0) {}
102static inline void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
103 unsigned long caller_addr, unsigned long caller_addr0) {}
104
105#endif /* CONFIG_TRACE_MMIO_ACCESS */
106
107/*
108 * __raw_{read,write}{b,w,l,q}() access memory in native endianness.
109 *
110 * On some architectures memory mapped IO needs to be accessed differently.
111 * On the simple architectures, we just read/write the memory location
112 * directly.
113 */
114
115#ifndef __raw_readb
116#define __raw_readb __raw_readb
117static inline u8 __raw_readb(const volatile void __iomem *addr)
118{
119 return *(const volatile u8 __force *)addr;
120}
121#endif
122
123#ifndef __raw_readw
124#define __raw_readw __raw_readw
125static inline u16 __raw_readw(const volatile void __iomem *addr)
126{
127 return *(const volatile u16 __force *)addr;
128}
129#endif
130
131#ifndef __raw_readl
132#define __raw_readl __raw_readl
133static inline u32 __raw_readl(const volatile void __iomem *addr)
134{
135 return *(const volatile u32 __force *)addr;
136}
137#endif
138
139#ifdef CONFIG_64BIT
140#ifndef __raw_readq
141#define __raw_readq __raw_readq
142static inline u64 __raw_readq(const volatile void __iomem *addr)
143{
144 return *(const volatile u64 __force *)addr;
145}
146#endif
147#endif /* CONFIG_64BIT */
148
149#ifndef __raw_writeb
150#define __raw_writeb __raw_writeb
151static inline void __raw_writeb(u8 value, volatile void __iomem *addr)
152{
153 *(volatile u8 __force *)addr = value;
154}
155#endif
156
157#ifndef __raw_writew
158#define __raw_writew __raw_writew
159static inline void __raw_writew(u16 value, volatile void __iomem *addr)
160{
161 *(volatile u16 __force *)addr = value;
162}
163#endif
164
165#ifndef __raw_writel
166#define __raw_writel __raw_writel
167static inline void __raw_writel(u32 value, volatile void __iomem *addr)
168{
169 *(volatile u32 __force *)addr = value;
170}
171#endif
172
173#ifdef CONFIG_64BIT
174#ifndef __raw_writeq
175#define __raw_writeq __raw_writeq
176static inline void __raw_writeq(u64 value, volatile void __iomem *addr)
177{
178 *(volatile u64 __force *)addr = value;
179}
180#endif
181#endif /* CONFIG_64BIT */
182
183/*
184 * {read,write}{b,w,l,q}() access little endian memory and return result in
185 * native endianness.
186 */
187
188#ifndef readb
189#define readb readb
190static inline u8 readb(const volatile void __iomem *addr)
191{
192 u8 val;
193
194 if (rwmmio_tracepoint_enabled(rwmmio_read))
195 log_read_mmio(8, addr, _THIS_IP_, _RET_IP_);
196 __io_br();
197 val = __raw_readb(addr);
198 __io_ar(val);
199 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
200 log_post_read_mmio(val, 8, addr, _THIS_IP_, _RET_IP_);
201 return val;
202}
203#endif
204
205#ifndef readw
206#define readw readw
207static inline u16 readw(const volatile void __iomem *addr)
208{
209 u16 val;
210
211 if (rwmmio_tracepoint_enabled(rwmmio_read))
212 log_read_mmio(16, addr, _THIS_IP_, _RET_IP_);
213 __io_br();
214 val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
215 __io_ar(val);
216 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
217 log_post_read_mmio(val, 16, addr, _THIS_IP_, _RET_IP_);
218 return val;
219}
220#endif
221
222#ifndef readl
223#define readl readl
224static inline u32 readl(const volatile void __iomem *addr)
225{
226 u32 val;
227
228 if (rwmmio_tracepoint_enabled(rwmmio_read))
229 log_read_mmio(32, addr, _THIS_IP_, _RET_IP_);
230 __io_br();
231 val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
232 __io_ar(val);
233 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
234 log_post_read_mmio(val, 32, addr, _THIS_IP_, _RET_IP_);
235 return val;
236}
237#endif
238
239#ifdef CONFIG_64BIT
240#ifndef readq
241#define readq readq
242static inline u64 readq(const volatile void __iomem *addr)
243{
244 u64 val;
245
246 if (rwmmio_tracepoint_enabled(rwmmio_read))
247 log_read_mmio(64, addr, _THIS_IP_, _RET_IP_);
248 __io_br();
249 val = __le64_to_cpu((__le64 __force)__raw_readq(addr));
250 __io_ar(val);
251 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
252 log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);
253 return val;
254}
255#endif
256#endif /* CONFIG_64BIT */
257
258#ifndef writeb
259#define writeb writeb
260static inline void writeb(u8 value, volatile void __iomem *addr)
261{
262 if (rwmmio_tracepoint_enabled(rwmmio_write))
263 log_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
264 __io_bw();
265 __raw_writeb(value, addr);
266 __io_aw();
267 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
268 log_post_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
269}
270#endif
271
272#ifndef writew
273#define writew writew
274static inline void writew(u16 value, volatile void __iomem *addr)
275{
276 if (rwmmio_tracepoint_enabled(rwmmio_write))
277 log_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
278 __io_bw();
279 __raw_writew((u16 __force)cpu_to_le16(value), addr);
280 __io_aw();
281 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
282 log_post_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
283}
284#endif
285
286#ifndef writel
287#define writel writel
288static inline void writel(u32 value, volatile void __iomem *addr)
289{
290 if (rwmmio_tracepoint_enabled(rwmmio_write))
291 log_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
292 __io_bw();
293 __raw_writel((u32 __force)__cpu_to_le32(value), addr);
294 __io_aw();
295 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
296 log_post_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
297}
298#endif
299
300#ifdef CONFIG_64BIT
301#ifndef writeq
302#define writeq writeq
303static inline void writeq(u64 value, volatile void __iomem *addr)
304{
305 if (rwmmio_tracepoint_enabled(rwmmio_write))
306 log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
307 __io_bw();
308 __raw_writeq((u64 __force)__cpu_to_le64(value), addr);
309 __io_aw();
310 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
311 log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
312}
313#endif
314#endif /* CONFIG_64BIT */
315
316/*
317 * {read,write}{b,w,l,q}_relaxed() are like the regular version, but
318 * are not guaranteed to provide ordering against spinlocks or memory
319 * accesses.
320 */
321#ifndef readb_relaxed
322#define readb_relaxed readb_relaxed
323static inline u8 readb_relaxed(const volatile void __iomem *addr)
324{
325 u8 val;
326
327 if (rwmmio_tracepoint_enabled(rwmmio_read))
328 log_read_mmio(8, addr, _THIS_IP_, _RET_IP_);
329 val = __raw_readb(addr);
330 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
331 log_post_read_mmio(val, 8, addr, _THIS_IP_, _RET_IP_);
332 return val;
333}
334#endif
335
336#ifndef readw_relaxed
337#define readw_relaxed readw_relaxed
338static inline u16 readw_relaxed(const volatile void __iomem *addr)
339{
340 u16 val;
341
342 if (rwmmio_tracepoint_enabled(rwmmio_read))
343 log_read_mmio(16, addr, _THIS_IP_, _RET_IP_);
344 val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
345 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
346 log_post_read_mmio(val, 16, addr, _THIS_IP_, _RET_IP_);
347 return val;
348}
349#endif
350
351#ifndef readl_relaxed
352#define readl_relaxed readl_relaxed
353static inline u32 readl_relaxed(const volatile void __iomem *addr)
354{
355 u32 val;
356
357 if (rwmmio_tracepoint_enabled(rwmmio_read))
358 log_read_mmio(32, addr, _THIS_IP_, _RET_IP_);
359 val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
360 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
361 log_post_read_mmio(val, 32, addr, _THIS_IP_, _RET_IP_);
362 return val;
363}
364#endif
365
366#if defined(readq) && !defined(readq_relaxed)
367#define readq_relaxed readq_relaxed
368static inline u64 readq_relaxed(const volatile void __iomem *addr)
369{
370 u64 val;
371
372 if (rwmmio_tracepoint_enabled(rwmmio_read))
373 log_read_mmio(64, addr, _THIS_IP_, _RET_IP_);
374 val = __le64_to_cpu((__le64 __force)__raw_readq(addr));
375 if (rwmmio_tracepoint_enabled(rwmmio_post_read))
376 log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);
377 return val;
378}
379#endif
380
381#ifndef writeb_relaxed
382#define writeb_relaxed writeb_relaxed
383static inline void writeb_relaxed(u8 value, volatile void __iomem *addr)
384{
385 if (rwmmio_tracepoint_enabled(rwmmio_write))
386 log_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
387 __raw_writeb(value, addr);
388 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
389 log_post_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
390}
391#endif
392
393#ifndef writew_relaxed
394#define writew_relaxed writew_relaxed
395static inline void writew_relaxed(u16 value, volatile void __iomem *addr)
396{
397 if (rwmmio_tracepoint_enabled(rwmmio_write))
398 log_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
399 __raw_writew((u16 __force)cpu_to_le16(value), addr);
400 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
401 log_post_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
402}
403#endif
404
405#ifndef writel_relaxed
406#define writel_relaxed writel_relaxed
407static inline void writel_relaxed(u32 value, volatile void __iomem *addr)
408{
409 if (rwmmio_tracepoint_enabled(rwmmio_write))
410 log_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
411 __raw_writel((u32 __force)__cpu_to_le32(value), addr);
412 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
413 log_post_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
414}
415#endif
416
417#if defined(writeq) && !defined(writeq_relaxed)
418#define writeq_relaxed writeq_relaxed
419static inline void writeq_relaxed(u64 value, volatile void __iomem *addr)
420{
421 if (rwmmio_tracepoint_enabled(rwmmio_write))
422 log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
423 __raw_writeq((u64 __force)__cpu_to_le64(value), addr);
424 if (rwmmio_tracepoint_enabled(rwmmio_post_write))
425 log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
426}
427#endif
428
429/*
430 * {read,write}s{b,w,l,q}() repeatedly access the same memory address in
431 * native endianness in 8-, 16-, 32- or 64-bit chunks (@count times).
432 */
433#ifndef readsb
434#define readsb readsb
435static inline void readsb(const volatile void __iomem *addr, void *buffer,
436 unsigned int count)
437{
438 if (count) {
439 u8 *buf = buffer;
440
441 do {
442 u8 x = __raw_readb(addr);
443 *buf++ = x;
444 } while (--count);
445 }
446}
447#endif
448
449#ifndef readsw
450#define readsw readsw
451static inline void readsw(const volatile void __iomem *addr, void *buffer,
452 unsigned int count)
453{
454 if (count) {
455 u16 *buf = buffer;
456
457 do {
458 u16 x = __raw_readw(addr);
459 *buf++ = x;
460 } while (--count);
461 }
462}
463#endif
464
465#ifndef readsl
466#define readsl readsl
467static inline void readsl(const volatile void __iomem *addr, void *buffer,
468 unsigned int count)
469{
470 if (count) {
471 u32 *buf = buffer;
472
473 do {
474 u32 x = __raw_readl(addr);
475 *buf++ = x;
476 } while (--count);
477 }
478}
479#endif
480
481#ifdef CONFIG_64BIT
482#ifndef readsq
483#define readsq readsq
484static inline void readsq(const volatile void __iomem *addr, void *buffer,
485 unsigned int count)
486{
487 if (count) {
488 u64 *buf = buffer;
489
490 do {
491 u64 x = __raw_readq(addr);
492 *buf++ = x;
493 } while (--count);
494 }
495}
496#endif
497#endif /* CONFIG_64BIT */
498
499#ifndef writesb
500#define writesb writesb
501static inline void writesb(volatile void __iomem *addr, const void *buffer,
502 unsigned int count)
503{
504 if (count) {
505 const u8 *buf = buffer;
506
507 do {
508 __raw_writeb(val: *buf++, addr);
509 } while (--count);
510 }
511}
512#endif
513
514#ifndef writesw
515#define writesw writesw
516static inline void writesw(volatile void __iomem *addr, const void *buffer,
517 unsigned int count)
518{
519 if (count) {
520 const u16 *buf = buffer;
521
522 do {
523 __raw_writew(val: *buf++, addr);
524 } while (--count);
525 }
526}
527#endif
528
529#ifndef writesl
530#define writesl writesl
531static inline void writesl(volatile void __iomem *addr, const void *buffer,
532 unsigned int count)
533{
534 if (count) {
535 const u32 *buf = buffer;
536
537 do {
538 __raw_writel(val: *buf++, addr);
539 } while (--count);
540 }
541}
542#endif
543
544#ifdef CONFIG_64BIT
545#ifndef writesq
546#define writesq writesq
547static inline void writesq(volatile void __iomem *addr, const void *buffer,
548 unsigned int count)
549{
550 if (count) {
551 const u64 *buf = buffer;
552
553 do {
554 __raw_writeq(val: *buf++, addr);
555 } while (--count);
556 }
557}
558#endif
559#endif /* CONFIG_64BIT */
560
561#ifndef PCI_IOBASE
562#define PCI_IOBASE ((void __iomem *)0)
563#endif
564
565#ifndef IO_SPACE_LIMIT
566#define IO_SPACE_LIMIT 0xffff
567#endif
568
569/*
570 * {in,out}{b,w,l}() access little endian I/O. {in,out}{b,w,l}_p() can be
571 * implemented on hardware that needs an additional delay for I/O accesses to
572 * take effect.
573 */
574
575#if !defined(inb) && !defined(_inb)
576#define _inb _inb
577#ifdef CONFIG_HAS_IOPORT
578static inline u8 _inb(unsigned long addr)
579{
580 u8 val;
581
582 __io_pbr();
583 val = __raw_readb(PCI_IOBASE + addr);
584 __io_par(val);
585 return val;
586}
587#else
588u8 _inb(unsigned long addr)
589 __compiletime_error("inb()) requires CONFIG_HAS_IOPORT");
590#endif
591#endif
592
593#if !defined(inw) && !defined(_inw)
594#define _inw _inw
595#ifdef CONFIG_HAS_IOPORT
596static inline u16 _inw(unsigned long addr)
597{
598 u16 val;
599
600 __io_pbr();
601 val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
602 __io_par(val);
603 return val;
604}
605#else
606u16 _inw(unsigned long addr)
607 __compiletime_error("inw() requires CONFIG_HAS_IOPORT");
608#endif
609#endif
610
611#if !defined(inl) && !defined(_inl)
612#define _inl _inl
613#ifdef CONFIG_HAS_IOPORT
614static inline u32 _inl(unsigned long addr)
615{
616 u32 val;
617
618 __io_pbr();
619 val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
620 __io_par(val);
621 return val;
622}
623#else
624u32 _inl(unsigned long addr)
625 __compiletime_error("inl() requires CONFIG_HAS_IOPORT");
626#endif
627#endif
628
629#if !defined(outb) && !defined(_outb)
630#define _outb _outb
631#ifdef CONFIG_HAS_IOPORT
632static inline void _outb(u8 value, unsigned long addr)
633{
634 __io_pbw();
635 __raw_writeb(value, PCI_IOBASE + addr);
636 __io_paw();
637}
638#else
639void _outb(u8 value, unsigned long addr)
640 __compiletime_error("outb() requires CONFIG_HAS_IOPORT");
641#endif
642#endif
643
644#if !defined(outw) && !defined(_outw)
645#define _outw _outw
646#ifdef CONFIG_HAS_IOPORT
647static inline void _outw(u16 value, unsigned long addr)
648{
649 __io_pbw();
650 __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
651 __io_paw();
652}
653#else
654void _outw(u16 value, unsigned long addr)
655 __compiletime_error("outw() requires CONFIG_HAS_IOPORT");
656#endif
657#endif
658
659#if !defined(outl) && !defined(_outl)
660#define _outl _outl
661#ifdef CONFIG_HAS_IOPORT
662static inline void _outl(u32 value, unsigned long addr)
663{
664 __io_pbw();
665 __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
666 __io_paw();
667}
668#else
669void _outl(u32 value, unsigned long addr)
670 __compiletime_error("outl() requires CONFIG_HAS_IOPORT");
671#endif
672#endif
673
674#include <linux/logic_pio.h>
675
676#ifndef inb
677#define inb _inb
678#endif
679
680#ifndef inw
681#define inw _inw
682#endif
683
684#ifndef inl
685#define inl _inl
686#endif
687
688#ifndef outb
689#define outb _outb
690#endif
691
692#ifndef outw
693#define outw _outw
694#endif
695
696#ifndef outl
697#define outl _outl
698#endif
699
700#ifndef inb_p
701#define inb_p inb_p
702static inline u8 inb_p(unsigned long addr)
703{
704 return inb(addr);
705}
706#endif
707
708#ifndef inw_p
709#define inw_p inw_p
710static inline u16 inw_p(unsigned long addr)
711{
712 return inw(addr);
713}
714#endif
715
716#ifndef inl_p
717#define inl_p inl_p
718static inline u32 inl_p(unsigned long addr)
719{
720 return inl(addr);
721}
722#endif
723
724#ifndef outb_p
725#define outb_p outb_p
726static inline void outb_p(u8 value, unsigned long addr)
727{
728 outb(value, addr);
729}
730#endif
731
732#ifndef outw_p
733#define outw_p outw_p
734static inline void outw_p(u16 value, unsigned long addr)
735{
736 outw(value, addr);
737}
738#endif
739
740#ifndef outl_p
741#define outl_p outl_p
742static inline void outl_p(u32 value, unsigned long addr)
743{
744 outl(value, addr);
745}
746#endif
747
748/*
749 * {in,out}s{b,w,l}{,_p}() are variants of the above that repeatedly access a
750 * single I/O port multiple times.
751 */
752
753#ifndef insb
754#define insb insb
755#ifdef CONFIG_HAS_IOPORT
756static inline void insb(unsigned long addr, void *buffer, unsigned int count)
757{
758 readsb(PCI_IOBASE + addr, buffer, count);
759}
760#else
761void insb(unsigned long addr, void *buffer, unsigned int count)
762 __compiletime_error("insb() requires HAS_IOPORT");
763#endif
764#endif
765
766#ifndef insw
767#define insw insw
768#ifdef CONFIG_HAS_IOPORT
769static inline void insw(unsigned long addr, void *buffer, unsigned int count)
770{
771 readsw(PCI_IOBASE + addr, buffer, count);
772}
773#else
774void insw(unsigned long addr, void *buffer, unsigned int count)
775 __compiletime_error("insw() requires HAS_IOPORT");
776#endif
777#endif
778
779#ifndef insl
780#define insl insl
781#ifdef CONFIG_HAS_IOPORT
782static inline void insl(unsigned long addr, void *buffer, unsigned int count)
783{
784 readsl(PCI_IOBASE + addr, buffer, count);
785}
786#else
787void insl(unsigned long addr, void *buffer, unsigned int count)
788 __compiletime_error("insl() requires HAS_IOPORT");
789#endif
790#endif
791
792#ifndef outsb
793#define outsb outsb
794#ifdef CONFIG_HAS_IOPORT
795static inline void outsb(unsigned long addr, const void *buffer,
796 unsigned int count)
797{
798 writesb(PCI_IOBASE + addr, buffer, count);
799}
800#else
801void outsb(unsigned long addr, const void *buffer, unsigned int count)
802 __compiletime_error("outsb() requires HAS_IOPORT");
803#endif
804#endif
805
806#ifndef outsw
807#define outsw outsw
808#ifdef CONFIG_HAS_IOPORT
809static inline void outsw(unsigned long addr, const void *buffer,
810 unsigned int count)
811{
812 writesw(PCI_IOBASE + addr, buffer, count);
813}
814#else
815void outsw(unsigned long addr, const void *buffer, unsigned int count)
816 __compiletime_error("outsw() requires HAS_IOPORT");
817#endif
818#endif
819
820#ifndef outsl
821#define outsl outsl
822#ifdef CONFIG_HAS_IOPORT
823static inline void outsl(unsigned long addr, const void *buffer,
824 unsigned int count)
825{
826 writesl(PCI_IOBASE + addr, buffer, count);
827}
828#else
829void outsl(unsigned long addr, const void *buffer, unsigned int count)
830 __compiletime_error("outsl() requires HAS_IOPORT");
831#endif
832#endif
833
834#ifndef insb_p
835#define insb_p insb_p
836static inline void insb_p(unsigned long addr, void *buffer, unsigned int count)
837{
838 insb(port: addr, addr: buffer, count);
839}
840#endif
841
842#ifndef insw_p
843#define insw_p insw_p
844static inline void insw_p(unsigned long addr, void *buffer, unsigned int count)
845{
846 insw(port: addr, addr: buffer, count);
847}
848#endif
849
850#ifndef insl_p
851#define insl_p insl_p
852static inline void insl_p(unsigned long addr, void *buffer, unsigned int count)
853{
854 insl(port: addr, addr: buffer, count);
855}
856#endif
857
858#ifndef outsb_p
859#define outsb_p outsb_p
860static inline void outsb_p(unsigned long addr, const void *buffer,
861 unsigned int count)
862{
863 outsb(port: addr, addr: buffer, count);
864}
865#endif
866
867#ifndef outsw_p
868#define outsw_p outsw_p
869static inline void outsw_p(unsigned long addr, const void *buffer,
870 unsigned int count)
871{
872 outsw(port: addr, addr: buffer, count);
873}
874#endif
875
876#ifndef outsl_p
877#define outsl_p outsl_p
878static inline void outsl_p(unsigned long addr, const void *buffer,
879 unsigned int count)
880{
881 outsl(port: addr, addr: buffer, count);
882}
883#endif
884
885#ifndef CONFIG_GENERIC_IOMAP
886#ifndef ioread8
887#define ioread8 ioread8
888static inline u8 ioread8(const volatile void __iomem *addr)
889{
890 return readb(addr);
891}
892#endif
893
894#ifndef ioread16
895#define ioread16 ioread16
896static inline u16 ioread16(const volatile void __iomem *addr)
897{
898 return readw(addr);
899}
900#endif
901
902#ifndef ioread32
903#define ioread32 ioread32
904static inline u32 ioread32(const volatile void __iomem *addr)
905{
906 return readl(addr);
907}
908#endif
909
910#ifdef CONFIG_64BIT
911#ifndef ioread64
912#define ioread64 ioread64
913static inline u64 ioread64(const volatile void __iomem *addr)
914{
915 return readq(addr);
916}
917#endif
918#endif /* CONFIG_64BIT */
919
920#ifndef iowrite8
921#define iowrite8 iowrite8
922static inline void iowrite8(u8 value, volatile void __iomem *addr)
923{
924 writeb(value, addr);
925}
926#endif
927
928#ifndef iowrite16
929#define iowrite16 iowrite16
930static inline void iowrite16(u16 value, volatile void __iomem *addr)
931{
932 writew(value, addr);
933}
934#endif
935
936#ifndef iowrite32
937#define iowrite32 iowrite32
938static inline void iowrite32(u32 value, volatile void __iomem *addr)
939{
940 writel(value, addr);
941}
942#endif
943
944#ifdef CONFIG_64BIT
945#ifndef iowrite64
946#define iowrite64 iowrite64
947static inline void iowrite64(u64 value, volatile void __iomem *addr)
948{
949 writeq(value, addr);
950}
951#endif
952#endif /* CONFIG_64BIT */
953
954#ifndef ioread16be
955#define ioread16be ioread16be
956static inline u16 ioread16be(const volatile void __iomem *addr)
957{
958 return swab16(readw(addr));
959}
960#endif
961
962#ifndef ioread32be
963#define ioread32be ioread32be
964static inline u32 ioread32be(const volatile void __iomem *addr)
965{
966 return swab32(readl(addr));
967}
968#endif
969
970#ifdef CONFIG_64BIT
971#ifndef ioread64be
972#define ioread64be ioread64be
973static inline u64 ioread64be(const volatile void __iomem *addr)
974{
975 return swab64(readq(addr));
976}
977#endif
978#endif /* CONFIG_64BIT */
979
980#ifndef iowrite16be
981#define iowrite16be iowrite16be
982static inline void iowrite16be(u16 value, void volatile __iomem *addr)
983{
984 writew(swab16(value), addr);
985}
986#endif
987
988#ifndef iowrite32be
989#define iowrite32be iowrite32be
990static inline void iowrite32be(u32 value, volatile void __iomem *addr)
991{
992 writel(swab32(value), addr);
993}
994#endif
995
996#ifdef CONFIG_64BIT
997#ifndef iowrite64be
998#define iowrite64be iowrite64be
999static inline void iowrite64be(u64 value, volatile void __iomem *addr)
1000{
1001 writeq(swab64(value), addr);
1002}
1003#endif
1004#endif /* CONFIG_64BIT */
1005
1006#ifndef ioread8_rep
1007#define ioread8_rep ioread8_rep
1008static inline void ioread8_rep(const volatile void __iomem *addr, void *buffer,
1009 unsigned int count)
1010{
1011 readsb(addr, buffer, count);
1012}
1013#endif
1014
1015#ifndef ioread16_rep
1016#define ioread16_rep ioread16_rep
1017static inline void ioread16_rep(const volatile void __iomem *addr,
1018 void *buffer, unsigned int count)
1019{
1020 readsw(addr, buffer, count);
1021}
1022#endif
1023
1024#ifndef ioread32_rep
1025#define ioread32_rep ioread32_rep
1026static inline void ioread32_rep(const volatile void __iomem *addr,
1027 void *buffer, unsigned int count)
1028{
1029 readsl(addr, buffer, count);
1030}
1031#endif
1032
1033#ifdef CONFIG_64BIT
1034#ifndef ioread64_rep
1035#define ioread64_rep ioread64_rep
1036static inline void ioread64_rep(const volatile void __iomem *addr,
1037 void *buffer, unsigned int count)
1038{
1039 readsq(addr, buffer, count);
1040}
1041#endif
1042#endif /* CONFIG_64BIT */
1043
1044#ifndef iowrite8_rep
1045#define iowrite8_rep iowrite8_rep
1046static inline void iowrite8_rep(volatile void __iomem *addr,
1047 const void *buffer,
1048 unsigned int count)
1049{
1050 writesb(addr, buffer, count);
1051}
1052#endif
1053
1054#ifndef iowrite16_rep
1055#define iowrite16_rep iowrite16_rep
1056static inline void iowrite16_rep(volatile void __iomem *addr,
1057 const void *buffer,
1058 unsigned int count)
1059{
1060 writesw(addr, buffer, count);
1061}
1062#endif
1063
1064#ifndef iowrite32_rep
1065#define iowrite32_rep iowrite32_rep
1066static inline void iowrite32_rep(volatile void __iomem *addr,
1067 const void *buffer,
1068 unsigned int count)
1069{
1070 writesl(addr, buffer, count);
1071}
1072#endif
1073
1074#ifdef CONFIG_64BIT
1075#ifndef iowrite64_rep
1076#define iowrite64_rep iowrite64_rep
1077static inline void iowrite64_rep(volatile void __iomem *addr,
1078 const void *buffer,
1079 unsigned int count)
1080{
1081 writesq(addr, buffer, count);
1082}
1083#endif
1084#endif /* CONFIG_64BIT */
1085#endif /* CONFIG_GENERIC_IOMAP */
1086
1087#ifdef __KERNEL__
1088
1089#define __io_virt(x) ((void __force *)(x))
1090
1091/*
1092 * Change virtual addresses to physical addresses and vv.
1093 * These are pretty trivial
1094 */
1095#ifndef virt_to_phys
1096#define virt_to_phys virt_to_phys
1097static inline unsigned long virt_to_phys(volatile void *address)
1098{
1099 return __pa((unsigned long)address);
1100}
1101#endif
1102
1103#ifndef phys_to_virt
1104#define phys_to_virt phys_to_virt
1105static inline void *phys_to_virt(unsigned long address)
1106{
1107 return __va(address);
1108}
1109#endif
1110
1111/**
1112 * DOC: ioremap() and ioremap_*() variants
1113 *
1114 * Architectures with an MMU are expected to provide ioremap() and iounmap()
1115 * themselves or rely on GENERIC_IOREMAP. For NOMMU architectures we provide
1116 * a default nop-op implementation that expect that the physical address used
1117 * for MMIO are already marked as uncached, and can be used as kernel virtual
1118 * addresses.
1119 *
1120 * ioremap_wc() and ioremap_wt() can provide more relaxed caching attributes
1121 * for specific drivers if the architecture choses to implement them. If they
1122 * are not implemented we fall back to plain ioremap. Conversely, ioremap_np()
1123 * can provide stricter non-posted write semantics if the architecture
1124 * implements them.
1125 */
1126#ifndef CONFIG_MMU
1127#ifndef ioremap
1128#define ioremap ioremap
1129static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
1130{
1131 return (void __iomem *)(unsigned long)offset;
1132}
1133#endif
1134
1135#ifndef iounmap
1136#define iounmap iounmap
1137static inline void iounmap(volatile void __iomem *addr)
1138{
1139}
1140#endif
1141#elif defined(CONFIG_GENERIC_IOREMAP)
1142#include <linux/pgtable.h>
1143
1144void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size,
1145 pgprot_t prot);
1146
1147void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
1148 pgprot_t prot);
1149void iounmap(volatile void __iomem *addr);
1150void generic_iounmap(volatile void __iomem *addr);
1151
1152#ifndef ioremap
1153#define ioremap ioremap
1154static inline void __iomem *ioremap(phys_addr_t addr, size_t size)
1155{
1156 /* _PAGE_IOREMAP needs to be supplied by the architecture */
1157 return ioremap_prot(addr, size, __pgprot(_PAGE_IOREMAP));
1158}
1159#endif
1160#endif /* !CONFIG_MMU || CONFIG_GENERIC_IOREMAP */
1161
1162#ifndef ioremap_wc
1163#define ioremap_wc ioremap
1164#endif
1165
1166#ifndef ioremap_wt
1167#define ioremap_wt ioremap
1168#endif
1169
1170/*
1171 * ioremap_uc is special in that we do require an explicit architecture
1172 * implementation. In general you do not want to use this function in a
1173 * driver and use plain ioremap, which is uncached by default. Similarly
1174 * architectures should not implement it unless they have a very good
1175 * reason.
1176 */
1177#ifndef ioremap_uc
1178#define ioremap_uc ioremap_uc
1179static inline void __iomem *ioremap_uc(phys_addr_t offset, size_t size)
1180{
1181 return NULL;
1182}
1183#endif
1184
1185/*
1186 * ioremap_np needs an explicit architecture implementation, as it
1187 * requests stronger semantics than regular ioremap(). Portable drivers
1188 * should instead use one of the higher-level abstractions, like
1189 * devm_ioremap_resource(), to choose the correct variant for any given
1190 * device and bus. Portable drivers with a good reason to want non-posted
1191 * write semantics should always provide an ioremap() fallback in case
1192 * ioremap_np() is not available.
1193 */
1194#ifndef ioremap_np
1195#define ioremap_np ioremap_np
1196static inline void __iomem *ioremap_np(phys_addr_t offset, size_t size)
1197{
1198 return NULL;
1199}
1200#endif
1201
1202#ifdef CONFIG_HAS_IOPORT_MAP
1203#ifndef CONFIG_GENERIC_IOMAP
1204#ifndef ioport_map
1205#define ioport_map ioport_map
1206static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
1207{
1208 port &= IO_SPACE_LIMIT;
1209 return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
1210}
1211#define ARCH_HAS_GENERIC_IOPORT_MAP
1212#endif
1213
1214#ifndef ioport_unmap
1215#define ioport_unmap ioport_unmap
1216static inline void ioport_unmap(void __iomem *p)
1217{
1218}
1219#endif
1220#else /* CONFIG_GENERIC_IOMAP */
1221extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
1222extern void ioport_unmap(void __iomem *p);
1223#endif /* CONFIG_GENERIC_IOMAP */
1224#endif /* CONFIG_HAS_IOPORT_MAP */
1225
1226#ifndef CONFIG_GENERIC_IOMAP
1227#ifndef pci_iounmap
1228#define ARCH_WANTS_GENERIC_PCI_IOUNMAP
1229#endif
1230#endif
1231
1232#ifndef xlate_dev_mem_ptr
1233#define xlate_dev_mem_ptr xlate_dev_mem_ptr
1234static inline void *xlate_dev_mem_ptr(phys_addr_t addr)
1235{
1236 return __va(addr);
1237}
1238#endif
1239
1240#ifndef unxlate_dev_mem_ptr
1241#define unxlate_dev_mem_ptr unxlate_dev_mem_ptr
1242static inline void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
1243{
1244}
1245#endif
1246
1247#ifndef memset_io
1248/**
1249 * memset_io - Set a range of I/O memory to a constant value
1250 * @addr: The beginning of the I/O-memory range to set
1251 * @val: The value to set the memory to
1252 * @count: The number of bytes to set
1253 *
1254 * Set a range of I/O memory to a given value.
1255 */
1256void memset_io(volatile void __iomem *addr, int val, size_t count);
1257#endif
1258
1259#ifndef memcpy_fromio
1260/**
1261 * memcpy_fromio - Copy a block of data from I/O memory
1262 * @dst: The (RAM) destination for the copy
1263 * @src: The (I/O memory) source for the data
1264 * @count: The number of bytes to copy
1265 *
1266 * Copy a block of data from I/O memory.
1267 */
1268void memcpy_fromio(void *dst, const volatile void __iomem *src, size_t count);
1269#endif
1270
1271#ifndef memcpy_toio
1272/**
1273 * memcpy_toio - Copy a block of data into I/O memory
1274 * @dst: The (I/O memory) destination for the copy
1275 * @src: The (RAM) source for the data
1276 * @count: The number of bytes to copy
1277 *
1278 * Copy a block of data to I/O memory.
1279 */
1280void memcpy_toio(volatile void __iomem *dst, const void *src, size_t count);
1281#endif
1282
1283extern int devmem_is_allowed(unsigned long pfn);
1284
1285#endif /* __KERNEL__ */
1286
1287#endif /* __ASM_GENERIC_IO_H */
1288