O que determina se uma interrupção é IO-APIC-edge ou IO-APIC-level?

4

Olhando o conteúdo de /proc/interrupts em um x86 Linux, vejo que algumas das interrupções são IO-APIC-edge , enquanto outras são IO-APIC-level .

Eu me pergunto o que determina o tipo de interrupção, é o dispositivo de geração de interrupção, o controlador de interrupção (APIC), o kernel do Linux ou o BIOS?

(o motivo pelo qual me pergunto é porque eu movi uma placa PCI de um sistema Pentium III de processador duplo, onde ela foi reconhecida como IO-APIC-level para um sistema Xeon de processador duplo onde foi reconhecida como IO-APIC-edge )

    
por Andre Holzner 17.06.2011 / 21:31

2 respostas

2

Por exemplo, o 82093AA IO-APIC possui registros de tabela de redirecionamento de E / S (IOREDTBL) que tem um bit gravável especificando o modo de disparo (que pode ser sensível ao nível ou borda). Estes registros parecem ser refletidos por struct IO_APIC_route_entry na fonte do kernel.

Cavando um pouco através da fonte do kernel 2.6.18, encontra-se uma função setup_IO_APIC_irqs(..) que faz um loop sobre todos os IO-APICs encontrados e sobre todas as linhas IRQ para cada IO-APIC e chama io_apic_write(..) para gravar no APIC registros.

O tipo de trigger parece ser determinado pela função MPBIOS_trigger(..) (chamada por irq_trigger(..) ) que por sua vez parece consultar uma variável mp_irqs que por sua vez parece ser preenchida em arch/x86_64/kernel/mpparse.c . Este ficheiro parece ler a tabela de configuração MP em conformidade com a Especificação Intel MultiProcessor .

Qouting desta especificação:

The BIOS constructs the MP configuration data structures, presenting the 
hardware in a known format to the standard device drivers or to the 
hardware abstraction layer of the operating system.

Então eu diria que o kernel configura o tipo de trigger de interrupção baseado em informações fornecidas pelo BIOS.

Um comentário colateral: o artigo da Wikipédia sobre Interrupções menciona que

The original PCI standard mandated shareable level-triggered interrupts.

(que parece vir do fato de que interrupções acionadas por borda enviadas por vários dispositivos ao mesmo tempo na mesma linha irão colidir). Então IO-APIC-edge é um pouco inesperado para dispositivos PCI.

    
por 19.06.2011 / 10:30
0

O que determina isso é a variável lpfc_use_msi . Se você configurá-lo em 2 no modprobe.conf , ele usará o MSI em vez do IO. Recomenda-se usar o 'modo de interrupção MSI'.

    
por 02.01.2015 / 17:47