/* * Copyright (c) 2021, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Kernel::PCI { class PCIBusSysFSDirectory final : public SysFSDirectory { public: static void initialize(); virtual StringView name() const override { return "pci"sv; } private: PCIBusSysFSDirectory(); }; class PCIDeviceSysFSDirectory final : public SysFSDirectory { public: static NonnullRefPtr create(const SysFSDirectory&, Address); const Address& address() const { return m_address; } virtual StringView name() const override { return m_device_directory_name->view(); } private: PCIDeviceSysFSDirectory(NonnullOwnPtr device_directory_name, const SysFSDirectory&, Address); Address m_address; NonnullOwnPtr m_device_directory_name; }; class PCIDeviceAttributeSysFSComponent : public SysFSComponent { public: static NonnullRefPtr create(const PCIDeviceSysFSDirectory& device, PCI::RegisterOffset offset, size_t field_bytes_width); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; virtual ~PCIDeviceAttributeSysFSComponent() {}; virtual StringView name() const override; protected: ErrorOr> try_to_generate_buffer() const; PCIDeviceAttributeSysFSComponent(const PCIDeviceSysFSDirectory& device, PCI::RegisterOffset offset, size_t field_bytes_width); NonnullRefPtr m_device; PCI::RegisterOffset m_offset; size_t m_field_bytes_width; }; }