Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7da657d1 authored by Yinghai Lu's avatar Yinghai Lu Committed by H. Peter Anvin
Browse files

x86: Add find_early_area_size



Prepare to move bck find_e820_area_size back to e820.c.

Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
LKML-Reference: <1265793639-15071-22-git-send-email-yinghai@kernel.org>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent a678c2be
Loading
Loading
Loading
Loading
+32 −13
Original line number Diff line number Diff line
@@ -476,6 +476,29 @@ u64 __init find_early_area(u64 ei_start, u64 ei_last, u64 start, u64 end,
	return -1ULL;
}

u64 __init find_early_area_size(u64 ei_start, u64 ei_last, u64 start,
			 u64 *sizep, u64 align)
{
	u64 addr, last;

	addr = round_up(ei_start, align);
	if (addr < start)
		addr = round_up(start, align);
	if (addr >= ei_last)
		goto out;
	*sizep = ei_last - addr;
	while (bad_addr_size(&addr, sizep, align) && addr + *sizep <= ei_last)
		;
	last = addr + *sizep;
	if (last > ei_last)
		goto out;

	return addr;

out:
	return -1ULL;
}

/*
 * Find a free area with specified alignment in a specific range.
 */
@@ -513,24 +536,20 @@ u64 __init find_e820_area_size(u64 start, u64 *sizep, u64 align)

	for (i = 0; i < e820.nr_map; i++) {
		struct e820entry *ei = &e820.map[i];
		u64 addr, last;
		u64 ei_last;
		u64 addr;
		u64 ei_start, ei_last;

		if (ei->type != E820_RAM)
			continue;
		addr = round_up(ei->addr, align);

		ei_last = ei->addr + ei->size;
		if (addr < start)
			addr = round_up(start, align);
		if (addr >= ei_last)
			continue;
		*sizep = ei_last - addr;
		while (bad_addr_size(&addr, sizep, align) &&
			addr + *sizep <= ei_last)
			;
		last = addr + *sizep;
		if (last > ei_last)
		ei_start = ei->addr;
		addr = find_early_area_size(ei_start, ei_last, start,
					 sizep, align);

		if (addr == -1ULL)
			continue;

		return addr;
	}