Linee guida per l'implementazione del driver MCDM KM
Questo articolo fornisce indicazioni su come scrivere la parte del driver in modalità kernel di un driver MCDM (Compute Only Driver) Microsoft, noto anche come driver di solo calcolo.
Vedere anche gli articoli seguenti:
File INF del driver
I dispositivi MCDM appartengono alla classe ComputeAccelerator , che deve essere specificata nel file INF:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inizializzazione del driver
Un driver di solo calcolo deve fornire una funzione DriverEntry che esegue i passaggi seguenti:
- Allocare e inizializzare una struttura DRIVER_INITIALIZATION_DATA . Per informazioni dettagliate, vedere Requisiti di supporto delle funzioni driver .
- Chiamare DxgkInitialize con la struttura inizializzata.
Requisiti di supporto delle funzioni driver
Un driver di solo calcolo espone le funzioni implementate nella struttura DRIVER_INITIALIZATION_DATA .
Supporto minimo richiesto
Come minimo, un driver di sola elaborazione deve fornire le funzioni DDI (Device Driver Interface) seguenti:
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (per altre informazioni, vedere DxgkDdiQueryAdapterInfo requirements)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Supporto dell'apertura dell'host CPU
Se è supportata l'apertura dell'host CPU, è necessario specificare anche i puntatori alle funzioni seguenti:
Per altre informazioni, vedere Apertura host CPU.
Supporto dell'indirizzamento fisico
Se si usa l'indirizzamento fisico, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto dell'indirizzamento virtuale GPU
Se si usa l'indirizzamento virtuale GPU, è necessario specificare anche i puntatori alle funzioni seguenti:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Supporto dell'isolamento IoMmu
Se l'isolamento IoMmu è supportato, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto dell'adattatore di collegamento
Per il supporto facoltativo dell'adattatore di collegamento, è necessario specificare anche un puntatore alla funzione seguente:
Supporto per il risparmio energia
Per il supporto facoltativo per il risparmio energia, è necessario specificare anche i puntatori alle funzioni seguenti:
- DxgkDdiSetPowerComponentFState; obbligatorio se i componenti segnalati supportano gli stati F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
NOTA: il supporto per il risparmio energia è necessario nei sistemi Modern Standby o Connected Standby.
Per altre informazioni, vedere Risparmio energia GPU di stati di inattività e alimentazione attiva.
Supporto per la rimozione di sorprese
Per il supporto facoltativo per la rimozione delle sorprese, è necessario specificare anche i puntatori alle funzioni seguenti:
Annullare il supporto
Per il supporto facoltativo per l'annullamento, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto dell'interfaccia
Per il supporto facoltativo dell'interfaccia, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto per la pianificazione hardware
Per il supporto facoltativo della pianificazione hardware, è necessario specificare anche puntatori alle funzioni seguenti:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Supporto di UpdateAllocationProperty
Per il supporto facoltativo updateAllocationProperty, è necessario specificare anche i puntatori alle funzioni seguenti:
- DxgkDdiValidateUpdateAllocationProperty
Supporto di escape
Per il supporto di escape facoltativo, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto di Event Tracing for Windows
Per il supporto ETW facoltativo, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto per dispositivi figlio
Per il supporto facoltativo dei dispositivi figlio, è necessario specificare anche puntatori alle funzioni seguenti:
Supporto per la creazione di report sul consumo energetico
Per il supporto facoltativo per la creazione di report sul consumo energetico, è necessario specificare anche i puntatori alle funzioni seguenti:
Convalida dell'invio di comandi
Per la convalida dell'invio di comandi facoltativi, è necessario specificare anche puntatori alle funzioni seguenti:
Supporto IOCTL
Per il supporto IOCTL facoltativo, è possibile specificare un puntatore alla funzione seguente:
Funzioni non consentite
Le DDI seguenti non devono essere fornite in un driver MCDM:
- DxgkDdiAcquireSwizzlingRange
- DxgkDdiCheckMultiPlaneOverlaySupport
- DxgkDdiCheckMultiPlaneOverlaySupport2
- DxgkDdiCheckMultiPlaneOverlaySupport3
- DxgkDdiCommitVidPn
- DxgkDdiControlDiagnosticReporting
- DxgkDdiControlInterrupt
- DxgkDdiControlInterrupt2
- DxgkDdiControlModeBehavior
- DxgkDdiCreateOverlay
- DxgkDdiCreatePeriodicFrameNotification
- DxgkDdiCreateProtectedSession
- DxgkDdiDestroyOverlay
- DxgkDdiDestroyPeriodicFrameNotification
- DxgkDdiDestroyProtectedSession
- DxgkDdiDisplayDetectControl
- DxgkDdiEnumVidPnCofuncModality
- DxgkDdiExchangePreStartInfo
- DxgkDdiFlipOverlay
- DxgkDdiGetMultiPlaneOverlayCaps
- DxgkDdiGetPostCompositionCaps
- DxgkDdiGetScanLine
- DxgkDdiIsSupportedVidPn
- DxgkDdiNotifyAcpiEvent
- DxgkDdiNotifyFocusPresent
- DxgkDdiPostMultiPlaneOverlayPresent
- DxgkDdiPresent
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryCurrentFence
Funzioni WDDM 1.x
Le funzioni seguenti vengono usate solo per i driver WDDM 1.x:
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (il driver non deve segnalare alcun componente di alimentazione P-state)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Requisiti delle informazioni sull'adattatore di query
Come indicato in precedenza, un driver di solo calcolo deve supportare DxgkDdiQueryAdapterInfo.
I tipi di DXGK_QUERYADAPTERINFOTYPE seguenti devono essere supportati:
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (per altre informazioni, vedere Uso di segmenti di memoria per descrivere lo spazio indirizzi GPU)
Il supporto per i tipi di DXGK_QUERYADAPTERINFOTYPE seguenti è facoltativo:
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Se sono stati segnalati uno o più blocchi di memoria non validi, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Se la GPUVA è supportata, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Se il numero di componenti di alimentazione segnalati è maggiore di zero, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_POWERCOMPONENTINFO
Se è impostato il limite IoMmuSecureModeSupported , è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
Il DXGK_QUERYADAPTERINFOTYPE seguente non deve essere supportato:
- DXGKQAITYPE_DEVICE_TYPE_CAPS
- DXGKQAITYPE_DISPLAY_DRIVERCAPS_EXTENSION
- DXGKQAITYPE_DISPLAYID_DESCRIPTOR
- DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR
- DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2
- DXGKQAITYPE_POWERCOMPONENTPSTATEINFO
- DXGKQAITYPE_PREFERREDGPUNODE
- DXGKQAITYPE_QUERYCOLORIMETRYOVERRIDES
- DXGKQAITYPE_QUERYSEGMENT
- DXGKQAITYPE_QUERYSEGMENT2
- DXGKQAITYPE_QUERYSEGMENT3
- DXGKQAITYPE_UEFIFRAMEBUFFERRANGES
Requisiti di funzionalità del driver
I membri della struttura DXGK_DRIVERCAPS seguenti devono essere impostati sui valori appropriati:
Membro | Note |
---|---|
HighestAcceptableAddress | Se questo indirizzo è minore dell'indirizzo fisico più alto della memoria di sistema presente durante il caricamento del driver, il carico avrà esito negativo. |
InterruptMessageNumber | Impostare come appropriato. |
SchedulingCaps | Vedere Requisiti di SchedulingCaps. |
MemoryManagementCaps | Vedere Requisiti di MemoryManagementCaps. |
GpuEngineTopology | Impostare NbAsymetricProcessingNodes sul numero di motori GPU supportati. |
WDDMVersion | Deve essere impostato su DXGKDDI_WDDMv2_6 o versione successiva. |
PreemptionCaps | Impostare GraphicsPreemptionGranularity in modo appropriato sul livello supportato dall'hardware. Come minimo è consigliabile tentare di supportare la precedenza a livello di pacchetto; ovvero un pacchetto di rimozione dalla coda che è stato pianificato ma che non ha ancora avviato l'esecuzione. Impostare ComputePreemptionGranularity su qualsiasi valore diverso da D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Deve essere impostato su TRUE. Vedere Modifiche TDR in Windows 8 e versioni successive. |
SupportRuntimePowerManagement | Impostare come appropriato. Vedere Risparmio energia GPU di stati di inattività e alimentazione attiva. |
SupportSurpriseRemovalInHibernation | Impostare su TRUE se il driver supporta la rimozione a sorpresa durante l'ibernazione; in caso contrario, impostare come appropriato. Vedere DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Deve essere impostato su FALSE. |
HybridIntegrated | Deve essere impostato su FALSE. |
InternalGpuVirtualAddressRangeStart | Impostare come appropriato. Se GpuVA non è supportato, impostare su zero. Se GpuVA è supportato, questo valore specifica l'inizio dell'intervallo va usato dal sistema operativo durante l'allocazione di risorse interne per l'uso interno del sistema operativo. |
InternalGpuVirtualAddressRangeEnd | Impostare come appropriato. Se GpuVA non è supportato, impostare su zero. Se GpuVA è supportato, questo valore specifica la fine dell'intervallo di disponibilità che il sistema operativo userà durante l'allocazione di risorse interne per l'uso interno del sistema operativo. Se i valori iniziale e finale sono zero, il sistema operativo userà l'intero intervallo di va disponibile. |
SupportSurpriseRemoval | Impostare come appropriato. Impostare su TRUE se il driver supporta la rimozione a sorpresa anche all'esterno dell'ibernazione. Vedere DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
ComputeOnly | Deve essere impostato su TRUE. Questo flag deve essere implementato. |
I membri della struttura di DXGK_DRIVERCAPS seguenti devono essere impostati su zero o FALSE, di conseguenza:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Staccabile
Requisiti di pianificazioneCaps
La DXGK_DRIVERCAPS seguente. I membri della struttura SchedulingCaps devono essere impostati sui valori appropriati:
Membro | Note |
---|---|
MultiEngineAware | Deve essere impostato su TRUE. Vedere Preemption DELLA GPU. |
VSyncPowerSaveAware | Deve essere impostato su FALSE. |
PreemptionAware | Deve essere impostato su TRUE. Vedere Preemption DELLA GPU. |
NoDmaPatching | Deve essere impostato su FALSE. |
CancelCommandAware | Impostare in base alle esigenze. Vedere DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Impostare in base alle esigenze. Vedere Monitoraggio del contesto. |
LowIrqlPreemptCommand | Impostare su TRUE. Il sistema operativo chiamerà dxgkDdiPreemptCommand a basso IRQL. |
HwQueuePacketCap | Riservati; impostato su zero. |
Requisiti di MemoryManagementCaps
La DXGK_DRIVERCAPS seguente. I membri della struttura MemoryManagementCaps devono essere impostati sui valori appropriati:
Membro | Note |
---|---|
OutOfOrderLock | Deve essere impostato su FALSE. |
DedicatoPagingEngine | Deve essere impostato su FALSE. |
PagingEngineCanSwizzle | Deve essere impostato su FALSE. |
SectionBackedPrimary | Deve essere impostato su FALSE. |
CrossAdapterResource | Impostare in base alle esigenze. Vedere Uso di risorse tra adattatori in un sistema ibrido. |
VirtualAddressingSupported | Impostare in base alle esigenze. Vedere Memoria virtuale GPU in WDDM 2.0. Se questo membro è impostato, il driver deve anche impostare GpuMmuSupported e/o IoMmuSupported. |
GpuMmuSupported | Impostare in base alle esigenze. Vedere Modello GpuMmu. |
IoMmuSupported | Impostare in base alle esigenze. Questo limite viene impostato quando le tabelle di pagina condividono le tabelle di pagina con la CPU (memoria virtuale condivisa) (SVM). Vedere Modello IoMmu. |
ReplicareGdiContent | Deve essere impostato su FALSE. |
NonCpuVisiblePrimary | Deve essere impostato su FALSE. |
ParavirtualizationSupported | I driver host MCDM che supportano la virtualizzazione del dispositivo tramite l'interfaccia di partizionamento GPU (GPU-P con SR-IOV) devono impostare questo campo su FALSE. Tutti gli altri casi (driver per computer fisici senza supporto GPU-P o driver guest di vGP esposti tramite GPU-P) devono impostare questo campo su TRUE. |
IoMmuSecureModeSupported | Impostare in base alle esigenze. Se questo limite è impostato su TRUE, il driver supporta l'isolamento IoMmu (il dispositivo ha una tabella di pagina dedicata per l'unità IoMmu). Se questo limite è impostato SU FALSE, il dispositivo non può essere usato nelle macchine virtuali "sicure" (Sandbox di Windows o MDAG). |
DisableSelfRefreshVRAMInS3 | Impostare in base alle esigenze. |
Gestione della memoria
L'indirizzamento virtuale è obbligatorio. Il supporto di indirizzamento fisico potrebbe essere abilitato in futuro.
I dispositivi non sono necessari per supportare un'apertura di memoria.
Sono supportati solo segmenti di spazio di memoria lineare e segmenti di spazio di apertura lineare .