Aqui está o meu problema:
Não consigo obter o endereçamento BAR de dispositivos de ponto final pré-buscáveis atrás de uma ponte pci-e. Alguém pode me ajudar sobre isso?
Aqui está o que eu fiz até agora:
1- Consigo obter o endereço de um dispositivo pci-e pré-buscável sem a ponte. Mas não consigo ler/escrever neste espaço.
2- Consigo obter o endereço de um dispositivo pci-e não prefetchável sem a ponte. Eu posso ler/escrever neste espaço com sucesso.
3- Não consigo obter o endereço de um único dispositivo pré-buscado atrás da ponte.
4- Consigo obter endereços de vários dispositivos não pré-buscáveis atrás da ponte. Eu também posso ler/escrever para eles.
5- Não consigo obter o endereço de um dispositivo pré-buscável e não pré-buscável atrás da ponte. Nesta posição, também não consigo obter um não pré-buscável que possa ser usado no teste acima.
Qual é a minha suspeita:
Eu validei esses testes com dois dispositivos root-complex diferentes para obter esses resultados, ambos são versão do kernel 4.9, então tenho certeza que esse problema está relacionado ao kernel.
Obrigado pelo seu tempo com antecedência.
Editar:
Quando uso o lspci, posso obter os IDs do fornecedor, IDs do dispositivo e tipos de dispositivo de todos os dispositivos que usei acima. Quando eu quis dizer que não consigo obter os endereços BAR, estou simplesmente apontando que os mapeamentos de memória virtual não aparecem nas saídas lspci -vv.
Para minhas leituras e gravações, estou usando o memtool, que é um programa C simples que pode ler e gravar bytes em uma determinada memória.
Os arquivos que precisam aparecer em /sys/bus/pci_express/devices relacionados aos dispositivos que mencionei não estão aparecendo nos casos de falha.
Quando verifiquei o dmesg em busca de mensagens relacionadas, aqui estão as relacionadas:
[ 2.496007] pci 0000:03:00.0: [104c:b005] type 00 class 0x048000
[ 2.496065] pci 0000:03:00.0: reg 0x10: [mem 0x00000000-0x007fffff]
[ 2.496099] pci 0000:03:00.0: reg 0x14: [mem 0x00000000-0x007fffff pref]
[ 2.496268] pci 0000:03:00.0: Max Payload Size set to 128 (was 256, max 256)
[ 2.496605] iommu: Adding device 0000:03:00.0 to group 59
[ 2.496610] arm-smmu: forcing sodev map for 0000:03:00.0
[ 2.510188] pci 0000:03:00.0: BAR 0: no space for [mem size 0x00800000]
[ 2.510192] pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x00800000]
[ 2.510196] pci 0000:03:00.0: BAR 1: no space for [mem size 0x00800000 pref]
[ 2.510200] pci 0000:03:00.0: BAR 1: failed to assign [mem size 0x00800000 pref]
[ 2.510942] pci 0000:03:00.0: Signaling PME through PCIe PME interrupt
[ 2.497054] pci 0000:04:00.0: [1172:e001] type 00 class 0xff0000
[ 2.497114] pci 0000:04:00.0: reg 0x10: [mem 0x00000000-0x03ffffff]
[ 2.497691] iommu: Adding device 0000:04:00.0 to group 60
[ 2.497696] arm-smmu: forcing sodev map for 0000:04:00.0
[ 2.510254] pci 0000:04:00.0: BAR 0: no space for [mem size 0x04000000]
[ 2.510259] pci 0000:04:00.0: BAR 0: failed to assign [mem size 0x04000000]
[ 2.510949] pci 0000:04:00.0: Signaling PME through PCIe PME interrupt
O dispositivo 0000:03:00.0 é o prefetchable, e o 04 é o não prefetchable. No dmesg, diz que não tenho espaço para eles, mas sei que a placa que estou usando (uma Nvidia Jetson TX2) tem 127 MB de espaço para dispositivos não pré-buscáveis e 896 MB de espaço para pré-buscáveis. Os dispositivos que tento têm 8 MB + 8 MB de memória pré-buscável e 64 MB não pré-buscável.
A propósito, obrigado pela sugestão de edição, percebi que tinha tão poucos detalhes enquanto editava a pergunta.
Aqui estão os dmesgs para meus switches pcie: 01:00.0 é minha porta upstream, enquanto as outras duas são downstreams.
[ 2.472535] pci 0000:01:00.0: [111d:808c] type 01 class 0x060400
[ 2.472856] pci 0000:01:00.0: PME# supported from D0 D3hot D3cold
[ 2.473055] iommu: Adding device 0000:01:00.0 to group 56
[ 2.473060] arm-smmu: forcing sodev map for 0000:01:00.0
[ 2.481784] pci 0000:01:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[ 2.486074] pci 0000:01:00.0: BAR 14: no space for [mem size 0x08000000]
[ 2.486078] pci 0000:01:00.0: BAR 14: failed to assign [mem size 0x08000000]
[ 2.486221] pci 0000:01:00.0: PCI bridge to [bus 02-04]
[ 2.486589] pci 0000:01:00.0: Signaling PME through PCIe PME interrupt
[ 2.482057] pci 0000:02:08.0: [111d:808c] type 01 class 0x060400
[ 2.482419] pci 0000:02:08.0: PME# supported from D0 D3hot D3cold
[ 2.482798] iommu: Adding device 0000:02:08.0 to group 57
[ 2.482807] arm-smmu: forcing sodev map for 0000:02:08.0
[ 2.483622] pci 0000:02:08.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[ 2.486090] pci 0000:02:08.0: BAR 14: no space for [mem size 0x01000000]
[ 2.486093] pci 0000:02:08.0: BAR 14: failed to assign [mem size 0x01000000]
[ 2.486114] pci 0000:02:08.0: PCI bridge to [bus 03]
[ 2.486592] pci 0000:02:08.0: Signaling PME through PCIe PME interrupt
[ 2.482957] pci 0000:02:10.0: [111d:808c] type 01 class 0x060400
[ 2.483284] pci 0000:02:10.0: PME# supported from D0 D3hot D3cold
[ 2.483475] iommu: Adding device 0000:02:10.0 to group 58
[ 2.483480] arm-smmu: forcing sodev map for 0000:02:10.0
[ 2.483650] pci 0000:02:10.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[ 2.486083] pci 0000:02:10.0: BAR 14: no space for [mem size 0x04000000]
[ 2.486087] pci 0000:02:10.0: BAR 14: failed to assign [mem size 0x04000000]
[ 2.486170] pci 0000:02:10.0: PCI bridge to [bus 04]
[ 2.486598] pci 0000:02:10.0: Signaling PME through PCIe PME interrupt
Vejo uma mensagem de configuração inválida lá, mas essa mensagem de configuração inválida ainda aparece quando mudo minha configuração para o experimento 2 novamente, não tenho certeza se esse é o problema.
Quero dizer,
bridge configuration invalid
eBAR 14
(em vez de BAR 1 ou algum número sensato), e nenhum espaço para isso já parece que a ponte está completamente quebrada, ou pelo menos a configuração que apresenta ao sistema operacional é um lixo.Mas se a ponte for programável, provavelmente é possível consertar isso...