/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace PCIDB { struct Subsystem { u16 vendor_id; u16 device_id; StringView name; }; struct Device { u16 id; StringView name; HashMap> subsystems; }; struct Vendor { u16 id; StringView name; HashMap> devices; }; struct ProgrammingInterface { u8 id { 0 }; StringView name {}; }; struct Subclass { u8 id { 0 }; StringView name {}; HashMap> programming_interfaces; }; struct Class { u8 id { 0 }; StringView name {}; HashMap> subclasses; }; class Database : public RefCounted { public: static RefPtr open(const String& filename); static RefPtr open() { return open("/res/pci.ids"); }; const StringView get_vendor(u16 vendor_id) const; const StringView get_device(u16 vendor_id, u16 device_id) const; const StringView get_subsystem(u16 vendor_id, u16 device_id, u16 subvendor_id, u16 subdevice_id) const; const StringView get_class(u8 class_id) const; const StringView get_subclass(u8 class_id, u8 subclass_id) const; const StringView get_programming_interface(u8 class_id, u8 subclass_id, u8 programming_interface_id) const; private: explicit Database(NonnullRefPtr file) : m_file(move(file)) { } int init(); enum ParseMode { UnknownMode, VendorMode, ClassMode, }; NonnullRefPtr m_file; StringView m_view {}; HashMap> m_vendors; HashMap> m_classes; bool m_ready { false }; }; }