efi_io.c File Reference

gPXE I/O API for EFI More...

#include <assert.h>
#include <gpxe/io.h>
#include <gpxe/efi/efi.h>
#include <gpxe/efi/Protocol/CpuIo.h>
#include <gpxe/efi/efi_io.h>

Go to the source code of this file.

Defines

#define MAX_PORT_ADDRESS   0xffff
 Maximum address that can be used for port I/O.
#define IS_PORT_ADDRESS(io_addr)   ( ( ( intptr_t ) (io_addr) ) <= MAX_PORT_ADDRESS )
 Determine whether or not address is a port I/O address.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 EFI_REQUIRE_PROTOCOL (EFI_CPU_IO_PROTOCOL,&cpu_io)
static EFI_CPU_IO_PROTOCOL_WIDTH efi_width (size_t size)
 Determine EFI CPU I/O width code.
unsigned long long efi_ioread (volatile void *io_addr, size_t size)
 Read from device.
void efi_iowrite (unsigned long long data, volatile void *io_addr, size_t size)
 Write to device.
void efi_ioreads (volatile void *io_addr, void *data, size_t size, unsigned int count)
 String read from device.
void efi_iowrites (volatile void *io_addr, const void *data, size_t size, unsigned int count)
 String write to device.
static void efi_iodelay (void)
 Wait for I/O-mapped operation to complete.
 PROVIDE_IOAPI_INLINE (efi, phys_to_bus)
 PROVIDE_IOAPI_INLINE (efi, bus_to_phys)
 PROVIDE_IOAPI_INLINE (efi, ioremap)
 PROVIDE_IOAPI_INLINE (efi, iounmap)
 PROVIDE_IOAPI_INLINE (efi, io_to_bus)
 PROVIDE_IOAPI_INLINE (efi, readb)
 PROVIDE_IOAPI_INLINE (efi, readw)
 PROVIDE_IOAPI_INLINE (efi, readl)
 PROVIDE_IOAPI_INLINE (efi, readq)
 PROVIDE_IOAPI_INLINE (efi, writeb)
 PROVIDE_IOAPI_INLINE (efi, writew)
 PROVIDE_IOAPI_INLINE (efi, writel)
 PROVIDE_IOAPI_INLINE (efi, writeq)
 PROVIDE_IOAPI_INLINE (efi, inb)
 PROVIDE_IOAPI_INLINE (efi, inw)
 PROVIDE_IOAPI_INLINE (efi, inl)
 PROVIDE_IOAPI_INLINE (efi, outb)
 PROVIDE_IOAPI_INLINE (efi, outw)
 PROVIDE_IOAPI_INLINE (efi, outl)
 PROVIDE_IOAPI_INLINE (efi, insb)
 PROVIDE_IOAPI_INLINE (efi, insw)
 PROVIDE_IOAPI_INLINE (efi, insl)
 PROVIDE_IOAPI_INLINE (efi, outsb)
 PROVIDE_IOAPI_INLINE (efi, outsw)
 PROVIDE_IOAPI_INLINE (efi, outsl)
 PROVIDE_IOAPI (efi, iodelay, efi_iodelay)
 PROVIDE_IOAPI_INLINE (efi, mb)

Variables

static EFI_CPU_IO_PROTOCOLcpu_io
 CPU I/O protocol.


Detailed Description

gPXE I/O API for EFI

Definition in file efi_io.c.


Define Documentation

#define MAX_PORT_ADDRESS   0xffff

Maximum address that can be used for port I/O.

Definition at line 38 of file efi_io.c.

#define IS_PORT_ADDRESS ( io_addr   )     ( ( ( intptr_t ) (io_addr) ) <= MAX_PORT_ADDRESS )

Determine whether or not address is a port I/O address.

Parameters:
io_addr I/O address
is_port I/O address is a port I/O address

Definition at line 46 of file efi_io.c.

Referenced by efi_ioread(), efi_ioreads(), efi_iowrite(), and efi_iowrites().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

EFI_REQUIRE_PROTOCOL ( EFI_CPU_IO_PROTOCOL  ,
cpu_io 
)

