제퍼넷 로고

lspci 및 setpci를 사용하여 PCIe 문제 디버깅

시간

lspci 및 setpci 명령은 기본적으로 Linux 배포판에서 사용할 수 있습니다. 이 명령은 다양한 수준의 출력을 가지며 PCI 버스에서 훈련 된 다양한 구성 요소의 기능과 상태에 대한 매우 유용한 시점을 제공합니다. 

이러한 기능의 대부분은 PCI-Express 기본 사양에서 요구하는 구성 공간 레지스터의 반영입니다. 대부분의 명령과 마찬가지로 Linux에서 "lspci –help"또는 "man lspci"를 실행하여 사용 지침을 찾을 수 있습니다.  

lspci를

기본적으로 lspci 명령은 아래와 같이 모든 장치 정보를 표시합니다.

pic1.png

lspci-tv

이 명령은 PCI 장치를 트리 형식으로 표시하고 루트 포트 BDF (버스, 장치, 기능) 번호를 제공합니다.

pic2.png

위 로그에서 Xilinx 장치는 버스 번호 '00', 장치 번호 '01'및 기능 번호 '1'에 연결되어 있습니다.

pic3.png

lspci -vvv

이것은 모든 것을 표시하는 가장 자세한 명령입니다. 이 명령을 실행하려면 루트 권한이 필요합니다.

아래 로그는 Xilinx PCIe 장치와 관련된 부분 만 보여줍니다.

pic4.png

참고 사항 :

• 링크 기능 레지스터와 링크 상태 레지스터 모두 Gen3x8을 표시합니다. 때로는 링크 문제로 인해 학습이 중단 될 수 있습니다. 훈련 된 다운 링크 상태는 링크 상태 레지스터에 반영됩니다.

pic5.png
• 수정 가능한 오류 상태 레지스터는 설정된대로 치명적이지 않은 오류를 표시합니다. 부팅하는 동안 호스트는 구성되지 않은 기능도 검사합니다. 설계가 한 기능에 대해 구성 되었기 때문에 다른 기능에 대한 프로브는 지원되지 않는 요청으로보고됩니다. 이 지원되지 않는 요청은 Advisory Non-Fatal 오류로보고됩니다. Non-Fatal Error, Unsupported Request 및 Correctable Error가 부팅 중에 설정되면 무시할 수 있습니다. 해당 레지스터의 각 비트에 구성 쓰기를 수행하여 지울 수 있습니다.

pic6.png

• 사용자는 수정할 수없는 오류 상태 레지스터의 오류를 모니터링해야합니다. 이 레지스터에 오류가보고되면 조사하고 해결해야합니다.

pic7.png
• PCI Express 기능은 '80'에서 시작합니다.

pic8.png
lspci -vs

이 명령은 아래와 같이 선택한 장치에 대한 자세한 출력을 제공합니다.

pic9.png
lspci -vvvs

이것은 동일한 명령이지만 아래와 같이 더 자세한 출력이 있습니다.

pic10.png
lspci -nvmms

이 명령은 PCI 장치 공급 업체 ID 및 장치 ID를 숫자로 표시합니다.

pic11.png

lspci -xxx

이 명령은 전체 PCI 구성 공간의 XNUMX 진 덤프를 제공합니다.

pic12.png

0x00의 처음 두 바이트는 실제로 0x10EE입니다. PCIe 사양 내에서 모든 데이터는 오프셋으로 정의됩니다. 예를 들어 0x80을 포함하는 노란색 상자는 오프셋 0x34에 있습니다. 이는 확장 기능 레지스터의 첫 번째 주소에 대한 포인터가됩니다.

PCI-ID: 0x00의 빨간색 상자에는 공급 업체 ID (0x10EE)가 있고 파란색 상자에는 장치 ID (0x7038)가 있습니다. 빨간색 및 파란색 상자의 오프셋 0x2C 및 0x2E에서 아래로 각각 하위 공급 업체 ID (0x10EE) 및 하위 장치 ID (0x0700)입니다.

버스 마스터 활성화: 노란색 박스에 0x04로 백업하면 16 비트 워드“0000 0000 0000 0111”이 있습니다. 이것이 명령 레지스터입니다. 비트 2는 "버스 마스터 활성화"입니다.

녹색 상자의 0x06에는 16 비트 단어 "0000 0000 0000 0001"이 있습니다. 이것은 상태 레지스터로, 시간이 지남에 따라 변경되며 특정 조건이 발생했음을 루트 컴플렉스에 신호를 보내는 방법입니다.

BAR 및 메모리 0x10에는 32 비트 워드 "0000 0000 0000 0000 1111 0111 1010 0000"이 있습니다.

  • 비트 0 = 0 – 메모리 공간 요청
  • 비트 2 : 1 = "00"– 32 비트 너비의 기본 주소
  • 비트 3 =“0”– 프리 페치 불가능
  • 비트 31 : 4 = 0xF7C0 (최하위 4 비트는 0으로 간주됩니다. 이는 바이트 및 dword 경계에 할당되어야하기 때문입니다)
    참고 : 이것이 64 비트 폭 요청 이었다면 다음 D-Word는 상위 메모리 주소를 포함하고 BAR의 후속은 BAR2입니다.
  • 0x14에서 – 이것은 BAR1 주소이지만, 모두 XNUMX이므로이 장치에는 하나의 BAR 옵션 만 있습니다.

PCIe 링크 폭 확인

PCIe 너비는 PCIe 레인 수를 결정합니다. 아래 명령을 사용하면 링크 기능 레지스터에서 PCIe 링크 너비 정보와 링크 상태 레지스터에서 협상 된 링크 너비를 쉽게 찾을 수 있습니다.

pic13.png

PCIe 속도 확인

PCIe 링크 너비 정보를 확인하는 명령과 유사하게 아래 명령은 PCIe 속도에 대한 정보를 제공합니다.

pic14.png

PCIe 최대 페이로드 크기 (MPS) 확인

아래 명령은 장치 제어 레지스터 아래에 최대 페이로드 크기 값을 제공합니다.

pic15.png
PCIe 최대 읽기 요청 크기 확인

pic16.png

모든 PCIe 장치 나열

pic17.png

setpci

setpci 명령은 구성 레지스터에서 읽고 쓰는 데 사용할 수 있습니다. setpci 기능에 대한 자세한 내용은 "setpci –help"를 참조하십시오.

setpci는 표준 구성 헤더의 모든 레지스터 이름을 알고 있습니다. "setpci –dumpregs"명령은 아래와 같이 모든 PCI 레지스터 및 기능 목록을 표시합니다.

