forked from Minki/linux
ppc: Remove CHRP, POWER3 and POWER4 support from arch/ppc
32-bit CHRP machines are now supported only in arch/powerpc, as are all 64-bit PowerPC processors. This means that we don't use Open Firmware on any platform in arch/ppc any more. This makes PReP support a single-platform option like every other platform support option in arch/ppc now, thus CONFIG_PPC_MULTIPLATFORM is gone from arch/ppc. CONFIG_PPC_PREP is the option that selects PReP support and is generally what has replaced CONFIG_PPC_MULTIPLATFORM within arch/ppc. _machine is all but dead now, being #defined to 0. Updated Makefiles, comments and Kconfig options generally to reflect these changes. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
ff2e6d7e27
commit
0a26b1364f
@ -61,15 +61,15 @@ config 6xx
|
||||
select PPC_FPU
|
||||
help
|
||||
There are four types of PowerPC chips supported. The more common
|
||||
types (601, 603, 604, 740, 750, 7400), the Motorola embedded
|
||||
versions (821, 823, 850, 855, 860, 52xx, 82xx, 83xx), the IBM
|
||||
embedded versions (403 and 405) and the POWER3 processor.
|
||||
(For support for more recent 64-bit processors, set ARCH=powerpc.)
|
||||
types (601, 603, 604, 740, 750, 7400), the older Freescale
|
||||
(formerly Motorola) embedded versions (821, 823, 850, 855, 860,
|
||||
52xx, 82xx, 83xx), the IBM embedded versions (403 and 405) and
|
||||
the Book E embedded processors from IBM (44x) and Freescale (85xx).
|
||||
For support for 64-bit processors, set ARCH=powerpc.
|
||||
Unless you are building a kernel for one of the embedded processor
|
||||
systems or a POWER3-based IBM RS/6000, choose 6xx.
|
||||
Note that the kernel runs in 32-bit mode even on 64-bit chips.
|
||||
Also note that because the 52xx, 82xx, & 83xx family has a 603e core,
|
||||
specific support for that chipset is asked later on.
|
||||
systems, choose 6xx.
|
||||
Also note that because the 52xx, 82xx, & 83xx family have a 603e
|
||||
core, specific support for that chipset is asked later on.
|
||||
|
||||
config 40x
|
||||
bool "40x"
|
||||
@ -77,10 +77,6 @@ config 40x
|
||||
config 44x
|
||||
bool "44x"
|
||||
|
||||
config POWER3
|
||||
select PPC_FPU
|
||||
bool "POWER3"
|
||||
|
||||
config 8xx
|
||||
bool "8xx"
|
||||
|
||||
@ -252,14 +248,9 @@ config PPC601_SYNC_FIX
|
||||
source arch/ppc/platforms/4xx/Kconfig
|
||||
source arch/ppc/platforms/85xx/Kconfig
|
||||
|
||||
config PPC64BRIDGE
|
||||
bool
|
||||
depends on POWER3
|
||||
default y
|
||||
|
||||
config PPC_STD_MMU
|
||||
bool
|
||||
depends on 6xx || POWER3
|
||||
depends on 6xx
|
||||
default y
|
||||
|
||||
config NOT_COHERENT_CACHE
|
||||
@ -534,8 +525,8 @@ endmenu
|
||||
|
||||
choice
|
||||
prompt "Machine Type"
|
||||
depends on 6xx || POWER3
|
||||
default PPC_MULTIPLATFORM
|
||||
depends on 6xx
|
||||
default PPC_PREP
|
||||
---help---
|
||||
Linux currently supports several different kinds of PowerPC-based
|
||||
machines: Apple Power Macintoshes and clones (such as the Motorola
|
||||
@ -545,15 +536,14 @@ choice
|
||||
Platform) machines (including all of the recent IBM RS/6000 and
|
||||
pSeries machines), and several embedded PowerPC systems containing
|
||||
4xx, 6xx, 7xx, 8xx, 74xx, and 82xx processors. Currently, the
|
||||
default option is to build a kernel which works on PReP and CHRP.
|
||||
default option is to build a kernel which works on PReP.
|
||||
|
||||
Note that support for Apple machines is now only available with
|
||||
ARCH=powerpc, and has been removed from this menu. If you wish
|
||||
to build a kernel for an Apple machine, exit this configuration
|
||||
process and re-run it with ARCH=powerpc.
|
||||
Note that support for Apple and CHRP machines is now only available
|
||||
with ARCH=powerpc, and has been removed from this menu. If you
|
||||
wish to build a kernel for an Apple or CHRP machine, exit this
|
||||
configuration process and re-run it with ARCH=powerpc.
|
||||
|
||||
Select CHRP/PReP if configuring for an IBM RS/6000 or
|
||||
pSeries machine, or a PReP machine.
|
||||
Select PReP if configuring for a PReP machine.
|
||||
|
||||
Select Gemini if configuring for a Synergy Microsystems' Gemini
|
||||
series Single Board Computer. More information is available at:
|
||||
@ -562,8 +552,8 @@ choice
|
||||
Select APUS if configuring for a PowerUP Amiga. More information is
|
||||
available at: <http://linux-apus.sourceforge.net/>.
|
||||
|
||||
config PPC_MULTIPLATFORM
|
||||
bool "CHRP/PReP"
|
||||
config PPC_PREP
|
||||
bool "PReP"
|
||||
|
||||
config APUS
|
||||
bool "Amiga-APUS"
|
||||
@ -807,25 +797,6 @@ config CPM2
|
||||
you wish to build a kernel for a machine with a CPM2 coprocessor
|
||||
on it (826x, 827x, 8560).
|
||||
|
||||
config PPC_CHRP
|
||||
bool "Support for CHRP (Common Hardware Reference Platform) machines"
|
||||
depends on PPC_MULTIPLATFORM
|
||||
select PPC_I8259
|
||||
select PPC_INDIRECT_PCI
|
||||
default y
|
||||
|
||||
config PPC_PREP
|
||||
bool "Support for PReP (PowerPC Reference Platform) machines"
|
||||
depends on PPC_MULTIPLATFORM
|
||||
select PPC_I8259
|
||||
select PPC_INDIRECT_PCI
|
||||
default y
|
||||
|
||||
config PPC_OF
|
||||
bool
|
||||
depends on PPC_CHRP
|
||||
default y
|
||||
|
||||
config PPC_GEN550
|
||||
bool
|
||||
depends on SANDPOINT || SPRUCE || PPLUS || \
|
||||
@ -984,14 +955,6 @@ source "mm/Kconfig"
|
||||
|
||||
source "fs/Kconfig.binfmt"
|
||||
|
||||
config PROC_DEVICETREE
|
||||
bool "Support for Open Firmware device tree in /proc"
|
||||
depends on PPC_OF && PROC_FS
|
||||
help
|
||||
This option adds a device-tree directory under /proc which contains
|
||||
an image of the device tree that the kernel copies from Open
|
||||
Firmware. If unsure, say Y here.
|
||||
|
||||
config PREP_RESIDUAL
|
||||
bool "Support for PReP Residual Data"
|
||||
depends on PPC_PREP
|
||||
@ -1184,8 +1147,7 @@ menu "Bus options"
|
||||
|
||||
config ISA
|
||||
bool "Support for ISA-bus hardware"
|
||||
depends on PPC_PREP || PPC_CHRP
|
||||
select PPC_I8259
|
||||
depends on PPC_PREP
|
||||
help
|
||||
Find out whether you have ISA slots on your motherboard. ISA is the
|
||||
name of a bus system, i.e. the way the CPU talks to the other stuff
|
||||
@ -1195,18 +1157,18 @@ config ISA
|
||||
|
||||
config GENERIC_ISA_DMA
|
||||
bool
|
||||
depends on POWER3 || 6xx && !CPM2
|
||||
depends on 6xx && !CPM2
|
||||
default y
|
||||
|
||||
config PPC_I8259
|
||||
bool
|
||||
default y if 85xx
|
||||
default y if 85xx || PPC_PREP
|
||||
default n
|
||||
|
||||
config PPC_INDIRECT_PCI
|
||||
bool
|
||||
depends on PCI
|
||||
default y if 40x || 44x || 85xx || 83xx
|
||||
default y if 40x || 44x || 85xx || 83xx || PPC_PREP
|
||||
default n
|
||||
|
||||
config EISA
|
||||
@ -1397,7 +1359,7 @@ config CONSISTENT_SIZE
|
||||
|
||||
config BOOT_LOAD_BOOL
|
||||
bool "Set the boot link/load address"
|
||||
depends on ADVANCED_OPTIONS && !PPC_MULTIPLATFORM
|
||||
depends on ADVANCED_OPTIONS && !PPC_PREP
|
||||
help
|
||||
This option allows you to set the initial load address of the zImage
|
||||
or zImage.initrd file. This can be useful if you are on a board
|
||||
|
@ -53,13 +53,6 @@ config BDI_SWITCH
|
||||
Unless you are intending to debug the kernel with one of these
|
||||
machines, say N here.
|
||||
|
||||
config BOOTX_TEXT
|
||||
bool "Support for early boot text console (BootX or OpenFirmware only)"
|
||||
depends PPC_OF
|
||||
help
|
||||
Say Y here to see progress messages from the boot firmware in text
|
||||
mode. Requires either BootX or Open Firmware.
|
||||
|
||||
config SERIAL_TEXT_DEBUG
|
||||
bool "Support for early boot texts over serial port"
|
||||
depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \
|
||||
|
@ -40,10 +40,8 @@ ifndef CONFIG_FSL_BOOKE
|
||||
CFLAGS += -mstring
|
||||
endif
|
||||
|
||||
cpu-as-$(CONFIG_PPC64BRIDGE) += -Wa,-mppc64bridge
|
||||
cpu-as-$(CONFIG_4xx) += -Wa,-m405
|
||||
cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
|
||||
cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
|
||||
cpu-as-$(CONFIG_E500) += -Wa,-me500
|
||||
cpu-as-$(CONFIG_E200) += -Wa,-me200
|
||||
|
||||
|
@ -19,14 +19,13 @@ HOSTCFLAGS += -Iarch/$(ARCH)/boot/include
|
||||
BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd
|
||||
|
||||
bootdir-y := simple
|
||||
bootdir-$(CONFIG_PPC_OF) += openfirmware
|
||||
subdir-y := lib common images
|
||||
subdir-$(CONFIG_PPC_MULTIPLATFORM) += of1275
|
||||
subdir-$(CONFIG_PPC_PREP) += of1275
|
||||
|
||||
# for cleaning
|
||||
subdir- += simple openfirmware
|
||||
subdir- += simple
|
||||
|
||||
hostprogs-y := $(addprefix utils/, addnote mknote hack-coff mkprep mkbugboot mktree)
|
||||
hostprogs-y := $(addprefix utils/, mkprep mkbugboot mktree)
|
||||
|
||||
PHONY += $(BOOT_TARGETS) $(bootdir-y)
|
||||
|
||||
|
@ -1,109 +0,0 @@
|
||||
# Makefile for making bootable images on various OpenFirmware machines.
|
||||
#
|
||||
# This file is included by the global makefile so that you can add your own
|
||||
# architecture-specific flags and dependencies.
|
||||
#
|
||||
# Paul Mackerras January 1997
|
||||
# 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.
|
||||
|
||||
zImage.initrd znetboot.initrd: del-ramdisk-sec := -R .ramdisk
|
||||
zImage.initrd znetboot.initrd: initrd := .initrd
|
||||
|
||||
|
||||
boot := arch/ppc/boot
|
||||
common := $(boot)/common
|
||||
utils := $(boot)/utils
|
||||
bootlib := $(boot)/lib
|
||||
of1275 := $(boot)/of1275
|
||||
images := $(boot)/images
|
||||
|
||||
CHRP_LD_ARGS := -T $(srctree)/$(boot)/ld.script -e _start -Ttext 0x00800000
|
||||
|
||||
COMMONOBJS := start.o misc.o common.o
|
||||
CHRPOBJS := crt0.o $(COMMONOBJS) chrpmain.o
|
||||
|
||||
targets := $(CHRPOBJS) dummy.o
|
||||
CHRPOBJS := $(addprefix $(obj)/, $(CHRPOBJS))
|
||||
|
||||
LIBS := lib/lib.a $(bootlib)/lib.a $(of1275)/lib.a $(common)/lib.a
|
||||
|
||||
ifdef CONFIG_SMP
|
||||
END := .smp
|
||||
endif
|
||||
ifdef CONFIG_PPC64BRIDGE
|
||||
END += .64
|
||||
endif
|
||||
|
||||
|
||||
$(images)/ramdisk.image.gz:
|
||||
@echo ' MISSING $@'
|
||||
@echo ' RAM disk image must be provided separately'
|
||||
@/bin/false
|
||||
|
||||
quiet_cmd_genimage = GEN $@
|
||||
cmd_genimage = $(OBJCOPY) -R .comment \
|
||||
--add-section=.image=$(images)/vmlinux.gz \
|
||||
--set-section-flags=.image=contents,alloc,load,readonly,data $< $@
|
||||
|
||||
targets += image.o
|
||||
$(obj)/image.o: $(obj)/dummy.o $(images)/vmlinux.gz FORCE
|
||||
$(call if_changed,genimage)
|
||||
|
||||
# Place the ramdisk in the initrd image.
|
||||
quiet_cmd_genimage-initrd = GEN $@
|
||||
cmd_genimage-initrd = $(OBJCOPY) $< $@ \
|
||||
--add-section=.ramdisk=$(images)/ramdisk.image.gz \
|
||||
--set-section-flags=.ramdisk=contents,alloc,load,readonly,data
|
||||
targets += image.initrd.o
|
||||
$(obj)/image.initrd.o: $(obj)/image.o $(images)/ramdisk.image.gz FORCE
|
||||
$(call if_changed,genimage-initrd)
|
||||
|
||||
|
||||
targets += crt0.o
|
||||
$(obj)/crt0.o: $(common)/crt0.S FORCE
|
||||
$(call if_changed_dep,as_o_S)
|
||||
|
||||
quiet_cmd_gen-chrp = CHRP $@
|
||||
cmd_gen-chrp = $(LD) $(CHRP_LD_ARGS) -o $@ $(CHRPOBJS) $< $(LIBS) && \
|
||||
$(OBJCOPY) $@ $@ -R .comment $(del-ramdisk-sec)
|
||||
|
||||
$(images)/zImage.chrp: $(obj)/image.o $(CHRPOBJS) $(LIBS) \
|
||||
$(srctree)/$(boot)/ld.script
|
||||
$(call cmd,gen-chrp)
|
||||
$(images)/zImage.initrd.chrp: $(obj)/image.initrd.o $(CHRPOBJS) $(LIBS) \
|
||||
$(srctree)/$(boot)/ld.script
|
||||
$(call cmd,gen-chrp)
|
||||
|
||||
quiet_cmd_addnote = ADDNOTE $@
|
||||
cmd_addnote = cat $< > $@ && $(utils)/addnote $@
|
||||
$(images)/zImage.chrp-rs6k $(images)/zImage.initrd.chrp-rs6k: \
|
||||
%-rs6k: %
|
||||
$(call cmd,addnote)
|
||||
|
||||
# The targets used on the make command-line
|
||||
|
||||
PHONY += zImage zImage.initrd
|
||||
zImage: $(images)/zImage.chrp \
|
||||
$(images)/zImage.chrp-rs6k
|
||||
@echo ' kernel: $@ is ready ($<)'
|
||||
zImage.initrd: $(images)/zImage.initrd.chrp \
|
||||
$(images)/zImage.initrd.chrp-rs6k
|
||||
@echo ' kernel: $@ is ready ($<)'
|
||||
|
||||
TFTPIMAGE := /tftpboot/zImage
|
||||
|
||||
PHONY += znetboot znetboot.initrd
|
||||
znetboot: $(images)/zImage.chrp
|
||||
cp $(images)/zImage.chrp $(TFTPIMAGE).chrp$(END)
|
||||
@echo ' kernel: $@ is ready ($<)'
|
||||
znetboot.initrd:$(images)/zImage.initrd.chrp
|
||||
cp $(images)/zImage.initrd.chrp $(TFTPIMAGE).chrp$(END)
|
||||
@echo ' kernel: $@ is ready ($<)'
|
||||
|
@ -1,101 +0,0 @@
|
||||
/*
|
||||
* 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 <linux/string.h>
|
||||
#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 _start, _end;
|
||||
|
||||
extern unsigned int heap_max;
|
||||
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);
|
||||
|
||||
char *avail_ram;
|
||||
char *begin_avail, *end_avail;
|
||||
char *avail_high;
|
||||
|
||||
#define RAM_START 0x00000000
|
||||
#define RAM_END (64<<20)
|
||||
|
||||
#define BOOT_START ((unsigned long)_start)
|
||||
#define BOOT_END ((unsigned long)(_end + 0xFFF) & ~0xFFF)
|
||||
|
||||
#define RAM_FREE ((unsigned long)(_end+0x1000)&~0xFFF)
|
||||
#define PROG_START 0x00010000
|
||||
#define PROG_SIZE 0x007f0000 /* 8MB */
|
||||
|
||||
#define SCRATCH_SIZE (128 << 10)
|
||||
|
||||
static char scratch[SCRATCH_SIZE]; /* 128k of scratch space for gunzip */
|
||||
|
||||
typedef void (*kernel_start_t)(int, int, void *, unsigned int, unsigned int);
|
||||
|
||||
void
|
||||
boot(int a1, int a2, void *prom)
|
||||
{
|
||||
unsigned sa, len;
|
||||
void *dst;
|
||||
unsigned char *im;
|
||||
unsigned int initrd_size, initrd_start;
|
||||
|
||||
printf("chrpboot starting: loaded at 0x%p\n\r", &_start);
|
||||
|
||||
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, &__ramdisk_begin, initrd_size);
|
||||
memcpy((char *)initrd_start, &__ramdisk_begin, initrd_size);
|
||||
} else {
|
||||
initrd_start = 0;
|
||||
initrd_size = 0;
|
||||
a2 = 0xdeadbeef;
|
||||
}
|
||||
|
||||
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;
|
||||
if (im[0] == 0x1f && im[1] == 0x8b) {
|
||||
avail_ram = scratch;
|
||||
begin_avail = avail_high = avail_ram;
|
||||
end_avail = scratch + sizeof(scratch);
|
||||
printf("gunzipping (0x%p <- 0x%p:0x%p)...", dst, im, im+len);
|
||||
gunzip(dst, PROG_SIZE - PROG_START, im, &len);
|
||||
printf("done %u bytes\n\r", len);
|
||||
printf("%u bytes of heap consumed, max in use %u\n\r",
|
||||
avail_high - begin_avail, heap_max);
|
||||
} else {
|
||||
memmove(dst, im, len);
|
||||
}
|
||||
|
||||
flush_cache(dst, len);
|
||||
make_bi_recs(((unsigned long) dst + len), "chrpboot", _MACH_chrp,
|
||||
(PROG_START + PROG_SIZE));
|
||||
|
||||
sa = PROG_START;
|
||||
printf("start address = 0x%x\n\r", sa);
|
||||
|
||||
(*(kernel_start_t)sa)(a1, a2, prom, initrd_start, initrd_size);
|
||||
|
||||
printf("returned?\n\r");
|
||||
|
||||
pause();
|
||||
}
|
@ -1,146 +0,0 @@
|
||||
/*
|
||||
* 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 "nonstdio.h"
|
||||
#include "of1275.h"
|
||||
#include <linux/string.h>
|
||||
#include <linux/zlib.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/* Information from the linker */
|
||||
|
||||
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(unsigned size)
|
||||
{
|
||||
void *p;
|
||||
struct memchunk **mpp, *mp;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#define HEAD_CRC 2
|
||||
#define EXTRA_FIELD 4
|
||||
#define ORIG_NAME 8
|
||||
#define COMMENT 0x10
|
||||
#define RESERVED 0xe0
|
||||
|
||||
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] != Z_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();
|
||||
}
|
||||
|
||||
/* Initialize ourself. */
|
||||
s.workspace = zalloc(zlib_inflate_workspacesize());
|
||||
r = zlib_inflateInit2(&s, -MAX_WBITS);
|
||||
if (r != Z_OK) {
|
||||
printf("zlib_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 = zlib_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;
|
||||
zlib_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)
|
||||
{
|
||||
struct bi_record *rec;
|
||||
|
||||
|
||||
/* 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);
|
||||
|
||||
rec->tag = BI_LAST;
|
||||
rec->size = sizeof(struct bi_record);
|
||||
rec = (struct bi_record *)((unsigned long)rec + rec->size);
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
int main(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* 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 BAT2 & 3 registers to map the 1st 16MB of RAM to
|
||||
* the address given as the 1st argument.
|
||||
*/
|
||||
.globl setup_bats
|
||||
setup_bats:
|
||||
mfpvr 5
|
||||
rlwinm 5,5,16,16,31 /* r3 = 1 for 601, 4 for 604 */
|
||||
cmpwi 0,5,1
|
||||
li 0,0
|
||||
bne 4f
|
||||
mtibatl 3,0 /* invalidate BAT first */
|
||||
ori 3,3,4 /* set up BAT registers for 601 */
|
||||
li 4,0x7f
|
||||
mtibatu 2,3
|
||||
mtibatl 2,4
|
||||
oris 3,3,0x80
|
||||
oris 4,4,0x80
|
||||
mtibatu 3,3
|
||||
mtibatl 3,4
|
||||
b 5f
|
||||
4: mtdbatu 3,0 /* invalidate BATs first */
|
||||
mtibatu 3,0
|
||||
ori 3,3,0xff /* set up BAT registers for 604 */
|
||||
li 4,2
|
||||
mtdbatl 2,4
|
||||
mtdbatu 2,3
|
||||
mtibatl 2,4
|
||||
mtibatu 2,3
|
||||
oris 3,3,0x80
|
||||
oris 4,4,0x80
|
||||
mtdbatl 3,4
|
||||
mtdbatu 3,3
|
||||
mtibatl 3,4
|
||||
mtibatu 3,3
|
||||
5: sync
|
||||
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
|
@ -1,172 +0,0 @@
|
||||
/*
|
||||
* 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>
|
||||
#include "of1275.h"
|
||||
|
||||
extern int strlen(const char *s);
|
||||
extern void boot(int a1, int a2, void *prom);
|
||||
|
||||
phandle stdin;
|
||||
phandle stdout;
|
||||
phandle stderr;
|
||||
|
||||
void printk(char *fmt, ...);
|
||||
|
||||
void
|
||||
start(int a1, int a2, void *promptr)
|
||||
{
|
||||
ofinit(promptr);
|
||||
if (ofstdio(&stdin, &stdout, &stderr))
|
||||
exit();
|
||||
|
||||
boot(a1, a2, promptr);
|
||||
for (;;)
|
||||
exit();
|
||||
}
|
||||
|
||||
int writestring(void *f, char *ptr, int nb)
|
||||
{
|
||||
int w = 0, i;
|
||||
char *ret = "\r";
|
||||
|
||||
for (i = 0; i < nb; ++i) {
|
||||
if (ptr[i] == '\n') {
|
||||
if (i > w) {
|
||||
write(f, ptr + w, i - w);
|
||||
w = i;
|
||||
}
|
||||
write(f, ret, 1);
|
||||
}
|
||||
}
|
||||
if (w < nb)
|
||||
write(f, ptr + w, nb - w);
|
||||
return nb;
|
||||
}
|
||||
|
||||
int
|
||||
putc(int c, void *f)
|
||||
{
|
||||
char ch = c;
|
||||
|
||||
return writestring(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 writestring(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\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);
|
||||
writestring(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);
|
||||
writestring(stdout, sprint_buf, n);
|
||||
return n;
|
||||
}
|
@ -50,10 +50,10 @@ MPC10X_PCI_OP(read, dword, u32 *, in_le32, 0)
|
||||
* the system. This assumes that the firmware has correctly set up the memory
|
||||
* controller registers. On CONFIG_PPC_PREP, we know we are being called
|
||||
* under a PReP memory map. On all other machines, we assume we are under
|
||||
* a CHRP memory map. Further, on CONFIG_PPC_MULTIPLATFORM we must rename
|
||||
* a CHRP memory map. Further, on CONFIG_PPC_PREP we must rename
|
||||
* this function.
|
||||
*/
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
#define get_mem_size mpc10x_get_mem_size
|
||||
#endif
|
||||
unsigned long
|
||||
|
@ -194,7 +194,7 @@ start_ldr:
|
||||
/*
|
||||
* Start at the begining.
|
||||
*/
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
li r9,0xc
|
||||
mtlr r9
|
||||
/* tell kernel we're prep, by putting 0xdeadc0de at KERNELLOAD,
|
||||
|
@ -1,175 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
* Note that OF needs a program header entry for the note, not an
|
||||
* ELF section.
|
||||
*
|
||||
* Copyright 2000 Paul Mackerras.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Usage: addnote zImage
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
char arch[] = "PowerPC";
|
||||
|
||||
#define N_DESCR 6
|
||||
unsigned int descr[N_DESCR] = {
|
||||
#if 1
|
||||
/* values for IBM RS/6000 machines */
|
||||
0xffffffff, /* real-mode = true */
|
||||
0x00c00000, /* real-base, i.e. where we expect OF to be */
|
||||
0xffffffff, /* real-size */
|
||||
0xffffffff, /* virt-base */
|
||||
0xffffffff, /* virt-size */
|
||||
0x4000, /* load-base */
|
||||
#else
|
||||
/* values for longtrail CHRP */
|
||||
0, /* real-mode = false */
|
||||
0xffffffff, /* real-base */
|
||||
0xffffffff, /* real-size */
|
||||
0xffffffff, /* virt-base */
|
||||
0xffffffff, /* virt-size */
|
||||
0x00600000, /* load-base */
|
||||
#endif
|
||||
};
|
||||
|
||||
unsigned char buf[512];
|
||||
|
||||
#define GET_16BE(off) ((buf[off] << 8) + (buf[(off)+1]))
|
||||
#define GET_32BE(off) ((GET_16BE(off) << 16) + GET_16BE((off)+2))
|
||||
|
||||
#define PUT_16BE(off, v) (buf[off] = ((v) >> 8) & 0xff, \
|
||||
buf[(off) + 1] = (v) & 0xff)
|
||||
#define PUT_32BE(off, v) (PUT_16BE((off), (v) >> 16), \
|
||||
PUT_16BE((off) + 2, (v)))
|
||||
|
||||
/* Structure of an ELF file */
|
||||
#define E_IDENT 0 /* ELF header */
|
||||
#define E_PHOFF 28
|
||||
#define E_PHENTSIZE 42
|
||||
#define E_PHNUM 44
|
||||
#define E_HSIZE 52 /* size of ELF header */
|
||||
|
||||
#define EI_MAGIC 0 /* offsets in E_IDENT area */
|
||||
#define EI_CLASS 4
|
||||
#define EI_DATA 5
|
||||
|
||||
#define PH_TYPE 0 /* ELF program header */
|
||||
#define PH_OFFSET 4
|
||||
#define PH_FILESZ 16
|
||||
#define PH_HSIZE 32 /* size of program header */
|
||||
|
||||
#define PT_NOTE 4 /* Program header type = note */
|
||||
|
||||
#define ELFCLASS32 1
|
||||
#define ELFDATA2MSB 2
|
||||
|
||||
unsigned char elf_magic[4] = { 0x7f, 'E', 'L', 'F' };
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
int fd, n, i;
|
||||
int ph, ps, np;
|
||||
int nnote, ns;
|
||||
|
||||
if (ac != 2) {
|
||||
fprintf(stderr, "Usage: %s elf-file\n", av[0]);
|
||||
exit(1);
|
||||
}
|
||||
fd = open(av[1], O_RDWR);
|
||||
if (fd < 0) {
|
||||
perror(av[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nnote = strlen(arch) + 1 + (N_DESCR + 3) * 4;
|
||||
|
||||
n = read(fd, buf, sizeof(buf));
|
||||
if (n < 0) {
|
||||
perror("read");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (n < E_HSIZE || memcmp(&buf[E_IDENT+EI_MAGIC], elf_magic, 4) != 0)
|
||||
goto notelf;
|
||||
|
||||
if (buf[E_IDENT+EI_CLASS] != ELFCLASS32
|
||||
|| buf[E_IDENT+EI_DATA] != ELFDATA2MSB) {
|
||||
fprintf(stderr, "%s is not a big-endian 32-bit ELF image\n",
|
||||
av[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ph = GET_32BE(E_PHOFF);
|
||||
ps = GET_16BE(E_PHENTSIZE);
|
||||
np = GET_16BE(E_PHNUM);
|
||||
if (ph < E_HSIZE || ps < PH_HSIZE || np < 1)
|
||||
goto notelf;
|
||||
if (ph + (np + 1) * ps + nnote > n)
|
||||
goto nospace;
|
||||
|
||||
for (i = 0; i < np; ++i) {
|
||||
if (GET_32BE(ph + PH_TYPE) == PT_NOTE) {
|
||||
fprintf(stderr, "%s already has a note entry\n",
|
||||
av[1]);
|
||||
exit(0);
|
||||
}
|
||||
ph += ps;
|
||||
}
|
||||
|
||||
/* XXX check that the area we want to use is all zeroes */
|
||||
for (i = 0; i < ps + nnote; ++i)
|
||||
if (buf[ph + i] != 0)
|
||||
goto nospace;
|
||||
|
||||
/* fill in the program header entry */
|
||||
ns = ph + ps;
|
||||
PUT_32BE(ph + PH_TYPE, PT_NOTE);
|
||||
PUT_32BE(ph + PH_OFFSET, ns);
|
||||
PUT_32BE(ph + PH_FILESZ, nnote);
|
||||
|
||||
/* fill in the note area we point to */
|
||||
/* XXX we should probably make this a proper section */
|
||||
PUT_32BE(ns, strlen(arch) + 1);
|
||||
PUT_32BE(ns + 4, N_DESCR * 4);
|
||||
PUT_32BE(ns + 8, 0x1275);
|
||||
strcpy(&buf[ns + 12], arch);
|
||||
ns += 12 + strlen(arch) + 1;
|
||||
for (i = 0; i < N_DESCR; ++i)
|
||||
PUT_32BE(ns + i * 4, descr[i]);
|
||||
|
||||
/* Update the number of program headers */
|
||||
PUT_16BE(E_PHNUM, np + 1);
|
||||
|
||||
/* write back */
|
||||
lseek(fd, (long) 0, SEEK_SET);
|
||||
i = write(fd, buf, n);
|
||||
if (i < 0) {
|
||||
perror("write");
|
||||
exit(1);
|
||||
}
|
||||
if (i < n) {
|
||||
fprintf(stderr, "%s: write truncated\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
exit(0);
|
||||
|
||||
notelf:
|
||||
fprintf(stderr, "%s does not appear to be an ELF file\n", av[0]);
|
||||
exit(1);
|
||||
|
||||
nospace:
|
||||
fprintf(stderr, "sorry, I can't find space in %s to put the note\n",
|
||||
av[0]);
|
||||
exit(1);
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
/*
|
||||
* hack-coff.c - hack the header of an xcoff file to fill in
|
||||
* a few fields needed by the Open Firmware xcoff loader on
|
||||
* Power Macs but not initialized by objcopy.
|
||||
*
|
||||
* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include "rs6000.h"
|
||||
|
||||
#define AOUT_MAGIC 0x010b
|
||||
|
||||
#define get_16be(x) ((((unsigned char *)(x))[0] << 8) \
|
||||
+ ((unsigned char *)(x))[1])
|
||||
#define put_16be(x, v) (((unsigned char *)(x))[0] = (v) >> 8, \
|
||||
((unsigned char *)(x))[1] = (v) & 0xff)
|
||||
#define get_32be(x) ((((unsigned char *)(x))[0] << 24) \
|
||||
+ (((unsigned char *)(x))[1] << 16) \
|
||||
+ (((unsigned char *)(x))[2] << 8) \
|
||||
+ ((unsigned char *)(x))[3])
|
||||
|
||||
int
|
||||
main(int ac, char **av)
|
||||
{
|
||||
int fd;
|
||||
int i, nsect;
|
||||
int aoutsz;
|
||||
struct external_filehdr fhdr;
|
||||
AOUTHDR aout;
|
||||
struct external_scnhdr shdr;
|
||||
|
||||
if (ac != 2) {
|
||||
fprintf(stderr, "Usage: hack-coff coff-file\n");
|
||||
exit(1);
|
||||
}
|
||||
if ((fd = open(av[1], 2)) == -1) {
|
||||
perror(av[2]);
|
||||
exit(1);
|
||||
}
|
||||
if (read(fd, &fhdr, sizeof(fhdr)) != sizeof(fhdr))
|
||||
goto readerr;
|
||||
i = get_16be(fhdr.f_magic);
|
||||
if (i != U802TOCMAGIC && i != U802WRMAGIC && i != U802ROMAGIC) {
|
||||
fprintf(stderr, "%s: not an xcoff file\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
aoutsz = get_16be(fhdr.f_opthdr);
|
||||
if (read(fd, &aout, aoutsz) != aoutsz)
|
||||
goto readerr;
|
||||
nsect = get_16be(fhdr.f_nscns);
|
||||
for (i = 0; i < nsect; ++i) {
|
||||
if (read(fd, &shdr, sizeof(shdr)) != sizeof(shdr))
|
||||
goto readerr;
|
||||
if (strcmp(shdr.s_name, ".text") == 0) {
|
||||
put_16be(aout.o_snentry, i+1);
|
||||
put_16be(aout.o_sntext, i+1);
|
||||
} else if (strcmp(shdr.s_name, ".data") == 0) {
|
||||
put_16be(aout.o_sndata, i+1);
|
||||
} else if (strcmp(shdr.s_name, ".bss") == 0) {
|
||||
put_16be(aout.o_snbss, i+1);
|
||||
}
|
||||
}
|
||||
put_16be(aout.magic, AOUT_MAGIC);
|
||||
if (lseek(fd, (long) sizeof(struct external_filehdr), 0) == -1
|
||||
|| write(fd, &aout, aoutsz) != aoutsz) {
|
||||
fprintf(stderr, "%s: write error\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
close(fd);
|
||||
exit(0);
|
||||
|
||||
readerr:
|
||||
fprintf(stderr, "%s: read error or file too short\n", av[1]);
|
||||
exit(1);
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) Cort Dougan 1999.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Generate a note section as per the CHRP specification.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define PL(x) printf("%c%c%c%c", ((x)>>24)&0xff, ((x)>>16)&0xff, ((x)>>8)&0xff, (x)&0xff );
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* header */
|
||||
/* namesz */
|
||||
PL(strlen("PowerPC")+1);
|
||||
/* descrsz */
|
||||
PL(6*4);
|
||||
/* type */
|
||||
PL(0x1275);
|
||||
/* name */
|
||||
printf("PowerPC"); printf("%c", 0);
|
||||
|
||||
/* descriptor */
|
||||
/* real-mode */
|
||||
PL(0xffffffff);
|
||||
/* real-base */
|
||||
PL(0x00c00000);
|
||||
/* real-size */
|
||||
PL(0xffffffff);
|
||||
/* virt-base */
|
||||
PL(0xffffffff);
|
||||
/* virt-size */
|
||||
PL(0xffffffff);
|
||||
/* load-base */
|
||||
PL(0x4000);
|
||||
return 0;
|
||||
}
|
@ -1,875 +0,0 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_HAVE_DEC_LOCK=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_GENERIC_NVRAM=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Processor
|
||||
#
|
||||
CONFIG_6xx=y
|
||||
# CONFIG_40x is not set
|
||||
# CONFIG_44x is not set
|
||||
# CONFIG_POWER3 is not set
|
||||
# CONFIG_POWER4 is not set
|
||||
# CONFIG_8xx is not set
|
||||
# CONFIG_ALTIVEC is not set
|
||||
# CONFIG_TAU is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
# CONFIG_PPC601_SYNC_FIX is not set
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
|
||||
#
|
||||
# Platform options
|
||||
#
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_APUS is not set
|
||||
# CONFIG_WILLOW is not set
|
||||
# CONFIG_PCORE is not set
|
||||
# CONFIG_POWERPMC250 is not set
|
||||
# CONFIG_EV64260 is not set
|
||||
# CONFIG_SPRUCE is not set
|
||||
# CONFIG_LOPEC is not set
|
||||
# CONFIG_MCPN765 is not set
|
||||
# CONFIG_MVME5100 is not set
|
||||
# CONFIG_PPLUS is not set
|
||||
# CONFIG_PRPMC750 is not set
|
||||
# CONFIG_PRPMC800 is not set
|
||||
# CONFIG_SANDPOINT is not set
|
||||
# CONFIG_ADIR is not set
|
||||
# CONFIG_K2 is not set
|
||||
# CONFIG_PAL4 is not set
|
||||
# CONFIG_GEMINI is not set
|
||||
# CONFIG_EST8260 is not set
|
||||
# CONFIG_SBS8260 is not set
|
||||
# CONFIG_RPX6 is not set
|
||||
# CONFIG_TQM8260 is not set
|
||||
CONFIG_PPC_CHRP=y
|
||||
CONFIG_PPC_PMAC=y
|
||||
CONFIG_PPC_PREP=y
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_PPCBUG_NVRAM=y
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_KERNEL_ELF=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
# CONFIG_PREP_RESIDUAL is not set
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_ISA=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
|
||||
#
|
||||
# Advanced setup
|
||||
#
|
||||
# CONFIG_ADVANCED_OPTIONS is not set
|
||||
|
||||
#
|
||||
# Default settings for advanced configuration options are used
|
||||
#
|
||||
CONFIG_HIGHMEM_START=0xfe000000
|
||||
CONFIG_LOWMEM_SIZE=0x30000000
|
||||
CONFIG_KERNEL_START=0xc0000000
|
||||
CONFIG_TASK_SIZE=0x80000000
|
||||
CONFIG_BOOT_LOAD=0x00800000
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
# CONFIG_PNP is not set
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
CONFIG_BLK_DEV_FD=y
|
||||
# CONFIG_BLK_DEV_XD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_CARMEL is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_LBD=y
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
# CONFIG_SCSI_REPORT_LUNS is not set
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
#
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_7000FASST is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
# CONFIG_SCSI_AHA152X is not set
|
||||
# CONFIG_SCSI_AHA1542 is not set
|
||||
# CONFIG_SCSI_AACRAID is not set
|
||||
# CONFIG_SCSI_AIC7XXX is not set
|
||||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_ADVANSYS is not set
|
||||
# CONFIG_SCSI_IN2000 is not set
|
||||
# CONFIG_SCSI_MEGARAID is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_CPQFCTS is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_DTC3280 is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
# CONFIG_SCSI_EATA_PIO is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_GDTH is not set
|
||||
# CONFIG_SCSI_GENERIC_NCR5380 is not set
|
||||
# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_NCR53C406A is not set
|
||||
CONFIG_SCSI_SYM53C8XX_2=y
|
||||
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
||||
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_PAS16 is not set
|
||||
# CONFIG_SCSI_PSI240I is not set
|
||||
# CONFIG_SCSI_QLOGIC_FAS is not set
|
||||
# CONFIG_SCSI_QLOGIC_ISP is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
CONFIG_SCSI_QLA2XXX=y
|
||||
# CONFIG_SCSI_QLA21XX is not set
|
||||
# CONFIG_SCSI_QLA22XX is not set
|
||||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA6322 is not set
|
||||
# CONFIG_SCSI_SYM53C416 is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_T128 is not set
|
||||
# CONFIG_SCSI_U14_34F is not set
|
||||
# CONFIG_SCSI_NSP32 is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
# CONFIG_SCSI_MESH is not set
|
||||
# CONFIG_SCSI_MAC53C94 is not set
|
||||
|
||||
#
|
||||
# Old CD-ROM drivers (not SCSI, not IDE)
|
||||
#
|
||||
# CONFIG_CD_NO_IDESCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
# CONFIG_ADB is not set
|
||||
# CONFIG_ADB_CUDA is not set
|
||||
# CONFIG_ADB_PMU is not set
|
||||
# CONFIG_MAC_FLOPPY is not set
|
||||
# CONFIG_MAC_SERIAL is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=m
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MAC=m
|
||||
# CONFIG_IP_NF_MATCH_PKTTYPE is not set
|
||||
CONFIG_IP_NF_MATCH_MARK=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_TCPMSS=m
|
||||
CONFIG_IP_NF_MATCH_HELPER=m
|
||||
CONFIG_IP_NF_MATCH_STATE=m
|
||||
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
CONFIG_IP_NF_TARGET_NETMAP=m
|
||||
CONFIG_IP_NF_TARGET_SAME=m
|
||||
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
CONFIG_IP_NF_NAT_TFTP=m
|
||||
CONFIG_IP_NF_NAT_AMANDA=m
|
||||
# CONFIG_IP_NF_MANGLE is not set
|
||||
# CONFIG_IP_NF_TARGET_LOG is not set
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_TARGET_TCPMSS=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
CONFIG_IP_NF_COMPAT_IPCHAINS=m
|
||||
# CONFIG_IP_NF_COMPAT_IPFWADM is not set
|
||||
CONFIG_IP_NF_TARGET_NOTRACK=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_HW_FLOWCONTROL is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_MACE is not set
|
||||
# CONFIG_BMAC is not set
|
||||
# CONFIG_OAKNET is not set
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_LANCE is not set
|
||||
# CONFIG_NET_VENDOR_SMC is not set
|
||||
# CONFIG_NET_VENDOR_RACAL is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_AT1700 is not set
|
||||
# CONFIG_DEPCA is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_NET_ISA is not set
|
||||
CONFIG_NET_PCI=y
|
||||
CONFIG_PCNET32=y
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_AC3200 is not set
|
||||
# CONFIG_APRICOT is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_CS89x0 is not set
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
# CONFIG_E100 is not set
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
# CONFIG_NE2K_PCI is not set
|
||||
# CONFIG_8139CP is not set
|
||||
# CONFIG_8139TOO is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_TLAN is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
# CONFIG_NET_POCKET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
# CONFIG_E1000 is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_RCPCI is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input I/O drivers
|
||||
#
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_I8042=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_CT82C710 is not set
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_INPORT is not set
|
||||
# CONFIG_MOUSE_LOGIBM is not set
|
||||
# CONFIG_MOUSE_PC110PAD is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_UINPUT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_CONSOLE is not set
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
# CONFIG_SERIAL_PMACZILOG is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
# CONFIG_QIC02_TAPE is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_NVRAM=y
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_FTAPE is not set
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FB_PM2 is not set
|
||||
# CONFIG_FB_CYBER2000 is not set
|
||||
CONFIG_FB_OF=y
|
||||
# CONFIG_FB_CONTROL is not set
|
||||
# CONFIG_FB_PLATINUM is not set
|
||||
# CONFIG_FB_VALKYRIE is not set
|
||||
# CONFIG_FB_CT65550 is not set
|
||||
# CONFIG_FB_IMSTT is not set
|
||||
# CONFIG_FB_S3TRIO is not set
|
||||
# CONFIG_FB_VGA16 is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
CONFIG_FB_MATROX=y
|
||||
CONFIG_FB_MATROX_MILLENIUM=y
|
||||
CONFIG_FB_MATROX_MYSTIQUE=y
|
||||
# CONFIG_FB_MATROX_G450 is not set
|
||||
CONFIG_FB_MATROX_G100A=y
|
||||
CONFIG_FB_MATROX_G100=y
|
||||
# CONFIG_FB_MATROX_MULTIHEAD is not set
|
||||
# CONFIG_FB_RADEON_OLD is not set
|
||||
# CONFIG_FB_RADEON is not set
|
||||
# CONFIG_FB_ATY128 is not set
|
||||
# CONFIG_FB_ATY is not set
|
||||
# CONFIG_FB_SIS is not set
|
||||
# CONFIG_FB_NEOMAGIC is not set
|
||||
# CONFIG_FB_KYRO is not set
|
||||
CONFIG_FB_3DFX=y
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_MDA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_PCI_CONSOLE=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_MONO=y
|
||||
CONFIG_LOGO_LINUX_VGA16=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
CONFIG_ISO9660_FS=y
|
||||
# CONFIG_JOLIET is not set
|
||||
# CONFIG_ZISOFS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_DEVFS_FS=y
|
||||
# CONFIG_DEVFS_MOUNT is not set
|
||||
# CONFIG_DEVFS_DEBUG is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
# CONFIG_EXPORTFS is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_ACORN_PARTITION is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
# CONFIG_AMIGA_PARTITION is not set
|
||||
# CONFIG_ATARI_PARTITION is not set
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_BSD_DISKLABEL is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
# CONFIG_SOLARIS_X86_PARTITION is not set
|
||||
# CONFIG_UNIXWARE_DISKLABEL is not set
|
||||
# CONFIG_LDM_PARTITION is not set
|
||||
# CONFIG_NEC98_PARTITION is not set
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -930,55 +930,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
|
||||
b 4b
|
||||
|
||||
.comm ee_restarts,4
|
||||
|
||||
/*
|
||||
* PROM code for specific machines follows. Put it
|
||||
* here so it's easy to add arch-specific sections later.
|
||||
* -- Cort
|
||||
*/
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/*
|
||||
* On CHRP, the Run-Time Abstraction Services (RTAS) have to be
|
||||
* called with the MMU off.
|
||||
*/
|
||||
_GLOBAL(enter_rtas)
|
||||
stwu r1,-INT_FRAME_SIZE(r1)
|
||||
mflr r0
|
||||
stw r0,INT_FRAME_SIZE+4(r1)
|
||||
lis r4,rtas_data@ha
|
||||
lwz r4,rtas_data@l(r4)
|
||||
lis r6,1f@ha /* physical return address for rtas */
|
||||
addi r6,r6,1f@l
|
||||
tophys(r6,r6)
|
||||
tophys(r7,r1)
|
||||
lis r8,rtas_entry@ha
|
||||
lwz r8,rtas_entry@l(r8)
|
||||
mfmsr r9
|
||||
stw r9,8(r1)
|
||||
LOAD_MSR_KERNEL(r0,MSR_KERNEL)
|
||||
SYNC /* disable interrupts so SRR0/1 */
|
||||
MTMSRD(r0) /* don't get trashed */
|
||||
li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR)
|
||||
mtlr r6
|
||||
CLR_TOP32(r7)
|
||||
mtspr SPRN_SPRG2,r7
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
RFI
|
||||
1: tophys(r9,r1)
|
||||
lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */
|
||||
lwz r9,8(r9) /* original msr value */
|
||||
FIX_SRR1(r9,r0)
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
li r0,0
|
||||
mtspr SPRN_SPRG2,r0
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
RFI /* return to caller */
|
||||
|
||||
.globl machine_check_in_rtas
|
||||
machine_check_in_rtas:
|
||||
twi 31,0,0
|
||||
/* XXX load up BATs and panic */
|
||||
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
|
@ -37,19 +37,6 @@
|
||||
#include <asm/amigappc.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
#define LOAD_BAT(n, reg, RA, RB) \
|
||||
ld RA,(n*32)+0(reg); \
|
||||
ld RB,(n*32)+8(reg); \
|
||||
mtspr SPRN_IBAT##n##U,RA; \
|
||||
mtspr SPRN_IBAT##n##L,RB; \
|
||||
ld RA,(n*32)+16(reg); \
|
||||
ld RB,(n*32)+24(reg); \
|
||||
mtspr SPRN_DBAT##n##U,RA; \
|
||||
mtspr SPRN_DBAT##n##L,RB; \
|
||||
|
||||
#else /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
|
||||
#define LOAD_BAT(n, reg, RA, RB) \
|
||||
/* see the comment for clear_bats() -- Cort */ \
|
||||
@ -66,7 +53,6 @@
|
||||
mtspr SPRN_DBAT##n##U,RA; \
|
||||
mtspr SPRN_DBAT##n##L,RB; \
|
||||
1:
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
.text
|
||||
.stabs "arch/ppc/kernel/",N_SO,0,0,0f
|
||||
@ -129,11 +115,6 @@ _start:
|
||||
|
||||
.globl __start
|
||||
__start:
|
||||
/*
|
||||
* We have to do any OF calls before we map ourselves to KERNELBASE,
|
||||
* because OF may have I/O devices mapped into that area
|
||||
* (particularly on CHRP).
|
||||
*/
|
||||
mr r31,r3 /* save parameters */
|
||||
mr r30,r4
|
||||
mr r29,r5
|
||||
@ -148,14 +129,6 @@ __start:
|
||||
*/
|
||||
bl early_init
|
||||
|
||||
/*
|
||||
* On POWER4, we first need to tweak some CPU configuration registers
|
||||
* like real mode cache inhibit or exception base
|
||||
*/
|
||||
#ifdef CONFIG_POWER4
|
||||
bl __970_cpu_preinit
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
#ifdef CONFIG_APUS
|
||||
/* On APUS the __va/__pa constants need to be set to the correct
|
||||
* values before continuing.
|
||||
@ -169,7 +142,6 @@ __start:
|
||||
*/
|
||||
bl mmu_off
|
||||
__after_mmu_off:
|
||||
#ifndef CONFIG_POWER4
|
||||
bl clear_bats
|
||||
bl flush_tlbs
|
||||
|
||||
@ -177,10 +149,6 @@ __after_mmu_off:
|
||||
#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
|
||||
bl setup_disp_bat
|
||||
#endif
|
||||
#else /* CONFIG_POWER4 */
|
||||
bl reloc_offset
|
||||
bl initial_mm_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
/*
|
||||
* Call setup_cpu for CPU 0 and initialize 6xx Idle
|
||||
@ -192,18 +160,11 @@ __after_mmu_off:
|
||||
bl reloc_offset
|
||||
bl init_idle_6xx
|
||||
#endif /* CONFIG_6xx */
|
||||
#ifdef CONFIG_POWER4
|
||||
bl reloc_offset
|
||||
bl init_idle_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
|
||||
#ifndef CONFIG_APUS
|
||||
/*
|
||||
* We need to run with _start at physical address 0.
|
||||
* On CHRP, we are loaded at 0x10000 since OF on CHRP uses
|
||||
* the exception vectors at 0 (and therefore this copy
|
||||
* overwrites OF's exception vectors with our own).
|
||||
* If the MMU is already turned on, we copy stuff to KERNELBASE,
|
||||
* otherwise we copy it to 0.
|
||||
*/
|
||||
@ -358,51 +319,19 @@ i##n: \
|
||||
#endif
|
||||
|
||||
/* Machine check */
|
||||
/*
|
||||
* On CHRP, this is complicated by the fact that we could get a
|
||||
* machine check inside RTAS, and we have no guarantee that certain
|
||||
* critical registers will have the values we expect. The set of
|
||||
* registers that might have bad values includes all the GPRs
|
||||
* and all the BATs. We indicate that we are in RTAS by putting
|
||||
* a non-zero value, the address of the exception frame to use,
|
||||
* in SPRG2. The machine check handler checks SPRG2 and uses its
|
||||
* value if it is non-zero. If we ever needed to free up SPRG2,
|
||||
* we could use a field in the thread_info or thread_struct instead.
|
||||
* (Other exception handlers assume that r1 is a valid kernel stack
|
||||
* pointer when we take an exception from supervisor mode.)
|
||||
* -- paulus.
|
||||
*/
|
||||
. = 0x200
|
||||
mtspr SPRN_SPRG0,r10
|
||||
mtspr SPRN_SPRG1,r11
|
||||
mfcr r10
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
mfspr r11,SPRN_SPRG2
|
||||
cmpwi 0,r11,0
|
||||
bne 7f
|
||||
#endif /* CONFIG_PPC_CHRP */
|
||||
EXCEPTION_PROLOG_1
|
||||
7: EXCEPTION_PROLOG_2
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
mfspr r4,SPRN_SPRG2
|
||||
cmpwi cr1,r4,0
|
||||
bne cr1,1f
|
||||
#endif
|
||||
EXC_XFER_STD(0x200, machine_check_exception)
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
1: b machine_check_in_rtas
|
||||
#endif
|
||||
|
||||
/* Data access exception. */
|
||||
. = 0x300
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
b DataAccess
|
||||
DataAccessCont:
|
||||
#else
|
||||
DataAccess:
|
||||
EXCEPTION_PROLOG
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mfspr r10,SPRN_DSISR
|
||||
andis. r0,r10,0xa470 /* weird error? */
|
||||
bne 1f /* if not, try to put a PTE */
|
||||
@ -414,21 +343,10 @@ DataAccess:
|
||||
mfspr r4,SPRN_DAR
|
||||
EXC_XFER_EE_LITE(0x300, handle_page_fault)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* SLB fault on data access. */
|
||||
. = 0x380
|
||||
b DataSegment
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* Instruction access exception. */
|
||||
. = 0x400
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
b InstructionAccess
|
||||
InstructionAccessCont:
|
||||
#else
|
||||
InstructionAccess:
|
||||
EXCEPTION_PROLOG
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
andis. r0,r9,0x4000 /* no pte found? */
|
||||
beq 1f /* if so, try to put a PTE */
|
||||
li r3,0 /* into the hash table */
|
||||
@ -438,12 +356,6 @@ InstructionAccess:
|
||||
mr r5,r9
|
||||
EXC_XFER_EE_LITE(0x400, handle_page_fault)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* SLB fault on instruction access. */
|
||||
. = 0x480
|
||||
b InstructionSegment
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* External interrupt */
|
||||
EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
|
||||
|
||||
@ -708,15 +620,9 @@ DataStoreTLBMiss:
|
||||
EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
#ifdef CONFIG_POWER4
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, altivec_assist_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1800, Trap_18, TAUException, EXC_XFER_STD)
|
||||
#else /* !CONFIG_POWER4 */
|
||||
EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
|
||||
#endif /* CONFIG_POWER4 */
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE)
|
||||
@ -754,28 +660,6 @@ AltiVecUnavailable:
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
DataAccess:
|
||||
EXCEPTION_PROLOG
|
||||
b DataAccessCont
|
||||
|
||||
InstructionAccess:
|
||||
EXCEPTION_PROLOG
|
||||
b InstructionAccessCont
|
||||
|
||||
DataSegment:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
mfspr r4,SPRN_DAR
|
||||
stw r4,_DAR(r11)
|
||||
EXC_XFER_STD(0x380, unknown_exception)
|
||||
|
||||
InstructionSegment:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0x480, unknown_exception)
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Note that the AltiVec support is closely modeled after the FP
|
||||
* support. Changes to one are likely to be applicable to the
|
||||
@ -1048,13 +932,6 @@ __secondary_start_pmac_0:
|
||||
|
||||
.globl __secondary_start
|
||||
__secondary_start:
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
mfmsr r0
|
||||
clrldi r0,r0,1 /* make sure it's in 32-bit mode */
|
||||
SYNC
|
||||
MTMSRD(r0)
|
||||
isync
|
||||
#endif
|
||||
/* Copy some CPU settings from CPU 0 */
|
||||
bl __restore_cpu_setup
|
||||
|
||||
@ -1065,10 +942,6 @@ __secondary_start:
|
||||
lis r3,-KERNELBASE@h
|
||||
bl init_idle_6xx
|
||||
#endif /* CONFIG_6xx */
|
||||
#ifdef CONFIG_POWER4
|
||||
lis r3,-KERNELBASE@h
|
||||
bl init_idle_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
/* get current_thread_info and current */
|
||||
lis r1,secondary_ti@ha
|
||||
@ -1109,12 +982,12 @@ __secondary_start:
|
||||
* Those generic dummy functions are kept for CPUs not
|
||||
* included in CONFIG_6xx
|
||||
*/
|
||||
#if !defined(CONFIG_6xx) && !defined(CONFIG_POWER4)
|
||||
#if !defined(CONFIG_6xx)
|
||||
_GLOBAL(__save_cpu_setup)
|
||||
blr
|
||||
_GLOBAL(__restore_cpu_setup)
|
||||
blr
|
||||
#endif /* !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) */
|
||||
#endif /* !defined(CONFIG_6xx) */
|
||||
|
||||
|
||||
/*
|
||||
@ -1132,11 +1005,6 @@ load_up_mmu:
|
||||
tophys(r6,r6)
|
||||
lwz r6,_SDR1@l(r6)
|
||||
mtspr SPRN_SDR1,r6
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* clear the ASR so we only use the pseudo-segment registers. */
|
||||
li r6,0
|
||||
mtasr r6
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
li r0,16 /* load up segment register values */
|
||||
mtctr r0 /* for context 0 */
|
||||
lis r3,0x2000 /* Ku = 1, VSID = 0 */
|
||||
@ -1145,7 +1013,7 @@ load_up_mmu:
|
||||
addi r3,r3,0x111 /* increment VSID */
|
||||
addis r4,r4,0x1000 /* address of next segment */
|
||||
bdnz 3b
|
||||
#ifndef CONFIG_POWER4
|
||||
|
||||
/* Load the BAT registers with the values set up by MMU_init.
|
||||
MMU_init takes care of whether we're on a 601 or not. */
|
||||
mfpvr r3
|
||||
@ -1158,7 +1026,7 @@ load_up_mmu:
|
||||
LOAD_BAT(1,r3,r4,r5)
|
||||
LOAD_BAT(2,r3,r4,r5)
|
||||
LOAD_BAT(3,r3,r4,r5)
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
blr
|
||||
|
||||
/*
|
||||
@ -1269,9 +1137,6 @@ _GLOBAL(set_context)
|
||||
li r4,0
|
||||
isync
|
||||
3:
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
slbie r4
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mtsrin r3,r4
|
||||
addi r3,r3,0x111 /* next VSID */
|
||||
rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */
|
||||
@ -1358,7 +1223,6 @@ mmu_off:
|
||||
sync
|
||||
RFI
|
||||
|
||||
#ifndef CONFIG_POWER4
|
||||
/*
|
||||
* Use the first pair of BAT registers to map the 1st 16MB
|
||||
* of RAM to KERNELBASE. From this point on we can't safely
|
||||
@ -1366,7 +1230,6 @@ mmu_off:
|
||||
*/
|
||||
initial_bats:
|
||||
lis r11,KERNELBASE@h
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
mfspr r9,SPRN_PVR
|
||||
rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */
|
||||
cmpwi 0,r9,1
|
||||
@ -1381,7 +1244,6 @@ initial_bats:
|
||||
mtspr SPRN_IBAT1L,r10
|
||||
isync
|
||||
blr
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
4: tophys(r8,r11)
|
||||
#ifdef CONFIG_SMP
|
||||
@ -1395,11 +1257,6 @@ initial_bats:
|
||||
ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */
|
||||
#endif /* CONFIG_APUS */
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* clear out the high 32 bits in the BAT */
|
||||
clrldi r11,r11,32
|
||||
clrldi r8,r8,32
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */
|
||||
mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */
|
||||
mtspr SPRN_IBAT0L,r8
|
||||
@ -1432,38 +1289,6 @@ setup_disp_bat:
|
||||
|
||||
#endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */
|
||||
|
||||
#else /* CONFIG_POWER4 */
|
||||
/*
|
||||
* Load up the SDR1 and segment register values now
|
||||
* since we don't have the BATs.
|
||||
* Also make sure we are running in 32-bit mode.
|
||||
*/
|
||||
|
||||
initial_mm_power4:
|
||||
addis r14,r3,_SDR1@ha /* get the value from _SDR1 */
|
||||
lwz r14,_SDR1@l(r14) /* assume hash table below 4GB */
|
||||
mtspr SPRN_SDR1,r14
|
||||
slbia
|
||||
lis r4,0x2000 /* set pseudo-segment reg 12 */
|
||||
ori r5,r4,0x0ccc
|
||||
mtsr 12,r5
|
||||
#if 0
|
||||
ori r5,r4,0x0888 /* set pseudo-segment reg 8 */
|
||||
mtsr 8,r5 /* (for access to serial port) */
|
||||
#endif
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
ori r5,r4,0x0999 /* set pseudo-segment reg 9 */
|
||||
mtsr 9,r5 /* (for access to screen) */
|
||||
#endif
|
||||
mfmsr r0
|
||||
clrldi r0,r0,1
|
||||
sync
|
||||
mtmsr r0
|
||||
isync
|
||||
blr
|
||||
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
#ifdef CONFIG_8260
|
||||
/* Jump into the system reset for the rom.
|
||||
* We first disable the MMU, and then jump to the ROM reset address.
|
||||
|
@ -46,9 +46,6 @@ static void pcibios_fixup_resources(struct pci_dev* dev);
|
||||
static void fixup_broken_pcnet32(struct pci_dev* dev);
|
||||
static int reparent_resources(struct resource *parent, struct resource *res);
|
||||
static void fixup_cpc710_pci64(struct pci_dev* dev);
|
||||
#ifdef CONFIG_PPC_OF
|
||||
static u8* pci_to_OF_bus_map;
|
||||
#endif
|
||||
|
||||
/* By default, we don't re-assign bus numbers.
|
||||
*/
|
||||
@ -625,406 +622,13 @@ pcibios_alloc_controller(void)
|
||||
return hose;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/*
|
||||
* Functions below are used on OpenFirmware machines.
|
||||
*/
|
||||
static void
|
||||
make_one_node_map(struct device_node* node, u8 pci_bus)
|
||||
{
|
||||
int *bus_range;
|
||||
int len;
|
||||
|
||||
if (pci_bus >= pci_bus_count)
|
||||
return;
|
||||
bus_range = (int *) get_property(node, "bus-range", &len);
|
||||
if (bus_range == NULL || len < 2 * sizeof(int)) {
|
||||
printk(KERN_WARNING "Can't get bus-range for %s, "
|
||||
"assuming it starts at 0\n", node->full_name);
|
||||
pci_to_OF_bus_map[pci_bus] = 0;
|
||||
} else
|
||||
pci_to_OF_bus_map[pci_bus] = bus_range[0];
|
||||
|
||||
for (node=node->child; node != 0;node = node->sibling) {
|
||||
struct pci_dev* dev;
|
||||
unsigned int *class_code, *reg;
|
||||
|
||||
class_code = (unsigned int *) get_property(node, "class-code", NULL);
|
||||
if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
|
||||
(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS))
|
||||
continue;
|
||||
reg = (unsigned int *)get_property(node, "reg", NULL);
|
||||
if (!reg)
|
||||
continue;
|
||||
dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff));
|
||||
if (!dev || !dev->subordinate)
|
||||
continue;
|
||||
make_one_node_map(node, dev->subordinate->number);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pcibios_make_OF_bus_map(void)
|
||||
{
|
||||
int i;
|
||||
struct pci_controller* hose;
|
||||
u8* of_prop_map;
|
||||
|
||||
pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL);
|
||||
if (!pci_to_OF_bus_map) {
|
||||
printk(KERN_ERR "Can't allocate OF bus map !\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* We fill the bus map with invalid values, that helps
|
||||
* debugging.
|
||||
*/
|
||||
for (i=0; i<pci_bus_count; i++)
|
||||
pci_to_OF_bus_map[i] = 0xff;
|
||||
|
||||
/* For each hose, we begin searching bridges */
|
||||
for(hose=hose_head; hose; hose=hose->next) {
|
||||
struct device_node* node;
|
||||
node = (struct device_node *)hose->arch_data;
|
||||
if (!node)
|
||||
continue;
|
||||
make_one_node_map(node, hose->first_busno);
|
||||
}
|
||||
of_prop_map = get_property(find_path_device("/"), "pci-OF-bus-map", NULL);
|
||||
if (of_prop_map)
|
||||
memcpy(of_prop_map, pci_to_OF_bus_map, pci_bus_count);
|
||||
#ifdef DEBUG
|
||||
printk("PCI->OF bus map:\n");
|
||||
for (i=0; i<pci_bus_count; i++) {
|
||||
if (pci_to_OF_bus_map[i] == 0xff)
|
||||
continue;
|
||||
printk("%d -> %d\n", i, pci_to_OF_bus_map[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
|
||||
|
||||
static struct device_node*
|
||||
scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
|
||||
{
|
||||
struct device_node* sub_node;
|
||||
|
||||
for (; node != 0;node = node->sibling) {
|
||||
unsigned int *class_code;
|
||||
|
||||
if (filter(node, data))
|
||||
return node;
|
||||
|
||||
/* For PCI<->PCI bridges or CardBus bridges, we go down
|
||||
* Note: some OFs create a parent node "multifunc-device" as
|
||||
* a fake root for all functions of a multi-function device,
|
||||
* we go down them as well.
|
||||
*/
|
||||
class_code = (unsigned int *) get_property(node, "class-code", NULL);
|
||||
if ((!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
|
||||
(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
|
||||
strcmp(node->name, "multifunc-device"))
|
||||
continue;
|
||||
sub_node = scan_OF_pci_childs(node->child, filter, data);
|
||||
if (sub_node)
|
||||
return sub_node;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
scan_OF_pci_childs_iterator(struct device_node* node, void* data)
|
||||
{
|
||||
unsigned int *reg;
|
||||
u8* fdata = (u8*)data;
|
||||
|
||||
reg = (unsigned int *) get_property(node, "reg", NULL);
|
||||
if (reg && ((reg[0] >> 8) & 0xff) == fdata[1]
|
||||
&& ((reg[0] >> 16) & 0xff) == fdata[0])
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_node*
|
||||
scan_OF_childs_for_device(struct device_node* node, u8 bus, u8 dev_fn)
|
||||
{
|
||||
u8 filter_data[2] = {bus, dev_fn};
|
||||
|
||||
return scan_OF_pci_childs(node, scan_OF_pci_childs_iterator, filter_data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Scans the OF tree for a device node matching a PCI device
|
||||
*/
|
||||
struct device_node *
|
||||
pci_busdev_to_OF_node(struct pci_bus *bus, int devfn)
|
||||
{
|
||||
struct pci_controller *hose;
|
||||
struct device_node *node;
|
||||
int busnr;
|
||||
|
||||
if (!have_of)
|
||||
return NULL;
|
||||
|
||||
/* Lookup the hose */
|
||||
busnr = bus->number;
|
||||
hose = pci_bus_to_hose(busnr);
|
||||
if (!hose)
|
||||
return NULL;
|
||||
|
||||
/* Check it has an OF node associated */
|
||||
node = (struct device_node *) hose->arch_data;
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
/* Fixup bus number according to what OF think it is. */
|
||||
if (pci_to_OF_bus_map)
|
||||
busnr = pci_to_OF_bus_map[busnr];
|
||||
if (busnr == 0xff)
|
||||
return NULL;
|
||||
|
||||
/* Now, lookup childs of the hose */
|
||||
return scan_OF_childs_for_device(node->child, busnr, devfn);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_busdev_to_OF_node);
|
||||
|
||||
struct device_node*
|
||||
pci_device_to_OF_node(struct pci_dev *dev)
|
||||
{
|
||||
return pci_busdev_to_OF_node(dev->bus, dev->devfn);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_device_to_OF_node);
|
||||
|
||||
/* This routine is meant to be used early during boot, when the
|
||||
* PCI bus numbers have not yet been assigned, and you need to
|
||||
* issue PCI config cycles to an OF device.
|
||||
* It could also be used to "fix" RTAS config cycles if you want
|
||||
* to set pci_assign_all_buses to 1 and still use RTAS for PCI
|
||||
* config cycles.
|
||||
*/
|
||||
struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node)
|
||||
{
|
||||
if (!have_of)
|
||||
return NULL;
|
||||
while(node) {
|
||||
struct pci_controller* hose;
|
||||
for (hose=hose_head;hose;hose=hose->next)
|
||||
if (hose->arch_data == node)
|
||||
return hose;
|
||||
node=node->parent;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
find_OF_pci_device_filter(struct device_node* node, void* data)
|
||||
{
|
||||
return ((void *)node == data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the PCI device matching a given OF node
|
||||
*/
|
||||
int
|
||||
pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn)
|
||||
{
|
||||
unsigned int *reg;
|
||||
struct pci_controller* hose;
|
||||
struct pci_dev* dev = NULL;
|
||||
|
||||
if (!have_of)
|
||||
return -ENODEV;
|
||||
/* Make sure it's really a PCI device */
|
||||
hose = pci_find_hose_for_OF_device(node);
|
||||
if (!hose || !hose->arch_data)
|
||||
return -ENODEV;
|
||||
if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
|
||||
find_OF_pci_device_filter, (void *)node))
|
||||
return -ENODEV;
|
||||
reg = (unsigned int *) get_property(node, "reg", NULL);
|
||||
if (!reg)
|
||||
return -ENODEV;
|
||||
*bus = (reg[0] >> 16) & 0xff;
|
||||
*devfn = ((reg[0] >> 8) & 0xff);
|
||||
|
||||
/* Ok, here we need some tweak. If we have already renumbered
|
||||
* all busses, we can't rely on the OF bus number any more.
|
||||
* the pci_to_OF_bus_map is not enough as several PCI busses
|
||||
* may match the same OF bus number.
|
||||
*/
|
||||
if (!pci_to_OF_bus_map)
|
||||
return 0;
|
||||
|
||||
for_each_pci_dev(dev)
|
||||
if (pci_to_OF_bus_map[dev->bus->number] == *bus &&
|
||||
dev->devfn == *devfn) {
|
||||
*bus = dev->bus->number;
|
||||
pci_dev_put(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_device_from_OF_node);
|
||||
|
||||
void __init
|
||||
pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
struct device_node *dev, int primary)
|
||||
{
|
||||
static unsigned int static_lc_ranges[256] __initdata;
|
||||
unsigned int *dt_ranges, *lc_ranges, *ranges, *prev;
|
||||
unsigned int size;
|
||||
int rlen = 0, orig_rlen;
|
||||
int memno = 0;
|
||||
struct resource *res;
|
||||
int np, na = prom_n_addr_cells(dev);
|
||||
np = na + 5;
|
||||
|
||||
/* First we try to merge ranges to fix a problem with some pmacs
|
||||
* that can have more than 3 ranges, fortunately using contiguous
|
||||
* addresses -- BenH
|
||||
*/
|
||||
dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
|
||||
if (!dt_ranges)
|
||||
return;
|
||||
/* Sanity check, though hopefully that never happens */
|
||||
if (rlen > sizeof(static_lc_ranges)) {
|
||||
printk(KERN_WARNING "OF ranges property too large !\n");
|
||||
rlen = sizeof(static_lc_ranges);
|
||||
}
|
||||
lc_ranges = static_lc_ranges;
|
||||
memcpy(lc_ranges, dt_ranges, rlen);
|
||||
orig_rlen = rlen;
|
||||
|
||||
/* Let's work on a copy of the "ranges" property instead of damaging
|
||||
* the device-tree image in memory
|
||||
*/
|
||||
ranges = lc_ranges;
|
||||
prev = NULL;
|
||||
while ((rlen -= np * sizeof(unsigned int)) >= 0) {
|
||||
if (prev) {
|
||||
if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
|
||||
(prev[2] + prev[na+4]) == ranges[2] &&
|
||||
(prev[na+2] + prev[na+4]) == ranges[na+2]) {
|
||||
prev[na+4] += ranges[na+4];
|
||||
ranges[0] = 0;
|
||||
ranges += np;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
prev = ranges;
|
||||
ranges += np;
|
||||
}
|
||||
|
||||
/*
|
||||
* The ranges property is laid out as an array of elements,
|
||||
* each of which comprises:
|
||||
* cells 0 - 2: a PCI address
|
||||
* cells 3 or 3+4: a CPU physical address
|
||||
* (size depending on dev->n_addr_cells)
|
||||
* cells 4+5 or 5+6: the size of the range
|
||||
*/
|
||||
ranges = lc_ranges;
|
||||
rlen = orig_rlen;
|
||||
while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) {
|
||||
res = NULL;
|
||||
size = ranges[na+4];
|
||||
switch ((ranges[0] >> 24) & 0x3) {
|
||||
case 1: /* I/O space */
|
||||
if (ranges[2] != 0)
|
||||
break;
|
||||
hose->io_base_phys = ranges[na+2];
|
||||
/* limit I/O space to 16MB */
|
||||
if (size > 0x01000000)
|
||||
size = 0x01000000;
|
||||
hose->io_base_virt = ioremap(ranges[na+2], size);
|
||||
if (primary)
|
||||
isa_io_base = (unsigned long) hose->io_base_virt;
|
||||
res = &hose->io_resource;
|
||||
res->flags = IORESOURCE_IO;
|
||||
res->start = ranges[2];
|
||||
DBG("PCI: IO 0x%lx -> 0x%lx\n",
|
||||
res->start, res->start + size - 1);
|
||||
break;
|
||||
case 2: /* memory space */
|
||||
memno = 0;
|
||||
if (ranges[1] == 0 && ranges[2] == 0
|
||||
&& ranges[na+4] <= (16 << 20)) {
|
||||
/* 1st 16MB, i.e. ISA memory area */
|
||||
if (primary)
|
||||
isa_mem_base = ranges[na+2];
|
||||
memno = 1;
|
||||
}
|
||||
while (memno < 3 && hose->mem_resources[memno].flags)
|
||||
++memno;
|
||||
if (memno == 0)
|
||||
hose->pci_mem_offset = ranges[na+2] - ranges[2];
|
||||
if (memno < 3) {
|
||||
res = &hose->mem_resources[memno];
|
||||
res->flags = IORESOURCE_MEM;
|
||||
if(ranges[0] & 0x40000000)
|
||||
res->flags |= IORESOURCE_PREFETCH;
|
||||
res->start = ranges[na+2];
|
||||
DBG("PCI: MEM[%d] 0x%lx -> 0x%lx\n", memno,
|
||||
res->start, res->start + size - 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (res != NULL) {
|
||||
res->name = dev->full_name;
|
||||
res->end = res->start + size - 1;
|
||||
res->parent = NULL;
|
||||
res->sibling = NULL;
|
||||
res->child = NULL;
|
||||
}
|
||||
ranges += np;
|
||||
}
|
||||
}
|
||||
|
||||
/* We create the "pci-OF-bus-map" property now so it appears in the
|
||||
* /proc device tree
|
||||
*/
|
||||
void __init
|
||||
pci_create_OF_bus_map(void)
|
||||
{
|
||||
struct property* of_prop;
|
||||
|
||||
of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256);
|
||||
if (of_prop && find_path_device("/")) {
|
||||
memset(of_prop, -1, sizeof(struct property) + 256);
|
||||
of_prop->name = "pci-OF-bus-map";
|
||||
of_prop->length = 256;
|
||||
of_prop->value = (unsigned char *)&of_prop[1];
|
||||
prom_add_property(find_path_device("/"), of_prop);
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
struct device_node *np;
|
||||
|
||||
pdev = to_pci_dev (dev);
|
||||
np = pci_device_to_OF_node(pdev);
|
||||
if (np == NULL || np->full_name == NULL)
|
||||
return 0;
|
||||
return sprintf(buf, "%s", np->full_name);
|
||||
}
|
||||
static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL);
|
||||
|
||||
#else /* CONFIG_PPC_OF */
|
||||
void pcibios_make_OF_bus_map(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
|
||||
/* Add sysfs properties */
|
||||
void pcibios_add_platform_entries(struct pci_dev *pdev)
|
||||
{
|
||||
#ifdef CONFIG_PPC_OF
|
||||
device_create_file(&pdev->dev, &dev_attr_devspec);
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
}
|
||||
|
||||
|
||||
|
@ -104,7 +104,7 @@ static char *pmc2_lookup(unsigned long mmcr0)
|
||||
static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0;
|
||||
#if defined(CONFIG_PPC_STD_MMU) && !defined(CONFIG_PPC64BRIDGE)
|
||||
#if defined(CONFIG_PPC_STD_MMU)
|
||||
unsigned int kptes = 0, uptes = 0;
|
||||
PTE *ptr;
|
||||
#endif /* CONFIG_PPC_STD_MMU */
|
||||
@ -133,7 +133,6 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
for (ptr = Hash; ptr < Hash_end; ptr++) {
|
||||
unsigned int mctx, vsid;
|
||||
|
||||
@ -147,7 +146,6 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
else
|
||||
uptes++;
|
||||
}
|
||||
#endif
|
||||
|
||||
seq_printf(m,
|
||||
"PTE Hash Table Information\n"
|
||||
@ -155,20 +153,16 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
"Buckets\t\t: %lu\n"
|
||||
"Address\t\t: %08lx\n"
|
||||
"Entries\t\t: %lu\n"
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
"User ptes\t: %u\n"
|
||||
"Kernel ptes\t: %u\n"
|
||||
"Percent full\t: %lu%%\n"
|
||||
#endif
|
||||
, (unsigned long)(Hash_size>>10),
|
||||
(Hash_size/(sizeof(PTE)*8)),
|
||||
(unsigned long)Hash,
|
||||
Hash_size/sizeof(PTE)
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
, uptes,
|
||||
kptes,
|
||||
((kptes+uptes)*100) / (Hash_size/sizeof(PTE))
|
||||
#endif
|
||||
);
|
||||
|
||||
seq_printf(m,
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <linux/adb.h>
|
||||
#include <linux/cuda.h>
|
||||
#include <linux/pmu.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/irq.h>
|
||||
@ -207,27 +206,6 @@ EXPORT_SYMBOL(adb_try_handler_change);
|
||||
EXPORT_SYMBOL(cuda_request);
|
||||
EXPORT_SYMBOL(cuda_poll);
|
||||
#endif /* CONFIG_ADB_CUDA */
|
||||
#ifdef CONFIG_PPC_OF
|
||||
EXPORT_SYMBOL(find_devices);
|
||||
EXPORT_SYMBOL(find_type_devices);
|
||||
EXPORT_SYMBOL(find_compatible_devices);
|
||||
EXPORT_SYMBOL(find_path_device);
|
||||
EXPORT_SYMBOL(device_is_compatible);
|
||||
EXPORT_SYMBOL(machine_is_compatible);
|
||||
EXPORT_SYMBOL(find_all_nodes);
|
||||
EXPORT_SYMBOL(get_property);
|
||||
EXPORT_SYMBOL(request_OF_resource);
|
||||
EXPORT_SYMBOL(release_OF_resource);
|
||||
EXPORT_SYMBOL(of_find_node_by_name);
|
||||
EXPORT_SYMBOL(of_find_node_by_type);
|
||||
EXPORT_SYMBOL(of_find_compatible_node);
|
||||
EXPORT_SYMBOL(of_find_node_by_path);
|
||||
EXPORT_SYMBOL(of_find_all_nodes);
|
||||
EXPORT_SYMBOL(of_get_parent);
|
||||
EXPORT_SYMBOL(of_get_next_child);
|
||||
EXPORT_SYMBOL(of_node_get);
|
||||
EXPORT_SYMBOL(of_node_put);
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
#if defined(CONFIG_BOOTX_TEXT)
|
||||
EXPORT_SYMBOL(btext_update_display);
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Common prep/chrp boot and setup code.
|
||||
* Common prep boot and setup code.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
@ -72,17 +72,12 @@ unsigned long ISA_DMA_THRESHOLD;
|
||||
unsigned int DMA_MODE_READ;
|
||||
unsigned int DMA_MODE_WRITE;
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
int _machine = 0;
|
||||
EXPORT_SYMBOL(_machine);
|
||||
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
extern void prep_init(unsigned long r3, unsigned long r4,
|
||||
unsigned long r5, unsigned long r6, unsigned long r7);
|
||||
extern void chrp_init(unsigned long r3, unsigned long r4,
|
||||
unsigned long r5, unsigned long r6, unsigned long r7);
|
||||
|
||||
dev_t boot_dev;
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
int have_of;
|
||||
EXPORT_SYMBOL(have_of);
|
||||
@ -319,72 +314,12 @@ early_init(int r3, int r4, int r5)
|
||||
identify_cpu(offset, 0);
|
||||
do_cpu_ftr_fixups(offset);
|
||||
|
||||
#if defined(CONFIG_PPC_OF)
|
||||
reloc_got2(offset);
|
||||
|
||||
/*
|
||||
* don't do anything on prep
|
||||
* for now, don't use bootinfo because it breaks yaboot 0.5
|
||||
* and assume that if we didn't find a magic number, we have OF
|
||||
*/
|
||||
if (*(unsigned long *)(0) != 0xdeadc0de)
|
||||
phys = prom_init(r3, r4, (prom_entry)r5);
|
||||
|
||||
reloc_got2(-offset);
|
||||
#endif
|
||||
|
||||
return phys;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
/*
|
||||
* Assume here that all clock rates are the same in a
|
||||
* smp system. -- Cort
|
||||
*/
|
||||
int
|
||||
of_show_percpuinfo(struct seq_file *m, int i)
|
||||
{
|
||||
struct device_node *cpu_node;
|
||||
u32 *fp;
|
||||
int s;
|
||||
|
||||
cpu_node = find_type_devices("cpu");
|
||||
if (!cpu_node)
|
||||
return 0;
|
||||
for (s = 0; s < i && cpu_node->next; s++)
|
||||
cpu_node = cpu_node->next;
|
||||
fp = (u32 *)get_property(cpu_node, "clock-frequency", NULL);
|
||||
if (fp)
|
||||
seq_printf(m, "clock\t\t: %dMHz\n", *fp / 1000000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init
|
||||
intuit_machine_type(void)
|
||||
{
|
||||
char *model;
|
||||
struct device_node *root;
|
||||
|
||||
/* ask the OF info if we're a chrp or pmac */
|
||||
root = find_path_device("/");
|
||||
if (root != 0) {
|
||||
/* assume pmac unless proven to be chrp -- Cort */
|
||||
_machine = _MACH_Pmac;
|
||||
model = get_property(root, "device_type", NULL);
|
||||
if (model && !strncmp("chrp", model, 4))
|
||||
_machine = _MACH_chrp;
|
||||
else {
|
||||
model = get_property(root, "model", NULL);
|
||||
if (model && !strncmp(model, "IBM", 3))
|
||||
_machine = _MACH_chrp;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
/*
|
||||
* The PPC_MULTIPLATFORM version of platform_init...
|
||||
* The PPC_PREP version of platform_init...
|
||||
*/
|
||||
void __init
|
||||
platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
@ -399,161 +334,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
|
||||
parse_bootinfo(find_bootinfo());
|
||||
|
||||
/* if we didn't get any bootinfo telling us what we are... */
|
||||
if (_machine == 0) {
|
||||
/* prep boot loader tells us if we're prep or not */
|
||||
if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )
|
||||
_machine = _MACH_prep;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
/* not much more to do here, if prep */
|
||||
if (_machine == _MACH_prep) {
|
||||
prep_init(r3, r4, r5, r6, r7);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
have_of = 1;
|
||||
|
||||
/* prom_init has already been called from __start */
|
||||
if (boot_infos)
|
||||
relocate_nodes();
|
||||
|
||||
/* If we aren't PReP, we can find out if we're Pmac
|
||||
* or CHRP with this. */
|
||||
if (_machine == 0)
|
||||
intuit_machine_type();
|
||||
|
||||
/* finish_device_tree may need _machine defined. */
|
||||
finish_device_tree();
|
||||
|
||||
/*
|
||||
* If we were booted via quik, r3 points to the physical
|
||||
* address of the command-line parameters.
|
||||
* If we were booted from an xcoff image (i.e. netbooted or
|
||||
* booted from floppy), we get the command line from the
|
||||
* bootargs property of the /chosen node.
|
||||
* If an initial ramdisk is present, r3 and r4
|
||||
* are used for initrd_start and initrd_size,
|
||||
* otherwise they contain 0xdeadbeef.
|
||||
*/
|
||||
if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) {
|
||||
strlcpy(cmd_line, (char *)r3 + KERNELBASE,
|
||||
sizeof(cmd_line));
|
||||
} else if (boot_infos != 0) {
|
||||
/* booted by BootX - check for ramdisk */
|
||||
if (boot_infos->kernelParamsOffset != 0)
|
||||
strlcpy(cmd_line, (char *) boot_infos
|
||||
+ boot_infos->kernelParamsOffset,
|
||||
sizeof(cmd_line));
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (boot_infos->ramDisk) {
|
||||
initrd_start = (unsigned long) boot_infos
|
||||
+ boot_infos->ramDisk;
|
||||
initrd_end = initrd_start + boot_infos->ramDiskSize;
|
||||
initrd_below_start_ok = 1;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
struct device_node *chosen;
|
||||
char *p;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (r3 && r4 && r4 != 0xdeadbeef) {
|
||||
if (r3 < KERNELBASE)
|
||||
r3 += KERNELBASE;
|
||||
initrd_start = r3;
|
||||
initrd_end = r3 + r4;
|
||||
ROOT_DEV = Root_RAM0;
|
||||
initrd_below_start_ok = 1;
|
||||
}
|
||||
#endif
|
||||
chosen = find_devices("chosen");
|
||||
if (chosen != NULL) {
|
||||
p = get_property(chosen, "bootargs", NULL);
|
||||
if (p && *p) {
|
||||
strlcpy(cmd_line, p, sizeof(cmd_line));
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_ADB
|
||||
if (strstr(cmd_line, "adb_sync")) {
|
||||
extern int __adb_probe_sync;
|
||||
__adb_probe_sync = 1;
|
||||
}
|
||||
#endif /* CONFIG_ADB */
|
||||
|
||||
switch (_machine) {
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
case _MACH_chrp:
|
||||
chrp_init(r3, r4, r5, r6, r7);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
prep_init(r3, r4, r5, r6, r7);
|
||||
}
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
#ifdef CONFIG_SERIAL_CORE_CONSOLE
|
||||
extern char *of_stdout_device;
|
||||
|
||||
static int __init set_preferred_console(void)
|
||||
{
|
||||
struct device_node *prom_stdout;
|
||||
char *name;
|
||||
int offset = 0;
|
||||
|
||||
if (of_stdout_device == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
/* The user has requested a console so this is already set up. */
|
||||
if (strstr(saved_command_line, "console="))
|
||||
return -EBUSY;
|
||||
|
||||
prom_stdout = find_path_device(of_stdout_device);
|
||||
if (!prom_stdout)
|
||||
return -ENODEV;
|
||||
|
||||
name = (char *)get_property(prom_stdout, "name", NULL);
|
||||
if (!name)
|
||||
return -ENODEV;
|
||||
|
||||
if (strcmp(name, "serial") == 0) {
|
||||
int i;
|
||||
u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i);
|
||||
if (i > 8) {
|
||||
switch (reg[1]) {
|
||||
case 0x3f8:
|
||||
offset = 0;
|
||||
break;
|
||||
case 0x2f8:
|
||||
offset = 1;
|
||||
break;
|
||||
case 0x898:
|
||||
offset = 2;
|
||||
break;
|
||||
case 0x890:
|
||||
offset = 3;
|
||||
break;
|
||||
default:
|
||||
/* We dont recognise the serial port */
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(name, "ch-a") == 0)
|
||||
offset = 0;
|
||||
else if (strcmp(name, "ch-b") == 0)
|
||||
offset = 1;
|
||||
else
|
||||
return -ENODEV;
|
||||
return add_preferred_console("ttyS", offset, NULL);
|
||||
}
|
||||
console_initcall(set_preferred_console);
|
||||
#endif /* CONFIG_SERIAL_CORE_CONSOLE */
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
struct bi_record *find_bootinfo(void)
|
||||
{
|
||||
@ -589,23 +372,6 @@ void parse_bootinfo(struct bi_record *rec)
|
||||
initrd_end = data[0] + data[1] + KERNELBASE;
|
||||
break;
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
case BI_MACHTYPE:
|
||||
/* Machine types changed with the merge. Since the
|
||||
* bootinfo are now deprecated, we can just hard code
|
||||
* the appropriate conversion here for when we are
|
||||
* called with yaboot which passes us a machine type
|
||||
* this way.
|
||||
*/
|
||||
switch(data[0]) {
|
||||
case 1: _machine = _MACH_prep; break;
|
||||
case 2: _machine = _MACH_Pmac; break;
|
||||
case 4: _machine = _MACH_chrp; break;
|
||||
default:
|
||||
_machine = data[0];
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case BI_MEMSIZE:
|
||||
boot_mem_size = data[0];
|
||||
break;
|
||||
@ -631,9 +397,6 @@ machine_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
#ifdef CONFIG_6xx
|
||||
ppc_md.power_save = ppc6xx_idle;
|
||||
#endif
|
||||
#ifdef CONFIG_POWER4
|
||||
ppc_md.power_save = power4_idle;
|
||||
#endif
|
||||
|
||||
platform_init(r3, r4, r5, r6, r7);
|
||||
|
||||
@ -799,7 +562,4 @@ void __init setup_arch(char **cmdline_p)
|
||||
if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
|
||||
|
||||
paging_init();
|
||||
|
||||
/* this is for modules since _machine can be a define -- Cort */
|
||||
ppc_md.ppc_machine = _machine;
|
||||
}
|
||||
|
@ -74,12 +74,6 @@ _GLOBAL(hash_page_sync)
|
||||
*/
|
||||
.text
|
||||
_GLOBAL(hash_page)
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
mfmsr r0
|
||||
clrldi r0,r0,1 /* make sure it's in 32-bit mode */
|
||||
MTMSRD(r0)
|
||||
isync
|
||||
#endif
|
||||
tophys(r7,0) /* gets -KERNELBASE into r7 */
|
||||
#ifdef CONFIG_SMP
|
||||
addis r8,r7,mmu_hash_lock@h
|
||||
@ -303,7 +297,6 @@ Hash_base = 0xc0180000
|
||||
Hash_bits = 12 /* e.g. 256kB hash table */
|
||||
Hash_msk = (((1 << Hash_bits) - 1) * 64)
|
||||
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
/* defines for the PTE format for 32-bit PPCs */
|
||||
#define PTE_SIZE 8
|
||||
#define PTEG_SIZE 64
|
||||
@ -317,21 +310,6 @@ Hash_msk = (((1 << Hash_bits) - 1) * 64)
|
||||
#define SET_V(r) oris r,r,PTE_V@h
|
||||
#define CLR_V(r,t) rlwinm r,r,0,1,31
|
||||
|
||||
#else
|
||||
/* defines for the PTE format for 64-bit PPCs */
|
||||
#define PTE_SIZE 16
|
||||
#define PTEG_SIZE 128
|
||||
#define LG_PTEG_SIZE 7
|
||||
#define LDPTEu ldu
|
||||
#define STPTE std
|
||||
#define CMPPTE cmpd
|
||||
#define PTE_H 2
|
||||
#define PTE_V 1
|
||||
#define TST_V(r) andi. r,r,PTE_V
|
||||
#define SET_V(r) ori r,r,PTE_V
|
||||
#define CLR_V(r,t) li t,PTE_V; andc r,r,t
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
#define HASH_LEFT 31-(LG_PTEG_SIZE+Hash_bits-1)
|
||||
#define HASH_RIGHT 31-LG_PTEG_SIZE
|
||||
|
||||
@ -349,14 +327,8 @@ BEGIN_FTR_SECTION
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_NEED_COHERENT)
|
||||
|
||||
/* Construct the high word of the PPC-style PTE (r5) */
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
rlwinm r5,r3,7,1,24 /* put VSID in 0x7fffff80 bits */
|
||||
rlwimi r5,r4,10,26,31 /* put in API (abbrev page index) */
|
||||
#else /* CONFIG_PPC64BRIDGE */
|
||||
clrlwi r3,r3,8 /* reduce vsid to 24 bits */
|
||||
sldi r5,r3,12 /* shift vsid into position */
|
||||
rlwimi r5,r4,16,20,24 /* put in API (abbrev page index) */
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
SET_V(r5) /* set V (valid) bit */
|
||||
|
||||
/* Get the address of the primary PTE group in the hash table (r3) */
|
||||
@ -540,14 +512,8 @@ _GLOBAL(flush_hash_pages)
|
||||
add r3,r3,r0 /* note code below trims to 24 bits */
|
||||
|
||||
/* Construct the high word of the PPC-style PTE (r11) */
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
rlwinm r11,r3,7,1,24 /* put VSID in 0x7fffff80 bits */
|
||||
rlwimi r11,r4,10,26,31 /* put in API (abbrev page index) */
|
||||
#else /* CONFIG_PPC64BRIDGE */
|
||||
clrlwi r3,r3,8 /* reduce vsid to 24 bits */
|
||||
sldi r11,r3,12 /* shift vsid into position */
|
||||
rlwimi r11,r4,16,20,24 /* put in API (abbrev page index) */
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
SET_V(r11) /* set V (valid) bit */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -412,14 +412,6 @@ void __init mem_init(void)
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/* mark the RTAS pages as reserved */
|
||||
if ( rtas_data )
|
||||
for (addr = (ulong)__va(rtas_data);
|
||||
addr < PAGE_ALIGN((ulong)__va(rtas_data)+rtas_size) ;
|
||||
addr += PAGE_SIZE)
|
||||
SetPageReserved(virt_to_page(addr));
|
||||
#endif
|
||||
for (addr = PAGE_OFFSET; addr < (unsigned long)high_memory;
|
||||
addr += PAGE_SIZE) {
|
||||
if (!PageReserved(virt_to_page(addr)))
|
||||
@ -494,11 +486,6 @@ set_phys_avail(unsigned long total_memory)
|
||||
initrd_end - initrd_start, 1);
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/* remove the RTAS pages from the available memory */
|
||||
if (rtas_data)
|
||||
mem_pieces_remove(&phys_avail, rtas_data, rtas_size, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Mark some memory as reserved by removing it from phys_avail. */
|
||||
|
@ -2,7 +2,7 @@
|
||||
* This file contains the routines for handling the MMU on those
|
||||
* PowerPC implementations where the MMU substantially follows the
|
||||
* architecture specification. This includes the 6xx, 7xx, 7xxx,
|
||||
* 8260, and POWER3 implementations but excludes the 8xx and 4xx.
|
||||
* 8260, and 83xx implementations but excludes the 8xx and 4xx.
|
||||
* -- paulus
|
||||
*
|
||||
* Derived from arch/ppc/mm/init.c:
|
||||
|
@ -39,7 +39,7 @@ unsigned long ioremap_base;
|
||||
unsigned long ioremap_bot;
|
||||
int io_bat_index;
|
||||
|
||||
#if defined(CONFIG_6xx) || defined(CONFIG_POWER3)
|
||||
#if defined(CONFIG_6xx)
|
||||
#define HAVE_BATS 1
|
||||
#endif
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
* This file contains the routines for handling the MMU on those
|
||||
* PowerPC implementations where the MMU substantially follows the
|
||||
* architecture specification. This includes the 6xx, 7xx, 7xxx,
|
||||
* 8260, and POWER3 implementations but excludes the 8xx and 4xx.
|
||||
* 8260, and 83xx implementations but excludes the 8xx and 4xx.
|
||||
* -- paulus
|
||||
*
|
||||
* Derived from arch/ppc/mm/init.c:
|
||||
@ -42,11 +42,7 @@ unsigned long _SDR1;
|
||||
|
||||
union ubat { /* BAT register values to be loaded */
|
||||
BAT bat;
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
u64 word[2];
|
||||
#else
|
||||
u32 word[2];
|
||||
#endif
|
||||
} BATS[4][2]; /* 4 pairs of IBAT, DBAT */
|
||||
|
||||
struct batrange { /* stores address ranges mapped by BATs */
|
||||
@ -83,9 +79,6 @@ unsigned long p_mapped_by_bats(unsigned long pa)
|
||||
|
||||
unsigned long __init mmu_mapin_ram(void)
|
||||
{
|
||||
#ifdef CONFIG_POWER4
|
||||
return 0;
|
||||
#else
|
||||
unsigned long tot, bl, done;
|
||||
unsigned long max_size = (256<<20);
|
||||
unsigned long align;
|
||||
@ -122,7 +115,6 @@ unsigned long __init mmu_mapin_ram(void)
|
||||
}
|
||||
|
||||
return done;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -205,27 +197,10 @@ void __init MMU_init_hw(void)
|
||||
|
||||
if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105);
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
#define LG_HPTEG_SIZE 7 /* 128 bytes per HPTEG */
|
||||
#define SDR1_LOW_BITS (lg_n_hpteg - 11)
|
||||
#define MIN_N_HPTEG 2048 /* min 256kB hash table */
|
||||
#else
|
||||
#define LG_HPTEG_SIZE 6 /* 64 bytes per HPTEG */
|
||||
#define SDR1_LOW_BITS ((n_hpteg - 1) >> 10)
|
||||
#define MIN_N_HPTEG 1024 /* min 64kB hash table */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_POWER4
|
||||
/* The hash table has already been allocated and initialized
|
||||
in prom.c */
|
||||
n_hpteg = Hash_size >> LG_HPTEG_SIZE;
|
||||
lg_n_hpteg = __ilog2(n_hpteg);
|
||||
|
||||
/* Remove the hash table from the available memory */
|
||||
if (Hash)
|
||||
reserve_phys_mem(__pa(Hash), Hash_size);
|
||||
|
||||
#else /* CONFIG_POWER4 */
|
||||
/*
|
||||
* Allow 1 HPTE (1/8 HPTEG) for each page of memory.
|
||||
* This is less than the recommended amount, but then
|
||||
@ -248,7 +223,6 @@ void __init MMU_init_hw(void)
|
||||
Hash = mem_pieces_find(Hash_size, Hash_size);
|
||||
cacheable_memzero(Hash, Hash_size);
|
||||
_SDR1 = __pa(Hash) | SDR1_LOW_BITS;
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
Hash_end = (PTE *) ((unsigned long)Hash + Hash_size);
|
||||
|
||||
|
@ -2,18 +2,10 @@
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
# Extra CFLAGS so we don't have to do relative includes
|
||||
CFLAGS_chrp_setup.o += -Iarch/$(ARCH)/mm
|
||||
|
||||
obj-$(CONFIG_APUS) += apus_setup.o
|
||||
ifeq ($(CONFIG_APUS),y)
|
||||
obj-$(CONFIG_PCI) += apus_pci.o
|
||||
endif
|
||||
obj-$(CONFIG_PPC_CHRP) += chrp_setup.o chrp_time.o chrp_pci.o \
|
||||
chrp_pegasos_eth.o
|
||||
ifeq ($(CONFIG_PPC_CHRP),y)
|
||||
obj-$(CONFIG_NVRAM) += chrp_nvram.o
|
||||
endif
|
||||
obj-$(CONFIG_PPC_PREP) += prep_pci.o prep_setup.o
|
||||
obj-$(CONFIG_PREP_RESIDUAL) += residual.o
|
||||
obj-$(CONFIG_PQ2ADS) += pq2ads.o
|
||||
@ -40,7 +32,3 @@ obj-$(CONFIG_EV64360) += ev64360.o
|
||||
obj-$(CONFIG_MPC86XADS) += mpc866ads_setup.o
|
||||
obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o
|
||||
obj-$(CONFIG_ADS8272) += mpc8272ads_setup.o
|
||||
|
||||
ifeq ($(CONFIG_SMP),y)
|
||||
obj-$(CONFIG_PPC_CHRP) += chrp_smp.o
|
||||
endif
|
||||
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* c 2001 PPC 64 Team, IBM Corp
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* /dev/nvram driver for PPC
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
|
||||
static unsigned int nvram_size;
|
||||
static unsigned char nvram_buf[4];
|
||||
static DEFINE_SPINLOCK(nvram_lock);
|
||||
|
||||
static unsigned char chrp_nvram_read(int addr)
|
||||
{
|
||||
unsigned long done, flags;
|
||||
unsigned char ret;
|
||||
|
||||
if (addr >= nvram_size) {
|
||||
printk(KERN_DEBUG "%s: read addr %d > nvram_size %u\n",
|
||||
current->comm, addr, nvram_size);
|
||||
return 0xff;
|
||||
}
|
||||
spin_lock_irqsave(&nvram_lock, flags);
|
||||
if ((call_rtas("nvram-fetch", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
ret = 0xff;
|
||||
else
|
||||
ret = nvram_buf[0];
|
||||
spin_unlock_irqrestore(&nvram_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void chrp_nvram_write(int addr, unsigned char val)
|
||||
{
|
||||
unsigned long done, flags;
|
||||
|
||||
if (addr >= nvram_size) {
|
||||
printk(KERN_DEBUG "%s: write addr %d > nvram_size %u\n",
|
||||
current->comm, addr, nvram_size);
|
||||
return;
|
||||
}
|
||||
spin_lock_irqsave(&nvram_lock, flags);
|
||||
nvram_buf[0] = val;
|
||||
if ((call_rtas("nvram-store", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
printk(KERN_DEBUG "rtas IO error storing 0x%02x at %d", val, addr);
|
||||
spin_unlock_irqrestore(&nvram_lock, flags);
|
||||
}
|
||||
|
||||
void __init chrp_nvram_init(void)
|
||||
{
|
||||
struct device_node *nvram;
|
||||
unsigned int *nbytes_p, proplen;
|
||||
|
||||
nvram = of_find_node_by_type(NULL, "nvram");
|
||||
if (nvram == NULL)
|
||||
return;
|
||||
|
||||
nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen);
|
||||
if (nbytes_p == NULL || proplen != sizeof(unsigned int))
|
||||
return;
|
||||
|
||||
nvram_size = *nbytes_p;
|
||||
|
||||
printk(KERN_INFO "CHRP nvram contains %u bytes\n", nvram_size);
|
||||
of_node_put(nvram);
|
||||
|
||||
ppc_md.nvram_read_val = chrp_nvram_read;
|
||||
ppc_md.nvram_write_val = chrp_nvram_write;
|
||||
|
||||
return;
|
||||
}
|
@ -1,309 +0,0 @@
|
||||
/*
|
||||
* CHRP pci routines.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ide.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/hydra.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/gg2.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/open_pic.h>
|
||||
|
||||
/* LongTrail */
|
||||
void __iomem *gg2_pci_config_base;
|
||||
|
||||
/*
|
||||
* The VLSI Golden Gate II has only 512K of PCI configuration space, so we
|
||||
* limit the bus number to 3 bits
|
||||
*/
|
||||
|
||||
int gg2_read_config(struct pci_bus *bus, unsigned int devfn, int off,
|
||||
int len, u32 *val)
|
||||
{
|
||||
volatile void __iomem *cfg_data;
|
||||
struct pci_controller *hose = bus->sysdata;
|
||||
|
||||
if (bus->number > 7)
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
/*
|
||||
* Note: the caller has already checked that off is
|
||||
* suitably aligned and that len is 1, 2 or 4.
|
||||
*/
|
||||
cfg_data = hose->cfg_data + ((bus->number<<16) | (devfn<<8) | off);
|
||||
switch (len) {
|
||||
case 1:
|
||||
*val = in_8(cfg_data);
|
||||
break;
|
||||
case 2:
|
||||
*val = in_le16(cfg_data);
|
||||
break;
|
||||
default:
|
||||
*val = in_le32(cfg_data);
|
||||
break;
|
||||
}
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
int gg2_write_config(struct pci_bus *bus, unsigned int devfn, int off,
|
||||
int len, u32 val)
|
||||
{
|
||||
volatile void __iomem *cfg_data;
|
||||
struct pci_controller *hose = bus->sysdata;
|
||||
|
||||
if (bus->number > 7)
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
/*
|
||||
* Note: the caller has already checked that off is
|
||||
* suitably aligned and that len is 1, 2 or 4.
|
||||
*/
|
||||
cfg_data = hose->cfg_data + ((bus->number<<16) | (devfn<<8) | off);
|
||||
switch (len) {
|
||||
case 1:
|
||||
out_8(cfg_data, val);
|
||||
break;
|
||||
case 2:
|
||||
out_le16(cfg_data, val);
|
||||
break;
|
||||
default:
|
||||
out_le32(cfg_data, val);
|
||||
break;
|
||||
}
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static struct pci_ops gg2_pci_ops =
|
||||
{
|
||||
gg2_read_config,
|
||||
gg2_write_config
|
||||
};
|
||||
|
||||
/*
|
||||
* Access functions for PCI config space using RTAS calls.
|
||||
*/
|
||||
int
|
||||
rtas_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||
int len, u32 *val)
|
||||
{
|
||||
struct pci_controller *hose = bus->sysdata;
|
||||
unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
|
||||
| (((bus->number - hose->first_busno) & 0xff) << 16)
|
||||
| (hose->index << 24);
|
||||
unsigned long ret = ~0UL;
|
||||
int rval;
|
||||
|
||||
rval = call_rtas("read-pci-config", 2, 2, &ret, addr, len);
|
||||
*val = ret;
|
||||
return rval? PCIBIOS_DEVICE_NOT_FOUND: PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
int
|
||||
rtas_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||
int len, u32 val)
|
||||
{
|
||||
struct pci_controller *hose = bus->sysdata;
|
||||
unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
|
||||
| (((bus->number - hose->first_busno) & 0xff) << 16)
|
||||
| (hose->index << 24);
|
||||
int rval;
|
||||
|
||||
rval = call_rtas("write-pci-config", 3, 1, NULL, addr, len, val);
|
||||
return rval? PCIBIOS_DEVICE_NOT_FOUND: PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static struct pci_ops rtas_pci_ops =
|
||||
{
|
||||
rtas_read_config,
|
||||
rtas_write_config
|
||||
};
|
||||
|
||||
volatile struct Hydra __iomem *Hydra = NULL;
|
||||
|
||||
int __init
|
||||
hydra_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = find_devices("mac-io");
|
||||
if (np == NULL || np->n_addrs == 0)
|
||||
return 0;
|
||||
Hydra = ioremap(np->addrs[0].address, np->addrs[0].size);
|
||||
printk("Hydra Mac I/O at %x\n", np->addrs[0].address);
|
||||
printk("Hydra Feature_Control was %x",
|
||||
in_le32(&Hydra->Feature_Control));
|
||||
out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN |
|
||||
HYDRA_FC_SCSI_CELL_EN |
|
||||
HYDRA_FC_SCCA_ENABLE |
|
||||
HYDRA_FC_SCCB_ENABLE |
|
||||
HYDRA_FC_ARB_BYPASS |
|
||||
HYDRA_FC_MPIC_ENABLE |
|
||||
HYDRA_FC_SLOW_SCC_PCLK |
|
||||
HYDRA_FC_MPIC_IS_MASTER));
|
||||
printk(", now %x\n", in_le32(&Hydra->Feature_Control));
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __init
|
||||
chrp_pcibios_fixup(void)
|
||||
{
|
||||
struct pci_dev *dev = NULL;
|
||||
struct device_node *np;
|
||||
|
||||
/* PCI interrupts are controlled by the OpenPIC */
|
||||
for_each_pci_dev(dev) {
|
||||
np = pci_device_to_OF_node(dev);
|
||||
if ((np != 0) && (np->n_intrs > 0) && (np->intrs[0].line != 0))
|
||||
dev->irq = np->intrs[0].line;
|
||||
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
|
||||
}
|
||||
}
|
||||
|
||||
#define PRG_CL_RESET_VALID 0x00010000
|
||||
|
||||
static void __init
|
||||
setup_python(struct pci_controller *hose, struct device_node *dev)
|
||||
{
|
||||
u32 __iomem *reg;
|
||||
u32 val;
|
||||
unsigned long addr = dev->addrs[0].address;
|
||||
|
||||
setup_indirect_pci(hose, addr + 0xf8000, addr + 0xf8010);
|
||||
|
||||
/* Clear the magic go-slow bit */
|
||||
reg = ioremap(dev->addrs[0].address + 0xf6000, 0x40);
|
||||
val = in_be32(®[12]);
|
||||
if (val & PRG_CL_RESET_VALID) {
|
||||
out_be32(®[12], val & ~PRG_CL_RESET_VALID);
|
||||
in_be32(®[12]);
|
||||
}
|
||||
iounmap(reg);
|
||||
}
|
||||
|
||||
/* Marvell Discovery II based Pegasos 2 */
|
||||
static void __init setup_peg2(struct pci_controller *hose, struct device_node *dev)
|
||||
{
|
||||
struct device_node *root = find_path_device("/");
|
||||
struct device_node *rtas;
|
||||
|
||||
rtas = of_find_node_by_name (root, "rtas");
|
||||
if (rtas) {
|
||||
hose->ops = &rtas_pci_ops;
|
||||
} else {
|
||||
printk ("RTAS supporting Pegasos OF not found, please upgrade"
|
||||
" your firmware\n");
|
||||
}
|
||||
pci_assign_all_buses = 1;
|
||||
}
|
||||
|
||||
void __init
|
||||
chrp_find_bridges(void)
|
||||
{
|
||||
struct device_node *dev;
|
||||
int *bus_range;
|
||||
int len, index = -1;
|
||||
struct pci_controller *hose;
|
||||
unsigned int *dma;
|
||||
char *model, *machine;
|
||||
int is_longtrail = 0, is_mot = 0, is_pegasos = 0;
|
||||
struct device_node *root = find_path_device("/");
|
||||
|
||||
/*
|
||||
* The PCI host bridge nodes on some machines don't have
|
||||
* properties to adequately identify them, so we have to
|
||||
* look at what sort of machine this is as well.
|
||||
*/
|
||||
machine = get_property(root, "model", NULL);
|
||||
if (machine != NULL) {
|
||||
is_longtrail = strncmp(machine, "IBM,LongTrail", 13) == 0;
|
||||
is_mot = strncmp(machine, "MOT", 3) == 0;
|
||||
if (strncmp(machine, "Pegasos2", 8) == 0)
|
||||
is_pegasos = 2;
|
||||
else if (strncmp(machine, "Pegasos", 7) == 0)
|
||||
is_pegasos = 1;
|
||||
}
|
||||
for (dev = root->child; dev != NULL; dev = dev->sibling) {
|
||||
if (dev->type == NULL || strcmp(dev->type, "pci") != 0)
|
||||
continue;
|
||||
++index;
|
||||
/* The GG2 bridge on the LongTrail doesn't have an address */
|
||||
if (dev->n_addrs < 1 && !is_longtrail) {
|
||||
printk(KERN_WARNING "Can't use %s: no address\n",
|
||||
dev->full_name);
|
||||
continue;
|
||||
}
|
||||
bus_range = (int *) get_property(dev, "bus-range", &len);
|
||||
if (bus_range == NULL || len < 2 * sizeof(int)) {
|
||||
printk(KERN_WARNING "Can't get bus-range for %s\n",
|
||||
dev->full_name);
|
||||
continue;
|
||||
}
|
||||
if (bus_range[1] == bus_range[0])
|
||||
printk(KERN_INFO "PCI bus %d", bus_range[0]);
|
||||
else
|
||||
printk(KERN_INFO "PCI buses %d..%d",
|
||||
bus_range[0], bus_range[1]);
|
||||
printk(" controlled by %s", dev->type);
|
||||
if (dev->n_addrs > 0)
|
||||
printk(" at %x", dev->addrs[0].address);
|
||||
printk("\n");
|
||||
|
||||
hose = pcibios_alloc_controller();
|
||||
if (!hose) {
|
||||
printk("Can't allocate PCI controller structure for %s\n",
|
||||
dev->full_name);
|
||||
continue;
|
||||
}
|
||||
hose->arch_data = dev;
|
||||
hose->first_busno = bus_range[0];
|
||||
hose->last_busno = bus_range[1];
|
||||
|
||||
model = get_property(dev, "model", NULL);
|
||||
if (model == NULL)
|
||||
model = "<none>";
|
||||
if (device_is_compatible(dev, "IBM,python")) {
|
||||
setup_python(hose, dev);
|
||||
} else if (is_mot
|
||||
|| strncmp(model, "Motorola, Grackle", 17) == 0) {
|
||||
setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
|
||||
} else if (is_longtrail) {
|
||||
void __iomem *p = ioremap(GG2_PCI_CONFIG_BASE, 0x80000);
|
||||
hose->ops = &gg2_pci_ops;
|
||||
hose->cfg_data = p;
|
||||
gg2_pci_config_base = p;
|
||||
} else if (is_pegasos == 1) {
|
||||
setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc);
|
||||
} else if (is_pegasos == 2) {
|
||||
setup_peg2(hose, dev);
|
||||
} else {
|
||||
printk("No methods for %s (model %s), using RTAS\n",
|
||||
dev->full_name, model);
|
||||
hose->ops = &rtas_pci_ops;
|
||||
}
|
||||
|
||||
pci_process_bridge_OF_ranges(hose, dev, index == 0);
|
||||
|
||||
/* check the first bridge for a property that we can
|
||||
use to set pci_dram_offset */
|
||||
dma = (unsigned int *)
|
||||
get_property(dev, "ibm,dma-ranges", &len);
|
||||
if (index == 0 && dma != NULL && len >= 6 * sizeof(*dma)) {
|
||||
pci_dram_offset = dma[2] - dma[3];
|
||||
printk("pci_dram_offset = %lx\n", pci_dram_offset);
|
||||
}
|
||||
}
|
||||
|
||||
/* Do not fixup interrupts from OF tree on pegasos */
|
||||
if (is_pegasos == 0)
|
||||
ppc_md.pcibios_fixup = chrp_pcibios_fixup;
|
||||
}
|
@ -1,211 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005 Sven Luther <sl@bplan-gmbh.de>
|
||||
* Thanks to :
|
||||
* Dale Farnsworth <dale@farnsworth.org>
|
||||
* Mark A. Greer <mgreer@mvista.com>
|
||||
* Nicolas DET <nd@bplan-gmbh.de>
|
||||
* Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
* And anyone else who helped me on this.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mv643xx.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#define PEGASOS2_MARVELL_REGBASE (0xf1000000)
|
||||
#define PEGASOS2_MARVELL_REGSIZE (0x00004000)
|
||||
#define PEGASOS2_SRAM_BASE (0xf2000000)
|
||||
#define PEGASOS2_SRAM_SIZE (256*1024)
|
||||
|
||||
#define PEGASOS2_SRAM_BASE_ETH0 (PEGASOS2_SRAM_BASE)
|
||||
#define PEGASOS2_SRAM_BASE_ETH1 (PEGASOS2_SRAM_BASE_ETH0 + (PEGASOS2_SRAM_SIZE / 2) )
|
||||
|
||||
|
||||
#define PEGASOS2_SRAM_RXRING_SIZE (PEGASOS2_SRAM_SIZE/4)
|
||||
#define PEGASOS2_SRAM_TXRING_SIZE (PEGASOS2_SRAM_SIZE/4)
|
||||
|
||||
#undef BE_VERBOSE
|
||||
|
||||
static struct resource mv643xx_eth_shared_resources[] = {
|
||||
[0] = {
|
||||
.name = "ethernet shared base",
|
||||
.start = 0xf1000000 + MV643XX_ETH_SHARED_REGS,
|
||||
.end = 0xf1000000 + MV643XX_ETH_SHARED_REGS +
|
||||
MV643XX_ETH_SHARED_REGS_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device mv643xx_eth_shared_device = {
|
||||
.name = MV643XX_ETH_SHARED_NAME,
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources),
|
||||
.resource = mv643xx_eth_shared_resources,
|
||||
};
|
||||
|
||||
static struct resource mv643xx_eth0_resources[] = {
|
||||
[0] = {
|
||||
.name = "eth0 irq",
|
||||
.start = 9,
|
||||
.end = 9,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static struct mv643xx_eth_platform_data eth0_pd = {
|
||||
.tx_sram_addr = PEGASOS2_SRAM_BASE_ETH0,
|
||||
.tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE,
|
||||
.tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16,
|
||||
|
||||
.rx_sram_addr = PEGASOS2_SRAM_BASE_ETH0 + PEGASOS2_SRAM_TXRING_SIZE,
|
||||
.rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE,
|
||||
.rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16,
|
||||
};
|
||||
|
||||
static struct platform_device eth0_device = {
|
||||
.name = MV643XX_ETH_NAME,
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(mv643xx_eth0_resources),
|
||||
.resource = mv643xx_eth0_resources,
|
||||
.dev = {
|
||||
.platform_data = ð0_pd,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource mv643xx_eth1_resources[] = {
|
||||
[0] = {
|
||||
.name = "eth1 irq",
|
||||
.start = 9,
|
||||
.end = 9,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data eth1_pd = {
|
||||
.tx_sram_addr = PEGASOS2_SRAM_BASE_ETH1,
|
||||
.tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE,
|
||||
.tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16,
|
||||
|
||||
.rx_sram_addr = PEGASOS2_SRAM_BASE_ETH1 + PEGASOS2_SRAM_TXRING_SIZE,
|
||||
.rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE,
|
||||
.rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16,
|
||||
};
|
||||
|
||||
static struct platform_device eth1_device = {
|
||||
.name = MV643XX_ETH_NAME,
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(mv643xx_eth1_resources),
|
||||
.resource = mv643xx_eth1_resources,
|
||||
.dev = {
|
||||
.platform_data = ð1_pd,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *mv643xx_eth_pd_devs[] __initdata = {
|
||||
&mv643xx_eth_shared_device,
|
||||
ð0_device,
|
||||
ð1_device,
|
||||
};
|
||||
|
||||
/***********/
|
||||
/***********/
|
||||
#define MV_READ(offset,val) { val = readl(mv643xx_reg_base + offset); }
|
||||
#define MV_WRITE(offset,data) writel(data, mv643xx_reg_base + offset)
|
||||
|
||||
static void __iomem *mv643xx_reg_base;
|
||||
|
||||
static int Enable_SRAM(void)
|
||||
{
|
||||
u32 ALong;
|
||||
|
||||
if (mv643xx_reg_base == NULL)
|
||||
mv643xx_reg_base = ioremap(PEGASOS2_MARVELL_REGBASE,
|
||||
PEGASOS2_MARVELL_REGSIZE);
|
||||
|
||||
if (mv643xx_reg_base == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
#ifdef BE_VERBOSE
|
||||
printk("Pegasos II/Marvell MV64361: register remapped from %p to %p\n",
|
||||
(void *)PEGASOS2_MARVELL_REGBASE, (void *)mv643xx_reg_base);
|
||||
#endif
|
||||
|
||||
MV_WRITE(MV64340_SRAM_CONFIG, 0);
|
||||
|
||||
MV_WRITE(MV64340_INTEGRATED_SRAM_BASE_ADDR, PEGASOS2_SRAM_BASE >> 16);
|
||||
|
||||
MV_READ(MV64340_BASE_ADDR_ENABLE, ALong);
|
||||
ALong &= ~(1 << 19);
|
||||
MV_WRITE(MV64340_BASE_ADDR_ENABLE, ALong);
|
||||
|
||||
ALong = 0x02;
|
||||
ALong |= PEGASOS2_SRAM_BASE & 0xffff0000;
|
||||
MV_WRITE(MV643XX_ETH_BAR_4, ALong);
|
||||
|
||||
MV_WRITE(MV643XX_ETH_SIZE_REG_4, (PEGASOS2_SRAM_SIZE-1) & 0xffff0000);
|
||||
|
||||
MV_READ(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong);
|
||||
ALong &= ~(1 << 4);
|
||||
MV_WRITE(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong);
|
||||
|
||||
#ifdef BE_VERBOSE
|
||||
printk("Pegasos II/Marvell MV64361: register unmapped\n");
|
||||
printk("Pegasos II/Marvell MV64361: SRAM at %p, size=%x\n", (void*) PEGASOS2_SRAM_BASE, PEGASOS2_SRAM_SIZE);
|
||||
#endif
|
||||
|
||||
iounmap(mv643xx_reg_base);
|
||||
mv643xx_reg_base = NULL;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/***********/
|
||||
/***********/
|
||||
int mv643xx_eth_add_pds(void)
|
||||
{
|
||||
int ret = 0;
|
||||
static struct pci_device_id pci_marvell_mv64360[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_MV64360) },
|
||||
{ }
|
||||
};
|
||||
|
||||
#ifdef BE_VERBOSE
|
||||
printk("Pegasos II/Marvell MV64361: init\n");
|
||||
#endif
|
||||
|
||||
if (pci_dev_present(pci_marvell_mv64360)) {
|
||||
ret = platform_add_devices(mv643xx_eth_pd_devs,
|
||||
ARRAY_SIZE(mv643xx_eth_pd_devs));
|
||||
|
||||
if ( Enable_SRAM() < 0)
|
||||
{
|
||||
eth0_pd.tx_sram_addr = 0;
|
||||
eth0_pd.tx_sram_size = 0;
|
||||
eth0_pd.rx_sram_addr = 0;
|
||||
eth0_pd.rx_sram_size = 0;
|
||||
|
||||
eth1_pd.tx_sram_addr = 0;
|
||||
eth1_pd.tx_sram_size = 0;
|
||||
eth1_pd.rx_sram_addr = 0;
|
||||
eth1_pd.rx_sram_size = 0;
|
||||
|
||||
#ifdef BE_VERBOSE
|
||||
printk("Pegasos II/Marvell MV64361: Can't enable the "
|
||||
"SRAM\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BE_VERBOSE
|
||||
printk("Pegasos II/Marvell MV64361: init is over\n");
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
device_initcall(mv643xx_eth_add_pds);
|
@ -1,669 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 1995 Linus Torvalds
|
||||
* Adapted from 'alpha' version by Gary Thomas
|
||||
* Modified by Cort Dougan (cort@cs.nmt.edu)
|
||||
*/
|
||||
|
||||
/*
|
||||
* bootup setup stuff..
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/a.out.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/gg2.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/dma.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/hydra.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/btext.h>
|
||||
#include <asm/i8259.h>
|
||||
#include <asm/open_pic.h>
|
||||
#include <asm/xmon.h>
|
||||
#include "mem_pieces.h"
|
||||
|
||||
unsigned long chrp_get_rtc_time(void);
|
||||
int chrp_set_rtc_time(unsigned long nowtime);
|
||||
void chrp_calibrate_decr(void);
|
||||
long chrp_time_init(void);
|
||||
|
||||
void chrp_find_bridges(void);
|
||||
void chrp_event_scan(void);
|
||||
void rtas_display_progress(char *, unsigned short);
|
||||
void rtas_indicator_progress(char *, unsigned short);
|
||||
void btext_progress(char *, unsigned short);
|
||||
|
||||
extern int of_show_percpuinfo(struct seq_file *, int);
|
||||
|
||||
int _chrp_type;
|
||||
EXPORT_SYMBOL(_chrp_type);
|
||||
|
||||
/*
|
||||
* XXX this should be in xmon.h, but putting it there means xmon.h
|
||||
* has to include <linux/interrupt.h> (to get irqreturn_t), which
|
||||
* causes all sorts of problems. -- paulus
|
||||
*/
|
||||
extern irqreturn_t xmon_irq(int, void *, struct pt_regs *);
|
||||
|
||||
extern dev_t boot_dev;
|
||||
|
||||
extern PTE *Hash, *Hash_end;
|
||||
extern unsigned long Hash_size, Hash_mask;
|
||||
extern int probingmem;
|
||||
extern unsigned long loops_per_jiffy;
|
||||
static int max_width;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern struct smp_ops_t chrp_smp_ops;
|
||||
#endif
|
||||
|
||||
static const char *gg2_memtypes[4] = {
|
||||
"FPM", "SDRAM", "EDO", "BEDO"
|
||||
};
|
||||
static const char *gg2_cachesizes[4] = {
|
||||
"256 KB", "512 KB", "1 MB", "Reserved"
|
||||
};
|
||||
static const char *gg2_cachetypes[4] = {
|
||||
"Asynchronous", "Reserved", "Flow-Through Synchronous",
|
||||
"Pipelined Synchronous"
|
||||
};
|
||||
static const char *gg2_cachemodes[4] = {
|
||||
"Disabled", "Write-Through", "Copy-Back", "Transparent Mode"
|
||||
};
|
||||
|
||||
int
|
||||
chrp_show_cpuinfo(struct seq_file *m)
|
||||
{
|
||||
int i, sdramen;
|
||||
unsigned int t;
|
||||
struct device_node *root;
|
||||
const char *model = "";
|
||||
|
||||
root = find_path_device("/");
|
||||
if (root)
|
||||
model = get_property(root, "model", NULL);
|
||||
seq_printf(m, "machine\t\t: CHRP %s\n", model);
|
||||
|
||||
/* longtrail (goldengate) stuff */
|
||||
if (!strncmp(model, "IBM,LongTrail", 13)) {
|
||||
/* VLSI VAS96011/12 `Golden Gate 2' */
|
||||
/* Memory banks */
|
||||
sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL)
|
||||
>>31) & 1;
|
||||
for (i = 0; i < (sdramen ? 4 : 6); i++) {
|
||||
t = in_le32(gg2_pci_config_base+
|
||||
GG2_PCI_DRAM_BANK0+
|
||||
i*4);
|
||||
if (!(t & 1))
|
||||
continue;
|
||||
switch ((t>>8) & 0x1f) {
|
||||
case 0x1f:
|
||||
model = "4 MB";
|
||||
break;
|
||||
case 0x1e:
|
||||
model = "8 MB";
|
||||
break;
|
||||
case 0x1c:
|
||||
model = "16 MB";
|
||||
break;
|
||||
case 0x18:
|
||||
model = "32 MB";
|
||||
break;
|
||||
case 0x10:
|
||||
model = "64 MB";
|
||||
break;
|
||||
case 0x00:
|
||||
model = "128 MB";
|
||||
break;
|
||||
default:
|
||||
model = "Reserved";
|
||||
break;
|
||||
}
|
||||
seq_printf(m, "memory bank %d\t: %s %s\n", i, model,
|
||||
gg2_memtypes[sdramen ? 1 : ((t>>1) & 3)]);
|
||||
}
|
||||
/* L2 cache */
|
||||
t = in_le32(gg2_pci_config_base+GG2_PCI_CC_CTRL);
|
||||
seq_printf(m, "board l2\t: %s %s (%s)\n",
|
||||
gg2_cachesizes[(t>>7) & 3],
|
||||
gg2_cachetypes[(t>>2) & 3],
|
||||
gg2_cachemodes[t & 3]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fixes for the National Semiconductor PC78308VUL SuperI/O
|
||||
*
|
||||
* Some versions of Open Firmware incorrectly initialize the IRQ settings
|
||||
* for keyboard and mouse
|
||||
*/
|
||||
static inline void __init sio_write(u8 val, u8 index)
|
||||
{
|
||||
outb(index, 0x15c);
|
||||
outb(val, 0x15d);
|
||||
}
|
||||
|
||||
static inline u8 __init sio_read(u8 index)
|
||||
{
|
||||
outb(index, 0x15c);
|
||||
return inb(0x15d);
|
||||
}
|
||||
|
||||
static void __init sio_fixup_irq(const char *name, u8 device, u8 level,
|
||||
u8 type)
|
||||
{
|
||||
u8 level0, type0, active;
|
||||
|
||||
/* select logical device */
|
||||
sio_write(device, 0x07);
|
||||
active = sio_read(0x30);
|
||||
level0 = sio_read(0x70);
|
||||
type0 = sio_read(0x71);
|
||||
if (level0 != level || type0 != type || !active) {
|
||||
printk(KERN_WARNING "sio: %s irq level %d, type %d, %sactive: "
|
||||
"remapping to level %d, type %d, active\n",
|
||||
name, level0, type0, !active ? "in" : "", level, type);
|
||||
sio_write(0x01, 0x30);
|
||||
sio_write(level, 0x70);
|
||||
sio_write(type, 0x71);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init sio_init(void)
|
||||
{
|
||||
struct device_node *root;
|
||||
|
||||
if ((root = find_path_device("/")) &&
|
||||
!strncmp(get_property(root, "model", NULL), "IBM,LongTrail", 13)) {
|
||||
/* logical device 0 (KBC/Keyboard) */
|
||||
sio_fixup_irq("keyboard", 0, 1, 2);
|
||||
/* select logical device 1 (KBC/Mouse) */
|
||||
sio_fixup_irq("mouse", 1, 12, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void __init pegasos_set_l2cr(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
/* On Pegasos, enable the l2 cache if needed, as the OF forgets it */
|
||||
if (_chrp_type != _CHRP_Pegasos)
|
||||
return;
|
||||
|
||||
/* Enable L2 cache if needed */
|
||||
np = find_type_devices("cpu");
|
||||
if (np != NULL) {
|
||||
unsigned int *l2cr = (unsigned int *)
|
||||
get_property (np, "l2cr", NULL);
|
||||
if (l2cr == NULL) {
|
||||
printk ("Pegasos l2cr : no cpu l2cr property found\n");
|
||||
return;
|
||||
}
|
||||
if (!((*l2cr) & 0x80000000)) {
|
||||
printk ("Pegasos l2cr : L2 cache was not active, "
|
||||
"activating\n");
|
||||
_set_L2CR(0);
|
||||
_set_L2CR((*l2cr) | 0x80000000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __init chrp_setup_arch(void)
|
||||
{
|
||||
struct device_node *device;
|
||||
|
||||
/* init to some ~sane value until calibrate_delay() runs */
|
||||
loops_per_jiffy = 50000000/HZ;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/* this is fine for chrp */
|
||||
initrd_below_start_ok = 1;
|
||||
|
||||
if (initrd_start)
|
||||
ROOT_DEV = Root_RAM0;
|
||||
else
|
||||
#endif
|
||||
ROOT_DEV = Root_SDA2; /* sda2 (sda1 is for the kernel) */
|
||||
|
||||
/* On pegasos, enable the L2 cache if not already done by OF */
|
||||
pegasos_set_l2cr();
|
||||
|
||||
/* Lookup PCI host bridges */
|
||||
chrp_find_bridges();
|
||||
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
/*
|
||||
* Temporary fixes for PCI devices.
|
||||
* -- Geert
|
||||
*/
|
||||
hydra_init(); /* Mac I/O */
|
||||
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/*
|
||||
* Fix the Super I/O configuration
|
||||
*/
|
||||
sio_init();
|
||||
|
||||
/* Get the event scan rate for the rtas so we know how
|
||||
* often it expects a heartbeat. -- Cort
|
||||
*/
|
||||
if ( rtas_data ) {
|
||||
struct property *p;
|
||||
device = find_devices("rtas");
|
||||
for ( p = device->properties;
|
||||
p && strncmp(p->name, "rtas-event-scan-rate", 20);
|
||||
p = p->next )
|
||||
/* nothing */ ;
|
||||
if ( p && *(unsigned long *)p->value ) {
|
||||
ppc_md.heartbeat = chrp_event_scan;
|
||||
ppc_md.heartbeat_reset = (HZ/(*(unsigned long *)p->value)*30)-1;
|
||||
ppc_md.heartbeat_count = 1;
|
||||
printk("RTAS Event Scan Rate: %lu (%lu jiffies)\n",
|
||||
*(unsigned long *)p->value, ppc_md.heartbeat_reset );
|
||||
}
|
||||
}
|
||||
|
||||
pci_create_OF_bus_map();
|
||||
}
|
||||
|
||||
void
|
||||
chrp_event_scan(void)
|
||||
{
|
||||
unsigned char log[1024];
|
||||
unsigned long ret = 0;
|
||||
/* XXX: we should loop until the hardware says no more error logs -- Cort */
|
||||
call_rtas( "event-scan", 4, 1, &ret, 0xffffffff, 0,
|
||||
__pa(log), 1024 );
|
||||
ppc_md.heartbeat_count = ppc_md.heartbeat_reset;
|
||||
}
|
||||
|
||||
void
|
||||
chrp_restart(char *cmd)
|
||||
{
|
||||
printk("RTAS system-reboot returned %d\n",
|
||||
call_rtas("system-reboot", 0, 1, NULL));
|
||||
for (;;);
|
||||
}
|
||||
|
||||
void
|
||||
chrp_power_off(void)
|
||||
{
|
||||
/* allow power on only with power button press */
|
||||
printk("RTAS power-off returned %d\n",
|
||||
call_rtas("power-off", 2, 1, NULL,0xffffffff,0xffffffff));
|
||||
for (;;);
|
||||
}
|
||||
|
||||
void
|
||||
chrp_halt(void)
|
||||
{
|
||||
chrp_power_off();
|
||||
}
|
||||
|
||||
/*
|
||||
* Finds the open-pic node and sets OpenPIC_Addr based on its reg property.
|
||||
* Then checks if it has an interrupt-ranges property. If it does then
|
||||
* we have a distributed open-pic, so call openpic_set_sources to tell
|
||||
* the openpic code where to find the interrupt source registers.
|
||||
*/
|
||||
static void __init chrp_find_openpic(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
int len, i;
|
||||
unsigned int *iranges;
|
||||
void __iomem *isu;
|
||||
|
||||
np = find_type_devices("open-pic");
|
||||
if (np == NULL || np->n_addrs == 0)
|
||||
return;
|
||||
printk(KERN_INFO "OpenPIC at %x (size %x)\n",
|
||||
np->addrs[0].address, np->addrs[0].size);
|
||||
OpenPIC_Addr = ioremap(np->addrs[0].address, 0x40000);
|
||||
if (OpenPIC_Addr == NULL) {
|
||||
printk(KERN_ERR "Failed to map OpenPIC!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
iranges = (unsigned int *) get_property(np, "interrupt-ranges", &len);
|
||||
if (iranges == NULL || len < 2 * sizeof(unsigned int))
|
||||
return; /* not distributed */
|
||||
|
||||
/*
|
||||
* The first pair of cells in interrupt-ranges refers to the
|
||||
* IDU; subsequent pairs refer to the ISUs.
|
||||
*/
|
||||
len /= 2 * sizeof(unsigned int);
|
||||
if (np->n_addrs < len) {
|
||||
printk(KERN_ERR "Insufficient addresses for distributed"
|
||||
" OpenPIC (%d < %d)\n", np->n_addrs, len);
|
||||
return;
|
||||
}
|
||||
if (iranges[1] != 0) {
|
||||
printk(KERN_INFO "OpenPIC irqs %d..%d in IDU\n",
|
||||
iranges[0], iranges[0] + iranges[1] - 1);
|
||||
openpic_set_sources(iranges[0], iranges[1], NULL);
|
||||
}
|
||||
for (i = 1; i < len; ++i) {
|
||||
iranges += 2;
|
||||
printk(KERN_INFO "OpenPIC irqs %d..%d in ISU at %x (%x)\n",
|
||||
iranges[0], iranges[0] + iranges[1] - 1,
|
||||
np->addrs[i].address, np->addrs[i].size);
|
||||
isu = ioremap(np->addrs[i].address, np->addrs[i].size);
|
||||
if (isu != NULL)
|
||||
openpic_set_sources(iranges[0], iranges[1], isu);
|
||||
else
|
||||
printk(KERN_ERR "Failed to map OpenPIC ISU at %x!\n",
|
||||
np->addrs[i].address);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
|
||||
static struct irqaction xmon_irqaction = {
|
||||
.handler = xmon_irq,
|
||||
.mask = CPU_MASK_NONE,
|
||||
.name = "XMON break",
|
||||
};
|
||||
#endif
|
||||
|
||||
void __init chrp_init_IRQ(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
unsigned long chrp_int_ack = 0;
|
||||
unsigned char init_senses[NR_IRQS - NUM_8259_INTERRUPTS];
|
||||
#if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
|
||||
struct device_node *kbd;
|
||||
#endif
|
||||
|
||||
for (np = find_devices("pci"); np != NULL; np = np->next) {
|
||||
unsigned int *addrp = (unsigned int *)
|
||||
get_property(np, "8259-interrupt-acknowledge", NULL);
|
||||
|
||||
if (addrp == NULL)
|
||||
continue;
|
||||
chrp_int_ack = addrp[prom_n_addr_cells(np)-1];
|
||||
break;
|
||||
}
|
||||
if (np == NULL)
|
||||
printk(KERN_ERR "Cannot find PCI interrupt acknowledge address\n");
|
||||
|
||||
chrp_find_openpic();
|
||||
|
||||
if (OpenPIC_Addr) {
|
||||
prom_get_irq_senses(init_senses, NUM_8259_INTERRUPTS, NR_IRQS);
|
||||
OpenPIC_InitSenses = init_senses;
|
||||
OpenPIC_NumInitSenses = NR_IRQS - NUM_8259_INTERRUPTS;
|
||||
|
||||
openpic_init(NUM_8259_INTERRUPTS);
|
||||
/* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */
|
||||
openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade",
|
||||
i8259_irq);
|
||||
|
||||
}
|
||||
i8259_init(chrp_int_ack, 0);
|
||||
|
||||
#if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
|
||||
/* see if there is a keyboard in the device tree
|
||||
with a parent of type "adb" */
|
||||
for (kbd = find_devices("keyboard"); kbd; kbd = kbd->next)
|
||||
if (kbd->parent && kbd->parent->type
|
||||
&& strcmp(kbd->parent->type, "adb") == 0)
|
||||
break;
|
||||
if (kbd)
|
||||
setup_irq(HYDRA_INT_ADB_NMI, &xmon_irqaction);
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init
|
||||
chrp_init2(void)
|
||||
{
|
||||
#ifdef CONFIG_NVRAM
|
||||
chrp_nvram_init();
|
||||
#endif
|
||||
|
||||
request_region(0x20,0x20,"pic1");
|
||||
request_region(0xa0,0x20,"pic2");
|
||||
request_region(0x00,0x20,"dma1");
|
||||
request_region(0x40,0x20,"timer");
|
||||
request_region(0x80,0x10,"dma page reg");
|
||||
request_region(0xc0,0x20,"dma2");
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress(" Have fun! ", 0x7777);
|
||||
}
|
||||
|
||||
static struct device_node *memory_node;
|
||||
|
||||
static int __init get_mem_prop(char *name, struct mem_pieces *mp)
|
||||
{
|
||||
struct reg_property *rp;
|
||||
int i, s;
|
||||
unsigned int *ip;
|
||||
int nac = prom_n_addr_cells(memory_node);
|
||||
int nsc = prom_n_size_cells(memory_node);
|
||||
|
||||
ip = (unsigned int *) get_property(memory_node, name, &s);
|
||||
if (ip == NULL) {
|
||||
printk(KERN_ERR "error: couldn't get %s property on /memory\n",
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
s /= (nsc + nac) * 4;
|
||||
rp = mp->regions;
|
||||
for (i = 0; i < s; ++i, ip += nac+nsc) {
|
||||
if (nac >= 2 && ip[nac-2] != 0)
|
||||
continue;
|
||||
rp->address = ip[nac-1];
|
||||
if (nsc >= 2 && ip[nac+nsc-2] != 0)
|
||||
rp->size = ~0U;
|
||||
else
|
||||
rp->size = ip[nac+nsc-1];
|
||||
++rp;
|
||||
}
|
||||
mp->n_regions = rp - mp->regions;
|
||||
|
||||
/* Make sure the pieces are sorted. */
|
||||
mem_pieces_sort(mp);
|
||||
mem_pieces_coalesce(mp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned long __init chrp_find_end_of_memory(void)
|
||||
{
|
||||
unsigned long a, total;
|
||||
struct mem_pieces phys_mem;
|
||||
|
||||
/*
|
||||
* Find out where physical memory is, and check that it
|
||||
* starts at 0 and is contiguous. It seems that RAM is
|
||||
* always physically contiguous on Power Macintoshes.
|
||||
*
|
||||
* Supporting discontiguous physical memory isn't hard,
|
||||
* it just makes the virtual <-> physical mapping functions
|
||||
* more complicated (or else you end up wasting space
|
||||
* in mem_map).
|
||||
*/
|
||||
memory_node = find_devices("memory");
|
||||
if (memory_node == NULL || !get_mem_prop("reg", &phys_mem)
|
||||
|| phys_mem.n_regions == 0)
|
||||
panic("No RAM??");
|
||||
a = phys_mem.regions[0].address;
|
||||
if (a != 0)
|
||||
panic("RAM doesn't start at physical address 0");
|
||||
total = phys_mem.regions[0].size;
|
||||
|
||||
if (phys_mem.n_regions > 1) {
|
||||
printk("RAM starting at 0x%x is not contiguous\n",
|
||||
phys_mem.regions[1].address);
|
||||
printk("Using RAM from 0 to 0x%lx\n", total-1);
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
void __init
|
||||
chrp_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7)
|
||||
{
|
||||
struct device_node *root = find_path_device ("/");
|
||||
char *machine = NULL;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/* take care of initrd if we have one */
|
||||
if ( r6 )
|
||||
{
|
||||
initrd_start = r6 + KERNELBASE;
|
||||
initrd_end = r6 + r7 + KERNELBASE;
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
|
||||
ISA_DMA_THRESHOLD = ~0L;
|
||||
DMA_MODE_READ = 0x44;
|
||||
DMA_MODE_WRITE = 0x48;
|
||||
isa_io_base = CHRP_ISA_IO_BASE; /* default value */
|
||||
ppc_do_canonicalize_irqs = 1;
|
||||
|
||||
if (root)
|
||||
machine = get_property(root, "model", NULL);
|
||||
if (machine && strncmp(machine, "Pegasos", 7) == 0) {
|
||||
_chrp_type = _CHRP_Pegasos;
|
||||
} else if (machine && strncmp(machine, "IBM", 3) == 0) {
|
||||
_chrp_type = _CHRP_IBM;
|
||||
} else if (machine && strncmp(machine, "MOT", 3) == 0) {
|
||||
_chrp_type = _CHRP_Motorola;
|
||||
} else {
|
||||
/* Let's assume it is an IBM chrp if all else fails */
|
||||
_chrp_type = _CHRP_IBM;
|
||||
}
|
||||
|
||||
ppc_md.setup_arch = chrp_setup_arch;
|
||||
ppc_md.show_percpuinfo = of_show_percpuinfo;
|
||||
ppc_md.show_cpuinfo = chrp_show_cpuinfo;
|
||||
|
||||
ppc_md.init_IRQ = chrp_init_IRQ;
|
||||
if (_chrp_type == _CHRP_Pegasos)
|
||||
ppc_md.get_irq = i8259_irq;
|
||||
else
|
||||
ppc_md.get_irq = openpic_get_irq;
|
||||
|
||||
ppc_md.init = chrp_init2;
|
||||
|
||||
ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
|
||||
|
||||
ppc_md.restart = chrp_restart;
|
||||
ppc_md.power_off = chrp_power_off;
|
||||
ppc_md.halt = chrp_halt;
|
||||
|
||||
ppc_md.time_init = chrp_time_init;
|
||||
ppc_md.set_rtc_time = chrp_set_rtc_time;
|
||||
ppc_md.get_rtc_time = chrp_get_rtc_time;
|
||||
ppc_md.calibrate_decr = chrp_calibrate_decr;
|
||||
|
||||
ppc_md.find_end_of_memory = chrp_find_end_of_memory;
|
||||
|
||||
if (rtas_data) {
|
||||
struct device_node *rtas;
|
||||
unsigned int *p;
|
||||
|
||||
rtas = find_devices("rtas");
|
||||
if (rtas != NULL) {
|
||||
if (get_property(rtas, "display-character", NULL)) {
|
||||
ppc_md.progress = rtas_display_progress;
|
||||
p = (unsigned int *) get_property
|
||||
(rtas, "ibm,display-line-length", NULL);
|
||||
if (p)
|
||||
max_width = *p;
|
||||
} else if (get_property(rtas, "set-indicator", NULL))
|
||||
ppc_md.progress = rtas_indicator_progress;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
if (ppc_md.progress == NULL && boot_text_mapped)
|
||||
ppc_md.progress = btext_progress;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
smp_ops = &chrp_smp_ops;
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/*
|
||||
* Print the banner, then scroll down so boot progress
|
||||
* can be printed. -- Cort
|
||||
*/
|
||||
if (ppc_md.progress) ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0x0);
|
||||
}
|
||||
|
||||
void
|
||||
rtas_display_progress(char *s, unsigned short hex)
|
||||
{
|
||||
int width;
|
||||
char *os = s;
|
||||
|
||||
if ( call_rtas( "display-character", 1, 1, NULL, '\r' ) )
|
||||
return;
|
||||
|
||||
width = max_width;
|
||||
while ( *os )
|
||||
{
|
||||
if ( (*os == '\n') || (*os == '\r') )
|
||||
width = max_width;
|
||||
else
|
||||
width--;
|
||||
call_rtas( "display-character", 1, 1, NULL, *os++ );
|
||||
/* if we overwrite the screen length */
|
||||
if ( width == 0 )
|
||||
while ( (*os != 0) && (*os != '\n') && (*os != '\r') )
|
||||
os++;
|
||||
}
|
||||
|
||||
/*while ( width-- > 0 )*/
|
||||
call_rtas( "display-character", 1, 1, NULL, ' ' );
|
||||
}
|
||||
|
||||
void
|
||||
rtas_indicator_progress(char *s, unsigned short hex)
|
||||
{
|
||||
call_rtas("set-indicator", 3, 1, NULL, 6, 0, hex);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
void
|
||||
btext_progress(char *s, unsigned short hex)
|
||||
{
|
||||
prom_print(s);
|
||||
prom_print("\n");
|
||||
}
|
||||
#endif /* CONFIG_BOOTX_TEXT */
|
@ -1,99 +0,0 @@
|
||||
/*
|
||||
* Smp support for CHRP machines.
|
||||
*
|
||||
* Written by Cort Dougan (cort@cs.nmt.edu) borrowing a great
|
||||
* deal of code from the sparc and intel versions.
|
||||
*
|
||||
* Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/residual.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/open_pic.h>
|
||||
#include <asm/machdep.h>
|
||||
|
||||
extern unsigned long smp_chrp_cpu_nr;
|
||||
|
||||
static int __init
|
||||
smp_chrp_probe(void)
|
||||
{
|
||||
if (smp_chrp_cpu_nr > 1)
|
||||
openpic_request_IPIs();
|
||||
|
||||
return smp_chrp_cpu_nr;
|
||||
}
|
||||
|
||||
static void __devinit
|
||||
smp_chrp_kick_cpu(int nr)
|
||||
{
|
||||
*(unsigned long *)KERNELBASE = nr;
|
||||
asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory");
|
||||
}
|
||||
|
||||
static void __devinit
|
||||
smp_chrp_setup_cpu(int cpu_nr)
|
||||
{
|
||||
if (OpenPIC_Addr)
|
||||
do_openpic_setup_cpu();
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(timebase_lock);
|
||||
static unsigned int timebase_upper = 0, timebase_lower = 0;
|
||||
|
||||
void __devinit
|
||||
smp_chrp_give_timebase(void)
|
||||
{
|
||||
spin_lock(&timebase_lock);
|
||||
call_rtas("freeze-time-base", 0, 1, NULL);
|
||||
timebase_upper = get_tbu();
|
||||
timebase_lower = get_tbl();
|
||||
spin_unlock(&timebase_lock);
|
||||
|
||||
while (timebase_upper || timebase_lower)
|
||||
barrier();
|
||||
call_rtas("thaw-time-base", 0, 1, NULL);
|
||||
}
|
||||
|
||||
void __devinit
|
||||
smp_chrp_take_timebase(void)
|
||||
{
|
||||
while (!(timebase_upper || timebase_lower))
|
||||
barrier();
|
||||
spin_lock(&timebase_lock);
|
||||
set_tb(timebase_upper, timebase_lower);
|
||||
timebase_upper = 0;
|
||||
timebase_lower = 0;
|
||||
spin_unlock(&timebase_lock);
|
||||
printk("CPU %i taken timebase\n", smp_processor_id());
|
||||
}
|
||||
|
||||
/* CHRP with openpic */
|
||||
struct smp_ops_t chrp_smp_ops = {
|
||||
.message_pass = smp_openpic_message_pass,
|
||||
.probe = smp_chrp_probe,
|
||||
.kick_cpu = smp_chrp_kick_cpu,
|
||||
.setup_cpu = smp_chrp_setup_cpu,
|
||||
.give_timebase = smp_chrp_give_timebase,
|
||||
.take_timebase = smp_chrp_take_timebase,
|
||||
};
|
@ -1,251 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 1991, 1992, 1995 Linus Torvalds
|
||||
*
|
||||
* Adapted for PowerPC (PReP) by Gary Thomas
|
||||
* Modified by Cort Dougan (cort@cs.nmt.edu).
|
||||
* Copied and modified from arch/i386/kernel/time.c
|
||||
*
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bcd.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/nvram.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
extern spinlock_t rtc_lock;
|
||||
|
||||
static int nvram_as1 = NVRAM_AS1;
|
||||
static int nvram_as0 = NVRAM_AS0;
|
||||
static int nvram_data = NVRAM_DATA;
|
||||
|
||||
long __init chrp_time_init(void)
|
||||
{
|
||||
struct device_node *rtcs;
|
||||
int base;
|
||||
|
||||
rtcs = find_compatible_devices("rtc", "pnpPNP,b00");
|
||||
if (rtcs == NULL)
|
||||
rtcs = find_compatible_devices("rtc", "ds1385-rtc");
|
||||
if (rtcs == NULL || rtcs->addrs == NULL)
|
||||
return 0;
|
||||
base = rtcs->addrs[0].address;
|
||||
nvram_as1 = 0;
|
||||
nvram_as0 = base;
|
||||
nvram_data = base + 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int chrp_cmos_clock_read(int addr)
|
||||
{
|
||||
if (nvram_as1 != 0)
|
||||
outb(addr>>8, nvram_as1);
|
||||
outb(addr, nvram_as0);
|
||||
return (inb(nvram_data));
|
||||
}
|
||||
|
||||
void chrp_cmos_clock_write(unsigned long val, int addr)
|
||||
{
|
||||
if (nvram_as1 != 0)
|
||||
outb(addr>>8, nvram_as1);
|
||||
outb(addr, nvram_as0);
|
||||
outb(val, nvram_data);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the hardware clock. -- Cort
|
||||
*/
|
||||
int chrp_set_rtc_time(unsigned long nowtime)
|
||||
{
|
||||
unsigned char save_control, save_freq_select;
|
||||
struct rtc_time tm;
|
||||
|
||||
spin_lock(&rtc_lock);
|
||||
to_tm(nowtime, &tm);
|
||||
|
||||
save_control = chrp_cmos_clock_read(RTC_CONTROL); /* tell the clock it's being set */
|
||||
|
||||
chrp_cmos_clock_write((save_control|RTC_SET), RTC_CONTROL);
|
||||
|
||||
save_freq_select = chrp_cmos_clock_read(RTC_FREQ_SELECT); /* stop and reset prescaler */
|
||||
|
||||
chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
|
||||
|
||||
tm.tm_year -= 1900;
|
||||
if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||
BIN_TO_BCD(tm.tm_sec);
|
||||
BIN_TO_BCD(tm.tm_min);
|
||||
BIN_TO_BCD(tm.tm_hour);
|
||||
BIN_TO_BCD(tm.tm_mon);
|
||||
BIN_TO_BCD(tm.tm_mday);
|
||||
BIN_TO_BCD(tm.tm_year);
|
||||
}
|
||||
chrp_cmos_clock_write(tm.tm_sec,RTC_SECONDS);
|
||||
chrp_cmos_clock_write(tm.tm_min,RTC_MINUTES);
|
||||
chrp_cmos_clock_write(tm.tm_hour,RTC_HOURS);
|
||||
chrp_cmos_clock_write(tm.tm_mon,RTC_MONTH);
|
||||
chrp_cmos_clock_write(tm.tm_mday,RTC_DAY_OF_MONTH);
|
||||
chrp_cmos_clock_write(tm.tm_year,RTC_YEAR);
|
||||
|
||||
/* The following flags have to be released exactly in this order,
|
||||
* otherwise the DS12887 (popular MC146818A clone with integrated
|
||||
* battery and quartz) will not reset the oscillator and will not
|
||||
* update precisely 500 ms later. You won't find this mentioned in
|
||||
* the Dallas Semiconductor data sheets, but who believes data
|
||||
* sheets anyway ... -- Markus Kuhn
|
||||
*/
|
||||
chrp_cmos_clock_write(save_control, RTC_CONTROL);
|
||||
chrp_cmos_clock_write(save_freq_select, RTC_FREQ_SELECT);
|
||||
|
||||
spin_unlock(&rtc_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long chrp_get_rtc_time(void)
|
||||
{
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
int uip, i;
|
||||
|
||||
/* The Linux interpretation of the CMOS clock register contents:
|
||||
* When the Update-In-Progress (UIP) flag goes from 1 to 0, the
|
||||
* RTC registers show the second which has precisely just started.
|
||||
* Let's hope other operating systems interpret the RTC the same way.
|
||||
*/
|
||||
|
||||
/* Since the UIP flag is set for about 2.2 ms and the clock
|
||||
* is typically written with a precision of 1 jiffy, trying
|
||||
* to obtain a precision better than a few milliseconds is
|
||||
* an illusion. Only consistency is interesting, this also
|
||||
* allows to use the routine for /dev/rtc without a potential
|
||||
* 1 second kernel busy loop triggered by any reader of /dev/rtc.
|
||||
*/
|
||||
|
||||
for ( i = 0; i<1000000; i++) {
|
||||
uip = chrp_cmos_clock_read(RTC_FREQ_SELECT);
|
||||
sec = chrp_cmos_clock_read(RTC_SECONDS);
|
||||
min = chrp_cmos_clock_read(RTC_MINUTES);
|
||||
hour = chrp_cmos_clock_read(RTC_HOURS);
|
||||
day = chrp_cmos_clock_read(RTC_DAY_OF_MONTH);
|
||||
mon = chrp_cmos_clock_read(RTC_MONTH);
|
||||
year = chrp_cmos_clock_read(RTC_YEAR);
|
||||
uip |= chrp_cmos_clock_read(RTC_FREQ_SELECT);
|
||||
if ((uip & RTC_UIP)==0) break;
|
||||
}
|
||||
|
||||
if (!(chrp_cmos_clock_read(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
|
||||
{
|
||||
BCD_TO_BIN(sec);
|
||||
BCD_TO_BIN(min);
|
||||
BCD_TO_BIN(hour);
|
||||
BCD_TO_BIN(day);
|
||||
BCD_TO_BIN(mon);
|
||||
BCD_TO_BIN(year);
|
||||
}
|
||||
if ((year += 1900) < 1970)
|
||||
year += 100;
|
||||
return mktime(year, mon, day, hour, min, sec);
|
||||
}
|
||||
|
||||
/*
|
||||
* Calibrate the decrementer frequency with the VIA timer 1.
|
||||
*/
|
||||
#define VIA_TIMER_FREQ_6 4700000 /* time 1 frequency * 6 */
|
||||
|
||||
/* VIA registers */
|
||||
#define RS 0x200 /* skip between registers */
|
||||
#define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */
|
||||
#define T1CH (5*RS) /* Timer 1 counter (high 8 bits) */
|
||||
#define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */
|
||||
#define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */
|
||||
#define ACR (11*RS) /* Auxiliary control register */
|
||||
#define IFR (13*RS) /* Interrupt flag register */
|
||||
|
||||
/* Bits in ACR */
|
||||
#define T1MODE 0xc0 /* Timer 1 mode */
|
||||
#define T1MODE_CONT 0x40 /* continuous interrupts */
|
||||
|
||||
/* Bits in IFR and IER */
|
||||
#define T1_INT 0x40 /* Timer 1 interrupt */
|
||||
|
||||
static int __init chrp_via_calibrate_decr(void)
|
||||
{
|
||||
struct device_node *vias;
|
||||
volatile unsigned char __iomem *via;
|
||||
int count = VIA_TIMER_FREQ_6 / 100;
|
||||
unsigned int dstart, dend;
|
||||
|
||||
vias = find_devices("via-cuda");
|
||||
if (vias == 0)
|
||||
vias = find_devices("via");
|
||||
if (vias == 0 || vias->n_addrs == 0)
|
||||
return 0;
|
||||
via = ioremap(vias->addrs[0].address, vias->addrs[0].size);
|
||||
|
||||
/* set timer 1 for continuous interrupts */
|
||||
out_8(&via[ACR], (via[ACR] & ~T1MODE) | T1MODE_CONT);
|
||||
/* set the counter to a small value */
|
||||
out_8(&via[T1CH], 2);
|
||||
/* set the latch to `count' */
|
||||
out_8(&via[T1LL], count);
|
||||
out_8(&via[T1LH], count >> 8);
|
||||
/* wait until it hits 0 */
|
||||
while ((in_8(&via[IFR]) & T1_INT) == 0)
|
||||
;
|
||||
dstart = get_dec();
|
||||
/* clear the interrupt & wait until it hits 0 again */
|
||||
in_8(&via[T1CL]);
|
||||
while ((in_8(&via[IFR]) & T1_INT) == 0)
|
||||
;
|
||||
dend = get_dec();
|
||||
|
||||
tb_ticks_per_jiffy = (dstart - dend) / ((6 * HZ)/100);
|
||||
tb_to_us = mulhwu_scale_factor(dstart - dend, 60000);
|
||||
|
||||
printk(KERN_INFO "via_calibrate_decr: ticks per jiffy = %u (%u ticks)\n",
|
||||
tb_ticks_per_jiffy, dstart - dend);
|
||||
|
||||
iounmap(via);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __init chrp_calibrate_decr(void)
|
||||
{
|
||||
struct device_node *cpu;
|
||||
unsigned int freq, *fp;
|
||||
|
||||
if (chrp_via_calibrate_decr())
|
||||
return;
|
||||
|
||||
/*
|
||||
* The cpu node should have a timebase-frequency property
|
||||
* to tell us the rate at which the decrementer counts.
|
||||
*/
|
||||
freq = 16666000; /* hardcoded default */
|
||||
cpu = find_type_devices("cpu");
|
||||
if (cpu != 0) {
|
||||
fp = (unsigned int *)
|
||||
get_property(cpu, "timebase-frequency", NULL);
|
||||
if (fp != 0)
|
||||
freq = *fp;
|
||||
}
|
||||
printk("time_init: decrementer frequency = %u.%.6u MHz\n",
|
||||
freq/1000000, freq%1000000);
|
||||
tb_ticks_per_jiffy = freq / HZ;
|
||||
tb_to_us = mulhwu_scale_factor(freq, 1000000);
|
||||
}
|
@ -38,8 +38,6 @@ endif
|
||||
obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o $(wdt-mpc8xx-y) \
|
||||
ppc_sys.o mpc8xx_devices.o mpc8xx_sys.o
|
||||
obj-$(CONFIG_PCI_QSPAN) += qspan_pci.o
|
||||
obj-$(CONFIG_PPC_OF) += prom_init.o prom.o
|
||||
obj-$(CONFIG_PPC_CHRP) += open_pic.o
|
||||
obj-$(CONFIG_PPC_PREP) += open_pic.o todc_time.o
|
||||
obj-$(CONFIG_BAMBOO) += pci_auto.o todc_time.o
|
||||
obj-$(CONFIG_CPCI690) += todc_time.o pci_auto.o
|
||||
|
@ -216,7 +216,7 @@ static void openpic_safe_writefield(volatile u_int __iomem *addr, u_int mask,
|
||||
u_int openpic_read_IPI(volatile u_int __iomem * addr)
|
||||
{
|
||||
u_int val = 0;
|
||||
#if defined(OPENPIC_BIG_ENDIAN) || defined(CONFIG_POWER3)
|
||||
#if defined(OPENPIC_BIG_ENDIAN)
|
||||
val = in_be32(addr);
|
||||
#else
|
||||
val = in_le32(addr);
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -58,7 +58,7 @@ static struct sysrq_key_op sysrq_xmon_op =
|
||||
void
|
||||
xmon_map_scc(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
volatile unsigned char *base;
|
||||
|
||||
#elif defined(CONFIG_GEMINI)
|
||||
|
@ -53,10 +53,7 @@
|
||||
#define platform_is_pseries() (_machine == PLATFORM_PSERIES || \
|
||||
_machine == PLATFORM_PSERIES_LPAR)
|
||||
|
||||
#if defined(CONFIG_PPC_MULTIPLATFORM)
|
||||
extern int _machine;
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
|
||||
/* what kind of prep workstation we are */
|
||||
extern int _prep_type;
|
||||
@ -70,7 +67,10 @@ extern int _chrp_type;
|
||||
extern unsigned char ucBoardRev;
|
||||
extern unsigned char ucBoardRevMaj, ucBoardRevMin;
|
||||
|
||||
#endif /* CONFIG_PPC32 */
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
#if defined(CONFIG_PPC_MULTIPLATFORM)
|
||||
extern int _machine;
|
||||
|
||||
#elif defined(CONFIG_PPC_ISERIES)
|
||||
/*
|
||||
|
@ -104,9 +104,6 @@ struct machdep_calls {
|
||||
unsigned long size,
|
||||
pgprot_t vma_prot);
|
||||
|
||||
/* this is for modules, since _machine can be a define -- Cort */
|
||||
int ppc_machine;
|
||||
|
||||
/* Motherboard/chipset features. This is a kind of general purpose
|
||||
* hook used to control some machine specific features (like reset
|
||||
* lines, chip power control, etc...).
|
||||
|
@ -8,126 +8,19 @@
|
||||
#ifndef _PPC_PROM_H
|
||||
#define _PPC_PROM_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
typedef u32 phandle;
|
||||
typedef u32 ihandle;
|
||||
|
||||
struct address_range {
|
||||
unsigned int space;
|
||||
unsigned int address;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
struct interrupt_info {
|
||||
int line;
|
||||
int sense; /* +ve/-ve logic, edge or level, etc. */
|
||||
};
|
||||
|
||||
/* This is used in arch/ppc/mm/mem_pieces.h */
|
||||
struct reg_property {
|
||||
unsigned int address;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
struct property {
|
||||
char *name;
|
||||
int length;
|
||||
unsigned char *value;
|
||||
struct property *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* Note: don't change this structure for now or you'll break BootX !
|
||||
*/
|
||||
struct device_node {
|
||||
char *name;
|
||||
char *type;
|
||||
phandle node;
|
||||
int n_addrs;
|
||||
struct address_range *addrs;
|
||||
int n_intrs;
|
||||
struct interrupt_info *intrs;
|
||||
char *full_name;
|
||||
struct property *properties;
|
||||
struct device_node *parent;
|
||||
struct device_node *child;
|
||||
struct device_node *sibling;
|
||||
struct device_node *next; /* next device of same type */
|
||||
struct device_node *allnext; /* next in list of all nodes */
|
||||
};
|
||||
|
||||
struct prom_args;
|
||||
typedef void (*prom_entry)(struct prom_args *);
|
||||
|
||||
/* OBSOLETE: Old style node lookup */
|
||||
extern struct device_node *find_devices(const char *name);
|
||||
extern struct device_node *find_type_devices(const char *type);
|
||||
extern struct device_node *find_path_device(const char *path);
|
||||
extern struct device_node *find_compatible_devices(const char *type,
|
||||
const char *compat);
|
||||
extern struct device_node *find_all_nodes(void);
|
||||
|
||||
/* New style node lookup */
|
||||
extern struct device_node *of_find_node_by_name(struct device_node *from,
|
||||
const char *name);
|
||||
extern struct device_node *of_find_node_by_type(struct device_node *from,
|
||||
const char *type);
|
||||
extern struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
const char *type, const char *compat);
|
||||
extern struct device_node *of_find_node_by_path(const char *path);
|
||||
extern struct device_node *of_find_all_nodes(struct device_node *prev);
|
||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
||||
extern struct device_node *of_get_next_child(const struct device_node *node,
|
||||
struct device_node *prev);
|
||||
extern struct device_node *of_node_get(struct device_node *node);
|
||||
extern void of_node_put(struct device_node *node);
|
||||
|
||||
/* Other Prototypes */
|
||||
extern void abort(void);
|
||||
extern unsigned long prom_init(int, int, prom_entry);
|
||||
extern void prom_print(const char *msg);
|
||||
extern void relocate_nodes(void);
|
||||
extern void finish_device_tree(void);
|
||||
extern int device_is_compatible(struct device_node *device, const char *);
|
||||
extern int machine_is_compatible(const char *compat);
|
||||
extern unsigned char *get_property(struct device_node *node, const char *name,
|
||||
int *lenp);
|
||||
extern int prom_add_property(struct device_node* np, struct property* prop);
|
||||
extern void prom_get_irq_senses(unsigned char *, int, int);
|
||||
extern int prom_n_addr_cells(struct device_node* np);
|
||||
extern int prom_n_size_cells(struct device_node* np);
|
||||
|
||||
extern struct resource*
|
||||
request_OF_resource(struct device_node* node, int index, const char* name_postfix);
|
||||
extern int release_OF_resource(struct device_node* node, int index);
|
||||
|
||||
extern void print_properties(struct device_node *node);
|
||||
extern int call_rtas(const char *service, int nargs, int nret,
|
||||
unsigned long *outputs, ...);
|
||||
|
||||
/*
|
||||
* PCI <-> OF matching functions
|
||||
*/
|
||||
struct pci_bus;
|
||||
struct pci_dev;
|
||||
extern int pci_device_from_OF_node(struct device_node *node,
|
||||
u8* bus, u8* devfn);
|
||||
extern struct device_node* pci_busdev_to_OF_node(struct pci_bus *, int);
|
||||
extern struct device_node* pci_device_to_OF_node(struct pci_dev *);
|
||||
extern void pci_create_OF_bus_map(void);
|
||||
|
||||
/*
|
||||
* When we call back to the Open Firmware client interface, we usually
|
||||
* have to do that before the kernel is relocated to its final location
|
||||
* (this is because we can't use OF after we have overwritten the
|
||||
* exception vectors with our exception handlers). These macros assist
|
||||
* in performing the address calculations that we need to do to access
|
||||
* data when the kernel is running at an address that is different from
|
||||
* the address that the kernel is linked at. The reloc_offset() function
|
||||
* returns the difference between these two addresses and the macros
|
||||
* simplify the process of adding or subtracting this offset to/from
|
||||
* pointer values. See arch/ppc/kernel/prom.c for how these are used.
|
||||
* These macros assist in performing the address calculations that we
|
||||
* need to do to access data when the kernel is running at an address
|
||||
* that is different from the address that the kernel is linked at.
|
||||
* The reloc_offset() function returns the difference between these
|
||||
* two addresses and the macros simplify the process of adding or
|
||||
* subtracting this offset to/from pointer values.
|
||||
*/
|
||||
extern unsigned long reloc_offset(void);
|
||||
extern unsigned long add_reloc_offset(unsigned long);
|
||||
@ -136,45 +29,12 @@ extern unsigned long sub_reloc_offset(unsigned long);
|
||||
#define PTRRELOC(x) ((typeof(x))add_reloc_offset((unsigned long)(x)))
|
||||
#define PTRUNRELOC(x) ((typeof(x))sub_reloc_offset((unsigned long)(x)))
|
||||
|
||||
|
||||
/*
|
||||
* OF address retreival & translation
|
||||
*/
|
||||
|
||||
|
||||
/* Translate an OF address block into a CPU physical address
|
||||
*/
|
||||
#define OF_BAD_ADDR ((u64)-1)
|
||||
extern u64 of_translate_address(struct device_node *np, u32 *addr);
|
||||
|
||||
/* Extract an address from a device, returns the region size and
|
||||
* the address space flags too. The PCI version uses a BAR number
|
||||
* instead of an absolute index
|
||||
*/
|
||||
extern u32 *of_get_address(struct device_node *dev, int index,
|
||||
u64 *size, unsigned int *flags);
|
||||
extern u32 *of_get_pci_address(struct device_node *dev, int bar_no,
|
||||
u64 *size, unsigned int *flags);
|
||||
|
||||
/* Get an address as a resource. Note that if your address is
|
||||
* a PIO address, the conversion will fail if the physical address
|
||||
* can't be internally converted to an IO token with
|
||||
* pci_address_to_pio(), that is because it's either called to early
|
||||
* or it can't be matched to any host bridge IO space
|
||||
*/
|
||||
extern int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r);
|
||||
extern int of_pci_address_to_resource(struct device_node *dev, int bar,
|
||||
struct resource *r);
|
||||
|
||||
#ifndef CONFIG_PPC_OF
|
||||
/*
|
||||
* Fallback definitions for builds where we don't have prom.c included.
|
||||
* Fallback definitions since we don't support OF in arch/ppc any more.
|
||||
*/
|
||||
#define machine_is_compatible(x) 0
|
||||
#define of_find_compatible_node(f, t, c) NULL
|
||||
#define get_property(p, n, l) NULL
|
||||
#endif
|
||||
|
||||
#endif /* _PPC_PROM_H */
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -41,15 +41,10 @@
|
||||
#else
|
||||
|
||||
/*
|
||||
* XXX Assume for now it has PC-style ISA serial ports.
|
||||
* This is true for PReP and CHRP at least.
|
||||
* XXX Assume it has PC-style ISA serial ports - true for PReP at least.
|
||||
*/
|
||||
#include <asm/pc_serial.h>
|
||||
|
||||
#if defined(CONFIG_MAC_SERIAL)
|
||||
#define SERIAL_DEV_OFFSET ((_machine == _MACH_prep || _machine == _MACH_chrp) ? 0 : 2)
|
||||
#endif
|
||||
|
||||
#endif /* !CONFIG_GEMINI and others */
|
||||
#endif /* __ASM_SERIAL_H__ */
|
||||
#endif /* __KERNEL__ */
|
||||
|
Loading…
Reference in New Issue
Block a user