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

Commit 06bd2824 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: handle memmap kernel option



This option is useful for reserving memory regions for secondary cores
in AMP configurations.

Implement the following memmap variants:
- memmap=nn[KMG]@ss[KMG]: force usage of a specific region of memory;
- memmap=nn[KMG]$ss[KMG]: mark specified memory as reserved;
- memmap=nn[KMG]: set end of memory.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 62327918
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -507,6 +507,7 @@ void __init setup_arch(char **cmdline_p)
		    __pa(&_Level6InterruptVector_text_end), 0);
#endif

	parse_early_param();
	bootmem_init();

	unflatten_and_copy_device_tree();
+50 −0
Original line number Diff line number Diff line
@@ -332,3 +332,53 @@ void free_initmem(void)
{
	free_initmem_default(-1);
}

static void __init parse_memmap_one(char *p)
{
	char *oldp;
	unsigned long start_at, mem_size;

	if (!p)
		return;

	oldp = p;
	mem_size = memparse(p, &p);
	if (p == oldp)
		return;

	switch (*p) {
	case '@':
		start_at = memparse(p + 1, &p);
		add_sysmem_bank(start_at, start_at + mem_size);
		break;

	case '$':
		start_at = memparse(p + 1, &p);
		mem_reserve(start_at, start_at + mem_size, 0);
		break;

	case 0:
		mem_reserve(mem_size, 0, 0);
		break;

	default:
		pr_warn("Unrecognized memmap syntax: %s\n", p);
		break;
	}
}

static int __init parse_memmap_opt(char *str)
{
	while (str) {
		char *k = strchr(str, ',');

		if (k)
			*k++ = 0;

		parse_memmap_one(str);
		str = k;
	}

	return 0;
}
early_param("memmap", parse_memmap_opt);