[root @ localhost xilinx] # setpci –dumpregs
캡 위치 이름
00W VENDOR_ID
02W DEVICE_ID
04 W 명령
06 W 상태
08 B 개정
09 B 클래스_프로그
0a W CLASS_DEVICE
0c B CACHE_LINE_SIZE
0일 B LATENCY_TIMER
0e B 헤더_유형
0f 비스트
10L BASE_ADDRESS_0
14L BASE_ADDRESS_1
18L BASE_ADDRESS_2
1c L BASE_ADDRESS_3
20L BASE_ADDRESS_4
24L BASE_ADDRESS_5
28L 카드버스_CIS
2c L 하위 시스템_VENDOR_ID
2e W 하위 시스템_ID
30L ROM_ADDRESS
3c B 인터럽트_라인
3d B 인터럽트_핀
3e B 분_GNT
3 층 B MAX_LAT
18B PRIMARY_BUS
19B 보조_버스
1a B SUBORDINATE_BUS
1b B SEC_LATENCY_TIMER
1c BIO_BASE
1 일 B IO_LIMIT
1e W SEC_STATUS
20W MEMORY_BASE
22W MEMORY_LIMIT
24W PREF_MEMORY_BASE
26W PREF_MEMORY_LIMIT
28L PREF_BASE_UPPER32
2c L PREF_LIMIT_UPPER32
30W IO_BASE_UPPER16
32W IO_LIMIT_UPPER16
38L BRIDGE_ROM_ADDRESS
3e W BRIDGE_Control
10L CB_CARDBUS_BASE
14W CB_CAPABILITIES
16W CB_SEC_STATUS
18B CB_BUS_NUMBER
19B CB_CARDBUS_NUMBER
1a B CB_SUBORDINATE_BUS
1b B CB_CARDBUS_LATENCY
1cL CB_MEMORY_BASE_0
20L CB_MEMORY_LIMIT_0
24L CB_MEMORY_BASE_1
28L CB_MEMORY_LIMIT_1
2cW CB_IO_BASE_0
2eW CB_IO_BASE_0_HI
30W CB_IO_LIMIT_0
32W CB_IO_LIMIT_0_HI
34W CB_IO_BASE_1
36W CB_IO_BASE_1_HI
38W CB_IO_LIMIT_1
3a 승 CB_IO_LIMIT_1_HI
40W CB_SUBSYSTEM_VENDOR_ID
42W CB_SUBSYSTEM_ID
44L CB_LEGACY_MODE_BASE
01 00 – CAP_PM
02 00 – CAP_AGP
03 00 – CAP_VPD
04 00 – CAP_SLOTID
05 00 – CAP_MSI
06 00 – CAP_CHSWP
07 00 – CAP_PCIX
08 00 – CAP_HT
09 00 – CAP_VNDR
0a 00 – CAP_DBG
0b 00 – CAP_CCRC
0c 00 – 캡_핫플러그
0d 00 – CAP_SSVID
0e 00 – CAP_AGP3
0f 00 – CAP_SECURE
10 – CAP_EXP
11 00 – CAP_MSIX
12 00 – CAP_SATA
13 – CAP_AF
0001 00 – ECAP_AER
0002 00 – ECAP_VC
0003 00 - ECAP_DSN
0004 00 - ECAP_PB
0005 00 – ECAP_RCLINK
0006 00 – ECAP_RCILINK
0007 00 - ECAP_RCECOLL
0008 00 - ECAP_MFVC
000a 00 – ECAP_RBCB
000b 00 – ECAP_VNDR
000d 00 – ECAP_ACS
000e 00 – ECAP_ARI
000f 00 – ECAP_ATS
0010 00 – ECAP_SRIOV

setpci에서 레지스터 식별

다음은 setpci 명령에서 사용되는 레지스터를 식별하는 다양한 방법입니다.

  • XNUMX 진수 주소 사용
  • 등록 이름 제공
  • PCI 기능의 일부인 레지스터의 경우 첫 번째 레지스터에 기능 이름을 지정할 수 있습니다. –dumpregs 출력에서. `CAP_ '또는`ECAP_'로 시작하는 이름을 확인하십시오. + offset 다음에 오프셋 (XNUMX 진수)을 주소에 추가 할 수 있습니다. 이렇게하면 설정된 각 기능 레지스터의 일부인 레지스터의 주소를 쉽게 지정할 수 있습니다.
  • 너비 지정자 (b, .w 또는 .l)는 읽거나 쓸 바이트 수 (1, 2 또는 4)를 선택하는 데 사용됩니다. 레지스터가 이름으로 참조되고 레지스터의 너비가 이미 알려진 경우 지정자를 삭제할 수 있습니다.
  • 레지스터 및 너비 지정자의 모든 이름은 대소 문자를 구분하지 않습니다.

예 :

COMMAND

  • 이것은 명령 레지스터의 값을 가리 킵니다. 4.w로 바꾸면 동일한 위치를 가리 킵니다.

명령.l

  • 이것은 명령과 상태 레지스터 모두의 값을 가리 킵니다.

VENDOR_ID + 1.b

  • 이것은 공급 업체 ID 레지스터의 상위 바이트를 가리 킵니다.

CAP_PM + 2.w

  • 이것은 전원 관리 기능의 두 번째 단어에 해당합니다.

ECAP108.l

  • 이것은 ID가 32x0 인 확장 기능의 첫 번째 108 비트 워드를 가리 킵니다.

