00001 #if !defined(__PCI_BRIDGE_BASE_HPP__) 00002 #define __PCI_BRIDGE_BASE_HPP__ 00003 00004 // 00005 // local includes 00006 // 00007 #include "core/machine/generic/device_container.hpp" 00008 #include "pci_bridge.hpp" 00009 #include "pci_devfn.hpp" 00010 00016 struct pci_bridge_base : public pci_bridge, public device_container<pci_device> 00017 { 00021 static const uint8_t MAX_DEVICES = 32; 00022 00023 // 00024 // constructor 00025 // 00026 pci_bridge_base(void) 00027 : device_container<pci_device>(MAX_DEVICES, false) 00028 {} 00029 00030 virtual inline int reset(void) 00031 { 00032 return device_container<pci_device>::reset_devices(); 00033 } 00034 00035 // 00036 // pci_bridge: override device management functions to disambuigate calls 00037 // 00038 virtual inline int register_device(pci_device *device) 00039 { 00040 return device_container<pci_device>::register_device(device); 00041 } 00042 00043 virtual inline int unregister_device(const pci_device *device) 00044 { 00045 return device_container<pci_device>::unregister_device(device); 00046 } 00047 00048 // 00049 // pci_bridge: override device management functions 00050 // 00051 virtual inline pci_device *get_device(const pci_devfn devfn) const 00052 { 00053 return (devfn.fn) ? nullptr : 00054 (devfn.dev < devices.size()) ? devices[devfn.dev] : nullptr; 00055 } 00056 00057 // 00058 // pci_bridge: override search region functions 00059 // 00060 virtual inline const search_result search_ioregion(enum pci_ioregion::type type, 00061 l4_gpa_t base, l4_gpa_t size=1) const 00062 { 00063 for (collection_type::const_iterator it=begin(); it != end(); it++) 00064 if (*it) { 00065 const pci_device::search_result result=(*it)->search_ioregion(type, base, size); 00066 if (result.is_valid()) return search_result(*it, result); 00067 } 00068 00069 return search_result(); 00070 } 00071 }; 00072 00073 #endif 00074 00075 // ***** end of source ***** // 00076