Service de noyau eeh_init_multifunc

Objectif

Ce service de noyau enregistre un emplacement d'adaptateur multifonction sur un bus PCI / PCI-E pour la fonction EEH.

Syntaxe

#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;

Paramètres

Article Descriptif
Gpbid Identificateur de bus du bus grand-parent.
Pbid Identificateur de bus du bus parent.
emplacement Emplacement sur le bus parent (device*8+function). Identique à la propriété "connwhere" dans CuDv pour le périphérique.
Flags Les indicateurs pour demander et activer certains comportements.
Delay_secondes Délai après une réinitialisation (en secondes).
Ptr callback_ptr Routine de rappel du pilote de périphérique.
Dds_ptr Cookie vers un pilote de périphérique cible qui est généralement un pointeur vers la structure de l'adaptateur.

Descriptif

Ce service de noyau est fourni pour les systèmes qui prennent en charge le domaine EEH partagé, où une ou plusieurs fonctions PCI d'un ou plusieurs adaptateurs peuvent appartenir au même domaine de reprise EEH. Dans le passé, il s'agissait d'un "adaptateur multifonction". Le domaine EEH partagé est un concept plus général qu'un adaptateur multifonction. Il est également recommandé que les adaptateurs de fonction unique utilisent le modèle EEH partagé. Tous les périphériques PCI-E, uniques ou multifonctions doivent utiliser le modèle EEH partagé et donc ce service de noyau pour s'enregistrer pour EEH (au lieu de Eeh_init ()). Dans un domaine EEH partagé, plusieurs instances de pilotes de périphérique peuvent fonctionner. Les instances sont indépendantes l'une de l'autre et sont donc inconscients de l'existence de l'autre. Par conséquent, lors du rétablissement d'un emplacement à partir d'un événement EEH, il est nécessaire de coordonner la procédure de reprise entre eux. Comme pour Eeh_init (), ce service renvoie également un Descripteur eeh_handle au pilote de périphérique appelant.

Il existe deux types d'adaptateurs: pontés et non pontés. Un adaptateur ponté dispose d'un pont sur la carte, par exemple PCI-to-PCI ou PCIX-to-PCIX ou PCI-E. Pour les cartes de pont PCI et PCI-X, Pbid est l'ID de bus du bus parent, et Gpbid est l'ID bus du bus grand-parent. Le bus parent d'une carte pontée est le bus généré par le pont / commutateur sur l'adaptateur. Un Soumission identifie un numéro de bus et un type. Le type de bus est IO_PCI dans le cas des bus PCI et PCI-X, et IO_PCIE dans le cas du bus PCI-E. Le numéro de bus est un identificateur unique déterminé lors de la configuration du bus. La macro BID_VAL définie dans ioacc.h est utilisée pour générer l' offre. Pour les adaptateurs non pontés, Pbid et Gpbid sont identiques et sont les ID de bus du bus parent. Ainsi, lorsque Pbid et Gpbid ont des valeurs différentes pour un périphérique PCI ou PCI-X, le noyau sait qu'il s'agit d'un adaptateur ponté et qu'il a besoin du pont récupéré dans le cadre de la reprise EEH. Il n'est pas nécessaire de savoir si un dispositif PCI-E est ponté ou non aux fins de l'EEH. Par conséquent, Pbid et Gpbid doivent être identiques et identiques à l'offre de bus parent.

En résumé, il y a les cas suivants:
  1. Les cartes PCI/PCI-X non pontées et tous les adaptateurs PCI-E: Gpbid et Pbid sont identiques et égaux au bus parent Soumission.
  2. Les cartes de pont PCI/PCI-X, Gpbid est le bus grand-parent Soumission, et Pbid est l'offre de bus parent.

L'argument Emplacement est la combinaison unité / fonction ((unité * 8) +) comme dans le schéma d'adressage PCI. Cette valeur est identique à la valeur connwhere ODM de l'unité.

