On Mon, 2015-07-27 at 10:45 +0100, Will Deacon wrote:Sorry, that was my mistake. Corrected at V8.
That bit's fine. The weird bit is:
pgprot_t prot;
prot = efi_mem_attributes(addr);
Since that's putting the arch-independent format into the pg_prot.
Oops, missed that. Yeah that's funky.
With this patch set, arch_apei_get_mem_attribute() is defined for aboveI don't see how you can do that any other way than by using pgprot_t.
Really, the problem here is that ioremap_page_caller() has no notion of
"map this range in a firmware-compatible manner". If we could do, for
example,
ioremap_page_range(vaddr, vend, paddr, PAGE_FW_COMPAT);
that would allow the innards of the arch-ioremap to figure out exactly
how to map this range so that the firmware could access it coherently.
x86's efi_ioremap() is intended to run at init time only. For the
I suggested this previously but it didn't gain any traction.
Yeah, or just ioremap_efi.
</me runs away>
Someone beat you to it ;-)
arch/x86/include/asm/efi.h:#define efi_ioremap(addr, size, type, attr) ioremap_cache(addr, size)
arch/x86/include/asm/efi.h:extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
arch/x86/platform/efi/efi.c: va = efi_ioremap(md->phys_addr, size,
arch/x86/platform/efi/efi_64.c:void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
arch/x86/platform/efi/efi_64.c: efi_ioremap(top, size - (top - phys_addr), type, attribute);