The Pedigree Project 0.1
NvmeController.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef NVME_CONTROLLER_H
3#define NVME_CONTROLLER_H
4#include "pedigree/kernel/machine/IrqHandler.h"
5#include "pedigree/kernel/process/OperationBarrier.h"
6
7#include "NvmeQueue.h"
8#include "modules/drivers/common/scsi/ScsiController.h"
9class NvmeDisk;
10class EXPORTED_PUBLIC NvmeController final : public ScsiController, public IrqHandler {
11 public:
12 explicit NvmeController(Device* pci);
13 ~NvmeController() override;
14 bool initialiseController();
15 void shutdown();
16 bool identify(uint32_t nsid, uint8_t kind, void* buffer, bool interruptProbe = false);
17 bool readWrite(uint32_t nsid, uint64_t lba, uint32_t blocks, void* buffer, size_t bytes,
18 bool writing);
19 bool flush(uint32_t nsid);
20 size_t interruptCompletions() const;
21 size_t maximumOutstanding() const;
22 size_t maxTransfer() const {
23 return m_MaxTransfer;
24 }
25 const char* model() const {
26 return m_Model;
27 }
28 bool supportsConcurrentReads() const override {
29 return true;
30 }
31 IrqDisposition irq(irq_id_t number) override;
32 bool sendCommand(size_t, uintptr_t, uint8_t, uintptr_t, uint16_t, bool) override {
33 return false;
34 }
35
36 protected:
37 size_t getNumUnits() override {
38 return getNumChildren();
39 }
40
41 private:
42 bool waitReady(bool ready);
43 bool disable();
44 void failController();
45 bool command(NvmeQueue& queue, Nvme::Command command, void* buffer = nullptr, size_t bytes = 0,
46 bool writing = false, uint32_t* result = nullptr, bool interruptProbe = false);
47 bool createIoQueue();
48 bool discoverNamespaces(uint32_t maximumId);
49 NvmeDisk* findNamespace(uint32_t nsid);
50 Device* m_Pci;
51 IoBase* m_Registers;
52 NvmeQueue m_Admin;
53 NvmeQueue m_Io;
54 OperationBarrier m_Commands;
55 Mutex m_WriteLock;
56 Mutex m_ResetLock;
57 mutable Mutex m_IrqLock;
58 size_t m_ReadyMilliseconds;
59 size_t m_MaxTransfer;
60 irq_id_t m_Irq;
61 uint16_t m_OriginalCommand;
62 bool m_PciChanged;
63 bool m_HardwareOwned;
64 bool m_DmaInstalled;
65 bool m_Interrupts;
66 bool m_Failed;
67 bool m_Stopping;
68 bool m_Shutdown;
69 char m_Model[41];
70};
71#endif
size_t getNumChildren()
Definition Device.cc:131
Abstrace base class for hardware I/O capabilities.
Definition IoBase.h:32
virtual IrqDisposition irq(irq_id_t number)=0
Definition Mutex.h:56
bool supportsConcurrentReads() const override
IrqDisposition
Definition IrqHandler.h:31