We are using MPC8308 PCI Express x1 connected to PCI express End device.
PCI express End Device having - 32 address bit Non Prefetchable & 64 address bit Prefetchable.
We are using Linux - 2.6.29 from LTIB.
Note: PCI express adresss is 64 bit nature.Not a data.
Auto enumeration has been completed properly for Both Region BAR 0 and BAR 2.
request_memory_region also completed properly
ioremap also completed properly.
But, When i started accessing the region using the address provided by ioremap.
KERENL IS CRASHING !
will the MMU of the linux kerenl (2.6.29 ) supports 64 address bit translation?
Pls suggest me
The MPC8308 core MMU provides 32-bit physical address only. The MPC8308 internal 32-bit physical address is mapped to the 64-bit PCI address in Address Translation Window Unit (ATMU). The attributes of the outbound windows are controlled by the PEX_OWARn registers and the attributes of
the RC inbound windows are controlled by the PEX_RCIWARn registers, residing in the CSB bridge address space.
I.e. the core does not "know" 64-bit addrerss in the PCIe address space. It accesses to the region in the intenal 32-bit space which is mapped to the same size region in the 64-bit PCIe address space by ATMU.
I am not guru in Linux. As I know ioremap does not return "real' address but some like-address value which has to be used by special IOfunctions. "Remember, though, that the addresses returned from ioremap should not be dereferenced directly; instead, accessor functions provided by the kernel should be used."
"The proper way of getting at I/O memory is via a set of functions (defined via <asm/io.h>) provided for that purpose."
I am having exactly the same issue on T1042. Kernel crash with machine check if I use Physical size larger than 4 GB for RC side. And also when I try to use lower than 4 GB, kernel is not crashing but PCIe is not sending data to EP. It's more like sending data to its own memory.
Can you help me about this ? Thanks.