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

Commit 9b731009 authored by Steven J. Hill's avatar Steven J. Hill Committed by Ralf Baechle
Browse files

MIPS: SEAD3: Implement OF support.



Activate USE_OF for SEAD-3 platform. Add basic DTS file and convert memory
detection and reservations to use OF.

[ralf@linux-mips.org: Remove unnecessary #ifdef wrapper in generic.h.  Make
<asm/mips-boards/generic.h> inclusion work even without prior
<linux/of_fdt.h> inclusion.]

Signed-off-by: default avatarSteven J. Hill <sjhill@mips.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/4809/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 8fba1e58
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -353,6 +353,7 @@ config MIPS_SEAD3
	select USB_ARCH_HAS_EHCI
	select USB_EHCI_BIG_ENDIAN_DESC
	select USB_EHCI_BIG_ENDIAN_MMIO
	select USE_OF
	help
	  This enables support for the MIPS Technologies SEAD3 evaluation
	  board.
+4 −0
Original line number Diff line number Diff line
@@ -87,6 +87,10 @@

extern int mips_revision_sconid;

#ifdef CONFIG_OF
extern struct boot_param_header __dtb_start;
#endif

#ifdef CONFIG_PCI
extern void mips_pcibios_init(void);
#else
+8 −2
Original line number Diff line number Diff line
@@ -5,10 +5,12 @@
# Copyright (C) 2008 Wind River Systems, Inc.
#   written by Ralf Baechle <ralf@linux-mips.org>
#
# Copyright (C) 2012 MIPS Technoligies, Inc.  All rights reserved.
# Steven J. Hill <sjhill@mips.com>
#
obj-y				:= sead3-lcd.o sead3-cmdline.o \
				   sead3-display.o sead3-init.o sead3-int.o \
				   sead3-mtd.o sead3-net.o \
				   sead3-memory.o sead3-platform.o \
				   sead3-mtd.o sead3-net.o sead3-platform.o \
				   sead3-reset.o sead3-setup.o sead3-time.o

obj-y				+= sead3-i2c-dev.o sead3-i2c.o \
@@ -17,3 +19,7 @@ obj-y += sead3-i2c-dev.o sead3-i2c.o \

obj-$(CONFIG_EARLY_PRINTK)	+= sead3-console.o
obj-$(CONFIG_USB_EHCI_HCD)	+= sead3-ehci.o
obj-$(CONFIG_OF)		+= sead3.dtb.o

$(obj)/%.dtb: $(obj)/%.dts
	$(call if_changed,dtc)
+4 −1
Original line number Diff line number Diff line
@@ -77,7 +77,6 @@ void __init prom_init(void)
	board_ejtag_handler_setup = mips_ejtag_setup;

	prom_init_cmdline();
	prom_meminit();
#ifdef CONFIG_EARLY_PRINTK
	if ((strstr(prom_getcmdline(), "console=ttyS0")) != NULL)
		prom_init_early_console(0);
@@ -89,3 +88,7 @@ void __init prom_init(void)
		strcat(prom_getcmdline(), " console=ttyS0,38400n8r");
#endif
}

void prom_free_prom_memory(void)
{
}
+0 −138
Original line number Diff line number Diff line
/*
 * 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) 2012 MIPS Technologies, Inc.  All rights reserved.
 */
#include <linux/bootmem.h>

#include <asm/bootinfo.h>
#include <asm/sections.h>
#include <asm/mips-boards/prom.h>

enum yamon_memtypes {
	yamon_dontuse,
	yamon_prom,
	yamon_free,
};

static struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];

/* determined physical memory size, not overridden by command line args  */
unsigned long physical_memsize = 0L;

struct prom_pmemblock * __init prom_getmdesc(void)
{
	char *memsize_str, *ptr;
	unsigned int memsize;
	static char cmdline[COMMAND_LINE_SIZE] __initdata;
	long val;
	int tmp;

	/* otherwise look in the environment */
	memsize_str = prom_getenv("memsize");
	if (!memsize_str) {
		pr_warn("memsize not set in boot prom, set to default 32Mb\n");
		physical_memsize = 0x02000000;
	} else {
		tmp = kstrtol(memsize_str, 0, &val);
		physical_memsize = (unsigned long)val;
	}

#ifdef CONFIG_CPU_BIG_ENDIAN
	/* SOC-it swaps, or perhaps doesn't swap, when DMA'ing the last
	   word of physical memory */
	physical_memsize -= PAGE_SIZE;
#endif

	/* Check the command line for a memsize directive that overrides
	   the physical/default amount */
	strcpy(cmdline, arcs_cmdline);
	ptr = strstr(cmdline, "memsize=");
	if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' '))
		ptr = strstr(ptr, " memsize=");

	if (ptr)
		memsize = memparse(ptr + 8, &ptr);
	else
		memsize = physical_memsize;

	memset(mdesc, 0, sizeof(mdesc));

	mdesc[0].type = yamon_dontuse;
	mdesc[0].base = 0x00000000;
	mdesc[0].size = 0x00001000;

	mdesc[1].type = yamon_prom;
	mdesc[1].base = 0x00001000;
	mdesc[1].size = 0x000ef000;

	/*
	 * The area 0x000f0000-0x000fffff is allocated for BIOS memory by the
	 * south bridge and PCI access always forwarded to the ISA Bus and
	 * BIOSCS# is always generated.
	 * This mean that this area can't be used as DMA memory for PCI
	 * devices.
	 */
	mdesc[2].type = yamon_dontuse;
	mdesc[2].base = 0x000f0000;
	mdesc[2].size = 0x00010000;

	mdesc[3].type = yamon_dontuse;
	mdesc[3].base = 0x00100000;
	mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) -
		mdesc[3].base;

	mdesc[4].type = yamon_free;
	mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end));
	mdesc[4].size = memsize - mdesc[4].base;

	return &mdesc[0];
}

static int __init prom_memtype_classify(unsigned int type)
{
	switch (type) {
	case yamon_free:
		return BOOT_MEM_RAM;
	case yamon_prom:
		return BOOT_MEM_ROM_DATA;
	default:
		return BOOT_MEM_RESERVED;
	}
}

void __init prom_meminit(void)
{
	struct prom_pmemblock *p;

	p = prom_getmdesc();

	while (p->size) {
		long type;
		unsigned long base, size;

		type = prom_memtype_classify(p->type);
		base = p->base;
		size = p->size;

		add_memory_region(base, size, type);
		p++;
	}
}

void __init prom_free_prom_memory(void)
{
	unsigned long addr;
	int i;

	for (i = 0; i < boot_mem_map.nr_map; i++) {
		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
			continue;

		addr = boot_mem_map.map[i].addr;
		free_init_pages("prom memory",
				addr, addr + boot_mem_map.map[i].size);
	}
}
Loading