replace ad hoc driver loading with a proper driver manager, new DDK, new PnP manager with device matching, asynchronous startup, resource ownership and removal, add shared PCI capability helpers, replace typed, rigid services with a proper service manager, implement proper system shutdown and restart, shutting down unloads drivers and shuts down services, add simple power button, remove heavyweight boot self-tests and SMP stress runs, add monotonic timestamps to kernel debug output, fruitless USB and PS/2 fixes, make test builds opt in.
This commit is contained in:
1 parent
c0ad63c27f
commit
d36f19509c
160 files changed
+6563
-7366
No files matched your search
@@ -1,8 +1,8 @@
|
||||
#include <ntlite/ddk/module.h>
|
||||
// AHCI storage driver. This file owns controller attachment, drive discovery, command submission, and worker-driven IRP completion.
|
||||
|
||||
#include "ahci.h"
|
||||
|
||||
const NTL_DDK* gAhciDdk;
|
||||
DRIVER_OBJECT g_driver;
|
||||
|
||||
static AHCI_CONTROLLER* g_controllers[MAX_AHCI_CONTROLLERS];
|
||||
@@ -102,13 +102,13 @@ static void AhciReleaseDriveRuntime(AHCI_DRIVE* drv) {
|
||||
|
||||
// Releases the DMA buffers owned by one AHCI drive.
|
||||
static void AhciReleaseDriveDma(AHCI_DRIVE* drv) {
|
||||
if (!drv || !gAhciDdk || !gAhciDdk->Dma)
|
||||
if (!drv)
|
||||
return;
|
||||
if (drv->port && drv->controller &&
|
||||
!drv->surpriseRemoved && !drv->controller->surpriseRemoved)
|
||||
port_stop(drv->port);
|
||||
gAhciDdk->Dma->FreeCommonBuffer(drv->bounceDma);
|
||||
gAhciDdk->Dma->FreeCommonBuffer(drv->structDma);
|
||||
IoDmaFreeCommonBuffer(drv->bounceDma);
|
||||
IoDmaFreeCommonBuffer(drv->structDma);
|
||||
drv->bounceDma = (IO_DMA_BUFFER*)0;
|
||||
drv->structDma = (IO_DMA_BUFFER*)0;
|
||||
drv->bounceDeviceAddress = 0;
|
||||
@@ -122,16 +122,16 @@ static KSTATUS port_init_memory(AHCI_DRIVE* drv) {
|
||||
if (!drv || !drv->controller || !drv->controller->dmaAdapter)
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS status = gAhciDdk->Dma->AllocateCommonBuffer(drv->controller->dmaAdapter,
|
||||
KSTATUS status = IoDmaAllocateCommonBuffer(drv->controller->dmaAdapter,
|
||||
PORT_PAGES_STRUCT * PAGE_SIZE,
|
||||
PAGE_SIZE,
|
||||
&drv->structDma);
|
||||
if (!KSUCCESS(status))
|
||||
return status;
|
||||
drv->structVirt = gAhciDdk->Dma->GetCommonBufferAddress(drv->structDma);
|
||||
drv->structDeviceAddress = gAhciDdk->Dma->GetCommonBufferDeviceAddress(drv->structDma);
|
||||
drv->structVirt = IoDmaGetCommonBufferAddress(drv->structDma);
|
||||
drv->structDeviceAddress = IoDmaGetCommonBufferDeviceAddress(drv->structDma);
|
||||
|
||||
status = gAhciDdk->Dma->AllocateCommonBuffer(drv->controller->dmaAdapter,
|
||||
status = IoDmaAllocateCommonBuffer(drv->controller->dmaAdapter,
|
||||
BOUNCE_BYTES,
|
||||
PAGE_SIZE,
|
||||
&drv->bounceDma);
|
||||
@@ -139,8 +139,8 @@ static KSTATUS port_init_memory(AHCI_DRIVE* drv) {
|
||||
AhciReleaseDriveDma(drv);
|
||||
return status;
|
||||
}
|
||||
drv->bounceVirt = gAhciDdk->Dma->GetCommonBufferAddress(drv->bounceDma);
|
||||
drv->bounceDeviceAddress = gAhciDdk->Dma->GetCommonBufferDeviceAddress(drv->bounceDma);
|
||||
drv->bounceVirt = IoDmaGetCommonBufferAddress(drv->bounceDma);
|
||||
drv->bounceDeviceAddress = IoDmaGetCommonBufferDeviceAddress(drv->bounceDma);
|
||||
|
||||
HBA_PORT* port = drv->port;
|
||||
port_stop(port);
|
||||
@@ -701,7 +701,7 @@ static KSTATUS AhciDispatchControllerPnp(DEVICE_OBJECT* device, IRP* irp) {
|
||||
}
|
||||
}
|
||||
AhciUnregisterController(ctl);
|
||||
gAhciDdk->Dma->PutAdapter(ctl->dmaAdapter);
|
||||
IoDmaPutAdapter(ctl->dmaAdapter);
|
||||
ctl->dmaAdapter = (IO_DMA_ADAPTER*)0;
|
||||
IoDetachDevice(device);
|
||||
IoDeleteDevice(device);
|
||||
@@ -940,7 +940,7 @@ static KSTATUS AhciStartController(AHCI_CONTROLLER* ctl) {
|
||||
dmaRequirements.Alignment = 2;
|
||||
dmaRequirements.MaximumSegmentLength = 1u << 22;
|
||||
dmaRequirements.MaximumSegments = PORT_PRDT_COUNT;
|
||||
st = gAhciDdk->Dma->GetAdapter(ctl->fdo, &dmaRequirements, &ctl->dmaAdapter);
|
||||
st = IoDmaGetAdapter(ctl->fdo, &dmaRequirements, &ctl->dmaAdapter);
|
||||
if (!KSUCCESS(st)) {
|
||||
DbgPrint("AHCI: DMA adapter creation failed (0x%x)\n", st);
|
||||
return st;
|
||||
@@ -949,7 +949,7 @@ static KSTATUS AhciStartController(AHCI_CONTROLLER* ctl) {
|
||||
st = AhciRegisterController(ctl);
|
||||
if (!KSUCCESS(st)) {
|
||||
DbgPrint("AHCI: controller registry full (0x%x)\n", st);
|
||||
gAhciDdk->Dma->PutAdapter(ctl->dmaAdapter);
|
||||
IoDmaPutAdapter(ctl->dmaAdapter);
|
||||
ctl->dmaAdapter = (IO_DMA_ADAPTER*)0;
|
||||
return st;
|
||||
}
|
||||
@@ -1159,14 +1159,11 @@ static KSTATUS AhciAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDevic
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the driver Entry operation.
|
||||
KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) {
|
||||
(void)init;
|
||||
if (!ddk || !ddk->Memory || !ddk->Memory->PhysToVirt || !ddk->Dma)
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
static KSTATUS DriverInitialize(NTL_MODULE* module) {
|
||||
(void)module;
|
||||
|
||||
DbgPrint("AHCI: driver loading...\n");
|
||||
gAhciDdk = ddk;
|
||||
|
||||
g_controllerCount = 0;
|
||||
g_nextDiskIndex = 0;
|
||||
|
||||
@@ -1178,9 +1175,8 @@ KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) {
|
||||
g_driver.MajorFunction[IRP_MJ_WRITE] = AhciDispatchReadWrite;
|
||||
g_driver.MajorFunction[IRP_MJ_FLUSH_BUFFERS] = AhciDispatchFlush;
|
||||
g_driver.MajorFunction[IRP_MJ_PNP] = AhciDispatchPnp;
|
||||
|
||||
KSTATUS st = IoRegisterDriverObject(&g_driver);
|
||||
if (!KSUCCESS(st))
|
||||
DbgPrint("AHCI: IoRegisterDriverObject failed: 0x%x\n", st);
|
||||
return st;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static DRIVER_OBJECT* const gModuleIoDrivers[] = { &g_driver };
|
||||
NTL_DECLARE_IO_MODULE(DriverInitialize, gModuleIoDrivers);
|
||||
Reference in new issue
Block a user