Autor Wątek: Przerwania PCI  (Przeczytany 4456 razy)

mangado

  • Nowy u
  • *
  • Wiadomości: 19
    • Zobacz profil
Przerwania PCI
« dnia: Maj 23, 2014, 01:10:26 »
Witajcie!
mam temat do rozgryzienia!
Jak w x86 poprawnie odczytać gdzie lądują w APIC-u przerwania z magistrali PCI.
Tabelki MP niby to pokazują ale...
PCI ma niby 4 przerwania #INTA, #INTB, #INTC, #INTB
Na żywym kompie okazuje się po odczytaniu tabelek MP, że taki #INTA ląduje do więcej niż jednego "pin-a" IO APIC-a!
WTF?!
Z PiCI odczytam czy to #INTA czy ..B i co, dalej się nie dowiem jakie będzie z tego irq?
O co kaman?
W sieciowie pisali, że bez ACPI i AML nie pojedziesz...
Piszta ludu co sądzita o tem?

Nevar

  • Administrator
  • Nowy u
  • *****
  • Wiadomości: 24
    • Zobacz profil
Odp: Przerwania PCI
« Odpowiedź #1 dnia: Maj 23, 2014, 12:12:37 »
Nigdy nie doszedlem do programowania PCI wiec nie wiem czy ci pomoge. Jednak slyszalem o czyms takim jak MSI jezeli chodzi o przerwania i PCI. Moge jednak podlinkowac wiki http://en.wikipedia.org/wiki/Message_Signaled_Interrupts

mangado

  • Nowy u
  • *
  • Wiadomości: 19
    • Zobacz profil
Odp: Przerwania PCI
« Odpowiedź #2 dnia: Maj 23, 2014, 23:50:10 »
A ten MSI to takie irq z PCI prosto do LAPIC-a konkretnego CPU...
Na razie to trzeba przetrawić trasę PCI IO APIC...

Nevar

  • Administrator
  • Nowy u
  • *****
  • Wiadomości: 24
    • Zobacz profil
Odp: Przerwania PCI
« Odpowiedź #3 dnia: Maj 24, 2014, 11:35:00 »
Z tego co ja zrozumiałem to są 4 linie przerwań oznaczone A B C D, i urządzenia PCI są podłączone po kilka do tej samej linii. Na płycie głównej jest to jakoś fizycznie rozwiązane jaki slot PCI z jakim przerwaniem (ABCD) jest powiązany. A jeżeli chodzi i inne urządzenia typu dyski do tez pewnie jest to jakoś w sprzęcie na stałe zapięte. Co pewnie można z tych tablic ACPI czy MP odczytać.

Obsługa takich przerwań przypuszczam, że wygląda tak: przychodzi przerwanie A to w handlerze musisz sprawdzić jakie urządzenia są na tym przerwaniu i sprawdzić jakoś które z nich wymaga obsługi. Jak to sprawdzić to nie wiem, może przez odczytywanie jakiegoś stanu z rejestrów urządzeń na PCI.

Musze odświeżyć swoje info o tym bo dość dawno o tym czytałem i mogłem już coś zapomnieć. No i nie implementowałem tego praktycznie więc to raczej nie sprawdzone info.

mangado

  • Nowy u
  • *
  • Wiadomości: 19
    • Zobacz profil
Odp: Przerwania PCI
« Odpowiedź #4 dnia: Maj 24, 2014, 17:48:55 »
W tabliczkach MP są tabelki z "trasą" urządzenie - IO APIC.
Jeżeli to jest urządzenie PCI to wpis "srcBusIrq" traktować trzeba inaczej:
bity 0-1:
"Identifies the PCI interrupt signal, where 0x0 corresponds to INT_A#, 0x1 to INT_B#, 0x2 to INT_C# and 0x3 to INT_D#."
bity 2-6
"Gives the PCI Device Number where the interrupt originates."

No i wszystko byłoby jasne, gdyby nie to, że kilka urządzeń PCI z np INT_A# ląduje do różnych wejść IO APICA co by oznaczało różne irq!!!

mangado

  • Nowy u
  • *
  • Wiadomości: 19
    • Zobacz profil
Odp: Przerwania PCI
« Odpowiedź #5 dnia: Maj 31, 2014, 20:45:21 »
Chyba teraz będzie OKi.
Mapowanie wygląda tak: (na 99%)

MP tabelka      |     PCI 
----------------------------
srcBusId    =   nBus
srcBusIrq (bity 2-6 ) = nDev
srcBusIrq (bity 0,1 ) = PCI_INTERRUPT_PIN (0x3D)

jeśli te 3 się zgadzają to z MP odczytujemy dstIOAid - nr id (nie musi być 0!) IO APIC-a,   dstIOAintin - numer wejścia IO APIC-a.

No a teraz pora na rozgryzienie PCI IDE...