Condividi tramite


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:

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:

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:

Supporto dell'isolamento IoMmu

Se l'isolamento IoMmu è supportato, è necessario specificare anche i puntatori alle funzioni seguenti:

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:

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:

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:

DxgkDdiDispatchIoRequest

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:

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 .