Pericom Semiconductor PI7C9X111SL 칩을 사용하여 데비안 컴퓨터에 PCIe-PCI 가역 브리지를 설치했습니다. 이 PCIe 카드에는 2개의 새로운 PCI 카드 슬롯이 있습니다. 브리지의 PCI ID는 12d8:e111인 것으로 보입니다. Linux PCI 텍스트 파일에는 "Pericom", "PI7C9X111SL", "12d8" 및 "e111")이 모두 나열되어 있습니다.
/usr/share/misc/pci.ids
처럼:
12d8 Pericom Semiconductor
e111 PI7C9X111SL PCIe-to-PCI Reversible Bridge
어쨌든 "lspci -knn"을 입력하면 다음 줄이 표시됩니다.
04:00.0 Non-VGA unclassified device [0000]: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge [12d8:e111] (rev 02)
그래서 데비안은 이 PCIe 카드로 무엇을 해야할지 모르는 것 같습니다. 나는 다음 행보를 알 수 없었다. 이 컴퓨터의 모든 Debian 패키지는 최신 버전입니다. 저는 Debian 9.0을 실행 중이고 "uname -a"는 다음을 제공합니다:
Linux ##### 4.9.0-1-amd64 #1 SMP Debian 4.9.6-3 (2017-01-28) x86_64 GNU/Linux
추후 추가 예정...
Debian 시스템을 부팅한 후 dmesg에서 다음과 같은 관련 로그를 찾았습니다.
[ 0.220250] pci 0000:03:00.0: disabling ASPM on pre-1.1 PCIe device. You can enable it with 'pcie_aspm=force'
[ 0.220256] pci 0000:00:0c.0: PCI bridge to [bus 03]
[ 0.220258] pci 0000:00:0c.0: bridge window [io 0xa000-0xafff]
[ 0.220260] pci 0000:00:0c.0: bridge window [mem 0xfde00000-0xfdefffff]
[ 0.220262] pci 0000:00:0c.0: bridge window [mem 0xfdd00000-0xfddfffff 64bit pref]
[ 0.224007] pci 0000:04:00.0: [12d8:e111] type 01 class 0xffffff
[ 0.224011] pci 0000:04:00.0: ignoring class 0xffffff (doesn't match header type 01)
나중에 추가하려면 다음 명령을 사용하십시오.
lspci -s 04:00.0 -xxx
나는 다음과 같은 응답을 받았습니다.
04:00.0 Non-VGA unclassified device: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge (rev ff)
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
내 가정은 보드 제조업체가 칩을 올바르게 프로그래밍하지 않았다는 것입니다(예: "전혀 프로그래밍하지 않음"). 위 데이터에 "class"가 있는지 잘 모르겠습니다. 위 데이터의 위치라면요. 그러나 클래스와 위의 데이터가 모두 0xff라는 점을 고려하면 유죄로 보입니다.
예상치 못한 이상한 동작(이 문제를 파악한 후 이 질문을 수정하겠습니다).
명령을 반복하면:
lspci -s 04:00.0 -xxx
나는 다른 결과를 얻습니다. 아마도 명령(또는 PCI 브리지)이 EEPROM 메모리의 다른 페이지를 통해 반복되고 있으며 각 페이지 길이는 256바이트입니까? 그럴 것 같지 않습니다. 아니면 EEPROM을 읽는 것이 신뢰할 수 없을 수도 있습니다. 실패 모드는 0xff를 다시 읽는 것입니다. 이것이 더 의미가 있습니다. EEPROM을 충분히 다시 읽으면 다소 큰 응답을 받게 됩니다.
04:00.0 Non-VGA unclassified device: Pericom Semiconductor PI7C9X111SL PCIe-to-PCI Reversible Bridge (rev 02)
00: d8 12 11 e1 00 00 10 00 02 00 04 06 00 00 01 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 01 01 a0 02
20: 00 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 80 00 00 00 00 00 00 00 00 01 00 00
40: 20 00 20 09 00 00 00 00 1f 80 40 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 08 00 b8 00 00 00 00
70: 80 00 00 00 00 00 00 00 00 00 00 d0 00 00 00 00
80: 07 90 00 00 f8 ff 00 00 10 00 10 00 10 00 10 00
90: 01 a8 43 c8 00 00 00 00 00 00 00 00 00 00 00 00
a0: 04 b0 00 00 ff ff ff ff ff ff ff ff ff ff ff ff
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
true인 경우 EEPROM 읽기가 신뢰할 수 없으며 Pericom 칩과의 다른 통신에 문제가 있을 수 있습니다. 이를 테스트하기 위해 이제 이 문제를 완화하기 위해 무엇을 할 수 있는지 궁금합니다. 가능하다면 PCIe 버스 클럭을 늦추거나 변경하시겠습니까?
답변1
부분 답변: 무엇이 잘못되었는지 말씀드릴 수 있지만 해결 방법을 모르겠습니다.
drivers/pci/probe.c
Linux 커널 소스 코드에서 오류 메시지를 찾아보면 카드(1) 에 PCI 클래스 (0x0604) PCI_HEADER_TYPE_BRIDGE
가 있어야 한다는 사실이 나옵니다 . PCI_CLASS_BRIDGE_PCI
그러나 귀하의 PCI 카드에는 클래스 0xffff(즉, 제조업체/리셀러가 클래스를 올바르게 설정하지 않았음)가 있으므로 드라이버는 뭔가 수상쩍다고 생각하여 이 브리지를 사용하지 않으려고 합니다. 브리지가 올바른 드라이버에 의해 초기화되지 않으면 당연히 그 뒤에 어떤 카드도 표시되지 않습니다.
이 문제에 대한 해결책은 (1) 커널을 패치하여 카드에 대한 예외를 설정하거나 (2) 카드에 적합한 클래스를 제공하는 것입니다.
Google 검색을 통해 이 칩에 대한 데이터시트가 나타났습니다.여기, 원칙적으로 문제를 해결하는 데 필요한 모든 정보가 있습니다. 구성 레지스터 맵(6.1) 섹션에서는 이 데이터가 EEPROM에 저장된다는 점을 명시하고 I2C에 대해 별도로 다음 설명을 제공합니다. SMBUS 액세스:
참고 1: 위장이 활성화되면 사전 로드가 가능합니다.
참고 2: VPD 데이터는 VPD 작동 중에 I2C를 통해 읽고 쓰여집니다.
따라서 어떻게든 이러한 값을 재정의하는 것이 가능해야 합니다. 이에 대한 자세한 내용은 섹션 10에 있지만 문제는 I2C/SMBus가 애초에 어딘가에 연결되어 있는지 여부입니다. PCIe 카드에 있기 때문에 아마도 그렇지 않을 것입니다. 그러나 섹션 6.3.91/92를 보면 VPD 레지스터를 통해 EEPROM에 쓸 수 있는 것으로 보입니다. 이를 정확하게 수행하는 방법을 알아내려면 더 많은 작업이 필요하며 직접 작성한 C 프로그램이 필요할 수도 있습니다.
편집하다:좋다이러한 쓰기 액세스에 vpd
사용할 수 있는 파일이 있습니다 . 파일이 존재하고 어딘가에 호출되는지 , 아니면 잘못된 클래스로 인해 누락되었는지 /sys/
확인하세요 . 그러한 파일이 있으면 해당 파일을 조작하고 결과에 따라 질문을 편집하십시오./sys/bus/pci/devices/0000:04:00.0/
vpd
hexdump -C
그럼에도 불구하고 이 작업을 수행하기 전에 나머지 구성 공간 값을 검토해야 합니다. lspci -s 04:00.0 -x
, 및 를 사용하여 lspci -s 04:00.0 -xxx
전체 덤프를 완료할 수 있습니다. ( -xxx
매뉴얼 페이지에 사용에 대한 경고가 있습니다 lspci
. 비적격 카드에서는 충돌이 발생할 수 있지만 시도해 보십시오.) 따라서 결과에 따라 질문을 편집하십시오. 이런 방식으로 클래스가 수정해야 할 유일한 값인지 아니면 더 많은 값이 있는지 확인해야 합니다.