mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCHv3 0/4] Fix ACPI BGRT support for images located in EFI boot services memory
@ 2012-09-08 22:06 Josh Triplett
  2012-09-08 22:06 ` [PATCHv3 1/4] efi: Add a stub for efi_enter_virtual_mode on non-x86 Josh Triplett
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Josh Triplett @ 2012-09-08 22:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, Len Brown,
	Matt Fleming, Olof Johansson, Matthew Garrett, David Howells,
	Rusty Russell, Peter Zijlstra, linux-acpi

The ACPI BGRT lets the OS access the BIOS logo image and its position on the
screen at boot time, allowing it to maintain that image on the screen until
ready to display something else, making boot more seamless.  This series fixes
support for accessing the boot logo image via the BGRT when the BIOS stores it
in EFI boot services memory, as recommended by the ACPI 5.0 spec.  Linux needs
to copy the image out of boot services memory before reclaiming boot services
memory.

The first patch cleans up the existing x86-specific efi_enter_virtual_mode
function to have a stub version on non-x86 platforms, to eliminate an ifdef in
init/main.c.   The second patch refactors EFI initialization to defer freeing
boot services memory until much later in the boot process, and in particular
until after we have ACPI available.  The third patch adds a helper function to
look up existing EFI boot services mappings, to avoid re-mapping them.  The
fourth patch moves BGRT initialization to before the reclamation of boot
services memory, copies the logo at that point, and reworks the existing BGRT
driver to use that existing copy.

v2: Made the new internal function efi_unmap_memmap static.  Incorporated
    feedback from H. Peter Anvin and Matt Fleming: added stubs for
    x86-specific EFI functions called from init/main.c to eliminate the
    corresponding ifdefs in start_kernel; deferred
    efi_free_boot_services even later, to just before free_initmem.

v3: Moved efi_free_boot_services back to right after EFI initialization, to
    avoid a WARN from check_early_ioremap_leak about not calling
    early_iounmap soon enough.

Josh Triplett (4):
  efi: Add a stub for efi_enter_virtual_mode on non-x86
  efi: Defer freeing boot services memory until after ACPI init
  efi: Add a function to look up existing IO memory mappings
  efi: Fix the ACPI BGRT driver for images located in EFI boot services
    memory

 arch/x86/platform/efi/Makefile   |    1 +
 arch/x86/platform/efi/efi-bgrt.c |   76 ++++++++++++++++++++++++++++++++++++++
 arch/x86/platform/efi/efi.c      |   65 +++++++++++++++++++++++++-------
 drivers/acpi/Kconfig             |    4 +-
 drivers/acpi/bgrt.c              |   76 +++++---------------------------------
 include/linux/efi-bgrt.h         |   21 +++++++++++
 include/linux/efi.h              |    9 +++++
 init/main.c                      |    7 +++-
 8 files changed, 175 insertions(+), 84 deletions(-)
 create mode 100644 arch/x86/platform/efi/efi-bgrt.c
 create mode 100644 include/linux/efi-bgrt.h

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 15+ messages in thread
* [PATCHv4 2/3] efi: Add a function to look up existing IO memory mappings
@ 2012-09-29  0:56 Josh Triplett
  2012-09-29 23:14 ` [tip:x86/efi] " tip-bot for Josh Triplett
  0 siblings, 1 reply; 15+ messages in thread
From: Josh Triplett @ 2012-09-29  0:56 UTC (permalink / raw)
  To: linux-kernel
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, Len Brown,
	Matt Fleming, Olof Johansson, Matthew Garrett, David Howells,
	Rusty Russell, Peter Zijlstra, Pawel Moll, linux-acpi

The EFI initialization creates virtual mappings for EFI boot services
memory, so if a driver wants to access EFI boot services memory, it
cannot call ioremap itself; doing so will trip the WARN about mapping
RAM twice.  Thus, a driver accessing EFI boot services memory must do so
via the existing mapping already created during EFI intiialization.
Since the EFI code already maintains a memory map for that memory, add a
function efi_lookup_mapped_addr to look up mappings in that memory map.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 arch/x86/platform/efi/efi.c |   28 ++++++++++++++++++++++++++++
 include/linux/efi.h         |    1 +
 2 files changed, 29 insertions(+)

diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index b3dbbdb..f7f928c 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -777,6 +777,34 @@ static void __init runtime_code_page_mkexec(void)
 }
 
 /*
+ * We can't ioremap data in EFI boot services RAM, because we've already mapped
+ * it as RAM.  So, look it up in the existing EFI memory map instead.  Only
+ * callable after efi_enter_virtual_mode and before efi_free_boot_services.
+ */
+void __iomem *efi_lookup_mapped_addr(u64 phys_addr)
+{
+	void *p;
+	if (WARN_ON(!memmap.map))
+		return NULL;
+	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
+		efi_memory_desc_t *md = p;
+		u64 size = md->num_pages << EFI_PAGE_SHIFT;
+		u64 end = md->phys_addr + size;
+		if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
+		    md->type != EFI_BOOT_SERVICES_CODE &&
+		    md->type != EFI_BOOT_SERVICES_DATA)
+			continue;
+		if (!md->virt_addr)
+			continue;
+		if (phys_addr >= md->phys_addr && phys_addr < end) {
+			phys_addr += md->virt_addr - md->phys_addr;
+			return (__force void __iomem *)(unsigned long)phys_addr;
+		}
+	}
+	return NULL;
+}
+
+/*
  * This function will switch the EFI runtime services to virtual mode.
  * Essentially, look through the EFI memmap and map every region that
  * has the runtime attribute bit set in its memory descriptor and update
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 5782114..fff135d 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -501,6 +501,7 @@ extern void efi_free_boot_services(void);
 #else
 static inline void efi_free_boot_services(void) {}
 #endif
+extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
 extern u64 efi_get_iobase (void);
 extern u32 efi_mem_type (unsigned long phys_addr);
 extern u64 efi_mem_attributes (unsigned long phys_addr);
-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2012-10-01 20:30 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-08 22:06 [PATCHv3 0/4] Fix ACPI BGRT support for images located in EFI boot services memory Josh Triplett
2012-09-08 22:06 ` [PATCHv3 1/4] efi: Add a stub for efi_enter_virtual_mode on non-x86 Josh Triplett
2012-09-27 21:56   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-10-01 20:28   ` [PATCHv3 1/4] " Arnd Bergmann
2012-10-01 20:30     ` Josh Triplett
2012-09-08 22:06 ` [PATCHv3 2/4] efi: Defer freeing boot services memory until after ACPI init Josh Triplett
2012-09-27 21:56   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-09-08 22:09 ` [PATCHv3 3/4] efi: Add a function to look up existing IO memory mappings Josh Triplett
2012-09-27 21:57   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-09-08 22:09 ` [PATCHv3 4/4] efi: Fix the ACPI BGRT driver for images located in EFI boot services memory Josh Triplett
2012-09-21 19:00   ` Len Brown
2012-09-27 22:00   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-09-12 15:27 ` [PATCHv3 0/4] Fix ACPI BGRT support " Matt Fleming
2012-09-14 12:46 ` Matt Fleming
2012-09-29  0:56 [PATCHv4 2/3] efi: Add a function to look up existing IO memory mappings Josh Triplett
2012-09-29 23:14 ` [tip:x86/efi] " tip-bot for Josh Triplett

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome