2020-01-18 09:38:21 +01:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
|
|
|
*
|
2021-04-22 01:24:48 -07:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2020-01-18 09:38:21 +01:00
|
|
|
*/
|
|
|
|
|
|
2019-08-14 18:09:53 +10:00
|
|
|
#pragma once
|
|
|
|
|
|
2023-12-16 17:49:34 +03:30
|
|
|
#include <AK/ByteString.h>
|
2019-08-14 18:09:53 +10:00
|
|
|
#include <AK/HashMap.h>
|
|
|
|
|
#include <AK/NonnullOwnPtr.h>
|
|
|
|
|
#include <AK/RefCounted.h>
|
|
|
|
|
#include <AK/RefPtr.h>
|
|
|
|
|
#include <AK/StringView.h>
|
2021-11-23 11:32:25 +01:00
|
|
|
#include <LibCore/MappedFile.h>
|
2019-08-14 18:09:53 +10:00
|
|
|
|
|
|
|
|
namespace PCIDB {
|
|
|
|
|
|
|
|
|
|
struct Subsystem {
|
|
|
|
|
u16 vendor_id;
|
|
|
|
|
u16 device_id;
|
|
|
|
|
StringView name;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Device {
|
|
|
|
|
u16 id;
|
|
|
|
|
StringView name;
|
|
|
|
|
HashMap<int, NonnullOwnPtr<Subsystem>> subsystems;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Vendor {
|
|
|
|
|
u16 id;
|
|
|
|
|
StringView name;
|
|
|
|
|
HashMap<int, NonnullOwnPtr<Device>> devices;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ProgrammingInterface {
|
|
|
|
|
u8 id { 0 };
|
|
|
|
|
StringView name {};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Subclass {
|
|
|
|
|
u8 id { 0 };
|
|
|
|
|
StringView name {};
|
|
|
|
|
HashMap<int, NonnullOwnPtr<ProgrammingInterface>> programming_interfaces;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Class {
|
|
|
|
|
u8 id { 0 };
|
|
|
|
|
StringView name {};
|
|
|
|
|
HashMap<int, NonnullOwnPtr<Subclass>> subclasses;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class Database : public RefCounted<Database> {
|
|
|
|
|
public:
|
2023-12-16 17:49:34 +03:30
|
|
|
static RefPtr<Database> open(ByteString const& filename);
|
2023-07-07 22:48:11 -04:00
|
|
|
static RefPtr<Database> open() { return open("/res/pci.ids"); }
|
2019-08-14 18:09:53 +10:00
|
|
|
|
|
|
|
|
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:
|
2023-09-26 00:54:34 +02:00
|
|
|
explicit Database(NonnullOwnPtr<Core::MappedFile> file)
|
2021-01-10 15:55:54 +01:00
|
|
|
: m_file(move(file))
|
|
|
|
|
{
|
|
|
|
|
}
|
2019-08-14 18:09:53 +10:00
|
|
|
|
|
|
|
|
int init();
|
|
|
|
|
|
|
|
|
|
enum ParseMode {
|
|
|
|
|
UnknownMode,
|
|
|
|
|
VendorMode,
|
|
|
|
|
ClassMode,
|
|
|
|
|
};
|
|
|
|
|
|
2023-09-26 00:54:34 +02:00
|
|
|
NonnullOwnPtr<Core::MappedFile> m_file;
|
2019-08-14 18:09:53 +10:00
|
|
|
StringView m_view {};
|
|
|
|
|
HashMap<int, NonnullOwnPtr<Vendor>> m_vendors;
|
|
|
|
|
HashMap<int, NonnullOwnPtr<Class>> m_classes;
|
|
|
|
|
bool m_ready { false };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|