lmb: move lmb_map_update_notify() to EFI
When building with qemu_arm64_defconfig with CONFIG_CC_OPTIMIZE_FOR_DEBUG=y and CONFIG_EFI_LOADER=n an error undefined reference to efi_add_memory_map_pg occurs. Move the EFI dependent part of lmb_map_update_notify() to the EFI sub-system. Reported-by: Liya Huang <1425075683@qq.com> Acked-by: Liya Huang <1425075683@qq.com> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
@@ -1263,6 +1263,21 @@ efi_status_t efi_disk_get_device_name(const efi_handle_t handle, char *buf, int
|
|||||||
*/
|
*/
|
||||||
void efi_add_known_memory(void);
|
void efi_add_known_memory(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_map_update_notify() - notify EFI of memory map changes
|
||||||
|
*
|
||||||
|
* @addr: start of memory area
|
||||||
|
* @size: size of memory area
|
||||||
|
* @op: type of change
|
||||||
|
* Return: 0 if change could be processed
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_EFI_LOADER
|
||||||
|
int efi_map_update_notify(phys_addr_t addr, phys_size_t size,
|
||||||
|
enum lmb_map_op op);
|
||||||
|
#else
|
||||||
|
#define efi_map_update_notify(addr, size, op) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_load_option_dp_join() - join device-paths for load option
|
* efi_load_option_dp_join() - join device-paths for load option
|
||||||
*
|
*
|
||||||
|
@@ -865,3 +865,30 @@ int efi_memory_init(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int efi_map_update_notify(phys_addr_t addr, phys_size_t size,
|
||||||
|
enum lmb_map_op op)
|
||||||
|
{
|
||||||
|
u64 efi_addr;
|
||||||
|
u64 pages;
|
||||||
|
efi_status_t status;
|
||||||
|
|
||||||
|
efi_addr = (uintptr_t)map_sysmem(addr, 0);
|
||||||
|
pages = efi_size_in_pages(size + (efi_addr & EFI_PAGE_MASK));
|
||||||
|
efi_addr &= ~EFI_PAGE_MASK;
|
||||||
|
|
||||||
|
status = efi_add_memory_map_pg(efi_addr, pages,
|
||||||
|
op == LMB_MAP_OP_RESERVE ?
|
||||||
|
EFI_BOOT_SERVICES_DATA :
|
||||||
|
EFI_CONVENTIONAL_MEMORY,
|
||||||
|
false);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
log_err("LMB Map notify failure %lu\n",
|
||||||
|
status & ~EFI_ERROR_MASK);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
unmap_sysmem((void *)(uintptr_t)efi_addr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
31
lib/lmb.c
31
lib/lmb.c
@@ -426,37 +426,12 @@ long io_lmb_free(struct lmb *io_lmb, phys_addr_t base, phys_size_t size)
|
|||||||
|
|
||||||
static struct lmb lmb;
|
static struct lmb lmb;
|
||||||
|
|
||||||
static bool lmb_should_notify(u32 flags)
|
|
||||||
{
|
|
||||||
return !lmb.test && !(flags & LMB_NONOTIFY) &&
|
|
||||||
CONFIG_IS_ENABLED(EFI_LOADER);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lmb_map_update_notify(phys_addr_t addr, phys_size_t size,
|
static int lmb_map_update_notify(phys_addr_t addr, phys_size_t size,
|
||||||
enum lmb_map_op op, u32 flags)
|
enum lmb_map_op op, u32 flags)
|
||||||
{
|
{
|
||||||
u64 efi_addr;
|
if (CONFIG_IS_ENABLED(EFI_LOADER) &&
|
||||||
u64 pages;
|
!lmb.test && !(flags & LMB_NONOTIFY))
|
||||||
efi_status_t status;
|
return efi_map_update_notify(addr, size, op);
|
||||||
|
|
||||||
if (!lmb_should_notify(flags))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
efi_addr = (uintptr_t)map_sysmem(addr, 0);
|
|
||||||
pages = efi_size_in_pages(size + (efi_addr & EFI_PAGE_MASK));
|
|
||||||
efi_addr &= ~EFI_PAGE_MASK;
|
|
||||||
|
|
||||||
status = efi_add_memory_map_pg(efi_addr, pages,
|
|
||||||
op == LMB_MAP_OP_RESERVE ?
|
|
||||||
EFI_BOOT_SERVICES_DATA :
|
|
||||||
EFI_CONVENTIONAL_MEMORY,
|
|
||||||
false);
|
|
||||||
if (status != EFI_SUCCESS) {
|
|
||||||
log_err("%s: LMB Map notify failure %lu\n", __func__,
|
|
||||||
status & ~EFI_ERROR_MASK);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
unmap_sysmem((void *)(uintptr_t)efi_addr);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user