The Pedigree Project 0.1
modules/drivers/common/nvme/main.cc
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#include "pedigree/kernel/Log.h"
3#include "pedigree/kernel/linker/KernelElf.h"
4#include "pedigree/kernel/utilities/List.h"
5#include "pedigree/kernel/utilities/new"
6
7#include "NvmeController.h"
8#include "modules/Module.h"
9namespace {
10List<Device*> candidates;
11List<NvmeController*> controllers;
12void collect(Device* pci) {
13 for (size_t i = 0; i < pci->getNumChildren(); ++i) {
14 if (pci->getChild(i)->getSpecificType() == String("nvme-controller"))
15 return;
16 }
17 candidates.pushBack(pci);
18}
19Module::UnloadAdmission admitUnload(bool) {
20 for (auto* controller : controllers) {
21 if (!controller->prepareDiskRemoval()) {
22 for (auto* rollback : controllers)
23 rollback->cancelDiskRemoval();
24 return Module::UnloadAdmission::Busy;
25 }
26 }
27 return Module::UnloadAdmission::Ready;
28}
29bool entry() {
30 Device::searchByClassSubclassAndProgInterface(1, 8, 2, collect);
31 while (candidates.count()) {
32 Device* pci = candidates.popFront();
33 auto* controller = new NvmeController(pci);
34 if (!controller->initialiseController()) {
35 controller->shutdown();
36 delete controller;
37 continue;
38 }
39 {
41 controller->setParent(pci);
42 pci->addChild(controller);
43 }
44 controllers.pushBack(controller);
45 }
46 if (!controllers.count())
47 return false;
48 return KernelElf::instance().registerUnloadAdmission(&entry, &admitUnload);
49}
50void exit() {
51 while (controllers.count()) {
52 NvmeController* controller = controllers.popFront();
53 controller->shutdown();
54 {
56 controller->getParent()->removeChild(controller);
57 controller->setParent(nullptr);
58 }
59 delete controller;
60 }
61}
62} // namespace
63MODULE_INFO("nvme", &entry, &exit, "pci", "scsi");
size_t getNumChildren()
Definition Device.cc:131
Device * getChild(size_t n)
Definition Device.cc:127
void addChild(Device *pDevice)
Definition Device.cc:123
virtual const String & getSpecificType()
Definition Device.h:178
Device * getParent() const
Definition Device.h:161
void setParent(Device *p)
Definition Device.h:165
void removeChild(size_t n)
Definition Device.cc:135
bool registerUnloadAdmission(ModuleEntry ownerEntry, Module::UnloadAdmissionHook hook)
static KernelElf & instance()
Definition KernelElf.h:135
Definition List.h:61
T popFront()
Definition List.h:330
size_t count() const
Definition List.h:212
void pushBack(const T &value)
Definition List.h:216