-
Notifications
You must be signed in to change notification settings - Fork 59
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'x86-io-for-linus' of git://git.kernel.org/pub/scm/linux…
…/kernel/git/tip/linux-2.6-tip * 'x86-io-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Merge io.h x86: Simplify flush_write_buffers() x86: Clean up mem*io functions. x86-64: Use BUILDIO in io_64.h x86-64: Reorganize io_64.h x86-32: Remove _local variants of in/out from io_32.h x86-32: Move XQUAD definitions to numaq.h
- Loading branch information
Showing
8 changed files
with
162 additions
and
420 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,42 @@ | ||
#ifndef _ASM_X86_IO_H | ||
#define _ASM_X86_IO_H | ||
|
||
/* | ||
* This file contains the definitions for the x86 IO instructions | ||
* inb/inw/inl/outb/outw/outl and the "string versions" of the same | ||
* (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing" | ||
* versions of the single-IO instructions (inb_p/inw_p/..). | ||
* | ||
* This file is not meant to be obfuscating: it's just complicated | ||
* to (a) handle it all in a way that makes gcc able to optimize it | ||
* as well as possible and (b) trying to avoid writing the same thing | ||
* over and over again with slight variations and possibly making a | ||
* mistake somewhere. | ||
*/ | ||
|
||
/* | ||
* Thanks to James van Artsdalen for a better timing-fix than | ||
* the two short jumps: using outb's to a nonexistent port seems | ||
* to guarantee better timings even on fast machines. | ||
* | ||
* On the other hand, I'd like to be sure of a non-existent port: | ||
* I feel a bit unsafe about using 0x80 (should be safe, though) | ||
* | ||
* Linus | ||
*/ | ||
|
||
/* | ||
* Bit simplified and optimized by Jan Hubicka | ||
* Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999. | ||
* | ||
* isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added, | ||
* isa_read[wl] and isa_write[wl] fixed | ||
* - Arnaldo Carvalho de Melo <[email protected]> | ||
*/ | ||
|
||
#define ARCH_HAS_IOREMAP_WC | ||
|
||
#include <linux/string.h> | ||
#include <linux/compiler.h> | ||
#include <asm-generic/int-ll64.h> | ||
#include <asm/page.h> | ||
|
@@ -173,11 +207,126 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) | |
extern void iounmap(volatile void __iomem *addr); | ||
|
||
|
||
#ifdef CONFIG_X86_32 | ||
# include "io_32.h" | ||
#ifdef __KERNEL__ | ||
|
||
#include <asm-generic/iomap.h> | ||
|
||
#include <linux/vmalloc.h> | ||
|
||
/* | ||
* Convert a virtual cached pointer to an uncached pointer | ||
*/ | ||
#define xlate_dev_kmem_ptr(p) p | ||
|
||
static inline void | ||
memset_io(volatile void __iomem *addr, unsigned char val, size_t count) | ||
{ | ||
memset((void __force *)addr, val, count); | ||
} | ||
|
||
static inline void | ||
memcpy_fromio(void *dst, const volatile void __iomem *src, size_t count) | ||
{ | ||
memcpy(dst, (const void __force *)src, count); | ||
} | ||
|
||
static inline void | ||
memcpy_toio(volatile void __iomem *dst, const void *src, size_t count) | ||
{ | ||
memcpy((void __force *)dst, src, count); | ||
} | ||
|
||
/* | ||
* ISA space is 'always mapped' on a typical x86 system, no need to | ||
* explicitly ioremap() it. The fact that the ISA IO space is mapped | ||
* to PAGE_OFFSET is pure coincidence - it does not mean ISA values | ||
* are physical addresses. The following constant pointer can be | ||
* used as the IO-area pointer (it can be iounmapped as well, so the | ||
* analogy with PCI is quite large): | ||
*/ | ||
#define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET)) | ||
|
||
/* | ||
* Cache management | ||
* | ||
* This needed for two cases | ||
* 1. Out of order aware processors | ||
* 2. Accidentally out of order processors (PPro errata #51) | ||
*/ | ||
|
||
static inline void flush_write_buffers(void) | ||
{ | ||
#if defined(CONFIG_X86_OOSTORE) || defined(CONFIG_X86_PPRO_FENCE) | ||
asm volatile("lock; addl $0,0(%%esp)": : :"memory"); | ||
#endif | ||
} | ||
|
||
#endif /* __KERNEL__ */ | ||
|
||
extern void native_io_delay(void); | ||
|
||
extern int io_delay_type; | ||
extern void io_delay_init(void); | ||
|
||
#if defined(CONFIG_PARAVIRT) | ||
#include <asm/paravirt.h> | ||
#else | ||
# include "io_64.h" | ||
|
||
static inline void slow_down_io(void) | ||
{ | ||
native_io_delay(); | ||
#ifdef REALLY_SLOW_IO | ||
native_io_delay(); | ||
native_io_delay(); | ||
native_io_delay(); | ||
#endif | ||
} | ||
|
||
#endif | ||
|
||
#define BUILDIO(bwl, bw, type) \ | ||
static inline void out##bwl(unsigned type value, int port) \ | ||
{ \ | ||
asm volatile("out" #bwl " %" #bw "0, %w1" \ | ||
: : "a"(value), "Nd"(port)); \ | ||
} \ | ||
\ | ||
static inline unsigned type in##bwl(int port) \ | ||
{ \ | ||
unsigned type value; \ | ||
asm volatile("in" #bwl " %w1, %" #bw "0" \ | ||
: "=a"(value) : "Nd"(port)); \ | ||
return value; \ | ||
} \ | ||
\ | ||
static inline void out##bwl##_p(unsigned type value, int port) \ | ||
{ \ | ||
out##bwl(value, port); \ | ||
slow_down_io(); \ | ||
} \ | ||
\ | ||
static inline unsigned type in##bwl##_p(int port) \ | ||
{ \ | ||
unsigned type value = in##bwl(port); \ | ||
slow_down_io(); \ | ||
return value; \ | ||
} \ | ||
\ | ||
static inline void outs##bwl(int port, const void *addr, unsigned long count) \ | ||
{ \ | ||
asm volatile("rep; outs" #bwl \ | ||
: "+S"(addr), "+c"(count) : "d"(port)); \ | ||
} \ | ||
\ | ||
static inline void ins##bwl(int port, void *addr, unsigned long count) \ | ||
{ \ | ||
asm volatile("rep; ins" #bwl \ | ||
: "+D"(addr), "+c"(count) : "d"(port)); \ | ||
} | ||
|
||
BUILDIO(b, b, char) | ||
BUILDIO(w, w, short) | ||
BUILDIO(l, , int) | ||
|
||
extern void *xlate_dev_mem_ptr(unsigned long phys); | ||
extern void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | ||
|
Oops, something went wrong.