diff --git a/src/mainboard/motorola/sandpoint/nvram/Config b/src/mainboard/motorola/sandpoint/nvram/Config new file mode 100644 index 0000000000..b4ce01bfd0 --- /dev/null +++ b/src/mainboard/motorola/sandpoint/nvram/Config @@ -0,0 +1,2 @@ +object bsp_nvram.o +object nvram.o diff --git a/src/mainboard/motorola/sandpoint/nvram/bsp_nvram.c b/src/mainboard/motorola/sandpoint/nvram/bsp_nvram.c new file mode 100644 index 0000000000..bf5a81c812 --- /dev/null +++ b/src/mainboard/motorola/sandpoint/nvram/bsp_nvram.c @@ -0,0 +1,54 @@ +/* + * (C) Copyright 2001 + * Humboldt Solutions Ltd, adrian@humboldt.co.uk. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include "../nvram.h" + +static unsigned bsp_size(struct nvram_device *data) +{ + return 8 * 1024; +} + +static int bsp_read_block(struct nvram_device *dev, unsigned offset, + unsigned char *data, unsigned length) +{ + unsigned i; + + for(i = 0; i < length; i++) + { + outb(((offset + i) >> 8) & 0xff, 0x74); + outb((offset + i) & 0xff, 0x75); + data[i] = inb(0x76); + } + return length; +} + +static int bsp_write_byte(struct nvram_device *data, unsigned offset, unsigned char byte) +{ + outb((offset >> 8) & 0xff, 0x74); + outb(offset & 0xff, 0x75); + outb(byte, 0x76); + return 1; +} + +nvram_device bsp_nvram = { + bsp_size, bsp_read_block, bsp_write_byte, NULL, NULL +}; + diff --git a/src/mainboard/motorola/sandpoint/nvram/nvram.c b/src/mainboard/motorola/sandpoint/nvram/nvram.c new file mode 100644 index 0000000000..d715dee4ac --- /dev/null +++ b/src/mainboard/motorola/sandpoint/nvram/nvram.c @@ -0,0 +1,103 @@ +/* $Id$ */ +/* Copyright 2000 AG Electronics Ltd. */ +/* This code is distributed without warranty under the GPL v2 (see COPYING) */ + +#include +#include +#include +#include "../nvram.h" + +/* NVRAM layout + * + * Environment variable record runs: + * [length]NAME=value[length]NAME=value[0]\0 + * A deleted variable is: + * [length]\0AME=value + * + * When memory is full, we compact. + * + */ +static nvram_device *nvram_dev = 0; +static unsigned char *nvram_buffer = 0; +static unsigned nvram_size = 0; +static u8 nvram_csum = 0; +#define NVRAM_INVALID (! nvram_dev) + +static void update_device(unsigned i, unsigned char data) +{ + if (i < nvram_size) + { + nvram_csum -= nvram_buffer[i]; + nvram_buffer[i] = data; + nvram_dev->write_byte(nvram_dev, i, data); + nvram_csum += data; + } + else + printk_info("Offset %d out of range in nvram\n", i); +} + +static void update_csum(void) +{ + nvram_dev->write_byte(nvram_dev, nvram_size, nvram_csum); + if (nvram_dev->commit) + nvram_dev->commit(nvram_dev); +} + +static void update_string_device(unsigned i, const unsigned char *data, + unsigned len) +{ + if (i + len < nvram_size) + { + unsigned j; + for(j = 0; j < len; j++) + { + nvram_csum -= nvram_buffer[i]; + nvram_buffer[i] = *data; + nvram_dev->write_byte(nvram_dev, i, *data); + nvram_csum += *data; + data++; + i++; + } + } + else + printk_info("Offset %d out of range in nvram\n", i + len); +} + +int nvram_init (struct nvram_device *dev) +{ + nvram_dev = dev; + + if (! nvram_size) + nvram_size = dev->size(dev) - 1; + printk_info("NVRAM size is %d\n", nvram_size); + if (!nvram_buffer) + { + unsigned i; + + nvram_buffer = malloc (nvram_size); + if (!nvram_buffer) + return -1; + + nvram_csum = 0; + dev->read_block(dev, 0, nvram_buffer, nvram_size+1); + for(i = 0; i < nvram_size; i++) + nvram_csum += nvram_buffer[i]; + + if (nvram_csum != nvram_buffer[nvram_size]) + { + printk_info("NVRAM checksum invalid - erasing\n"); + //update_device(0, 0); + //update_csum(); + } + } + printk_info("Initialised nvram\n"); + return 0; +} + +void nvram_clear(void) +{ + printk_info("Erasing NVRAM\n"); + update_device(0, 0); + update_csum(); +} + diff --git a/src/pmc/altimus/mpc7410/Config b/src/pmc/altimus/mpc7410/Config new file mode 100644 index 0000000000..2a1cad45da --- /dev/null +++ b/src/pmc/altimus/mpc7410/Config @@ -0,0 +1,9 @@ +## +## Include the secondary Configuration files +## +northbridge motorola/mpc107 + +## +## Build the objects we have code for in this directory. +## +object mpc7410.o diff --git a/src/pmc/altimus/mpc7410/mpc7410.c b/src/pmc/altimus/mpc7410/mpc7410.c new file mode 100644 index 0000000000..ee1dc4b096 --- /dev/null +++ b/src/pmc/altimus/mpc7410/mpc7410.c @@ -0,0 +1,68 @@ +/* $Id$ */ +/* Copyright 2000 AG Electronics Ltd. */ +/* This code is distributed without warranty under the GPL v2 (see COPYING) */ + +#include +#include +#include +#include +#include +#include + +#define ONEMEG 0x00100000 +#define HALFMEG 0x00080000 + +unsigned long memory_base = 0; +unsigned long memory_top = 0; +unsigned long memory_size = 0; + +//extern char __heap_end[]; +extern unsigned mpc107_config_memory(void); + +unsigned config_memory(unsigned offset) +{ + //extern char __start[]; + //extern char __bss_start[]; + //unsigned rom_image = (unsigned) __start & 0xfff00000; + //unsigned physical = rom_image + offset; + //unsigned codesize = (unsigned) __bss_start - rom_image; + +#if 0 + /* At this point, DBAT 0 is memory, 1 is variable, 2 is the rom image, + and 3 is IO. */ + ppc_set_io_dbat_reloc(2, rom_image, physical, ONEMEG); + ppc_set_io_dbat (3, 0xf0000000, 0x10000000); + if ( rom_image != physical ) + ppc_set_ibats_reloc(rom_image, physical, ONEMEG); + else + ppc_set_ibats(physical, ONEMEG); + + printk_debug("bsp_init_memory...\n"); +#endif + + ppc_setup_cpu(1); /* icache enable = 1 */ + //ppc_enable_mmu(); + + memory_size = mpc107_config_memory(); + + /* If we have some working RAM, we copy the code and rodata into it. + * This allows us to reprogram the flash later. */ +#if 0 + if (memory_size) + { + unsigned onemeg = memory_size - ONEMEG; + ppc_set_mem_dbat_reloc(1, onemeg, onemeg, ONEMEG); + memcpy((void *)onemeg, (void *)rom_image, codesize); + memset((void *)(onemeg + codesize), 0, ONEMEG - codesize); + ppc_set_ibats_reloc2(rom_image, physical, onemeg, ONEMEG); + ppc_set_mem_dbat_reloc(2, rom_image, onemeg, ONEMEG); + make_coherent((void *)onemeg, ONEMEG); + } + + ppc_set_memory_dbat (memory_size); +#endif + + //ppc_enable_dcache (); + + return memory_size; +}