Estou usando o barramento PCIe no Freescale MPC8308 (como complexo raiz) e o dispositivo endpoint é um ASIC com apenas uma região de memória de 256 MB e apenas um registro BAR. Os registros de espaço de configuração do dispositivo são facilmente acessíveis através do pacote "pciutils". No começo eu tentei acessar a região da memória usando mmap()
, mas não funcionou. Então, no próximo nível, eu preparei um driver de dispositivo para o dispositivo de terminal PCIe, que é um módulo do kernel que eu carrego no kernel após a inicialização do Linux.
No meu driver, o dispositivo do ponto de extremidade é identificado na tabela de IDs do dispositivo, mas quando desejo ativar o dispositivo por pci_enable_device()
, vejo este erro:
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
Além disso, quando quero alocar a região de memória para o dispositivo PCIe usando pci_request_region()
, isso não é possível.
Aqui está a parte do código do driver que não está funcionando:
pci_enable_result = pci_enable_device (pdev);
if (pci_enable_result)
{
printk(KERN_INFO "PCI enable encountered a problem \n");
return pci_enable_result;
}
else
{
printk(KERN_INFO "PCI enable was succesfull \n");
}
E aqui está o resultado em "dmesg":
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
PCI enable encountered a problem
driver-pci: probe of 0000:00:00.0 failed with error -22
Vale a pena notar que no driver eu posso ler e gravar registros de configuração corretamente usando funções como pci_read_config_dword()
e pci_write_config_dword()
.
Qual é o problema que você acha? é possível que o problema apareça porque o kernel inicializa o dispositivo antes do módulo do kernel? o que devo fazer para evitar que isso ocorra?