In PAE enabled kernel, ioremap cannot handle physical address > 32bit

From: Sean Brandenburger
Date: Tue Sep 29 2009 - 19:47:57 EST


I have a PAE enabled kernel. I am trying to ioremap a physical address
which is above 4GB area. It is noticed that the ioremap maps to the 32bit
truncated physical address.

Even though __ioremap_caller takes in phys_addr of size
resource_size_t, the macro PAGE_SHIFT, PAGE_MASK truncates the
size to 32bit on the physical address operand it works on (for e.g. pfn,
phys_addr, last_addr, etc. below)

/*
* Don't allow anybody to remap normal RAM that we're using..
*/
for (pfn = phys_addr >> PAGE_SHIFT;
(pfn << PAGE_SHIFT) < (last_addr & PAGE_MASK);
pfn++) {

Even after fixing the above lines, still the issue is there. Looks
like there
is lot more places fixes to handle greater than 32bit need to be done.
I searched the past mailing list and did not find any fixes. I did come across
suggestions not to use PAGE_MASK on Physical address but to use
PHYSICAL_PAGE_MASK. I did come cross other fixes related to handling
physical address greater than 32bit but not any fixes for ioremap.

Does any of you know if this issue has been fixed? If not, I will spend
time to fix it.

Thanks
Sean
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/