std::string hw::PCI_Device::to_string() const { std::stringstream str; str << PCI::classcode_str(classcode()) << ", " << PCI::vendor_str((PCI::vendor_t)vendor_id()) << std::hex << " ("<< vendor_id() << " / " << product_id() << ")"; return str.str(); };
std::string hw::PCI_Device::to_string() const { char buffer[512]; int len = snprintf(buffer, sizeof(buffer), "%s %s (V %#x / P %#x)", PCI::classcode_str(classcode()), PCI::vendor_str((PCI::vendor_t)vendor_id()), vendor_id(), product_id()); return std::string(buffer, len); }
PCI_Device::PCI_Device(const uint16_t pci_addr, const uint32_t device_id, const uint32_t devclass) : pci_addr_{pci_addr}, device_id_{device_id} { // set master, mem and io flags uint32_t cmd = read_dword(PCI_CMD_REG); cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEM | PCI_COMMAND_IO; write_dword(PCI_CMD_REG, cmd); // device class info is coming from pci manager to save a PCI read this->devtype_.reg = devclass; INFO2("|"); switch (PCI::classcode(devtype_.classcode)) { case PCI::classcode::BRIDGE: INFO2("+--[ %s, %s, %s (0x%x) ]", PCI::classcode_str(classcode()), PCI::vendor_str(vendor_id()), bridge_subclasses[devtype_.subclass < SS_BR ? devtype_.subclass : SS_BR-1], devtype_.subclass); break; case PCI::classcode::NIC: INFO2("+--[ %s, %s, %s (0x%x) ]", PCI::classcode_str(devtype_.classcode), PCI::vendor_str(vendor_id()), nic_subclasses[devtype_.subclass < SS_NIC ? devtype_.subclass : SS_NIC-1], devtype_.subclass); break; default: INFO2("+--[ %s, %s ]", PCI::classcode_str(devtype_.classcode), PCI::vendor_str(vendor_id())); } //< switch (devtype_.classcode) // bridges are different from other PCI devices if (classcode() == PCI::classcode::BRIDGE) return; }