Forum Nevar.pl
Programowanie => OS-Dev => Wątek zaczęty przez: mangado w 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?
-
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 (http://en.wikipedia.org/wiki/Message_Signaled_Interrupts)
-
A ten MSI to takie irq z PCI prosto do LAPIC-a konkretnego CPU...
Na razie to trzeba przetrawić trasę PCI IO APIC...
-
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.
-
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!!!
-
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...