iPXE
Functions
pcibios.c File Reference

PCI configuration space access via PCI BIOS. More...

#include <stdint.h>
#include <ipxe/pci.h>
#include <realmode.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static int pcibios_num_bus (void)
 Determine number of PCI buses within system.
int pcibios_read (struct pci_device *pci, uint32_t command, uint32_t *value)
 Read configuration space via PCI BIOS.
int pcibios_write (struct pci_device *pci, uint32_t command, uint32_t value)
 Write configuration space via PCI BIOS.
 PROVIDE_PCIAPI (pcbios, pci_num_bus, pcibios_num_bus)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_read_config_byte)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_read_config_word)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_read_config_dword)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_write_config_byte)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_write_config_word)
 PROVIDE_PCIAPI_INLINE (pcbios, pci_write_config_dword)

Detailed Description

PCI configuration space access via PCI BIOS.

Definition in file pcibios.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static int pcibios_num_bus ( void  ) [static]

Determine number of PCI buses within system.

Return values:
num_busNumber of buses

Definition at line 41 of file pcibios.c.

References __asm__(), PCIBIOS_INSTALLATION_CHECK, and REAL_CODE.

                                    {
        int discard_a, discard_D;
        uint8_t max_bus;

        /* We issue this call using flat real mode, to work around a
         * bug in some HP BIOSes.
         */
        __asm__ __volatile__ ( REAL_CODE ( "call flatten_real_mode\n\t"
                                           "stc\n\t"
                                           "int $0x1a\n\t"
                                           "jnc 1f\n\t"
                                           "xorw %%cx, %%cx\n\t"
                                           "\n1:\n\t" )
                               : "=c" ( max_bus ), "=a" ( discard_a ),
                                 "=D" ( discard_D )
                               : "a" ( PCIBIOS_INSTALLATION_CHECK >> 16 ),
                                 "D" ( 0 )
                               : "ebx", "edx" );

        return ( max_bus + 1 );
}
int pcibios_read ( struct pci_device pci,
uint32_t  command,
uint32_t value 
)

Read configuration space via PCI BIOS.

Parameters:
pciPCI device
commandPCI BIOS command
valueValue read
Return values:
rcReturn status code

Definition at line 71 of file pcibios.c.

References __asm__(), pci_device::busdevfn, REAL_CODE, and status.

                                                                              {
        int discard_b, discard_D;
        uint16_t status;

        __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
                                           "int $0x1a\n\t"
                                           "jnc 1f\n\t"
                                           "xorl %%eax, %%eax\n\t"
                                           "decl %%eax\n\t"
                                           "movl %%eax, %%ecx\n\t"
                                           "\n1:\n\t" )
                               : "=a" ( status ), "=b" ( discard_b ),
                                 "=c" ( *value ), "=D" ( discard_D )
                               : "a" ( command >> 16 ), "D" ( command ),
                                 "b" ( pci->busdevfn )
                               : "edx" );

        return ( status >> 8 );
}
int pcibios_write ( struct pci_device pci,
uint32_t  command,
uint32_t  value 
)

Write configuration space via PCI BIOS.

Parameters:
pciPCI device
commandPCI BIOS command
valueValue to be written
Return values:
rcReturn status code

Definition at line 99 of file pcibios.c.

References __asm__(), pci_device::busdevfn, REAL_CODE, and status.

                                                                              {
        int discard_b, discard_c, discard_D;
        uint16_t status;

        __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
                                           "int $0x1a\n\t"
                                           "jnc 1f\n\t"
                                           "movb $0xff, %%ah\n\t"
                                           "\n1:\n\t" )
                               : "=a" ( status ), "=b" ( discard_b ),
                                 "=c" ( discard_c ), "=D" ( discard_D )
                               : "a" ( command >> 16 ), "D" ( command ),
                                 "b" ( pci->busdevfn ), "c" ( value )
                               : "edx" );
        
        return ( status >> 8 );
}
PROVIDE_PCIAPI ( pcbios  ,
pci_num_bus  ,
pcibios_num_bus   
)