ladybird/Kernel/Bus/PCI/Device.h
Timothy Flynn c911781c21 Everywhere: Remove needless trailing semi-colons after functions
This is a new option in clang-format-16.
2023-07-08 10:32:56 +01:00

85 lines
2.2 KiB
C++

/*
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Format.h>
#include <AK/NonnullRefPtr.h>
#include <AK/StringBuilder.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Definitions.h>
namespace Kernel::PCI {
enum class InterruptType {
PIN,
MSI,
MSIX
};
struct InterruptRange {
u8 m_start_irq { 0 };
u8 m_irq_count { 0 };
InterruptType m_type { InterruptType::PIN };
};
struct [[gnu::packed]] MSIxTableEntry {
u32 address_low;
u32 address_high;
u32 data;
u32 vector_control;
};
class Device {
public:
DeviceIdentifier const& device_identifier() const { return *m_pci_identifier; }
virtual ~Device() = default;
virtual StringView device_name() const = 0;
void enable_pin_based_interrupts() const;
void disable_pin_based_interrupts() const;
bool is_msi_capable() const;
bool is_msix_capable() const;
void enable_message_signalled_interrupts();
void disable_message_signalled_interrupts();
void enable_extended_message_signalled_interrupts();
void disable_extended_message_signalled_interrupts();
ErrorOr<InterruptType> reserve_irqs(u8 number_of_irqs, bool msi);
ErrorOr<u8> allocate_irq(u8 index);
PCI::InterruptType get_interrupt_type();
void enable_interrupt(u8 irq);
void disable_interrupt(u8 irq);
protected:
explicit Device(DeviceIdentifier const& pci_identifier);
private:
PhysicalAddress msix_table_entry_address(u8 irq);
private:
NonnullRefPtr<DeviceIdentifier> const m_pci_identifier;
InterruptRange m_interrupt_range;
};
template<typename... Parameters>
void dmesgln_pci(Device const& device, AK::CheckedFormatString<Parameters...>&& fmt, Parameters const&... parameters)
{
AK::StringBuilder builder;
if (builder.try_append("{}: {}: "sv).is_error())
return;
if (builder.try_append(fmt.view()).is_error())
return;
AK::VariadicFormatParams<AK::AllowDebugOnlyFormatters::Yes, StringView, Address, Parameters...> variadic_format_params { device.device_name(), device.device_identifier().address(), parameters... };
vdmesgln(builder.string_view(), variadic_format_params);
}
}