Próbuję napisać sterownik z niestandardową funkcją mmap()
dla PCIe BAR, z celem, aby ta pamięć podręczna BAR w pamięci podręcznej procesora. Zdaję sobie sprawę, że nie jest to najlepszy sposób na osiągnięcie największej przepustowości, a kolejność zapisów jest nieprzewidywalna (podobnie jak w tym przypadku).jak zrobić mmap dla cacheable PCIe BAR
Jest to podobne do tego, co zostało opisane w How would one prevent MMAP from caching values?
procesor jest Sandy Bridge i7, urządzenie PCIe jest Altera Stratix IV dev. tablica.
Najpierw spróbowałem zrobić to na CentOS 5 (2.6.18). Zmieniłem ustawienia MTRR, aby upewnić się, że BAR nie mieści się w zakresie niekumulowalnego MTRR i że użyto io_remap_pfn_range()
z usuniętymi bitami _PAGE_PCD
i _PAGE_PWT
. Odczyty działały zgodnie z oczekiwaniami: odczytuje zwracane prawidłowe wartości, a drugie odczytuje ten sam adres, niekoniecznie powoduje, że odczyt przechodzi do PCIe (odczyt licznika sprawdzono w FPGA). Jednak zapisy spowodowały zawieszenie systemu, a następnie ponowne uruchomienie bez żadnych komunikatów w dziennikach lub na ekranie.
Po drugie, próbowałem zrobić to na CentOS 6 (2.6.32), który ma wsparcie PAT. Wynik jest taki sam: czyta działa poprawnie, pisze powoduje zawieszenie systemu i ponowne uruchomienie. Interesujące jest, że zapisywanie pełnych zapisów linii pamięci podręcznej (AVX/SSE) w trybie czasowym/do zapisu działa zgodnie z oczekiwaniami, tj. Zawsze przechodzą one do FPGA, a FPGA obserwuje pełne zapisy w pamięci podręcznej, odczytuje następnie poprawne wartości zwracane. Jednak proste zapisywanie 64-bitowe nadal powoduje zawieszenie/ponowne uruchomienie systemu.
Próbowałem również ioremap_cache()
, a następnie iowrite32()
wewnątrz kodu sterownika. Wynik jest taki sam.
Myślę, że jest to problem sprzętowy, ale byłbym wdzięczny, gdyby ktoś mógł podzielić się pomysłami na temat tego, co się dzieje.
EDYCJA: Udało mi się przechwycić komunikat MCE na CentOS 6: Wyjątek sprawdzania urządzenia: 5 Bank 5: be2000000003110a.
Próbowałem również tego samego kodu na 2-gniazdowym Sandy Bridge (Romley): odczyt i zachowanie zapisu poza godziną jest takie samo, proste zapisy nie powodują MCE/awarii, ale nie mają wpływu na stan systemu, tj. Wartość w pamięć się nie zmienia.
Próbowałem również tego samego kodu na starszym systemie 2-gniazdowym Nehalem: proste zapisy powodują również MCE, chociaż kody są różne.