#include #include "include/ztypes.h" #include "object/kernel_object.h" class PciPort; class PciPortBound; template <> struct KernelObjectTag { static const uint64_t type = KernelObject::PCI_CAP; }; class PciPort : public KernelObject { public: static uint64_t DefaultPermissions() { return kZionPerm_Write | kZionPerm_Read | kZionPerm_Duplicate | kZionPerm_Transmit; } uint64_t TypeTag() override { return KernelObject::PCI_CAP; } static glcr::RefPtr Create() { return glcr::AdoptPtr(new PciPort); } uint32_t ReadAtOffset(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset); private: PciPort() {} }; template <> struct KernelObjectTag { static const uint64_t type = KernelObject::PCI_BOUND_CAP; }; class PciPortBound : public KernelObject { public: static uint64_t DefaultPermissions() { return kZionPerm_Write | kZionPerm_Read | kZionPerm_Duplicate; } uint64_t TypeTag() override { return KernelObject::PCI_BOUND_CAP; } static glcr::RefPtr Create(uint8_t bus, uint8_t slot, uint8_t func) { return glcr::AdoptPtr(new PciPortBound(bus, slot, func)); } uint32_t Read(uint8_t offset); void Write(uint8_t offset, uint32_t data); private: PciPortBound(uint8_t bus, uint8_t slot, uint8_t func) : bus_(bus), slot_(slot), func_(func) {} uint8_t bus_; uint8_t slot_; uint8_t func_; };