2008-10-23 09:26:29 +04:00
# ifndef _ASM_X86_IO_H
# define _ASM_X86_IO_H
2008-03-19 03:00:15 +03:00
2008-03-19 03:00:24 +03:00
# define ARCH_HAS_IOREMAP_WC
2008-05-27 20:47:13 +04:00
# include <linux/compiler.h>
2008-11-30 11:16:04 +03:00
# include <asm-generic/int-ll64.h>
2009-02-07 00:29:44 +03:00
# include <asm/page.h>
2008-05-27 20:47:13 +04:00
# define build_mmio_read(name, size, type, reg, barrier) \
static inline type name ( const volatile void __iomem * addr ) \
2008-08-13 23:07:07 +04:00
{ type ret ; asm volatile ( " mov " size " %1,%0 " : reg ( ret ) \
2008-05-27 20:47:13 +04:00
: " m " ( * ( volatile type __force * ) addr ) barrier ) ; return ret ; }
# define build_mmio_write(name, size, type, reg, barrier) \
static inline void name ( type val , volatile void __iomem * addr ) \
{ asm volatile ( " mov " size " %0,%1 " : : reg ( val ) , \
" m " ( * ( volatile type __force * ) addr ) barrier ) ; }
2008-08-13 23:07:07 +04:00
build_mmio_read ( readb , " b " , unsigned char , " =q " , : " memory " )
build_mmio_read ( readw , " w " , unsigned short , " =r " , : " memory " )
build_mmio_read ( readl , " l " , unsigned int , " =r " , : " memory " )
2008-05-27 20:47:13 +04:00
2008-08-13 23:07:07 +04:00
build_mmio_read ( __readb , " b " , unsigned char , " =q " , )
build_mmio_read ( __readw , " w " , unsigned short , " =r " , )
build_mmio_read ( __readl , " l " , unsigned int , " =r " , )
2008-05-27 20:47:13 +04:00
build_mmio_write ( writeb , " b " , unsigned char , " q " , : " memory " )
build_mmio_write ( writew , " w " , unsigned short , " r " , : " memory " )
build_mmio_write ( writel , " l " , unsigned int , " r " , : " memory " )
build_mmio_write ( __writeb , " b " , unsigned char , " q " , )
build_mmio_write ( __writew , " w " , unsigned short , " r " , )
build_mmio_write ( __writel , " l " , unsigned int , " r " , )
# define readb_relaxed(a) __readb(a)
# define readw_relaxed(a) __readw(a)
# define readl_relaxed(a) __readl(a)
# define __raw_readb __readb
# define __raw_readw __readw
# define __raw_readl __readl
# define __raw_writeb __writeb
# define __raw_writew __writew
# define __raw_writel __writel
# define mmiowb() barrier()
# ifdef CONFIG_X86_64
2008-11-30 12:20:20 +03:00
2008-08-13 23:07:07 +04:00
build_mmio_read ( readq , " q " , unsigned long , " =r " , : " memory " )
2008-05-27 20:47:13 +04:00
build_mmio_write ( writeq , " q " , unsigned long , " r " , : " memory " )
2008-11-30 12:20:20 +03:00
# else
2008-11-30 11:16:04 +03:00
static inline __u64 readq ( const volatile void __iomem * addr )
{
const volatile u32 __iomem * p = addr ;
2008-11-30 11:33:55 +03:00
u32 low , high ;
2008-11-30 11:16:04 +03:00
2008-11-30 11:33:55 +03:00
low = readl ( p ) ;
high = readl ( p + 1 ) ;
2008-11-30 11:16:04 +03:00
2008-11-30 11:33:55 +03:00
return low + ( ( u64 ) high < < 32 ) ;
2008-11-30 11:16:04 +03:00
}
static inline void writeq ( __u64 val , volatile void __iomem * addr )
{
writel ( val , addr ) ;
writel ( val > > 32 , addr + 4 ) ;
}
2008-11-30 11:33:55 +03:00
# endif
2008-11-30 12:20:20 +03:00
# define readq_relaxed(a) readq(a)
# define __raw_readq(a) readq(a)
# define __raw_writeq(val, addr) writeq(val, addr)
2008-11-30 11:33:55 +03:00
/* Let people know that we have them */
2008-11-30 12:20:20 +03:00
# define readq readq
# define writeq writeq
2008-11-30 11:16:04 +03:00
2009-02-07 00:29:44 +03:00
/**
* virt_to_phys - map virtual addresses to physical
* @ address : address to remap
*
* The returned physical address is the physical ( CPU ) mapping for
* the memory address given . It is only valid to use this function on
* addresses directly mapped or allocated via kmalloc .
*
* This function does not give bus mappings for DMA transfers . In
* almost all conceivable cases a device driver should not be using
* this function
*/
static inline phys_addr_t virt_to_phys ( volatile void * address )
{
return __pa ( address ) ;
}
/**
* phys_to_virt - map physical address to virtual
* @ address : address to remap
*
* The returned virtual address is a current CPU mapping for
* the memory address given . It is only valid to use this function on
* addresses that have a kernel mapping
*
* This function does not handle bus mappings for DMA transfers . In
* almost all conceivable cases a device driver should not be using
* this function
*/
static inline void * phys_to_virt ( phys_addr_t address )
{
return __va ( address ) ;
}
/*
* Change " struct page " to physical address .
*/
# define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
/*
* ISA I / O bus memory addresses are 1 : 1 with the physical address .
*/
# define isa_virt_to_bus virt_to_phys
# define isa_page_to_bus page_to_phys
# define isa_bus_to_virt phys_to_virt
/*
* However PCI ones are not necessarily 1 : 1 and therefore these interfaces
* are forbidden in portable PCI drivers .
*
* Allow them on x86 for legacy drivers , though .
*/
# define virt_to_bus virt_to_phys
# define bus_to_virt phys_to_virt
2007-10-11 13:20:03 +04:00
# ifdef CONFIG_X86_32
# include "io_32.h"
# else
# include "io_64.h"
# endif
2008-03-19 03:00:15 +03:00
extern void * xlate_dev_mem_ptr ( unsigned long phys ) ;
extern void unxlate_dev_mem_ptr ( unsigned long phys , void * addr ) ;
2008-03-19 03:00:16 +03:00
extern int ioremap_change_attr ( unsigned long vaddr , unsigned long size ,
unsigned long prot_val ) ;
2008-03-23 11:02:25 +03:00
extern void __iomem * ioremap_wc ( unsigned long offset , unsigned long size ) ;
2008-03-19 03:00:16 +03:00
2008-06-25 08:19:03 +04:00
/*
* early_ioremap ( ) and early_iounmap ( ) are for temporary early boot - time
* mappings , before the real ioremap ( ) is functional .
* A boot - time mapping is currently limited to at most 16 pages .
*/
extern void early_ioremap_init ( void ) ;
extern void early_ioremap_reset ( void ) ;
2008-10-29 08:46:04 +03:00
extern void __iomem * early_ioremap ( unsigned long offset , unsigned long size ) ;
extern void __iomem * early_memremap ( unsigned long offset , unsigned long size ) ;
extern void early_iounmap ( void __iomem * addr , unsigned long size ) ;
2008-06-25 08:19:03 +04:00
extern void __iomem * fix_ioremap ( unsigned idx , unsigned long phys ) ;
2008-10-23 09:26:29 +04:00
# endif /* _ASM_X86_IO_H */