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:
maksw committed 2026-10-26 10:08:03 +01:00
1 parent c0ad63c27f
commit d36f19509c
160 files changed
+6563 -7366

No files matched your search

+28 -31
View File
@@ -16,15 +16,12 @@ static __forceinline void HdaMemoryBarrier(void) {
// Returns the controller's monotonic microsecond counter.
static uint64_t HdaQueryTicks(void) {
if (!gHdaDdk || !gHdaDdk->Timer || !gHdaDdk->Timer->QueryTicks)
return 0;
return gHdaDdk->Timer->QueryTicks();
return KeQueryTicks();
}
// Delays for a bounded controller settling interval.
static void HdaStall(uint32_t microseconds) {
if (gHdaDdk && gHdaDdk->Timer && gHdaDdk->Timer->Stall)
gHdaDdk->Timer->Stall(microseconds);
KeStallExecution(microseconds);
}
// Returns one byte from the controller register aperture.
@@ -170,7 +167,7 @@ static uint8_t HdaRingSizeSelector(uint16_t count) {
// Releases all DMA and synchronization resources owned by one controller.
void HdaReleaseDma(HDA_CONTROLLER* controller) {
if (!controller || !gHdaDdk || !gHdaDdk->Dma)
if (!controller)
return;
if (controller->StreamMutex) {
@@ -190,12 +187,12 @@ void HdaReleaseDma(HDA_CONTROLLER* controller) {
controller->RecoveryFinished = (EVENT*)0;
}
gHdaDdk->Dma->FreeCommonBuffer(controller->Output.BdlDma);
IoDmaFreeCommonBuffer(controller->Output.BdlDma);
for (uint32_t ringIndex = 0; ringIndex < HDA_MAX_LOGICAL_ENDPOINTS; ringIndex++)
gHdaDdk->Dma->FreeCommonBuffer(controller->Output.Rings[ringIndex].Dma);
gHdaDdk->Dma->FreeCommonBuffer(controller->PositionDma);
gHdaDdk->Dma->FreeCommonBuffer(controller->RirbDma);
gHdaDdk->Dma->FreeCommonBuffer(controller->CorbDma);
IoDmaFreeCommonBuffer(controller->Output.Rings[ringIndex].Dma);
IoDmaFreeCommonBuffer(controller->PositionDma);
IoDmaFreeCommonBuffer(controller->RirbDma);
IoDmaFreeCommonBuffer(controller->CorbDma);
controller->Output.BdlDma = (IO_DMA_BUFFER*)0;
for (uint32_t ringIndex = 0; ringIndex < HDA_MAX_LOGICAL_ENDPOINTS; ringIndex++) {
controller->Output.Rings[ringIndex].Dma = (IO_DMA_BUFFER*)0;
@@ -211,14 +208,14 @@ void HdaReleaseDma(HDA_CONTROLLER* controller) {
controller->Corb = (uint32_t*)0;
if (controller->DmaAdapter) {
gHdaDdk->Dma->PutAdapter(controller->DmaAdapter);
IoDmaPutAdapter(controller->DmaAdapter);
controller->DmaAdapter = (IO_DMA_ADAPTER*)0;
}
}
// Allocates the transport and output DMA resources for one controller.
KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
if (!controller || !controller->Fdo || !gHdaDdk || !gHdaDdk->Dma)
if (!controller || !controller->Fdo)
return NTLSTATUS_INVALID_PARAMETER;
IO_DMA_REQUIREMENTS requirements;
@@ -229,7 +226,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
requirements.Alignment = 128u;
requirements.MaximumSegments = 1u;
KSTATUS status = gHdaDdk->Dma->GetAdapter(controller->Fdo,
KSTATUS status = IoDmaGetAdapter(controller->Fdo,
&requirements,
&controller->DmaAdapter);
if (!KSUCCESS(status))
@@ -248,7 +245,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
return status;
}
status = gHdaDdk->Dma->AllocateCommonBuffer(controller->DmaAdapter,
status = IoDmaAllocateCommonBuffer(controller->DmaAdapter,
(size_t)controller->CorbEntryCount * sizeof(uint32_t),
128u,
&controller->CorbDma);
@@ -256,7 +253,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
HdaReleaseDma(controller);
return status;
}
status = gHdaDdk->Dma->AllocateCommonBuffer(controller->DmaAdapter,
status = IoDmaAllocateCommonBuffer(controller->DmaAdapter,
(size_t)controller->RirbEntryCount * sizeof(HDA_RIRB_ENTRY),
128u,
&controller->RirbDma);
@@ -266,7 +263,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
}
// The position buffer is optional because LPIB is the supported fallback.
status = gHdaDdk->Dma->AllocateCommonBuffer(controller->DmaAdapter,
status = IoDmaAllocateCommonBuffer(controller->DmaAdapter,
(size_t)controller->TotalStreamCount * sizeof(uint64_t),
128u,
&controller->PositionDma);
@@ -274,7 +271,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
controller->PositionDma = (IO_DMA_BUFFER*)0;
for (uint32_t ringIndex = 0; ringIndex < HDA_MAX_LOGICAL_ENDPOINTS; ringIndex++) {
status = gHdaDdk->Dma->AllocateCommonBuffer(
status = IoDmaAllocateCommonBuffer(
controller->DmaAdapter,
HDA_OUTPUT_BUFFER_BYTES,
128u,
@@ -284,7 +281,7 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
return status;
}
}
status = gHdaDdk->Dma->AllocateCommonBuffer(controller->DmaAdapter,
status = IoDmaAllocateCommonBuffer(controller->DmaAdapter,
HDA_OUTPUT_PERIOD_COUNT * sizeof(HDA_BDL_ENTRY),
128u,
&controller->Output.BdlDma);
@@ -293,27 +290,27 @@ KSTATUS HdaAllocateDma(HDA_CONTROLLER* controller) {
return status;
}
controller->Corb = (uint32_t*)gHdaDdk->Dma->GetCommonBufferAddress(controller->CorbDma);
controller->Rirb = (HDA_RIRB_ENTRY*)gHdaDdk->Dma->GetCommonBufferAddress(controller->RirbDma);
controller->CorbDeviceAddress = gHdaDdk->Dma->GetCommonBufferDeviceAddress(controller->CorbDma);
controller->RirbDeviceAddress = gHdaDdk->Dma->GetCommonBufferDeviceAddress(controller->RirbDma);
controller->Corb = (uint32_t*)IoDmaGetCommonBufferAddress(controller->CorbDma);
controller->Rirb = (HDA_RIRB_ENTRY*)IoDmaGetCommonBufferAddress(controller->RirbDma);
controller->CorbDeviceAddress = IoDmaGetCommonBufferDeviceAddress(controller->CorbDma);
controller->RirbDeviceAddress = IoDmaGetCommonBufferDeviceAddress(controller->RirbDma);
if (controller->PositionDma) {
controller->PositionBuffer = (volatile uint64_t*)
gHdaDdk->Dma->GetCommonBufferAddress(controller->PositionDma);
IoDmaGetCommonBufferAddress(controller->PositionDma);
controller->PositionDeviceAddress =
gHdaDdk->Dma->GetCommonBufferDeviceAddress(controller->PositionDma);
IoDmaGetCommonBufferDeviceAddress(controller->PositionDma);
}
for (uint32_t ringIndex = 0; ringIndex < HDA_MAX_LOGICAL_ENDPOINTS; ringIndex++) {
controller->Output.Rings[ringIndex].Buffer = (uint8_t*)
gHdaDdk->Dma->GetCommonBufferAddress(controller->Output.Rings[ringIndex].Dma);
IoDmaGetCommonBufferAddress(controller->Output.Rings[ringIndex].Dma);
controller->Output.Rings[ringIndex].DeviceAddress =
gHdaDdk->Dma->GetCommonBufferDeviceAddress(
IoDmaGetCommonBufferDeviceAddress(
controller->Output.Rings[ringIndex].Dma);
}
controller->Output.Bdl = (HDA_BDL_ENTRY*)
gHdaDdk->Dma->GetCommonBufferAddress(controller->Output.BdlDma);
IoDmaGetCommonBufferAddress(controller->Output.BdlDma);
controller->Output.BdlDeviceAddress =
gHdaDdk->Dma->GetCommonBufferDeviceAddress(controller->Output.BdlDma);
IoDmaGetCommonBufferDeviceAddress(controller->Output.BdlDma);
memset(controller->Corb, 0, (size_t)controller->CorbEntryCount * sizeof(uint32_t));
memset(controller->Rirb, 0, (size_t)controller->RirbEntryCount * sizeof(HDA_RIRB_ENTRY));
@@ -502,7 +499,7 @@ static KSTATUS HdaResetCorbReadPointer(HDA_CONTROLLER* controller) {
static KSTATUS HdaReportInitializationFailure(HDA_CONTROLLER* controller,
const char* stage,
KSTATUS status) {
gHdaDdk->Debug->Print(
DbgPrint(
"HDA: init stage=%s failed status=0x%x GCTL=0x%08x STATESTS=0x%04x "
"CORB=%02x/%02x/%04x/%04x RIRB=%02x/%02x/%04x SDCTL=0x%06x\n",
stage,
@@ -1381,7 +1378,7 @@ static void HdaRecoveryWorker(uintptr_t argument) {
if (!KSUCCESS(status) && status != NTLSTATUS_DEVICE_REMOVED) {
if (callbacks.TransportFailure)
callbacks.TransportFailure(callbackContext, status);
gHdaDdk->Debug->Print("HDA: recovery failed status=0x%x\n", status);
DbgPrint("HDA: recovery failed status=0x%x\n", status);
}
if (queueDpc)
(void)KeInsertQueueDpc(&controller->Dpc, (void*)0, (void*)0);