[ioapi] Absorb virt_to_phys() and phys_to_virt() into the I/O API
authorMichael Brown <mcb30@etherboot.org>
Sun, 12 Oct 2008 01:11:50 +0000 (02:11 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sun, 12 Oct 2008 01:15:34 +0000 (02:15 +0100)
src/arch/i386/core/x86_io.c
src/arch/i386/include/gpxe/x86_io.h
src/arch/i386/include/virtaddr.h
src/include/gpxe/io.h

index 926f1d6..1aab6c9 100644 (file)
@@ -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 );
index 3a907f8..8b9942e 100644 (file)
  *
  */
 
+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
  *
index 6c63b50..e7bb2cc 100644 (file)
 /* 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>
index 58755e6..24cc180 100644 (file)
        } 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
@@ -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
  *