Consultando o espaço de configuração PCI para uma função virtual

Nota Esse método só pode ser usado por drivers overlying executados no sistema operacional de gerenciamento da partição pai do Hyper-V.

O driver de miniporto para uma VF (função virtual) PCI Express (PCIe) é executado no sistema operacional convidado de uma partição filho do Hyper-V. Por isso, o driver de miniporto VF não pode acessar diretamente os recursos de hardware, como o espaço de configuração PCIe do VF. Somente o driver de miniporto para a função física pcie (PF) pode acessar o espaço de configuração PCIe para um VF. O driver de miniporto PF é executado no sistema operacional de gerenciamento de uma partição pai do Hyper-V e tem acesso privilegiado aos recursos do VF.

Um driver sobreposto executado no sistema operacional de gerenciamento emite uma solicitação de método OID (identificador de objeto) de OID_SRIOV_READ_VF_CONFIG_SPACE para ler dados do espaço de configuração PCIe para um VF especificado no adaptador de rede.

Por exemplo, a pilha de virtualização executada no sistema operacional de gerenciamento emite a solicitação de método OID de OID_SRIOV_READ_VF_CONFIG_SPACE quando o driver de miniporto VF chama NdisMGetBusData para ler seu espaço de configuração pcie VF.

Antes de emitir essa solicitação de método OID, o driver sobreposto deve definir os membros da estrutura NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS da seguinte maneira:

  • O membro VFId deve ser definido como o identificador do VF do qual as informações devem ser lidas.

  • O membro Offset deve ser definido como o deslocamento dentro do espaço de configuração PCIe do VF no qual os dados serão lidos.

  • O membro Length deve ser definido como o número de bytes a serem lidos do espaço de configuração PCIe do VF.

  • O membro BufferOffset deve ser definido como o deslocamento dentro do buffer (referenciado pelo membro InformationBuffer ) que conterá os dados lidos do espaço de configuração PCI do VF especificado. Esse deslocamento é especificado em unidades de bytes desde o início da estrutura NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS .

Quando ele lida com a solicitação de método OID de OID_SRIOV_READ_VF_CONFIG_SPACE, o driver de miniporto PF deve seguir estas diretrizes:

  • O driver de miniporto deve verificar se o VF, especificado pelo membro VFId da estrutura NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS , tem recursos que foram alocados anteriormente. O driver de miniporto aloca recursos para um VF por meio de uma solicitação de método OID de OID_NIC_SWITCH_ALLOCATE_VF. Se os recursos do VF especificado não tiverem sido alocados, o driver deverá falhar na solicitação OID.

  • O driver de miniporte deve verificar se o buffer (referenciado pelo membro InformationBuffer da estrutura NDIS_OID_REQUEST ) é grande o suficiente para retornar os dados de espaço de configuração do PCIe solicitados. Se isso não for verdade, o driver deverá falhar na solicitação OID.

  • O driver de miniporto normalmente chama NdisMGetVirtualFunctionBusData para consultar o espaço de configuração do PCIe solicitado. No entanto, o driver de miniporto também pode retornar dados de espaço de configuração PCIe para o VF que o driver armazenou em cache de operações de leitura ou gravação anteriores do espaço de configuração PCIe.

    Nota Se um IHV (fornecedor independente de hardware) fornecer um VBD (driver de barramento virtual) como parte de seu pacote de driver SR-IOV, seu driver de miniporte não deverá chamar NdisMGetVirtualFunctionBusData. Em vez disso, o driver deve fazer a interface com o VBD por meio de um canal de comunicação privado e solicitar que o VBD chame ReadVfConfigBlock. Essa função é exposta da interface GUID_VPCI_INTERFACE_STANDARD compatível com o driver de barramento VPCI (PCI virtual) subjacente.

Após um retorno bem-sucedido dessa solicitação de método OID, o membro InformationBuffer da estrutura NDIS_OID_REQUEST contém um ponteiro para um buffer alocado pelo chamador. Esse buffer é formatado para conter o seguinte: