Commit c32acae9 authored by Paul Mackerras's avatar Paul Mackerras

PPC32: hand-merge arch/ppc/boot/Makefile

parents 461a50a3 e6151c98
# BK Id: SCCS/s.Makefile 1.3 05/17/01 18:14:19 cort
#
#
# Makefile for the linux MPC8xx ppc-specific parts of comm processor
#
......
/*
* BK Id: SCCS/s.commproc.c 1.10 10/16/01 16:21:52 trini
*/
/*
* General Purpose functions for the global management of the
* 8260 Communication Processor Module.
......
/*
* BK Id: SCCS/s.enet.c 1.9 09/14/01 18:01:16 trini
*/
/*
* Ethernet driver for Motorola MPC8260.
* Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Fast Ethernet Controller (FCC) driver for Motorola MPC8260.
* Copyright (c) 2000 MontaVista Software, Inc. Dan Malek (dmalek@jlc.net)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* UART driver for MPC8260 CPM SCC or SMC
* Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
......
# BK Id: %F% %I% %G% %U% %#%
#
#
# Makefile for the linux MPC8xx ppc-specific parts of comm processor
#
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* General Purpose functions for the global management of the
* Communication Processor Module.
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Ethernet driver for Motorola MPC8xx.
* Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Fast Ethernet Controller (FEC) driver for Motorola MPC8xx.
* Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* UART driver for MPC860 CPM SCC or SMC
* Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
......
# BK Id: %F% %I% %G% %U% %#%
#
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies. Remember to do have actions
# for "archclean" and "archdep" for cleaning up and making dependencies for
......
# BK Id: %F% %I% %G% %U% %#%
#
#
# Makefile for Linux arch/m68k/amiga source directory
#
......
/*
* BK Id: SCCS/s.amiga_ksyms.c 1.5 05/17/01 18:14:20 cort
*/
#include "../../m68k/amiga/amiga_ksyms.c"
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* linux/arch/m68k/amiga/amiints.c -- Amiga Linux interrupt handling code
* arch/ppc/amiga/amiints.c -- Amiga Linux interrupt handling code
*
* 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
......
/*
* BK Id: SCCS/s.amisound.c 1.5 05/17/01 18:14:20 cort
*/
#include "../../m68k/amiga/amisound.c"
/*
* BK Id: SCCS/s.bootinfo.c 1.5 05/17/01 18:14:20 cort
*/
/*
* linux/arch/ppc/amiga/bootinfo.c
* arch/ppc/amiga/bootinfo.c
*
* Extracted from arch/m68k/kernel/setup.c.
* Should be properly generalized and put somewhere else.
......
/*
* BK Id: SCCS/s.chipram.c 1.7 05/21/01 00:49:49 cort
*/
#include "../../m68k/amiga/chipram.c"
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* linux/arch/m68k/amiga/cia.c - CIA support
* arch/ppc/amiga/cia.c - CIA support
*
* Copyright (C) 1996 Roman Zippel
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
#define m68k_debug_device debug_device
/*
* linux/arch/m68k/amiga/config.c
* arch/ppc/amiga/config.c
*
* Copyright (C) 1993 Hamish Macdonald
*
......
/*
* BK Id: SCCS/s.ints.c 1.5 05/17/01 18:14:20 cort
*/
/*
* linux/arch/ppc/amiga/ints.c
* arch/ppc/amiga/ints.c
*
* Linux/m68k general interrupt handling code from arch/m68k/kernel/ints.c
* Needed to drive the m68k emulating IRQ hardware on the PowerUp boards.
......
/*
* BK Id: SCCS/s.pcmcia.c 1.5 05/17/01 18:14:20 cort
*/
#include "../../m68k/amiga/pcmcia.c"
/*
* BK Id: SCCS/s.time.c 1.5 05/17/01 18:14:20 cort
*/
#include <linux/config.h> /* CONFIG_HEARTBEAT */
#include <linux/errno.h>
#include <linux/sched.h>
......
......@@ -28,7 +28,7 @@ images/vmlinux.gz: $(TOPDIR)/vmlinux
# Subdirs and tools needed for each. Assume we always need to go into
# 'simple' unless told otherwise.
subdir-y := lib common simple
subdir-$(CONFIG_ALL_PPC) := chrp pmac prep
subdir-$(CONFIG_ALL_PPC) := openfirmware prep
tools-$(CONFIG_ALL_PPC) := addnote mknote hack-coff mkprep
tools-$(CONFIG_PPLUS) := mkbugboot mkprep
tools-$(CONFIG_4xx) := mktree
......@@ -47,6 +47,9 @@ NONBOOT := lib common
# These are the subdirs we want to use
BOOTDIRS = $(filter-out $(NONBOOT), $(subdir-y))
makeof1275:
$(MAKE) -C of1275
# This will make the tools we need. We do it like this to ensure that we use
# HOSTCC. -- Tom
maketools:
......@@ -55,7 +58,7 @@ maketools:
# The targets all boards support for boot images.
BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd
$(BOOT_TARGETS): vmapus lib/lib.a images/vmlinux.gz maketools
$(BOOT_TARGETS): vmapus lib/lib.a images/vmlinux.gz makeof1275 maketools
ifneq ($(BOOTDIRS),)
for d in $(BOOTDIRS); do $(MAKE) -C $$d $@; done
endif
......@@ -80,5 +83,6 @@ vmlinux.sm: $(TOPDIR)/vmlinux utils/addSystemMap
clean:
$(MAKE) -C images clean
$(MAKE) -C utils clean
$(MAKE) -C openfirmware clean
include $(TOPDIR)/Rules.make
# BK Id: %F% %I% %G% %U% %#%
#
# Makefile for making ELF bootable images for booting on CHRP
# using Open Firmware.
#
# Geert Uytterhoeven September 1997
#
# Based on coffboot by Paul Mackerras
LD_ARGS = -T ../ld.script -Ttext 0x00400000
OBJS = ../common/crt0.o start.o main.o misc.o ../common/string.o image.o \
../common/ofcommon.o
EXTRA_TARGETS := $(OBJS)
LIBS = $(TOPDIR)/lib/lib.a ../lib/zlib.a
# Utils
ADDNOTE = ../utils/addnote
PIGGYBACK = ../utils/piggyback
ifeq ($(CONFIG_PPC64BRIDGE),y)
END += .64
AFLAGS += -Wa,-mppc64bridge
endif
ifeq ($(CONFIG_SMP),y)
END += .smp
endif
TFTPIMAGE=/tftpboot/zImage.chrp$(END)
all: zImage
znetboot: zImage
cp -f $(TOPDIR)/vmlinux /tftpboot/vmlinux$(END)
cp ../images/zImage.chrp $(TFTPIMAGE)
znetboot.initrd: zImage.initrd
cp ../images/zImage.initrd.chrp $(TFTPIMAGE)
floppy: zImage
mcopy zImage a:zImage
image.o: ../images/vmlinux.gz ../common/dummy.o
$(OBJCOPY) ../common/dummy.o $@ \
--add-section=.image=../images/vmlinux.gz \
--set-section-flags=.image=contents,alloc,load,readonly,data
ifdef CONFIG_XMON
$(OBJCOPY) $@ $@ \
--add-section=.sysmap=$(TOPDIR)/System.map \
--set-section-flags=.sysmap=contents,alloc,load,readonly,data
endif
zImage: $(OBJS) $(LIBS) $(ADDNOTE)
$(LD) $(LD_ARGS) -o ../images/$@.chrp $(OBJS) $(LIBS)
$(OBJCOPY) ../images/$@.chrp ../images/$@.chrp -R .comment -R .ramdisk
cp ../images/$@.chrp ../images/$@.chrp-rs6k
$(ADDNOTE) ../images/$@.chrp-rs6k
zImage.initrd: $(OBJS) $(LIBS) $(ADDNOTE) ../images/ramdisk.image.gz
$(OBJCOPY) image.o image.o \
--add-section=.ramdisk=../images/ramdisk.image.gz \
--set-section-flags=.ramdisk=contents,alloc,load,readonly,data
$(LD) $(LD_ARGS) -o ../images/$@.chrp $(OBJS) $(LIBS)
$(OBJCOPY) ../images/$@.chrp ../images/$@.chrp -R .comment
cp ../images/$@.chrp ../images/$@.chrp-rs6k
$(ADDNOTE) ../images/$@.chrp-rs6k
include $(TOPDIR)/Rules.make
/*
* BK Id: SCCS/s.misc.S 1.6 05/18/01 15:16:59 cort
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
* 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.
*/
.text
/*
* Use the BAT0 registers to map the 1st 8MB of RAM to 0x90000000.
*/
.globl setup_bats
setup_bats:
mfpvr 3
rlwinm 3,3,16,16,31 /* r3 = 1 for 601, 4 for 604 */
cmpi 0,3,1
lis 4,0x9000
bne 4f
ori 4,4,4 /* set up BAT registers for 601 */
li 5,0x7f
b 5f
4: ori 4,4,0xff /* set up BAT registers for 604 */
li 5,2
mtdbatu 3,4
mtdbatl 3,5
5: mtibatu 3,4
mtibatl 3,5
isync
blr
/*
* Flush the dcache and invalidate the icache for a range of addresses.
*
* flush_cache(addr, len)
*/
.global flush_cache
flush_cache:
addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */
rlwinm. 4,4,27,5,31
mtctr 4
beqlr
1: dcbf 0,3
icbi 0,3
addi 3,3,0x20
bdnz 1b
sync
isync
blr
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
* 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.
*/
#include <stdarg.h>
int (*prom)(void *args);
void *chosen_handle;
void *stdin;
void *stdout;
void *stderr;
void exit(void);
void *finddevice(const char *name);
int getprop(void *phandle, const char *name, void *buf, int buflen);
void printk(char *fmt, ...);
extern void chrpboot(int a1, int a2, void *prom);
extern int strlen(const char *s);
void
start(int a1, int a2, void *promptr)
{
prom = promptr;
chosen_handle = finddevice("/chosen");
if (chosen_handle == (void *) -1)
exit();
if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4)
exit();
stderr = stdout;
if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
exit();
chrpboot(a1, a2, promptr);
for (;;)
exit();
}
int
write(void *handle, void *ptr, int nb)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *ihandle;
void *addr;
int len;
int actual;
} args;
args.service = "write";
args.nargs = 3;
args.nret = 1;
args.ihandle = handle;
args.addr = ptr;
args.len = nb;
args.actual = -1;
prom(&args);
return args.actual;
}
int
read(void *handle, void *ptr, int nb)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *ihandle;
void *addr;
int len;
int actual;
} args;
args.service = "read";
args.nargs = 3;
args.nret = 1;
args.ihandle = handle;
args.addr = ptr;
args.len = nb;
args.actual = -1;
(*prom)(&args);
return args.actual;
}
void
exit(void)
{
struct prom_args {
char *service;
} args;
for (;;) {
args.service = "exit";
(*prom)(&args);
}
}
void
pause(void)
{
struct prom_args {
char *service;
} args;
args.service = "enter";
(*prom)(&args);
}
void *
finddevice(const char *name)
{
struct prom_args {
char *service;
int nargs;
int nret;
const char *devspec;
void *phandle;
} args;
args.service = "finddevice";
args.nargs = 1;
args.nret = 1;
args.devspec = name;
args.phandle = (void *) -1;
(*prom)(&args);
return args.phandle;
}
void *
claim(unsigned int virt, unsigned int size, unsigned int align)
{
struct prom_args {
char *service;
int nargs;
int nret;
unsigned int virt;
unsigned int size;
unsigned int align;
void *ret;
} args;
args.service = "claim";
args.nargs = 3;
args.nret = 1;
args.virt = virt;
args.size = size;
args.align = align;
(*prom)(&args);
return args.ret;
}
int
getprop(void *phandle, const char *name, void *buf, int buflen)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *phandle;
const char *name;
void *buf;
int buflen;
int size;
} args;
args.service = "getprop";
args.nargs = 4;
args.nret = 1;
args.phandle = phandle;
args.name = name;
args.buf = buf;
args.buflen = buflen;
args.size = -1;
(*prom)(&args);
return args.size;
}
int
putc(int c, void *f)
{
char ch = c;
if (c == '\n')
putc('\r', f);
return write(f, &ch, 1) == 1? c: -1;
}
int
putchar(int c)
{
return putc(c, stdout);
}
int
fputs(char *str, void *f)
{
int n = strlen(str);
return write(f, str, n) == n? 0: -1;
}
int
readchar(void)
{
char ch;
for (;;) {
switch (read(stdin, &ch, 1)) {
case 1:
return ch;
case -1:
printk("read(stdin) returned -1\r\n");
return -1;
}
}
}
static char line[256];
static char *lineptr;
static int lineleft;
int
getchar(void)
{
int c;
if (lineleft == 0) {
lineptr = line;
for (;;) {
c = readchar();
if (c == -1 || c == 4)
break;
if (c == '\r' || c == '\n') {
*lineptr++ = '\n';
putchar('\n');
break;
}
switch (c) {
case 0177:
case '\b':
if (lineptr > line) {
putchar('\b');
putchar(' ');
putchar('\b');
--lineptr;
}
break;
case 'U' & 0x1F:
while (lineptr > line) {
putchar('\b');
putchar(' ');
putchar('\b');
--lineptr;
}
break;
default:
if (lineptr >= &line[sizeof(line) - 1])
putchar('\a');
else {
putchar(c);
*lineptr++ = c;
}
}
}
lineleft = lineptr - line;
lineptr = line;
}
if (lineleft == 0)
return -1;
--lineleft;
return *lineptr++;
}
extern int vsprintf(char *buf, const char *fmt, va_list args);
static char sprint_buf[1024];
void
printk(char *fmt, ...)
{
va_list args;
int n;
va_start(args, fmt);
n = vsprintf(sprint_buf, fmt, args);
va_end(args);
write(stdout, sprint_buf, n);
}
int
printf(char *fmt, ...)
{
va_list args;
int n;
va_start(args, fmt);
n = vsprintf(sprint_buf, fmt, args);
va_end(args);
write(stdout, sprint_buf, n);
return n;
}
/*
* arch/ppc/boot/common/cpc700_memory.c
*
* Find memory based upon settings in the CPC700 bridge
*
* Author: Dan Cox
*
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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.
*/
#include <asm/types.h>
#include <asm/io.h>
#include "cpc700.h"
unsigned long
cpc700_get_mem_size(void)
{
int i;
unsigned long len, amt;
/* Start at MB1EA, since MB0EA will most likely be the ending address
for ROM space. */
for(len = 0, i = CPC700_MB1EA; i <= CPC700_MB4EA; i+=4) {
amt = cpc700_read_memreg(i);
if (amt == 0)
break;
len = amt;
}
return len;
}
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Copyright (c) 1997 Paul Mackerras <paulus@cs.anu.edu.au>
* Initial Power Macintosh COFF version.
* Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
int main(void)
{
return 0;
......
......@@ -64,6 +64,7 @@ extern char _end[];
extern unsigned long start;
extern int CRT_tstc(void);
extern unsigned long get_mem_size(void);
extern unsigned long serial_init(int chan, void *ignored);
extern void serial_close(unsigned long com_port);
extern void gunzip(void *, int, unsigned char *, int *);
......@@ -75,10 +76,19 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
int timer = 0;
char *cp, ch;
struct bi_record *rec, *birecs;
unsigned long TotalMemory = 0;
serial_fixups();
com_port = serial_init(0, NULL);
#if defined(CONFIG_LOPEC) || defined(CONFIG_PAL4)
/*
* Call get_mem_size(), which is memory controller dependant,
* and we must have the correct file linked in here.
*/
TotalMemory = get_mem_size();
#endif
/* assume the chunk below 8M is free */
end_avail = (char *)0x00800000;
......@@ -194,6 +204,13 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
rec->size = sizeof(struct bi_record);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
if ( TotalMemory ) {
rec->tag = BI_MEMSIZE;
rec->data[0] = TotalMemory;
rec->size = sizeof(struct bi_record) + sizeof(unsigned long);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
}
rec->tag = BI_CMD_LINE;
memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1);
rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1;
......
/*
* arch/ppc/boot/common/mpc10x_common.c
*
* A routine to find out how much memory the machine has.
*
* Based on:
* arch/ppc/kernel/mpc10x_common.c
*
* Author: Mark A. Greer
* mgreer@mvista.com
*
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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.
*/
#include <linux/pci.h>
#include <asm/types.h>
#include <asm/io.h>
#include "mpc10x.h"
/*
* *** WARNING - A BAT MUST be set to access the PCI config addr/data regs ***
*/
/*
* PCI config space macros, similar to indirect_xxx and early_xxx macros.
* We assume bus 0.
*/
#define MPC10X_CFG_read(val, addr, type, op) *val = op((type)(addr))
#define MPC10X_CFG_write(val, addr, type, op) op((type *)(addr), (val))
#define MPC10X_PCI_OP(rw, size, type, op, mask) \
static void \
mpc10x_##rw##_config_##size(unsigned int *cfg_addr, \
unsigned int *cfg_data, int devfn, int offset, \
type val) \
{ \
out_be32(cfg_addr, \
((offset & 0xfc) << 24) | (devfn << 16) \
| (0 << 8) | 0x80); \
MPC10X_CFG_##rw(val, cfg_data + (offset & mask), type, op); \
return; \
}
MPC10X_PCI_OP(read, byte, u8 *, in_8, 3)
MPC10X_PCI_OP(read, dword, u32 *, in_le32, 0)
/*
* Read the memory controller registers to determine the amount of memory in
* the system. This assumes that the firmware has correctly set up the memory
* controller registers. On CONFIG_ALL_PPC, we know we are being called
* under a PReP memory map. On all other machines, we assume we are under
* a CHRP memory map.
*/
unsigned long
get_mem_size(void)
{
unsigned int *config_addr, *config_data, val;
unsigned long start, end, total, offset;
int i;
unsigned char bank_enables;
#ifdef CONFIG_ALL_PPC
config_addr = (unsigned int *)MPC10X_MAPA_CNFG_ADDR;
config_data = (unsigned int *)MPC10X_MAPA_CNFG_DATA;
#else
config_addr = (unsigned int *)MPC10X_MAPB_CNFG_ADDR;
config_data = (unsigned int *)MPC10X_MAPB_CNFG_DATA;
#endif
mpc10x_read_config_byte(config_addr, config_data, PCI_DEVFN(0,0),
MPC10X_MCTLR_MEM_BANK_ENABLES, &bank_enables);
total = 0;
for (i = 0; i < 8; i++) {
if (bank_enables & (1 << i)) {
offset = MPC10X_MCTLR_MEM_START_1 + ((i > 3) ? 4 : 0);
mpc10x_read_config_dword(config_addr, config_data,
PCI_DEVFN(0,0), offset, &val);
start = (val >> ((i & 3) << 3)) & 0xff;
offset = MPC10X_MCTLR_EXT_MEM_START_1 + ((i>3) ? 4 : 0);
mpc10x_read_config_dword(config_addr, config_data,
PCI_DEVFN(0,0), offset, &val);
val = (val >> ((i & 3) << 3)) & 0x03;
start = (val << 28) | (start << 20);
offset = MPC10X_MCTLR_MEM_END_1 + ((i > 3) ? 4 : 0);
mpc10x_read_config_dword(config_addr, config_data,
PCI_DEVFN(0,0), offset, &val);
end = (val >> ((i & 3) << 3)) & 0xff;
offset = MPC10X_MCTLR_EXT_MEM_END_1 + ((i > 3) ? 4 : 0);
mpc10x_read_config_dword(config_addr, config_data,
PCI_DEVFN(0,0), offset, &val);
val = (val >> ((i & 3) << 3)) & 0x03;
end = (val << 28) | (end << 20) | 0xfffff;
total += (end - start + 1);
}
}
return total;
}
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* COM1 NS16550 support
*/
......
/*
* BK Id: %F% %I% %G% %U% %#%
*
* Copyright (C) Paul Mackerras 1997.
*
* This program is free software; you can redistribute it and/or
......
/*
* BK Id: SCCS/s.string.S 1.8 05/18/01 06:20:29 patch
*/
/*
* String handling functions for PowerPC.
*
......
......@@ -160,11 +160,6 @@ udelay:
blt 2b
3: blr
.globl _put_MSR
_put_MSR:
mtmsr r3
blr
.section ".relocate_code","xa"
/*
* Flush and enable instruction cache
......
#ifndef __PPC_BOOT_CPC700_H
#define __PPC_BOOT_CPC700_H
#define CPC700_MEM_CFGADDR 0xff500008
#define CPC700_MEM_CFGDATA 0xff50000c
#define CPC700_MB0SA 0x38
#define CPC700_MB0EA 0x58
#define CPC700_MB1SA 0x3c
#define CPC700_MB1EA 0x5c
#define CPC700_MB2SA 0x40
#define CPC700_MB2EA 0x60
#define CPC700_MB3SA 0x44
#define CPC700_MB3EA 0x64
#define CPC700_MB4SA 0x48
#define CPC700_MB4EA 0x68
static inline long
cpc700_read_memreg(int reg)
{
out_be32((volatile unsigned int *) CPC700_MEM_CFGADDR, reg);
return in_be32((volatile unsigned int *) CPC700_MEM_CFGDATA);
}
#endif
/*
* arch/ppc/boot/include/mpc10.h
*
* Common defines for the Motorola SPS MPC106/8240/107 Host bridge/Mem
* ctrl/EPIC/etc.
*
* Author: Tom Rini <trini@mvista.com>
*
* This is a heavily stripped down version of:
* include/asm-ppc/mpc10x.h
*
* Author: Mark A. Greer
* mgreer@mvista.com
*
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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.
*/
#ifndef __BOOT_MPC10X_H__
#define __BOOT_MPC10X_H__
/*
* The values here don't completely map everything but should work in most
* cases.
*
* MAP A (PReP Map)
* Processor: 0x80000000 - 0x807fffff -> PCI I/O: 0x00000000 - 0x007fffff
* Processor: 0xc0000000 - 0xdfffffff -> PCI MEM: 0x00000000 - 0x1fffffff
* PCI MEM: 0x80000000 -> Processor System Memory: 0x00000000
* EUMB mapped to: ioremap_base - 0x00100000 (ioremap_base - 1 MB)
*
* MAP B (CHRP Map)
* Processor: 0xfe000000 - 0xfebfffff -> PCI I/O: 0x00000000 - 0x00bfffff
* Processor: 0x80000000 - 0xbfffffff -> PCI MEM: 0x80000000 - 0xbfffffff
* PCI MEM: 0x00000000 -> Processor System Memory: 0x00000000
* EUMB mapped to: ioremap_base - 0x00100000 (ioremap_base - 1 MB)
*/
/* Define the type of map to use */
#define MPC10X_MEM_MAP_A 1
#define MPC10X_MEM_MAP_B 2
/* Map A (PReP Map) Defines */
#define MPC10X_MAPA_CNFG_ADDR 0x80000cf8
#define MPC10X_MAPA_CNFG_DATA 0x80000cfc
/* Map B (CHRP Map) Defines */
#define MPC10X_MAPB_CNFG_ADDR 0xfec00000
#define MPC10X_MAPB_CNFG_DATA 0xfee00000
/* Define offsets for the memory controller registers in the config space */
#define MPC10X_MCTLR_MEM_START_1 0x80 /* Banks 0-3 */
#define MPC10X_MCTLR_MEM_START_2 0x84 /* Banks 4-7 */
#define MPC10X_MCTLR_EXT_MEM_START_1 0x88 /* Banks 0-3 */
#define MPC10X_MCTLR_EXT_MEM_START_2 0x8c /* Banks 4-7 */
#define MPC10X_MCTLR_MEM_END_1 0x90 /* Banks 0-3 */
#define MPC10X_MCTLR_MEM_END_2i 0x94 /* Banks 4-7 */
#define MPC10X_MCTLR_EXT_MEM_END_1 0x98 /* Banks 0-3 */
#define MPC10X_MCTLR_EXT_MEM_END_2 0x9c /* Banks 4-7 */
#define MPC10X_MCTLR_MEM_BANK_ENABLES 0xa0
#endif /* __BOOT_MPC10X_H__ */
/*
* BK Id: SCCS/s.nonstdio.h 1.9 07/25/01 18:13:07 trini
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
typedef void *prom_handle;
typedef void *ihandle;
typedef void *phandle;
typedef int (*prom_entry)(void *);
#define OF_INVALID_HANDLE ((prom_handle)-1UL)
extern prom_entry of_prom_entry;
/* function declarations */
void * claim(unsigned int virt, unsigned int size, unsigned int align);
void enter(void);
void exit(void);
phandle finddevice(const char *name);
int getprop(phandle node, const char *name, void *buf, int buflen);
void ofinit(prom_entry entry);
int ofstdio(ihandle *stdin, ihandle *stdout, ihandle *stderr);
int read(ihandle instance, void *buf, int buflen);
void release(void *virt, unsigned int size);
int write(ihandle instance, void *buf, int buflen);
/* inlines */
extern inline void pause(void)
{
enter();
}
/*
* BK Id: SCCS/s.rs6000.h 1.7 05/18/01 15:17:23 cort
*/
/* IBM RS/6000 "XCOFF" file definitions for BFD.
Copyright (C) 1990, 1991 Free Software Foundation, Inc.
FIXME: Can someone provide a transliteration of this name into ASCII?
......
/*
* BK Id: SCCS/s.zlib.h 1.8 05/18/01 15:17:23 cort
*/
/*
* This file is derived from zlib.h and zconf.h from the zlib-0.95
* distribution by Jean-loup Gailly and Mark Adler, with some additions
......
......@@ -39,7 +39,7 @@ SECTIONS
PROVIDE (etext = .);
/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
. = ALIGN(8);
.data :
{
*(.data)
......@@ -69,6 +69,7 @@ SECTIONS
_edata = .;
PROVIDE (edata = .);
. = ALIGN(8);
__bss_start = .;
.bss :
{
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* This file is derived from various .h and .c files from the zlib-0.95
* distribution by Jean-loup Gailly and Mark Adler, with some additions
......
#
# Makefile of1275 stuff
#
L_TARGET := of1275.a
obj-y := claim.o enter.o exit.o finddevice.o getprop.o ofinit.o \
ofstdio.o read.o release.o write.o
include $(TOPDIR)/Rules.make
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
void *
claim(unsigned int virt, unsigned int size, unsigned int align)
{
struct prom_args {
char *service;
int nargs;
int nret;
unsigned int virt;
unsigned int size;
unsigned int align;
void *ret;
} args;
args.service = "claim";
args.nargs = 3;
args.nret = 1;
args.virt = virt;
args.size = size;
args.align = align;
(*of_prom_entry)(&args);
return args.ret;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
void
enter(void)
{
struct prom_args {
char *service;
} args;
args.service = "enter";
(*of_prom_entry)(&args);
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
void
exit(void)
{
struct prom_args {
char *service;
} args;
for (;;) {
args.service = "exit";
(*of_prom_entry)(&args);
}
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
phandle
finddevice(const char *name)
{
struct prom_args {
char *service;
int nargs;
int nret;
const char *devspec;
phandle device;
} args;
args.service = "finddevice";
args.nargs = 1;
args.nret = 1;
args.devspec = name;
args.device = OF_INVALID_HANDLE;
(*of_prom_entry)(&args);
return args.device;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
int
getprop(phandle node, const char *name, void *buf, int buflen)
{
struct prom_args {
char *service;
int nargs;
int nret;
phandle node;
const char *name;
void *buf;
int buflen;
int size;
} args;
args.service = "getprop";
args.nargs = 4;
args.nret = 1;
args.node = node;
args.name = name;
args.buf = buf;
args.buflen = buflen;
args.size = -1;
(*of_prom_entry)(&args);
return args.size;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
prom_entry of_prom_entry;
void
ofinit(prom_entry prom_ptr)
{
of_prom_entry = prom_ptr;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
int
ofstdio(ihandle *stdin, ihandle *stdout, ihandle *stderr)
{
ihandle in, out;
phandle chosen;
if ((chosen = finddevice("/chosen")) == OF_INVALID_HANDLE)
goto err;
if (getprop(chosen, "stdout", &out, sizeof(out)) != 4)
goto err;
if (getprop(chosen, "stdin", &in, sizeof(in)) != 4)
goto err;
*stdin = in;
*stdout = out;
*stderr = out;
return 0;
err:
return -1;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
int
read(ihandle instance, void *buf, int buflen)
{
struct prom_args {
char *service;
int nargs;
int nret;
ihandle instance;
void *buf;
int buflen;
int actual;
} args;
args.service = "read";
args.nargs = 3;
args.nret = 1;
args.instance = instance;
args.buf = buf;
args.buflen = buflen;
args.actual = -1;
(*of_prom_entry)(&args);
return args.actual;
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
void
release(void *virt, unsigned int size)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *virt;
unsigned int size;
} args;
args.service = "release";
args.nargs = 2;
args.nret = 0;
args.virt = virt;
args.size = size;
(*of_prom_entry)(&args);
}
/*
* Copyright (C) Paul Mackerras 1997.
* Copyright (C) Leigh Brown 2002.
*
* 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.
*/
#include "of1275.h"
int
write(ihandle instance, void *buf, int buflen)
{
struct prom_args {
char *service;
int nargs;
int nret;
ihandle instance;
void *buf;
int buflen;
int actual;
} args;
args.service = "write";
args.nargs = 3;
args.nret = 1;
args.instance = instance;
args.buf = buf;
args.buflen = buflen;
args.actual = -1;
(*of_prom_entry)(&args);
return args.actual;
}
# BK Id: %F% %I% %G% %U% %#%
#
# Makefile for making XCOFF bootable images for booting on PowerMacs
# using Open Firmware.
# Makefile for making bootable images on various OpenFirmware machines.
#
# Paul Mackerras January 1997
#
# Cleaned up, moved into arch/ppc/boot/pmac
# XCOFF bootable images for PowerMacs
# Geert Uytterhoeven September 1997
# ELF bootable iamges for CHRP machines.
# Tom Rini January 2001
# Cleaned up, moved into arch/ppc/boot/pmac
# Tom Rini July/August 2002
# Merged 'chrp' and 'pmac' into 'openfirmware', and cleaned up the
# rules.
OBJCOPY_ARGS = -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment
COFF_LD_ARGS = -T ../ld.script -e _start -Ttext 0x00500000 -Bstatic
CHRP_LD_ARGS = -T ../ld.script -Ttext 0x01000000
CHRP_LD_ARGS = -T ../ld.script -e _start -Ttext 0x00400000
NEWWORLD_LD_ARGS = -T ../ld.script -e _start -Ttext 0x01000000
COMMONOBJS = start.o misc.o ../common/string.o ../common/ofcommon.o
COMMONOBJS = start.o misc.o ../common/string.o common.o
COFFOBJS = ../common/coffcrt0.o $(COMMONOBJS) coffmain.o
CHRPOBJS = ../common/crt0.o $(COMMONOBJS) chrpmain.o
NEWWORLDOBJS = ../common/crt0.o $(COMMONOBJS) newworldmain.o
EXTRA_TARGETS := $(COFFOBJS) $(CHRPOBJS)
LIBS = $(TOPDIR)/lib/lib.a ../lib/zlib.a
EXTRA_TARGETS := $(COFFOBJS) $(CHRPOBJS) $(NEWWORLDOBJS)
LIBS = $(TOPDIR)/lib/lib.a ../lib/zlib.a ../of1275/of1275.a
ADDNOTE := ../utils/addnote
MKNOTE := ../utils/mknote
SIZE := ../utils/size
OFFSET := ../utils/offset
......@@ -31,7 +36,7 @@ ifdef CONFIG_PPC64BRIDGE
END += .64
endif
TFTPIMAGE=/tftpboot/zImage.pmac$(END)
TFTPIMAGE=/tftpboot/zImage.
../common/coffcrt0.o:
$(MAKE) -C ../common coffcrt0.o
......@@ -46,34 +51,42 @@ ifdef CONFIG_XMON
--set-section-flags=.sysmap=contents,alloc,load,readonly,data
endif
# Place the ramdisk in the initrd image.
image-initrd.o: image.o ../images/ramdisk.image.gz
$(OBJCOPY) image.o $@ \
--add-section=.ramdisk=../images/ramdisk.image.gz \
--set-section-flags=.ramdisk=contents,alloc,load,readonly,data
# Create the note section for New-World PowerMacs.
note: $(MKNOTE)
$(MKNOTE) > note
znetboot: vmlinux.coff vmlinux.elf-pmac zImage
cp ../images/vmlinux.coff $(TFTPIMAGE)
cp ../images/vmlinux.elf-pmac $(TFTPIMAGE).elf
cp ../images/vmlinux.coff $(TFTPIMAGE).pmac$(END)
cp ../images/vmlinux.elf-pmac $(TFTPIMAGE).pmac$(END)elf
cp ../images/zImage.chrp $(TFTPIMAGE).chrp$(END)
znetboot.initrd: vmlinux.initrd.coff vmlinux.initrd.elf-pmac
cp ../images/vmlinux.initrd.coff $(TFTPIMAGE)
cp ../images/vmlinux.initrd.elf-pmac $(TFTPIMAGE).elf
cp ../images/vmlinux.initrd.coff $(TFTPIMAGE).pmac$(END)
cp ../images/vmlinux.initrd.elf-pmac $(TFTPIMAGE).pmac$(END).elf
cp ../images/zImage.initrd.chrp $(TFTPIMAGE).chrp$(END)
miboot.image: ../common/dummy.o ../images/vmlinux.gz
$(OBJCOPY) $(OBJCOPY_ARGS) --add-section=image=../images/vmlinux.gz \
../common/dummy.o ../images/$@
miboot.initrd.image: miboot.image ../images/ramdisk.image.gz
$(OBJCOPY) $(OBJCOPY_ARGS) --add-section=initrd=../images/ramdisk.image.gz \
$(OBJCOPY) $(OBJCOPY_ARGS) \
--add-section=initrd=../images/ramdisk.image.gz \
../images/miboot.image ../images/$@
coffboot: $(COFFOBJS) image.o $(LIBS) ../ld.script
$(LD) -o $@ $(COFF_LD_ARGS) $(COFFOBJS) image.o $(LIBS)
$(OBJCOPY) $@ $@ -R .comment
coffboot: $(COFFOBJS) image.o $(LIBS)
$(LD) -o $@ $(COFF_LD_ARGS) $^
$(OBJCOPY) $@ $@ -R .comment -R .ramdisk
coffboot.initrd: $(COFFOBJS) image.o $(LIBS) ../ld.script \
../images/ramdisk.image.gz
$(OBJCOPY) image.o image-coff.o \
--add-section=.ramdisk=../images/ramdisk.image.gz \
--set-section-flags=.ramdisk=contents,alloc,load,readonly,data
$(LD) -o $@ $(COFF_LD_ARGS) $(COFFOBJS) image-coff.o $(LIBS)
coffboot.initrd: $(COFFOBJS) image-initrd.o $(LIBS)
$(LD) -o $@ $(COFF_LD_ARGS) $^
$(OBJCOPY) $@ $@ -R .comment
rm -f image-coff.o
vmlinux.coff: coffboot $(HACKCOFF)
$(OBJCOPY) $(OBJCOPY_ARGS) coffboot ../images/$@
......@@ -87,26 +100,38 @@ vmlinux.initrd.coff: coffboot.initrd $(HACKCOFF)
rm -f coffboot.initrd
ln -sf vmlinux.initrd.coff ../images/zImage.initrd.pmac
vmlinux.elf-pmac: $(CHRPOBJS) $(LIBS) $(MKNOTE) image.o
$(LD) $(CHRP_LD_ARGS) -o ../images/$@ $(CHRPOBJS) $(LIBS) image.o
$(MKNOTE) > note
$(OBJCOPY) ../images/$@ ../images/$@ --add-section=.note=note \
vmlinux.elf-pmac: $(NEWWORLDOBJS) $(LIBS) image.o
$(LD) $(NEWWORLD_LD_ARGS) -o ../images/$@ $^
vmlinux.initrd.elf-pmac: $(NEWWORLDOBJS) $(LIBS) image-initrd.o
$(LD) $(NEWWORLD_LD_ARGS) -o ../images/$@ $^
zImage.chrp: $(CHRPOBJS) image.o $(LIBS)
$(LD) $(CHRP_LD_ARGS) -o ../images/$@ $^
zImage.initrd.chrp: $(CHRPOBJS) image-initrd.o $(LIBS)
$(LD) $(CHRP_LD_ARGS) -o ../images/$@ $^
zImage: vmlinux.coff vmlinux.elf-pmac zImage.chrp miboot.image $(ADDNOTE) \
note
$(OBJCOPY) ../images/vmlinux.elf-pmac ../images/vmlinux.elf-pmac \
--add-section=.note=note -R .comment -R .ramdisk
$(OBJCOPY) ../images/zImage.chrp ../images/zImage.chrp \
-R .comment -R .ramdisk
rm -f note
cp ../images/zImage.chrp ../images/zImage.chrp-rs6k
$(ADDNOTE) ../images/zImage.chrp-rs6k
vmlinux.initrd.elf-pmac: $(CHRPOBJS) $(LIBS) $(MKNOTE) image.o \
../images/ramdisk.image.gz
$(OBJCOPY) image.o image-elf.o \
--add-section=.ramdisk=../images/ramdisk.image.gz \
--set-section-flags=.ramdisk=contents,alloc,load,readonly,data
$(LD) $(CHRP_LD_ARGS) -o ../images/$@ $(CHRPOBJS) $(LIBS) image-elf.o
$(MKNOTE) > note
$(OBJCOPY) ../images/$@ ../images/$@ --add-section=.note=note \
zImage.initrd: vmlinux.initrd.coff vmlinux.initrd.elf-pmac zImage.initrd.chrp \
miboot.initrd.image $(ADDNOTE) note
$(OBJCOPY) ../images/vmlinux.initrd.elf-pmac \
../images/vmlinux.initrd.elf-pmac --add-section=.note=note \
-R .comment
rm -f note image-elf.o
zImage: vmlinux.coff vmlinux.elf-pmac miboot.image
$(OBJCOPY) ../images/zImage.initrd.chrp ../images/zImage.initrd.chrp \
-R .comment
cp ../images/zImage.initrd.chrp ../images/zImage.initrd.chrp-rs6k
$(ADDNOTE) ../images/zImage.initrd.chrp-rs6k
zImage.initrd: vmlinux.initrd.coff vmlinux.initrd.elf-pmac miboot.initrd.image
clean:
rm -f note
include $(TOPDIR)/Rules.make
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......@@ -10,23 +7,20 @@
* 2 of the License, or (at your option) any later version.
*/
#include "nonstdio.h"
#include "of1275.h"
#include <asm/processor.h>
#include <asm/page.h>
/* Passed from the linker */
extern char __image_begin, __image_end;
extern char __ramdisk_begin[], __ramdisk_end;
extern char __ramdisk_begin, __ramdisk_end;
extern char _start, _end;
extern int getprop(void *, const char *, void *, int);
extern unsigned int heap_max;
extern void claim(unsigned int virt, unsigned int size, unsigned int align);
extern void *finddevice(const char *);
extern void flush_cache(void *, unsigned long);
extern void gunzip(void *, int, unsigned char *, int *);
extern void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
unsigned int progend);
extern void pause(void);
char *avail_ram;
char *begin_avail, *end_avail;
......@@ -49,7 +43,7 @@ static char scratch[SCRATCH_SIZE]; /* 1MB of scratch space for gunzip */
typedef void (*kernel_start_t)(int, int, void *, unsigned int, unsigned int);
void
chrpboot(int a1, int a2, void *prom)
boot(int a1, int a2, void *prom)
{
unsigned sa, len;
void *dst;
......@@ -58,23 +52,23 @@ chrpboot(int a1, int a2, void *prom)
printf("chrpboot starting: loaded at 0x%p\n\r", &_start);
initrd_size = (char *)(&__ramdisk_end) - (char *)(&__ramdisk_begin);
initrd_size = &__ramdisk_end - &__ramdisk_begin;
if (initrd_size) {
initrd_start = (RAM_END - initrd_size) & ~0xFFF;
a1 = initrd_start;
a2 = initrd_size;
claim(initrd_start, RAM_END - initrd_start, 0);
printf("initial ramdisk moving 0x%x <- 0x%p (%x bytes)\n\r",
initrd_start, (char *)(&__ramdisk_begin), initrd_size);
memcpy((char *)initrd_start, (char *)(&__ramdisk_begin), initrd_size);
initrd_start, &__ramdisk_begin, initrd_size);
memcpy((char *)initrd_start, &__ramdisk_begin, initrd_size);
} else {
initrd_start = 0;
initrd_size = 0;
a2 = 0xdeadbeef;
}
im = (char *)(&__image_begin);
len = (char *)(&__image_end) - (char *)(&__image_begin);
im = &__image_begin;
len = &__image_end - &__image_begin;
/* claim 4MB starting at PROG_START */
claim(PROG_START, PROG_SIZE - PROG_START, 0);
dst = (void *) PROG_START;
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......@@ -13,6 +10,7 @@
#include <asm/page.h>
#include "nonstdio.h"
#include "of1275.h"
#include "zlib.h"
/* Passed from the linker */
......@@ -20,17 +18,13 @@ extern char __image_begin, __image_end;
extern char __ramdisk_begin[], __ramdisk_end;
extern char _start, _end;
extern char *claim(unsigned, unsigned, unsigned);
extern char image_data[], initrd_data[];
extern int initrd_len, image_len;
extern int getprop(void *, const char *, void *, int);
extern unsigned int heap_max;
extern void *finddevice(const char *);
extern void flush_cache(void *start, unsigned int len);
extern void gunzip(void *, int, unsigned char *, int *);
extern void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
unsigned int progend);
extern void pause(void);
extern void setup_bats(unsigned long start);
char *avail_ram;
......
/*
* Copyright (C) Paul Mackerras 1997.
*
* 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.
*/
#include "zlib.h"
#include "nonstdio.h"
#include "of1275.h"
#include <asm/bootinfo.h>
#include <asm/page.h>
/* Information from the linker */
extern char __sysmap_begin, __sysmap_end;
extern int strcmp(const char *s1, const char *s2);
extern char *avail_ram, *avail_high;
extern char *end_avail;
unsigned int heap_use, heap_max;
struct memchunk {
unsigned int size;
struct memchunk *next;
};
static struct memchunk *freechunks;
static void *zalloc(void *x, unsigned items, unsigned size)
{
void *p;
struct memchunk **mpp, *mp;
size *= items;
size = (size + 7) & -8;
heap_use += size;
if (heap_use > heap_max)
heap_max = heap_use;
for (mpp = &freechunks; (mp = *mpp) != 0; mpp = &mp->next) {
if (mp->size == size) {
*mpp = mp->next;
return mp;
}
}
p = avail_ram;
avail_ram += size;
if (avail_ram > avail_high)
avail_high = avail_ram;
if (avail_ram > end_avail) {
printf("oops... out of memory\n\r");
pause();
}
return p;
}
static void zfree(void *x, void *addr, unsigned nb)
{
struct memchunk *mp = addr;
nb = (nb + 7) & -8;
heap_use -= nb;
if (avail_ram == addr + nb) {
avail_ram = addr;
return;
}
mp->size = nb;
mp->next = freechunks;
freechunks = mp;
}
#define HEAD_CRC 2
#define EXTRA_FIELD 4
#define ORIG_NAME 8
#define COMMENT 0x10
#define RESERVED 0xe0
#define DEFLATED 8
void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
{
z_stream s;
int r, i, flags;
/* skip header */
i = 10;
flags = src[3];
if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
printf("bad gzipped data\n\r");
exit();
}
if ((flags & EXTRA_FIELD) != 0)
i = 12 + src[10] + (src[11] << 8);
if ((flags & ORIG_NAME) != 0)
while (src[i++] != 0)
;
if ((flags & COMMENT) != 0)
while (src[i++] != 0)
;
if ((flags & HEAD_CRC) != 0)
i += 2;
if (i >= *lenp) {
printf("gunzip: ran out of data in header\n\r");
exit();
}
s.zalloc = zalloc;
s.zfree = zfree;
r = inflateInit2(&s, -MAX_WBITS);
if (r != Z_OK) {
printf("inflateInit2 returned %d\n\r", r);
exit();
}
s.next_in = src + i;
s.avail_in = *lenp - i;
s.next_out = dst;
s.avail_out = dstlen;
r = inflate(&s, Z_FINISH);
if (r != Z_OK && r != Z_STREAM_END) {
printf("inflate returned %d msg: %s\n\r", r, s.msg);
exit();
}
*lenp = s.next_out - (unsigned char *) dst;
inflateEnd(&s);
}
/* Make a bi_rec in OF. We need to be passed a name for BI_BOOTLOADER_ID,
* a machine type for BI_MACHTYPE, and the location where the end of the
* bootloader is (PROG_START + PROG_SIZE)
*/
void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
unsigned long progend)
{
unsigned long sysmap_size;
struct bi_record *rec;
/* Figure out the size of a possible System.map we're going to
* pass along.
* */
sysmap_size = (unsigned long)(&__sysmap_end) -
(unsigned long)(&__sysmap_begin);
/* leave a 1MB gap then align to the next 1MB boundary */
addr = _ALIGN(addr+ (1<<20) - 1, (1<<20));
/* oldworld machine seem very unhappy about this. -- Tom */
if (addr >= progend)
claim(addr, 0x1000, 0);
rec = (struct bi_record *)addr;
rec->tag = BI_FIRST;
rec->size = sizeof(struct bi_record);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
rec->tag = BI_BOOTLOADER_ID;
sprintf( (char *)rec->data, name);
rec->size = sizeof(struct bi_record) + strlen(name) + 1;
rec = (struct bi_record *)((unsigned long)rec + rec->size);
rec->tag = BI_MACHTYPE;
rec->data[0] = mach;
rec->data[1] = 1;
rec->size = sizeof(struct bi_record) + 2 * sizeof(unsigned long);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
if (sysmap_size) {
rec->tag = BI_SYSMAP;
rec->data[0] = (unsigned long)(&__sysmap_begin);
rec->data[1] = sysmap_size;
rec->size = sizeof(struct bi_record) + 2 *
sizeof(unsigned long);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
}
rec->tag = BI_LAST;
rec->size = sizeof(struct bi_record);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
}
/*
* BK Id: SCCS/s.misc.S 1.6 05/18/01 15:17:15 cort
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......@@ -10,6 +7,7 @@
* 2 of the License, or (at your option) any later version.
*/
#include "nonstdio.h"
#include "of1275.h"
#include <asm/processor.h>
#include <asm/page.h>
......@@ -18,16 +16,11 @@ extern char __image_begin, __image_end;
extern char __ramdisk_begin[], __ramdisk_end;
extern char _start, _end;
extern int getprop(void *, const char *, void *, int);
extern unsigned int heap_max;
extern void *claim(unsigned int virt, unsigned int size, unsigned int align);
extern void *finddevice(const char *);
extern void flush_cache(void *start, unsigned int len);
extern void gunzip(void *, int, unsigned char *, int *);
extern void make_bi_recs(unsigned long addr, char *name, unsigned int mach,
unsigned int progend);
extern void pause(void);
extern void release(void *ptr, unsigned int len);
char *avail_ram;
char *begin_avail, *end_avail;
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) Paul Mackerras 1997.
*
......@@ -10,33 +7,22 @@
* 2 of the License, or (at your option) any later version.
*/
#include <stdarg.h>
#include "of1275.h"
extern int strlen(const char *s);
extern void boot(int a1, int a2, void *prom);
int (*prom)(void *);
void *chosen_handle;
void *stdin;
void *stdout;
void *stderr;
phandle stdin;
phandle stdout;
phandle stderr;
void exit(void);
void *finddevice(const char *name);
int getprop(void *phandle, const char *name, void *buf, int buflen);
void printk(char *fmt, ...);
void
start(int a1, int a2, void *promptr)
{
prom = (int (*)(void *)) promptr;
chosen_handle = finddevice("/chosen");
if (chosen_handle == (void *) -1)
exit();
if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4)
exit();
stderr = stdout;
if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
ofinit(promptr);
if (ofstdio(&stdin, &stdout, &stderr))
exit();
boot(a1, a2, promptr);
......@@ -44,30 +30,6 @@ start(int a1, int a2, void *promptr)
exit();
}
int
write(void *handle, void *ptr, int nb)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *ihandle;
void *addr;
int len;
int actual;
} args;
args.service = "write";
args.nargs = 3;
args.nret = 1;
args.ihandle = handle;
args.addr = ptr;
args.len = nb;
args.actual = -1;
(*prom)(&args);
return args.actual;
}
int writestring(void *f, char *ptr, int nb)
{
int w = 0, i;
......@@ -87,142 +49,6 @@ int writestring(void *f, char *ptr, int nb)
return nb;
}
int
read(void *handle, void *ptr, int nb)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *ihandle;
void *addr;
int len;
int actual;
} args;
args.service = "read";
args.nargs = 3;
args.nret = 1;
args.ihandle = handle;
args.addr = ptr;
args.len = nb;
args.actual = -1;
(*prom)(&args);
return args.actual;
}
void
exit(void)
{
struct prom_args {
char *service;
} args;
for (;;) {
args.service = "exit";
(*prom)(&args);
}
}
void
pause(void)
{
struct prom_args {
char *service;
} args;
args.service = "enter";
(*prom)(&args);
}
void *
finddevice(const char *name)
{
struct prom_args {
char *service;
int nargs;
int nret;
const char *devspec;
void *phandle;
} args;
args.service = "finddevice";
args.nargs = 1;
args.nret = 1;
args.devspec = name;
args.phandle = (void *) -1;
(*prom)(&args);
return args.phandle;
}
void *
claim(unsigned int virt, unsigned int size, unsigned int align)
{
struct prom_args {
char *service;
int nargs;
int nret;
unsigned int virt;
unsigned int size;
unsigned int align;
void *ret;
} args;
args.service = "claim";
args.nargs = 3;
args.nret = 1;
args.virt = virt;
args.size = size;
args.align = align;
(*prom)(&args);
return args.ret;
}
void
release(void *virt, unsigned int size)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *virt;
unsigned int size;
} args;
args.service = "release";
args.nargs = 2;
args.nret = 0;
args.virt = virt;
args.size = size;
(*prom)(&args);
}
int
getprop(void *phandle, const char *name, void *buf, int buflen)
{
struct prom_args {
char *service;
int nargs;
int nret;
void *phandle;
const char *name;
void *buf;
int buflen;
int size;
} args;
args.service = "getprop";
args.nargs = 4;
args.nret = 1;
args.phandle = phandle;
args.name = name;
args.buf = buf;
args.buflen = buflen;
args.size = -1;
(*prom)(&args);
return args.size;
}
int
putc(int c, void *f)
{
......
# BK Id: %F% %I% %G% %U% %#%
#
# arch/ppc/boot/Makefile
#
# This file is subject to the terms and conditions of the GNU General Public
......@@ -21,13 +19,14 @@ TFTPIMAGE = $(TFTPBOOT).smp
endif
LD_ARGS = -T ../ld.script -Ttext 0x00800000 -Bstatic
boot-y := head.o ../simple/legacy.o misc.o of1275.o \
boot-y := head.o ../simple/legacy.o misc.o \
../common/util.o ../common/string.o \
../common/misc-common.o
../common/misc-common.o \
../common/mpc10x_memory.o
OBJCOPY_ARGS = -O elf32-powerpc
LIBS = ../lib/zlib.a
boot-$($CONFIG_SERIAL_8250_CONSOLE) += ../common/ns16550.o
boot-$(CONFIG_SERIAL_8250_CONSOLE) += ../common/ns16550.o
boot-$(CONFIG_VGA_CONSOLE) += vreset.o kbd.o
EXTRA_TARGETS := $(boot-y)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
#include <asm/ppc_asm.h>
#include <asm/processor.h>
#include <asm/cache.h>
......@@ -38,10 +34,6 @@ start_:
isync
mr r11,r3 /* Save pointer to residual/board data */
mr r25,r5 /* Save OFW pointer */
/* Save the original MSR value */
mfmsr r26
/* Establish default MSR value */
li r3,MSR_IP|MSR_FP
......@@ -114,17 +106,11 @@ start_ldr:
li r2,0x000F /* Mask pointer to 16-byte boundary */
andc r1,r1,r2
/* Store the original MSR into 'orig_MSR' */
lis r3,orig_MSR@h
ori r3,r3,orig_MSR@l
stw r26,0(r3)
/* Run loader */
mr r3,r8 /* Load point */
mr r4,r7 /* Program length */
mr r5,r6 /* Checksum */
mr r6,r11 /* Residual data */
mr r7,r25 /* OFW interfaces */
bl decompress_kernel
/*
......
/*
* BK Id: SCCS/s.iso_font.h 1.6 05/18/01 15:16:42 cort
*/
static const unsigned char font[] = {
/* 0x00 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* 0x01 */ 0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x81,0x7E,0x00,0x00,0x00,0x00,
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
#include <linux/keyboard.h>
#include "defkeymap.c" /* yeah I know it's bad -- Cort */
......
/*
* BK Id: %F% %I% %G% %U% %#%
*
* arch/ppc/boot/prep/misc.c
*
* Adapted for PowerPC by Gary Thomas
......@@ -20,6 +18,7 @@
#include <asm/bootinfo.h>
#include <asm/mmu.h>
#include <asm/byteorder.h>
#include "nonstdio.h"
#include "zlib.h"
......@@ -51,7 +50,6 @@ int keyb_present = 1; /* keyboard controller is present by default */
RESIDUAL hold_resid_buf;
RESIDUAL *hold_residual = &hold_resid_buf;
unsigned long initrd_size = 0;
unsigned long orig_MSR;
char *zimage_start;
int zimage_size;
......@@ -66,16 +64,11 @@ int orig_x, orig_y = 24;
#endif /* CONFIG_VGA_CONSOLE */
extern int CRT_tstc(void);
extern void of_init(void *handler);
extern int of_finddevice(const char *device_specifier, int *phandle);
extern int of_getprop(int phandle, const char *name, void *buf, int buflen,
int *size);
extern int vga_init(unsigned char *ISA_mem);
extern void gunzip(void *, int, unsigned char *, int *);
extern void _put_MSR(unsigned int val);
extern unsigned long serial_init(int chan, void *ignored);
extern void serial_fixups(void);
extern unsigned long get_mem_size(void);
void
writel(unsigned int val, unsigned int address)
......@@ -120,15 +113,12 @@ scroll(void)
unsigned long
decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
RESIDUAL *residual, void *OFW_interface)
RESIDUAL *residual)
{
int timer = 0;
extern unsigned long start;
char *cp, ch;
unsigned long TotalMemory;
int dev_handle;
int mem_info[2];
int res, size;
unsigned char board_type;
unsigned char base_mod;
int start_multi = 0;
......@@ -142,6 +132,11 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
vga_init((unsigned char *)0xC0000000);
#endif /* CONFIG_VGA_CONSOLE */
/*
* Find out how much memory we have.
*/
TotalMemory = get_mem_size();
/*
* Tell the user where we were loaded at and where we were relocated
* to for debugging this process.
......@@ -218,47 +213,6 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
} else {
/* Tell the user we didn't find anything. */
puts("No residual data found.\n");
/* Assume 32M in the absence of more info... */
TotalMemory = 0x02000000;
/*
* This is a 'best guess' check. We want to make sure
* we don't try this on a PReP box without OF
* -- Cort
*/
while (OFW_interface && ((unsigned long)OFW_interface < 0x10000000) )
{
/* We need to restore the slightly inaccurate
* MSR so that OpenFirmware will behave. -- Tom
*/
_put_MSR(orig_MSR);
of_init(OFW_interface);
/* get handle to memory description */
res = of_finddevice("/memory@0",
&dev_handle);
if (res)
break;
/* get the info */
res = of_getprop(dev_handle,
"reg",
mem_info,
sizeof(mem_info),
&size);
if (res)
break;
TotalMemory = mem_info[1];
break;
}
hold_residual->TotalMemory = TotalMemory;
residual = hold_residual;
/* Enforce a sane MSR for booting. */
_put_MSR(MSR_IP);
}
/* assume the chunk below 8M is free */
......@@ -363,6 +317,11 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
sizeof(unsigned long);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
rec->tag = BI_MEMSIZE;
rec->data[0] = TotalMemory;
rec->size = sizeof(struct bi_record) + sizeof(unsigned long);
rec = (struct bi_record *)((unsigned long)rec + rec->size);
rec->tag = BI_CMD_LINE;
memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1);
rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1;
......
/*
* BK Id: SCCS/s.of1275.c 1.6 05/18/01 15:16:42 cort
*/
/* Open Firmware Client Interface */
......
/*
* BK Id: SCCS/s.of1275.h 1.6 05/18/01 15:16:42 cort
*/
/* 6.3.2.1 Client interface */
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* vreset.c
*
......
......@@ -3,11 +3,21 @@
#
# Author: Tom Rini <trini@mvista.com>
#
# Copyright 2001 MontaVista Software Inc.
# Copyright 2001-2002 MontaVista Software Inc.
#
# Notes: For machine targets which produce more than one image, define
# Notes:
# (1) For machine targets which produce more than one image, define
# ZNETBOOT and ZNETBOOTRD to the image which should be available for
# 'znetboot' and 'znetboot.initrd`
# (2) Also, for machine targets which just need to remove the ELF header,
# define END to be the machine name you want in the image.
# (3) For machine targets which use the mktree program, define END to be
# the machine name you want in the image, and you can optionally set
# ENTRYPOINT which the image should be loaded at. The optimal setting
# for ENTRYPOINT is the link address.
# (4) It is advisable to pass in the memory size using BI_MEMSIZE and
# get_mem_size(), which is memory controller dependant. Add in the correct
# XXX_memory.o file for this to work, as well as editing the $(MISC) file.
#
# 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
......@@ -17,40 +27,36 @@
# Normally, we use the 'misc-simple.c' file for decompress_kernel and
# whatnot. Sometimes we need to override this however.
MISC := ../common/misc-simple.o
ifeq ($(CONFIG_TREEBOOT),y)
ifeq ($(CONFIG_IBM_OPENBIOS),y)
ZIMAGE := zImage-TREE
ZIMAGEINITRD := zImage.initrd-TREE
TFTPIMAGE := /tftpboot/zImage.embedded
END := treeboot
TFTPIMAGE := /tftpboot/zImage.$(END)
MISC := misc-embedded.o
endif
ifeq ($(CONFIG_EMBEDDEDBOOT),y)
ZIMAGE := zImage-EMBEDDED
ZIMAGEINITRD := zImage.initrd-EMBEDDED
TFTPIMAGE := /tftpboot/zImage.embedded
MISC := misc-embedded.o
endif
ifeq ($(CONFIG_EV64260),y)
ZIMAGE := zImage-EV64260
ZIMAGEINITRD := zImage.initrd-EV64260
HEADHELP := direct.o misc-ev64260.o
EXTRA := direct.o misc-ev64260.o
TFTPIMAGE := /tftpboot/zImage.ev64260
endif
ifeq ($(CONFIG_GEMINI),y)
ZIMAGE := zImage-SMON
ZIMAGEINITRD := zImage.initrd-SMON
HEADHELP := direct.o
TFTPIMAGE := /tftpboot/zImage.gemini
ZIMAGE := zImage-STRIPELF
ZIMAGEINITRD := zImage.initrd-STRIPELF
EXTRA := direct.o
END := gemini
TFTPIMAGE := /tftpboot/zImage.$(END)
endif
ifeq ($(CONFIG_MENF1),y)
ZIMAGE := zImage-MENF1
ZIMAGEINITRD := zImage.initrd-MENF1
HEADHELP := chrpmap.o
EXTRA := chrpmap.o
TFTPIMAGE := /tftpboot/zImage.menf1
endif
ifeq ($(CONFIG_K2),y)
ZIMAGE := zImage-K2
ZIMAGEINITRD := zImage.initrd-K2
HEADHELP := legacy.o
EXTRA := legacy.o
TFTPIMAGE := /tftpboot/zImage.k2
endif
# kbuild-2.4 'feature', only one of these will ever by 'y' at a time.
......@@ -58,45 +64,50 @@ endif
ifeq ($(CONFIG_MCPN765)$(CONFIG_MVME5100)$(CONFIG_PRPMC750)$(CONFIG_PRPMC800)$(CONFIG_LOPEC)$(CONFIG_PPLUS),y)
ZIMAGE := zImage-PPLUS
ZIMAGEINITRD := zImage.initrd-PPLUS
HEADHELP := direct.o
EXTRA := direct.o
TFTPIMAGE := /tftpboot/zImage.pplus
ZNETBOOT := zImage.pplus
ZNETBOOTRD := zImage.initrd.pplus
endif
ifeq ($(CONFIG_PPLUS),y)
HEADHELP := legacy.o
EXTRA := legacy.o
endif
ifeq ($(CONFIG_LOPEC),y)
EXTRA += ../common/mpc10x_memory.o
endif
ifeq ($(CONFIG_PAL4),y)
EXTRA := direct.o ../common/cpc700_memory.o
endif
ifeq ($(CONFIG_PCORE),y)
ZIMAGE := zImage-PCORE
ZIMAGEINITRD := zImage.initrd-PCORE
HEADHELP := chrpmap.o
TFTPIMAGE := /tftpboot/zImage.pcore
ifeq ($(CONFIG_PCORE)$(CONFIG_POWERPMC250),y)
ZIMAGE := zImage-STRIPELF
ZIMAGEINITRD := zImage.initrd-STRIPELF
EXTRA := chrpmap.o
END := pcore
TFTPIMAGE := /tftpboot/zImage.$(END)
endif
#Ugh, should come up with a better nameing convention..
# The PowerPMC 250 needs the dummy serial_fixups()
ifeq ($(CONFIG_POWERPMC250),y)
ZIMAGE := zImage-PCORE
ZIMAGEINITRD := zImage.initrd-PCORE
HEADHELP := direct.o
TFTPIMAGE := /tftpboot/zImage.pcore
EXTRA := direct.o
endif
ifeq ($(CONFIG_SANDPOINT),y)
ZIMAGE := zImage-SP
ZIMAGEINITRD := zImage.initrd-SP
HEADHELP := direct.o
EXTRA := direct.o
TFTPIMAGE := /tftpboot/zImage.sandpoint
endif
ifeq ($(CONFIG_SPRUCE),y)
ZIMAGE := zImage-SPRUCE
ZIMAGEINITRD := zImage.initrd-SPRUCE
HEADHELP := direct.o
ZIMAGE := zImage-TREE
ZIMAGEINITRD := zImage.initrd-TREE
EXTRA := direct.o
END := spruce
ENTRYPOINT := 0x00800000
MISC := misc-spruce.o
TFTPIMAGE := /tftpboot/zImage.spruce
TFTPIMAGE := /tftpboot/zImage.$(END)
endif
ifeq ($(CONFIG_ZX4500),y)
ZIMAGE := zImage-ZX4500
ZIMAGEINITRD := zImage.initrd-ZX4500
HEADHELP := direct.o
TFTPIMAGE := /tftpboot/zImage.zx4500
ZIMAGE := zImage-STRIPELF
ZIMAGEINITRD := zImage.initrd-STRIPELF
EXTRA := direct.o
END := zx4500
TFTPIMAGE := /tftpboot/zImage.$(END)
endif
ifeq ($(CONFIG_SMP),y)
TFTPIMAGE += .smp
......@@ -105,7 +116,7 @@ ifeq ($(CONFIG_REDWOOD_4),y)
# This is a treeboot that needs init functions until the
# boot rom is sorted out (i.e. this is short lived)
EXTRA_AFLAGS := -Wa,-m405
HEADHELP := rw4/rw4_init.o rw4/rw4_init_brd.o
EXTRA := rw4/rw4_init.o rw4/rw4_init_brd.o
endif
# Default linker args. Link at 0x00800000 or 0x00400000 by default, but
......@@ -122,7 +133,7 @@ endif
OBJCOPY_ARGS := -O elf32-powerpc
# head.o and ../common/relocate.o must be at the start.
boot-y := head.o ../common/relocate.o $(HEADHELP) \
boot-y := head.o ../common/relocate.o $(EXTRA) \
$(MISC) ../common/misc-common.o \
../common/string.o ../common/util.o
boot-$(CONFIG_4xx) += embed_config.o
......@@ -170,9 +181,12 @@ zvmlinux.initrd: $(boot-y) $(LIBS) ../ld.script ../images/vmlinux.gz \
-R .sysmap
# Sort-of dummy rules, that let us format the image we want.
zImage: $(ZIMAGE)
zImage: $(ZIMAGE) zvmlinux
cp -f zvmlinux ../images/zImage.elf
rm -f zvmlinux
zImage.initrd: $(ZIMAGEINITRD)
zImage.initrd: $(ZIMAGEINITRD) zvmlinux.initrd
cp -f zvmlinux.initrd ../images/zImage.initrd.elf
rm -f zvmlinux.initrd
znetboot: zImage
......@@ -189,23 +203,17 @@ else
cp ../images/zImage.* $(TFTPIMAGE)
endif
zImage-EMBEDDED: zvmlinux
mv zvmlinux ../images/zImage.embedded
zImage-STRIPELF: zvmlinux
dd if=zvmlinux of=../images/zImage.$(END) skip=64 bs=1k
zImage.initrd-EMBEDDED: zvmlinux.initrd
mv zvmlinux.initrd ../images/zImage.initrd.embedded
zImage.initrd-STRIPELF: zvmlinux.initrd
dd if=zvmlinux.initrd of=../images/zImage.initrd.$(END) skip=64 bs=1k
zImage-K2: zvmlinux
mv zvmlinux ../images/zImage.k2
zImage.initrd-K2: zvmlinux.initrd
mv zvmlinux.initrd ../images/zImage.initrd.k2
zImage-EV64260: zvmlinux
mv zvmlinux ../images/zImage.ev64260
zImage-TREE: zvmlinux
$(MKTREE) zvmlinux ../images/zImage.$(END) $(ENTRYPOINT)
zImage.initrd-EV64260: zvmlinux.initrd
mv zvmlinux.initrd ../images/zImage.initrd.ev64260
zImage.initrd-TREE: zvmlinux.initrd
$(MKTREE) zvmlinux.initrd ../images/zImage.initrd.$(END) $(ENTRYPOINT)
zImage-MENF1: zvmlinux
$(MKPREP) -pbp zvmlinux ../images/zImage.menf1
......@@ -213,12 +221,6 @@ zImage-MENF1: zvmlinux
zImage.initrd-MENF1: zvmlinux.initrd
$(MKPREP) -pbp zvmlinux.initrd ../images/zImage.initrd.menf1
zImage-PCORE: zvmlinux
dd if=zvmlinux of=../images/zImage.pcore skip=64 bs=1k
zImage.initrd-PCORE: zvmlinux.initrd
dd if=zvmlinux.initrd of=../images/zImage.initrd.pcore skip=64 bs=1k
zImage-PPLUS: zvmlinux $(MKPREP) $(MKBUGBOOT)
$(MKPREP) -pbp zvmlinux ../images/zImage.pplus
$(MKBUGBOOT) zvmlinux ../images/zImage.bugboot
......@@ -227,34 +229,4 @@ zImage.initrd-PPLUS: zvmlinux.initrd $(MKPREP) $(MKBUGBOOT)
$(MKPREP) -pbp zvmlinux.initrd ../images/zImage.initrd.pplus
$(MKBUGBOOT) zvmlinux.initrd ../images/zImage.initrd.bugboot
zImage-SMON: zvmlinux
dd if=zvmlinux of=../images/zImage.gemini skip=64 bs=1k
zImage.initrd-SMON: zvmlinux.initrd
dd if=zvmlinux.initrd of=../images/zImage.initrd.gemini skip=64 bs=1k
zImage-SP: zvmlinux
mv zvmlinux ../images/zImage.sandpoint
zImage.initrd-SP: zvmlinux.initrd
mv zvmlinux.initrd ../images/zImage.initrd.sandpoint
zImage-SPRUCE: zvmlinux
$(MKTREE) zvmlinux ../images/zImage.spruce 0x800000
zImage.initrd-SPRUCE: zvmlinux.initrd
$(MKTREE) zvmlinux.initrd ../images/zImage.initrd.spruce 0x800000
zImage-TREE: zvmlinux
$(MKTREE) zvmlinux ../images/zImage.treeboot
zImage.initrd-TREE: zvmlinux.initrd
$(MKTREE) zvmlinux.initrd ../images/zImage.initrd.treeboot
zImage-ZX4500: zvmlinux
dd if=zvmlinux of=../images/zImage.zx4500 skip=64 bs=1k
zImage.initrd-ZX4500: zvmlinux.initrd
dd if=zvmlinux.initrd of=../images/zImage.initrd.zx4500 skip=64 bs=1k
include $(TOPDIR)/Rules.make
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Board specific functions for those embedded 8xx boards that do
* not have boot monitor support for board information.
*
......@@ -14,7 +10,6 @@
#include <linux/types.h>
#include <linux/config.h>
#include <linux/string.h>
#include <asm/io.h>
#ifdef CONFIG_8xx
#include <asm/mpc8xx.h>
#endif
......@@ -22,6 +17,9 @@
#include <asm/mpc8260.h>
#include <asm/immap_8260.h>
#endif
#ifdef CONFIG_40x
#include <asm/io.h>
#endif
/* For those boards that don't provide one.
*/
......@@ -657,15 +655,65 @@ embed_config(bd_t **bdp)
}
#endif /* WILLOW */
#ifdef CONFIG_TREEBOOT
void
embed_config(bd_t ** bdp)
{
static const unsigned long line_size = 32;
static const unsigned long congruence_classes = 256;
unsigned long addr;
u_char *cp;
int i;
bd_t *bd;
/*
* At one point, we were getting machine checks. Linux was not
* invalidating the data cache before it was enabled. The
* following code was added to do that. Soon after we had done
* that, we found the real reasons for the machine checks. I've
* run the kernel a few times with the following code
* temporarily removed without any apparent problems. However,
* I objdump'ed the kernel and boot code and found out that
* there were no other dccci's anywhere, so I put the code back
* in and have been reluctant to remove it. It seems safer to
* just leave it here.
*/
for (addr = 0;
addr < (congruence_classes * line_size); addr += line_size) {
__asm__("dccci 0,%0": :"b"(addr));
}
bd = &bdinfo;
*bdp = bd;
bd->bi_memsize = XPAR_DDR_0_SIZE;
bd->bi_intfreq = XPAR_CORE_CLOCK_FREQ_HZ;
bd->bi_busfreq = XPAR_PLB_CLOCK_FREQ_HZ;
}
#ifdef CONFIG_IBM_OPENBIOS
/* This could possibly work for all treeboot roms.
*/
#if defined(CONFIG_ASH)
#if defined(CONFIG_ASH) || defined(CONFIG_BEECH)
#define BOARD_INFO_VECTOR 0xFFF80B50 /* openbios 1.19 moved this vector down - armin */
#else
#define BOARD_INFO_VECTOR 0xFFFE0B50
#define BOARD_INFO_VECTOR 0xFFFE0B50
#endif
#ifdef CONFIG_BEECH
static void
get_board_info(bd_t **bdp)
{
typedef void (*PFV)(bd_t *bd);
((PFV)(*(unsigned long *)BOARD_INFO_VECTOR))(*bdp);
return;
}
void
embed_config(bd_t **bdp)
{
*bdp = &bdinfo;
get_board_info(bdp);
}
#else /* !CONFIG_BEECH */
void
embed_config(bd_t **bdp)
{
......@@ -675,16 +723,13 @@ embed_config(bd_t **bdp)
bd_t *(*get_board_info)(void) =
(bd_t *(*)(void))(*(unsigned long *)BOARD_INFO_VECTOR);
#if !defined(CONFIG_STB03xxx)
volatile emac_t *emacp;
emacp = (emac_t *)EMAC0_BASE; /* assume 1st emac - armin */
/* shut down the Ethernet controller that the boot rom
* sometimes leaves running.
*/
mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR); /* 1st reset MAL */
while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {}; /* wait for the reset */
emacp->em0mr0 = 0x20000000; /* then reset EMAC */
eieio();
out_be32(EMAC0_BASE,0x20000000); /* then reset EMAC */
#endif
bd = &bdinfo;
......@@ -715,14 +760,15 @@ embed_config(bd_t **bdp)
#endif
}
/* Yeah, this look weird, but on Redwood 4 they are
* different object in the structure. When RW5 uses
* OpenBIOS, it requires a special value.
* different object in the structure. Sincr Redwwood 5
* and Redwood 6 use OpenBIOS, it requires a special value.
*/
#ifdef CONFIG_REDWOOD_5
#if defined(CONFIG_REDWOOD_5) || defined (CONFIG_REDWOOD_6)
bd->bi_tbfreq = 27 * 1000 * 1000;
#endif
}
#endif
#endif /* CONFIG_BEECH */
#endif /* CONFIG_IBM_OPENBIOS */
#ifdef CONFIG_EP405
#include <linux/serial_reg.h>
......@@ -749,6 +795,14 @@ embed_config(bd_t **bdp)
writeb(0, UART0_IO_BASE + UART_LCR);
}
/* We haven't seen actual problems with the EP405 leaving the
* EMAC running (as we have on Walnut). But the registers
* suggest it may not be left completely quiescent. Reset it
* just to be sure. */
mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR); /* 1st reset MAL */
while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {}; /* wait for the reset */
out_be32(EMAC0_BASE,0x20000000); /* then reset EMAC */
bd = &bdinfo;
*bdp = bd;
#if 1
......@@ -808,6 +862,16 @@ embed_config(bd_t **bdp)
bd = &bdinfo;
*bdp = bd;
for(i=0;i<8192;i+=32) {
__asm__("dccci 0,%0" :: "r" (i));
}
__asm__("iccci 0,0");
__asm__("sync;isync");
/* init ram for parity */
memset(0, 0,0x400000); /* Lo memory */
bd->bi_memsize = (32 * 1024 * 1024) ;
bd->bi_intfreq = 133000000; //the internal clock is 133 MHz
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* arch/ppc/boot/simple/gt64260_tty.c
*
......
......@@ -37,7 +37,7 @@
.globl start
start:
bl start_
#ifdef CONFIG_TREEBOOT
#ifdef CONFIG_IBM_OPENBIOS
/* The IBM "Tree" bootrom knows that the address of the bootrom
* read only structure is 4 bytes after _start.
*/
......@@ -73,7 +73,8 @@ start_:
#ifdef CONFIG_6xx
bl disable_6xx_mmu
bl disable_6xx_l1cache
#if defined(CONFIG_FORCE) || defined(CONFIG_K2) || defined(CONFIG_EV64260)
#if defined(CONFIG_FORCE) || defined(CONFIG_K2) \
|| defined(CONFIG_EV64260) || defined(CONFIG_PAL4)
bl _setup_L2CR
#endif
#endif
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Minimal support functions to read configuration from IIC EEPROMS
* on MPC8xx boards. Originally written for RPGC RPX-Lite.
* Dan Malek (dmalek@jlc.net).
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Minimal serial functions needed to send messages out the serial
* port on SMC1.
*/
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Minimal serial functions needed to send messages out the serial
* port on the MBX console.
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*
* Originally adapted by Gary Thomas. Much additional work by
* Cort Dougan <cort@fsmlabs.com>. On top of that still more work by
* Dan Malek <dmalek@jlc.net>.
......@@ -82,7 +80,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum, b
* initialize the serial console port.
*/
embed_config(&bp);
#ifdef CONFIG_SERIAL_CONSOLE
#if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
com_port = serial_init(0, bp);
#endif
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/* Stand alone funtions for QSpan Tundra support.
*/
#include <linux/types.h>
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* LinuxPPC arch/ppc/kernel/qspan_pci.c Dan Malek (dmalek@jlc.net)
*
......
/*
* BK Id: SCCS/s.addnote.c 1.7 05/18/01 15:17:23 cort
*/
/*
* Program to hack in a PT_NOTE program header entry in an ELF file.
* This is needed for OF on RS/6000s to load an image correctly.
......
/*
* BK Id: SCCS/s.hack-coff.c 1.8 05/18/01 06:20:29 patch
*/
/*
* hack-coff.c - hack the header of an xcoff file to fill in
* a few fields needed by the Open Firmware xcoff loader on
......
/*
* BK Id: SCCS/s.mknote.c 1.7 05/18/01 15:17:23 cort
*/
/*
* Copyright (C) Cort Dougan 1999.
*
......
/*
* BK Id: SCCS/s.mkprep.c 1.7 05/18/01 06:20:29 patch
*/
/*
* Makes a prep bootable image which can be dd'd onto
* a disk device to make a bootdisk. Will take
......
/*
* BK Id: %F% %I% %G% %U% %#%
*
* Makes a tree bootable image for IBM Evaluation boards.
* Basically, just take a zImage, skip the ELF header, and stuff
* a 32 byte header on the front.
......
# BK Id: %F% %I% %G% %U% %#%
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/config-language.txt.
#
......
# BK Id: %F% %I% %G% %U% %#%
#
#
# Makefile for the linux kernel.
#
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* align.c - handle alignment exceptions for the Power PC.
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Copyright (C) 1996 Paul Mackerras.
*/
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Procedures for drawing on the screen early on in the boot process.
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* arch/ppc/kernel/cputable.c
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* PowerPC version
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
......
/*
* BK Id: SCCS/s.find_name.c 1.5 05/17/01 18:14:21 cort
*/
#include <stdio.h>
#include <asm/page.h>
#include <sys/mman.h>
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* PowerPC version
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* arch/ppc/kernel/except_8xx.S
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
#include <linux/stddef.h>
#include <linux/init.h>
#include <linux/irq.h>
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* arch/ppc/kernel/iSeries_asm.h
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Idle daemon for PowerPC. Idle daemon will handle any action
* that needs to be taken when the system becomes idle.
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* Support for indirect PCI bridges.
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* arch/ppc/kernel/irq.c
*
......
/*
* BK Id: %F% %I% %G% %U% %#%
*/
/*
* linux/arch/ppc/kernel/setup.c
* arch/ppc/kernel/setup.c
*
* Copyright (C) 1995 Linus Torvalds
* Adapted from 'alpha' version by Gary Thomas
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment