00001 #if !defined(__PCI_DEVICE_HPP__) 00002 #define __PCI_DEVICE_HPP__ 00003 00004 // 00005 // local includes 00006 // 00007 #include "pci_ioregion.hpp" 00008 00013 struct pci_device 00014 { 00019 struct search_result 00020 { 00024 const pci_ioregion *region; 00025 00030 short region_num; 00031 00032 inline search_result(const pci_ioregion *region=nullptr, short region_num=-1) 00033 : region(region), region_num(region_num) 00034 {} 00035 00040 inline bool is_valid(void) const 00041 { 00042 return region && (region_num >= 0); 00043 } 00044 }; 00045 00049 virtual inline ~pci_device(void) 00050 {} 00051 00055 static inline const char *class_name(void) 00056 { 00057 return "PCI device"; 00058 } 00059 00063 virtual const char *name(void) const = 0; 00064 00069 virtual int reset(void) = 0; 00070 00071 // 00072 // I/O region functions: get & search regions 00073 // 00077 virtual const pci_ioregion *get_ioregion(uint8_t region_num) const = 0; 00078 00084 virtual const search_result search_ioregion(enum pci_ioregion::type type, 00085 l4_gpa_t base, l4_gpa_t size=1) const = 0; 00086 00087 // 00088 // PCI configuration space access handlers 00089 // 00093 virtual const pci_config_header64 &get_config_space(void) const = 0; 00094 00100 virtual l4_umword_t read_config_space(pci_config_header16::offset_t offset, 00101 access_size access_size) = 0; 00102 00107 virtual int write_config_space(pci_config_header16::offset_t offset, 00108 l4_umword_t data, access_size access_size) = 0; 00109 }; 00110 00111 #endif 00112 00113 // ***** end of source ***** // 00114