2121#include < cstdint>
2222#include < common>
2323#include < vector>
24+ #include < unordered_map>
2425
2526#define PCI_CAP_ID_AF 0x13 /* PCI Advanced Features */
2627#define PCI_CAP_ID_MAX PCI_CAP_ID_AF
@@ -43,6 +44,9 @@ namespace PCI {
4344
4445 static const uint32_t WTF {~0x0U };
4546
47+ static const uint32_t SOLO5_NET_DUMMY_ADDR {0xFFFE };
48+ static const uint32_t SOLO5_BLK_DUMMY_ADDR {0xFFFF };
49+
4650 /* *
4751 * @brief PCI device message format
4852 *
@@ -71,7 +75,7 @@ namespace PCI {
7175 }; // < union msg
7276
7377 /* * Relevant class codes (many more) */
74- enum classcode_t {
78+ enum classcode : uint8_t {
7579 OLD = 0 ,
7680 STORAGE,
7781 NIC,
@@ -91,17 +95,23 @@ namespace PCI {
9195 ENCRYPTION,
9296 SIGPRO,
9397 OTHER=255
98+
99+
94100 }; // < enum classcode_t
95101
96- enum {
102+ enum vendor_t : uint16_t {
97103 VENDOR_AMD = 0x1022 ,
98104 VENDOR_INTEL = 0x8086 ,
99105 VENDOR_CIRRUS = 0x1013 ,
100106 VENDOR_VIRTIO = 0x1AF4 ,
101107 VENDOR_REALTEK = 0x10EC ,
102108 VENDOR_VMWARE = 0x15AD ,
109+ VENDOR_SOLO5 = 0x5050 ,
103110 };
104111
112+ static inline const char * classcode_str (uint8_t code);
113+ static inline const char * vendor_str (uint16_t code);
114+
105115 struct Resource {
106116 int type;
107117 uint32_t start;
@@ -117,6 +127,8 @@ namespace PCI {
117127} // < namespace PCI
118128
119129namespace hw {
130+
131+
120132struct msix_t ;
121133 /* *
122134 * @brief Communication class for all PCI devices
@@ -247,6 +259,8 @@ struct msix_t;
247259 };
248260 };
249261
262+ inline std::string to_string () const ;
263+
250264 private:
251265 // @brief The 3-part PCI address
252266 uint16_t pci_addr_;
@@ -275,14 +289,60 @@ struct msix_t;
275289
276290} // < namespace hw
277291
278- namespace std {
279- template <>
280- struct hash <PCI::classcode_t > {
281- public:
282- std::size_t operator ()(PCI::classcode_t const & key) const noexcept {
283- return key;
284- }
285- };
292+ static const char * PCI::classcode_str (uint8_t code){
293+ const std::unordered_map<uint8_t , const char *> classcodes {
294+ {classcode::OLD, " Old" },
295+ {classcode::STORAGE, " Storage controller" },
296+ {classcode::NIC, " Network controller" },
297+ {classcode::DISPLAY, " Display controller" },
298+ {classcode::MULTIMEDIA, " Multimedia device" },
299+ {classcode::MEMORY, " Memory controller" },
300+ {classcode::BRIDGE, " Bridge device" },
301+ {classcode::COMMUNICATION, " Simple comm. controller " },
302+ {classcode::BASE_SYSTEM_PER," Base system periph." },
303+ {classcode::INPUT_DEVICE, " Input device" },
304+ {classcode::DOCKING_STATION, " Docking station" },
305+ {classcode::PROCESSOR, " Processor" },
306+ {classcode::SERIAL_BUS, " Serial bus controller" },
307+ {classcode::WIRELESS, " Wireless" },
308+ {classcode::IO_CTL, " Intelligent IO controller" },
309+ {classcode::SATELLITE, " Satellite comm. controller" },
310+ {classcode::ENCRYPTION, " Encryption / decryption controller" },
311+ {classcode::SIGPRO," Sigpro" },
312+ {classcode::OTHER, " Other" }
313+ };
314+
315+ auto it = classcodes.find (code);
316+ if (it != classcodes.end ())
317+ return it->second ;
318+
319+ return " Unknown classcode" ;
320+ }
321+
322+ static const char * PCI::vendor_str (uint16_t code){
323+ const std::unordered_map<uint16_t , const char *> classcodes {
324+ {VENDOR_AMD, " AMD" },
325+ {VENDOR_INTEL, " Intel" },
326+ {VENDOR_CIRRUS, " Cirrus" },
327+ {VENDOR_VIRTIO, " VirtIO" } ,
328+ {VENDOR_REALTEK, " REALTEK" },
329+ {VENDOR_VMWARE, " VMWare" }
330+ };
331+
332+ auto it = classcodes.find (code);
333+ return it == classcodes.end () ? " Unknown vendor" : it->second ;
286334}
287335
336+
337+ #include < sstream>
338+ std::string hw::PCI_Device::to_string () const {
339+ std::stringstream str;
340+ str << PCI::classcode_str (classcode ()) << " , "
341+ << PCI::vendor_str ((PCI::vendor_t )vendor_id ())
342+ << std::hex << " (" << vendor_id () << " / " << product_id () << " )" ;
343+ return str.str ();
344+ };
345+
346+
347+
288348#endif // < HW_PCI_DEVICE_HPP
0 commit comments