serviço do kernel eeh_init_multifunc

Propósito

Este serviço de kernel registra um slot de adaptador multifunção em um barramento PCI/PCI-E para funcionamento de EEH.

Sintaxe

#include <sys/eeh.h>

eeh_handle_t eeh_init_multifunc(gpbid, pbid, slot, flags, delay_seconds, 
                                callback_ptr, dds_ptr)
long gpbid;
long pbid;
long slot;
long flags;
long delay_seconds;
long (*callback_ptr)();
void *dds_ptr;

Parâmetros

Item Descrição
gpbid Identificador de ônibus de barramento avô.
pbid Identificador de barramento de barramento pai.
slot Slot no barramento pai (device*8+function). Essa é a mesma propriedade "connwhere" em CuDv para o dispositivo.
sinalizadores Sinalizadores para solicitar e habilitar certos comportamentos.
atraso_segundos Tempo de atraso após um reset (em segundos).
callback_ptr Rotina de callback do driver de dispositivo.
dds_ptr Cookie para um driver de dispositivo de destino que geralmente é um ponteiro para a estrutura do adaptador.

Descrição

Este serviço de kernel é fornecido para sistemas que suportam domínio compartilhado de EEH, onde uma ou mais funções PCI em um ou mais adaptadores poderiam pertencer ao mesmo domínio de recuperação de EEH. No passado, isso era chamado de "adaptador multifunção". O domínio de EEH compartilhado é um conceito mais geral do que apenas um adaptador multifunção. Recomenda-se também que os adaptadores de função única utilizem o modelo de EEH compartilhado. Todos os dispositivos PCI-E, única ou multifunção têm que utilizar o modelo de EEH compartilhado e, portanto, este serviço de kernel para se registrar para EEH (em vez de eeh_init ()). Em um domínio de EEH compartilhado, várias instâncias de drivers de dispositivos podem estar operando. As instâncias são independentes umas das outras e, portanto, esquecidas a existência de cada um. Por isso, ao recuperar um slot a partir de um evento de EEH, há a necessidade de coordenar o procedimento de recuperação entre eles. Assim como o eeh_init (), este serviço também retorna um eeh_handle para o driver de dispositivo de chamada.

Existem dois tipos de adaptadores: bridged and non-bridged. Um adaptador fretado tem uma ponte no cartão como PCI-to-PCI ou PCIX-to-PCIX ou switch PCI-E. Para adaptadores de ligação PCI e PCI-X, pbid é o ID do barramento do barramento pai e gpbid é o ID de barramento do barramento do avós. O barramento pai para um adaptador fretado é o barramento gerado pela ponte / interruptor no adaptador. Um licitação identifica um número de barramento e tipo. O tipo de barramento é IO_PCI no caso de barramento PCI e PCI-X, e IO_PCIE no caso de barramento PCI-E. O número do barramento é um identificador único determinado durante a configuração do barramento. A macro BID_VAL definida em ioacc.h é usada para gerar o bid(lance). Para adaptadores não colados, pbid e gpbid são os mesmos e são os IDs de barramento do barramento pai. Assim, quando pbid e gpbid possuem valores diferentes para um dispositivo PCI ou PCI-X, o kernel sabe que este é um adaptador fretado e precisa para a ponte recuperada como parte da recuperação de EEH. Não é necessário saber se um dispositivo PCI-E é freado ou não para os fins de EEH. Portanto, pbid e gpbid devem ser iguais e iguais ao lance do barramento pai.

Em síntese, há os seguintes casos:
  1. Os adaptadores não colados PCI/PCI-X e todos os adaptadores PCI-E: gpbid e pbid são iguais e iguais ao barramento pai licitação.
  2. Os adaptadores de fretados PCI/PCI-X, gpbid é barramento avô licitaçãoe pbid é licitação de barramento pai.

O argumento slot é a combinação de dispositivo / função ((dispositivo * 8) + função) como no esquema de endereçamento de PCI. É o mesmo que o valor connwhere ODM do dispositivo.

