Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[ioapi] Absorb virt_to_phys() and phys_to_virt() into the I/O API
  • Loading branch information
Michael Brown committed Oct 12, 2008
1 parent 992bbf3 commit aef6d0d
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 39 deletions.
7 changes: 5 additions & 2 deletions src/arch/i386/core/x86_io.c
Expand Up @@ -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 );
Expand Down
30 changes: 20 additions & 10 deletions src/arch/i386/include/gpxe/x86_io.h
Expand Up @@ -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 );
Expand All @@ -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
*
Expand Down
12 changes: 0 additions & 12 deletions src/arch/i386/include/virtaddr.h
Expand Up @@ -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 <stdint.h>
Expand Down
50 changes: 35 additions & 15 deletions src/include/gpxe/io.h
Expand Up @@ -149,28 +149,24 @@
} while ( 0 )

/**
* Map bus address as an I/O address
* Convert virtual address to a physical address
*
* @v bus_addr Bus address
* @v len Length of region
* @ret io_addr I/O address
* @v addr Virtual address
* @ret phys_addr Physical address
*/
void * ioremap ( unsigned long bus_addr, size_t len );
unsigned long virt_to_phys ( volatile const void *addr );

/**
* Unmap I/O address
* Convert physical address to a virtual address
*
* @v io_addr I/O address
*/
void iounmap ( volatile const void *io_addr );

/**
* Convert I/O address to bus address (for debug only)
* @v addr Virtual address
* @ret phys_addr Physical address
*
* @v io_addr I/O address
* @ret bus_addr Bus 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.
*/
unsigned long io_to_bus ( volatile const void *io_addr );
void * phys_to_virt ( unsigned long phys_addr );

/**
* Convert virtual address to a bus address
Expand All @@ -192,6 +188,30 @@ unsigned long virt_to_bus ( volatile const void *addr );
*/
void * bus_to_virt ( unsigned long bus_addr );

/**
* Map bus address as an I/O address
*
* @v bus_addr Bus address
* @v len Length of region
* @ret io_addr I/O address
*/
void * ioremap ( unsigned long bus_addr, size_t len );

/**
* Unmap I/O address
*
* @v io_addr I/O address
*/
void iounmap ( volatile const void *io_addr );

/**
* Convert I/O address to bus address (for debug only)
*
* @v io_addr I/O address
* @ret bus_addr Bus address
*/
unsigned long io_to_bus ( volatile const void *io_addr );

/**
* Read byte from memory-mapped device
*
Expand Down

0 comments on commit aef6d0d

Please sign in to comment.