Overview   API Reference  

pci_bridge_base.hpp

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 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008