Os seguintes valores de sinalização são legais:
Item Descrição
EEH_ENABLE_FLAG/EEH_DISABLE_FLAG O slot é sempre ativado para EEH quando este serviço é chamado pelo primeiro driver naquele slot. Todas as solicitações subsequentes para ativar o slot via a sinalização EEH_ENABLE são ignoradas. Portanto, o argumento flag de EEH_ENABLE é opcional, e uma bandeira de EEH_DISABLE é ignorada.
EEH_CHECK_SLOT O argumento de sinalização de EEH_CHECK_SLOT verifica se um determinado slot já está registrado. Um valor de EEH_SLOT_ACTIVE ou EEH_SLOT_FREE é retornado. Nenhum registro ocorre com a bandeira EEH_CHECK_SLOT , e ele suplanta todas as outras bandeiras. Esta sinalização simplesmente verifica o slot e retorna sem nenhuma outra ação.
EEH_ENABLE_NO_SUPPORT_RC Os serviços eeh_enable_pio () e eeh_enable_dma () retornam o valor EEH_NO_SUPPORT sob certas condições. Veja eeh_enable_dma Serviço de Kernel e eeh_enable_pio Serviço de Kernel para obter mais informações.
EEH_ENABLE_INTR_RC Os serviços eeh_enable_pio (), eeh_enable_dma ()e eeh_reset_slot () retornam o valor EEH_INTR sob certas condições. Nesse caso, as mensagens de callback também são ressignificadas para uma rotina de callback de EEH.
EEH_ENABLE_CLEAR_CALLBACK O serviço eeh_clear () pode invocar a rotina de callback do driver de dispositivo antes que ele devolve qualquer valor.
Nota: Você pode executar bitwise OR operação em várias bandeiras.

O argumento delay_seconds permite que o driver do dispositivo configure um atraso de tempo entre a conclusão do reset de PCI e a configuração da ponte sobre o adaptador. O atraso é forçado mesmo se o adaptador estiver não colado. Se um valor de 0 for especificado para delay_seconds, um tempo de atraso padrão de 1 second minutos será definido. Quando vários drivers se registram no mesmo pbid (sob um domínio compartilhado de EEH), o maior tempo de atraso entre todos os drivers registrados é usado.

O argumento callback_ptr é um ponteiro de função para uma rotina de callback de EEH. O manipulador é definido pelo driver de dispositivo e é chamado pelo kernel, a fim de coordenar a recuperação entre diferentes drivers na mesma ranhura. O driver trata de uma variedade de mensagens do kernel em sua rotina de callback. Essas mensagens acionam o próximo passo em recuperação. As rotinas de callback são chamadas sequencialmente no nível de interrupção INTIODONE.

O argumento dds_ptr é um cookie que é passado para o driver quando a rotina de callback é invocada. Os drivers normalmente especificam um ponteiro para a estrutura do adaptador do driver do dispositivo.

EEH_SAFE mode: Um adaptador freado precisa ter sua ponte reconfigurada no final do reset de PCI. No entanto, se o firmware da plataforma não suportar a reconfiguração da ponte, o adaptador é marcado como EEH_SAFE pelo kernel. Um adaptador EEH_SAFE não pode terminar a recuperação de erro após um evento de EEH por causa da dependência de firmware insatisfeito. Veja eeh_reset_slot para obter informações sobre como a recuperação de erro é tratada no modo EEH_SAFE.

A macro EEH_INIT_MULTIFUNC(gpbid, pbid, slot, bandeira, delay_seconds, callback_ptr, dds_ptr) é fornecida para os drivers do dispositivo, a fim de chamar este serviço. Este é um serviço de kernel exportado.

Ambiente de Execução

Este serviço de kernel só pode ser chamado a partir do ambiente do processo.

Valores De Retorno

Item Descrição
EEH_FAIL Não é possível alocar alça de EEH.
EEH_NO_SUPPORT A EEH não é suportada neste sistema, sem alça alocada.
EEH_SLOT_ACTIVE Dado slot já está registrado.
EEH_SLOT_FREE Dado vaga livre.
EEH_OCUPADO Incapaz de continuar, porque o slot está no meio da recuperação de erros.
struct eeh_handle * Ao Sucesso.