static EFI_CPU_IO_PROTOCOL_WIDTH efi_width ( size_t  size  )  [static]

Determine EFI CPU I/O width code.

Parameters:
size Size of value
Return values:
width EFI width code
Someone at Intel clearly gets paid by the number of lines of code they write. No-one should ever be able to make I/O this convoluted. The EFI_CPU_IO_PROTOCOL_WIDTH enum is my favourite idiocy.

Definition at line 60 of file efi_io.c.

References assert, EfiCpuIoWidthFifoUint16, EfiCpuIoWidthFifoUint32, EfiCpuIoWidthFifoUint64, EfiCpuIoWidthFifoUint8, and EfiCpuIoWidthMaximum.

Referenced by efi_ioread(), efi_ioreads(), efi_iowrite(), and efi_iowrites().

00060                                                            {
00061         switch ( size ) {
00062         case 1 :        return EfiCpuIoWidthFifoUint8;
00063         case 2 :        return EfiCpuIoWidthFifoUint16;
00064         case 4 :        return EfiCpuIoWidthFifoUint32;
00065         case 8 :        return EfiCpuIoWidthFifoUint64;
00066         default :
00067                 assert ( 0 );
00068                 /* I wonder what this will actually do... */
00069                 return EfiCpuIoWidthMaximum;
00070         }
00071 }

unsigned long long efi_ioread ( volatile void *  io_addr,
size_t  size 
)

Read from device.

Parameters:
io_addr I/O address
size Size of value
Return values:
data Value read

Definition at line 80 of file efi_io.c.

References DBG, efi_strerror(), efi_width(), _EFI_CPU_IO_PROTOCOL::Io, IS_PORT_ADDRESS, _EFI_CPU_IO_PROTOCOL::Mem, and EFI_CPU_IO_PROTOCOL_ACCESS::Read.

00080                                                                       {
00081         EFI_CPU_IO_PROTOCOL_IO_MEM read;
00082         unsigned long long data = 0;
00083         EFI_STATUS efirc;
00084 
00085         read = ( IS_PORT_ADDRESS ( io_addr ) ?
00086                  cpu_io->Io.Read : cpu_io->Mem.Read );
00087 
00088         if ( ( efirc = read ( cpu_io, efi_width ( size ),
00089                               ( intptr_t ) io_addr, 1,
00090                               ( void * ) &data ) ) != 0 ) {
00091                 DBG ( "EFI I/O read at %p failed: %s\n",
00092                       io_addr, efi_strerror ( efirc ) );
00093                 return -1ULL;
00094         }
00095 
00096         return data;
00097 }

void efi_iowrite ( unsigned long long  data,
volatile void *  io_addr,
size_t  size 
)

Write to device.

Parameters:
data Value to write
io_addr I/O address
size Size of value

Definition at line 106 of file efi_io.c.

References DBG, efi_strerror(), efi_width(), _EFI_CPU_IO_PROTOCOL::Io, IS_PORT_ADDRESS, _EFI_CPU_IO_PROTOCOL::Mem, and EFI_CPU_IO_PROTOCOL_ACCESS::Write.

00107                                  {
00108         EFI_CPU_IO_PROTOCOL_IO_MEM write;
00109         EFI_STATUS efirc;
00110 
00111         write = ( IS_PORT_ADDRESS ( io_addr ) ?
00112                   cpu_io->Io.Write : cpu_io->Mem.Write );
00113 
00114         if ( ( efirc = write ( cpu_io, efi_width ( size ),
00115                                ( intptr_t ) io_addr, 1,
00116                                ( void * ) &data ) ) != 0 ) {
00117                 DBG ( "EFI I/O write at %p failed: %s\n",
00118                       io_addr, efi_strerror ( efirc ) );
00119         }
00120 }

void efi_ioreads ( volatile void *  io_addr,
void *  data,
size_t  size,
unsigned int  count 
)

String read from device.

Parameters:
io_addr I/O address
data Data buffer
size Size of values
count Number of values to read

Definition at line 130 of file efi_io.c.