Les valeurs d'indicateur suivantes sont légales:
Article Descriptif
EEH_ENABLE_FLAG/EEH_DISABLE_FLAG L'emplacement est toujours activé pour EEH lorsque ce service est appelé par le premier pilote de cet emplacement. Toutes les demandes ultérieures d'activation de l'emplacement via l'indicateur EEH_ENABLE sont ignorées. Par conséquent, l'argument indicateur de EEH_ENABLE est facultatif et un indicateur EEH_DÉSACTIVER est ignoré.
EEH_CHECK_SLOT L'argument indicateur de EEH_CHECK_SLOT vérifie si un emplacement donné est déjà enregistré. Une valeur de EEH_SLOT_ACTIVE ou EEH_SLOT_FREE est renvoyée. Aucun enregistrement ne se produit avec l'indicateur EEH_CHECK_SLOT et il remplace tous les autres indicateurs. Cet indicateur vérifie simplement l'emplacement et les retours sans autre action.
EEH_ENABLE_NO_SUPPORT_RC Les services Eeh_enable_pio () et Eeh_enable_dma () renvoient la valeur EEH_NO_SUPPORT sous certaines conditions. Pour plus d'informations, voir Service de noyau eeh_enable_dma et Service de noyau eeh_enable_pio .
EEH_ENABLE_INTR_RC Les services Eeh_enable_pio (), Eeh_enable_dma ()et Eeh_reset_slot () renvoient la valeur EEH_INTR sous certaines conditions. Dans ce cas, les messages de rappel sont également réliés à une routine de rappel EEH.
EEH_ENABLE_CLEAR_CALLBACK Le service Eeh_clear () peut appeler la routine de rappel du pilote de périphérique avant de renvoyer une valeur.
Remarque: Vous pouvez effectuer une opération OR sur plusieurs indicateurs.

L'argument Delay_secondes permet au pilote de périphérique de définir un délai entre l'achèvement de la réinitialisation PCI et la configuration du pont sur l'adaptateur. Le délai est appliqué même si l'adaptateur n'est pas ponté. Si une valeur de 0 est spécifiée pour Delay_secondes, une heure de retard par défaut de 1 seconde est définie. Lorsque plusieurs pilotes s'enregistrent sur le même Pbid (dans un domaine EEH partagé), le délai le plus élevé pour tous les pilotes enregistrés est utilisé.

L'argument Ptr callback_ptr est un pointeur de fonction vers une routine de rappel EEH. Le gestionnaire est défini par le pilote de périphérique et est appelé par le noyau afin de coordonner la reprise entre différents pilotes sur le même emplacement. Le pilote gère une variété de messages du noyau dans sa routine de rappel. Ces messages déclenchont la prochaine étape de la reprise. Les routines de rappel sont appelées séquentiellement au niveau d'interruption INTIODONE.

L'argument Dds_ptr est un cookie transmis au pilote lorsque la routine de rappel est appelée. Les pilotes indiquent généralement un pointeur vers la structure de l'adaptateur du pilote de périphérique.

Mode EEH_SAFE: Un adaptateur ponté doit être reconfiguré à la fin de la réinitialisation de la carte PCI. Toutefois, si le microprogramme de la plateforme ne prend pas en charge la reconfiguration du pont, l'adaptateur est marqué comme EEH_SAFE par le noyau. Un adaptateur EEH_SAFE ne peut pas terminer la récupération d'erreurs après un événement EEH en raison de la dépendance de microprogramme non satisfaite. Voir Eeh_reset_slot pour plus d'informations sur la façon dont la récupération d'erreurs est traitée en mode EEH_SAFE.

La macro EEH_INIT_MULTIFUNC(Gpbid, Pbid, Emplacement, Indicateur, Delay_secondes, Ptr callback_ptr, Dds_ptr) est fournie pour les pilotes de périphérique afin d'appeler ce service. Il s'agit d'un service de noyau exporté.

Environnement d'exécution

Ce service de noyau ne peut être appelé que depuis l'environnement de processus.

Valeurs renvoyées

Article Descriptif
EEH_FAIL Impossible d'allouer la poignée EEH.
EEH_NO_SUPPORT EEH n'est pas pris en charge sur ce système, aucun descripteur alloué.
EEH_SLOT_ACTIVE L'emplacement indiqué est déjà enregistré.
EEH_SLOT_FREE Compte tenu de l'emplacement libre.
EEH_OCCUPÉ Impossible de continuer, car l'emplacement est au milieu de la reprise d'erreur.
Struct eeh_handle * En cas de succès.