Commit 083a97a1 authored by Paul Mackerras's avatar Paul Mackerras

Merge samba.org:/home/paulus/kernel/linux-2.5

into samba.org:/home/paulus/kernel/for-linus-ppc
parents c43626f4 fb58fa34
...@@ -340,9 +340,16 @@ CONFIG_PREP_RESIDUAL ...@@ -340,9 +340,16 @@ CONFIG_PREP_RESIDUAL
other useful pieces of information. Sometimes this information is other useful pieces of information. Sometimes this information is
not present or incorrect. not present or incorrect.
Unless you expect to boot on a PReP system, there is not need to Unless you expect to boot on a PReP system, there is no need to
select Y. select Y.
PReP residual data available in /proc/residual
CONFIG_PROC_PREPRESIDUAL
Enabling this option will create a /proc/residual file which allows
you to get at the residual data on PReP systems. You will need a tool
(lsresidual) to parse it. If you aren't on a PReP system, you don't
want this.
CONFIG_ADB CONFIG_ADB
Apple Desktop Bus (ADB) support is for support of devices which Apple Desktop Bus (ADB) support is for support of devices which
are connected to an ADB port. ADB devices tend to have 4 pins. are connected to an ADB port. ADB devices tend to have 4 pins.
......
...@@ -46,6 +46,8 @@ char *avail_high; ...@@ -46,6 +46,8 @@ char *avail_high;
static char scratch[SCRATCH_SIZE]; /* 1MB of scratch space for gunzip */ static char scratch[SCRATCH_SIZE]; /* 1MB of scratch space for gunzip */
typedef void (*kernel_start_t)(int, int, void *, unsigned int, unsigned int);
void void
chrpboot(int a1, int a2, void *prom) chrpboot(int a1, int a2, void *prom)
{ {
...@@ -93,10 +95,10 @@ chrpboot(int a1, int a2, void *prom) ...@@ -93,10 +95,10 @@ chrpboot(int a1, int a2, void *prom)
make_bi_recs(((unsigned long) dst + len), "chrpboot", _MACH_chrp, make_bi_recs(((unsigned long) dst + len), "chrpboot", _MACH_chrp,
(PROG_START + PROG_SIZE)); (PROG_START + PROG_SIZE));
sa = (unsigned long)PROG_START; sa = PROG_START;
printf("start address = 0x%x\n\r", sa); printf("start address = 0x%x\n\r", sa);
(*(void (*)())sa)(a1, a2, prom, initrd_start, initrd_size); (*(kernel_start_t)sa)(a1, a2, prom, initrd_start, initrd_size);
printf("returned?\n\r"); printf("returned?\n\r");
......
/* /*
* BK Id: SCCS/s.start.c 1.8 07/25/01 18:13:07 trini * BK Id: %F% %I% %G% %U% %#%
*/ */
/* /*
* Copyright (C) Paul Mackerras 1997. * Copyright (C) Paul Mackerras 1997.
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
#include <stdarg.h> #include <stdarg.h>
int (*prom)(); int (*prom)(void *args);
void *chosen_handle; void *chosen_handle;
void *stdin; void *stdin;
...@@ -30,7 +30,7 @@ extern int strlen(const char *s); ...@@ -30,7 +30,7 @@ extern int strlen(const char *s);
void void
start(int a1, int a2, void *promptr) start(int a1, int a2, void *promptr)
{ {
prom = (int (*)()) promptr; prom = promptr;
chosen_handle = finddevice("/chosen"); chosen_handle = finddevice("/chosen");
if (chosen_handle == (void *) -1) if (chosen_handle == (void *) -1)
exit(); exit();
...@@ -65,7 +65,7 @@ write(void *handle, void *ptr, int nb) ...@@ -65,7 +65,7 @@ write(void *handle, void *ptr, int nb)
args.addr = ptr; args.addr = ptr;
args.len = nb; args.len = nb;
args.actual = -1; args.actual = -1;
(*prom)(&args); prom(&args);
return args.actual; return args.actual;
} }
...@@ -211,7 +211,7 @@ fputs(char *str, void *f) ...@@ -211,7 +211,7 @@ fputs(char *str, void *f)
} }
int int
readchar() readchar(void)
{ {
char ch; char ch;
......
...@@ -69,7 +69,7 @@ __start: ...@@ -69,7 +69,7 @@ __start:
bdnz 1b # If we are not done yet, keep clearing bdnz 1b # If we are not done yet, keep clearing
2: 2:
#ifdef CONFIG_4xx #ifdef CONFIG_40x
## Set up the stack ## Set up the stack
lis r9,_start@h # r9 = &_start (text section entry) lis r9,_start@h # r9 = &_start (text section entry)
......
...@@ -67,7 +67,7 @@ extern int CRT_tstc(void); ...@@ -67,7 +67,7 @@ extern int CRT_tstc(void);
extern unsigned long serial_init(int chan, void *ignored); extern unsigned long serial_init(int chan, void *ignored);
extern void serial_close(unsigned long com_port); extern void serial_close(unsigned long com_port);
extern void gunzip(void *, int, unsigned char *, int *); extern void gunzip(void *, int, unsigned char *, int *);
extern void setup_legacy(void); extern void serial_fixups(void);
struct bi_record * struct bi_record *
decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum) decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
...@@ -76,7 +76,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum) ...@@ -76,7 +76,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
char *cp, ch; char *cp, ch;
struct bi_record *rec, *birecs; struct bi_record *rec, *birecs;
setup_legacy(); serial_fixups();
com_port = serial_init(0, NULL); com_port = serial_init(0, NULL);
/* assume the chunk below 8M is free */ /* assume the chunk below 8M is free */
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* trini@mvista.com * trini@mvista.com
* Derived from arch/ppc/boot/prep/head.S (Cort Dougan, many others). * Derived from arch/ppc/boot/prep/head.S (Cort Dougan, many others).
* *
* Copyright 2001 MontaVista Software Inc. * Copyright 2001-2002 MontaVista Software Inc.
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the
...@@ -188,10 +188,11 @@ start_ldr: ...@@ -188,10 +188,11 @@ start_ldr:
bl decompress_kernel bl decompress_kernel
/* /*
* Make sure the kernel knows we don't have things set in * Make sure the kernel knows we don't have things set in
* registers. -- Tom * registers. -- Tom
*/ */
li r4,0 li r4,0
li r5,0
li r6,0 li r6,0
/* /*
......
...@@ -41,6 +41,8 @@ char *avail_high; ...@@ -41,6 +41,8 @@ char *avail_high;
#define SCRATCH_SIZE (128 << 10) #define SCRATCH_SIZE (128 << 10)
typedef void (*kernel_start_t)(int, int, void *);
void boot(int a1, int a2, void *prom) void boot(int a1, int a2, void *prom)
{ {
unsigned sa, len; unsigned sa, len;
...@@ -90,7 +92,7 @@ void boot(int a1, int a2, void *prom) ...@@ -90,7 +92,7 @@ void boot(int a1, int a2, void *prom)
sa = (unsigned long)PROG_START; sa = (unsigned long)PROG_START;
printf("start address = 0x%x\n", sa); printf("start address = 0x%x\n", sa);
(*(void (*)())sa)(a1, a2, prom); (*(kernel_start_t)sa)(a1, a2, prom);
printf("returned?\n"); printf("returned?\n");
......
...@@ -47,6 +47,8 @@ char *avail_high; ...@@ -47,6 +47,8 @@ char *avail_high;
static char heap[SCRATCH_SIZE]; static char heap[SCRATCH_SIZE];
typedef void (*kernel_start_t)(int, int, void *);
void boot(int a1, int a2, void *prom) void boot(int a1, int a2, void *prom)
{ {
unsigned sa, len; unsigned sa, len;
...@@ -95,7 +97,7 @@ void boot(int a1, int a2, void *prom) ...@@ -95,7 +97,7 @@ void boot(int a1, int a2, void *prom)
sa = (unsigned long)PROG_START; sa = (unsigned long)PROG_START;
printf("start address = 0x%x\n", sa); printf("start address = 0x%x\n", sa);
(*(void (*)())sa)(a1, a2, prom); (*(kernel_start_t)sa)(a1, a2, prom);
printf("returned?\n"); printf("returned?\n");
......
/* /*
* BK Id: SCCS/s.start.c 1.10 07/25/01 18:13:07 trini * BK Id: %F% %I% %G% %U% %#%
*/ */
/* /*
* Copyright (C) Paul Mackerras 1997. * Copyright (C) Paul Mackerras 1997.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
extern int strlen(const char *s); extern int strlen(const char *s);
extern void boot(int a1, int a2, void *prom); extern void boot(int a1, int a2, void *prom);
int (*prom)(); int (*prom)(void *);
void *chosen_handle; void *chosen_handle;
void *stdin; void *stdin;
...@@ -29,7 +29,7 @@ void printk(char *fmt, ...); ...@@ -29,7 +29,7 @@ void printk(char *fmt, ...);
void void
start(int a1, int a2, void *promptr) start(int a1, int a2, void *promptr)
{ {
prom = (int (*)()) promptr; prom = (int (*)(void *)) promptr;
chosen_handle = finddevice("/chosen"); chosen_handle = finddevice("/chosen");
if (chosen_handle == (void *) -1) if (chosen_handle == (void *) -1)
exit(); exit();
......
...@@ -75,7 +75,7 @@ extern void gunzip(void *, int, unsigned char *, int *); ...@@ -75,7 +75,7 @@ extern void gunzip(void *, int, unsigned char *, int *);
extern void _put_MSR(unsigned int val); extern void _put_MSR(unsigned int val);
extern unsigned long serial_init(int chan, void *ignored); extern unsigned long serial_init(int chan, void *ignored);
extern void setup_legacy(void); extern void serial_fixups(void);
void void
writel(unsigned int val, unsigned int address) writel(unsigned int val, unsigned int address)
...@@ -134,7 +134,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum, ...@@ -134,7 +134,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
int start_multi = 0; int start_multi = 0;
unsigned int pci_viddid, pci_did, tulip_pci_base, tulip_base; unsigned int pci_viddid, pci_did, tulip_pci_base, tulip_base;
setup_legacy(); serial_fixups();
#if defined(CONFIG_SERIAL_CONSOLE) #if defined(CONFIG_SERIAL_CONSOLE)
com_port = serial_init(0, NULL); com_port = serial_init(0, NULL);
#endif /* CONFIG_SERIAL_CONSOLE */ #endif /* CONFIG_SERIAL_CONSOLE */
......
...@@ -3,15 +3,15 @@ ...@@ -3,15 +3,15 @@
* *
* Author: Tom Rini <trini@mvista.com> * Author: Tom Rini <trini@mvista.com>
* *
* This will go and setup ISA_io to 0xFE00000. * This will go and setup ISA_io to 0xFE00000 and return.
*/ */
#include <asm/ppc_asm.h> #include <asm/ppc_asm.h>
.text .text
.globl setup_legacy .globl serial_fixups
setup_legacy: serial_fixups:
lis r3,ISA_io@h /* Load ISA_io */ lis r3,ISA_io@h /* Load ISA_io */
ori r3,r3,ISA_io@l ori r3,r3,ISA_io@l
lis r4,0xFE00 /* Load the value, 0xFE00000 */ lis r4,0xFE00 /* Load the value, 0xFE00000 */
......
...@@ -4,11 +4,12 @@ ...@@ -4,11 +4,12 @@
* Author: Tom Rini <trini@mvista.com> * Author: Tom Rini <trini@mvista.com>
* *
* This is an empty function for machines which use SERIAL_IO_MEM * This is an empty function for machines which use SERIAL_IO_MEM
* and don't need ISA_io set to anything but 0; * and don't need ISA_io set to anything but 0, or perform any other
* serial fixups.
*/ */
.text .text
.globl setup_legacy .globl serial_fixups
setup_legacy: serial_fixups:
blr blr
...@@ -4,9 +4,17 @@ ...@@ -4,9 +4,17 @@
/* Board specific functions for those embedded 8xx boards that do /* Board specific functions for those embedded 8xx boards that do
* not have boot monitor support for board information. * not have boot monitor support for board information.
*
* 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/types.h> #include <linux/types.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/string.h>
#include <asm/io.h>
#ifdef CONFIG_8xx #ifdef CONFIG_8xx
#include <asm/mpc8xx.h> #include <asm/mpc8xx.h>
#endif #endif
...@@ -14,12 +22,6 @@ ...@@ -14,12 +22,6 @@
#include <asm/mpc8260.h> #include <asm/mpc8260.h>
#include <asm/immap_8260.h> #include <asm/immap_8260.h>
#endif #endif
#ifdef CONFIG_4xx
#include <asm/io.h>
#endif
#if defined(CONFIG_405GP) || defined(CONFIG_NP405H) || defined(CONFIG_NP405L)
#include <linux/netdevice.h>
#endif
/* For those boards that don't provide one. /* For those boards that don't provide one.
*/ */
...@@ -222,6 +224,23 @@ rpx_memsize(bd_t *bd, u_char *cp) ...@@ -222,6 +224,23 @@ rpx_memsize(bd_t *bd, u_char *cp)
bd->bi_memsize = size * 1024 * 1024; bd->bi_memsize = size * 1024 * 1024;
} }
#endif /* LITE || CLASSIC || EP405 */ #endif /* LITE || CLASSIC || EP405 */
#if defined(CONFIG_EP405)
static void
rpx_nvramsize(bd_t *bd, u_char *cp)
{
uint size;
size = 0;
while (*cp != '\n') {
size *= 10;
size += (*cp) - '0';
cp++;
}
bd->bi_nvramsize = size * 1024;
}
#endif /* CONFIG_EP405 */
#endif /* Embedded Planet boards */ #endif /* Embedded Planet boards */
...@@ -641,7 +660,11 @@ embed_config(bd_t **bdp) ...@@ -641,7 +660,11 @@ embed_config(bd_t **bdp)
#ifdef CONFIG_TREEBOOT #ifdef CONFIG_TREEBOOT
/* This could possibly work for all treeboot roms. /* This could possibly work for all treeboot roms.
*/ */
#if defined(CONFIG_ASH)
#define BOARD_INFO_VECTOR 0xFFF80B50 /* openbios 1.19 moved this vector down - armin */
#else
#define BOARD_INFO_VECTOR 0xFFFE0B50 #define BOARD_INFO_VECTOR 0xFFFE0B50
#endif
void void
embed_config(bd_t **bdp) embed_config(bd_t **bdp)
...@@ -658,8 +681,8 @@ embed_config(bd_t **bdp) ...@@ -658,8 +681,8 @@ embed_config(bd_t **bdp)
/* shut down the Ethernet controller that the boot rom /* shut down the Ethernet controller that the boot rom
* sometimes leaves running. * sometimes leaves running.
*/ */
mtdcr(DCRN_MALCR, MALCR_MMSR); /* 1st reset MAL */ mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR); /* 1st reset MAL */
while (mfdcr(DCRN_MALCR) & MALCR_MMSR) {}; /* wait for the reset */ while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {}; /* wait for the reset */
emacp->em0mr0 = 0x20000000; /* then reset EMAC */ emacp->em0mr0 = 0x20000000; /* then reset EMAC */
eieio(); eieio();
#endif #endif
...@@ -684,24 +707,20 @@ embed_config(bd_t **bdp) ...@@ -684,24 +707,20 @@ embed_config(bd_t **bdp)
bd->bi_pci_enetaddr[i] = *cp++; bd->bi_pci_enetaddr[i] = *cp++;
#endif #endif
} }
bd->bi_tbfreq = 200 * 1000 * 1000;
bd->bi_intfreq = 200000000; bd->bi_intfreq = 200000000;
bd->bi_busfreq = 100000000; bd->bi_busfreq = 100000000;
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
bd->bi_pci_busfreq = 66666666; bd->bi_pci_busfreq = 66666666;
#endif #endif
/* Yeah, this look weird, but on Redwood 4 they are }
* different object in the structure. When RW5 uses /* Yeah, this look weird, but on Redwood 4 they are
* OpenBIOS, it requires a special value. * different object in the structure. When RW5 uses
*/ * OpenBIOS, it requires a special value.
*/
#ifdef CONFIG_REDWOOD_5 #ifdef CONFIG_REDWOOD_5
bd->bi_intfreq = 200 * 1000 * 1000; bd->bi_tbfreq = 27 * 1000 * 1000;
bd->bi_busfreq = 0;
bd->bi_tbfreq = 27 * 1000 * 1000;
#elif CONFIG_REDWOOD_4
bd->bi_tbfreq = bd->bi_intfreq;
#endif #endif
}
} }
#endif #endif
...@@ -751,6 +770,13 @@ embed_config(bd_t **bdp) ...@@ -751,6 +770,13 @@ embed_config(bd_t **bdp)
} }
} }
if (*cp == 'N') {
cp++;
if (*cp == 'V') {
cp += 2;
rpx_nvramsize(bd, cp);
}
}
while ((*cp != '\n') && (*cp != 0xff)) while ((*cp != '\n') && (*cp != 0xff))
cp++; cp++;
...@@ -771,3 +797,28 @@ embed_config(bd_t **bdp) ...@@ -771,3 +797,28 @@ embed_config(bd_t **bdp)
} }
#endif #endif
#ifdef CONFIG_RAINIER
/* Rainier uses vxworks bootrom */
void
embed_config(bd_t **bdp)
{
u_char *cp;
int i;
bd_t *bd;
bd = &bdinfo;
*bdp = bd;
bd->bi_memsize = (32 * 1024 * 1024) ;
bd->bi_intfreq = 133000000; //the internal clock is 133 MHz
bd->bi_busfreq = 100000000;
bd->bi_pci_busfreq= 33000000;
cp = (u_char *)def_enet_addr;
for (i=0; i<6; i++) {
bd->bi_enetaddr[i] = *cp++;
}
}
#endif
...@@ -3,15 +3,15 @@ ...@@ -3,15 +3,15 @@
* *
* Author: Tom Rini <trini@mvista.com> * Author: Tom Rini <trini@mvista.com>
* *
* This will go and setup ISA_io to 0x8000000. * This will go and setup ISA_io to 0x8000000 and return.
*/ */
#include <asm/ppc_asm.h> #include <asm/ppc_asm.h>
.text .text
.globl setup_legacy .globl serial_fixups
setup_legacy: serial_fixups:
lis r3,ISA_io@h /* Load ISA_io */ lis r3,ISA_io@h /* Load ISA_io */
ori r3,r3,ISA_io@l ori r3,r3,ISA_io@l
lis r4,0x8000 /* Load the value, 0x8000000 */ lis r4,0x8000 /* Load the value, 0x8000000 */
......
...@@ -54,7 +54,7 @@ char *bootrom_cmdline = ""; ...@@ -54,7 +54,7 @@ char *bootrom_cmdline = "";
char compiled_string[] = CONFIG_CMDLINE; char compiled_string[] = CONFIG_CMDLINE;
#endif #endif
char ramroot_string[] = "root=/dev/ram"; char ramroot_string[] = "root=/dev/ram";
char netroot_string[] = "root=/dev/nfs rw ip=auto"; char netroot_string[] = "root=/dev/nfs rw ip=on";
/* Serial port to use. */ /* Serial port to use. */
unsigned long com_port; unsigned long com_port;
......
...@@ -18,11 +18,15 @@ define_bool CONFIG_PPC y ...@@ -18,11 +18,15 @@ define_bool CONFIG_PPC y
define_bool CONFIG_PPC32 y define_bool CONFIG_PPC32 y
choice 'Processor Type' \ choice 'Processor Type' \
"6xx/7xx/74xx/8260 CONFIG_6xx \ "6xx/7xx/74xx/8260 CONFIG_6xx \
4xx CONFIG_4xx \ 40x CONFIG_40x \
POWER3 CONFIG_POWER3 \ POWER3 CONFIG_POWER3 \
8xx CONFIG_8xx \ 8xx CONFIG_8xx \
iSeries CONFIG_PPC_ISERIES" 6xx iSeries CONFIG_PPC_ISERIES" 6xx
if [ "$CONFIG_40x" = "y" ]; then
define_bool CONFIG_4xx y
fi
if [ "$CONFIG_6xx" = "y" ]; then if [ "$CONFIG_6xx" = "y" ]; then
bool 'MPC8260 CPM Support' CONFIG_8260 bool 'MPC8260 CPM Support' CONFIG_8260
fi fi
...@@ -52,17 +56,21 @@ if [ "$CONFIG_8260" = "y" ]; then ...@@ -52,17 +56,21 @@ if [ "$CONFIG_8260" = "y" ]; then
Willow CONFIG_WILLOW" Willow Willow CONFIG_WILLOW" Willow
fi fi
if [ "$CONFIG_4xx" = "y" ]; then if [ "$CONFIG_40x" = "y" ]; then
choice 'Machine Type' \ choice 'Machine Type' \
"Ash CONFIG_ASH \ "Ash CONFIG_ASH \
Ceder CONFIG_CEDER \ Ceder CONFIG_CEDER \
CPCI405 CONFIG_CPCI405 \ CPCI405 CONFIG_CPCI405 \
EP405 CONFIG_EP405 \ EP405/EP405PC CONFIG_EP405 \
Oak CONFIG_OAK \ Oak CONFIG_OAK \
Redwood-4 CONFIG_REDWOOD_4 \ Redwood-4 CONFIG_REDWOOD_4 \
Redwood-5 CONFIG_REDWOOD_5 \ Redwood-5 CONFIG_REDWOOD_5 \
Tivo CONFIG_TIVO \ Tivo CONFIG_TIVO \
Walnut CONFIG_WALNUT" Walnut Walnut CONFIG_WALNUT" Walnut
if [ "$CONFIG_EP405" = "y" ]; then
bool 'EP405PC Support' CONFIG_EP405PC
fi
fi fi
if [ "$CONFIG_8xx" = "y" ]; then if [ "$CONFIG_8xx" = "y" ]; then
...@@ -182,7 +190,7 @@ if [ "$CONFIG_4xx" = "y" -o "$CONFIG_8xx" = "y" ]; then ...@@ -182,7 +190,7 @@ if [ "$CONFIG_4xx" = "y" -o "$CONFIG_8xx" = "y" ]; then
bool 'Math emulation' CONFIG_MATH_EMULATION bool 'Math emulation' CONFIG_MATH_EMULATION
fi fi
if [ "$CONFIG_4xx" = "y" ]; then if [ "$CONFIG_40x" = "y" ]; then
# It's often necessary to know the specific 4xx processor type. # It's often necessary to know the specific 4xx processor type.
# Fortunately, it is impled (so far) from the board type, so we # Fortunately, it is impled (so far) from the board type, so we
# don't need to ask more redundant questions. # don't need to ask more redundant questions.
...@@ -238,11 +246,9 @@ if [ "$CONFIG_4xx" = "y" ]; then ...@@ -238,11 +246,9 @@ if [ "$CONFIG_4xx" = "y" ]; then
bool 'Blue Logic DMA' CONFIG_405_DMA bool 'Blue Logic DMA' CONFIG_405_DMA
dep_bool 'Power Management support (experimental)' CONFIG_PM $CONFIG_EXPERIMENTAL dep_bool 'Power Management support (experimental)' CONFIG_PM $CONFIG_EXPERIMENTAL
if [ "$CONFIG_4xx" = "y" ]; then choice 'TTYS0 device and default console' \
choice 'TTYS0 device and default console' \
"UART0 CONFIG_UART0_TTYS0 \ "UART0 CONFIG_UART0_TTYS0 \
UART1 CONFIG_UART0_TTYS1" UART0 UART1 CONFIG_UART0_TTYS1" UART0
fi
define_bool CONFIG_IBM405_ERR51 y define_bool CONFIG_IBM405_ERR51 y
define_bool CONFIG_NOT_COHERENT_CACHE y define_bool CONFIG_NOT_COHERENT_CACHE y
...@@ -282,7 +288,7 @@ if [ "$CONFIG_ADVANCED_OPTIONS" = "y" ]; then ...@@ -282,7 +288,7 @@ if [ "$CONFIG_ADVANCED_OPTIONS" = "y" ]; then
if [ "$CONFIG_8xx" = "y" ]; then if [ "$CONFIG_8xx" = "y" ]; then
bool "Pinned Kernel TLBs (860 ONLY)" CONFIG_PIN_TLB bool "Pinned Kernel TLBs (860 ONLY)" CONFIG_PIN_TLB
fi fi
if [ "$CONFIG_4xx" = "y" ]; then if [ "$CONFIG_40x" = "y" ]; then
bool "Pinned Kernel TLBs" CONFIG_PIN_TLB bool "Pinned Kernel TLBs" CONFIG_PIN_TLB
fi fi
if [ "$CONFIG_ALL_PPC" != "y" ]; then if [ "$CONFIG_ALL_PPC" != "y" ]; then
...@@ -362,6 +368,7 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then ...@@ -362,6 +368,7 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then
bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE
bool 'Support for RTAS (RunTime Abstraction Services) in /proc' CONFIG_PPC_RTAS bool 'Support for RTAS (RunTime Abstraction Services) in /proc' CONFIG_PPC_RTAS
bool 'Support for PReP Residual Data' CONFIG_PREP_RESIDUAL bool 'Support for PReP Residual Data' CONFIG_PREP_RESIDUAL
dep_bool ' Support for reading of PReP Residual Data in /proc' CONFIG_PROC_PREPRESIDUAL $CONFIG_PREP_RESIDUAL
fi fi
bool 'Default bootloader kernel arguments' CONFIG_CMDLINE_BOOL bool 'Default bootloader kernel arguments' CONFIG_CMDLINE_BOOL
...@@ -574,15 +581,15 @@ if [ "$CONFIG_8260" = "y" ]; then ...@@ -574,15 +581,15 @@ if [ "$CONFIG_8260" = "y" ]; then
source arch/ppc/8260_io/Config.in source arch/ppc/8260_io/Config.in
fi fi
if [ "$CONFIG_4xx" = "y"]; then if [ "$CONFIG_40x" = "y" ]; then
mainmenu_option next_comment mainmenu_option next_comment
comment 'IBM 4xx options' comment 'IBM 40x options'
if [ "$CONFIG_STB03xxx" = "y" ]; then if [ "$CONFIG_STB03xxx" = "y" ]; then
bool 'STB IR Keyboard' CONFIG_STB_KB bool 'STB IR Keyboard' CONFIG_STB_KB
bool 'SICC Serial port' CONFIG_SERIAL_SICC bool 'SICC Serial port' CONFIG_SERIAL_SICC
if [ "$CONFIG_SERIAL_SICC" = "y" -a "$CONFIG_UART0_TTYS1" = "y" ]; then if [ "$CONFIG_SERIAL_SICC" = "y" -a "$CONFIG_UART0_TTYS1" = "y" ]; then
define_bool CONFIG_UART1_DFLT_CONSOLE y define_bool CONFIG_UART1_DFLT_CONSOLE y
define_bool CONFIG_SERIAL_SICC_CONSOLE y define_bool CONFIG_SERIAL_SICC_CONSOLE y
fi fi
fi fi
endmenu endmenu
...@@ -621,8 +628,8 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then ...@@ -621,8 +628,8 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then
fi fi
if [ "$CONFIG_4xx" = "y" -o "$CONFIG_GT64260" = "y" \ if [ "$CONFIG_4xx" = "y" -o "$CONFIG_GT64260" = "y" \
-o "$CONFIG_LOPEC" = "y" -o "$CONFIG_MCPN765" = "y" \ -o "$CONFIG_LOPEC" = "y" -o "$CONFIG_MCPN765" = "y" \
-o "$CONFIG_PRPMC800" = "y" -o "$CONFIG_SANDPOINT" = "y" \ -o "$CONFIG_PPLUS" = "y" -o "$CONFIG_PRPMC800" = "y" \
-o "$CONFIG_ZX4500" = "y" ]; then -o "$CONFIG_SANDPOINT" = "y" -o "$CONFIG_ZX4500" = "y" ]; then
bool 'Support for early boot texts over serial port' CONFIG_SERIAL_TEXT_DEBUG bool 'Support for early boot texts over serial port' CONFIG_SERIAL_TEXT_DEBUG
fi fi
endmenu endmenu
...@@ -21,7 +21,7 @@ CFLAGS_btext.o += -mrelocatable-lib ...@@ -21,7 +21,7 @@ CFLAGS_btext.o += -mrelocatable-lib
# Start off with 'head.o', change as needed. # Start off with 'head.o', change as needed.
HEAD-y := head.o HEAD-y := head.o
HEAD-$(CONFIG_4xx) := head_4xx.o HEAD-$(CONFIG_40x) := head_4xx.o
HEAD-$(CONFIG_8xx) := head_8xx.o HEAD-$(CONFIG_8xx) := head_8xx.o
HEAD-$(CONFIG_PPC_ISERIES) := iSeries_head.o HEAD-$(CONFIG_PPC_ISERIES) := iSeries_head.o
...@@ -54,19 +54,18 @@ obj-$(CONFIG_PM) += ppc4xx_pm.o ...@@ -54,19 +54,18 @@ obj-$(CONFIG_PM) += ppc4xx_pm.o
endif endif
obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o
ifeq ($(CONFIG_8xx),y) ifeq ($(CONFIG_8xx),y)
obj-$(CONFIG_PCI) += qspan_pci.o obj-$(CONFIG_PCI) += qspan_pci.o i8259.o
ifndef CONFIG_MATH_EMULATION ifneq ($(CONFIG_MATH_EMULATION),n)
obj-y += softemu8xx.o obj-y += softemu8xx.o
endif endif
endif endif
obj-$(CONFIG_MBX) += i8259.o
obj-$(CONFIG_ALL_PPC) += prom_init.o prom.o open_pic.o \ obj-$(CONFIG_ALL_PPC) += prom_init.o prom.o open_pic.o \
indirect_pci.o i8259.o indirect_pci.o i8259.o
obj-$(CONFIG_ADIR) += i8259.o indirect_pci.o pci_auto.o \ obj-$(CONFIG_ADIR) += i8259.o indirect_pci.o pci_auto.o \
todc_time.o todc_time.o
obj-$(CONFIG_EV64260) += gt64260_common.o gt64260_pic.o \ obj-$(CONFIG_EV64260) += gt64260_common.o gt64260_pic.o \
indirect_pci.o todc_time.o pci_auto.o indirect_pci.o todc_time.o pci_auto.o
obj-$(CONFIG_GEMINI) += open_pic.o obj-$(CONFIG_GEMINI) += open_pic.o i8259.o
obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \ obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \
pci_auto.o pci_auto.o
obj-$(CONFIG_LOPEC) += mpc10x_common.o indirect_pci.o pci_auto.o \ obj-$(CONFIG_LOPEC) += mpc10x_common.o indirect_pci.o pci_auto.o \
......
...@@ -283,7 +283,7 @@ struct cpu_spec cpu_specs[] = { ...@@ -283,7 +283,7 @@ struct cpu_spec cpu_specs[] = {
__setup_cpu_8xx /* Empty */ __setup_cpu_8xx /* Empty */
}, },
#endif /* CONFIG_8xx */ #endif /* CONFIG_8xx */
#ifdef CONFIG_4xx #ifdef CONFIG_40x
{ /* 403GC */ { /* 403GC */
0xffffff00, 0x00200200, "403GC", 0xffffff00, 0x00200200, "403GC",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB, CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
...@@ -333,7 +333,38 @@ struct cpu_spec cpu_specs[] = { ...@@ -333,7 +333,38 @@ struct cpu_spec cpu_specs[] = {
16, 8, 16, 8,
0, /*__setup_cpu_405 */ 0, /*__setup_cpu_405 */
}, },
#endif /* CONFIG_4xx */ { /* NP4GS3 */
0xffff0000, 0x40B10000, "NP4GS3",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
16, 8,
0, /*__setup_cpu_405 */
},
{ /* NP405H */
0xffff0000, 0x41410000, "NP405H",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
16, 8,
0, /*__setup_cpu_405 */
},
#endif /* CONFIG_40x */
#ifdef CONFIG_440
{ /* 440GP Rev. B */
0xf0000fff, 0x40000440, "440GP Rev. B",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
32, 32,
0, /*__setup_cpu_440 */
},
{ /* 440GP Rev. C */
0xf0000fff, 0x40000481, "440GP Rev. C",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
32, 32,
0, /*__setup_cpu_440 */
},
#endif /* CONFIG_440 */
#if !CLASSIC_PPC #if !CLASSIC_PPC
{ /* default match */ { /* default match */
0x00000000, 0x00000000, "(generic PPC)", 0x00000000, 0x00000000, "(generic PPC)",
......
...@@ -507,7 +507,6 @@ InstructionTLBMiss: ...@@ -507,7 +507,6 @@ InstructionTLBMiss:
lwz r2,0(r2) /* get pmd entry */ lwz r2,0(r2) /* get pmd entry */
rlwinm. r2,r2,0,0,19 /* extract address of pte page */ rlwinm. r2,r2,0,0,19 /* extract address of pte page */
beq- InstructionAddressInvalid /* return if no mapping */ beq- InstructionAddressInvalid /* return if no mapping */
tophys(r2,r2)
rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */ rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
lwz r3,0(r2) /* get linux-style pte */ lwz r3,0(r2) /* get linux-style pte */
andc. r1,r1,r3 /* check access & ~permission */ andc. r1,r1,r3 /* check access & ~permission */
...@@ -582,7 +581,6 @@ DataLoadTLBMiss: ...@@ -582,7 +581,6 @@ DataLoadTLBMiss:
lwz r2,0(r2) /* get pmd entry */ lwz r2,0(r2) /* get pmd entry */
rlwinm. r2,r2,0,0,19 /* extract address of pte page */ rlwinm. r2,r2,0,0,19 /* extract address of pte page */
beq- DataAddressInvalid /* return if no mapping */ beq- DataAddressInvalid /* return if no mapping */
tophys(r2,r2)
rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */ rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
lwz r3,0(r2) /* get linux-style pte */ lwz r3,0(r2) /* get linux-style pte */
andc. r1,r1,r3 /* check access & ~permission */ andc. r1,r1,r3 /* check access & ~permission */
...@@ -655,7 +653,6 @@ DataStoreTLBMiss: ...@@ -655,7 +653,6 @@ DataStoreTLBMiss:
lwz r2,0(r2) /* get pmd entry */ lwz r2,0(r2) /* get pmd entry */
rlwinm. r2,r2,0,0,19 /* extract address of pte page */ rlwinm. r2,r2,0,0,19 /* extract address of pte page */
beq- DataAddressInvalid /* return if no mapping */ beq- DataAddressInvalid /* return if no mapping */
tophys(r2,r2)
rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */ rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
lwz r3,0(r2) /* get linux-style pte */ lwz r3,0(r2) /* get linux-style pte */
andc. r1,r1,r3 /* check access & ~permission */ andc. r1,r1,r3 /* check access & ~permission */
......
...@@ -21,17 +21,37 @@ static spinlock_t i8259_lock = SPIN_LOCK_UNLOCKED; ...@@ -21,17 +21,37 @@ static spinlock_t i8259_lock = SPIN_LOCK_UNLOCKED;
int i8259_pic_irq_offset; int i8259_pic_irq_offset;
/* Acknowledge the irq using the PCI host bridge's interrupt acknowledge /*
* feature. (Polling is somehow broken on some IBM and Motorola PReP boxes.) * Acknowledge the IRQ using either the PCI host bridge's interrupt
* acknowledge feature or poll. How i8259_init() is called determines
* which is called. It should be noted that polling is broken on some
* IBM and Motorola PReP boxes so we must use the int-ack feature on them.
*/ */
int i8259_irq(struct pt_regs *regs) int
i8259_irq(struct pt_regs *regs)
{ {
int irq; int irq;
spin_lock/*_irqsave*/(&i8259_lock/*, flags*/); spin_lock(&i8259_lock);
/* Either int-ack or poll for the IRQ */
if (pci_intack)
irq = *pci_intack;
else {
/* Perform an interrupt acknowledge cycle on controller 1. */
outb(0x0C, 0x20); /* prepare for poll */
irq = inb(0x20) & 7;
if (irq == 2 ) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2.
*/
outb(0x0C, 0xA0); /* prepare for poll */
irq = (inb(0xA0) & 7) + 8;
}
}
irq = *pci_intack; if (irq == 7) {
if (irq==7) {
/* /*
* This may be a spurious interrupt. * This may be a spurious interrupt.
* *
...@@ -39,47 +59,13 @@ int i8259_irq(struct pt_regs *regs) ...@@ -39,47 +59,13 @@ int i8259_irq(struct pt_regs *regs)
* significant bit is not set then there is no valid * significant bit is not set then there is no valid
* interrupt. * interrupt.
*/ */
if(~inb(0x20)&0x80) { if (!pci_intack)
outb(0x0B, 0x20); /* ISR register */
if(~inb(0x20) & 0x80)
irq = -1; irq = -1;
}
} }
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
return irq;
}
/* Poke the 8259's directly using poll commands. */ spin_unlock(&i8259_lock);
int i8259_poll(void)
{
int irq;
spin_lock/*_irqsave*/(&i8259_lock/*, flags*/);
/*
* Perform an interrupt acknowledge cycle on controller 1
*/
outb(0x0C, 0x20); /* prepare for poll */
irq = inb(0x20) & 7;
if (irq == 2) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2
*/
outb(0x0C, 0xA0); /* prepare for poll */
irq = (inb(0xA0) & 7) + 8;
} else if (irq==7) {
/*
* This may be a spurious interrupt
*
* Read the interrupt status register. If the most
* significant bit is not set then there is no valid
* interrupt
*/
outb(0x0b, 0x20);
if(~inb(0x20)&0x80) {
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
return -1;
}
}
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
return irq; return irq;
} }
...@@ -171,11 +157,13 @@ static struct resource pic_edgectrl_iores = { ...@@ -171,11 +157,13 @@ static struct resource pic_edgectrl_iores = {
"8259 edge control", 0x4d0, 0x4d1, IORESOURCE_BUSY "8259 edge control", 0x4d0, 0x4d1, IORESOURCE_BUSY
}; };
/* i8259_init() /*
* i8259_init()
* intack_addr - PCI interrupt acknowledge (real) address which will return * intack_addr - PCI interrupt acknowledge (real) address which will return
* the active irq from the 8259 * the active irq from the 8259
*/ */
void __init i8259_init(long intack_addr) void __init
i8259_init(long intack_addr)
{ {
unsigned long flags; unsigned long flags;
...@@ -209,9 +197,6 @@ void __init i8259_init(long intack_addr) ...@@ -209,9 +197,6 @@ void __init i8259_init(long intack_addr)
request_resource(&ioport_resource, &pic2_iores); request_resource(&ioport_resource, &pic2_iores);
request_resource(&ioport_resource, &pic_edgectrl_iores); request_resource(&ioport_resource, &pic_edgectrl_iores);
/* XXX remove me after board maintainers fix their i8259_init calls */ if (intack_addr != 0)
if (intack_addr == 0) pci_intack = ioremap(intack_addr, 1);
panic("You must supply a PCI interrupt acknowledge address to i8259_init()\n");
pci_intack = ioremap(intack_addr, 1);
} }
...@@ -354,7 +354,7 @@ _GLOBAL(_nmask_and_or_msr) ...@@ -354,7 +354,7 @@ _GLOBAL(_nmask_and_or_msr)
* Flush MMU TLB * Flush MMU TLB
*/ */
_GLOBAL(_tlbia) _GLOBAL(_tlbia)
#if defined(CONFIG_4xx) && defined(CONFIG_PIN_TLB) #if defined(CONFIG_40x) && defined(CONFIG_PIN_TLB)
/* This needs to be coordinated with other pinning functions since /* This needs to be coordinated with other pinning functions since
* we don't keep a memory location of number of entries to reduce * we don't keep a memory location of number of entries to reduce
* cache pollution during these operations. * cache pollution during these operations.
...@@ -401,14 +401,14 @@ _GLOBAL(_tlbia) ...@@ -401,14 +401,14 @@ _GLOBAL(_tlbia)
tlbia tlbia
sync sync
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#endif /* CONFIG_4xx */ #endif /* defined(CONFIG_40x) && defined(CONFIG_PIN_TLB) */
blr blr
/* /*
* Flush MMU TLB for a particular address * Flush MMU TLB for a particular address
*/ */
_GLOBAL(_tlbie) _GLOBAL(_tlbie)
#ifdef CONFIG_4xx #ifdef CONFIG_40x
tlbsx. r3, 0, r3 tlbsx. r3, 0, r3
bne 10f bne 10f
sync sync
...@@ -418,7 +418,7 @@ _GLOBAL(_tlbie) ...@@ -418,7 +418,7 @@ _GLOBAL(_tlbie)
tlbwe r3, r3, TLB_TAG tlbwe r3, r3, TLB_TAG
isync isync
10: 10:
#else #else /* ! CONFIG_40x */
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
rlwinm r8,r1,0,0,18 rlwinm r8,r1,0,0,18
lwz r8,TI_CPU(r8) lwz r8,TI_CPU(r8)
...@@ -451,7 +451,7 @@ _GLOBAL(_tlbie) ...@@ -451,7 +451,7 @@ _GLOBAL(_tlbie)
tlbie r3 tlbie r3
sync sync
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#endif /* CONFIG_4xx */ #endif /* ! CONFIG_40x */
blr blr
/* /*
...@@ -463,7 +463,7 @@ _GLOBAL(flush_instruction_cache) ...@@ -463,7 +463,7 @@ _GLOBAL(flush_instruction_cache)
isync isync
lis r5, IDC_INVALL@h lis r5, IDC_INVALL@h
mtspr IC_CST, r5 mtspr IC_CST, r5
#elif defined(CONFIG_4xx) #elif defined(CONFIG_40x)
#ifdef CONFIG_403GCX #ifdef CONFIG_403GCX
li r3, 512 li r3, 512
mtctr r3 mtctr r3
......
...@@ -799,26 +799,20 @@ static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs) ...@@ -799,26 +799,20 @@ static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs)
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/* This one may be merged with PReP and CHRP */
int int
openpic_get_irq(struct pt_regs *regs) openpic_get_irq(struct pt_regs *regs)
{ {
/*
* Clean up needed. -VAL
*/
int irq = openpic_irq(); int irq = openpic_irq();
/* Management of the cascade should be moved out of here */ /*
* This needs to be cleaned up. We don't necessarily have
/* Yep - because openpic !=> i8259, for one thing. -VAL */ * an i8259 cascaded or even a cascade.
if (open_pic_irq_offset && irq == open_pic_irq_offset) */
{ if (open_pic_irq_offset && irq == open_pic_irq_offset) {
#ifndef CONFIG_GEMINI /* Get the IRQ from the cascade. */
irq = i8259_irq(regs); /* get IRQ from cascade */ irq = i8259_irq(regs);
#endif
openpic_eoi(); openpic_eoi();
} } else if (irq == OPENPIC_VEC_SPURIOUS + open_pic_irq_offset)
if (irq == OPENPIC_VEC_SPURIOUS + open_pic_irq_offset)
irq = -1; irq = -1;
return irq; return irq;
} }
......
...@@ -514,7 +514,7 @@ static struct hard_trap_info ...@@ -514,7 +514,7 @@ static struct hard_trap_info
unsigned int tt; /* Trap type code for powerpc */ unsigned int tt; /* Trap type code for powerpc */
unsigned char signo; /* Signal that we map this trap into */ unsigned char signo; /* Signal that we map this trap into */
} hard_trap_info[] = { } hard_trap_info[] = {
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
{ 0x100, SIGINT }, /* critical input interrupt */ { 0x100, SIGINT }, /* critical input interrupt */
{ 0x200, SIGSEGV }, /* machine check */ { 0x200, SIGSEGV }, /* machine check */
{ 0x300, SIGSEGV }, /* data storage */ { 0x300, SIGSEGV }, /* data storage */
...@@ -613,7 +613,7 @@ handle_exception (struct pt_regs *regs) ...@@ -613,7 +613,7 @@ handle_exception (struct pt_regs *regs)
sigval = computeSignal(regs->trap); sigval = computeSignal(regs->trap);
ptr = remcomOutBuffer; ptr = remcomOutBuffer;
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
*ptr++ = 'S'; *ptr++ = 'S';
*ptr++ = hexchars[sigval >> 4]; *ptr++ = hexchars[sigval >> 4];
*ptr++ = hexchars[sigval & 0xf]; *ptr++ = hexchars[sigval & 0xf];
...@@ -785,7 +785,7 @@ handle_exception (struct pt_regs *regs) ...@@ -785,7 +785,7 @@ handle_exception (struct pt_regs *regs)
* some location may have changed something that is in the instruction cache. * some location may have changed something that is in the instruction cache.
*/ */
kgdb_flush_cache_all(); kgdb_flush_cache_all();
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
strcpy(remcomOutBuffer, "OK"); strcpy(remcomOutBuffer, "OK");
putpacket(remcomOutBuffer); putpacket(remcomOutBuffer);
#endif #endif
...@@ -802,7 +802,7 @@ handle_exception (struct pt_regs *regs) ...@@ -802,7 +802,7 @@ handle_exception (struct pt_regs *regs)
case 's': case 's':
kgdb_flush_cache_all(); kgdb_flush_cache_all();
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
regs->msr |= MSR_DE; regs->msr |= MSR_DE;
regs->dbcr0 |= (DBCR0_IDM | DBCR0_IC); regs->dbcr0 |= (DBCR0_IDM | DBCR0_IC);
set_msr(msr); set_msr(msr);
......
...@@ -21,7 +21,7 @@ obj-y := fault.o init.o mem_pieces.o extable.o \ ...@@ -21,7 +21,7 @@ obj-y := fault.o init.o mem_pieces.o extable.o \
obj-$(CONFIG_PPC_STD_MMU) += hashtable.o ppc_mmu.o tlb.o obj-$(CONFIG_PPC_STD_MMU) += hashtable.o ppc_mmu.o tlb.o
obj-$(CONFIG_PPC_ISERIES) += iSeries_hashtable.o iSeries_mmu.o tlb.o obj-$(CONFIG_PPC_ISERIES) += iSeries_hashtable.o iSeries_mmu.o tlb.o
obj-$(CONFIG_4xx) += 4xx_mmu.o obj-$(CONFIG_40x) += 4xx_mmu.o
obj-$(CONFIG_NOT_COHERENT_CACHE) += cachemap.o obj-$(CONFIG_NOT_COHERENT_CACHE) += cachemap.o
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
ifdef CONFIG_PPC64BRIDGE ifdef CONFIG_PPC64BRIDGE
EXTRA_AFLAGS := -Wa,-mppc64bridge EXTRA_AFLAGS := -Wa,-mppc64bridge
endif endif
ifdef CONFIG_4xx ifdef CONFIG_40x
EXTRA_AFLAGS := -Wa,-m405 EXTRA_AFLAGS := -Wa,-m405
endif endif
......
...@@ -32,42 +32,51 @@ ...@@ -32,42 +32,51 @@
#define DBG(x...) #define DBG(x...)
#endif #endif
void *ep405_bcsr; u8 *ep405_bcsr;
void *ep405_nvram; u8 *ep405_nvram;
static struct {
u8 cpld_xirq_select;
int pci_idsel;
int irq;
} ep405_devtable[] = {
#ifdef CONFIG_EP405PC
{0x07, 0x0E, 25}, /* EP405PC: USB */
#endif
};
#define EP405_DEVTABLE_SIZE (sizeof(ep405_devtable)/sizeof(ep405_devtable[0]))
int __init int __init
ppc405_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) ppc405_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
{ {
static char pci_irq_table[][4] = int i;
/*
* PCI IDSEL/INTPIN->INTLINE /* AFAICT this is only called a few times during PCI setup, so
* A B C D performance is not critical */
*/ for (i = 0; i < EP405_DEVTABLE_SIZE; i++) {
{ if (idsel == ep405_devtable[i].pci_idsel)
{28, 28, 28, 28}, /* IDSEL 1 - PCI slot 1 */ return ep405_devtable[i].irq;
{29, 29, 29, 29}, /* IDSEL 2 - PCI slot 2 */ }
{30, 30, 30, 30}, /* IDSEL 3 - PCI slot 3 */ return -1;
{31, 31, 31, 31}, /* IDSEL 4 - PCI slot 4 */
};
const long min_idsel = 1, max_idsel = 4, irqs_per_slot = 4;
return PCI_IRQ_TABLE_LOOKUP;
}; };
void __init void __init
board_setup_arch(void) board_setup_arch(void)
{ {
bd_t *bip = (bd_t *) __res;
#ifdef CONFIG_PPC_RTC #ifdef CONFIG_PPC_RTC
/* FIXME: what if NVRAM size is not 512k */ if (bip->bi_nvramsize == 512*1024) {
TODC_INIT(TODC_TYPE_DS1557, ep405_nvram, ep405_nvram, ep405_nvram, 8); /* FIXME: we should properly handle NVRTCs of different sizes */
#endif /* CONFIG_PPC_RTC */ TODC_INIT(TODC_TYPE_DS1557, ep405_nvram, ep405_nvram, ep405_nvram, 8);
}
#endif
} }
void __init void __init
bios_fixup(struct pci_controller *hose, void *pcil0_base) bios_fixup(struct pci_controller *hose, struct pcil0_regs *pcip)
{ {
unsigned int bar_response, bar; unsigned int bar_response, bar;
struct pcil0_regs *pcip;
/* /*
* Expected PCI mapping: * Expected PCI mapping:
* *
...@@ -82,29 +91,7 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base) ...@@ -82,29 +91,7 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base)
* *
*/ */
#ifdef DEBUG /* Disable region zero first */
int i;
pcip = (struct pcil0_regs *) pcil0_base;
printk("ioremap PCLIO_BASE = 0x%x\n", pcip);
printk("PCI bridge regs before fixup \n");
for (i = 0; i <= 3; i++) {
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha)));
}
printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms)));
printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la)));
printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms)));
printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la)));
#else
pcip = (struct pcil0_regs *) pcil0_base;
#endif
/* added for IBM boot rom version 1.15 bios bar changes -AK */
/* Disable region first */
out_le32((void *) &(pcip->pmm[0].ma), 0x00000000); out_le32((void *) &(pcip->pmm[0].ma), 0x00000000);
/* PLB starting addr, PCI: 0x80000000 */ /* PLB starting addr, PCI: 0x80000000 */
out_le32((void *) &(pcip->pmm[0].la), 0x80000000); out_le32((void *) &(pcip->pmm[0].la), 0x80000000);
...@@ -133,6 +120,11 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base) ...@@ -133,6 +120,11 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base)
out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); out_le32((void *) &(pcip->pmm[2].ma), 0x00000000);
out_le32((void *) &(pcip->ptm2ms), 0x00000000); out_le32((void *) &(pcip->ptm2ms), 0x00000000);
/* Configure PTM (PCI->PLB) region 1 */
out_le32((void *) &(pcip->ptm1la), 0x00000000); /* PLB base address */
/* Disable PTM region 2 */
out_le32((void *) &(pcip->ptm2ms), 0x00000000);
/* Zero config bars */ /* Zero config bars */
for (bar = PCI_BASE_ADDRESS_1; bar <= PCI_BASE_ADDRESS_2; bar += 4) { for (bar = PCI_BASE_ADDRESS_1; bar <= PCI_BASE_ADDRESS_2; bar += 4) {
early_write_config_dword(hose, hose->first_busno, early_write_config_dword(hose, hose->first_busno,
...@@ -146,42 +138,60 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base) ...@@ -146,42 +138,60 @@ bios_fixup(struct pci_controller *hose, void *pcil0_base)
PCI_FUNC(hose->first_busno), bar, bar_response); PCI_FUNC(hose->first_busno), bar, bar_response);
} }
/* end work arround */ /* end work arround */
#ifdef DEBUG
printk("PCI bridge regs after fixup \n");
for (i = 0; i <= 3; i++) {
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila)));
printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha)));
}
printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms)));
printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la)));
printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms)));
printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la)));
#endif
} }
void __init void __init
board_io_mapping(void) board_io_mapping(void)
{ {
bd_t *bip = (bd_t *) __res;
ep405_bcsr = ioremap(EP405_BCSR_PADDR, EP405_BCSR_SIZE); ep405_bcsr = ioremap(EP405_BCSR_PADDR, EP405_BCSR_SIZE);
ep405_nvram = ioremap(EP405_NVRAM_PADDR, EP405_NVRAM_SIZE);
if (bip->bi_nvramsize > 0) {
ep405_nvram = ioremap(EP405_NVRAM_PADDR, bip->bi_nvramsize);
}
} }
void __init void __init
board_setup_irq(void) board_setup_irq(void)
{ {
int i;
/* Workaround for a bug in the firmware it incorrectly sets
the IRQ polarities for XIRQ0 and XIRQ1 */
mtdcr(DCRN_UIC_PR(DCRN_UIC0_BASE), 0xffffff80); /* set the polarity */
mtdcr(DCRN_UIC_SR(DCRN_UIC0_BASE), 0x00000060); /* clear bogus interrupts */
/* Activate the XIRQs from the CPLD */
writeb(0xf0, ep405_bcsr+10);
/* Set up IRQ routing */
for (i = 0; i < EP405_DEVTABLE_SIZE; i++) {
if ( (ep405_devtable[i].irq >= 25)
&& (ep405_devtable[i].irq) <= 31) {
writeb(ep405_devtable[i].cpld_xirq_select, ep405_bcsr+5);
writeb(ep405_devtable[i].irq - 25, ep405_bcsr+6);
}
}
} }
void __init void __init
board_init(void) board_init(void)
{ {
bd_t *bip = (bd_t *) __res;
#ifdef CONFIG_PPC_RTC #ifdef CONFIG_PPC_RTC
ppc_md.time_init = todc_time_init; /* FIXME: we should be able to access the NVRAM even if PPC_RTC is not configured */
ppc_md.set_rtc_time = todc_set_rtc_time;
ppc_md.get_rtc_time = todc_get_rtc_time;
ppc_md.nvram_read_val = todc_direct_read_val; ppc_md.nvram_read_val = todc_direct_read_val;
ppc_md.nvram_write_val = todc_direct_write_val; ppc_md.nvram_write_val = todc_direct_write_val;
if (bip->bi_nvramsize == 512*1024) {
ppc_md.time_init = todc_time_init;
ppc_md.set_rtc_time = todc_set_rtc_time;
ppc_md.get_rtc_time = todc_get_rtc_time;
} else {
printk("EP405: NVRTC size is not 512k (not a DS1557). Not sure what to do with it\n");
}
#endif #endif
} }
...@@ -22,37 +22,20 @@ typedef struct board_info { ...@@ -22,37 +22,20 @@ typedef struct board_info {
unsigned int bi_intfreq; /* Processor speed, in Hz */ unsigned int bi_intfreq; /* Processor speed, in Hz */
unsigned int bi_busfreq; /* PLB Bus speed, in Hz */ unsigned int bi_busfreq; /* PLB Bus speed, in Hz */
unsigned int bi_pci_busfreq; /* PCI Bus speed, in Hz */ unsigned int bi_pci_busfreq; /* PCI Bus speed, in Hz */
unsigned int bi_nvramsize; /* Size of the NVRAM/RTC */
} bd_t; } bd_t;
/* Some 4xx parts use a different timebase frequency from the internal clock. /* Some 4xx parts use a different timebase frequency from the internal clock.
*/ */
#define bi_tbfreq bi_intfreq #define bi_tbfreq bi_intfreq
extern void *ep405_bcsr; extern u8 *ep405_bcsr;
extern void *ep405_nvram; extern u8 *ep405_nvram;
/* Map for the BCSR and NVRAM space */ /* Map for the BCSR and NVRAM space */
#define EP405_BCSR_PADDR ((uint)0xf4000000) #define EP405_BCSR_PADDR ((uint)0xf4000000)
#define EP405_BCSR_SIZE ((uint)16) #define EP405_BCSR_SIZE ((uint)16)
#define EP405_NVRAM_PADDR ((uint)0xf4200000) #define EP405_NVRAM_PADDR ((uint)0xf4200000)
/* FIXME: what if the board has something other than 512k NVRAM */
#define EP405_NVRAM_SIZE ((uint)512*1024)
/* Early initialization address mapping for block_io.
* Standard 405GP map.
*/
#define PPC4xx_PCI_IO_PADDR ((uint)PPC405_PCI_PHY_IO_BASE)
#define PPC4xx_PCI_IO_VADDR PPC4xx_PCI_IO_PADDR
#define PPC4xx_PCI_IO_SIZE ((uint)64*1024)
#define PPC4xx_PCI_CFG_PADDR ((uint)PPC405_PCI_CONFIG_ADDR)
#define PPC4xx_PCI_CFG_VADDR PPC4xx_PCI_CFG_PADDR
#define PPC4xx_PCI_CFG_SIZE ((uint)4*1024)
#define PPC4xx_PCI_LCFG_PADDR ((uint)0xef400000)
#define PPC4xx_PCI_LCFG_VADDR PPC4xx_PCI_LCFG_PADDR
#define PPC4xx_PCI_LCFG_SIZE ((uint)4*1024)
#define PPC4xx_ONB_IO_PADDR ((uint)0xef600000)
#define PPC4xx_ONB_IO_VADDR PPC4xx_ONB_IO_PADDR
#define PPC4xx_ONB_IO_SIZE ((uint)4*1024)
/* serial defines */ /* serial defines */
#define BASE_BAUD 399193 #define BASE_BAUD 399193
......
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
* *
* Version 1.0 (02/01/17) - A. Kuster * Version 1.0 (02/01/17) - A. Kuster
* Initial version - moved 405 specific out of the other core.h's * Initial version - moved 405 specific out of the other core.h's
*
* Version 1.0 (02/08/02) - A. Kuster
* removed DCRN_UIC1_BASE to NP405L & H
*/ */
#ifdef __KERNEL__ #ifdef __KERNEL__
...@@ -57,7 +60,6 @@ ...@@ -57,7 +60,6 @@
#define DCRN_CHCR0 (DCRN_CHCR_BASE + 0x0) /* Chip Control Register 1 */ #define DCRN_CHCR0 (DCRN_CHCR_BASE + 0x0) /* Chip Control Register 1 */
#define DCRN_CHCR1 (DCRN_CHCR_BASE + 0x1) /* Chip Control Register 2 */ #define DCRN_CHCR1 (DCRN_CHCR_BASE + 0x1) /* Chip Control Register 2 */
#endif #endif
#define CHR1_CETE 0x00800000 /* CPU external timer enable */
#define CHR1_PCIPW 0x00008000 /* PCI Int enable/Peripheral Write enable */ #define CHR1_PCIPW 0x00008000 /* PCI Int enable/Peripheral Write enable */
#ifdef DCRN_CHPSR_BASE #ifdef DCRN_CHPSR_BASE
...@@ -211,25 +213,38 @@ ...@@ -211,25 +213,38 @@
#define IOCR_SCS 0x00000002 #define IOCR_SCS 0x00000002
#define IOCR_SPC 0x00000001 #define IOCR_SPC 0x00000001
#ifdef DCRN_MAL_BASE #define DCRN_MALCR(base) (base + 0x0) /* MAL Configuration */
#define DCRN_MALCR (DCRN_MAL_BASE + 0x0) /* MAL Configuration */ #define DCRN_MALDBR(base) ((base) + 0x3) /* Debug Register */
#define DCRN_MALDBR (DCRN_MAL_BASE + 0x3) /* Debug Register */ #define DCRN_MALESR(base) ((base) + 0x1) /* Error Status */
#define DCRN_MALESR (DCRN_MAL_BASE + 0x1) /* Error Status */ #define DCRN_MALIER(base) ((base) + 0x2) /* Interrupt Enable */
#define DCRN_MALIER (DCRN_MAL_BASE + 0x2) /* Interrupt Enable */ #define DCRN_MALTXCARR(base) ((base) + 0x5) /* TX Channed Active Reset Register */
#define DCRN_MALTXCARR (DCRN_MAL_BASE + 0x5) /* TX Channed Active Reset Register */ #define DCRN_MALTXCASR(base) ((base) + 0x4) /* TX Channel Active Set Register */
#define DCRN_MALTXCASR (DCRN_MAL_BASE + 0x4) /* TX Channel Active Set Register */ #define DCRN_MALTXDEIR(base) ((base) + 0x7) /* Tx Descriptor Error Interrupt */
#define DCRN_MALTXDEIR (DCRN_MAL_BASE + 0x7) /* Tx Descriptor Error Interrupt */ #define DCRN_MALTXEOBISR(base) ((base) + 0x6) /* Tx End of Buffer Interrupt Status */
#define DCRN_MALTXEOBISR (DCRN_MAL_BASE + 0x6) /* Tx End of Buffer Interrupt Status */ #define DCRN_MALRXCARR(base) ((base) + 0x11) /* RX Channed Active Reset Register */
#define DCRN_MALRXCARR (DCRN_MAL_BASE + 0x11) /* RX Channed Active Reset Register */ #define DCRN_MALRXCASR(base) ((base) + 0x10) /* RX Channel Active Set Register */
#define DCRN_MALRXCASR (DCRN_MAL_BASE + 0x10) /* RX Channel Active Set Register */ #define DCRN_MALRXDEIR(base) ((base) + 0x13) /* Rx Descriptor Error Interrupt */
#define DCRN_MALRXDEIR (DCRN_MAL_BASE + 0x13) /* Rx Descriptor Error Interrupt */ #define DCRN_MALRXEOBISR(base) ((base) + 0x12) /* Rx End of Buffer Interrupt Status */
#define DCRN_MALRXEOBISR (DCRN_MAL_BASE + 0x12) /* Rx End of Buffer Interrupt Status */ #define DCRN_MALRXCTP0R(base) ((base) + 0x40) /* Channel Rx 0 Channel Table Pointer */
#define DCRN_MALRXCTP0R (DCRN_MAL_BASE + 0x40) /* Channel Rx 0 Channel Table Pointer */ #define DCRN_MALRXCTP1R(base) ((base) + 0x41) /* Channel Rx 1 Channel Table Pointer */
#define DCRN_MALTXCTP0R (DCRN_MAL_BASE + 0x20) /* Channel Tx 0 Channel Table Pointer */ #define DCRN_MALTXCTP0R(base) ((base) + 0x20) /* Channel Tx 0 Channel Table Pointer */
#define DCRN_MALTXCTP1R (DCRN_MAL_BASE + 0x21) /* Channel Tx 1 Channel Table Pointer */ #define DCRN_MALTXCTP1R(base) ((base) + 0x21) /* Channel Tx 1 Channel Table Pointer */
#define DCRN_MALRCBS0 (DCRN_MAL_BASE + 0x60) /* Channel Rx 0 Channel Buffer Size */ #define DCRN_MALTXCTP2R(base) ((base) + 0x22) /* Channel Tx 2 Channel Table Pointer */
#endif #define DCRN_MALTXCTP3R(base) ((base) + 0x23) /* Channel Tx 3 Channel Table Pointer */
/* DCRN_MALCR */ #define DCRN_MALRCBS0(base) ((base) + 0x60) /* Channel Rx 0 Channel Buffer Size */
#define DCRN_MALRCBS1(base) ((base) + 0x61) /* Channel Rx 1 Channel Buffer Size */
/* EMAC DCRN's */
#define DCRN_MALRXCTP2R(base) ((base) + 0x42) /* Channel Rx 2 Channel Table Pointer */
#define DCRN_MALRXCTP3R(base) ((base) + 0x43) /* Channel Rx 3 Channel Table Pointer */
#define DCRN_MALTXCTP4R(base) ((base) + 0x24) /* Channel Tx 4 Channel Table Pointer */
#define DCRN_MALTXCTP5R(base) ((base) + 0x25) /* Channel Tx 5 Channel Table Pointer */
#define DCRN_MALTXCTP6R(base) ((base) + 0x26) /* Channel Tx 6 Channel Table Pointer */
#define DCRN_MALTXCTP7R(base) ((base) + 0x27) /* Channel Tx 7 Channel Table Pointer */
#define DCRN_MALRCBS2(base) ((base) + 0x62) /* Channel Rx 2 Channel Buffer Size */
#define DCRN_MALRCBS3(base) ((base) + 0x63) /* Channel Rx 3 Channel Buffer Size */
/* DCRN_MALCR */
#define MALCR_MMSR 0x80000000 /* MAL Software reset */ #define MALCR_MMSR 0x80000000 /* MAL Software reset */
#define MALCR_PLBP_1 0x00400000 /* MAL reqest priority: */ #define MALCR_PLBP_1 0x00400000 /* MAL reqest priority: */
#define MALCR_PLBP_2 0x00800000 /* lowsest is 00 */ #define MALCR_PLBP_2 0x00800000 /* lowsest is 00 */
...@@ -294,28 +309,14 @@ ...@@ -294,28 +309,14 @@
#define DCRN_POB0_BESR1 (DCRN_POB0_BASE + 0x4) #define DCRN_POB0_BESR1 (DCRN_POB0_BASE + 0x4)
#endif #endif
#ifdef DCRN_UIC0_BASE #define DCRN_UIC_SR(base) (base + 0x0)
#define DCRN_UIC0_SR (DCRN_UIC0_BASE + 0x0) #define DCRN_UIC_ER(base) (base + 0x2)
#define DCRN_UIC0_ER (DCRN_UIC0_BASE + 0x2) #define DCRN_UIC_CR(base) (base + 0x3)
#define DCRN_UIC0_CR (DCRN_UIC0_BASE + 0x3) #define DCRN_UIC_PR(base) (base + 0x4)
#define DCRN_UIC0_PR (DCRN_UIC0_BASE + 0x4) #define DCRN_UIC_TR(base) (base + 0x5)
#define DCRN_UIC0_TR (DCRN_UIC0_BASE + 0x5) #define DCRN_UIC_MSR(base) (base + 0x6)
#define DCRN_UIC0_MSR (DCRN_UIC0_BASE + 0x6) #define DCRN_UIC_VR(base) (base + 0x7)
#define DCRN_UIC0_VR (DCRN_UIC0_BASE + 0x7) #define DCRN_UIC_VCR(base) (base + 0x8)
#define DCRN_UIC0_VCR (DCRN_UIC0_BASE + 0x8)
#endif
#ifdef DCRN_UIC1_BASE
#define DCRN_UIC1_SR (DCRN_UIC1_BASE + 0x0)
#define DCRN_UIC1_SRS (DCRN_UIC1_BASE + 0x1)
#define DCRN_UIC1_ER (DCRN_UIC1_BASE + 0x2)
#define DCRN_UIC1_CR (DCRN_UIC1_BASE + 0x3)
#define DCRN_UIC1_PR (DCRN_UIC1_BASE + 0x4)
#define DCRN_UIC1_TR (DCRN_UIC1_BASE + 0x5)
#define DCRN_UIC1_MSR (DCRN_UIC1_BASE + 0x6)
#define DCRN_UIC1_VR (DCRN_UIC1_BASE + 0x7)
#define DCRN_UIC1_VCR (DCRN_UIC1_BASE + 0x8)
#endif
#ifdef DCRN_SDRAM0_BASE #ifdef DCRN_SDRAM0_BASE
#define DCRN_SDRAM0_CFGADDR (DCRN_SDRAM0_BASE + 0x0) /* Memory Controller Address */ #define DCRN_SDRAM0_CFGADDR (DCRN_SDRAM0_BASE + 0x0) /* Memory Controller Address */
......
...@@ -36,6 +36,13 @@ ...@@ -36,6 +36,13 @@
* *
* Version 1.1 02/01/17 - A. Kuster * Version 1.1 02/01/17 - A. Kuster
* Moved offsets to ibm405.h * Moved offsets to ibm405.h
*
* Version 1.2 05/01/02 - Armin
* added IIC_PORT_DFNS
*
* Version 1.3 - armin
* removed iic & uart num defines
* and IIC_PORT_DFNS
*/ */
#ifdef __KERNEL__ #ifdef __KERNEL__
...@@ -88,30 +95,36 @@ ...@@ -88,30 +95,36 @@
#define UART1_INT 1 #define UART1_INT 1
#define PCIL0_BASE 0xEF400000 #define PCIL0_BASE 0xEF400000
#define UART0_IO_BASE (u8 *) 0xEF600300 #define UART0_IO_BASE 0xEF600300
#define UART1_IO_BASE (u8 *) 0xEF600400 #define UART1_IO_BASE 0xEF600400
#define IIC0_BASE 0xEF600500 #define IIC0_BASE 0xEF600500
#define OPB0_BASE 0xEF600600 #define OPB0_BASE 0xEF600600
#define GPIO0_BASE 0xEF600700 #define GPIO0_BASE 0xEF600700
#define EMAC0_BASE 0xEF600800 #define EMAC0_BASE 0xEF600800
#define EMAC_NUMS 1 #define EMAC_NUMS 1
#define UART_NUMS 2 #define IIC0_IRQ 2
#define IIC1_IRQ 0
#define IIC_OWN 0x55
#define IIC_CLOCK 50
#define BD_EMAC_ADDR(e,i) bi_enetaddr[i] #define BD_EMAC_ADDR(e,i) bi_enetaddr[i]
#define STD_UART_OP(num) \ #define STD_UART_OP(num) \
{ 0, BASE_BAUD, 0, UART##num##_INT, \ { 0, BASE_BAUD, 0, UART##num##_INT, \
(ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \
iomem_base: UART##num##_IO_BASE, \ iomem_base: (u8 *)UART##num##_IO_BASE, \
io_type: SERIAL_IO_MEM}, io_type: SERIAL_IO_MEM},
#if defined(CONFIG_UART0_TTYS0) #if defined(CONFIG_UART0_TTYS0)
#define SERIAL_DEBUG_IO_BASE UART0_IO_BASE
#define SERIAL_PORT_DFNS \ #define SERIAL_PORT_DFNS \
STD_UART_OP(0) \ STD_UART_OP(0) \
STD_UART_OP(1) STD_UART_OP(1)
#endif #endif
#if defined(CONFIG_UART0_TTYS1) #if defined(CONFIG_UART0_TTYS1)
#define SERIAL_DEBUG_IO_BASE UART1_IO_BASE
#define SERIAL_PORT_DFNS \ #define SERIAL_PORT_DFNS \
STD_UART_OP(1) \ STD_UART_OP(1) \
STD_UART_OP(0) STD_UART_OP(0)
...@@ -123,6 +136,11 @@ ...@@ -123,6 +136,11 @@
#define DCRN_CPMSR_BASE 0x0B8 #define DCRN_CPMSR_BASE 0x0B8
#define DCRN_CPMFR_BASE 0x0BA #define DCRN_CPMFR_BASE 0x0BA
#define CHR0_U0EC 0x00000080 /* Select external clock for UART0 */
#define CHR0_U1EC 0x00000040 /* Select external clock for UART1 */
#define CHR0_UDIV 0x0000003E /* UART internal clock divisor */
#define CHR1_CETE 0x00800000 /* CPU external timer enable */
#define DCRN_CHPSR_BASE 0x0B4 #define DCRN_CHPSR_BASE 0x0B4
#define PSR_PLL_FWD_MASK 0xC0000000 #define PSR_PLL_FWD_MASK 0xC0000000
#define PSR_PLL_FDBACK_MASK 0x30000000 #define PSR_PLL_FDBACK_MASK 0x30000000
...@@ -169,6 +187,7 @@ ...@@ -169,6 +187,7 @@
#define DCRN_POB0_BASE 0x0A0 #define DCRN_POB0_BASE 0x0A0
#define DCRN_SDRAM0_BASE 0x010 #define DCRN_SDRAM0_BASE 0x010
#define DCRN_UIC0_BASE 0x0C0 #define DCRN_UIC0_BASE 0x0C0
#define UIC0 DCRN_UIC0_BASE
#include <platforms/ibm405.h> #include <platforms/ibm405.h>
......
/* /*
* ibm_ips.h * ibm_ocp.h
* *
* This was dirived from the ppc4xx.h and all 405GP specific definition and board * This was dirived from the ppc4xx.h and all 405GP specific definition and board
* inclusions where moved here. * inclusions where moved here.
...@@ -36,8 +36,8 @@ ...@@ -36,8 +36,8 @@
*/ */
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifndef __ASM_IBM_IPS_H__ #ifndef __ASM_IBM_OCP_H__
#define __ASM_IBM_IPS_H__ #define __ASM_IBM_OCP_H__
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/types.h> #include <linux/types.h>
...@@ -188,5 +188,5 @@ typedef struct ide_regs { ...@@ -188,5 +188,5 @@ typedef struct ide_regs {
} ide_t; } ide_t;
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ASM_IBM_IPS_H__ */ #endif /* __ASM_IBM_OCP_H__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Author: Dan Cox * Author: Dan Cox
* danc@mvista.com (or, alternately, source@mvista.com) * danc@mvista.com (or, alternately, source@mvista.com)
* *
* Copyright 2001 MontaVista Software Inc. * Copyright 2001-2002 MontaVista Software Inc.
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the
...@@ -14,18 +14,11 @@ ...@@ -14,18 +14,11 @@
* option) any later version. * option) any later version.
*/ */
#include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/slab.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/byteorder.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <asm/open_pic.h>
#include <asm/mpc10x.h> #include <asm/mpc10x.h>
static inline int __init static inline int __init
......
...@@ -15,34 +15,23 @@ ...@@ -15,34 +15,23 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/pci.h>
#include <linux/time.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/major.h> #include <linux/delay.h>
#include <linux/kdev_t.h> #include <linux/pci_ids.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/blk.h>
#include <linux/console.h> #include <linux/console.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/machdep.h>
#include <asm/page.h>
#include <asm/dma.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/time.h>
#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/open_pic.h> #include <asm/open_pic.h>
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/pci-bridge.h>
#include <asm/todc.h> #include <asm/todc.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/mpc10x.h> #include <asm/mpc10x.h>
#include <asm/hw_irq.h>
extern void lopec_find_bridges(void); extern void lopec_find_bridges(void);
...@@ -230,7 +219,7 @@ lopec_init_IRQ(void) ...@@ -230,7 +219,7 @@ lopec_init_IRQ(void)
i8259_init(0xfef00000); i8259_init(0xfef00000);
} }
void __init static int __init
lopec_request_io(void) lopec_request_io(void)
{ {
outb(0x00, 0x4d0); outb(0x00, 0x4d0);
...@@ -242,9 +231,11 @@ lopec_request_io(void) ...@@ -242,9 +231,11 @@ lopec_request_io(void)
request_region(0x80, 0x10, "dma page reg"); request_region(0x80, 0x10, "dma page reg");
request_region(0xa0, 0x20, "pic2"); request_region(0xa0, 0x20, "pic2");
request_region(0xc0, 0x20, "dma2"); request_region(0xc0, 0x20, "dma2");
return 0;
} }
arch_initcall(lopec_request_io); device_initcall(lopec_request_io);
static void __init static void __init
lopec_map_io(void) lopec_map_io(void)
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Author: Mark A. Greer * Author: Mark A. Greer
* mgreer@mvista.com * mgreer@mvista.com
* *
* Copyright 2001 MontaVista Software Inc. * Copyright 2001-2002 MontaVista Software Inc.
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -125,7 +124,7 @@ mcpn765_setup_arch(void) ...@@ -125,7 +124,7 @@ mcpn765_setup_arch(void)
OpenPIC_NumInitSenses = sizeof(mcpn765_openpic_initsenses); OpenPIC_NumInitSenses = sizeof(mcpn765_openpic_initsenses);
printk("Motorola MCG MCPN765 cPCI Non-System Board\n"); printk("Motorola MCG MCPN765 cPCI Non-System Board\n");
printk("MCPN765 port (C) 2001 MontaVista Software, Inc. (source@mvista.com)\n"); printk("MCPN765 port (MontaVista Software, Inc. (source@mvista.com))\n");
if ( ppc_md.progress ) if ( ppc_md.progress )
ppc_md.progress("mcpn765_setup_arch: exit", 0); ppc_md.progress("mcpn765_setup_arch: exit", 0);
......
...@@ -72,7 +72,6 @@ ...@@ -72,7 +72,6 @@
#include <asm/todc.h> #include <asm/todc.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#undef CONFIG_SERIAL_TEXT_DEBUG
#undef DUMP_DBATS #undef DUMP_DBATS
TODC_ALLOC(); TODC_ALLOC();
...@@ -500,9 +499,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5, ...@@ -500,9 +499,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
#ifdef CONFIG_SERIAL_TEXT_DEBUG #ifdef CONFIG_SERIAL_TEXT_DEBUG
ppc_md.progress = pplus_progress; ppc_md.progress = pplus_progress;
#else /* !CONFIG_SERIAL_TEXT_DEBUG */ #endif
ppc_md.progress = NULL;
#endif /* CONFIG_SERIAL_TEXT_DEBUG */
#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
ppc_ide_md.default_irq = pplus_ide_default_irq; ppc_ide_md.default_irq = pplus_ide_default_irq;
......
...@@ -117,9 +117,6 @@ prep_show_cpuinfo(struct seq_file *m) ...@@ -117,9 +117,6 @@ prep_show_cpuinfo(struct seq_file *m)
{ {
extern char *Motherboard_map_name; extern char *Motherboard_map_name;
int cachew; int cachew;
#ifdef CONFIG_PREP_RESIDUAL
int i;
#endif
seq_printf(m, "machine\t\t: PReP %s\n", Motherboard_map_name); seq_printf(m, "machine\t\t: PReP %s\n", Motherboard_map_name);
...@@ -180,6 +177,8 @@ prep_show_cpuinfo(struct seq_file *m) ...@@ -180,6 +177,8 @@ prep_show_cpuinfo(struct seq_file *m)
no_l2: no_l2:
#ifdef CONFIG_PREP_RESIDUAL #ifdef CONFIG_PREP_RESIDUAL
if (res->ResidualLength != 0) { if (res->ResidualLength != 0) {
int i;
/* print info about SIMMs */ /* print info about SIMMs */
seq_printf(m, "simms\t\t: "); seq_printf(m, "simms\t\t: ");
for (i = 0; (res->ActualNumMemories) && (i < MAX_MEMS); i++) { for (i = 0; (res->ActualNumMemories) && (i < MAX_MEMS); i++) {
...@@ -812,8 +811,8 @@ prep_map_io(void) ...@@ -812,8 +811,8 @@ prep_map_io(void)
io_block_mapping(0xf0000000, PREP_ISA_MEM_BASE, 0x08000000, _PAGE_IO); io_block_mapping(0xf0000000, PREP_ISA_MEM_BASE, 0x08000000, _PAGE_IO);
} }
static void __init static int __init
prep_init2(void) prep_request_io(void)
{ {
#ifdef CONFIG_NVRAM #ifdef CONFIG_NVRAM
request_region(PREP_NVRAM_AS0, 0x8, "nvram"); request_region(PREP_NVRAM_AS0, 0x8, "nvram");
...@@ -822,8 +821,12 @@ prep_init2(void) ...@@ -822,8 +821,12 @@ prep_init2(void)
request_region(0x40,0x20,"timer"); request_region(0x40,0x20,"timer");
request_region(0x80,0x10,"dma page reg"); request_region(0x80,0x10,"dma page reg");
request_region(0xc0,0x20,"dma2"); request_region(0xc0,0x20,"dma2");
return 0;
} }
device_initcall(prep_request_io);
void __init void __init
prep_init(unsigned long r3, unsigned long r4, unsigned long r5, prep_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7) unsigned long r6, unsigned long r7)
...@@ -863,7 +866,6 @@ prep_init(unsigned long r3, unsigned long r4, unsigned long r5, ...@@ -863,7 +866,6 @@ prep_init(unsigned long r3, unsigned long r4, unsigned long r5,
ppc_md.init_IRQ = prep_init_IRQ; ppc_md.init_IRQ = prep_init_IRQ;
/* this gets changed later on if we have an OpenPIC -- Cort */ /* this gets changed later on if we have an OpenPIC -- Cort */
ppc_md.get_irq = i8259_irq; ppc_md.get_irq = i8259_irq;
ppc_md.init = prep_init2;
ppc_md.restart = prep_restart; ppc_md.restart = prep_restart;
ppc_md.power_off = prep_power_off; ppc_md.power_off = prep_power_off;
......
...@@ -876,3 +876,38 @@ PnP_TAG_PACKET __init *PnP_find_large_vendor_packet(unsigned char *p, ...@@ -876,3 +876,38 @@ PnP_TAG_PACKET __init *PnP_find_large_vendor_packet(unsigned char *p,
}; };
return 0; /* not found */ return 0; /* not found */
} }
#ifdef CONFIG_PROC_PREPRESIDUAL
static int proc_prep_residual_read(char * buf, char ** start, off_t off,
int count, int *eof, void *data)
{
int n;
n = res->ResidualLength - off;
if (n < 0) {
*eof = 1;
n = 0;
}
else {
if (n > count)
n = count;
else
*eof = 1;
memcpy(buf, (char *)res + off, n);
*start = buf;
}
return n;
}
void __init
proc_prep_residual_init(void)
{
if (res->ResidualLength)
create_proc_read_entry("residual", S_IRUGO, NULL,
proc_prep_residual_read, NULL);
}
__initcall(proc_prep_residual_init);
#endif
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Author: Mark A. Greer * Author: Mark A. Greer
* mgreer@mvista.com * mgreer@mvista.com
* *
* Copyright 2000, 2001 MontaVista Software Inc. * Copyright 2000-2002 MontaVista Software Inc.
* *
* This program is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License as published by the
...@@ -71,7 +71,6 @@ ...@@ -71,7 +71,6 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -180,7 +179,7 @@ sandpoint_setup_arch(void) ...@@ -180,7 +179,7 @@ sandpoint_setup_arch(void)
#endif #endif
printk("Motorola SPS Sandpoint Test Platform\n"); printk("Motorola SPS Sandpoint Test Platform\n");
printk("Sandpoint port (C) 2000, 2001 MontaVista Software, Inc. (source@mvista.com)\n"); printk("Sandpoint port (MontaVista Software, Inc. (source@mvista.com))\n");
/* The Sandpoint rom doesn't enable any caches. Do that now. /* The Sandpoint rom doesn't enable any caches. Do that now.
* The 7450 portion will also set up the L3s once I get enough * The 7450 portion will also set up the L3s once I get enough
......
...@@ -262,6 +262,18 @@ static __inline__ int ffs(int x) ...@@ -262,6 +262,18 @@ static __inline__ int ffs(int x)
return __ilog2(x & -x) + 1; return __ilog2(x & -x) + 1;
} }
/*
* fls: find last (most-significant) bit set.
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
*/
static __inline__ int fls(unsigned int x)
{
int lz;
asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
return 32 - lz;
}
/* /*
* hweightN: returns the hamming weight (i.e. the number * hweightN: returns the hamming weight (i.e. the number
* of bits set) of a N-bit word * of bits set) of a N-bit word
......
...@@ -59,7 +59,7 @@ static inline int irqs_running (void) ...@@ -59,7 +59,7 @@ static inline int irqs_running (void)
for (i = 0; i < smp_num_cpus; i++) for (i = 0; i < smp_num_cpus; i++)
if (local_irq_count(i)) if (local_irq_count(i))
return 1; return 1;
return 0; return 0;
} }
static inline void release_irqlock(int cpu) static inline void release_irqlock(int cpu)
......
...@@ -9,8 +9,7 @@ ...@@ -9,8 +9,7 @@
extern struct hw_interrupt_type i8259_pic; extern struct hw_interrupt_type i8259_pic;
void i8259_init(long); extern void i8259_init(long intack_addr);
int i8259_irq(struct pt_regs *regs); extern int i8259_irq(struct pt_regs *regs);
int i8259_poll(void);
#endif /* _PPC_KERNEL_i8259_H */ #endif /* _PPC_KERNEL_i8259_H */
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_4xx #ifdef CONFIG_40x
#if defined(CONFIG_ASH) #if defined(CONFIG_ASH)
#include <platforms/ash.h> #include <platforms/ash.h>
...@@ -54,9 +54,7 @@ ...@@ -54,9 +54,7 @@
#define PPC4xx_MACHINE_NAME "Unidentified 4xx class" #define PPC4xx_MACHINE_NAME "Unidentified 4xx class"
#endif #endif
#ifndef NR_BOARD_IRQS
#define NR_BOARD_IRQS 0
#endif
/* IO_BASE is for PCI I/O. /* IO_BASE is for PCI I/O.
* ISA not supported, just here to resolve copilation. * ISA not supported, just here to resolve copilation.
...@@ -95,6 +93,6 @@ extern unsigned char __res[]; ...@@ -95,6 +93,6 @@ extern unsigned char __res[];
asm volatile("mtdcr " stringify(rn) ",%0" : : "r" (v));} asm volatile("mtdcr " stringify(rn) ",%0" : : "r" (v));}
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* CONFIG_4xx */ #endif /* CONFIG_40x */
#endif /* __ASM_IBM4XX_H__ */ #endif /* __ASM_IBM4XX_H__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#define PREP_ISA_MEM_BASE 0xc0000000 #define PREP_ISA_MEM_BASE 0xc0000000
#define PREP_PCI_DRAM_OFFSET 0x80000000 #define PREP_PCI_DRAM_OFFSET 0x80000000
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
#include <asm/ibm4xx.h> #include <asm/ibm4xx.h>
#elif defined(CONFIG_8xx) #elif defined(CONFIG_8xx)
#include <asm/mpc8xx.h> #include <asm/mpc8xx.h>
...@@ -412,11 +412,43 @@ static inline int isa_check_signature(unsigned long io_addr, ...@@ -412,11 +412,43 @@ static inline int isa_check_signature(unsigned long io_addr,
return 0; return 0;
} }
/* Nothing to do */ #ifdef CONFIG_NOT_COHERENT_CACHE
/*
* DMA-consistent mapping functions for PowerPCs that don't support
* cache snooping. These allocate/free a region of uncached mapped
* memory space for use with DMA devices. Alternatively, you could
* allocate the space "normally" and use the cache management functions
* to ensure it is consistent.
*/
extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
extern void consistent_free(void *vaddr);
extern void consistent_sync(void *vaddr, size_t size, int rw);
extern void consistent_sync_page(struct page *page, unsigned long offset,
size_t size, int rw);
#define dma_cache_inv(_start,_size) \
invalidate_dcache_range(_start, (_start + _size))
#define dma_cache_wback(_start,_size) \
clean_dcache_range(_start, (_start + _size))
#define dma_cache_wback_inv(_start,_size) \
flush_dcache_range(_start, (_start + _size))
#else /* ! CONFIG_NOT_COHERENT_CACHE */
/*
* Cache coherent cores.
*/
#define dma_cache_inv(_start,_size) do { } while (0) #define dma_cache_inv(_start,_size) do { } while (0)
#define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback(_start,_size) do { } while (0)
#define dma_cache_wback_inv(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0)
#endif #define consistent_alloc(gfp, size, handle) NULL
#define consistent_free(addr, size) do { } while (0)
#define consistent_sync(addr, size, rw) do { } while (0)
#define consistent_sync_page(pg, off, sz, rw) do { } while (0)
#endif /* ! CONFIG_NOT_COHERENT_CACHE */
#endif /* _PPC_IO_H */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
...@@ -13,8 +13,22 @@ extern void disable_irq(unsigned int); ...@@ -13,8 +13,22 @@ extern void disable_irq(unsigned int);
extern void disable_irq_nosync(unsigned int); extern void disable_irq_nosync(unsigned int);
extern void enable_irq(unsigned int); extern void enable_irq(unsigned int);
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
#include <asm/ibm4xx.h> #include <asm/ibm4xx.h>
#ifndef NR_BOARD_IRQS
#define NR_BOARD_IRQS 0
#endif
#ifndef UIC_WIDTH /* Number of interrupts per device */
#define UIC_WIDTH 32
#endif
#ifndef NR_UICS /* number of UIC devices */
#define NR_UICS 1
#endif
#if defined (CONFIG_403)
/* /*
* The PowerPC 403 cores' Asynchronous Interrupt Controller (AIC) has * The PowerPC 403 cores' Asynchronous Interrupt Controller (AIC) has
* 32 possible interrupts, a majority of which are not implemented on * 32 possible interrupts, a majority of which are not implemented on
...@@ -22,26 +36,36 @@ extern void enable_irq(unsigned int); ...@@ -22,26 +36,36 @@ extern void enable_irq(unsigned int);
* there are eight internal interrupts for the on-chip serial port * there are eight internal interrupts for the on-chip serial port
* (SPU), DMA controller, and JTAG controller. * (SPU), DMA controller, and JTAG controller.
* *
* The PowerPC 405 cores' Universal Interrupt Controller (UIC) has 32 */
#define NR_AIC_IRQS 32
#define NR_IRQS (NR_AIC_IRQS + NR_BOARD_IRQS)
#elif !defined (CONFIG_403)
/*
* The PowerPC 405 cores' Universal Interrupt Controller (UIC) has 32
* possible interrupts as well. There are seven, configurable external * possible interrupts as well. There are seven, configurable external
* interrupt pins and there are 17 internal interrupts for the on-chip * interrupt pins and there are 17 internal interrupts for the on-chip
* serial port, DMA controller, on-chip Ethernet controller, PCI, etc. * serial port, DMA controller, on-chip Ethernet controller, PCI, etc.
* *
*/ */
#define NR_AIC_IRQS 32
#define NR_IRQS (NR_AIC_IRQS + NR_BOARD_IRQS)
#define NR_UIC_IRQS UIC_WIDTH
#define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
#endif
static __inline__ int static __inline__ int
irq_cannonicalize(int irq) irq_cannonicalize(int irq)
{ {
return (irq); return (irq);
} }
#elif defined (CONFIG_NP405) #elif defined(CONFIG_440)
#include <asm/ibm440.h>
#define NR_AIC_IRQS 32 #define NR_UIC_IRQS 64
#define NR_IRQS (NR_AIC_IRQS + NR_BOARD_IRQS) #define NR_IRQS (NR_UIC_IRQS + NR_BOARD_IRQS)
static __inline__ int static __inline__ int
irq_cannonicalize(int irq) irq_cannonicalize(int irq)
...@@ -119,7 +143,7 @@ static __inline__ int irq_cannonicalize(int irq) ...@@ -119,7 +143,7 @@ static __inline__ int irq_cannonicalize(int irq)
return irq; return irq;
} }
#else /* CONFIG_4xx + CONFIG_8xx */ #else /* CONFIG_40x + CONFIG_8xx */
/* /*
* this is the # irq's for all ppc arch's (pmac/chrp/prep) * this is the # irq's for all ppc arch's (pmac/chrp/prep)
* so it is the max of them all * so it is the max of them all
......
...@@ -20,6 +20,7 @@ extern void pgd_free(pgd_t *pgd); ...@@ -20,6 +20,7 @@ extern void pgd_free(pgd_t *pgd);
*/ */
#define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); })
#define pmd_free(x) do { } while (0) #define pmd_free(x) do { } while (0)
#define pmd_free_tlb(tlb,x) do { } while (0)
#define pgd_populate(mm, pmd, pte) BUG() #define pgd_populate(mm, pmd, pte) BUG()
#define pmd_populate_kernel(mm, pmd, pte) \ #define pmd_populate_kernel(mm, pmd, pte) \
...@@ -32,6 +33,8 @@ extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr); ...@@ -32,6 +33,8 @@ extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr);
extern void pte_free_kernel(pte_t *pte); extern void pte_free_kernel(pte_t *pte);
extern void pte_free(struct page *pte); extern void pte_free(struct page *pte);
#define pte_free_tlb(tlb, pte) pte_free((pte))
#define check_pgt_cache() do { } while (0) #define check_pgt_cache() do { } while (0)
#endif /* _PPC_PGALLOC_H */ #endif /* _PPC_PGALLOC_H */
......
...@@ -125,9 +125,9 @@ extern unsigned long ioremap_bot, ioremap_base; ...@@ -125,9 +125,9 @@ extern unsigned long ioremap_bot, ioremap_base;
* (hardware-defined) PowerPC PTE as closely as possible. * (hardware-defined) PowerPC PTE as closely as possible.
*/ */
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
/* There are several potential gotchas here. The 4xx hardware TLBLO /* There are several potential gotchas here. The 40x hardware TLBLO
field looks like this: field looks like this:
0 1 2 3 4 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 1 2 3 4 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31
...@@ -135,7 +135,7 @@ extern unsigned long ioremap_bot, ioremap_base; ...@@ -135,7 +135,7 @@ extern unsigned long ioremap_bot, ioremap_base;
Where possible we make the Linux PTE bits match up with this Where possible we make the Linux PTE bits match up with this
- bits 20 and 21 must be cleared, because we use 4k pages (4xx can - bits 20 and 21 must be cleared, because we use 4k pages (40x can
support down to 1k pages), this is done in the TLBMiss exception support down to 1k pages), this is done in the TLBMiss exception
handler. handler.
- We use only zones 0 (for kernel pages) and 1 (for user pages) - We use only zones 0 (for kernel pages) and 1 (for user pages)
...@@ -143,7 +143,7 @@ extern unsigned long ioremap_bot, ioremap_base; ...@@ -143,7 +143,7 @@ extern unsigned long ioremap_bot, ioremap_base;
miss handler. Bit 27 is PAGE_USER, thus selecting the correct miss handler. Bit 27 is PAGE_USER, thus selecting the correct
zone. zone.
- PRESENT *must* be in the bottom two bits because swap cache - PRESENT *must* be in the bottom two bits because swap cache
entries use the top 30 bits. Because 4xx doesn't support SMP entries use the top 30 bits. Because 40x doesn't support SMP
anyway, M is irrelevant so we borrow it for PAGE_PRESENT. Bit 30 anyway, M is irrelevant so we borrow it for PAGE_PRESENT. Bit 30
is cleared in the TLB miss handler before the TLB entry is loaded. is cleared in the TLB miss handler before the TLB entry is loaded.
- All other bits of the PTE are loaded into TLBLO without - All other bits of the PTE are loaded into TLBLO without
...@@ -153,7 +153,7 @@ extern unsigned long ioremap_bot, ioremap_base; ...@@ -153,7 +153,7 @@ extern unsigned long ioremap_bot, ioremap_base;
PRESENT. PRESENT.
*/ */
/* Definitions for 4xx embedded chips. */ /* Definitions for 40x embedded chips. */
#define _PAGE_GUARDED 0x001 /* G: page is guarded from prefetch */ #define _PAGE_GUARDED 0x001 /* G: page is guarded from prefetch */
#define _PAGE_PRESENT 0x002 /* software: PTE contains a translation */ #define _PAGE_PRESENT 0x002 /* software: PTE contains a translation */
#define _PAGE_NO_CACHE 0x004 /* I: caching is inhibited */ #define _PAGE_NO_CACHE 0x004 /* I: caching is inhibited */
...@@ -451,7 +451,7 @@ static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) ...@@ -451,7 +451,7 @@ static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
/* Find an entry in the third-level page table.. */ /* Find an entry in the third-level page table.. */
#define __pte_offset(address) \ #define __pte_offset(address) \
((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
#define pte_offset_kernel(dir, addr) \ #define pte_offset_kernel(dir, addr) \
((pte_t *) pmd_page_kernel(*(dir)) + __pte_offset(addr)) ((pte_t *) pmd_page_kernel(*(dir)) + __pte_offset(addr))
#define pte_offset_map(dir, addr) \ #define pte_offset_map(dir, addr) \
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <platforms/spruce_serial.h> #include <platforms/spruce_serial.h>
#elif defined(CONFIG_ZX4500) #elif defined(CONFIG_ZX4500)
#include <platforms/zx4500_serial.h> #include <platforms/zx4500_serial.h>
#elif defined(CONFIG_4xx) #elif defined(CONFIG_40x)
#include <asm/ibm4xx.h> #include <asm/ibm4xx.h>
#else #else
......
...@@ -65,7 +65,7 @@ static inline void _raw_spin_unlock(spinlock_t *lock) ...@@ -65,7 +65,7 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
lock->lock = 0; lock->lock = 0;
} }
#define _raw_spin_trylock(lock) (!test_and_set_bit(0,(lock))) #define _raw_spin_trylock(l) (!test_and_set_bit(0,&(l)->lock))
#else #else
......
...@@ -43,7 +43,7 @@ int via_calibrate_decr(void); ...@@ -43,7 +43,7 @@ int via_calibrate_decr(void);
*/ */
static __inline__ unsigned int get_dec(void) static __inline__ unsigned int get_dec(void)
{ {
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
return (mfspr(SPRN_PIT)); return (mfspr(SPRN_PIT));
#else #else
return (mfspr(SPRN_DEC)); return (mfspr(SPRN_DEC));
...@@ -52,7 +52,7 @@ static __inline__ unsigned int get_dec(void) ...@@ -52,7 +52,7 @@ static __inline__ unsigned int get_dec(void)
static __inline__ void set_dec(unsigned int val) static __inline__ void set_dec(unsigned int val)
{ {
#if defined(CONFIG_4xx) #if defined(CONFIG_40x)
return; /* Have to let it auto-reload */ return; /* Have to let it auto-reload */
#elif defined(CONFIG_8xx_CPU6) #elif defined(CONFIG_8xx_CPU6)
set_dec_cpu6(val); set_dec_cpu6(val);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment