efi: Add get_dram_base() helper function
authorRoy Franz <roy.franz@linaro.org>
Tue, 28 Jan 2014 18:41:28 +0000 (10:41 -0800)
committerMark Brown <broonie@linaro.org>
Mon, 16 Jun 2014 20:34:17 +0000 (21:34 +0100)
Add the get_dram_base() function, shared by arm/arm64.

Signed-off-by: Roy Franz <roy.franz@linaro.org>
Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
(cherry picked from commit 9bb40191e88d23563fd0467ac195debf5f6daaf9)
Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/firmware/efi/efi-stub-helper.c

index 1bf439be91382b67fc92d30dcbb1a256e0db4b59..a168dd20511f6c1dc9c45c0b4ae911c0e29dd8cf 100644 (file)
  */
 #define EFI_READ_CHUNK_SIZE    (1024 * 1024)
 
+/* error code which can't be mistaken for valid address */
+#define EFI_ERROR      (~0UL)
+
+
 struct file_info {
        efi_file_handle_t *handle;
        u64 size;
@@ -83,6 +87,32 @@ fail:
        return status;
 }
 
+
+static unsigned long __init get_dram_base(efi_system_table_t *sys_table_arg)
+{
+       efi_status_t status;
+       unsigned long map_size;
+       unsigned long membase  = EFI_ERROR;
+       struct efi_memory_map map;
+       efi_memory_desc_t *md;
+
+       status = efi_get_memory_map(sys_table_arg, (efi_memory_desc_t **)&map.map,
+                                   &map_size, &map.desc_size, NULL, NULL);
+       if (status != EFI_SUCCESS)
+               return membase;
+
+       map.map_end = map.map + map_size;
+
+       for_each_efi_memory_desc(&map, md)
+               if (md->attribute & EFI_MEMORY_WB)
+                       if (membase > md->phys_addr)
+                               membase = md->phys_addr;
+
+       efi_call_early(free_pool, map.map);
+
+       return membase;
+}
+
 /*
  * Allocate at the highest possible address that is not above 'max'.
  */