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/processor/types.h"
8
9class Device;
10class IoBase;
11
12namespace Virtio {
13
14class Queue;
15
16class EXPORTED_PUBLIC PciTransport {
17 public:
18 explicit PciTransport(Device* device);
20
21 bool initialise();
22 bool negotiate(uint64_t supportedFeatures, uint64_t requiredFeatures = 0);
23 bool setupQueue(uint16_t index, Queue& queue);
24 bool ready();
25 // A successful reset acknowledges DMA quiescence before buffers may be freed.
26 bool reset();
27 uint8_t readIsr();
28 void notify(uint16_t index);
29
30 uint64_t features() const {
31 return m_Features;
32 }
33 bool writeDeviceConfig8(uint16_t offset, uint8_t value);
34 bool readDeviceConfig8(uint16_t offset, uint8_t& value);
35 bool readDeviceConfig16(uint16_t offset, uint16_t& value);
36 bool readDeviceConfig32(uint16_t offset, uint32_t& value);
37 bool readDeviceConfig64(uint16_t offset, uint64_t& value);
38
39 private:
40 friend class Queue;
41 static constexpr size_t MaxQueues = 64;
42
43 struct Capability {
44 IoBase* io = nullptr;
45 uint32_t offset = 0;
46 uint32_t length = 0;
47 };
48
49 bool locateCapabilities();
50 bool readConfig(uint16_t offset, unsigned width, uint64_t& value);
51 bool status(uint8_t bits);
52 bool isDmaActive() const {
53 return m_DmaActive;
54 }
55
56 Device* m_Device;
57 Capability m_Common;
58 Capability m_Notify;
59 Capability m_Isr;
60 Capability m_DeviceConfig;
61 PciFunctionState::State m_Original;
62 Queue* m_Queues[MaxQueues];
63 uint32_t m_NotifyOffsets[MaxQueues];
64 uint32_t m_NotifyMultiplier;
65 uint64_t m_Features;
66 uint16_t m_NumQueues;
67 bool m_PciChanged;
68 bool m_Initialised;
69 bool m_Negotiated;
70 bool m_DmaActive;
71};
72
73} // namespace Virtio
74#endif
Abstrace base class for hardware I/O capabilities.
Definition IoBase.h:32