if (!fdt_addr)
                pr_efi("Generating empty DTB\n");
 
-       status = efi_load_initrd(image, &initrd_addr, &initrd_size,
+       status = efi_load_initrd(image, &initrd_addr, &initrd_size, ULONG_MAX,
                                 efi_get_max_initrd_addr(dram_base, image_addr));
        if (status != EFI_SUCCESS)
                pr_efi_err("Failed initrd from command line!\n");
 
 static efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
                                         const efi_char16_t *optstr,
                                         int optstr_size,
-                                        unsigned long max_addr,
+                                        unsigned long soft_limit,
+                                        unsigned long hard_limit,
                                         unsigned long *load_addr,
                                         unsigned long *load_size)
 {
                    round_up(alloc_size, EFI_ALLOC_ALIGN)) {
                        unsigned long old_addr = alloc_addr;
 
-                       status = efi_allocate_pages(alloc_size + size, &alloc_addr,
-                                                   max_addr);
+                       status = EFI_OUT_OF_RESOURCES;
+                       if (soft_limit < hard_limit)
+                               status = efi_allocate_pages(alloc_size + size,
+                                                           &alloc_addr,
+                                                           soft_limit);
+                       if (status == EFI_OUT_OF_RESOURCES)
+                               status = efi_allocate_pages(alloc_size + size,
+                                                           &alloc_addr,
+                                                           hard_limit);
                        if (status != EFI_SUCCESS) {
                                pr_efi_err("Failed to reallocate memory for files\n");
                                goto err_close_file;
                          unsigned long *load_size)
 {
        return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
-                                   ULONG_MAX, load_addr, load_size);
+                                   ULONG_MAX, ULONG_MAX, load_addr, load_size);
 }
 
 efi_status_t efi_load_initrd(efi_loaded_image_t *image,
                             unsigned long *load_addr,
                             unsigned long *load_size,
-                            unsigned long max_addr)
+                            unsigned long soft_limit,
+                            unsigned long hard_limit)
 {
        return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
-                                   max_addr, load_addr, load_size);
+                                   soft_limit, hard_limit, load_addr, load_size);
 }
 
                goto fail2;
 
        status = efi_load_initrd(image, &ramdisk_addr, &ramdisk_size,
-                                hdr->initrd_addr_max);
-
-       if (status != EFI_SUCCESS &&
-           hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G) {
-               efi_printk("Trying to load files to higher address\n");
-               status = efi_load_initrd(image, &ramdisk_addr, &ramdisk_size,
-                                        ULONG_MAX);
-       }
-
+                                hdr->initrd_addr_max,
+                                above4g ? ULONG_MAX : hdr->initrd_addr_max);
        if (status != EFI_SUCCESS)
                goto fail2;
        hdr->ramdisk_image = ramdisk_addr & 0xffffffff;