References DBG, efi_strerror(), efi_width(), _EFI_CPU_IO_PROTOCOL::Io, IS_PORT_ADDRESS, _EFI_CPU_IO_PROTOCOL::Mem, and EFI_CPU_IO_PROTOCOL_ACCESS::Read.

00131                                                      {
00132         EFI_CPU_IO_PROTOCOL_IO_MEM read;
00133         EFI_STATUS efirc;
00134 
00135         read = ( IS_PORT_ADDRESS ( io_addr ) ?
00136                  cpu_io->Io.Read : cpu_io->Mem.Read );
00137 
00138         if ( ( efirc = read ( cpu_io, efi_width ( size ),
00139                               ( intptr_t ) io_addr, count,
00140                               ( void * ) data ) ) != 0 ) {
00141                 DBG ( "EFI I/O string read at %p failed: %s\n",
00142                       io_addr, efi_strerror ( efirc ) );
00143         }
00144 }

void efi_iowrites ( volatile void *  io_addr,
const void *  data,
size_t  size,
unsigned int  count 
)

String write to device.

Parameters:
io_addr I/O address
data Data buffer
size Size of values
count Number of values to write

Definition at line 154 of file efi_io.c.

References DBG, efi_strerror(), efi_width(), _EFI_CPU_IO_PROTOCOL::Io, IS_PORT_ADDRESS, _EFI_CPU_IO_PROTOCOL::Mem, and EFI_CPU_IO_PROTOCOL_ACCESS::Write.

00155                                                       {
00156         EFI_CPU_IO_PROTOCOL_IO_MEM write;
00157         EFI_STATUS efirc;
00158 
00159         write = ( IS_PORT_ADDRESS ( io_addr ) ?
00160                  cpu_io->Io.Write : cpu_io->Mem.Write );
00161 
00162         if ( ( efirc = write ( cpu_io, efi_width ( size ),
00163                                ( intptr_t ) io_addr, count,
00164                                ( void * ) data ) ) != 0 ) {
00165                 DBG ( "EFI I/O write at %p failed: %s\n",
00166                       io_addr, efi_strerror ( efirc ) );
00167         }
00168 }

static void efi_iodelay ( void   )  [static]

Wait for I/O-mapped operation to complete.

Definition at line 174 of file efi_io.c.

References outb.

00174                                  {
00175         /* Write to non-existent port.  Probably x86-only. */
00176         outb ( 0, 0x80 );
00177 }

PROVIDE_IOAPI_INLINE ( efi  ,
phys_to_bus   
)

PROVIDE_IOAPI_INLINE ( efi  ,
bus_to_phys   
)

PROVIDE_IOAPI_INLINE ( efi  ,
ioremap   
)

PROVIDE_IOAPI_INLINE ( efi  ,
iounmap   
)

PROVIDE_IOAPI_INLINE ( efi  ,
io_to_bus   
)

PROVIDE_IOAPI_INLINE ( efi  ,
readb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
readw   
)

PROVIDE_IOAPI_INLINE ( efi  ,
readl   
)

PROVIDE_IOAPI_INLINE ( efi  ,
readq   
)

PROVIDE_IOAPI_INLINE ( efi  ,
writeb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
writew   
)

PROVIDE_IOAPI_INLINE ( efi  ,
writel   
)

PROVIDE_IOAPI_INLINE ( efi  ,
writeq   
)

PROVIDE_IOAPI_INLINE ( efi  ,
inb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
inw   
)

PROVIDE_IOAPI_INLINE ( efi  ,
inl   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outw   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outl   
)

PROVIDE_IOAPI_INLINE ( efi  ,
insb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
insw   
)

PROVIDE_IOAPI_INLINE ( efi  ,
insl   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outsb   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outsw   
)

PROVIDE_IOAPI_INLINE ( efi  ,
outsl   
)

PROVIDE_IOAPI ( efi  ,
iodelay  ,
efi_iodelay   
)

PROVIDE_IOAPI_INLINE ( efi  ,
mb   
)


Variable Documentation

CPU I/O protocol.

Definition at line 34 of file efi_io.c.


Generated on Tue Apr 6 20:01:53 2010 for gPXE by  doxygen 1.5.7.1