1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:28:11 +00:00
serenity/Kernel/Bus/PCI/Device.h
Pankaj Raghav d0fbaf790a Kernel: Add MSIxInfo struct to PCI DeviceIdentifier
Add a struct named MSIxInfo that stores all the relevant MSIx
information as a part of PCI DeviceIdentifier struct.

Populate the MSIx struct during the PCI device init. As the
DeviceIdentifier struct need to populate MSIx info, don't mark
DeviceIdentifier as const in the PCI::Device class.
2023-05-07 21:16:41 +02:00

56 lines
1.6 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 {
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();
protected:
explicit Device(DeviceIdentifier const& pci_identifier);
private:
NonnullRefPtr<DeviceIdentifier> const m_pci_identifier;
};
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);
}
}