at master 30 kB view raw
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(*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(*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(*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(*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(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(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(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(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(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(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 */