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

Commit 9ba067f9 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: split bootparam and kernel meminfo



Bootparam meminfo is a bootloader ABI, kernel meminfo is for the kernel
bookkeeping, keep them separate. Kernel doesn't care of memory region
types, so drop the type field and don't pass it to add_sysmem_bank.
Move kernel sysmem structures and prototypes to asm/sysmem.h and sysmem
variable and add_sysmem_bank to mm/init.c

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 25df8198
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -37,23 +37,14 @@ typedef struct bp_tag {
	unsigned long data[0];	/* data */
} bp_tag_t;

typedef struct meminfo {
struct bp_meminfo {
	unsigned long type;
	unsigned long start;
	unsigned long end;
} meminfo_t;

#define SYSMEM_BANKS_MAX 5
};

#define MEMORY_TYPE_CONVENTIONAL	0x1000
#define MEMORY_TYPE_NONE		0x2000

typedef struct sysmem_info {
	int nr_banks;
	meminfo_t bank[SYSMEM_BANKS_MAX];
} sysmem_info_t;

extern sysmem_info_t sysmem;

#endif
#endif
+33 −0
Original line number Diff line number Diff line
/*
 * sysmem-related prototypes.
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2014 Cadence Design Systems Inc.
 */

#ifndef _XTENSA_SYSMEM_H
#define _XTENSA_SYSMEM_H

#define SYSMEM_BANKS_MAX 31

struct meminfo {
	unsigned long start;
	unsigned long end;
};

struct sysmem_info {
	int nr_banks;
	struct meminfo bank[SYSMEM_BANKS_MAX];
};

extern struct sysmem_info sysmem;

int add_sysmem_bank(unsigned long start, unsigned long end);
int mem_reserve(unsigned long, unsigned long, int);
void bootmem_init(void);
void zones_init(void);

#endif /* _XTENSA_SYSMEM_H */
+9 −34
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@
#include <asm/param.h>
#include <asm/traps.h>
#include <asm/smp.h>
#include <asm/sysmem.h>

#include <platform/hardware.h>

@@ -88,12 +89,6 @@ static char __initdata command_line[COMMAND_LINE_SIZE];
static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
#endif

sysmem_info_t __initdata sysmem;

extern int mem_reserve(unsigned long, unsigned long, int);
extern void bootmem_init(void);
extern void zones_init(void);

/*
 * Boot parameter parsing.
 *
@@ -113,31 +108,14 @@ typedef struct tagtable {

/* parse current tag */

static int __init add_sysmem_bank(unsigned long type, unsigned long start,
		unsigned long end)
{
	if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) {
		printk(KERN_WARNING
				"Ignoring memory bank 0x%08lx size %ldKB\n",
				start, end - start);
		return -EINVAL;
	}
	sysmem.bank[sysmem.nr_banks].type  = type;
	sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start);
	sysmem.bank[sysmem.nr_banks].end   = end & PAGE_MASK;
	sysmem.nr_banks++;

	return 0;
}

static int __init parse_tag_mem(const bp_tag_t *tag)
{
	meminfo_t *mi = (meminfo_t *)(tag->data);
	struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data);

	if (mi->type != MEMORY_TYPE_CONVENTIONAL)
		return -1;

	return add_sysmem_bank(mi->type, mi->start, mi->end);
	return add_sysmem_bank(mi->start, mi->end);
}

__tagtable(BP_TAG_MEMORY, parse_tag_mem);
@@ -146,8 +124,8 @@ __tagtable(BP_TAG_MEMORY, parse_tag_mem);

static int __init parse_tag_initrd(const bp_tag_t* tag)
{
	meminfo_t* mi;
	mi = (meminfo_t*)(tag->data);
	struct bp_meminfo *mi = (struct bp_meminfo *)(tag->data);

	initrd_start = (unsigned long)__va(mi->start);
	initrd_end = (unsigned long)__va(mi->end);

@@ -255,7 +233,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
		return;

	size &= PAGE_MASK;
	add_sysmem_bank(MEMORY_TYPE_CONVENTIONAL, base, base + size);
	add_sysmem_bank(base, base + size);
}

void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
@@ -292,8 +270,6 @@ device_initcall(xtensa_device_probe);

void __init init_arch(bp_tag_t *bp_start)
{
	sysmem.nr_banks = 0;

	/* Parse boot parameters */

	if (bp_start)
@@ -304,10 +280,9 @@ void __init init_arch(bp_tag_t *bp_start)
#endif

	if (sysmem.nr_banks == 0) {
		sysmem.nr_banks = 1;
		sysmem.bank[0].start = PLATFORM_DEFAULT_MEM_START;
		sysmem.bank[0].end = PLATFORM_DEFAULT_MEM_START
				     + PLATFORM_DEFAULT_MEM_SIZE;
		add_sysmem_bank(PLATFORM_DEFAULT_MEM_START,
				PLATFORM_DEFAULT_MEM_START +
				PLATFORM_DEFAULT_MEM_SIZE);
	}

#ifdef CONFIG_CMDLINE_BOOL
+17 −0
Original line number Diff line number Diff line
@@ -27,6 +27,23 @@
#include <asm/bootparam.h>
#include <asm/page.h>
#include <asm/sections.h>
#include <asm/sysmem.h>

struct sysmem_info sysmem __initdata;

int __init add_sysmem_bank(unsigned long start, unsigned long end)
{
	if (sysmem.nr_banks >= SYSMEM_BANKS_MAX) {
		pr_warn("Ignoring memory bank 0x%08lx size %ldKB\n",
			start, end - start);
		return -EINVAL;
	}
	sysmem.bank[sysmem.nr_banks].start = PAGE_ALIGN(start);
	sysmem.bank[sysmem.nr_banks].end   = end & PAGE_MASK;
	sysmem.nr_banks++;

	return 0;
}

/*
 * mem_reserve(start, end, must_exist)