Home | History | Annotate | Download | only in gpxe
      1 #ifndef _PCIDIRECT_H
      2 #define _PCIDIRECT_H
      3 
      4 FILE_LICENCE ( GPL2_OR_LATER );
      5 
      6 #include <stdint.h>
      7 #include <gpxe/io.h>
      8 
      9 #ifdef PCIAPI_DIRECT
     10 #define PCIAPI_PREFIX_direct
     11 #else
     12 #define PCIAPI_PREFIX_direct __direct_
     13 #endif
     14 
     15 /** @file
     16  *
     17  * PCI configuration space access via Type 1 accesses
     18  *
     19  */
     20 
     21 #define PCIDIRECT_CONFIG_ADDRESS	0xcf8
     22 #define PCIDIRECT_CONFIG_DATA		0xcfc
     23 
     24 struct pci_device;
     25 
     26 extern void pcidirect_prepare ( struct pci_device *pci, int where );
     27 
     28 /**
     29  * Determine maximum PCI bus number within system
     30  *
     31  * @ret max_bus		Maximum bus number
     32  */
     33 static inline __always_inline int
     34 PCIAPI_INLINE ( direct, pci_max_bus ) ( void ) {
     35 	/* No way to work this out via Type 1 accesses */
     36 	return 0xff;
     37 }
     38 
     39 /**
     40  * Read byte from PCI configuration space via Type 1 access
     41  *
     42  * @v pci	PCI device
     43  * @v where	Location within PCI configuration space
     44  * @v value	Value read
     45  * @ret rc	Return status code
     46  */
     47 static inline __always_inline int
     48 PCIAPI_INLINE ( direct, pci_read_config_byte ) ( struct pci_device *pci,
     49 						 unsigned int where,
     50 						 uint8_t *value ) {
     51 	pcidirect_prepare ( pci, where );
     52 	*value = inb ( PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
     53 	return 0;
     54 }
     55 
     56 /**
     57  * Read word from PCI configuration space via Type 1 access
     58  *
     59  * @v pci	PCI device
     60  * @v where	Location within PCI configuration space
     61  * @v value	Value read
     62  * @ret rc	Return status code
     63  */
     64 static inline __always_inline int
     65 PCIAPI_INLINE ( direct, pci_read_config_word ) ( struct pci_device *pci,
     66 						 unsigned int where,
     67 						 uint16_t *value ) {
     68 	pcidirect_prepare ( pci, where );
     69 	*value = inw ( PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
     70 	return 0;
     71 }
     72 
     73 /**
     74  * Read dword from PCI configuration space via Type 1 access
     75  *
     76  * @v pci	PCI device
     77  * @v where	Location within PCI configuration space
     78  * @v value	Value read
     79  * @ret rc	Return status code
     80  */
     81 static inline __always_inline int
     82 PCIAPI_INLINE ( direct, pci_read_config_dword ) ( struct pci_device *pci,
     83 						  unsigned int where,
     84 						  uint32_t *value ) {
     85 	pcidirect_prepare ( pci, where );
     86 	*value = inl ( PCIDIRECT_CONFIG_DATA );
     87 	return 0;
     88 }
     89 
     90 /**
     91  * Write byte to PCI configuration space via Type 1 access
     92  *
     93  * @v pci	PCI device
     94  * @v where	Location within PCI configuration space
     95  * @v value	Value to be written
     96  * @ret rc	Return status code
     97  */
     98 static inline __always_inline int
     99 PCIAPI_INLINE ( direct, pci_write_config_byte ) ( struct pci_device *pci,
    100 						  unsigned int where,
    101 						  uint8_t value ) {
    102 	pcidirect_prepare ( pci, where );
    103 	outb ( value, PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
    104 	return 0;
    105 }
    106 
    107 /**
    108  * Write word to PCI configuration space via Type 1 access
    109  *
    110  * @v pci	PCI device
    111  * @v where	Location within PCI configuration space
    112  * @v value	Value to be written
    113  * @ret rc	Return status code
    114  */
    115 static inline __always_inline int
    116 PCIAPI_INLINE ( direct, pci_write_config_word ) ( struct pci_device *pci,
    117 						  unsigned int where,
    118 						  uint16_t value ) {
    119 	pcidirect_prepare ( pci, where );
    120 	outw ( value, PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
    121 	return 0;
    122 }
    123 
    124 /**
    125  * Write dword to PCI configuration space via Type 1 access
    126  *
    127  * @v pci	PCI device
    128  * @v where	Location within PCI configuration space
    129  * @v value	Value to be written
    130  * @ret rc	Return status code
    131  */
    132 static inline __always_inline int
    133 PCIAPI_INLINE ( direct, pci_write_config_dword ) ( struct pci_device *pci,
    134 						   unsigned int where,
    135 						   uint32_t value ) {
    136 	pcidirect_prepare ( pci, where );
    137 	outl ( value, PCIDIRECT_CONFIG_DATA );
    138 	return 0;
    139 }
    140 
    141 #endif /* _PCIDIRECT_H */
    142