Compartilhar via


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