setpci –s 24 : 00.0 04.w = 6

  • MSI 인터럽트가 작동하려면 PCIe 구성에서 버스 마스터 활성화 비트를 설정해야합니다. 위의 명령은 명령 레지스터에서 'Bus Master Enable'비트를 설정하는 데 사용할 수 있습니다. 이 예에서 "24 : 00.0"은 BDF 번호입니다. 장치마다 다르며 시스템에 따라 다릅니다. 주소를 지정할 장치의 올바른 BDF는 해당하는 lspci 로그를 참조하십시오.
  • 값 6은 메모리 활성화 비트와 버스 마스터 활성화 비트를 설정하고 있음을 의미합니다.

pic18.png

setpci –s 24 : 00.0 4a.w = 1

  • MSI 인터럽트가 작동하려면 PCIe 구성 공간에서도 MSI 레지스터를 활성화해야합니다. UltraScale + 장치에서는 오프셋 0x48에 있습니다 (lspci 로그에도 Capabilities : [48]로 표시됨). 이렇게하려면 PCIe 구성 쓰기를 실행하여 비트 16 (MSI 제어 레지스터 비트 0)을 1로 설정하십시오. 위의 명령이 그렇게합니다.

pic19.png

  • 위의 명령을 실행 한 후 lspci 명령을 실행합니다. 대신 "MSI : Enable +"가 표시되어야합니다.

setpci -s 01 : 00.0 82.b

  • 위의 명령은 UltraScale + PCIe 끝점 장치의 링크 상태 레지스터에서 읽습니다.
  • 주소 '82'는 UltraScale + 장치 용입니다. 자세한 표는 (PG213)을 참조하십시오.

pic20.png

setpci -s 00 : 01.0 d0.b

  • 위의 명령은 루트 포트의 링크 제어 2 레지스터에서 읽습니다.
  • 링크 기능 기본 주소는 해당하는 lspci 로그에 아래 표시된대로 a0입니다.

pic21.png

  • 링크 제어 2 레지스터 오프셋은 '30'입니다. '0'에 'a30'을 추가하면 'd0'이됩니다. 'a0'주소는 위의 스크린 샷에 표시된 루트 포트 장치 용입니다. 이것은 사용하는 장치에 따라 다를 수 있습니다. UltraScale + 장치를 사용하는 루트 포트의 경우 Capabilities 주소는 아래와 같이 '70'에서 시작하며 Link Control 2 레지스터 오프셋은 30 진수 값으로 '48', 즉 XNUMX입니다.

pic22.png
     기본 주소 값 '70'은 아래와 같이 lspci 로그에서도 읽을 수 있습니다.

pic23.png

setpci -s 00 : 01.0 d0.b = 42

  • 위의 명령은 속도를 Gen2로 설정하기 위해 Link Control 2 Register에 기록합니다.
  • 여기서 '2'값은 Gen2를 나타내고 다른 비트는 이미 활성화되어 변경되지 않은 'Slot Clock'입니다. 위의 명령을 내린 후 lspci를 실행하면 레지스터의 속도 값이 Gen2로 변경되었음을 표시합니다. 그러나 이것은 링크 훈련을 다시 할 때 훈련 할 속도 일뿐입니다.
  • 링크 속도를 Gen2로 변경하려면 링크를 다시 학습해야합니다. 아래 표시된 명령을 실행하여 수행 할 수 있습니다.
    • setpci -s 00 : 01.0 b0.b = 62

pic24.png

PCIe 최대 읽기 요청 크기 변경

  • 다른 속성을 재정의하지 않으려면 레지스터를 쿼리하십시오.
    • setpci -s 04 : 00.0 78.w
  • 레지스터에 원하는 값을 씁니다.
    • setpci -s 04 : 00.0 78.w = 2936
  • 최대 읽기 요청이있는 장치 제어 레지스터의 바이트 오프셋은 UltraScale + 장치의 경우 78h입니다. 이것은 다른 장치에 따라 다를 수 있습니다. 사용자는 각 제품 가이드를 참조해야합니다. 아래 표는 (PG213)에서 가져온 것입니다.

pic25.png

출처 : https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/Debugging-PCIe-Issues-using-lspci-and-setpci/ba-p/1148199

spot_img

최신 인텔리전스

spot_img