The Pedigree Project 0.1
VirtioPci.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef PEDIGREE_VIRTIO_PCI_H
3#define PEDIGREE_VIRTIO_PCI_H
4
5#include "pedigree/kernel/compiler.h"
6#include "pedigree/kernel/machine/PciFunctionState.h"
7#include "pedigree/kernel/machine/types.h"
8#include "pedigree/kernel/processor/types.h"
9
10class Device;
11class IoBase;
12class IrqHandler;
13
14namespace Virtio {
15
16class Queue;
17
18class EXPORTED_PUBLIC PciTransport {
19 public:
20 explicit PciTransport(Device* device);
22
23 bool initialise();
24 bool negotiate(uint64_t supportedFeatures, uint64_t requiredFeatures = 0);
25 bool setupQueue(uint16_t index, Queue& queue);
26 irq_id_t registerInterrupt(IrqHandler* handler);
27 bool ready();
28 // A successful reset acknowledges DMA quiescence before buffers may be freed.
29 bool reset();
30 uint8_t readIsr();
31 void notify(uint16_t index);
32
33 uint64_t features() const {
34 return m_Features;
35 }
36 bool writeDeviceConfig8(uint16_t offset, uint8_t value);
37 bool readDeviceConfig8(uint16_t offset, uint8_t& value);
38 bool readDeviceConfig16(uint16_t offset, uint16_t& value);
39 bool readDeviceConfig32(uint16_t offset, uint32_t& value);
40 bool readDeviceConfig64(uint16_t offset, uint64_t& value);
41
42 private:
43 friend class Queue;
44 static constexpr size_t MaxQueues = 64;
45
46 struct Capability {
47 IoBase* io = nullptr;
48 uint32_t offset = 0;
49 uint32_t length = 0;
50 };
51
52 bool locateCapabilities();
53 bool readConfig(uint16_t offset, unsigned width, uint64_t& value);
54 bool status(uint8_t bits);
55 bool configureMsix();
56 bool isDmaActive() const {
57 return m_DmaActive;
58 }
59
60 Device* m_Device;
61 Capability m_Common;
62 Capability m_Notify;
63 Capability m_Isr;
64 Capability m_DeviceConfig;
65 PciFunctionState::State m_Original;
66 Queue* m_Queues[MaxQueues];
67 uint32_t m_NotifyOffsets[MaxQueues];
68 uint32_t m_NotifyMultiplier;
69 uint64_t m_Features;
70 uint16_t m_NumQueues;
71 bool m_PciChanged;
72 bool m_Initialised;
73 bool m_Negotiated;
74 bool m_DmaActive;
75 bool m_UsingMsix;
76};
77
78} // namespace Virtio
79#endif
Abstrace base class for hardware I/O capabilities.
Definition IoBase.h:32