From aef6d0df5cf4e4c917e44d6b145802fa206da246 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 12 Oct 2008 02:11:50 +0100 Subject: [PATCH] [ioapi] Absorb virt_to_phys() and phys_to_virt() into the I/O API --- src/arch/i386/core/x86_io.c | 7 +++- src/arch/i386/include/gpxe/x86_io.h | 30 ++++++++++----- src/arch/i386/include/virtaddr.h | 12 ------ src/include/gpxe/io.h | 60 +++++++++++++++++++---------- 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/src/arch/i386/core/x86_io.c b/src/arch/i386/core/x86_io.c index 926f1d60..1aab6c96 100644 --- a/src/arch/i386/core/x86_io.c +++ b/src/arch/i386/core/x86_io.c @@ -65,10 +65,13 @@ static void x86_writeq ( uint64_t data, volatile uint64_t *io_addr ) { : : "A" ( data ), "r" ( io_addr ) ); } -PROVIDE_IOAPI_INLINE ( x86, iounmap ); -PROVIDE_IOAPI_INLINE ( x86, io_to_bus ); +PROVIDE_IOAPI_INLINE ( x86, virt_to_phys ); +PROVIDE_IOAPI_INLINE ( x86, phys_to_virt ); PROVIDE_IOAPI_INLINE ( x86, virt_to_bus ); PROVIDE_IOAPI_INLINE ( x86, bus_to_virt ); +PROVIDE_IOAPI_INLINE ( x86, ioremap ); +PROVIDE_IOAPI_INLINE ( x86, iounmap ); +PROVIDE_IOAPI_INLINE ( x86, io_to_bus ); PROVIDE_IOAPI_INLINE ( x86, readb ); PROVIDE_IOAPI_INLINE ( x86, readw ); PROVIDE_IOAPI_INLINE ( x86, readl ); diff --git a/src/arch/i386/include/gpxe/x86_io.h b/src/arch/i386/include/gpxe/x86_io.h index 3a907f8b..8b9942e6 100644 --- a/src/arch/i386/include/gpxe/x86_io.h +++ b/src/arch/i386/include/gpxe/x86_io.h @@ -28,6 +28,26 @@ * */ +static inline __always_inline unsigned long +IOAPI_INLINE ( x86, virt_to_phys ) ( volatile const void *addr ) { + return ( ( ( unsigned long ) addr ) + virt_offset ); +} + +static inline __always_inline void * +IOAPI_INLINE ( x86, phys_to_virt ) ( unsigned long phys_addr ) { + return ( ( void * ) ( phys_addr - virt_offset ) ); +} + +static inline __always_inline unsigned long +IOAPI_INLINE ( x86, virt_to_bus ) ( volatile const void *addr ) { + return virt_to_phys ( addr ); +} + +static inline __always_inline void * +IOAPI_INLINE ( x86, bus_to_virt ) ( unsigned long bus_addr ) { + return phys_to_virt ( bus_addr ); +} + static inline __always_inline void * IOAPI_INLINE ( x86, ioremap ) ( unsigned long bus_addr, size_t len __unused ) { return phys_to_virt ( bus_addr ); @@ -43,16 +63,6 @@ IOAPI_INLINE ( x86, io_to_bus ) ( volatile const void *io_addr ) { return virt_to_phys ( io_addr ); } -static inline __always_inline unsigned long -IOAPI_INLINE ( x86, virt_to_bus ) ( volatile const void *addr ) { - return virt_to_phys ( addr ); -} - -static inline __always_inline void * -IOAPI_INLINE ( x86, bus_to_virt ) ( unsigned long bus_addr ) { - return phys_to_virt ( bus_addr ); -} - /* * MMIO reads and writes up to 32 bits * diff --git a/src/arch/i386/include/virtaddr.h b/src/arch/i386/include/virtaddr.h index 6c63b501..e7bb2cce 100644 --- a/src/arch/i386/include/virtaddr.h +++ b/src/arch/i386/include/virtaddr.h @@ -32,18 +32,6 @@ /* Variables in virtaddr.S */ extern unsigned long virt_offset; -/* - * Convert between virtual and physical addresses - * - */ -static inline unsigned long virt_to_phys ( volatile const void *virt_addr ) { - return ( ( unsigned long ) virt_addr ) + virt_offset; -} - -static inline void * phys_to_virt ( unsigned long phys_addr ) { - return ( void * ) ( phys_addr - virt_offset ); -} - #else /* KEEP_IT_REAL */ #include diff --git a/src/include/gpxe/io.h b/src/include/gpxe/io.h index 58755e6f..24cc180f 100644 --- a/src/include/gpxe/io.h +++ b/src/include/gpxe/io.h @@ -148,6 +148,46 @@ _func ( _io_addr, _data, _count ); \ } while ( 0 ) +/** + * Convert virtual address to a physical address + * + * @v addr Virtual address + * @ret phys_addr Physical address + */ +unsigned long virt_to_phys ( volatile const void *addr ); + +/** + * Convert physical address to a virtual address + * + * @v addr Virtual address + * @ret phys_addr Physical address + * + * This operation isn't actually valid within our memory model, and is + * impossible to achieve under -DKEEP_IT_REAL. Some drivers haven't + * been updated to avoid it yet, though. + */ +void * phys_to_virt ( unsigned long phys_addr ); + +/** + * Convert virtual address to a bus address + * + * @v addr Virtual address + * @ret bus_addr Bus address + */ +unsigned long virt_to_bus ( volatile const void *addr ); + +/** + * Convert bus address to a virtual address + * + * @v bus_addr Bus address + * @ret addr Virtual address + * + * This operation isn't actually valid within our memory model, and is + * impossible to achieve under -DKEEP_IT_REAL. Some drivers haven't + * been updated to avoid it yet, though. + */ +void * bus_to_virt ( unsigned long bus_addr ); + /** * Map bus address as an I/O address * @@ -172,26 +212,6 @@ void iounmap ( volatile const void *io_addr ); */ unsigned long io_to_bus ( volatile const void *io_addr ); -/** - * Convert virtual address to a bus address - * - * @v addr Virtual address - * @ret bus_addr Bus address - */ -unsigned long virt_to_bus ( volatile const void *addr ); - -/** - * Convert bus address to a virtual address - * - * @v bus_addr Bus address - * @ret addr Virtual address - * - * This operation isn't actually valid within our memory model, and is - * impossible to achieve under -DKEEP_IT_REAL. Some drivers haven't - * been updated to avoid it yet, though. - */ -void * bus_to_virt ( unsigned long bus_addr ); - /** * Read byte from memory-mapped device *