SRIOV_SET_POWER_STATE função de retorno de chamada (pcivirt.h)
Define o estado de energia da VF (Função Virtual SR-IOV) PCI Express especificada.
Sintaxe
SRIOV_SET_POWER_STATE SriovSetPowerState;
NTSTATUS SriovSetPowerState(
[in] PVOID Context,
[in] USHORT VfIndex,
[in] DEVICE_POWER_STATE PowerState,
[in] BOOLEAN Wake
)
{...}
Parâmetros
[in] Context
Um ponteiro para um contexto definido pelo driver.
[in] VfIndex
Um índice baseado em zero do VF ao qual essa operação de conjunto de estado de energia se aplica.
[in] PowerState
Um valor de tipo DEVICE_POWER_STATE que indica o estado de energia Dx a ser definido.
[in] Wake
Um valor booliano que indica se é necessário armar o dispositivo para um PME (sinal de ativação para dispositivos PCI Express), pois ele entra no estado de baixa energia. TRUE indica que o dispositivo está armado; Caso contrário, FALSE. Esse valor deverá ser FALSE se PowerState for PowerDeviceD0.
Retornar valor
Defina como STATUS_SUCCESS se a solicitação for bem-sucedida. Caso contrário, retorne um código NTSTATUS apropriado para indicar a condição de erro.
Comentários
Essa função de retorno de chamada é implementada pelo driver de função física (PF). O retorno de chamada é invocado quando o sistema deseja alterar o estado de energia de uma função virtual.
O driver PF registra sua implementação definindo o membro SetVfPowerState do SRIOV_DEVICE_INTERFACE_STANDARD, configurando uma estrutura de WDF_QUERY_INTERFACE_CONFIG e chamando WdfDeviceAddQueryInterface.
Aqui está um exemplo de implementação dessa função de retorno de chamada.
NTSTATUS
Virtualization_SetPowerState (
__inout PVOID Context,
USHORT VfIndex,
DEVICE_POWER_STATE PowerState,
BOOLEAN Wake
)
{
PDEVICE_CONTEXT deviceContext;
WDF_POWER_DEVICE_STATE wdfPowerState;
NTSTATUS status;
PAGED_CODE();
status = STATUS_SUCCESS;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INTERFACE,
"Virtualization_SetPowerState received with \
VFIndex = %d, PowerState = %d, Wake = %d\n",
VfIndex, PowerState, Wake);
deviceContext = (PDEVICE_CONTEXT) Context;
if (VfIndex >= deviceContext->NumVFs)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_INTERFACE,
"VfIndex specified: %d was out of bounds. NumVFs: %d\n",
VfIndex, deviceContext->NumVFs);
return STATUS_INVALID_PARAMETER;
}
switch (PowerState)
{
case PowerDeviceD0:
wdfPowerState = WdfPowerDeviceD0;
break;
case PowerDeviceD1:
wdfPowerState = WdfPowerDeviceD1;
break;
case PowerDeviceD2:
wdfPowerState = WdfPowerDeviceD2;
break;
case PowerDeviceD3:
wdfPowerState = WdfPowerDeviceD3;
break;
default:
return STATUS_INVALID_PARAMETER;
}
WdfWaitLockAcquire(deviceContext->PowerStateLock, NULL);
deviceContext->VfContext[VfIndex].VfPowerDeviceState = wdfPowerState;
deviceContext->VfContext[VfIndex].VfWake = Wake;
WdfWaitLockRelease(deviceContext->PowerStateLock);
return status;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 10 |
Servidor mínimo com suporte | Windows Server 2016 |
Plataforma de Destino | Windows |
Cabeçalho | pcivirt.h |
IRQL | PASSIVE_LEVEL |