The Pedigree Project 0.1
VirtioScsiController.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef VIRTIO_SCSI_CONTROLLER_H
3#define VIRTIO_SCSI_CONTROLLER_H
4
5#include "pedigree/kernel/machine/IrqHandler.h"
6#include "pedigree/kernel/process/Mutex.h"
7#include "pedigree/kernel/process/Semaphore.h"
8#include "pedigree/kernel/processor/MemoryRegion.h"
9
10#include "modules/drivers/common/scsi/ScsiController.h"
11#include "modules/drivers/common/virtio/VirtioPci.h"
12#include "modules/drivers/common/virtio/Virtqueue.h"
13
14class EXPORTED_PUBLIC VirtioScsiController final : public ScsiController, public IrqHandler {
15 public:
16 explicit VirtioScsiController(Device* pci);
17 ~VirtioScsiController() override;
18
19 bool initialiseController();
20 void shutdown();
21
22 bool sendCommand(size_t unit, uintptr_t command, uint8_t commandBytes, uintptr_t data,
23 uint16_t dataBytes, bool writing) override;
24 IrqDisposition irq(irq_id_t number) override;
25
26 protected:
27 size_t getNumUnits() override {
28 return m_UnitCount;
29 }
30
31 private:
32 enum class Result { Success, DeviceError, TransportError };
33
34 Result command(uint8_t target, const void* cdb, size_t cdbBytes, void* data, size_t dataBytes,
35 bool writing, bool interruptProbe);
36 void drainCompletions(bool fromInterrupt);
37 void failController();
38
39 Device* m_Pci;
40 Virtio::PciTransport m_Transport;
41 Virtio::Queue m_RequestQueue;
42 MemoryRegion m_Control;
43 MemoryRegion m_Data;
44 Mutex m_CommandLock;
45 Mutex m_IrqLock;
46 Semaphore m_Completion;
47 irq_id_t m_Irq;
48 uint8_t m_Targets[256];
49 size_t m_UnitCount;
50 size_t m_CdbBytes;
51 size_t m_SenseBytes;
52 size_t m_CommandUsed;
53 size_t m_InterruptCompletions;
54 bool m_TransportInitialised;
55 bool m_Ready;
56 bool m_CommandSeen;
57 bool m_CommandValid;
58 bool m_Stopping;
59 bool m_Failed;
60 bool m_Shutdown;
61};
62
63#endif
virtual IrqDisposition irq(irq_id_t number)=0
Special memory entity in the kernel's virtual address space.
Definition Mutex.h:56
IrqDisposition
Definition IrqHandler.h:31