On 7/27/2015 2:54 AM, Matt Fleming wrote:
On Mon, 2015-07-27 at 10:45 +0100, Will Deacon wrote:
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.
Sorry, that was my mistake. Corrected at V8.
I 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.
With this patch set, arch_apei_get_mem_attribute() is defined for above mentioned PAGE_FW_COMPAT. If in future there are additional use case for mapping page in atomic context according to UEFI memory map, the function name/definition can be generalized.
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);
x86's efi_ioremap() is intended to run at init time only. For the purpose of this patch set, we would need to define something new for both archs. We may want to keep it simple at this time, how do you prefer?