2012-06-28 11 views
6

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.

Odpowiedz

6

Nie jestem świadomy żadnego sprzętu x86, który obsługuje typ pamięci WriteBack (WB) dla adresów MMIO, a prawie na pewno widzisz wynik tej niezgodności. strzelnica dwukrotnie mapowanie MMIO - - I napisali dyskusję na ten temat na moim blogu na http://blogs.utexas.edu/jdm4372/2013/05/29/ i http://blogs.utexas.edu/jdm4372/2013/05/30/

W tych księgowań omówię metodę, która działa na niektórych procesorach raz dla operacji sklepowych od procesora FPGA za pomocą pamięci typu Write-Combining (WC) i raz dla odczytu z procesora do FPGA za pomocą typów Write Protect (WP) lub Write Through (WT). Będziesz musiał zachować spójność ręcznie, używając CLFLUSH na liniach pamięci podręcznej w regionie "tylko do odczytu", gdy piszesz do aliasu tej linii w regionie "tylko do zapisu". Konieczne będzie również ręczne zachowanie spójności w odniesieniu do zmian wartości w pamięci FPGA, ponieważ urządzenia IO nie mogą generować transakcji unieważniania pamięci podręcznej dla adresów MMIO.

Mój zespół zrobił to kilka lat temu, kiedy byłem na AMD, i teraz próbuję dowiedzieć się, jak to zrobić z nowszymi jądrami Linuksa iz procesorami Intela. Linux nie obsługuje bezpośrednio typów pamięci WP lub WT z predefiniowanymi funkcjami mapowania, więc niektóre hakowanie jest wymagane ...Łatwo jest przesłonić MTRR dla regionu, ale mam więcej problemów ze znalezieniem właściwego miejsca (ów) w potomkach funkcji remap_pfn_range(), które muszę zmienić, aby uzyskać atrybut WP lub WT ustawiony w wpisy PAT dla zakresu.

Ta metoda jest prawdopodobnie lepiej dopasowana do układów FPGA niż do innych (wstępnie zdefiniowanych) typów urządzeń IO, ponieważ programowalność FPGA pozwala na elastyczność definiowania szyn PCI w celu pracy w tym trybie podwójnego odwzorowania i do współpracy ze sterownikiem po stronie procesora w utrzymywaniu spójności pamięci podręcznej.