I am using a 64 bit PCI express card on a 64 bit linux host, problem is that it's bars are 64 bit but always get an address that lies in 32 bit address range i.e. higher 32 bit of BAR is always zero.
How can I enforce it to use real 64 bit addresses ? I tried to enforce it with overriding BIOS enumeration with boot time args to kernel so that kernel can enumerate pci devices but it results same as by BIOS.
Is Linux not supporting real 64 bit addresses ?
You can try the following thing. That first of all make the PAE( Physical address extension) enable in kernel. Then using setpci command or from the driver, change the higher 32bit bar register to a non-zero value, if your end point device is under a pci bridge then don't forget to change the Pre-fetchable Base Upper 32 Bit and Pre-fetchable Limit Upper 32 Bit registers appropriately.