2017-01-18 4 views
1

이 질문은 언어에 구애받지 않는다고 생각하지만 시스템 Verilog로 작성된 PCIe 모델이 있습니다. 이 모델은 PCIe 구성 읽기 및 쓰기를 수행하고 시뮬레이션에서 메모리 읽기 및 쓰기를 완벽하게 수행합니다. 그러나, 내가해야 할 일은 PCIe 디바이스를 "발견"하고 시뮬레이션에서 설정 공간 레지스터를 구성하는 것입니다. 거기에 BAR 프로그래밍, SR-IOV가 발견 된 경우 "Bus Walk"를 얻을 수 있도록 자체 모델 트랜잭션 기능을 추가 할 수있는 Linux PCIe 열거 프로세스를 나타내는 가상 코드의 보일러 플레이트 청크가 있습니까? MSIx 설정? 이것이 PCIe 장치의 일반적인 연습 일 것 같아서 아마도 모델이있을 것입니다.PCIe 장치 검색 알고리즘 의사 코드

답변

3

끔찍한 일이 아닙니다. 기본적으로 구성 공간을 루프하여 첫 번째 루트 버스 0에서 가능한 각 장치를 확인합니다. 장치가 발견되면 요청 된 크기를 기반으로 장치에 대한 메모리 공간을 할당하고 이에 따라 BAR을 프로그래밍합니다. 브리지를 찾은 경우 브리지를 구성하고 활성화합니다. 기본 브리지 레지스터는 표준입니다. 여기에는 업스트림 및 다운 스트림 버스 번호 할당이 포함되며 새 다운 스트림 버스를 열거 할 수 있습니다.

OS 나 다른 소프트웨어 환경이없는 시스템에서 PCI I/O 카드에 액세스하려면이 작업을 한 번 수행해야했습니다. 그다지 나쁘지 않았고 두 벤더의 두 브릿지뿐 아니라 I/O 카드 레지스터와 CPU 버스 루트 브리지 설정도있었습니다. 이는 PCIe가 아닌 PCI 였지만 거의 동일했습니다. 하드웨어가 변경되지 않았다면 완전히 하드 코딩 된 숫자로 처리 할 수도 있지만, 제 경우에는 몇 가지 변형이 있었기 때문에 장치 번호를 동적으로 찾기 위해 간단한 열거를해야했습니다. 하나의 장애물은 액세스를 시도하기 전에 모든 장치가 온라인 상태가 될 때까지 조금 지연하거나 다시 시도해야 할 수 있다는 것입니다.

이 책에서 나는이 책이 매우 귀중하다는 것을 발견했다. : PCI System Architecture (4th Edition). PCIe 버전도 있습니다. PCI Express System Architecture (1st Edition). 나는 아직 그 중 하나를 얻을 것이다. 이 책에는 자세한 알고리즘과이 모든 작업을 수행하는 방법에 대한 설명이 포함되어 있습니다. 그 당시에는 실제로 코드를 사용하거나 언급하지 않았지만 ...

내가 찾은 최고의 코드 리소스는 U-Boot입니다. 비슷한 수준의 낮은 수준에서 작동하며 완전히 자체적으로 포함되며 여전히 작고 가능한 간단합니다. 예를 들어, 열거 형은 pci_init()이라는 함수로 시작하여 특정 보드 pci_xxx_init()을 호출합니다. 그러면 루트 브리지가 설정되고 이 drivers/pci/pci.c으로 호출되어 실제 작업을 수행합니다. drivers/pci/pci_auto.c의 루틴뿐만 아니라 나머지 폴더도 확인하십시오.

작업을 수행하는 데는 매우 작은 하위 집합 만 필요하므로이 파일의 일부를 간단한 드라이버로 해킹 할 수 있습니다. 기본적으로 for() 루프 및 일부 pci_read/write_config() 호출은 논리를 사용하여 장치 및 브리지 ID를 인식합니다.