The Pedigree Project
0.1
src
modules
drivers
common
virtio-scsi
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
14
class
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
Device
Definition
Device.h:41
IrqHandler
Definition
IrqHandler.h:73
IrqHandler::irq
virtual IrqDisposition irq(irq_id_t number)=0
MemoryRegion
Special memory entity in the kernel's virtual address space.
Definition
MemoryRegion.h:35
Mutex
Definition
Mutex.h:56
Result
Definition
Result.h:36
ScsiController
Definition
ScsiController.h:38
Semaphore
Definition
Semaphore.h:36
VirtioScsiController
Definition
VirtioScsiController.h:14
Virtio::PciTransport
Definition
VirtioPci.h:18
Virtio::Queue
Definition
Virtqueue.h:25
IrqDisposition
IrqDisposition
Definition
IrqHandler.h:31
Generated on Tue Sep 29 2026 04:30:09 for The Pedigree Project by
1.9.8